diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml
index 90acbad76ee5b..7510f0571670d 100644
--- a/.github/workflows/image-reuse.yaml
+++ b/.github/workflows/image-reuse.yaml
@@ -104,7 +104,7 @@ jobs:
echo 'EOF' >> $GITHUB_ENV
- name: Login to Quay.io
- uses: docker/login-action@e92390c5fb421da1463c202d546fed0ec5c39f20 # v3.1.0
+ uses: docker/login-action@0d4c9c5ea7693da7b068278f7b52bda2a190a446 # v3.2.0
with:
registry: quay.io
username: ${{ secrets.quay_username }}
@@ -112,7 +112,7 @@ jobs:
if: ${{ inputs.quay_image_name && inputs.push }}
- name: Login to GitHub Container Registry
- uses: docker/login-action@e92390c5fb421da1463c202d546fed0ec5c39f20 # v3.1.0
+ uses: docker/login-action@0d4c9c5ea7693da7b068278f7b52bda2a190a446 # v3.2.0
with:
registry: ghcr.io
username: ${{ secrets.ghcr_username }}
@@ -120,7 +120,7 @@ jobs:
if: ${{ inputs.ghcr_image_name && inputs.push }}
- name: Login to dockerhub Container Registry
- uses: docker/login-action@e92390c5fb421da1463c202d546fed0ec5c39f20 # v3.1.0
+ uses: docker/login-action@0d4c9c5ea7693da7b068278f7b52bda2a190a446 # v3.2.0
with:
username: ${{ secrets.docker_username }}
password: ${{ secrets.docker_password }}
diff --git a/.golangci.yaml b/.golangci.yaml
index 0c704a41381da..96299f53fab27 100644
--- a/.golangci.yaml
+++ b/.golangci.yaml
@@ -5,6 +5,13 @@ issues:
max-same-issues: 0
linters:
enable:
+ - errcheck
- gofmt
+ - gosimple
+ - govet
+ - ineffassign
+ - misspell
+ - staticcheck
+ - unused
run:
timeout: 50m
diff --git a/applicationset/controllers/applicationset_controller.go b/applicationset/controllers/applicationset_controller.go
index 8c6b87529a08f..dc57e6ab410be 100644
--- a/applicationset/controllers/applicationset_controller.go
+++ b/applicationset/controllers/applicationset_controller.go
@@ -1453,7 +1453,7 @@ func cleanupDeletedApplicationStatuses(statusMap map[string]argov1alpha1.Resourc
}
}
-// setApplicationSetApplicationStatus updates the ApplicatonSet's status field
+// setApplicationSetApplicationStatus updates the ApplicationSet's status field
// with any new/changed Application statuses.
func (r *ApplicationSetReconciler) setAppSetApplicationStatus(ctx context.Context, logCtx *log.Entry, applicationSet *argov1alpha1.ApplicationSet, applicationStatuses []argov1alpha1.ApplicationSetApplicationStatus) error {
needToUpdateStatus := false
@@ -1632,7 +1632,7 @@ func shouldRequeueApplicationSet(appOld *argov1alpha1.Application, appNew *argov
// the applicationset controller owns the application spec, labels, annotations, and finalizers on the applications
// reflect.DeepEqual considers nil slices/maps not equal to empty slices/maps
// https://pkg.go.dev/reflect#DeepEqual
- // ApplicationDestination has an unexported field so we can just use the == for comparsion
+ // ApplicationDestination has an unexported field so we can just use the == for comparison
if !cmp.Equal(appOld.Spec, appNew.Spec, cmpopts.EquateEmpty(), cmpopts.EquateComparable(argov1alpha1.ApplicationDestination{})) ||
!cmp.Equal(appOld.ObjectMeta.GetAnnotations(), appNew.ObjectMeta.GetAnnotations(), cmpopts.EquateEmpty()) ||
!cmp.Equal(appOld.ObjectMeta.GetLabels(), appNew.ObjectMeta.GetLabels(), cmpopts.EquateEmpty()) ||
diff --git a/applicationset/controllers/applicationset_controller_test.go b/applicationset/controllers/applicationset_controller_test.go
index 2dcb0e44758d6..ea6b39456f235 100644
--- a/applicationset/controllers/applicationset_controller_test.go
+++ b/applicationset/controllers/applicationset_controller_test.go
@@ -4113,7 +4113,7 @@ func TestBuildAppDependencyList(t *testing.T) {
}
appDependencyList, appStepMap, err := r.buildAppDependencyList(log.NewEntry(log.StandardLogger()), cc.appSet, cc.apps)
- assert.Equal(t, err, nil, "expected no errors, but errors occured")
+ assert.Equal(t, err, nil, "expected no errors, but errors occurred")
assert.Equal(t, cc.expectedList, appDependencyList, "expected appDependencyList did not match actual")
assert.Equal(t, cc.expectedStepMap, appStepMap, "expected appStepMap did not match actual")
})
@@ -4707,7 +4707,7 @@ func TestBuildAppSyncMap(t *testing.T) {
}
appSyncMap, err := r.buildAppSyncMap(context.TODO(), cc.appSet, cc.appDependencyList, cc.appMap)
- assert.Equal(t, err, nil, "expected no errors, but errors occured")
+ assert.Equal(t, err, nil, "expected no errors, but errors occurred")
assert.Equal(t, cc.expectedMap, appSyncMap, "expected appSyncMap did not match actual")
})
}
@@ -5373,7 +5373,7 @@ func TestUpdateApplicationSetApplicationStatus(t *testing.T) {
appStatuses[i].LastTransitionTime = nil
}
- assert.Equal(t, err, nil, "expected no errors, but errors occured")
+ assert.Equal(t, err, nil, "expected no errors, but errors occurred")
assert.Equal(t, cc.expectedAppStatus, appStatuses, "expected appStatuses did not match actual")
})
}
@@ -6127,7 +6127,7 @@ func TestUpdateApplicationSetApplicationStatusProgress(t *testing.T) {
appStatuses[i].LastTransitionTime = nil
}
- assert.Equal(t, err, nil, "expected no errors, but errors occured")
+ assert.Equal(t, err, nil, "expected no errors, but errors occurred")
assert.Equal(t, cc.expectedAppStatus, appStatuses, "expected appStatuses did not match actual")
})
}
@@ -6340,7 +6340,7 @@ func TestUpdateResourceStatus(t *testing.T) {
err := r.updateResourcesStatus(context.TODO(), log.NewEntry(log.StandardLogger()), &cc.appSet, cc.apps)
- assert.Equal(t, err, nil, "expected no errors, but errors occured")
+ assert.Equal(t, err, nil, "expected no errors, but errors occurred")
assert.Equal(t, cc.expectedResources, cc.appSet.Status.Resources, "expected resources did not match actual")
})
}
diff --git a/assets/swagger.json b/assets/swagger.json
index 9324be78d6be7..42c7a7cc11c19 100644
--- a/assets/swagger.json
+++ b/assets/swagger.json
@@ -6021,7 +6021,7 @@
},
"v1alpha1ApplicationSetCondition": {
"type": "object",
- "title": "ApplicationSetCondition contains details about an applicationset condition, which is usally an error or warning",
+ "title": "ApplicationSetCondition contains details about an applicationset condition, which is usually an error or warning",
"properties": {
"lastTransitionTime": {
"$ref": "#/definitions/v1Time"
diff --git a/cmd/argocd-repo-server/commands/argocd_repo_server.go b/cmd/argocd-repo-server/commands/argocd_repo_server.go
index 2ba17cd9b64ba..f80968cf76f37 100644
--- a/cmd/argocd-repo-server/commands/argocd_repo_server.go
+++ b/cmd/argocd-repo-server/commands/argocd_repo_server.go
@@ -70,6 +70,7 @@ func NewCommand() *cobra.Command {
helmManifestMaxExtractedSize string
helmRegistryMaxIndexSize string
disableManifestMaxExtractedSize bool
+ includeHiddenDirectories bool
)
var command = cobra.Command{
Use: cliName,
@@ -130,6 +131,7 @@ func NewCommand() *cobra.Command {
StreamedManifestMaxTarSize: streamedManifestMaxTarSizeQuantity.ToDec().Value(),
HelmManifestMaxExtractedSize: helmManifestMaxExtractedSizeQuantity.ToDec().Value(),
HelmRegistryMaxIndexSize: helmRegistryMaxIndexSizeQuantity.ToDec().Value(),
+ IncludeHiddenDirectories: includeHiddenDirectories,
}, askPassServer)
errors.CheckError(err)
@@ -215,6 +217,7 @@ func NewCommand() *cobra.Command {
command.Flags().StringVar(&helmManifestMaxExtractedSize, "helm-manifest-max-extracted-size", env.StringFromEnv("ARGOCD_REPO_SERVER_HELM_MANIFEST_MAX_EXTRACTED_SIZE", "1G"), "Maximum size of helm manifest archives when extracted")
command.Flags().StringVar(&helmRegistryMaxIndexSize, "helm-registry-max-index-size", env.StringFromEnv("ARGOCD_REPO_SERVER_HELM_MANIFEST_MAX_INDEX_SIZE", "1G"), "Maximum size of registry index file")
command.Flags().BoolVar(&disableManifestMaxExtractedSize, "disable-helm-manifest-max-extracted-size", env.ParseBoolFromEnv("ARGOCD_REPO_SERVER_DISABLE_HELM_MANIFEST_MAX_EXTRACTED_SIZE", false), "Disable maximum size of helm manifest archives when extracted")
+ command.Flags().BoolVar(&includeHiddenDirectories, "include-hidden-directories", env.ParseBoolFromEnv("ARGOCD_REPO_SERVER_INCLUDE_HIDDEN_DIRECTORIES", false), "Include hidden directories from Git")
tlsConfigCustomizerSrc = tls.AddTLSFlagsToCmd(&command)
cacheSrc = reposervercache.AddCacheFlagsToCmd(&command, cacheutil.Options{
OnClientCreated: func(client *redis.Client) {
diff --git a/cmd/argocd/commands/app_test.go b/cmd/argocd/commands/app_test.go
index ec9dcdf0f8e65..82cfc6cf76377 100644
--- a/cmd/argocd/commands/app_test.go
+++ b/cmd/argocd/commands/app_test.go
@@ -1357,47 +1357,47 @@ func TestFilterAppResources(t *testing.T) {
expectedResult []*v1alpha1.SyncOperationResource
}{
// --resource apps:ReplicaSet:replicaSet-name1 --resource *:Service:*
- {testName: "Include ReplicaSet replicaSet-name1 resouce and all service resources",
+ {testName: "Include ReplicaSet replicaSet-name1 resource and all service resources",
selectedResources: []*v1alpha1.SyncOperationResource{&includeAllServiceResources, &includeReplicaSet1Resource},
expectedResult: []*v1alpha1.SyncOperationResource{&replicaSet1, &service1, &service2},
},
// --resource apps:ReplicaSet:replicaSet-name1 --resource !*:Service:*
- {testName: "Include ReplicaSet replicaSet-name1 resouce and exclude all service resources",
+ {testName: "Include ReplicaSet replicaSet-name1 resource and exclude all service resources",
selectedResources: []*v1alpha1.SyncOperationResource{&excludeAllServiceResources, &includeReplicaSet1Resource},
expectedResult: []*v1alpha1.SyncOperationResource{&replicaSet1, &replicaSet2, &job, &deployment},
},
// --resource !apps:ReplicaSet:replicaSet-name2 --resource !*:Service:*
- {testName: "Exclude ReplicaSet replicaSet-name2 resouce and all service resources",
+ {testName: "Exclude ReplicaSet replicaSet-name2 resource and all service resources",
selectedResources: []*v1alpha1.SyncOperationResource{&excludeReplicaSet2Resource, &excludeAllServiceResources},
expectedResult: []*v1alpha1.SyncOperationResource{&replicaSet1, &replicaSet2, &job, &service1, &service2, &deployment},
},
// --resource !apps:ReplicaSet:replicaSet-name2
- {testName: "Exclude ReplicaSet replicaSet-name2 resouce",
+ {testName: "Exclude ReplicaSet replicaSet-name2 resource",
selectedResources: []*v1alpha1.SyncOperationResource{&excludeReplicaSet2Resource},
expectedResult: []*v1alpha1.SyncOperationResource{&replicaSet1, &job, &service1, &service2, &deployment},
},
// --resource apps:ReplicaSet:replicaSet-name1
- {testName: "Include ReplicaSet replicaSet-name1 resouce",
+ {testName: "Include ReplicaSet replicaSet-name1 resource",
selectedResources: []*v1alpha1.SyncOperationResource{&includeReplicaSet1Resource},
expectedResult: []*v1alpha1.SyncOperationResource{&replicaSet1},
},
// --resource !*:Service:*
- {testName: "Exclude Service resouces",
+ {testName: "Exclude Service resources",
selectedResources: []*v1alpha1.SyncOperationResource{&excludeAllServiceResources},
expectedResult: []*v1alpha1.SyncOperationResource{&replicaSet1, &replicaSet2, &job, &deployment},
},
// --resource *:Service:*
- {testName: "Include Service resouces",
+ {testName: "Include Service resources",
selectedResources: []*v1alpha1.SyncOperationResource{&includeAllServiceResources},
expectedResult: []*v1alpha1.SyncOperationResource{&service1, &service2},
},
// --resource !*:*:*
- {testName: "Exclude all resouces",
+ {testName: "Exclude all resources",
selectedResources: []*v1alpha1.SyncOperationResource{&excludeAllResources},
expectedResult: nil,
},
// --resource *:*:*
- {testName: "Include all resouces",
+ {testName: "Include all resources",
selectedResources: []*v1alpha1.SyncOperationResource{&includeAllResources},
expectedResult: []*v1alpha1.SyncOperationResource{&replicaSet1, &replicaSet2, &job, &service1, &service2, &deployment},
},
diff --git a/cmd/argocd/commands/cluster.go b/cmd/argocd/commands/cluster.go
index f203b82ae9ac0..9fbe0806c3e4a 100644
--- a/cmd/argocd/commands/cluster.go
+++ b/cmd/argocd/commands/cluster.go
@@ -490,7 +490,7 @@ func NewClusterListCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comman
# List Clusters in Default "Wide" Format
argocd cluster list
-# List Cluster via specifing the server
+# List Cluster via specifying the server
argocd cluster list --server
# List Clusters in JSON Format
diff --git a/cmd/argocd/commands/projectwindows.go b/cmd/argocd/commands/projectwindows.go
index 93843130ebb13..35a3441351280 100644
--- a/cmd/argocd/commands/projectwindows.go
+++ b/cmd/argocd/commands/projectwindows.go
@@ -58,7 +58,7 @@ func NewProjectWindowsDisableManualSyncCommand(clientOpts *argocdclient.ClientOp
#Disable manual sync for a sync window for the Project
argocd proj windows disable-manual-sync PROJECT ID
-#Disbaling manual sync for a windows set on the default project with Id 0
+#Disabling manual sync for a windows set on the default project with Id 0
argocd proj windows disable-manual-sync default 0`,
Run: func(c *cobra.Command, args []string) {
ctx := c.Context()
diff --git a/cmpserver/plugin/plugin.go b/cmpserver/plugin/plugin.go
index ca1e7592218ea..89b329beaf994 100644
--- a/cmpserver/plugin/plugin.go
+++ b/cmpserver/plugin/plugin.go
@@ -128,8 +128,8 @@ func runCommand(ctx context.Context, command Command, path string, env []string)
if len(output) == 0 {
logCtx.Warn("Plugin command returned zero output")
} else {
- // Log stderr even on successfull commands to help develop plugins
- logCtx.Info("Plugin command successfull")
+ // Log stderr even on successful commands to help develop plugins
+ logCtx.Info("Plugin command successful")
}
return strings.TrimSuffix(output, "\n"), nil
diff --git a/common/common.go b/common/common.go
index b825ccddef91f..090cd33965e54 100644
--- a/common/common.go
+++ b/common/common.go
@@ -113,7 +113,7 @@ const (
// LegacyShardingAlgorithm is the default value for Sharding Algorithm it uses an `uid` based distribution (non-uniform)
LegacyShardingAlgorithm = "legacy"
- // RoundRobinShardingAlgorithm is a flag value that can be opted for Sharding Algorithm it uses an equal distribution accross all shards
+ // RoundRobinShardingAlgorithm is a flag value that can be opted for Sharding Algorithm it uses an equal distribution across all shards
RoundRobinShardingAlgorithm = "round-robin"
// AppControllerHeartbeatUpdateRetryCount is the retry count for updating the Shard Mapping to the Shard Mapping ConfigMap used by Application Controller
AppControllerHeartbeatUpdateRetryCount = 3
@@ -206,7 +206,7 @@ const (
EnvVarTLSDataPath = "ARGOCD_TLS_DATA_PATH"
// EnvGitAttemptsCount specifies number of git remote operations attempts count
EnvGitAttemptsCount = "ARGOCD_GIT_ATTEMPTS_COUNT"
- // EnvGitRetryMaxDuration specifices max duration of git remote operation retry
+ // EnvGitRetryMaxDuration specifies max duration of git remote operation retry
EnvGitRetryMaxDuration = "ARGOCD_GIT_RETRY_MAX_DURATION"
// EnvGitRetryDuration specifies duration of git remote operation retry
EnvGitRetryDuration = "ARGOCD_GIT_RETRY_DURATION"
@@ -353,7 +353,7 @@ func GetCMPChunkSize() int {
}
// GetCMPWorkDir will return the full path of the work directory used by the CMP server.
-// This directory and all it's contents will be deleted durring CMP bootstrap.
+// This directory and all it's contents will be deleted during CMP bootstrap.
func GetCMPWorkDir() string {
if workDir := os.Getenv(EnvCMPWorkDir); workDir != "" {
return filepath.Join(workDir, DefaultCMPWorkDirName)
diff --git a/controller/health.go b/controller/health.go
index b1acac8ac5b9b..f713a574f57d3 100644
--- a/controller/health.go
+++ b/controller/health.go
@@ -80,7 +80,7 @@ func setApplicationHealth(resources []managedResource, statuses []appv1.Resource
app.Status.ResourceHealthSource = appv1.ResourceHealthLocationAppTree
}
if savedErr != nil && errCount > 1 {
- savedErr = fmt.Errorf("see applicaton-controller logs for %d other errors; most recent error was: %w", errCount-1, savedErr)
+ savedErr = fmt.Errorf("see application-controller logs for %d other errors; most recent error was: %w", errCount-1, savedErr)
}
return &appHealth, savedErr
}
diff --git a/controller/sharding/cache.go b/controller/sharding/cache.go
index 2f3ffcbcb95c6..e7a8db4c5fb19 100644
--- a/controller/sharding/cache.go
+++ b/controller/sharding/cache.go
@@ -51,7 +51,7 @@ func NewClusterSharding(_ db.ArgoDB, shard, replicas int, shardingAlgorithm stri
return clusterSharding
}
-// IsManagedCluster returns wheter or not the cluster should be processed by a given shard.
+// IsManagedCluster returns whether or not the cluster should be processed by a given shard.
func (s *ClusterSharding) IsManagedCluster(c *v1alpha1.Cluster) bool {
s.lock.RLock()
defer s.lock.RUnlock()
diff --git a/controller/sharding/sharding.go b/controller/sharding/sharding.go
index e4af7010931c6..c415acf0b8b04 100644
--- a/controller/sharding/sharding.go
+++ b/controller/sharding/sharding.go
@@ -54,7 +54,7 @@ type shardApplicationControllerMapping struct {
}
// GetClusterFilter returns a ClusterFilterFunction which is a function taking a cluster as a parameter
-// and returns wheter or not the cluster should be processed by a given shard. It calls the distributionFunction
+// and returns whether or not the cluster should be processed by a given shard. It calls the distributionFunction
// to determine which shard will process the cluster, and if the given shard is equal to the calculated shard
// the function will return true.
func GetClusterFilter(db db.ArgoDB, distributionFunction DistributionFunction, replicas, shard int) ClusterFilterFunction {
@@ -128,13 +128,13 @@ func LegacyDistributionFunction(replicas int) DistributionFunction {
// for a given cluster the function will return the shard number based on the modulo of the cluster rank in
// the cluster's list sorted by uid on the shard number.
// This function ensures an homogenous distribution: each shards got assigned the same number of
-// clusters +/-1 , but with the drawback of a reshuffling of clusters accross shards in case of some changes
+// clusters +/-1 , but with the drawback of a reshuffling of clusters across shards in case of some changes
// in the cluster list
func RoundRobinDistributionFunction(clusters clusterAccessor, replicas int) DistributionFunction {
return func(c *v1alpha1.Cluster) int {
if replicas > 0 {
- if c == nil { // in-cluster does not necessarly have a secret assigned. So we are receiving a nil cluster here.
+ if c == nil { // in-cluster does not necessary have a secret assigned. So we are receiving a nil cluster here.
return 0
}
// if Shard is manually set and the assigned value is lower than the number of replicas,
diff --git a/docs/assets/versions.css b/docs/assets/versions.css
index b8bb066929dd0..ae75d223d1335 100644
--- a/docs/assets/versions.css
+++ b/docs/assets/versions.css
@@ -53,7 +53,7 @@ div[data-md-component=announce]>div#announce-msg>a{
}
/* from https://assets.readthedocs.org/static/css/badge_only.css,
-most styles have to be overriden here */
+most styles have to be overridden here */
.rst-versions{
position: relative !important;
bottom: 0;
diff --git a/docs/developer-guide/dependencies.md b/docs/developer-guide/dependencies.md
index 410fd1241b1b2..2a4c869825e31 100644
--- a/docs/developer-guide/dependencies.md
+++ b/docs/developer-guide/dependencies.md
@@ -6,31 +6,32 @@
https://github.com/argoproj/gitops-engine
-### Pulling changes from `gitops-engine`
+### Pulling changes from `gitops-engine`
-After your GitOps Engine PR has been merged, ArgoCD needs to be updated to pull in the version of the GitOps engine that contains your change. Here are the steps:
+After your GitOps Engine PR has been merged, ArgoCD needs to be updated to pull in the version of the GitOps engine that contains your change. Here are the steps:
-* Retrieve the SHA hash for your commit. You will use this in the next step.
-* From the `argo-cd` folder, run the following command
+- Retrieve the SHA hash for your commit. You will use this in the next step.
+- From the `argo-cd` folder, run the following command
- `go get github.com/argoproj/gitops-engine@`
+ `go get github.com/argoproj/gitops-engine@`
- If you get an error message `invalid version: unknown revision` then you got the wrong SHA hash
+ If you get an error message `invalid version: unknown revision` then you got the wrong SHA hash
-* Run:
+- Run:
- `go mod tidy`
+ `go mod tidy`
-* The following files are changed:
+- The following files are changed:
- - `go.mod`
- - `go.sum`
+ - `go.mod`
+ - `go.sum`
-* Create an ArgoCD PR with a `refactor:` type in its title for the two file changes.
+- Create an ArgoCD PR with a `refactor:` type in its title for the two file changes.
### Tips:
-* See https://github.com/argoproj/argo-cd/pull/4434 as an example
-* The PR might require additional, dependent changes in ArgoCD that are directly impacted by the changes made in the engine.
+
+- See https://github.com/argoproj/argo-cd/pull/4434 as an example
+- The PR might require additional, dependent changes in ArgoCD that are directly impacted by the changes made in the engine.
## Argo UI Components
@@ -45,10 +46,8 @@ If you make changes to the Argo UI component, and your Argo CD changes depend on
1. Make changes to Argo UI and submit the PR request.
2. Also, prepare your Argo CD changes, but don't create the PR just yet.
3. **After** the Argo UI PR has been merged to master, then as part of your Argo CD changes:
- - Run `yarn add git+https://github.com/argoproj/argo-ui.git` in the `ui/` directory, and then,
- - Check in the regenerated yarn.lock file as part of your Argo CD commit
-4. Create the Argo CD PR when you are ready. The PR build and test checks should pass.
+ - Run `yarn add git+https://github.com/argoproj/argo-ui.git` in the `ui/` directory, and then,
+ - Check in the regenerated yarn.lock file as part of your Argo CD commit
+4. Create the Argo CD PR when you are ready. The PR build and test checks should pass.
If your Argo UI change is a 'stand-alone' fix, and you simply want Argo CD to pull in your change, then simply create an Argo CD PR with the yarn.lock file change.
-
-
diff --git a/docs/developer-guide/extensions/proxy-extensions.md b/docs/developer-guide/extensions/proxy-extensions.md
index c53946cade95f..5d561657eb873 100644
--- a/docs/developer-guide/extensions/proxy-extensions.md
+++ b/docs/developer-guide/extensions/proxy-extensions.md
@@ -120,7 +120,7 @@ Is the address where the extension backend must be available.
If provided, the headers list will be added on all outgoing requests
for this service config. Existing headers in the incoming request with
-the same name will be overriden by the one in this list. Reserved header
+the same name will be overridden by the one in this list. Reserved header
names will be ignored (see the [headers](#incoming-request-headers) below).
#### `extensions.backend.services.headers.name` (*string*)
diff --git a/docs/getting_started.md b/docs/getting_started.md
index 1cf4a91115f2e..ce0d9688e7963 100644
--- a/docs/getting_started.md
+++ b/docs/getting_started.md
@@ -23,7 +23,7 @@ This will create a new namespace, `argocd`, where Argo CD services and applicati
namespace then make sure to update the namespace reference.
!!! tip
- If you are not interested in UI, SSO, and multi-cluster features, then you can install only the [core](operator-manual/core/#installing) Argo CD components.
+ If you are not interested in UI, SSO, and multi-cluster features, then you can install only the [core](operator-manual/core.md#installing) Argo CD components.
This default installation will have a self-signed certificate and cannot be accessed without a bit of extra work.
Do one of:
diff --git a/docs/operator-manual/argocd-cmd-params-cm.yaml b/docs/operator-manual/argocd-cmd-params-cm.yaml
index 3cb79d85f3150..ae2072a18fb53 100644
--- a/docs/operator-manual/argocd-cmd-params-cm.yaml
+++ b/docs/operator-manual/argocd-cmd-params-cm.yaml
@@ -58,7 +58,7 @@ data:
controller.resource.health.persist: "true"
# Cache expiration default (default 24h0m0s)
controller.default.cache.expiration: "24h0m0s"
- # Sharding algorithm used to balance clusters accross application controller shards (default "legacy")
+ # Sharding algorithm used to balance clusters across application controller shards (default "legacy")
controller.sharding.algorithm: legacy
# Number of allowed concurrent kubectl fork/execs. Any value less than 1 means no limit.
controller.kubectl.parallelism.limit: "20"
@@ -179,6 +179,8 @@ data:
reposerver.git.lsremote.parallelism.limit: "0"
# Git requests timeout.
reposerver.git.request.timeout: "15s"
+ # Include hidden directories from Git
+ reposerver.include.hidden.directories: "false"
# Disable TLS on the HTTP endpoint
dexserver.disable.tls: "false"
diff --git a/docs/operator-manual/high_availability.md b/docs/operator-manual/high_availability.md
index 75160aba197b4..60ea048ffca68 100644
--- a/docs/operator-manual/high_availability.md
+++ b/docs/operator-manual/high_availability.md
@@ -82,7 +82,7 @@ spec:
```
* In order to manually set the cluster's shard number, specify the optional `shard` property when creating a cluster. If not specified, it will be calculated on the fly by the application controller.
-* The shard distribution algorithm of the `argocd-application-controller` can be set by using the `--sharding-method` parameter. Supported sharding methods are : [legacy (default), round-robin]. `legacy` mode uses an `uid` based distribution (non-uniform). `round-robin` uses an equal distribution across all shards. The `--sharding-method` parameter can also be overriden by setting the key `controller.sharding.algorithm` in the `argocd-cmd-params-cm` `configMap` (preferably) or by setting the `ARGOCD_CONTROLLER_SHARDING_ALGORITHM` environment variable and by specifiying the same possible values.
+* The shard distribution algorithm of the `argocd-application-controller` can be set by using the `--sharding-method` parameter. Supported sharding methods are : [legacy (default), round-robin]. `legacy` mode uses an `uid` based distribution (non-uniform). `round-robin` uses an equal distribution across all shards. The `--sharding-method` parameter can also be overridden by setting the key `controller.sharding.algorithm` in the `argocd-cmd-params-cm` `configMap` (preferably) or by setting the `ARGOCD_CONTROLLER_SHARDING_ALGORITHM` environment variable and by specifiying the same possible values.
!!! warning "Alpha Feature"
The `round-robin` shard distribution algorithm is an experimental feature. Reshuffling is known to occur in certain scenarios with cluster removal. If the cluster at rank-0 is removed, reshuffling all clusters across shards will occur and may temporarily have negative performance impacts.
diff --git a/docs/operator-manual/ingress.md b/docs/operator-manual/ingress.md
index 584779c5271d0..c13a18fbe3f5b 100644
--- a/docs/operator-manual/ingress.md
+++ b/docs/operator-manual/ingress.md
@@ -492,7 +492,7 @@ spec:
- --staticassets
- /shared/app
- --redis
- - argocd-redis-ha-haproxy:6379
+ - argocd-redis:6379
- --insecure
- --basehref
- /argocd
@@ -510,7 +510,7 @@ After that install Argo CD (there should be only 3 yml file defined above in cu
kubectl apply -k ./ -n argocd --wait=true
```
-Be sure you create secret for Isito ( in our case secretname is argocd-server-tls on argocd Namespace). After that we create Istio Resources
+Be sure you create secret for Istio ( in our case secretname is argocd-server-tls on argocd Namespace). After that we create Istio Resources
```yaml
apiVersion: networking.istio.io/v1alpha3
diff --git a/docs/operator-manual/server-commands/argocd-repo-server.md b/docs/operator-manual/server-commands/argocd-repo-server.md
index 189adbbc3370b..3532fc6c30b4a 100644
--- a/docs/operator-manual/server-commands/argocd-repo-server.md
+++ b/docs/operator-manual/server-commands/argocd-repo-server.md
@@ -23,6 +23,7 @@ argocd-repo-server [flags]
--helm-manifest-max-extracted-size string Maximum size of helm manifest archives when extracted (default "1G")
--helm-registry-max-index-size string Maximum size of registry index file (default "1G")
-h, --help help for argocd-repo-server
+ --include-hidden-directories Include hidden directories from Git
--logformat string Set the logging format. One of: text|json (default "text")
--loglevel string Set the logging level. One of: debug|info|warn|error (default "info")
--max-combined-directory-manifests-size string Max combined size of manifest files in a directory-type Application (default "10M")
diff --git a/docs/proposals/application-name-identifier.md b/docs/proposals/application-name-identifier.md
index 3d425e9432dbc..0554c4139b817 100644
--- a/docs/proposals/application-name-identifier.md
+++ b/docs/proposals/application-name-identifier.md
@@ -31,7 +31,7 @@ managed (i.e. reconciled from Git). The default label used is the well-known
label `app.kubernetes.io/instance`.
This proposal suggests to introduce the `trackingMethod` setting that allows
-controlling how applicaton resources are identified and allows switching to
+controlling how application resources are identified and allows switching to
using the annotation instead of `app.kubernetes.io/instance` label.
## Motivation
diff --git a/docs/snyk/index.md b/docs/snyk/index.md
index d532fec3a34a3..1e02829a1cdf6 100644
--- a/docs/snyk/index.md
+++ b/docs/snyk/index.md
@@ -17,50 +17,47 @@ recent minor releases.
| [ui/yarn.lock](master/argocd-test.html) | 0 | 0 | 1 | 0 |
| [dex:v2.38.0](master/ghcr.io_dexidp_dex_v2.38.0.html) | 0 | 0 | 6 | 3 |
| [haproxy:2.6.14-alpine](master/public.ecr.aws_docker_library_haproxy_2.6.14-alpine.html) | 0 | 1 | 4 | 3 |
-| [redis:7.0.15-alpine](master/public.ecr.aws_docker_library_redis_7.0.15-alpine.html) | 0 | 0 | 4 | 1 |
+| [redis:7.0.15-alpine](master/public.ecr.aws_docker_library_redis_7.0.15-alpine.html) | 0 | 0 | 0 | 0 |
| [argocd:latest](master/quay.io_argoproj_argocd_latest.html) | 0 | 0 | 3 | 9 |
-| [redis:7.0.15-alpine](master/redis_7.0.15-alpine.html) | 0 | 0 | 4 | 1 |
+| [redis:7.0.15-alpine](master/redis_7.0.15-alpine.html) | 0 | 0 | 0 | 0 |
| [install.yaml](master/argocd-iac-install.html) | - | - | - | - |
| [namespace-install.yaml](master/argocd-iac-namespace-install.html) | - | - | - | - |
-### v2.11.1
+### v2.11.2
| | Critical | High | Medium | Low |
|---:|:--------:|:----:|:------:|:---:|
-| [go.mod](v2.11.1/argocd-test.html) | 0 | 1 | 6 | 0 |
-| [ui/yarn.lock](v2.11.1/argocd-test.html) | 0 | 0 | 1 | 0 |
-| [dex:v2.38.0](v2.11.1/ghcr.io_dexidp_dex_v2.38.0.html) | 0 | 0 | 6 | 3 |
-| [haproxy:2.6.14-alpine](v2.11.1/public.ecr.aws_docker_library_haproxy_2.6.14-alpine.html) | 0 | 1 | 4 | 3 |
-| [redis:7.0.14-alpine](v2.11.1/public.ecr.aws_docker_library_redis_7.0.14-alpine.html) | 0 | 0 | 6 | 3 |
-| [argocd:v2.11.1](v2.11.1/quay.io_argoproj_argocd_v2.11.1.html) | 0 | 0 | 3 | 16 |
-| [redis:7.0.14-alpine](v2.11.1/redis_7.0.14-alpine.html) | 0 | 0 | 6 | 3 |
-| [install.yaml](v2.11.1/argocd-iac-install.html) | - | - | - | - |
-| [namespace-install.yaml](v2.11.1/argocd-iac-namespace-install.html) | - | - | - | - |
+| [go.mod](v2.11.2/argocd-test.html) | 0 | 1 | 6 | 0 |
+| [ui/yarn.lock](v2.11.2/argocd-test.html) | 0 | 0 | 1 | 0 |
+| [dex:v2.38.0](v2.11.2/ghcr.io_dexidp_dex_v2.38.0.html) | 0 | 0 | 6 | 3 |
+| [haproxy:2.6.14-alpine](v2.11.2/haproxy_2.6.14-alpine.html) | 0 | 1 | 4 | 3 |
+| [argocd:v2.11.2](v2.11.2/quay.io_argoproj_argocd_v2.11.2.html) | 0 | 0 | 3 | 16 |
+| [redis:7.0.14-alpine](v2.11.2/redis_7.0.14-alpine.html) | 0 | 0 | 6 | 3 |
+| [install.yaml](v2.11.2/argocd-iac-install.html) | - | - | - | - |
+| [namespace-install.yaml](v2.11.2/argocd-iac-namespace-install.html) | - | - | - | - |
-### v2.10.10
+### v2.10.11
| | Critical | High | Medium | Low |
|---:|:--------:|:----:|:------:|:---:|
-| [go.mod](v2.10.10/argocd-test.html) | 0 | 1 | 7 | 0 |
-| [ui/yarn.lock](v2.10.10/argocd-test.html) | 0 | 0 | 1 | 0 |
-| [dex:v2.37.0](v2.10.10/ghcr.io_dexidp_dex_v2.37.0.html) | 1 | 1 | 7 | 3 |
-| [haproxy:2.6.14-alpine](v2.10.10/public.ecr.aws_docker_library_haproxy_2.6.14-alpine.html) | 0 | 1 | 4 | 3 |
-| [redis:7.0.15-alpine](v2.10.10/public.ecr.aws_docker_library_redis_7.0.15-alpine.html) | 0 | 0 | 4 | 1 |
-| [argocd:v2.10.10](v2.10.10/quay.io_argoproj_argocd_v2.10.10.html) | 0 | 0 | 3 | 16 |
-| [redis:7.0.15-alpine](v2.10.10/redis_7.0.15-alpine.html) | 0 | 0 | 4 | 1 |
-| [install.yaml](v2.10.10/argocd-iac-install.html) | - | - | - | - |
-| [namespace-install.yaml](v2.10.10/argocd-iac-namespace-install.html) | - | - | - | - |
+| [go.mod](v2.10.11/argocd-test.html) | 0 | 1 | 7 | 0 |
+| [ui/yarn.lock](v2.10.11/argocd-test.html) | 0 | 0 | 1 | 0 |
+| [dex:v2.37.0](v2.10.11/ghcr.io_dexidp_dex_v2.37.0.html) | 1 | 1 | 7 | 3 |
+| [haproxy:2.6.14-alpine](v2.10.11/haproxy_2.6.14-alpine.html) | 0 | 1 | 4 | 3 |
+| [argocd:v2.10.11](v2.10.11/quay.io_argoproj_argocd_v2.10.11.html) | 0 | 0 | 3 | 16 |
+| [redis:7.0.15-alpine](v2.10.11/redis_7.0.15-alpine.html) | 0 | 0 | 0 | 0 |
+| [install.yaml](v2.10.11/argocd-iac-install.html) | - | - | - | - |
+| [namespace-install.yaml](v2.10.11/argocd-iac-namespace-install.html) | - | - | - | - |
-### v2.9.15
+### v2.9.16
| | Critical | High | Medium | Low |
|---:|:--------:|:----:|:------:|:---:|
-| [go.mod](v2.9.15/argocd-test.html) | 0 | 2 | 7 | 0 |
-| [ui/yarn.lock](v2.9.15/argocd-test.html) | 0 | 0 | 1 | 0 |
-| [dex:v2.37.0](v2.9.15/ghcr.io_dexidp_dex_v2.37.0.html) | 1 | 1 | 7 | 3 |
-| [haproxy:2.6.14-alpine](v2.9.15/public.ecr.aws_docker_library_haproxy_2.6.14-alpine.html) | 0 | 1 | 4 | 3 |
-| [redis:7.0.15-alpine](v2.9.15/public.ecr.aws_docker_library_redis_7.0.15-alpine.html) | 0 | 0 | 4 | 1 |
-| [argocd:v2.9.15](v2.9.15/quay.io_argoproj_argocd_v2.9.15.html) | 0 | 0 | 3 | 16 |
-| [redis:7.0.15-alpine](v2.9.15/redis_7.0.15-alpine.html) | 0 | 0 | 4 | 1 |
-| [install.yaml](v2.9.15/argocd-iac-install.html) | - | - | - | - |
-| [namespace-install.yaml](v2.9.15/argocd-iac-namespace-install.html) | - | - | - | - |
+| [go.mod](v2.9.16/argocd-test.html) | 0 | 2 | 7 | 0 |
+| [ui/yarn.lock](v2.9.16/argocd-test.html) | 0 | 0 | 1 | 0 |
+| [dex:v2.37.0](v2.9.16/ghcr.io_dexidp_dex_v2.37.0.html) | 1 | 1 | 7 | 3 |
+| [haproxy:2.6.14-alpine](v2.9.16/haproxy_2.6.14-alpine.html) | 0 | 1 | 4 | 3 |
+| [argocd:v2.9.16](v2.9.16/quay.io_argoproj_argocd_v2.9.16.html) | 0 | 0 | 3 | 16 |
+| [redis:7.0.15-alpine](v2.9.16/redis_7.0.15-alpine.html) | 0 | 0 | 0 | 0 |
+| [install.yaml](v2.9.16/argocd-iac-install.html) | - | - | - | - |
+| [namespace-install.yaml](v2.9.16/argocd-iac-namespace-install.html) | - | - | - | - |
diff --git a/docs/snyk/master/argocd-iac-install.html b/docs/snyk/master/argocd-iac-install.html
index 350d3d6b3f96f..b6717dac7c68b 100644
--- a/docs/snyk/master/argocd-iac-install.html
+++ b/docs/snyk/master/argocd-iac-install.html
@@ -456,7 +456,7 @@
Note:Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine.
- See How to fix? for Alpine:3.19 relevant fixed versions and status.
-
A heap-buffer-overflow was discovered in BusyBox v.1.36.1 in the next_token function at awk.c:1159.
-
Remediation
-
Upgrade Alpine:3.19busybox to version 1.36.1-r16 or higher.
Note:Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine.
- See How to fix? for Alpine:3.19 relevant fixed versions and status.
-
A use-after-free vulnerability was discovered in BusyBox v.1.36.1 via a crafted awk pattern in the awk.c copyvar function.
-
Remediation
-
Upgrade Alpine:3.19busybox to version 1.36.1-r17 or higher.
Note:Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine.
- See How to fix? for Alpine:3.19 relevant fixed versions and status.
-
A use-after-free vulnerability in BusyBox v.1.36.1 allows attackers to cause a denial of service via a crafted awk pattern in the awk.c evaluate function.
-
Remediation
-
Upgrade Alpine:3.19busybox to version 1.36.1-r17 or higher.
Note:Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine.
- See How to fix? for Alpine:3.19 relevant fixed versions and status.
-
A use-after-free vulnerability was discovered in xasprintf function in xfuncs_printf.c:344 in BusyBox v.1.36.1.
-
Remediation
-
Upgrade Alpine:3.19busybox to version 1.36.1-r17 or higher.
Note:Versions mentioned in the description apply only to the upstream openssl package and not the openssl package as distributed by Alpine.
- See How to fix? for Alpine:3.19 relevant fixed versions and status.
-
Issue summary: Checking excessively long DSA keys or parameters may be very
- slow.
-
Impact summary: Applications that use the functions EVP_PKEY_param_check()
- or EVP_PKEY_public_check() to check a DSA public key or DSA parameters may
- experience long delays. Where the key or parameters that are being checked
- have been obtained from an untrusted source this may lead to a Denial of
- Service.
-
The functions EVP_PKEY_param_check() or EVP_PKEY_public_check() perform
- various checks on DSA parameters. Some of those computations take a long time
- if the modulus (p parameter) is too large.
-
Trying to use a very large modulus is slow and OpenSSL will not allow using
- public keys with a modulus which is over 10,000 bits in length for signature
- verification. However the key and parameter check functions do not limit
- the modulus size when performing the checks.
-
An application that calls EVP_PKEY_param_check() or EVP_PKEY_public_check()
- and supplies a key or parameters obtained from an untrusted source could be
- vulnerable to a Denial of Service attack.
-
These functions are not called by OpenSSL itself on untrusted DSA keys so
- only applications that directly call these functions may be vulnerable.
-
Also vulnerable are the OpenSSL pkey and pkeyparam command line applications
- when using the -check option.
-
The OpenSSL SSL/TLS implementation is not affected by this issue.
-
The OpenSSL 3.0 and 3.1 FIPS providers are affected by this issue.
-
Remediation
-
Upgrade Alpine:3.19openssl to version 3.1.5-r0 or higher.
Note:Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine.
- See How to fix? for Alpine:3.19 relevant fixed versions and status.
-
A heap-buffer-overflow was discovered in BusyBox v.1.36.1 in the next_token function at awk.c:1159.
-
Remediation
-
Upgrade Alpine:3.19busybox to version 1.36.1-r16 or higher.
Note:Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine.
- See How to fix? for Alpine:3.19 relevant fixed versions and status.
-
A use-after-free vulnerability was discovered in BusyBox v.1.36.1 via a crafted awk pattern in the awk.c copyvar function.
-
Remediation
-
Upgrade Alpine:3.19busybox to version 1.36.1-r17 or higher.
Note:Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine.
- See How to fix? for Alpine:3.19 relevant fixed versions and status.
-
A use-after-free vulnerability in BusyBox v.1.36.1 allows attackers to cause a denial of service via a crafted awk pattern in the awk.c evaluate function.
-
Remediation
-
Upgrade Alpine:3.19busybox to version 1.36.1-r17 or higher.
Note:Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine.
- See How to fix? for Alpine:3.19 relevant fixed versions and status.
-
A use-after-free vulnerability was discovered in xasprintf function in xfuncs_printf.c:344 in BusyBox v.1.36.1.
-
Remediation
-
Upgrade Alpine:3.19busybox to version 1.36.1-r17 or higher.
Note:Versions mentioned in the description apply only to the upstream openssl package and not the openssl package as distributed by Alpine.
- See How to fix? for Alpine:3.19 relevant fixed versions and status.
-
Issue summary: Checking excessively long DSA keys or parameters may be very
- slow.
-
Impact summary: Applications that use the functions EVP_PKEY_param_check()
- or EVP_PKEY_public_check() to check a DSA public key or DSA parameters may
- experience long delays. Where the key or parameters that are being checked
- have been obtained from an untrusted source this may lead to a Denial of
- Service.
-
The functions EVP_PKEY_param_check() or EVP_PKEY_public_check() perform
- various checks on DSA parameters. Some of those computations take a long time
- if the modulus (p parameter) is too large.
-
Trying to use a very large modulus is slow and OpenSSL will not allow using
- public keys with a modulus which is over 10,000 bits in length for signature
- verification. However the key and parameter check functions do not limit
- the modulus size when performing the checks.
-
An application that calls EVP_PKEY_param_check() or EVP_PKEY_public_check()
- and supplies a key or parameters obtained from an untrusted source could be
- vulnerable to a Denial of Service attack.
-
These functions are not called by OpenSSL itself on untrusted DSA keys so
- only applications that directly call these functions may be vulnerable.
-
Also vulnerable are the OpenSSL pkey and pkeyparam command line applications
- when using the -check option.
-
The OpenSSL SSL/TLS implementation is not affected by this issue.
-
The OpenSSL 3.0 and 3.1 FIPS providers are affected by this issue.
-
Remediation
-
Upgrade Alpine:3.19openssl to version 3.1.5-r0 or higher.
Note:Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine.
- See How to fix? for Alpine:3.19 relevant fixed versions and status.
-
A heap-buffer-overflow was discovered in BusyBox v.1.36.1 in the next_token function at awk.c:1159.
-
Remediation
-
Upgrade Alpine:3.19busybox to version 1.36.1-r16 or higher.
Note:Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine.
- See How to fix? for Alpine:3.19 relevant fixed versions and status.
-
A use-after-free vulnerability was discovered in BusyBox v.1.36.1 via a crafted awk pattern in the awk.c copyvar function.
-
Remediation
-
Upgrade Alpine:3.19busybox to version 1.36.1-r17 or higher.
Note:Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine.
- See How to fix? for Alpine:3.19 relevant fixed versions and status.
-
A use-after-free vulnerability in BusyBox v.1.36.1 allows attackers to cause a denial of service via a crafted awk pattern in the awk.c evaluate function.
-
Remediation
-
Upgrade Alpine:3.19busybox to version 1.36.1-r17 or higher.
Note:Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine.
- See How to fix? for Alpine:3.19 relevant fixed versions and status.
-
A use-after-free vulnerability was discovered in xasprintf function in xfuncs_printf.c:344 in BusyBox v.1.36.1.
-
Remediation
-
Upgrade Alpine:3.19busybox to version 1.36.1-r17 or higher.
Note:Versions mentioned in the description apply only to the upstream openssl package and not the openssl package as distributed by Alpine.
- See How to fix? for Alpine:3.19 relevant fixed versions and status.
-
Issue summary: Checking excessively long DSA keys or parameters may be very
- slow.
-
Impact summary: Applications that use the functions EVP_PKEY_param_check()
- or EVP_PKEY_public_check() to check a DSA public key or DSA parameters may
- experience long delays. Where the key or parameters that are being checked
- have been obtained from an untrusted source this may lead to a Denial of
- Service.
-
The functions EVP_PKEY_param_check() or EVP_PKEY_public_check() perform
- various checks on DSA parameters. Some of those computations take a long time
- if the modulus (p parameter) is too large.
-
Trying to use a very large modulus is slow and OpenSSL will not allow using
- public keys with a modulus which is over 10,000 bits in length for signature
- verification. However the key and parameter check functions do not limit
- the modulus size when performing the checks.
-
An application that calls EVP_PKEY_param_check() or EVP_PKEY_public_check()
- and supplies a key or parameters obtained from an untrusted source could be
- vulnerable to a Denial of Service attack.
-
These functions are not called by OpenSSL itself on untrusted DSA keys so
- only applications that directly call these functions may be vulnerable.
-
Also vulnerable are the OpenSSL pkey and pkeyparam command line applications
- when using the -check option.
-
The OpenSSL SSL/TLS implementation is not affected by this issue.
-
The OpenSSL 3.0 and 3.1 FIPS providers are affected by this issue.
-
Remediation
-
Upgrade Alpine:3.19openssl to version 3.1.5-r0 or higher.