Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package arkade for openSUSE:Factory checked 
in at 2025-09-19 15:34:45
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/arkade (Old)
 and      /work/SRC/openSUSE:Factory/.arkade.new.27445 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "arkade"

Fri Sep 19 15:34:45 2025 rev:55 rq:1305982 version:0.11.47

Changes:
--------
--- /work/SRC/openSUSE:Factory/arkade/arkade.changes    2025-09-02 
17:59:56.030562694 +0200
+++ /work/SRC/openSUSE:Factory/.arkade.new.27445/arkade.changes 2025-09-19 
15:35:22.052293391 +0200
@@ -1,0 +2,32 @@
+Fri Sep 19 10:53:04 UTC 2025 - Johannes Kastl 
<[email protected]>
+
+- Update to version 0.11.47:
+  * Update example
+  * Update README
+  * Break out openfaas-ce app and support values.yaml files
+    overrides
+  * fix: pin grafana-alloy at v0.44.2
+  * maint: enable arm64 for dive
+
+-------------------------------------------------------------------
+Fri Sep 19 10:48:48 UTC 2025 - Johannes Kastl 
<[email protected]>
+
+- Update to version 0.11.46:
+  * Fix go version for make e2e
+  * gofmt
+  * Add ripgrep - work performed by opencode/Grok Code Fast
+
+-------------------------------------------------------------------
+Fri Sep 19 09:20:46 UTC 2025 - Johannes Kastl 
<[email protected]>
+
+- Update to version 0.11.45:
+  * Update README for tools
+  * Add DevPod CLI
+
+-------------------------------------------------------------------
+Fri Sep 19 09:18:59 UTC 2025 - Johannes Kastl 
<[email protected]>
+
+- Update to version 0.11.44:
+  * Add ssync app
+
+-------------------------------------------------------------------

Old:
----
  arkade-0.11.43.obscpio

New:
----
  arkade-0.11.47.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ arkade.spec ++++++
--- /var/tmp/diff_new_pack.HKnOI0/_old  2025-09-19 15:35:22.864327508 +0200
+++ /var/tmp/diff_new_pack.HKnOI0/_new  2025-09-19 15:35:22.864327508 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           arkade
-Version:        0.11.43
+Version:        0.11.47
 Release:        0
 Summary:        Open Source Kubernetes Marketplace
 License:        Apache-2.0

++++++ _service ++++++
--- /var/tmp/diff_new_pack.HKnOI0/_old  2025-09-19 15:35:22.892328684 +0200
+++ /var/tmp/diff_new_pack.HKnOI0/_new  2025-09-19 15:35:22.896328853 +0200
@@ -3,7 +3,7 @@
     <param name="url">https://github.com/alexellis/arkade</param>
     <param name="scm">git</param>
     <param name="exclude">.git</param>
-    <param name="revision">0.11.43</param>
+    <param name="revision">0.11.47</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="versionrewrite-pattern">v(.*)</param>
     <param name="changesgenerate">enable</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.HKnOI0/_old  2025-09-19 15:35:22.916329693 +0200
+++ /var/tmp/diff_new_pack.HKnOI0/_new  2025-09-19 15:35:22.920329861 +0200
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param name="url">https://github.com/alexellis/arkade</param>
-              <param 
name="changesrevision">fd5475d0addc38f9ddc9953f4ad3e78e6104563b</param></service></servicedata>
+              <param 
name="changesrevision">97b4b07823413f8e82674c5a13c78a249501208e</param></service></servicedata>
 (No newline at EOF)
 

++++++ arkade-0.11.43.obscpio -> arkade-0.11.47.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/arkade-0.11.43/README.md new/arkade-0.11.47/README.md
--- old/arkade-0.11.43/README.md        2025-09-01 18:46:51.000000000 +0200
+++ new/arkade-0.11.47/README.md        2025-09-17 12:22:00.000000000 +0200
@@ -591,7 +591,7 @@
 
 Examples:
   arkade install
-  arkade install openfaas --helm3 --gateways=2
+  arkade install openfaas-ce --helm3 --gateways=2
   arkade install inlets-operator --token-file $HOME/do-token
 ```
 
@@ -737,6 +737,7 @@
 | nfs-provisioner         | Install nfs subdir external provisioner            
                 |
 | opa-gatekeeper          | Install Open Policy Agent (OPA) Gatekeeper         
                 |
 | openfaas                | Install openfaas                                   
                 |
+| openfaas-ce             | Install openfaas-ce                                
                 |
 | openfaas-ingress        | Install openfaas ingress with TLS                  
                 |
 | openfaas-loki           | Install Loki-OpenFaaS and Configure Loki logs 
provider for OpenFaaS |
 | portainer               | Install portainer to visualise and manage 
containers                |
@@ -752,7 +753,7 @@
 | vault                   | Install vault                                      
                 |
 | waypoint                | Install Waypoint                                   
                 |
 
-There are 52 apps that you can install on your cluster.
+There are 53 apps that you can install on your cluster.
 
 > Note to contributors, run `go build && ./arkade install --print-table` to 
 > generate this list
 
@@ -788,6 +789,7 @@
 | [croc](https://github.com/schollz/croc)                                      
| Easily and securely send things from one computer to another                  
                                                                                
    |
 | [crossplane](https://github.com/crossplane/crossplane)                       
| Simplify some development and administration aspects of Crossplane.           
                                                                                
    |
 | [dagger](https://github.com/dagger/dagger)                                   
| A portable devkit for CI/CD pipelines.                                        
                                                                                
    |
+| [devpod](https://github.com/loft-sh/devpod)                                  
| Codespaces but open-source, client-only and unopinionated: Works with any IDE 
and lets you use any cloud, kubernetes or just localhost docker.                
    |
 | [devspace](https://github.com/devspace-sh/devspace)                          
| Automate your deployment workflow with DevSpace and develop software directly 
inside Kubernetes.                                                              
    |
 | [dive](https://github.com/wagoodman/dive)                                    
| A tool for exploring each layer in a docker image                             
                                                                                
    |
 | [docker-compose](https://github.com/docker/compose)                          
| Define and run multi-container applications with Docker.                      
                                                                                
    |
@@ -897,6 +899,7 @@
 | [regctl](https://github.com/regclient/regclient)                             
| Utility for accessing docker registries                                       
                                                                                
    |
 | [rekor-cli](https://github.com/sigstore/rekor)                               
| Secure Supply Chain - Transparency Log                                        
                                                                                
    |
 | [replicated](https://github.com/replicatedhq/replicated)                     
| CLI for interacting with the Replicated Vendor API                            
                                                                                
    |
+| [rg](https://github.com/BurntSushi/ripgrep)                                  
| ripgrep recursively searches directories for a regex pattern while respecting 
your gitignore                                                                  
    |
 | [rosa](https://github.com/openshift/rosa)                                    
| Red Hat OpenShift on AWS (ROSA) command line tool                             
                                                                                
    |
 | [rpk](https://github.com/redpanda-data/redpanda)                             
| Kafka compatible streaming platform for mission critical workloads.           
                                                                                
    |
 | [run-job](https://github.com/alexellis/run-job)                              
| Run a Kubernetes Job and get the logs when it's done.                         
                                                                                
    |
@@ -905,6 +908,7 @@
 | [skupper](https://github.com/skupperproject/skupper)                         
| Skupper is an implementation of a Virtual Application Network, enabling rich 
hybrid cloud communication                                                      
     |
 | [snowmachine](https://github.com/rgee0/snowmachine)                          
| Festive cheer for your terminal.                                              
                                                                                
    |
 | [sops](https://github.com/getsops/sops)                                      
| Simple and flexible tool for managing secrets                                 
                                                                                
    |
+| [ssync](https://github.com/alexellis/ssync)                                  
| Sync files from one machine to another.                                       
                                                                                
    |
 | [stern](https://github.com/stern/stern)                                      
| Multi pod and container log tailing for Kubernetes.                           
                                                                                
    |
 | [syft](https://github.com/anchore/syft)                                      
| CLI tool and library for generating a Software Bill of Materials from 
container images and filesystems                                                
            |
 | [talosctl](https://github.com/siderolabs/talos)                              
| The command-line tool for managing Talos Linux OS.                            
                                                                                
    |
@@ -929,6 +933,6 @@
 | [waypoint](https://github.com/hashicorp/waypoint)                            
| Easy application deployment for Kubernetes and Amazon ECS                     
                                                                                
    |
 | [yq](https://github.com/mikefarah/yq)                                        
| Portable command-line YAML processor.                                         
                                                                                
    |
 | [yt-dlp](https://github.com/yt-dlp/yt-dlp)                                   
| Fork of youtube-dl with additional features and fixes                         
                                                                                
    |
-There are 169 tools, use `arkade get NAME` to download one.
+There are 172 tools, use `arkade get NAME` to download one.
 
 > Note to contributors, run `go build && ./arkade get --format markdown` to 
 > generate this list
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/chart_app.go 
new/arkade-0.11.47/cmd/apps/chart_app.go
--- old/arkade-0.11.43/cmd/apps/chart_app.go    2025-09-01 18:46:51.000000000 
+0200
+++ new/arkade-0.11.47/cmd/apps/chart_app.go    2025-09-17 12:22:00.000000000 
+0200
@@ -36,7 +36,7 @@
 
        chartCmd.Flags().StringP("namespace", "n", "default", "The namespace to 
install the chart")
        chartCmd.Flags().String("repo", "", "The chart repo to install from")
-       chartCmd.Flags().String("values-file", "", "Give the values.yaml file 
to use from the upstream chart repo")
+       chartCmd.Flags().StringArrayP("values", "f", []string{"values.yaml"}, 
"Give the values.yaml file to use from the upstream chart repo")
        chartCmd.Flags().String("repo-name", "", "Chart name")
        chartCmd.Flags().String("repo-url", "", "Chart repo")
 
@@ -119,8 +119,10 @@
                        }
                }
 
+               valuesFlag, _ := chartCmd.Flags().GetStringArray("values")
+
                err = helm.Helm3Upgrade(chartRepoName, namespace,
-                       "values.yaml",
+                       valuesFlag,
                        defaultVersion,
                        setMap,
                        false)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/confluentkafka.go 
new/arkade-0.11.47/cmd/apps/confluentkafka.go
--- old/arkade-0.11.43/cmd/apps/confluentkafka.go       2025-09-01 
18:46:51.000000000 +0200
+++ new/arkade-0.11.47/cmd/apps/confluentkafka.go       2025-09-17 
12:22:00.000000000 +0200
@@ -112,7 +112,7 @@
                appOpts.
                        WithKubeconfigPath(kubeConfigPath).
                        WithOverrides(overrides).
-                       WithValuesFile("values.yaml").
+                       WithValuesFiles([]string{"values.yaml"}).
                        
WithHelmURL("https://confluentinc.github.io/cp-helm-charts/";).
                        WithHelmRepo("confluentinc/cp-helm-charts").
                        WithHelmUpdateRepo(updateRepo).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/crossplane_app.go 
new/arkade-0.11.47/cmd/apps/crossplane_app.go
--- old/arkade-0.11.43/cmd/apps/crossplane_app.go       2025-09-01 
18:46:51.000000000 +0200
+++ new/arkade-0.11.47/cmd/apps/crossplane_app.go       2025-09-17 
12:22:00.000000000 +0200
@@ -97,7 +97,7 @@
                }
 
                err = helm.Helm3Upgrade("crossplane-alpha/crossplane",
-                       namespace, "values.yaml", "", values, wait)
+                       namespace, []string{"values.yaml"}, "", values, wait)
                if err != nil {
                        return err
                }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/inletsoperator_app.go 
new/arkade-0.11.47/cmd/apps/inletsoperator_app.go
--- old/arkade-0.11.43/cmd/apps/inletsoperator_app.go   2025-09-01 
18:46:51.000000000 +0200
+++ new/arkade-0.11.47/cmd/apps/inletsoperator_app.go   2025-09-17 
12:22:00.000000000 +0200
@@ -213,7 +213,7 @@
                }
 
                err = helm.Helm3Upgrade("inlets/inlets-operator",
-                       namespace, "values.yaml", "", overrides, wait)
+                       namespace, []string{"values.yaml"}, "", overrides, wait)
                if err != nil {
                        return err
                }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/mongodb_app.go 
new/arkade-0.11.47/cmd/apps/mongodb_app.go
--- old/arkade-0.11.43/cmd/apps/mongodb_app.go  2025-09-01 18:46:51.000000000 
+0200
+++ new/arkade-0.11.47/cmd/apps/mongodb_app.go  2025-09-17 12:22:00.000000000 
+0200
@@ -96,7 +96,7 @@
                }
 
                err = helm.Helm3Upgrade("bitnami/mongodb",
-                       namespace, "values.yaml", defaultVersion, overrides, 
wait)
+                       namespace, []string{"values.yaml"}, defaultVersion, 
overrides, wait)
                if err != nil {
                        return fmt.Errorf("unable to mongodb chart with helm 
%s", err)
                }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/of_loki.go 
new/arkade-0.11.47/cmd/apps/of_loki.go
--- old/arkade-0.11.43/cmd/apps/of_loki.go      2025-09-01 18:46:51.000000000 
+0200
+++ new/arkade-0.11.47/cmd/apps/of_loki.go      2025-09-17 12:22:00.000000000 
+0200
@@ -59,7 +59,7 @@
 
                // The default options includes the `values.yaml` file but this 
is already
                // implied when using the OCI chart.
-               lokiOptions.Helm.ValuesFile = ""
+               lokiOptions.Helm.ValuesFiles = []string{}
 
                _, err := apps.MakeInstallChart(lokiOptions)
                if err != nil {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/openfaas_app.go 
new/arkade-0.11.47/cmd/apps/openfaas_app.go
--- old/arkade-0.11.43/cmd/apps/openfaas_app.go 2025-09-01 18:46:51.000000000 
+0200
+++ new/arkade-0.11.47/cmd/apps/openfaas_app.go 2025-09-17 12:22:00.000000000 
+0200
@@ -42,12 +42,12 @@
        openfaas.Flags().String("pull-policy", "IfNotPresent", "Pull policy for 
OpenFaaS core services")
        openfaas.Flags().String("function-pull-policy", "Always", "Pull policy 
for functions")
 
-       openfaas.Flags().Bool("operator", false, "Create OpenFaaS Operator")
+       openfaas.Flags().Bool("operator", true, "Create OpenFaaS Operator")
        openfaas.Flags().Bool("clusterrole", false, "Create a ClusterRole for 
OpenFaaS instead of a limited scope Role")
        openfaas.Flags().Bool("direct-functions", false, "Invoke functions 
directly from the gateway, or load-balance via endpoint IPs when set to false")
-       openfaas.Flags().Bool("autoscaler", false, "Deploy OpenFaaS with the 
autoscaler enabled")
-       openfaas.Flags().Bool("jetstream", false, "Deploy OpenFaaS with 
jetstream queue mode")
-       openfaas.Flags().Bool("dashboard", false, "Deploy OpenFaaS with the 
dashboard enabled")
+       openfaas.Flags().Bool("autoscaler", true, "Deploy OpenFaaS with the 
autoscaler enabled")
+       openfaas.Flags().String("queue-mode", "static", "Configure the consumer 
mode for the queue-worker: \"static\" or \"function\"")
+       openfaas.Flags().Bool("dashboard", true, "Deploy OpenFaaS with the 
dashboard enabled")
 
        openfaas.Flags().Int("queue-workers", 1, "Replicas of queue-worker for 
HA")
        openfaas.Flags().Int("max-inflight", 1, "Max tasks for queue-worker to 
process in parallel")
@@ -61,6 +61,8 @@
 
        openfaas.Flags().String("license-file", "", "Path to OpenFaaS Pro 
license file")
 
+       openfaas.Flags().StringArrayP("values", "f", []string{}, "Specify one 
or more local values.yaml files for overrides.")
+
        openfaas.RunE = func(command *cobra.Command, args []string) error {
                appOpts := types.DefaultInstallOptions()
 
@@ -77,19 +79,17 @@
                clusterRole, _ := command.Flags().GetBool("clusterrole")
                directFunctions, _ := 
command.Flags().GetBool("direct-functions")
                autoscaler, _ := command.Flags().GetBool("autoscaler")
-               jetstream, _ := command.Flags().GetBool("jetstream")
                dashboard, _ := command.Flags().GetBool("dashboard")
                gateways, _ := command.Flags().GetInt("gateways")
                maxInflight, _ := command.Flags().GetInt("max-inflight")
                queueWorkers, _ := command.Flags().GetInt("queue-workers")
                ingressOperator, _ := 
command.Flags().GetBool("ingress-operator")
                lb, _ := command.Flags().GetBool("load-balancer")
+               queueMode, _ := command.Flags().GetString("queue-mode")
+               valuesFiles, _ := command.Flags().GetStringArray("values")
 
                overrides := map[string]string{}
 
-               arch := k8s.GetNodeArchitecture()
-               valuesSuffix := getValuesSuffix(arch)
-
                _, err := k8s.KubectlTask("apply", "-f",
                        
"https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml";)
 
@@ -120,17 +120,14 @@
                        overrides["gateway.logsProviderURL"] = logUrl
                }
 
-               // If license file is sent, then we assume to set the --pro 
flag and create the secret
-               if len(licenseFile) != 0 {
-                       overrides["openfaasPro"] = "true"
-                       secretData := []types.SecretsData{
-                               {Type: types.FromFileSecret, Key: "license", 
Value: licenseFile},
-                       }
-
-                       proLicense := 
types.NewGenericSecret("openfaas-license", namespace, secretData)
-                       appOpts.WithSecret(proLicense)
+               overrides["openfaasPro"] = "true"
+               secretData := []types.SecretsData{
+                       {Type: types.FromFileSecret, Key: "license", Value: 
licenseFile},
                }
 
+               proLicense := types.NewGenericSecret("openfaas-license", 
namespace, secretData)
+               appOpts.WithSecret(proLicense)
+
                if dashboard {
                        privateKey, publicKey, err := generateJWTKeyPair()
                        if err != nil {
@@ -146,22 +143,50 @@
                        appOpts.WithSecret(dashboardJWT)
                }
 
-               overrides["clusterRole"] = strconv.FormatBool(clusterRole)
-               overrides["gateway.directFunctions"] = 
strconv.FormatBool(directFunctions)
-               overrides["operator.create"] = 
strconv.FormatBool(createOperator)
-               overrides["openfaasImagePullPolicy"] = pullPolicy
-               overrides["faasnetes.imagePullPolicy"] = functionPullPolicy
-               overrides["basicAuthPlugin.replicas"] = "1"
-               overrides["gateway.replicas"] = fmt.Sprintf("%d", gateways)
+               overrides["jetstreamQueueWorker.mode"] = queueMode
+
+               if command.Flags().Changed("clusterrole") {
+                       overrides["clusterRole"] = 
strconv.FormatBool(clusterRole)
+               }
+
+               if command.Flags().Changed("direct-functions") {
+                       overrides["gateway.directFunctions"] = 
strconv.FormatBool(directFunctions)
+               }
+
+               if command.Flags().Changed("operator") {
+                       overrides["operator.create"] = 
strconv.FormatBool(createOperator)
+               }
+
+               if command.Flags().Changed("pull-policy") {
+                       overrides["openfaasImagePullPolicy"] = pullPolicy
+                       overrides["faasnetes.imagePullPolicy"] = 
functionPullPolicy
+               }
+
+               if command.Flags().Changed("gateways") {
+                       overrides["gateway.replicas"] = fmt.Sprintf("%d", 
gateways)
+               }
+
+               if command.Flags().Changed("queue-workers") {
+                       overrides["queueWorker.replicas"] = fmt.Sprintf("%d", 
queueWorkers)
+               }
+
+               if command.Flags().Changed("max-inflight") {
+                       overrides["queueWorker.maxInflight"] = 
fmt.Sprintf("%d", maxInflight)
+               }
+
+               if command.Flags().Changed("autoscaler") {
+                       overrides["autoscaler.enabled"] = 
strconv.FormatBool(autoscaler)
+               }
+
+               if command.Flags().Changed("dashboard") {
+                       overrides["dashboard.enabled"] = 
strconv.FormatBool(dashboard)
+               }
+
                overrides["ingressOperator.create"] = 
strconv.FormatBool(ingressOperator)
-               overrides["queueWorker.replicas"] = fmt.Sprintf("%d", 
queueWorkers)
-               overrides["queueWorker.maxInflight"] = fmt.Sprintf("%d", 
maxInflight)
-               overrides["autoscaler.enabled"] = strconv.FormatBool(autoscaler)
-               overrides["dashboard.enabled"] = strconv.FormatBool(dashboard)
-               overrides["dashboard.publicURL"] = "http://127.0.0.1:8080";
 
-               // the value in the template is "basic_auth" not the more usual 
basicAuth
-               overrides["basic_auth"] = strconv.FormatBool(basicAuthEnabled)
+               if command.Flags().Changed("basic-auth") {
+                       overrides["basic_auth"] = 
strconv.FormatBool(basicAuthEnabled)
+               }
 
                overrides["serviceType"] = "NodePort"
 
@@ -169,10 +194,6 @@
                        overrides["serviceType"] = "LoadBalancer"
                }
 
-               if jetstream {
-                       overrides["queueMode"] = "jetstream"
-               }
-
                customFlags, _ := command.Flags().GetStringArray("set")
                if err := config.MergeFlags(overrides, customFlags); err != nil 
{
                        return err
@@ -180,8 +201,8 @@
 
                appOpts.
                        WithKubeconfigPath(kubeConfigPath).
+                       
WithValuesFiles([]string{`https://raw.githubusercontent.com/openfaas/faas-netes/refs/heads/master/chart/openfaas/values-pro.yaml`}).
                        WithOverrides(overrides).
-                       WithValuesFile(fmt.Sprintf("values%s.yaml", 
valuesSuffix)).
                        WithHelmURL("https://openfaas.github.io/faas-netes/";).
                        WithHelmRepo("openfaas/openfaas").
                        WithHelmUpdateRepo(updateRepo).
@@ -189,6 +210,10 @@
                        WithInstallNamespace(false).
                        WithWait(wait)
 
+               if len(valuesFiles) > 0 {
+                       appOpts.WithValuesFiles(valuesFiles)
+               }
+
                if _, err := apps.MakeInstallChart(appOpts); err != nil {
                        return err
                }
@@ -238,11 +263,6 @@
                        return err
                }
 
-               _, err = cmd.Flags().GetBool("jetstream")
-               if err != nil {
-                       return err
-               }
-
                _, err = cmd.Flags().GetBool("dashboard")
                if err != nil {
                        return err
@@ -321,8 +341,14 @@
        return privOut.Bytes(), pubOut.Bytes(), nil
 }
 
-const OpenFaaSInfoMsg = `# Get the faas-cli
-curl -SLsf https://cli.openfaas.com | sudo sh
+const OpenFaaSInfoMsg = `# You've installed OpenFaaS Pro 👍
+# OpenFaaS Standard or for Enterprises is now running (depending on your 
license)
+
+# Read the EULA before continuing:
+https://github.com/openfaas/faas/blob/master/pro/EULA.md
+
+# Get the faas-cli
+arkade get faas-cli
 
 # Forward the gateway to your machine
 kubectl rollout status -n openfaas deploy/gateway
@@ -332,18 +358,12 @@
 PASSWORD=$(kubectl get secret -n openfaas basic-auth -o 
jsonpath="{.data.basic-auth-password}" | base64 --decode; echo)
 echo -n $PASSWORD | faas-cli login --username admin --password-stdin
 
-faas-cli store deploy figlet
+faas-cli store deploy env
 faas-cli list
-
-# For Raspberry Pi
-faas-cli store list \
- --platform armhf
-
-faas-cli store deploy figlet \
- --platform armhf
+faas-cli describe env
 
 # Find out more at:
-# https://github.com/openfaas/faas`
+# https://docs.openfaas.com/`
 
 const openfaasPostInstallMsg = 
`=======================================================================
 = OpenFaaS has been installed.                                        =
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/openfaas_ce_app.go 
new/arkade-0.11.47/cmd/apps/openfaas_ce_app.go
--- old/arkade-0.11.43/cmd/apps/openfaas_ce_app.go      1970-01-01 
01:00:00.000000000 +0100
+++ new/arkade-0.11.47/cmd/apps/openfaas_ce_app.go      2025-09-17 
12:22:00.000000000 +0200
@@ -0,0 +1,184 @@
+// Copyright (c) arkade author(s) 2022. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for 
full license information.
+
+package apps
+
+import (
+       "fmt"
+       "strconv"
+
+       "github.com/alexellis/arkade/pkg/apps"
+       "github.com/alexellis/arkade/pkg/config"
+       "github.com/alexellis/arkade/pkg/types"
+
+       "github.com/alexellis/arkade/pkg/k8s"
+
+       "github.com/alexellis/arkade/pkg"
+       "github.com/sethvargo/go-password/password"
+
+       "github.com/spf13/cobra"
+)
+
+func MakeInstallOpenFaaSCE() *cobra.Command {
+       var openfaasCE = &cobra.Command{
+               Use:          "openfaas-ce",
+               Short:        "Install openfaas-ce",
+               Long:         `Install the Community Edition of openfaas`,
+               Example:      `  arkade install openfaas-ce`,
+               SilenceUsage: true,
+       }
+
+       openfaasCE.Flags().BoolP("basic-auth", "a", true, "Enable 
authentication")
+       openfaasCE.Flags().String("basic-auth-password", "", "Overide the 
default random basic-auth-password if this is set")
+       openfaasCE.Flags().BoolP("load-balancer", "l", false, "Add a 
loadbalancer")
+       openfaasCE.Flags().StringP("namespace", "n", "openfaas", "The namespace 
for the core services")
+       openfaasCE.Flags().Bool("update-repo", true, "Update the helm repo")
+
+       openfaasCE.Flags().Int("queue-workers", 1, "Replicas of queue-worker 
for HA")
+       openfaasCE.Flags().Int("max-inflight", 1, "Max tasks for queue-worker 
to process in parallel")
+       openfaasCE.Flags().Int("gateways", 1, "Replicas of gateway")
+
+       openfaasCE.Flags().Bool("ingress-operator", false, "Get custom domains 
and Ingress records via the ingress-operator component")
+
+       openfaasCE.Flags().StringArray("set", []string{}, "Use custom flags or 
override existing flags \n(example --set gateway.replicas=2)")
+
+       openfaasCE.RunE = func(command *cobra.Command, args []string) error {
+               appOpts := types.DefaultInstallOptions()
+
+               wait, _ := command.Flags().GetBool("wait")
+               kubeConfigPath, _ := command.Flags().GetString("kubeconfig")
+               namespace, _ := command.Flags().GetString("namespace")
+               basicAuthEnabled, _ := command.Flags().GetBool("basic-auth")
+               updateRepo, _ := openfaasCE.Flags().GetBool("update-repo")
+               gateways, _ := command.Flags().GetInt("gateways")
+               queueWorkers, _ := command.Flags().GetInt("queue-workers")
+               lb, _ := command.Flags().GetBool("load-balancer")
+               maxInflight, _ := command.Flags().GetInt("max-inflight")
+
+               overrides := map[string]string{}
+
+               _, err := k8s.KubectlTask("apply", "-f",
+                       
"https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml";)
+
+               if err != nil {
+                       return err
+               }
+
+               if basicAuthEnabled {
+                       pass, _ := 
command.Flags().GetString("basic-auth-password")
+
+                       if len(pass) == 0 {
+                               var err error
+                               pass, err = password.Generate(25, 10, 0, false, 
true)
+                               if err != nil {
+                                       return err
+                               }
+                       }
+                       secretData := []types.SecretsData{
+                               {Type: types.StringLiteralSecret, Key: 
"basic-auth-user", Value: "admin"},
+                               {Type: types.StringLiteralSecret, Key: 
"basic-auth-password", Value: pass},
+                       }
+
+                       basicAuthSecret := types.NewGenericSecret("basic-auth", 
namespace, secretData)
+                       appOpts.WithSecret(basicAuthSecret)
+               }
+
+               overrides["basicAuthPlugin.replicas"] = "1"
+               overrides["gateway.replicas"] = fmt.Sprintf("%d", gateways)
+               overrides["queueWorker.replicas"] = fmt.Sprintf("%d", 
queueWorkers)
+               overrides["queueWorker.maxInflight"] = fmt.Sprintf("%d", 
maxInflight)
+
+               // the value in the template is "basic_auth" not the more usual 
basicAuth
+               overrides["basic_auth"] = strconv.FormatBool(basicAuthEnabled)
+
+               overrides["serviceType"] = "NodePort"
+
+               if lb {
+                       overrides["serviceType"] = "LoadBalancer"
+               }
+
+               customFlags, _ := command.Flags().GetStringArray("set")
+               if err := config.MergeFlags(overrides, customFlags); err != nil 
{
+                       return err
+               }
+
+               appOpts.
+                       WithKubeconfigPath(kubeConfigPath).
+                       WithOverrides(overrides).
+                       WithValuesFiles([]string{"values.yaml"}).
+                       WithHelmURL("https://openfaas.github.io/faas-netes/";).
+                       WithHelmRepo("openfaas/openfaas").
+                       WithHelmUpdateRepo(updateRepo).
+                       WithNamespace(namespace).
+                       WithInstallNamespace(false).
+                       WithWait(wait)
+
+               if _, err := apps.MakeInstallChart(appOpts); err != nil {
+                       return err
+               }
+
+               fmt.Println(openfaasCEPostInstallMsg)
+
+               if basicAuthEnabled == false {
+                       fmt.Println(
+                               `Warning: It is not recommended to disable 
authentication for OpenFaaS.`)
+               }
+               return nil
+       }
+
+       openfaasCE.PreRunE = func(cmd *cobra.Command, args []string) error {
+               _, err := cmd.Flags().GetBool("wait")
+               if err != nil {
+                       return err
+               }
+
+               _, err = cmd.Flags().GetBool("basic-auth")
+               if err != nil {
+                       return err
+               }
+
+               _, err = openfaasCE.Flags().GetBool("update-repo")
+               if err != nil {
+                       return err
+               }
+
+               _, err = cmd.Flags().GetBool("ingress-operator")
+               if err != nil {
+                       return err
+               }
+
+               _, err = cmd.Flags().GetBool("load-balancer")
+               if err != nil {
+                       return err
+               }
+
+               return nil
+       }
+
+       return openfaasCE
+}
+
+const OpenFaaSCEInfoMsg = `# OpenFaaS CE is licensed for personal use only, or 
a single 60 day
+# evaluation: https://github.com/openfaas/faas/blob/master/EULA.md
+
+# Get the faas-cli
+arkade get faas-cli
+
+# Forward the gateway to your machine
+kubectl rollout status -n openfaas deploy/gateway
+kubectl port-forward -n openfaas svc/gateway 8080:8080 &
+
+# If basic auth is enabled, you can now log into your gateway:
+PASSWORD=$(kubectl get secret -n openfaas basic-auth -o 
jsonpath="{.data.basic-auth-password}" | base64 --decode; echo)
+echo -n $PASSWORD | faas-cli login --username admin --password-stdin
+
+faas-cli store deploy nodeinfo
+faas-cli list
+
+# Find out more at:
+# https://docs.openfaas.com/`
+
+const openfaasCEPostInstallMsg = 
`=======================================================================
+= OpenFaaS CE has been installed.                                        =
+=======================================================================` +
+       "\n\n" + OpenFaaSInfoMsg + "\n\n" + pkg.SupportMessageShort
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/registry_app.go 
new/arkade-0.11.47/cmd/apps/registry_app.go
--- old/arkade-0.11.43/cmd/apps/registry_app.go 2025-09-01 18:46:51.000000000 
+0200
+++ new/arkade-0.11.47/cmd/apps/registry_app.go 2025-09-17 12:22:00.000000000 
+0200
@@ -134,7 +134,7 @@
                ns := "default"
 
                err = helm.Helm3Upgrade("twuni/docker-registry", ns,
-                       "values.yaml",
+                       []string{"values.yaml"},
                        defaultVersion,
                        overrides,
                        wait)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/traefik2_app.go 
new/arkade-0.11.47/cmd/apps/traefik2_app.go
--- old/arkade-0.11.43/cmd/apps/traefik2_app.go 2025-09-01 18:46:51.000000000 
+0200
+++ new/arkade-0.11.47/cmd/apps/traefik2_app.go 2025-09-17 12:22:00.000000000 
+0200
@@ -95,7 +95,7 @@
                }
 
                err = helm.Helm3Upgrade("traefik/traefik", namespace,
-                       "values.yaml",
+                       []string{"values.yaml"},
                        "",
                        overrides,
                        wait)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/arkade-0.11.43/cmd/install.go 
new/arkade-0.11.47/cmd/install.go
--- old/arkade-0.11.43/cmd/install.go   2025-09-01 18:46:51.000000000 +0200
+++ new/arkade-0.11.47/cmd/install.go   2025-09-17 12:22:00.000000000 +0200
@@ -134,6 +134,7 @@
        arkadeApps["nfs-provisioner"] = 
NewArkadeApp(apps.MakeInstallNfsProvisioner, apps.NfsClientProvisioneriInfoMsg)
        arkadeApps["opa-gatekeeper"] = 
NewArkadeApp(apps.MakeInstallOPAGateKeeper, apps.OPAGatekeeperInfoMsg)
        arkadeApps["openfaas"] = NewArkadeApp(apps.MakeInstallOpenFaaS, 
apps.OpenFaaSInfoMsg)
+       arkadeApps["openfaas-ce"] = NewArkadeApp(apps.MakeInstallOpenFaaSCE, 
apps.OpenFaaSCEInfoMsg)
        arkadeApps["openfaas-ingress"] = 
NewArkadeApp(apps.MakeInstallOpenFaaSIngress, apps.OpenfaasIngressInfoMsg)
        arkadeApps["openfaas-loki"] = 
NewArkadeApp(apps.MakeInstallOpenFaaSLoki, apps.LokiOFInfoMsg)
        arkadeApps["portainer"] = NewArkadeApp(apps.MakeInstallPortainer, 
apps.PortainerInfoMsg)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/arkade-0.11.43/cmd/system/node.go 
new/arkade-0.11.47/cmd/system/node.go
--- old/arkade-0.11.43/cmd/system/node.go       2025-09-01 18:46:51.000000000 
+0200
+++ new/arkade-0.11.47/cmd/system/node.go       2025-09-17 12:22:00.000000000 
+0200
@@ -69,14 +69,22 @@
        command.Flags().StringP("channel", "c", "release", "The channel to 
install from, can be 'release' or 'nightly',")
        command.Flags().Bool("progress", true, "Show download progress")
        command.Flags().String("arch", "", "CPU architecture i.e. amd64")
+       command.Flags().Bool("quiet", false, "Suppress most output (implies 
--progress=false unless explicitly set)")
 
        command.RunE = func(cmd *cobra.Command, args []string) error {
                installPath, _ := cmd.Flags().GetString("path")
                version, _ := cmd.Flags().GetString("version")
                progress, _ := cmd.Flags().GetBool("progress")
                channel, _ := cmd.Flags().GetString("channel")
+               quiet, _ := cmd.Flags().GetBool("quiet")
 
-               fmt.Printf("Installing Node.js to: %s\n", installPath)
+               if quiet && !cmd.Flags().Changed("progress") {
+                       progress = false
+               }
+
+               if !quiet {
+                       fmt.Printf("Installing Node.js to: %s\n", installPath)
+               }
 
                arch, osVer := env.GetClientArch()
 
@@ -108,17 +116,23 @@
                        version = "v" + version
                }
 
-               fmt.Printf("Installing version: %s for: %s\n", version, dlArch)
+               if !quiet {
+                       fmt.Printf("Installing version: %s for: %s\n", version, 
dlArch)
+               }
                filename := fmt.Sprintf("%s/%s.tar.gz", version, 
fmt.Sprintf("node-%s-linux-%s", version, dlArch))
                dlURL := fmt.Sprintf("https://nodejs.org/download/%s/%s";, 
channel, filename)
 
-               fmt.Printf("Downloading from: %s\n", dlURL)
+               if !quiet {
+                       fmt.Printf("Downloading from: %s\n", dlURL)
+               }
                outPath, err := get.DownloadFileP(dlURL, progress)
                if err != nil {
                        return err
                }
                defer os.Remove(outPath)
-               fmt.Printf("Downloaded to: %s\n", outPath)
+               if !quiet {
+                       fmt.Printf("Downloaded to: %s\n", outPath)
+               }
 
                f, err := os.OpenFile(outPath, os.O_RDONLY, 0644)
                if err != nil {
@@ -131,12 +145,16 @@
                        return err
                }
                defer os.RemoveAll(tempUnpackPath)
-               fmt.Printf("Unpacking binaries to: %s\n", tempUnpackPath)
+               if !quiet {
+                       fmt.Printf("Unpacking binaries to: %s\n", 
tempUnpackPath)
+               }
                if err = archive.UntarNested(f, tempUnpackPath, true, false); 
err != nil {
                        return err
                }
 
-               fmt.Printf("Copying binaries to: %s\n", installPath)
+               if !quiet {
+                       fmt.Printf("Copying binaries to: %s\n", installPath)
+               }
                nodeDir := fmt.Sprintf("%s/%s", tempUnpackPath, 
fmt.Sprintf("node-%s-linux-%s", version, dlArch))
                if err := cp.Copy(nodeDir, installPath); err != nil {
                        return err
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/arkade-0.11.43/pkg/apps/chart_app.go 
new/arkade-0.11.47/pkg/apps/chart_app.go
--- old/arkade-0.11.43/pkg/apps/chart_app.go    2025-09-01 18:46:51.000000000 
+0200
+++ new/arkade-0.11.47/pkg/apps/chart_app.go    2025-09-17 12:22:00.000000000 
+0200
@@ -67,7 +67,7 @@
        if err := installer(
                name,
                options.Namespace,
-               options.Helm.ValuesFile,
+               options.Helm.ValuesFiles,
                options.Helm.Repo.Version,
                options.Helm.Overrides,
                options.Helm.Wait); err != nil {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/arkade-0.11.43/pkg/get/get_test.go 
new/arkade-0.11.47/pkg/get/get_test.go
--- old/arkade-0.11.43/pkg/get/get_test.go      2025-09-01 18:46:51.000000000 
+0200
+++ new/arkade-0.11.47/pkg/get/get_test.go      2025-09-17 12:22:00.000000000 
+0200
@@ -32,6 +32,58 @@
        return tool
 }
 
+func Test_DownloadRipgrep(t *testing.T) {
+       tools := MakeTools()
+       name := "rg"
+
+       tool := getTool(name, tools)
+
+       const toolVersion = "14.1.1"
+
+       tests := []test{
+               {
+                       os:      "linux",
+                       arch:    arch64bit,
+                       version: toolVersion,
+                       url:     
"https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep-14.1.1-x86_64-unknown-linux-musl.tar.gz";,
+               },
+               {
+                       os:      "linux",
+                       arch:    archARM64,
+                       version: toolVersion,
+                       url:     
"https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep-14.1.1-aarch64-unknown-linux-gnu.tar.gz";,
+               },
+               {
+                       os:      "darwin",
+                       arch:    arch64bit,
+                       version: toolVersion,
+                       url:     
"https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep-14.1.1-x86_64-apple-darwin.tar.gz";,
+               },
+               {
+                       os:      "darwin",
+                       arch:    archDarwinARM64,
+                       version: toolVersion,
+                       url:     
"https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep-14.1.1-aarch64-apple-darwin.tar.gz";,
+               },
+               {
+                       os:      "ming",
+                       arch:    arch64bit,
+                       version: toolVersion,
+                       url:     
"https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep-14.1.1-x86_64-pc-windows-msvc.zip";,
+               },
+       }
+
+       for _, tc := range tests {
+               got, err := tool.GetURL(tc.os, tc.arch, tc.version, false)
+               if err != nil {
+                       t.Fatal(err)
+               }
+               if got != tc.url {
+                       t.Errorf("want: %s, got: %s", tc.url, got)
+               }
+       }
+}
+
 func TestGetToolVersion(t *testing.T) {
 
        testCases := []struct {
@@ -3543,7 +3595,7 @@
 func Test_DownloadDive(t *testing.T) {
        tools := MakeTools()
        name := "dive"
-       version := "0.10.0"
+       version := "v0.13.1"
 
        tool := getTool(name, tools)
 
@@ -3552,31 +3604,37 @@
                        os:      "darwin",
                        arch:    arch64bit,
                        version: version,
-                       url:     
`https://github.com/wagoodman/dive/releases/download/v0.10.0/dive_0.10.0_darwin_amd64.tar.gz`,
+                       url:     
`https://github.com/wagoodman/dive/releases/download/v0.13.1/dive_0.13.1_darwin_amd64.tar.gz`,
                },
                {
                        os:      "darwin",
                        arch:    archARM64,
                        version: version,
-                       url:     
`https://github.com/wagoodman/dive/releases/download/v0.10.0/dive_0.10.0_darwin_amd64.tar.gz`,
+                       url:     
`https://github.com/wagoodman/dive/releases/download/v0.13.1/dive_0.13.1_darwin_arm64.tar.gz`,
                },
                {
                        os:      "linux",
                        arch:    arch64bit,
                        version: version,
-                       url:     
`https://github.com/wagoodman/dive/releases/download/v0.10.0/dive_0.10.0_linux_amd64.tar.gz`,
+                       url:     
`https://github.com/wagoodman/dive/releases/download/v0.13.1/dive_0.13.1_linux_amd64.tar.gz`,
                },
                {
                        os:      "linux",
                        arch:    archARM64,
                        version: version,
-                       url:     
`https://github.com/wagoodman/dive/releases/download/v0.10.0/dive_0.10.0_linux_amd64.tar.gz`,
+                       url:     
`https://github.com/wagoodman/dive/releases/download/v0.13.1/dive_0.13.1_linux_arm64.tar.gz`,
                },
                {
                        os:      "ming",
                        arch:    arch64bit,
                        version: version,
-                       url:     
`https://github.com/wagoodman/dive/releases/download/v0.10.0/dive_0.10.0_windows_amd64.zip`,
+                       url:     
`https://github.com/wagoodman/dive/releases/download/v0.13.1/dive_0.13.1_windows_amd64.zip`,
+               },
+               {
+                       os:      "ming",
+                       arch:    archARM64,
+                       version: version,
+                       url:     
`https://github.com/wagoodman/dive/releases/download/v0.13.1/dive_0.13.1_windows_arm64.zip`,
                },
        }
 
@@ -3587,7 +3645,7 @@
                                t.Fatal(err)
                        }
                        if got != tc.url {
-                               t.Errorf("want: %s, got: %s", tc.url, got)
+                               t.Errorf("\nwant: %s\ngot:  %s", tc.url, got)
                        }
                })
        }
@@ -6282,6 +6340,69 @@
 
 }
 
+func Test_DownloadSsync(t *testing.T) {
+       tools := MakeTools()
+       name := "ssync"
+
+       tool := getTool(name, tools)
+
+       tests := []test{
+               {
+                       os:      "ming",
+                       arch:    arch64bit,
+                       version: "0.0.1-rc1",
+                       url:     
`https://github.com/alexellis/ssync/releases/download/0.0.1-rc1/ssync.exe`,
+               },
+               {
+                       os:      "linux",
+                       arch:    arch64bit,
+                       version: "0.0.1-rc1",
+                       url:     
`https://github.com/alexellis/ssync/releases/download/0.0.1-rc1/ssync`,
+               },
+               {
+                       os:      "linux",
+                       arch:    archARM64,
+                       version: "0.0.1-rc1",
+                       url:     
`https://github.com/alexellis/ssync/releases/download/0.0.1-rc1/ssync-arm64`,
+               },
+               {
+                       os:      "linux",
+                       arch:    archARM7,
+                       version: "0.0.1-rc1",
+                       url:     
`https://github.com/alexellis/ssync/releases/download/0.0.1-rc1/ssync-armhf`,
+               },
+               {
+                       os:      "linux",
+                       arch:    "armv6l",
+                       version: "0.0.1-rc1",
+                       url:     
`https://github.com/alexellis/ssync/releases/download/0.0.1-rc1/ssync-armhf`,
+               },
+               {
+                       os:      "darwin",
+                       arch:    arch64bit,
+                       version: "0.0.1-rc1",
+                       url:     
`https://github.com/alexellis/ssync/releases/download/0.0.1-rc1/ssync-darwin`,
+               },
+               {
+                       os:      "darwin",
+                       arch:    archDarwinARM64,
+                       version: "0.0.1-rc1",
+                       url:     
`https://github.com/alexellis/ssync/releases/download/0.0.1-rc1/ssync-darwin-arm64`,
+               },
+       }
+
+       for _, tc := range tests {
+               got, err := tool.GetURL(tc.os, tc.arch, tc.version, false)
+               if err != nil {
+                       t.Fatal(err)
+               }
+               if got != tc.url {
+                       t.Errorf("want: %s, got: %s", tc.url, got)
+               }
+       }
+
+}
+
 func Test_DownloadYt(t *testing.T) {
        tools := MakeTools()
        name := "yt-dlp"
@@ -7213,6 +7334,58 @@
        }
 }
 
+func Test_DownloadDevpod(t *testing.T) {
+       tools := MakeTools()
+       name := "devpod"
+
+       tool := getTool(name, tools)
+
+       const toolVersion = "v0.7.0-alpha.34"
+
+       tests := []test{
+               {
+                       os:      "mingw64_nt-10.0-18362",
+                       arch:    arch64bit,
+                       version: toolVersion,
+                       url:     
"https://github.com/loft-sh/devpod/releases/download/v0.7.0-alpha.34/devpod-windows-amd64.exe";,
+               },
+               {
+                       os:      "darwin",
+                       arch:    arch64bit,
+                       version: toolVersion,
+                       url:     
"https://github.com/loft-sh/devpod/releases/download/v0.7.0-alpha.34/devpod-darwin-amd64";,
+               },
+               {
+                       os:      "darwin",
+                       arch:    archDarwinARM64,
+                       version: toolVersion,
+                       url:     
"https://github.com/loft-sh/devpod/releases/download/v0.7.0-alpha.34/devpod-darwin-arm64";,
+               },
+               {
+                       os:      "linux",
+                       arch:    arch64bit,
+                       version: toolVersion,
+                       url:     
"https://github.com/loft-sh/devpod/releases/download/v0.7.0-alpha.34/devpod-linux-amd64";,
+               },
+               {
+                       os:      "linux",
+                       arch:    archARM64,
+                       version: toolVersion,
+                       url:     
"https://github.com/loft-sh/devpod/releases/download/v0.7.0-alpha.34/devpod-linux-arm64";,
+               },
+       }
+
+       for _, tc := range tests {
+               got, err := tool.GetURL(tc.os, tc.arch, tc.version, false)
+               if err != nil {
+                       t.Fatal(err)
+               }
+               if got != tc.url {
+                       t.Errorf("want: %s, got: %s", tc.url, got)
+               }
+       }
+}
+
 func Test_DownloadKwokctl(t *testing.T) {
        var (
                tools       = MakeTools()
@@ -8546,7 +8719,7 @@
                        t.Fatal(err)
                }
                if got != tc.url {
-                       t.Errorf("want: %s, got: %s", tc.url, got)
+                       t.Errorf("\nwant: %s\ngot:  %s", tc.url, got)
                }
        }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/arkade-0.11.43/pkg/get/tools.go 
new/arkade-0.11.47/pkg/get/tools.go
--- old/arkade-0.11.43/pkg/get/tools.go 2025-09-01 18:46:51.000000000 +0200
+++ new/arkade-0.11.47/pkg/get/tools.go 2025-09-17 12:22:00.000000000 +0200
@@ -333,6 +333,28 @@
 
        tools = append(tools,
                Tool{
+                       Owner:       "loft-sh",
+                       Repo:        "devpod",
+                       Name:        "devpod",
+                       Version:     "v0.7.0-alpha.34",
+                       Description: "Codespaces but open-source, client-only 
and unopinionated: Works with any IDE and lets you use any cloud, kubernetes or 
just localhost docker.",
+                       BinaryTemplate: `{{ if HasPrefix .OS "ming" -}}
+{{.Name}}-windows-amd64.exe
+{{- else if eq .OS "darwin" -}}
+  {{- if or (eq .Arch "arm64") (eq .Arch "aarch64") -}}
+{{.Name}}-darwin-arm64
+  {{- else -}}
+{{.Name}}-darwin-amd64
+  {{- end -}}
+{{- else if or (eq .Arch "aarch64") (eq .Arch "arm64") -}}
+{{.Name}}-linux-arm64
+{{- else -}}
+{{.Name}}-linux-amd64
+{{- end -}}`,
+               })
+
+       tools = append(tools,
+               Tool{
                        Owner:       "tilt-dev",
                        Repo:        "tilt",
                        Name:        "tilt",
@@ -2173,28 +2195,28 @@
 
        tools = append(tools,
                Tool{
-                       Owner:       "wagoodman",
-                       Repo:        "dive",
-                       Name:        "dive",
-                       Version:     "0.10.0",
-                       Description: "A tool for exploring each layer in a 
docker image",
-                       URLTemplate: `{{$osStr := ""}}
-                       {{- if HasPrefix .OS "ming" -}}
-                       {{$osStr = "windows"}}
-                       {{- else if eq .OS "linux" -}}
-                       {{$osStr = "linux"}}
-                       {{- else if eq .OS "darwin" -}}
-                       {{$osStr = "darwin"}}
-                       {{- end -}}
-
-                       {{$archiveStr := ""}}
-                       {{- if HasPrefix .OS "ming" -}}
-                       {{$archiveStr = ".zip"}}
-                       {{- else -}}
-                       {{$archiveStr = ".tar.gz"}}
-                       {{- end -}}
+                       Owner:           "wagoodman",
+                       Repo:            "dive",
+                       Name:            "dive",
+                       VersionStrategy: GitHubVersionStrategy,
+                       Description:     "A tool for exploring each layer in a 
docker image",
+                       BinaryTemplate: `
+                                                       {{$os := .OS}}
+                                                       {{$arch := .Arch}}
+                                                       {{$ext := ".tar.gz"}}
+                               
+                                                       {{- if HasPrefix .OS 
"ming" -}}
+                                                               {{$os = 
"windows"}}
+                                                               {{$ext = 
".zip"}}
+                                                       {{- end -}}
+               
+                                                       {{- if eq .Arch 
"x86_64" -}}
+                                       {{$arch = "amd64"}}
+                                                       {{- else if (or (eq 
.Arch "aarch64") (eq .Arch "arm64")) -}}
+                                                               {{$arch = 
"arm64"}}
+                                                       {{- end -}}
 
-                       
https://github.com/{{.Owner}}/{{.Name}}/releases/download/v{{.Version}}/{{.Name}}_{{.Version}}_{{$osStr}}_amd64{{$archiveStr}}`,
+                       {{.Name}}_{{.VersionNumber}}_{{$os}}_{{$arch}}{{$ext}}`,
                },
        )
 
@@ -3311,6 +3333,7 @@
                        Owner:       "grafana",
                        Repo:        "agent",
                        Name:        "grafana-agent",
+                       Version:     "v0.44.2",
                        Description: "Grafana Agent is a telemetry collector 
for sending metrics, logs, and trace data to the opinionated Grafana 
observability stack.",
                        URLTemplate: `
                                                {{$os := .OS}}
@@ -3547,6 +3570,35 @@
                                {{ else if HasPrefix .OS "ming" -}}
                                {{$ext = ".exe"}}
                                {{- end -}}
+
+                               {{.Name}}{{$os}}{{$arch}}{{$ext}}`,
+               })
+
+       tools = append(tools,
+               Tool{
+                       Owner:       "alexellis",
+                       Repo:        "ssync",
+                       Name:        "ssync",
+                       Description: "Sync files from one machine to another.",
+                       BinaryTemplate: `
+                               {{$arch := ""}}
+                               {{$os := ""}}
+                               {{$ext := ""}}
+
+                               {{- if eq .Arch "aarch64" -}}
+                               {{$arch = "-arm64"}}
+                               {{- else if eq .Arch "arm64" -}}
+                               {{$arch = "-arm64"}}
+                               {{- else if (or (eq .Arch "armv6l") (eq .Arch 
"armv7l")) -}}
+                               {{$arch = "-armhf"}}
+                               {{- end -}}
+
+                               {{ if eq .OS "darwin" -}}
+                               {{$os = "-darwin"}}
+                               {{ else if HasPrefix .OS "ming" -}}
+                               {{$ext = ".exe"}}
+                               {{- end -}}
+
                                {{.Name}}{{$os}}{{$arch}}{{$ext}}`,
                })
 
@@ -4673,5 +4725,39 @@
                                                                
{{.Name}}-{{.Version}}-{{$os}}-{{$arch}}.{{$ext}}
                                                                        `,
                })
+
+       tools = append(tools,
+               Tool{
+                       Owner:          "BurntSushi",
+                       Repo:           "ripgrep",
+                       Name:           "rg",
+                       Description:    "ripgrep recursively searches 
directories for a regex pattern while respecting your gitignore",
+                       BinaryTemplate: `rg`,
+                       URLTemplate: `
+{{$target := ""}}
+{{$ext := "tar.gz"}}
+{{- if eq .OS "linux" -}}
+       {{- if eq .Arch "x86_64" -}}
+               {{$target = "x86_64-unknown-linux-musl"}}
+       {{ else if eq .Arch "aarch64" -}}
+               {{$target = "aarch64-unknown-linux-gnu"}}
+       {{ else if eq .Arch "armv7l" -}}
+               {{$target = "armv7-unknown-linux-musleabihf"}}
+       {{- end -}}
+{{- else if eq .OS "darwin" -}}
+       {{- if eq .Arch "x86_64" -}}
+               {{$target = "x86_64-apple-darwin"}}
+       {{ else if eq .Arch "arm64" -}}
+               {{$target = "aarch64-apple-darwin"}}
+       {{- end -}}
+{{- else if HasPrefix .OS "ming" -}}
+       {{$ext = "zip"}}
+       {{- if eq .Arch "x86_64" -}}
+               {{$target = "x86_64-pc-windows-msvc"}}
+       {{- end -}}
+{{- end -}}
+https://github.com/BurntSushi/ripgrep/releases/download/{{.Version}}/ripgrep-{{.Version}}-{{$target}}.{{$ext}}`,
+               })
+
        return tools
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/arkade-0.11.43/pkg/helm/helm.go 
new/arkade-0.11.47/pkg/helm/helm.go
--- old/arkade-0.11.43/pkg/helm/helm.go 2025-09-01 18:46:51.000000000 +0200
+++ new/arkade-0.11.47/pkg/helm/helm.go 2025-09-17 12:22:00.000000000 +0200
@@ -179,7 +179,7 @@
        return strings.HasPrefix(chart, "oci://")
 }
 
-func Helm3Upgrade(chart, namespace, values, version string, overrides 
map[string]string, wait bool) error {
+func Helm3Upgrade(chart, namespace string, valuesFile []string, version 
string, overrides map[string]string, wait bool) error {
 
        chartName := chart
        if index := strings.Index(chartName, "/"); index > -1 {
@@ -197,13 +197,13 @@
                args = append(args, "--wait")
        }
 
-       fmt.Println("VALUES", values)
-       if len(values) > 0 {
+       fmt.Println("VALUES", valuesFile)
+       for _, valueFile := range valuesFile {
                args = append(args, "--values")
-               if !strings.HasPrefix(values, "/") {
-                       args = append(args, path.Join(basePath, values))
+               if !strings.HasPrefix(valueFile, "/") {
+                       args = append(args, path.Join(basePath, valueFile))
                } else {
-                       args = append(args, values)
+                       args = append(args, valueFile)
                }
        }
 
@@ -238,7 +238,7 @@
        return nil
 }
 
-func Helm3OCIUpgrade(chart, namespace, values, version string, overrides 
map[string]string, wait bool) error {
+func Helm3OCIUpgrade(chart, namespace string, valuesFiles []string, version 
string, overrides map[string]string, wait bool) error {
 
        if !IsOCI(chart) {
                return fmt.Errorf("chart %s is not an OCI chart URL", chart)
@@ -259,9 +259,9 @@
                args = append(args, "--wait")
        }
 
-       fmt.Println("VALUES", values)
-       if len(values) > 0 {
-               args = append(args, "--values", values)
+       fmt.Println("VALUES", valuesFiles)
+       for _, valueFile := range valuesFiles {
+               args = append(args, "--values", valueFile)
        }
 
        for k, v := range overrides {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/arkade-0.11.43/pkg/types/types.go 
new/arkade-0.11.47/pkg/types/types.go
--- old/arkade-0.11.43/pkg/types/types.go       2025-09-01 18:46:51.000000000 
+0200
+++ new/arkade-0.11.47/pkg/types/types.go       2025-09-17 12:22:00.000000000 
+0200
@@ -1,6 +1,10 @@
 package types
 
-import "github.com/alexellis/arkade/pkg/config"
+import (
+       "slices"
+
+       "github.com/alexellis/arkade/pkg/config"
+)
 
 type InstallerOptions struct {
        Namespace       string
@@ -26,13 +30,13 @@
 }
 
 type HelmConfig struct {
-       Repo       *HelmRepo
-       Helm3      bool
-       HelmPath   string
-       Overrides  map[string]string
-       UpdateRepo bool
-       Wait       bool
-       ValuesFile string
+       Repo        *HelmRepo
+       Helm3       bool
+       HelmPath    string
+       Overrides   map[string]string
+       UpdateRepo  bool
+       Wait        bool
+       ValuesFiles []string
 }
 
 type HelmRepo struct {
@@ -84,8 +88,14 @@
        return o
 }
 
-func (o *InstallerOptions) WithValuesFile(filename string) *InstallerOptions {
-       o.Helm.ValuesFile = filename
+func (o *InstallerOptions) WithValuesFiles(filenames []string) 
*InstallerOptions {
+
+       for _, filename := range filenames {
+               if !slices.Contains(o.Helm.ValuesFiles, filename) {
+                       o.Helm.ValuesFiles = append(o.Helm.ValuesFiles, 
filename)
+               }
+       }
+
        return o
 }
 
@@ -109,9 +119,9 @@
                        Repo: &HelmRepo{
                                Version: "",
                        },
-                       ValuesFile: "values.yaml",
-                       Helm3:      true,
-                       Wait:       false,
+                       ValuesFiles: []string{"values.yaml"},
+                       Helm3:       true,
+                       Wait:        false,
                },
                Verbose: false,
        }

++++++ arkade.obsinfo ++++++
--- /var/tmp/diff_new_pack.HKnOI0/_old  2025-09-19 15:35:23.532355569 +0200
+++ /var/tmp/diff_new_pack.HKnOI0/_new  2025-09-19 15:35:23.536355738 +0200
@@ -1,5 +1,5 @@
 name: arkade
-version: 0.11.43
-mtime: 1756745211
-commit: fd5475d0addc38f9ddc9953f4ad3e78e6104563b
+version: 0.11.47
+mtime: 1758104520
+commit: 97b4b07823413f8e82674c5a13c78a249501208e
 

++++++ vendor.tar.gz ++++++

Reply via email to