Full Code of runatlantis/atlantis for AI

main c88b0496f3c4 cached
1015 files
4.8 MB
1.3M tokens
5213 symbols
1 requests
Download .txt
Showing preview only (5,217K chars total). Download the full file or copy to clipboard to get everything.
Repository: runatlantis/atlantis
Branch: main
Commit: c88b0496f3c4
Files: 1015
Total size: 4.8 MB

Directory structure:
gitextract_5epp6u6d/

├── .adr-dir
├── .clusterfuzzlite/
│   ├── Dockerfile
│   └── build.sh
├── .codecov.yml
├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── cherry-pick-bot.yml
│   ├── copilot-instructions.md
│   ├── labeler.yml
│   ├── release.yml
│   ├── renovate.json5
│   ├── styles/
│   │   └── Atlantis/
│   │       └── ProductTerms.yml
│   └── workflows/
│       ├── atlantis-image.yml
│       ├── clusterfuzzlite.yml
│       ├── codeql.yml
│       ├── dependency-review.yml
│       ├── labeler.yml
│       ├── lint.yml
│       ├── pr-lint.yml
│       ├── pr-size-labeler.yml
│       ├── release.yml
│       ├── renovate-config.yml
│       ├── scorecard.yml
│       ├── stale.yml
│       ├── test.yml
│       ├── testing-env-image.yml
│       └── website.yml
├── .gitignore
├── .golangci.yml
├── .goreleaser.yml
├── .lycheeignore
├── .markdownlint.yaml
├── .node-version
├── .pre-commit-config.yaml
├── .tool-versions
├── .vale.ini
├── .vscode/
│   └── settings.json
├── ADOPTERS.md
├── CHANGELOG.md
├── CODEOWNERS
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── Dockerfile.dev
├── LICENSE
├── MAINTAINERS.md
├── Makefile
├── README.md
├── RELEASE.md
├── SECURITY.md
├── _typos.toml
├── atlantis-features-version-analysis.md
├── cmd/
│   ├── bootstrap.go
│   ├── cmd.go
│   ├── help_fmt.go
│   ├── root.go
│   ├── server.go
│   ├── server_test.go
│   └── version.go
├── docker-compose.yml
├── docker-entrypoint.sh
├── docs/
│   └── adr/
│       └── 0001-record-architecture-decisions.md
├── e2e/
│   ├── .gitignore
│   ├── Makefile
│   ├── README.md
│   ├── e2e.go
│   ├── github.go
│   ├── gitlab.go
│   ├── go.mod
│   ├── go.sum
│   ├── main.go
│   └── vcs.go
├── go.mod
├── go.sum
├── goss.yaml
├── kustomize/
│   ├── bundle.yaml
│   └── kustomization.yaml
├── main.go
├── netlify.toml
├── package.json
├── playwright.config.cjs
├── runatlantis.io/
│   ├── .vitepress/
│   │   ├── components/
│   │   │   ├── Banner.vue
│   │   │   └── shims.d.ts
│   │   ├── config.ts
│   │   ├── navbars.ts
│   │   ├── sidebars.ts
│   │   └── theme/
│   │       └── index.ts
│   ├── blog/
│   │   ├── 2017/
│   │   │   └── introducing-atlantis.md
│   │   ├── 2018/
│   │   │   ├── atlantis-0-4-4-now-supports-bitbucket.md
│   │   │   ├── hosting-our-static-site/
│   │   │   │   └── code/
│   │   │   │       ├── cloudfront.tf
│   │   │   │       ├── dns.tf
│   │   │   │       ├── full.tf
│   │   │   │       ├── main.tf
│   │   │   │       ├── s3-bucket.tf
│   │   │   │       └── ssl-cert.tf
│   │   │   ├── hosting-our-static-site-over-ssl-with-s3-acm-cloudfront-and-terraform.md
│   │   │   ├── joining-hashicorp.md
│   │   │   ├── putting-the-dev-into-devops-why-your-developers-should-write-terraform-too.md
│   │   │   └── terraform-and-the-dangers-of-applying-locally.md
│   │   ├── 2019/
│   │   │   └── 4-reasons-to-try-hashicorps-new-free-terraform-remote-state-storage.md
│   │   ├── 2024/
│   │   │   ├── april-2024-survey-results.md
│   │   │   └── integrating-atlantis-with-opentofu.md
│   │   └── 2025/
│   │       └── atlantis-on-google-cloud-run.md
│   ├── blog.md
│   ├── contributing/
│   │   ├── events-controller.md
│   │   └── glossary.md
│   ├── contributing.md
│   ├── docs/
│   │   ├── access-credentials.md
│   │   ├── api-endpoints.md
│   │   ├── apply-requirements.md
│   │   ├── automerging.md
│   │   ├── autoplanning.md
│   │   ├── checkout-strategy.md
│   │   ├── command-requirements.md
│   │   ├── configuring-atlantis.md
│   │   ├── configuring-webhooks.md
│   │   ├── custom-policy-checks.md
│   │   ├── custom-workflows.md
│   │   ├── deployment.md
│   │   ├── faq.md
│   │   ├── how-atlantis-works.md
│   │   ├── installation-guide.md
│   │   ├── locking.md
│   │   ├── policy-checking.md
│   │   ├── post-workflow-hooks.md
│   │   ├── pre-workflow-hooks.md
│   │   ├── provider-credentials.md
│   │   ├── repo-and-project-permissions.md
│   │   ├── repo-level-atlantis-yaml.md
│   │   ├── requirements.md
│   │   ├── security.md
│   │   ├── sending-notifications-via-webhooks.md
│   │   ├── server-configuration.md
│   │   ├── server-side-repo-config.md
│   │   ├── stats.md
│   │   ├── streaming-logs.md
│   │   ├── terraform-cloud.md
│   │   ├── terraform-versions.md
│   │   ├── troubleshooting-https.md
│   │   ├── upgrading-atlantis-yaml.md
│   │   ├── using-atlantis.md
│   │   └── webhook-secrets.md
│   ├── docs.md
│   ├── e2e/
│   │   └── site-check.spec.js
│   ├── guide/
│   │   ├── test-drive.md
│   │   └── testing-locally.md
│   ├── guide.md
│   ├── index.md
│   └── terraform/
│       ├── main.tf
│       └── versions.tf
├── scripts/
│   ├── addlicense.sh
│   ├── coverage.sh
│   ├── download-release.sh
│   ├── e2e.sh
│   ├── fmt.sh
│   ├── go-generate.sh
│   └── pin_ci_terraform_providers.sh
├── server/
│   ├── controllers/
│   │   ├── api_controller.go
│   │   ├── api_controller_test.go
│   │   ├── events/
│   │   │   ├── azuredevops_request_validator.go
│   │   │   ├── azuredevops_request_validator_test.go
│   │   │   ├── events_controller.go
│   │   │   ├── events_controller_e2e_test.go
│   │   │   ├── events_controller_test.go
│   │   │   ├── github_request_validator.go
│   │   │   ├── github_request_validator_test.go
│   │   │   ├── gitlab_request_parser_validator.go
│   │   │   ├── gitlab_request_parser_validator_test.go
│   │   │   ├── mocks/
│   │   │   │   ├── mock_azuredevops_request_validator.go
│   │   │   │   ├── mock_github_request_validator.go
│   │   │   │   └── mock_gitlab_request_parser_validator.go
│   │   │   └── testdata/
│   │   │       ├── bb-server-pull-deleted-event.json
│   │   │       ├── githubIssueCommentEvent.json
│   │   │       ├── githubIssueCommentEvent_notAllowlisted.json
│   │   │       ├── githubPullRequestClosedEvent.json
│   │   │       ├── githubPullRequestOpenedEvent.json
│   │   │       ├── gitlabMergeCommentEvent_notAllowlisted.json
│   │   │       ├── gitlabMergeCommentEvent_shouldIgnore.json
│   │   │       ├── null_provider_lockfile_old_version
│   │   │       └── test-repos/
│   │   │           ├── automerge/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── dir1/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── dir2/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── exp-output-apply-dir1.txt
│   │   │           │   ├── exp-output-apply-dir2.txt
│   │   │           │   ├── exp-output-automerge.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   └── exp-output-merge.txt
│   │   │           ├── import-multiple-project/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── dir1/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── dir2/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-import-dummy1.txt
│   │   │           │   ├── exp-output-import-multiple-projects.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   └── exp-output-plan-again.txt
│   │   │           ├── import-single-project/
│   │   │           │   ├── exp-output-apply-no-projects.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-import-dummy1.txt
│   │   │           │   ├── exp-output-import-dummy2.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── exp-output-plan-again.txt
│   │   │           │   ├── main.tf
│   │   │           │   └── versions.tf
│   │   │           ├── import-single-project-var/
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-import-count.txt
│   │   │           │   ├── exp-output-import-foreach.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── exp-output-plan-again.txt
│   │   │           │   ├── main.tf
│   │   │           │   └── versions.tf
│   │   │           ├── import-workspace/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── dir1/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── exp-output-import-dir1-ops-dummy1.txt
│   │   │           │   ├── exp-output-import-dir1-ops-dummy2.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   └── exp-output-plan.txt
│   │   │           ├── modules/
│   │   │           │   ├── exp-output-apply-production.txt
│   │   │           │   ├── exp-output-apply-staging.txt
│   │   │           │   ├── exp-output-autoplan-only-staging.txt
│   │   │           │   ├── exp-output-merge-all-dirs.txt
│   │   │           │   ├── exp-output-merge-only-staging.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── exp-output-plan-production.txt
│   │   │           │   ├── exp-output-plan-staging.txt
│   │   │           │   ├── modules/
│   │   │           │   │   └── null/
│   │   │           │   │       ├── main.tf
│   │   │           │   │       └── versions.tf
│   │   │           │   ├── production/
│   │   │           │   │   └── main.tf
│   │   │           │   └── staging/
│   │   │           │       └── main.tf
│   │   │           ├── modules-yaml/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-production.txt
│   │   │           │   ├── exp-output-apply-staging.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge-all-dirs.txt
│   │   │           │   ├── exp-output-merge-only-staging.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── exp-output-plan-production.txt
│   │   │           │   ├── exp-output-plan-staging.txt
│   │   │           │   ├── modules/
│   │   │           │   │   └── null/
│   │   │           │   │       ├── main.tf
│   │   │           │   │       └── versions.tf
│   │   │           │   ├── production/
│   │   │           │   │   └── main.tf
│   │   │           │   └── staging/
│   │   │           │       └── main.tf
│   │   │           ├── policy-checks/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-apply-reqs/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-clear-approval/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies-clear.txt
│   │   │           │   ├── exp-output-approve-policies-success.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-custom-run-steps/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-diff-owner/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-disabled-previous-match/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-disabled-repo/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-disabled-repo-server-side/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-enabled-repo/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-enabled-repo-server-side/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-extra-args/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-multi-projects/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── dir1/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── dir2/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-auto-policy-check-quiet.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   └── repos.yaml
│   │   │           ├── policy-checks-success-silent/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   └── repos.yaml
│   │   │           ├── repo-config-file/
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   └── infrastructure/
│   │   │           │       ├── custom-name-atlantis.yaml
│   │   │           │       ├── production/
│   │   │           │       │   ├── main.tf
│   │   │           │       │   └── versions.tf
│   │   │           │       └── staging/
│   │   │           │           ├── main.tf
│   │   │           │           └── versions.tf
│   │   │           ├── server-side-cfg/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-default-workspace.txt
│   │   │           │   ├── exp-output-apply-staging-workspace.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── simple/
│   │   │           │   ├── exp-output-allow-command-unknown-import.txt
│   │   │           │   ├── exp-output-apply-var-all.txt
│   │   │           │   ├── exp-output-apply-var-default-workspace.txt
│   │   │           │   ├── exp-output-apply-var-new-workspace.txt
│   │   │           │   ├── exp-output-apply-var.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-atlantis-plan-new-workspace.txt
│   │   │           │   ├── exp-output-atlantis-plan-var-overridden.txt
│   │   │           │   ├── exp-output-atlantis-plan.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge-workspaces.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   └── versions.tf
│   │   │           ├── simple-with-lockfile/
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-plan.txt
│   │   │           │   ├── main.tf
│   │   │           │   └── versions.tf
│   │   │           ├── simple-yaml/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-allow-command-unknown-apply.txt
│   │   │           │   ├── exp-output-apply-all.txt
│   │   │           │   ├── exp-output-apply-default.txt
│   │   │           │   ├── exp-output-apply-locked.txt
│   │   │           │   ├── exp-output-apply-staging.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── exp-output-plan-default.txt
│   │   │           │   ├── exp-output-plan-staging.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── staging.tfvars
│   │   │           │   └── versions.tf
│   │   │           ├── state-rm-multiple-project/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── dir1/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── dir2/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-import-dummy1.txt
│   │   │           │   ├── exp-output-import-dummy2.txt
│   │   │           │   ├── exp-output-merged.txt
│   │   │           │   ├── exp-output-plan-again.txt
│   │   │           │   ├── exp-output-plan.txt
│   │   │           │   └── exp-output-state-rm-multiple-projects.txt
│   │   │           ├── state-rm-single-project/
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-import-count.txt
│   │   │           │   ├── exp-output-import-foreach.txt
│   │   │           │   ├── exp-output-import-simple.txt
│   │   │           │   ├── exp-output-merged.txt
│   │   │           │   ├── exp-output-plan-again.txt
│   │   │           │   ├── exp-output-plan.txt
│   │   │           │   ├── exp-output-state-rm-foreach.txt
│   │   │           │   ├── exp-output-state-rm-multiple.txt
│   │   │           │   ├── main.tf
│   │   │           │   └── versions.tf
│   │   │           ├── state-rm-workspace/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── dir1/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── exp-output-import-dummy1.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── exp-output-plan-again.txt
│   │   │           │   ├── exp-output-plan.txt
│   │   │           │   └── exp-output-state-rm-dummy1.txt
│   │   │           ├── tfvars-yaml/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── default.backend.tfvars
│   │   │           │   ├── default.tfvars
│   │   │           │   ├── exp-output-apply-default.txt
│   │   │           │   ├── exp-output-apply-staging.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── staging.backend.tfvars
│   │   │           │   ├── staging.tfvars
│   │   │           │   └── versions.tf
│   │   │           ├── tfvars-yaml-no-autoplan/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── default.backend.tfvars
│   │   │           │   ├── default.tfvars
│   │   │           │   ├── exp-output-apply-default.txt
│   │   │           │   ├── exp-output-apply-staging.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── exp-output-plan-default.txt
│   │   │           │   ├── exp-output-plan-staging.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── staging.backend.tfvars
│   │   │           │   ├── staging.tfvars
│   │   │           │   └── versions.tf
│   │   │           └── workspace-parallel-yaml/
│   │   │               ├── atlantis.yaml
│   │   │               ├── exp-output-apply-all-production.txt
│   │   │               ├── exp-output-apply-all-staging.txt
│   │   │               ├── exp-output-autoplan-production.txt
│   │   │               ├── exp-output-autoplan-staging.txt
│   │   │               ├── exp-output-merge.txt
│   │   │               ├── production/
│   │   │               │   ├── main.tf
│   │   │               │   └── versions.tf
│   │   │               └── staging/
│   │   │                   ├── main.tf
│   │   │                   └── versions.tf
│   │   ├── github_app_controller.go
│   │   ├── jobs_controller.go
│   │   ├── locks_controller.go
│   │   ├── locks_controller_test.go
│   │   ├── status_controller.go
│   │   ├── status_controller_test.go
│   │   ├── web_templates/
│   │   │   ├── mocks/
│   │   │   │   └── mock_template_writer.go
│   │   │   ├── templates/
│   │   │   │   ├── github-app.html.tmpl
│   │   │   │   ├── index.html.tmpl
│   │   │   │   ├── lock.html.tmpl
│   │   │   │   ├── project-jobs-error.html.tmpl
│   │   │   │   └── project-jobs.html.tmpl
│   │   │   ├── web_templates.go
│   │   │   └── web_templates_test.go
│   │   └── websocket/
│   │       ├── mux.go
│   │       ├── mux_test.go
│   │       └── writer.go
│   ├── core/
│   │   ├── boltdb/
│   │   │   ├── boltdb.go
│   │   │   └── boltdb_test.go
│   │   ├── config/
│   │   │   ├── cfgfuzz/
│   │   │   │   └── fuzz_test.go
│   │   │   ├── parser_validator.go
│   │   │   ├── parser_validator_test.go
│   │   │   ├── raw/
│   │   │   │   ├── autodiscover.go
│   │   │   │   ├── autodiscover_test.go
│   │   │   │   ├── autoplan.go
│   │   │   │   ├── autoplan_test.go
│   │   │   │   ├── global_cfg.go
│   │   │   │   ├── metrics.go
│   │   │   │   ├── metrics_test.go
│   │   │   │   ├── policies.go
│   │   │   │   ├── policies_test.go
│   │   │   │   ├── project.go
│   │   │   │   ├── project_test.go
│   │   │   │   ├── raw.go
│   │   │   │   ├── raw_test.go
│   │   │   │   ├── repo_cfg.go
│   │   │   │   ├── repo_cfg_test.go
│   │   │   │   ├── repo_locks.go
│   │   │   │   ├── repo_locks_test.go
│   │   │   │   ├── stage.go
│   │   │   │   ├── stage_test.go
│   │   │   │   ├── step.go
│   │   │   │   ├── step_test.go
│   │   │   │   ├── team_authz.go
│   │   │   │   ├── workflow.go
│   │   │   │   ├── workflow_step.go
│   │   │   │   ├── workflow_step_test.go
│   │   │   │   └── workflow_test.go
│   │   │   └── valid/
│   │   │       ├── autodiscover.go
│   │   │       ├── autodiscover_test.go
│   │   │       ├── global_cfg.go
│   │   │       ├── global_cfg_test.go
│   │   │       ├── policies.go
│   │   │       ├── policies_test.go
│   │   │       ├── repo_cfg.go
│   │   │       ├── repo_cfg_test.go
│   │   │       ├── repo_locks.go
│   │   │       ├── team_authz.go
│   │   │       └── valid.go
│   │   ├── db/
│   │   │   ├── db.go
│   │   │   └── mocks/
│   │   │       └── mock_database.go
│   │   ├── locking/
│   │   │   ├── apply_locking.go
│   │   │   ├── locking.go
│   │   │   ├── locking_test.go
│   │   │   └── mocks/
│   │   │       ├── mock_apply_lock_checker.go
│   │   │       ├── mock_apply_locker.go
│   │   │       └── mock_locker.go
│   │   ├── redis/
│   │   │   ├── redis.go
│   │   │   └── redis_test.go
│   │   ├── runtime/
│   │   │   ├── apply_step_runner.go
│   │   │   ├── apply_step_runner_internal_test.go
│   │   │   ├── apply_step_runner_test.go
│   │   │   ├── cache/
│   │   │   │   ├── mocks/
│   │   │   │   │   ├── mock_key_serializer.go
│   │   │   │   │   └── mock_version_path.go
│   │   │   │   ├── version_path.go
│   │   │   │   └── version_path_test.go
│   │   │   ├── common/
│   │   │   │   ├── common.go
│   │   │   │   └── common_test.go
│   │   │   ├── env_step_runner.go
│   │   │   ├── env_step_runner_test.go
│   │   │   ├── executor.go
│   │   │   ├── external_team_allowlist_runner.go
│   │   │   ├── import_step_runner.go
│   │   │   ├── import_step_runner_test.go
│   │   │   ├── init_step_runner.go
│   │   │   ├── init_step_runner_test.go
│   │   │   ├── minimum_version_step_runner_delegate.go
│   │   │   ├── minimum_version_step_runner_delegate_test.go
│   │   │   ├── mocks/
│   │   │   │   ├── mock_async_tfexec.go
│   │   │   │   ├── mock_external_team_allowlist_runner.go
│   │   │   │   ├── mock_post_workflows_hook_runner.go
│   │   │   │   ├── mock_pre_workflows_hook_runner.go
│   │   │   │   ├── mock_pull_approved_checker.go
│   │   │   │   ├── mock_runner.go
│   │   │   │   ├── mock_status_updater.go
│   │   │   │   └── mock_versionedexecutorworkflow.go
│   │   │   ├── models/
│   │   │   │   ├── exec.go
│   │   │   │   ├── filepath.go
│   │   │   │   ├── mocks/
│   │   │   │   │   ├── mock_exec.go
│   │   │   │   │   └── mock_filepath.go
│   │   │   │   ├── shell_command_runner.go
│   │   │   │   └── shell_command_runner_test.go
│   │   │   ├── multienv_step_runner.go
│   │   │   ├── multienv_step_runner_internal_test.go
│   │   │   ├── multienv_step_runner_test.go
│   │   │   ├── plan_step_runner.go
│   │   │   ├── plan_step_runner_test.go
│   │   │   ├── plan_type_step_runner_delegate.go
│   │   │   ├── plan_type_step_runner_delegate_test.go
│   │   │   ├── policy/
│   │   │   │   ├── conftest_client.go
│   │   │   │   ├── conftest_client_test.go
│   │   │   │   └── mocks/
│   │   │   │       ├── mock_conftest_client.go
│   │   │   │       └── mock_downloader.go
│   │   │   ├── policy_check_step_runner.go
│   │   │   ├── policy_check_step_runner_test.go
│   │   │   ├── post_workflow_hook_runner.go
│   │   │   ├── post_workflow_hook_runner_test.go
│   │   │   ├── pre_workflow_hook_runner.go
│   │   │   ├── pre_workflow_hook_runner_test.go
│   │   │   ├── pull_approved_checker.go
│   │   │   ├── run_step_runner.go
│   │   │   ├── run_step_runner_test.go
│   │   │   ├── runtime.go
│   │   │   ├── runtime_test.go
│   │   │   ├── show_step_runner.go
│   │   │   ├── show_step_runner_test.go
│   │   │   ├── state_rm_step_runner.go
│   │   │   ├── state_rm_step_runner_test.go
│   │   │   ├── version_step_runner.go
│   │   │   ├── version_step_runner_test.go
│   │   │   ├── workspace_step_runner_delegate.go
│   │   │   └── workspace_step_runner_delegate_test.go
│   │   └── terraform/
│   │       ├── ansi/
│   │       │   ├── strip.go
│   │       │   └── strip_test.go
│   │       ├── distribution.go
│   │       ├── distribution_test.go
│   │       ├── downloader.go
│   │       ├── downloader_test.go
│   │       ├── mocks/
│   │       │   └── mock_downloader.go
│   │       └── tfclient/
│   │           ├── mocks/
│   │           │   └── mock_terraform_client.go
│   │           ├── terraform_client.go
│   │           ├── terraform_client_internal_test.go
│   │           └── terraform_client_test.go
│   ├── events/
│   │   ├── apply_command_runner.go
│   │   ├── apply_command_runner_test.go
│   │   ├── approve_policies_command_runner.go
│   │   ├── automerger.go
│   │   ├── cancel_command_runner.go
│   │   ├── cancellation_tracker.go
│   │   ├── command/
│   │   │   ├── context.go
│   │   │   ├── lock.go
│   │   │   ├── name.go
│   │   │   ├── name_test.go
│   │   │   ├── project_context.go
│   │   │   ├── project_context_test.go
│   │   │   ├── project_result.go
│   │   │   ├── project_result_test.go
│   │   │   ├── result.go
│   │   │   ├── result_test.go
│   │   │   ├── scope_tags.go
│   │   │   ├── team_allowlist_checker.go
│   │   │   └── team_allowlist_checker_test.go
│   │   ├── command_requirement_handler.go
│   │   ├── command_requirement_handler_test.go
│   │   ├── command_runner.go
│   │   ├── command_runner_internal_test.go
│   │   ├── command_runner_test.go
│   │   ├── command_type.go
│   │   ├── comment_parser.go
│   │   ├── comment_parser_test.go
│   │   ├── commit_status_updater.go
│   │   ├── commit_status_updater_test.go
│   │   ├── db_updater.go
│   │   ├── delete_lock_command.go
│   │   ├── delete_lock_command_test.go
│   │   ├── drainer.go
│   │   ├── drainer_test.go
│   │   ├── event_parser.go
│   │   ├── event_parser_test.go
│   │   ├── external_team_allowlist_checker.go
│   │   ├── external_team_allowlist_checker_test.go
│   │   ├── github_app_working_dir.go
│   │   ├── github_app_working_dir_test.go
│   │   ├── import_command_runner.go
│   │   ├── import_command_runner_test.go
│   │   ├── instrumented_project_command_builder.go
│   │   ├── instrumented_project_command_runner.go
│   │   ├── instrumented_pull_closed_executor.go
│   │   ├── markdown_renderer.go
│   │   ├── markdown_renderer_test.go
│   │   ├── mock_workingdir_test.go
│   │   ├── mocks/
│   │   │   ├── mock_azuredevops_pull_getter.go
│   │   │   ├── mock_cancellation_tracker.go
│   │   │   ├── mock_command_requirement_handler.go
│   │   │   ├── mock_command_runner.go
│   │   │   ├── mock_comment_building.go
│   │   │   ├── mock_comment_parsing.go
│   │   │   ├── mock_commit_status_updater.go
│   │   │   ├── mock_custom_step_runner.go
│   │   │   ├── mock_delete_lock_command.go
│   │   │   ├── mock_env_step_runner.go
│   │   │   ├── mock_event_parsing.go
│   │   │   ├── mock_github_pull_getter.go
│   │   │   ├── mock_gitlab_merge_request_getter.go
│   │   │   ├── mock_job_message_sender.go
│   │   │   ├── mock_job_url_setter.go
│   │   │   ├── mock_lock_url_generator.go
│   │   │   ├── mock_pending_plan_finder.go
│   │   │   ├── mock_post_workflow_hook_url_generator.go
│   │   │   ├── mock_post_workflows_hooks_command_runner.go
│   │   │   ├── mock_pre_workflow_hook_url_generator.go
│   │   │   ├── mock_pre_workflows_hooks_command_runner.go
│   │   │   ├── mock_project_command_builder.go
│   │   │   ├── mock_project_command_runner.go
│   │   │   ├── mock_project_lock.go
│   │   │   ├── mock_pull_cleaner.go
│   │   │   ├── mock_resource_cleaner.go
│   │   │   ├── mock_step_runner.go
│   │   │   ├── mock_webhooks_sender.go
│   │   │   ├── mock_working_dir.go
│   │   │   └── mock_working_dir_locker.go
│   │   ├── models/
│   │   │   ├── commit_status.go
│   │   │   ├── commit_status_test.go
│   │   │   ├── models.go
│   │   │   ├── models_test.go
│   │   │   └── testdata/
│   │   │       └── fixtures.go
│   │   ├── modules.go
│   │   ├── modules_test.go
│   │   ├── pending_plan_finder.go
│   │   ├── pending_plan_finder_test.go
│   │   ├── plan_command_runner.go
│   │   ├── plan_command_runner_test.go
│   │   ├── policy_check_command_runner.go
│   │   ├── post_workflow_hooks_command_runner.go
│   │   ├── post_workflow_hooks_command_runner_test.go
│   │   ├── pre_workflow_hooks_command_runner.go
│   │   ├── pre_workflow_hooks_command_runner_test.go
│   │   ├── project_command_builder.go
│   │   ├── project_command_builder_internal_test.go
│   │   ├── project_command_builder_test.go
│   │   ├── project_command_context_builder.go
│   │   ├── project_command_context_builder_test.go
│   │   ├── project_command_pool_executor.go
│   │   ├── project_command_runner.go
│   │   ├── project_command_runner_test.go
│   │   ├── project_finder.go
│   │   ├── project_finder_test.go
│   │   ├── project_locker.go
│   │   ├── project_locker_test.go
│   │   ├── pull_closed_executor.go
│   │   ├── pull_closed_executor_test.go
│   │   ├── pull_status_fetcher.go
│   │   ├── pull_updater.go
│   │   ├── repo_allowlist_checker.go
│   │   ├── repo_allowlist_checker_test.go
│   │   ├── repo_branch_test.go
│   │   ├── state_command_runner.go
│   │   ├── templates/
│   │   │   ├── apply_unwrapped_success.tmpl
│   │   │   ├── apply_wrapped_success.tmpl
│   │   │   ├── approve_all_projects.tmpl
│   │   │   ├── failure.tmpl
│   │   │   ├── failure_with_log.tmpl
│   │   │   ├── import_success_unwrapped.tmpl
│   │   │   ├── import_success_wrapped.tmpl
│   │   │   ├── log.tmpl
│   │   │   ├── merged_again.tmpl
│   │   │   ├── multi_project_apply.tmpl
│   │   │   ├── multi_project_apply_footer.tmpl
│   │   │   ├── multi_project_header.tmpl
│   │   │   ├── multi_project_import.tmpl
│   │   │   ├── multi_project_plan.tmpl
│   │   │   ├── multi_project_plan_footer.tmpl
│   │   │   ├── multi_project_policy.tmpl
│   │   │   ├── multi_project_policy_unsuccessful.tmpl
│   │   │   ├── multi_project_state_rm.tmpl
│   │   │   ├── multi_project_version.tmpl
│   │   │   ├── plan_success_unwrapped.tmpl
│   │   │   ├── plan_success_wrapped.tmpl
│   │   │   ├── policy_check.tmpl
│   │   │   ├── policy_check_results_unwrapped.tmpl
│   │   │   ├── policy_check_results_wrapped.tmpl
│   │   │   ├── single_project_apply.tmpl
│   │   │   ├── single_project_import_success.tmpl
│   │   │   ├── single_project_plan_success.tmpl
│   │   │   ├── single_project_plan_unsuccessful.tmpl
│   │   │   ├── single_project_policy_unsuccessful.tmpl
│   │   │   ├── single_project_state_rm_success.tmpl
│   │   │   ├── single_project_version_success.tmpl
│   │   │   ├── single_project_version_unsuccessful.tmpl
│   │   │   ├── state_rm_success_unwrapped.tmpl
│   │   │   ├── state_rm_success_wrapped.tmpl
│   │   │   ├── unwrapped_err.tmpl
│   │   │   ├── unwrapped_err_with_log.tmpl
│   │   │   ├── version_unwrapped_success.tmpl
│   │   │   ├── version_wrapped_success.tmpl
│   │   │   └── wrapped_err.tmpl
│   │   ├── testdata/
│   │   │   ├── bitbucket-cloud-comment-event.json
│   │   │   ├── bitbucket-cloud-pull-event-created.json
│   │   │   ├── bitbucket-cloud-pull-event-fulfilled.json
│   │   │   ├── bitbucket-cloud-pull-event-rejected.json
│   │   │   ├── bitbucket-cloud-pull-event-updated.json
│   │   │   ├── bitbucket-server-comment-event.json
│   │   │   ├── bitbucket-server-get-pull-changes.json
│   │   │   ├── bitbucket-server-get-pull.json
│   │   │   ├── bitbucket-server-pull-event-created.json
│   │   │   ├── bitbucket-server-pull-event-declined.json
│   │   │   ├── bitbucket-server-pull-event-merged.json
│   │   │   ├── fs/
│   │   │   │   ├── repoA/
│   │   │   │   │   ├── baz/
│   │   │   │   │   │   ├── init.tf
│   │   │   │   │   │   └── mods.tf
│   │   │   │   │   ├── modules/
│   │   │   │   │   │   ├── bar/
│   │   │   │   │   │   │   └── bar.tf
│   │   │   │   │   │   └── foo/
│   │   │   │   │   │       ├── foo.tf
│   │   │   │   │   │       └── mods.tf
│   │   │   │   │   └── qux/
│   │   │   │   │       └── quxx/
│   │   │   │   │           ├── init.tf
│   │   │   │   │           └── mods.tf
│   │   │   │   └── repoB/
│   │   │   │       ├── dev/
│   │   │   │       │   └── quxx/
│   │   │   │       │       ├── init.tf
│   │   │   │       │       └── mods.tf
│   │   │   │       ├── modules/
│   │   │   │       │   ├── bar/
│   │   │   │       │   │   └── bar.tf
│   │   │   │       │   └── foo/
│   │   │   │       │       ├── foo.tf
│   │   │   │       │       └── mods.tf
│   │   │   │       └── prod/
│   │   │   │           └── quxx/
│   │   │   │               ├── init.tf
│   │   │   │               └── mods.tf
│   │   │   ├── gitlab-get-merge-request-subgroup.json
│   │   │   ├── gitlab-get-merge-request.json
│   │   │   ├── gitlab-merge-request-comment-event-subgroup.json
│   │   │   ├── gitlab-merge-request-comment-event.json
│   │   │   ├── gitlab-merge-request-event-mark-as-ready.json
│   │   │   ├── gitlab-merge-request-event-subgroup.json
│   │   │   ├── gitlab-merge-request-event-update-assignee.json
│   │   │   ├── gitlab-merge-request-event-update-description.json
│   │   │   ├── gitlab-merge-request-event-update-labels.json
│   │   │   ├── gitlab-merge-request-event-update-milestone.json
│   │   │   ├── gitlab-merge-request-event-update-mixed.json
│   │   │   ├── gitlab-merge-request-event-update-new-commit.json
│   │   │   ├── gitlab-merge-request-event-update-reviewer.json
│   │   │   ├── gitlab-merge-request-event-update-target-branch.json
│   │   │   ├── gitlab-merge-request-event-update-title.json
│   │   │   ├── gitlab-merge-request-event.json
│   │   │   └── test-repos/
│   │   │       ├── cloud-block-without-workspace-name/
│   │   │       │   └── main.tf
│   │   │       ├── no-cloud-block/
│   │   │       │   └── main.tf
│   │   │       └── workspace-configured/
│   │   │           └── main.tf
│   │   ├── unlock_command_runner.go
│   │   ├── var_file_allowlist_checker.go
│   │   ├── var_file_allowlist_checker_test.go
│   │   ├── vcs/
│   │   │   ├── azuredevops/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_internal_test.go
│   │   │   │   ├── client_test.go
│   │   │   │   └── testdata/
│   │   │   │       ├── fixtures.go
│   │   │   │       ├── policyevaluations.json
│   │   │   │       └── pr.json
│   │   │   ├── bitbucketcloud/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── models.go
│   │   │   │   └── testdata/
│   │   │   │       ├── comments.json
│   │   │   │       ├── pull-approved-by-author.json
│   │   │   │       ├── pull-approved-multiple.json
│   │   │   │       ├── pull-approved.json
│   │   │   │       ├── pull-unapproved.json
│   │   │   │       └── user.json
│   │   │   ├── bitbucketserver/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── models.go
│   │   │   │   └── testdata/
│   │   │   │       └── pull-request.json
│   │   │   ├── client.go
│   │   │   ├── client_test.go
│   │   │   ├── common/
│   │   │   │   ├── common.go
│   │   │   │   ├── common_test.go
│   │   │   │   ├── git_cred_writer.go
│   │   │   │   ├── git_cred_writer_test.go
│   │   │   │   ├── instrumented_client.go
│   │   │   │   ├── request_validation.go
│   │   │   │   └── request_validation_test.go
│   │   │   ├── gitea/
│   │   │   │   ├── client.go
│   │   │   │   └── models.go
│   │   │   ├── github/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_internal_test.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── config.go
│   │   │   │   ├── credentials.go
│   │   │   │   ├── credentials_test.go
│   │   │   │   ├── instrumented_client.go
│   │   │   │   ├── mocks/
│   │   │   │   │   ├── mock_credentials.go
│   │   │   │   │   └── mock_github_pull_request_getter.go
│   │   │   │   ├── testdata/
│   │   │   │   │   ├── fixtures.go
│   │   │   │   │   ├── pull-request-mergeability/
│   │   │   │   │   │   ├── branch-protection-expected.json
│   │   │   │   │   │   ├── branch-protection-failed.json
│   │   │   │   │   │   ├── branch-protection-passed.json
│   │   │   │   │   │   ├── repository-id.json
│   │   │   │   │   │   ├── ruleset-atlantis-apply-expected.json
│   │   │   │   │   │   ├── ruleset-atlantis-apply-pending.json
│   │   │   │   │   │   ├── ruleset-check-expected.json
│   │   │   │   │   │   ├── ruleset-check-failed-other-atlantis.json
│   │   │   │   │   │   ├── ruleset-check-failed.json
│   │   │   │   │   │   ├── ruleset-check-neutral.json
│   │   │   │   │   │   ├── ruleset-check-passed.json
│   │   │   │   │   │   ├── ruleset-check-pending-other-atlantis.json
│   │   │   │   │   │   ├── ruleset-check-pending.json
│   │   │   │   │   │   ├── ruleset-check-skipped.json
│   │   │   │   │   │   ├── ruleset-evaluate-workflow-failed.json
│   │   │   │   │   │   ├── ruleset-optional-check-failed.json
│   │   │   │   │   │   ├── ruleset-optional-status-failed.json
│   │   │   │   │   │   ├── ruleset-workflow-expected.json
│   │   │   │   │   │   ├── ruleset-workflow-failed-first-check-successful.json
│   │   │   │   │   │   ├── ruleset-workflow-failed.json
│   │   │   │   │   │   ├── ruleset-workflow-passed-multiple-runs.json
│   │   │   │   │   │   ├── ruleset-workflow-passed-sha-match.json
│   │   │   │   │   │   ├── ruleset-workflow-passed-sha-mismatch.json
│   │   │   │   │   │   ├── ruleset-workflow-passed-with-global-codeql.json
│   │   │   │   │   │   └── ruleset-workflow-passed.json
│   │   │   │   │   ├── pull-request.json
│   │   │   │   │   └── repo.json
│   │   │   │   ├── token_rotator.go
│   │   │   │   └── token_rotator_test.go
│   │   │   ├── gitlab/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   └── testdata/
│   │   │   │       ├── changes-available.json
│   │   │   │       ├── changes-pending.json
│   │   │   │       ├── detailed-merge-status-ci-must-pass.json
│   │   │   │       ├── detailed-merge-status-need-rebase.json
│   │   │   │       ├── group-membership-success.json
│   │   │   │       ├── head-pipeline-not-available.json
│   │   │   │       ├── merge-success-with-label.json
│   │   │   │       ├── merge-success.json
│   │   │   │       ├── pipeline-blocking-discussions-unresolved.json
│   │   │   │       ├── pipeline-remaining-approvals.json
│   │   │   │       ├── pipeline-success.json
│   │   │   │       ├── pipeline-with-pipeline-skipped.json
│   │   │   │       ├── pipeline-work-in-progress.json
│   │   │   │       ├── project-success.json
│   │   │   │       ├── pull-request.json
│   │   │   │       ├── user-multiple.json
│   │   │   │       ├── user-none.json
│   │   │   │       └── user-success.json
│   │   │   ├── mocks/
│   │   │   │   ├── mock_client.go
│   │   │   │   └── mock_pull_req_status_fetcher.go
│   │   │   ├── not_configured_vcs_client.go
│   │   │   ├── proxy.go
│   │   │   ├── pull_status_fetcher.go
│   │   │   └── vcs.go
│   │   ├── version_command_runner.go
│   │   ├── webhooks/
│   │   │   ├── http.go
│   │   │   ├── http_test.go
│   │   │   ├── mocks/
│   │   │   │   ├── mock_sender.go
│   │   │   │   ├── mock_slack_client.go
│   │   │   │   └── mock_underlying_slack_client.go
│   │   │   ├── slack.go
│   │   │   ├── slack_client.go
│   │   │   ├── slack_client_test.go
│   │   │   ├── slack_test.go
│   │   │   ├── webhooks.go
│   │   │   └── webhooks_test.go
│   │   ├── working_dir.go
│   │   ├── working_dir_locker.go
│   │   ├── working_dir_locker_test.go
│   │   └── working_dir_test.go
│   ├── jobs/
│   │   ├── job_url_setter.go
│   │   ├── job_url_setter_test.go
│   │   ├── mocks/
│   │   │   ├── mock_project_command_output_handler.go
│   │   │   ├── mock_project_job_url_generator.go
│   │   │   └── mock_project_status_updater.go
│   │   ├── project_command_output_handler.go
│   │   └── project_command_output_handler_test.go
│   ├── logging/
│   │   ├── log.go
│   │   ├── logging_test.go
│   │   ├── mocks/
│   │   │   └── mock_simple_logging.go
│   │   └── simple_logger.go
│   ├── metrics/
│   │   ├── common.go
│   │   ├── counter.go
│   │   ├── counter_test.go
│   │   ├── debug.go
│   │   ├── metricstest/
│   │   │   └── scope.go
│   │   ├── scope.go
│   │   └── scope_test.go
│   ├── middleware.go
│   ├── recovery/
│   │   ├── recovery.go
│   │   └── recovery_test.go
│   ├── router.go
│   ├── router_test.go
│   ├── scheduled/
│   │   ├── executor_service.go
│   │   ├── executor_service_test.go
│   │   ├── mocks/
│   │   │   └── mock_executor_service_job.go
│   │   ├── runtime_stats.go
│   │   └── runtime_stats_test.go
│   ├── server.go
│   ├── server_internal_test.go
│   ├── server_test.go
│   ├── static/
│   │   ├── css/
│   │   │   ├── custom.css
│   │   │   ├── normalize.css
│   │   │   ├── skeleton.css
│   │   │   └── xterm-5.3.0.css
│   │   └── js/
│   │       ├── xterm-5.3.0.js
│   │       ├── xterm-addon-attach-0.9.0.js
│   │       ├── xterm-addon-fit-0.8.0.js
│   │       ├── xterm-addon-search-0.13.0.js
│   │       └── xterm-addon-search-bar.js
│   ├── user_config.go
│   ├── user_config_test.go
│   └── utils/
│       ├── os.go
│       ├── slices.go
│       ├── spellcheck.go
│       └── spellcheck_test.go
├── testdata/
│   ├── cert.pem
│   ├── cert2.pem
│   ├── key.pem
│   └── key2.pem
├── testdrive/
│   ├── github.go
│   ├── testdrive.go
│   └── utils.go
└── testing/
    ├── Dockerfile
    ├── assertions.go
    ├── hooks/
    │   └── post_push
    ├── http.go
    └── temp_files.go

================================================
FILE CONTENTS
================================================

================================================
FILE: .adr-dir
================================================
docs/adr


================================================
FILE: .clusterfuzzlite/Dockerfile
================================================
FROM gcr.io/oss-fuzz-base/base-builder-go@sha256:b940188f7306d865c69127852ec33e9c821287e6fbebaa9feb89ccc09a6e9b50
COPY . $SRC/atlantis
COPY .clusterfuzzlite/build.sh $SRC/build.sh
WORKDIR $SRC/atlantis


================================================
FILE: .clusterfuzzlite/build.sh
================================================
#!/bin/bash -eu
# Copyright 2025 The Atlantis Authors
# SPDX-License-Identifier: Apache-2.0

# Register go-118-fuzz-build so compile_native_go_fuzzer can inject its harness.
printf "package main\nimport _ \"github.com/AdamKorcz/go-118-fuzz-build/testing\"\n" > "$SRC/atlantis/register.go"
cd "$SRC/atlantis" && go get github.com/AdamKorcz/go-118-fuzz-build/testing && go mod tidy -e

compile_native_go_fuzzer github.com/runatlantis/atlantis/server/core/config/cfgfuzz FuzzParseRepoCfgData FuzzParseRepoCfgData


================================================
FILE: .codecov.yml
================================================
coverage:
  status:
    # This disables the GitHub statuses from CodeCov. I found that many of the
    # PRs I wanted to merge failed the status checks because often some code
    # isn't testable or testing it isn't the highest priority. The comment with
    # the code coverage is all that is needed right now.
    project: off
    patch: off


================================================
FILE: .dockerignore
================================================
*
!cmd/
!scripts/download-release.sh
!server/
!testdrive/
!main.go
!go.mod
!go.sum
!docker-entrypoint.sh
!atlantis
!.clusterfuzzlite/


================================================
FILE: .editorconfig
================================================
root = true

[*]
charset = utf-8
end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true

[*.md]
indent_style = space
indent_size = 3
trim_trailing_whitespace = false


================================================
FILE: .gitattributes
================================================
# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto eol=lf


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug Report
about: You're experiencing an issue that is different than the documented behavior.
labels: bug
---

<!--- Please keep this note for the community --->

### Community Note

* Please vote on this issue by adding a 👍 [reaction](https://blog.github.com/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) to the original issue to help the community and maintainers prioritize this request. Searching for pre-existing feature requests helps us consolidate datapoints for identical requirements into a single place, thank you!
* Please do not leave "+1" or other comments that do not add relevant new information or questions, they generate extra noise for issue followers and do not help prioritize the request.
* If you are interested in working on this issue or have submitted a pull request, please leave a comment.

<!--- Thank you for keeping this note for the community --->

---

<!---
When filing a bug, please include the following headings if possible.
Any example text in this template can be deleted.
--->

### Overview of the Issue

<!---
Please describe the issue you are having and how you encountered the problem.
--->


### Reproduction Steps

<!--- 
In order to effectively and quickly resolve the issue, please provide exact steps that allow us the reproduce the problem. If no steps are provided, then it will likely take longer to get the issue resolved.
--->


### Logs

<!---
Provide log files from Atlantis server

logs can be retrieved from the deployment or from atlantis comments by adding `--debug` such as `atlantis plan --debug`

<details>
  <summary>Logs</summary>

```
log output
```

</details>
--->


### Environment details

<!---
If not already included, please provide the following:

- Atlantis version:
- Deployment method: ecs/eks/helm/tf module
- If not running the latest Atlantis version have you tried to reproduce this issue on the latest version: 
- Atlantis flags:

Atlantis server-side config file:

```yaml
# config file
```

Repo `atlantis.yaml` file:

```yaml
# config file
```

Any other information you can provide about the environment/deployment (efs/nfs, aws/gcp, k8s/fargate, etc)
--->


### Additional Context

<!---
Additional context on the problem. Docs, links to blogs, or other material that lead you to discover this issue or were helpful in troubleshooting the issue. 

Use a bulleted list to link to tickets
--->



================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Propose a concrete new feature
title: ''
labels: 'feature'
assignees: ''

---

<!--- Please keep this note for the community --->

### Community Note

- Please vote on this issue by adding a 👍 [reaction](https://blog.github.com/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) to the original issue to help the community and maintainers prioritize this request. Searching for pre-existing feature requests helps us consolidate datapoints for identical requirements into a single place, thank you!
- Please do not leave "+1" or other comments that do not add relevant new information or questions, they generate extra noise for issue followers and do not help prioritize the request.
- If you are interested in working on this issue or have submitted a pull request, please leave a comment.

<!--- Thank you for keeping this note for the community --->

---

- [ ] I'd be willing to implement this feature ([contributing guide](https://github.com/runatlantis/atlantis/blob/main/CONTRIBUTING.md))

**Describe the user story**
<!--
A clear and concise description of what workflow is meant to be improved.
Example: "As a developer, I often want to do <something>, but I often face <problem>".
-->

**Describe the solution you'd like**
<!--
A clear and concise description of what you want to happen. Consider that atlantis is used
by many people, and your particular use case might not make sense to implement in the core.
-->

**Describe the drawbacks of your solution**
<!--
This section is important not only to identify future issues, but also for us to see whether
you thought through your request. When filling it, ask yourself what are the problems we could
have maintaining what you propose. How often will it break?
-->

**Describe alternatives you've considered**
<!--
A clear and concise description of any alternative solutions or features you've considered,
and why you think they wouldn't be good enough.
-->


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
## what

<!--
- Describe high-level what changed as a result of these commits (i.e. in plain-english, what do these changes mean?)
- Use bullet points to be concise and to the point.
-->


## why

<!--
- Provide the justifications for the changes (e.g. business case). 
- Describe why these changes were made (e.g. why do these commits fix the problem?)
- Use bullet points to be concise and to the point.
-->

## tests

<!--
- [ ] I have tested my changes by ...
-->

## references

<!--
- Link to any supporting github issues or helpful documentation to add some context (e.g. stackoverflow). 
- Use `closes #123`, if this PR closes a GitHub issue `#123`
-->



================================================
FILE: .github/cherry-pick-bot.yml
================================================
enabled: true
preservePullRequestTitle: true


================================================
FILE: .github/copilot-instructions.md
================================================
# Atlantis - Terraform Pull Request Automation

**What it does:** Self-hosted Go application that listens for Terraform PR webhooks, runs `terraform plan/apply`, and comments results back to PRs.

**Stack:** Go 1.25.4 • 381 Go files • Gorilla Mux • Cobra CLI • Viper config • VitePress docs (Node.js) • Docker deployment

**Key Info:** ~35MB repo, server + CLI app, E2E tests with Playwright, integration tests with Terraform

## Build & Test (Always from repo root)

**Prerequisites:** Go 1.25.4 (from go.mod, not .tool-versions) • Node 20+ & npm 10+ (website) • Docker • Terraform 1.11.1+ (integration tests)

**Build:** `make build-service` → creates `./atlantis` binary (~51MB, 30-60s first run, 10s subsequent). Clean: `make clean`

**Test:** `make test` (unit, ~60s) • `make test-all` (includes integration, ~5min) • `make docker/test-all` (CI environment)
⚠️ **Known failing test:** `TestNewServer_GitHubUser` in server/server_test.go - pre-existing, ignore it

**Lint/Format:** `make check-fmt` (ALWAYS works) • `make fmt` (auto-format)
⚠️ **Known issue:** `make lint` and `make check-lint` fail with Go 1.25+ version mismatch. Use `make check-fmt` locally, CI handles linting.

**Mocks:** `make go-generate` (regenerate after interface changes) • `make regen-mocks` (delete & regenerate all)

**Website (VitePress):** `npm install` (required first) • `npm run website:dev` (http://localhost:8080) • `npm run website:build` • `npm run website:lint` • `npm run e2e` (Playwright)
📁 Docs: `runatlantis.io/docs/*.md` • Config: `runatlantis.io/.vitepress/config.js`

## Architecture

**Structure:** `cmd/` (CLI) • `server/` (main app: controllers, core logic, events, vcs integrations) • `e2e/` (E2E tests) • `runatlantis.io/` (docs) • `scripts/` (build utils)

**Key paths:** `main.go` (entry) • `cmd/server.go` • `server/server.go` (init) • `server/router.go` • `server/controllers/events/events_controller.go` (webhooks)

**Core logic:** `server/core/config/` (parsing), `server/core/runtime/` (Terraform execution), `server/core/terraform/tfclient/` (TF client)

**VCS providers:** `server/events/vcs/{github,gitlab,bitbucketcloud,bitbucketserver,azuredevops,gitea}/`

**Config files:** `.golangci.yml` (lint), `go.mod`, `Makefile`, `Dockerfile`, `docker-compose.yml`, `.pre-commit-config.yaml`

## CI Workflows (.github/workflows/)

**test.yml:** `make test-all` + `make check-fmt` in `ghcr.io/runatlantis/testing-env:latest` • E2E for GitHub/GitLab (skips on forks - no secrets)
**lint.yml:** golangci-lint via GitHub Action • Path filtered (Go files only)
**website.yml:** markdownlint → lychee link check → `npm install && npm run website:build` → `npm run e2e` (Playwright)
**Others:** pr-lint (Conventional Commits), codeql, scorecard, dependency-review

**Replicate CI locally:** `make test-all && make check-fmt` OR use Docker: `docker run --rm -v $(pwd):/atlantis ghcr.io/runatlantis/testing-env:latest sh -c "cd /atlantis && make test-all"`

**E2E tests:** Complex setup (ngrok + credentials). CI handles it. Local optional. See `./scripts/e2e.sh` for details.

## Development Workflows

**Before commit:** `make test` → `make check-fmt` → `make go-generate` (if interfaces changed) → `make build-service` (verify)

**VCS provider:** Create `server/events/vcs/<provider>/` → Implement `Client` interface (`server/events/vcs/common/common.go`) → Update `server/server.go`

**Config changes:** Edit `server/core/config/valid/` or `raw/` → Update `server/user_config.go` → Test in `server/core/config/*_test.go`

**Terraform execution:** Modify `server/core/terraform/tfclient/terraform_client.go` or `server/core/runtime/*_step_runner.go` (uses `hashicorp/hc-install`)

## Known Issues

1. **golangci-lint Go 1.25+ incompatibility:** `make lint`/`make check-lint` fail. Use `make check-fmt` locally; CI handles linting.
2. **TestNewServer_GitHubUser fails:** Pre-existing in main. Ignore it.
3. **E2E tests skip on forks:** Expected (no secrets). Maintainers run them.
4. **Website needs npm install first:** Always run `npm install` before `npm run website:*` commands.
5. **docker-compose needs atlantis.env:** Create file per CONTRIBUTING.md template for local webhook testing.

## Code Style

**Logging:** Use `ctx.Log` • lowercase • quote strings with `%q` • NO colons (reserved for errors) • Levels: debug/info/warn/error
**Errors:** Lowercase • `fmt.Errorf("context: %w", err)` not `%s` • Describe action, not "failed to" • Example: "running git clone: no executable"
**Testing:** Tests in `{package}_test` • Internal: `{file}_internal_test.go` • Use `import . "github.com/runatlantis/atlantis/testing"` • `Assert()`, `Equals()`, `Ok()`
**Commits:** Conventional Commits (`fix:`, `feat:`, etc.) • Sign with `-s` (DCO)

## Pre-PR Checklist

✓ `make test-all` (ignore TestNewServer_GitHubUser) ✓ `make check-fmt` ✓ `make go-generate` (if interfaces changed) ✓ Website builds (docs changes)
✓ Conventional Commits format ✓ Signed commits (-s) ✓ Tests added ✓ Docs updated

## Quick Commands

**Daily:** `make build-service` • `make test` • `make check-fmt`
**Pre-commit:** `make test-all` • `make check-fmt`
**Website:** `npm install` • `npm run website:dev` • `npm run website:lint`
**Coverage:** `make test-coverage-html`
**Docker:** `make docker/dev` • `docker-compose up`

---

**Trust these instructions first.** Search codebase only if info is incomplete/incorrect. Validated 2026-01-30 • Go 1.25.4


================================================
FILE: .github/labeler.yml
================================================
build:
- changed-files:
  - any-glob-to-any-file: 'Dockerfile*'

dependencies:
- changed-files:
  - any-glob-to-any-file: 'yarn.lock'
  - any-glob-to-any-file: 'go.*'

docs:
- changed-files:
  - any-glob-to-any-file: 'runatlantis.io/**/*.md'
  - any-glob-to-any-file: 'README.md'

github-actions:
- changed-files:
  - any-glob-to-any-file:
    - '.github/workflows/*.yml'

go:
- changed-files:
  - any-glob-to-any-file: '**/*.go'

provider/azuredevops:
- changed-files:
  - any-glob-to-any-file: 'server/**/*azuredevops*.go'

provider/bitbucket:
- changed-files:
  - any-glob-to-any-file: 'server/**/*bitbucket*.go'
  - any-glob-to-any-file: 'server/events/vcs/bitbucketcloud/*.go'
  - any-glob-to-any-file: 'server/events/vcs/bitbucketserver/*.go'

provider/github:
- changed-files:
  - any-glob-to-any-file: 'server/**/*github*.go'

provider/gitlab:
- changed-files:
  - any-glob-to-any-file: 'server/**/*gitlab*.go'

website:
- changed-files:
  - any-glob-to-any-file: 'runatlantis.io/.vitepress/**/*'
  - any-glob-to-any-file: 'package.json'
  - any-glob-to-any-file: 'package-lock.json'

blog:
- changed-files:
  - any-glob-to-any-file: 'runatlantis.io/blog/**'


================================================
FILE: .github/release.yml
================================================
changelog:
  exclude:
    labels:
      - ignore-for-release
      - github-actions
    authors:
      - octocat
  categories:
    - title: Breaking Changes 🛠
      labels:
        - Semver-Major
        - breaking-change
    - title: Exciting New Features 🎉
      labels:
        - Semver-Minor
        - enhancement
        - feature
    - title: Provider AzureDevops
      labels:
        - provider/azuredevops
    - title: Provider Bitbucket
      labels:
        - provider/bitbucket
    - title: Provider GitHub
      labels:
        - provider/github
    - title: Provider GitLab
      labels:
        - provider/gitlab
    - title: Bug fixes 🐛
      labels:
        - bug
    - title: Security changes
      labels:
        - security
    - title: Documentation
      labels:
        - docs
        - website
    - title: Dependencies
      labels:
        - dependencies
    - title: Other Changes 🔄
      labels:
        - "*"


================================================
FILE: .github/renovate.json5
================================================
{
  extends: [
    'config:best-practices',
    ':separateMultipleMajorReleases',
    'schedule:daily',
    'security:openssf-scorecard',
  ],
  commitMessageSuffix: ' in {{packageFile}}',
  dependencyDashboardAutoclose: true,
  automerge: true,
  baseBranchPatterns: [
    'main',
    '/^release-.*/',
  ],
  platformAutomerge: true,
  labels: [
    'dependencies',
  ],
  postUpdateOptions: [
    'gomodTidy',
    'gomodUpdateImportPaths',
    'npmDedupe',
  ],
  prHourlyLimit: 1,
  minimumReleaseAge: '5 days',
  osvVulnerabilityAlerts: true,
  vulnerabilityAlerts: {
    enabled: true,
    labels: [
      'security',
    ],
  },
  packageRules: [
    // enable release branches for security updates
    {
      matchBaseBranches: [
        '/^release-.*/',
      ],
      matchUpdateTypes: [
        'security',
      ],
      enabled: true,
    },
    // disable release branches for anything else
    {
      matchBaseBranches: [
        '/^release-.*/',
      ],
      enabled: false,
    },
    {
      matchBaseBranches: [
        'main',
      ],
      matchFileNames: [
        'package.json',
        'package-lock.json',
      ],
    },
    {
      matchFileNames: [
        'testing/**',
      ],
      additionalBranchPrefix: '{{packageFileDir}}-',
      groupName: 'conftest-testing',
      matchPackageNames: [
        '/conftest/',
      ],
    },
    {
      ignorePaths: [
        'testing/**',
      ],
      groupName: 'github-',
      matchPackageNames: [
        '/github-actions/',
      ],
    },
    {
      ignorePaths: [
        'server/controllers/events/testdata/**/*.tf',
      ],
      matchDatasources: [
        'terraform',
      ],
    },
    {
      matchDatasources: [
        'docker',
      ],
      matchPackageNames: [
        'node',
        'cimg/node',
      ],
      versioning: 'node',
    },
    {
      matchPackageNames: [
        'go',
        'golang',
      ],
      versioning: 'go',
      groupName: 'go',
    },
    {
      "matchFileNames": ["Dockerfile"],
      "matchPackageNames": ["golang"],
      "versioning": "docker",
      "allowedVersions": "/-alpine$/"
    },
    // Include testdata files for go-github updates
    {
      "matchPackageNames": [
        "github.com/google/go-github"
      ],
      "matchDatasources": [
        "go"
      ],
      "ignorePaths": []
    }
  ],
  customManagers: [
    {
      customType: 'regex',
      managerFilePatterns: [
        '/(^|/)Dockerfile$/',
        '/(^|/)Dockerfile\\.[^/]*$/',
      ],
      matchStrings: [
        'renovate: datasource=(?<datasource>.*?) depName=(?<depName>.*?)( versioning=(?<versioning>.*?))?\\s(ARG|ENV) .*?_VERSION=(?<currentValue>.*)\\s',
      ],
      versioningTemplate: '{{#if versioning}}{{{versioning}}}{{else}}semver{{/if}}',
      extractVersionTemplate: '^v(?<version>\\d+\\.\\d+\\.\\d+)',
    },
    {
      customType: 'regex',
      managerFilePatterns: [
        '/.*go$/',
      ],
      matchStrings: [
        '\\sconst .*Version = "(?<currentValue>.*)"\\s// renovate: datasource=(?<datasource>.*?) depName=(?<depName>.*?)( versioning=(?<versioning>.*?))?\\s',
      ],
      versioningTemplate: '{{#if versioning}}{{{versioning}}}{{else}}semver{{/if}}',
      extractVersionTemplate: '^v(?<version>\\d+\\.\\d+\\.\\d+)',
    },
    {
      customType: 'regex',
      managerFilePatterns: [
        '/^\\.github/workflows/[^/]+\\.ya?ml$/',
        '/Makefile$/',
      ],
      matchStrings: [
        'renovate: datasource=(?<datasource>.*?) depName=(?<depName>.*?)( versioning=(?<versioning>.*?))?\\s.*?_VERSION: (?<currentValue>.*)\\s',
      ],
      versioningTemplate: '{{#if versioning}}{{{versioning}}}{{else}}semver{{/if}}',
      extractVersionTemplate: '^v(?<version>\\d+\\.\\d+\\.\\d+)',
    },
  ],
}


================================================
FILE: .github/styles/Atlantis/ProductTerms.yml
================================================
extends: substitution
message: "Use '%s' instead of '%s'."
level: error
ignorecase: false
swap:
  'Github': 'GitHub'
  'Gitlab': 'GitLab'


================================================
FILE: .github/workflows/atlantis-image.yml
================================================
name: atlantis-image

on:
  push:
    branches:
      - 'main'
      - 'release-**'
    tags:
      - v*.*.*
  pull_request:
    branches:
      - 'main'
      - 'release-**'
    types:
      - opened
      - reopened
      - synchronize
      - ready_for_review
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

permissions:
  contents: read

jobs:
  changes:
    permissions:
      contents: read  # for dorny/paths-filter to fetch a list of changed files
      pull-requests: read  # for dorny/paths-filter to read pull requests
    outputs:
      should-run-build: ${{ steps.changes.outputs.src == 'true' || startsWith(github.ref, 'refs/tags/') }}
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
      - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
        id: changes
        with:
          filters: |
            src:
              - 'Dockerfile'
              - 'docker-entrypoint.sh'
              - '.github/workflows/atlantis-image.yml'
              - '**.go'
              - 'go.*'

  build:
    needs: [changes]
    if: needs.changes.outputs.should-run-build == 'true'
    name: Build Image
    permissions:
      contents: read
      id-token: write
      packages: write
      attestations: write
    strategy:
      matrix:
        image_type: [alpine, debian]
    runs-on: ubuntu-24.04
    env:
      # Set docker repo to either the fork or the main repo where the branch exists
      DOCKER_REPO: ghcr.io/${{ github.repository }}
      # Push if not a pull request and references the main branch
      PUSH: ${{ github.event_name != 'pull_request' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/')) }}

    steps:
    - name: Harden Runner
      uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
      with:
        egress-policy: audit

    - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4

    # Lint the Dockerfile first before setting anything up
    - name: Lint Dockerfile
      uses: hadolint/hadolint-action@54c9adbab1582c2ef04b2016b760714a4bfde3cf # v3.1.0
      with:
        dockerfile: "Dockerfile"

    - name: Set up Go
      uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5.6.0
      with:
        go-version-file: "go.mod"

    - name: Set up QEMU
      uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3
      with:
        image: tonistiigi/binfmt:qemu-v10.2.1@sha256:d3b963f787999e6c0219a48dba02978769286ff61a5f4d26245cb6a6e5567ea3
        platforms: arm64,arm

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3

    - name: "Install cosign"
      uses: sigstore/cosign-installer@faadad0cce49287aee09b3a48701e75088a2c6ad # v4.0.0
      if: env.PUSH == 'true' && github.event_name != 'pull_request'

    # release version is the name of the tag i.e. v0.10.0
    # release version also has the image type appended i.e. v0.10.0-alpine
    # release tag is either pre-release or latest i.e. latest
    # release tag also has the image type appended i.e. latest-alpine
    # if it's v0.10.0 and alpine, it will do v0.10.0, v0.10.0-alpine, latest, latest-alpine
    # if it's v0.10.0 and debian, it will do v0.10.0-debian, latest-debian
    - name: Docker meta
      id: meta
      uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5
      env:
        SUFFIX: ${{ format('-{0}', matrix.image_type) }}
      with:
        images: |
          ${{ env.DOCKER_REPO }}
        labels: |
          org.opencontainers.image.authors="@runatlantis Github Org"
          org.opencontainers.image.licenses=Apache-2.0
        tags: |
          # semver
          type=semver,pattern={{version}},prefix=v,suffix=${{ env.SUFFIX }}
          type=semver,pattern={{version}},prefix=v,enable=${{ matrix.image_type == 'alpine' }}
          type=semver,pattern={{major}}.{{minor}},prefix=v,suffix=${{ env.SUFFIX }}
          # dev
          type=raw,event=push,value=dev,enable={{is_default_branch}},suffix=${{ env.SUFFIX }}
          type=raw,event=push,value=dev,enable={{is_default_branch}},suffix=${{ env.SUFFIX }}-{{ sha }}
          type=raw,event=push,value=dev,enable=${{ github.ref == format('refs/heads/{0}', 'main') && matrix.image_type == 'alpine' }},suffix=
          # prerelease
          type=raw,event=tag,value=prerelease-latest,enable=${{ startsWith(github.ref, 'refs/tags/') && contains(github.ref, 'pre') && matrix.image_type == 'alpine' }},suffix=
          type=raw,event=tag,value=prerelease-latest,enable=${{ startsWith(github.ref, 'refs/tags/') && contains(github.ref, 'pre') }},suffix=${{ env.SUFFIX }}
          # latest
          type=raw,event=tag,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/') && !contains(github.ref, 'pre') && matrix.image_type == 'alpine' }},suffix=
          type=raw,event=tag,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/') && !contains(github.ref, 'pre') }},suffix=${{ env.SUFFIX }}
          # pr
          type=ref,event=pr,suffix=${{ env.SUFFIX }}
        flavor: |
          # This is disabled here so we can use the raw form above
          latest=false
          # Suffix is not used here since there's no way to disable it above

    - name: Login to Packages Container registry
      uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
      with:
        registry: ghcr.io
        username: ${{ github.actor }}
        password: ${{ secrets.GITHUB_TOKEN }}

    # Publish release to container registry
    - name: Populate release version
      if: contains(fromJson('["push", "pull_request"]'), github.event_name)
      run: echo "RELEASE_VERSION=${{ startsWith(github.ref, 'refs/tags/') && '${GITHUB_REF#refs/*/}' || 'dev' }}" >> $GITHUB_ENV

    - name: "Build ${{ env.PUSH == 'true' && 'and push' || '' }} ${{ env.DOCKER_REPO }} image"
      id: build
      if: contains(fromJson('["push", "pull_request"]'), github.event_name)
      uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
      with:
        cache-from: type=gha
        cache-to: type=gha,mode=max
        context: .
        build-args: |
          ATLANTIS_BASE_TAG_TYPE=${{ matrix.image_type }}
          ATLANTIS_VERSION=${{ env.RELEASE_VERSION }}
          ATLANTIS_COMMIT=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
          ATLANTIS_DATE=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}
        platforms: linux/arm64/v8, linux/amd64, linux/arm/v7
        push: ${{ env.PUSH }}
        tags: ${{ steps.meta.outputs.tags }}
        target: ${{ matrix.image_type }}
        labels: ${{ steps.meta.outputs.labels }}
        outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.description'] }}

    - name: "Create Image Attestation"
      if: env.PUSH == 'true' && github.event_name != 'pull_request'
      uses: actions/attest-build-provenance@e8998f949152b193b063cb0ec769d69d929409be # v2.4.0
      with:
        subject-digest: ${{ steps.build.outputs.digest }}
        subject-name: ghcr.io/${{ github.repository }}
        push-to-registry: true

    - name: "Sign images with environment annotations"
      # no key needed, we're using the GitHub OIDC flow
      if: env.PUSH == 'true' && github.event_name != 'pull_request'
      run: |
        # Sign dev tags, version tags, and latest tags
        echo "${TAGS}" | xargs -I {} cosign sign \
          --yes \
          -a "actor=${ACTOR}" \
          -a "ref_name=${REF_NAME}" \
          -a "ref=${SHA}" \
          {}@${DIGEST}
      env:
        TAGS: ${{ steps.meta.outputs.tags }}
        DIGEST: ${{ steps.build.outputs.digest }}
        ACTOR: ${{ github.actor }}
        REF_NAME: ${{ github.ref_name }}
        SHA: ${{ github.sha }}

  test:
    needs: [changes]
    if: needs.changes.outputs.should-run-build == 'true'
    name: Test Image With Goss
    runs-on: ubuntu-24.04
    permissions:
      contents: read
    strategy:
      matrix:
        image_type: [alpine, debian]
        platform: [linux/arm64/v8, linux/amd64, linux/arm/v7]
    env:
      # Set docker repo to either the fork or the main repo where the branch exists
      DOCKER_REPO: ghcr.io/${{ github.repository }}

    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3

      - name: "Build and load into Docker"
        if: contains(fromJson('["push", "pull_request"]'), github.event_name)
        uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
        with:
          cache-from: type=gha
          cache-to: type=gha,mode=max
          context: .
          build-args: |
            ATLANTIS_BASE_TAG_TYPE=${{ matrix.image_type }}
          push: false
          load: true
          tags: "${{ env.DOCKER_REPO }}:goss-test"
          target: ${{ matrix.image_type }}

      - name: "Setup Goss"
        uses: e1himself/goss-installation-action@3b8340a7c772f8064444f48b0df4c2a80d2e50fc # v1.3.0
        with:
          version: "v0.4.7"

      - name: Execute Goss tests
        run: |
          dgoss run --rm ${{ env.DOCKER_REPO }}:goss-test bash -c 'while true; do sleep 1; done;'

  skip-build:
    needs: [changes]
    if: needs.changes.outputs.should-run-build == 'false'
    name: Build Image
    permissions:
      contents: read
    strategy:
      matrix:
        image_type: [alpine, debian]
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - run: 'echo "No build required"'



================================================
FILE: .github/workflows/clusterfuzzlite.yml
================================================
name: ClusterFuzzLite

on:
  pull_request:
    types:
      - opened
      - reopened
      - synchronize
      - ready_for_review
    branches:
      - main
      - 'release-**'

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

permissions: read-all

jobs:
  Fuzzing:
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-latest
    permissions:
      security-events: write
    strategy:
      fail-fast: false
      matrix:
        sanitizer:
          - address
          # Override this with the sanitizers you want.
          # - undefined
          # - memory
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - name: Build Fuzzers (${{ matrix.sanitizer }})
        id: build
        uses: google/clusterfuzzlite/actions/build_fuzzers@884713a6c30a92e5e8544c39945cd7cb630abcd1 # v1
        with:
          language: go
          sanitizer: ${{ matrix.sanitizer }}
          github-token: ${{ secrets.GITHUB_TOKEN }}

      - name: Run Fuzzers (${{ matrix.sanitizer }})
        id: run
        uses: google/clusterfuzzlite/actions/run_fuzzers@884713a6c30a92e5e8544c39945cd7cb630abcd1 # v1
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          fuzz-seconds: 600
          mode: 'code-change'
          sanitizer: ${{ matrix.sanitizer }}
          language: go
          output-sarif: true

      - name: Upload Sarif
        if: steps.run.outputs.sarif-path != ''
        uses: github/codeql-action/upload-sarif@89a39a4e59826350b863aa6b6252a07ad50cf83e # v4.32.4
        with:
          sarif_file: ${{ steps.run.outputs.sarif-path }}


================================================
FILE: .github/workflows/codeql.yml
================================================
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"

on:
  push:
    branches:
      - 'main'
      - 'release-**'
  pull_request:
    # The branches below must be a subset of the branches above
    types:
      - opened
      - reopened
      - synchronize
      - ready_for_review
    branches:
      - 'main'
      - 'release-**'

  schedule:
    - cron: '17 9 * * 5'

permissions:
  contents: read

jobs:
  changes:
    permissions:
      contents: read  # for dorny/paths-filter to fetch a list of changed files
      pull-requests: read  # for dorny/paths-filter to read pull requests
    outputs:
      should-run-analyze: ${{ github.event_name != 'pull_request' || steps.changes.outputs.src == 'true' }}
    if: github.event_name != 'pull_request' || github.event.pull_request.draft == false
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
      - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
        id: changes
        with:
          filters: |
            src:
              - '**.go'
              - '**.js4'

  analyze:
    needs: [changes]
    name: Analyze
    if: github.event.pull_request.draft == false && needs.changes.outputs.should-run-analyze == 'true'
    runs-on: ubuntu-24.04
    permissions:
      actions: read
      contents: read
      security-events: write

    strategy:
      fail-fast: false
      matrix:
        language: [ 'go', 'javascript' ]
        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
        # Use only 'java' to analyze code written in Java, Kotlin or both
        # Use only 'javascript' to analyze code written in JavaScript, TypeScript or both
        # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support

    steps:
    - name: Harden Runner
      uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
      with:
        egress-policy: audit

    - name: Checkout repository
      uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@ebcb5b36ded6beda4ceefea6a8bc4cc885255bb3 # v3
      with:
        languages: ${{ matrix.language }}
        # If you wish to specify custom queries, you can do so here or in a config file.
        # By default, queries listed here will override any specified in a config file.
        # Prefix the list here with "+" to use these queries and those in the config file.

        # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
        # queries: security-extended,security-and-quality


    # Autobuild attempts to build any compiled languages  (C/C++, C#, Go, or Java).
    # If this step fails, then you should remove it and run the build manually (see below)
    - name: Autobuild
      uses: github/codeql-action/autobuild@ebcb5b36ded6beda4ceefea6a8bc4cc885255bb3 # v3

    # ℹ️ Command-line programs to run using the OS shell.
    # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun

    #   If the Autobuild fails above, remove it and uncomment the following three lines.
    #   modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.

    # - run: |
    #   echo "Run, Build Application using script"
    #   ./location_of_script_within_repo/buildscript.sh

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@ebcb5b36ded6beda4ceefea6a8bc4cc885255bb3 # v3
      with:
        category: "/language:${{matrix.language}}"

  skip-analyze:
    needs: [changes]
    if: needs.changes.outputs.should-run-analyze == 'false'
    name: Analyze
    strategy:
      matrix:
        language: [ 'go', 'javascript' ]
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - run: 'echo "No build required"'


================================================
FILE: .github/workflows/dependency-review.yml
================================================
# Dependency Review Action
#
# This Action will scan dependency manifest files that change as part of a Pull Request,
# surfacing known-vulnerable versions of the packages declared or updated in the PR.
# Once installed, if the workflow run is marked as required,
# PRs introducing known-vulnerable packages will be blocked from merging.
#
# Source repository: https://github.com/actions/dependency-review-action
name: 'Dependency Review'
on:
  pull_request:
    types:
      - opened
      - synchronize
      - reopened
    branches:
      - main
      - release-**

permissions:
  contents: read

jobs:
  dependency-review:
    runs-on: ubuntu-latest
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - name: 'Checkout Repository'
        uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
      - name: 'Dependency Review'
        uses: actions/dependency-review-action@05fe4576374b728f0c523d6a13d64c25081e0803 # v4.8.3


================================================
FILE: .github/workflows/labeler.yml
================================================
name: "Pull Request Labeler"

on:
  pull_request_target:
    types:
      - opened
      - reopened
      - synchronize
      - ready_for_review

permissions:
  contents: read

jobs:
  triage:
    permissions:
      contents: read
      pull-requests: write
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - uses: actions/labeler@8558fd74291d67161a8a78ce36a881fa63b766a9 # v5


================================================
FILE: .github/workflows/lint.yml
================================================
name: linter

on:
  pull_request:
    types:
      - opened
      - reopened
      - synchronize
      - ready_for_review
    branches:
      - "main"
      - "release-**"

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

permissions:
  # Required: allow read access to the content for analysis.
  contents: read
  # Optional: allow read access to pull request. Use with `only-new-issues` option.
  pull-requests: read
  # Optional: Allow write access to checks to allow the action to annotate code in the PR.
  checks: write

jobs:
  changes:
    outputs:
      should-run-linting: ${{ steps.changes.outputs.go == 'true' }}
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
      - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
        id: changes
        with:
          filters: |
            go:
              - '**.go'
              - 'go.*'
              - '.github/workflows/lint.yml'
              - '.golangci.yml'

  golangci-lint:
    needs: [changes]
    if: github.event.pull_request.draft == false && needs.changes.outputs.should-run-linting == 'true'
    name: Linting
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4

      # need to setup go toolchain explicitly
      - uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5
        with:
          go-version-file: go.mod

      - name: golangci-lint
        uses: golangci/golangci-lint-action@1e7e51e771db61008b38414a730f564565cf7c20 # v9
        with:
          # renovate: datasource=github-releases depName=golangci/golangci-lint
          version: v2.7.2

  skip-lint:
    needs: [changes]
    if: needs.changes.outputs.should-run-linting == 'false'
    name: Linting
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - run: 'echo "No build required"'


================================================
FILE: .github/workflows/pr-lint.yml
================================================
name: "Lint PR"

on:
  pull_request_target:
    types:
      - opened
      - edited
      - synchronize

permissions:
  pull-requests: read

jobs:
  main:
    name: Validate PR title
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - uses: amannn/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50 # v6
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/pr-size-labeler.yml
================================================
name: pr-size

on: [pull_request]

permissions:
  contents: read

jobs:
  labeler:
    permissions:
      pull-requests: write  # for codelytv/pr-size-labeler to add labels & comment on PRs
    runs-on: ubuntu-latest
    name: Label the PR size
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - uses: codelytv/pr-size-labeler@4ec67706cd878fbc1c8db0a5dcd28b6bb412e85a # v1
        with:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          xs_label: 'size/xs'
          xs_max_size: '10'
          s_label: 'size/s'
          s_max_size: '200'
          m_label: 'size/m'
          m_max_size: '1000'
          l_label: 'size/l'
          l_max_size: '10000'
          xl_label: 'size/xl'
          fail_if_xl: 'false'
          message_if_xl: >
            This PR exceeds the recommended size of 1000 lines.
            Please make sure you are NOT addressing multiple issues with one PR.
            Note this PR might be rejected due to its size.
          github_api_url: 'https://api.github.com'
          files_to_ignore: ''


================================================
FILE: .github/workflows/release.yml
================================================
name: release

on:
  push:
    tags:
      - v*.*.*
  workflow_dispatch:

permissions:
  contents: write  # for goreleaser to create releases and upload release assets

jobs:
  goreleaser:
    runs-on: ubuntu-24.04
    steps:
    - name: Harden Runner
      uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
      with:
        egress-policy: audit

    - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
      with:
        submodules: true

    - uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5
      with:
        go-version-file: go.mod

    - name: Run GoReleaser for stable release
      uses: goreleaser/goreleaser-action@ec59f474b9834571250b370d4735c50f8e2d1e29 # v7
      if: (!contains(github.ref, 'pre'))
      with:
        # You can pass flags to goreleaser via GORELEASER_ARGS
        # --clean will save you deleting the dist dir
        args: release --clean
        distribution: goreleaser # or 'goreleaser-pro'
        version: "~> v2" # or 'latest', 'nightly', semver
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

    - name: Generate changelog for pre release
      if: contains(github.ref, 'pre')
      id: changelog
      run: |
        echo "RELEASE_TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
        gh api repos/$GITHUB_REPOSITORY/releases/generate-notes \
          -f tag_name="${GITHUB_REF#refs/tags/}" \
          -f target_commitish=main \
          -q .body > tmp-CHANGELOG.md
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/renovate-config.yml
================================================
name: renovate-config

on:
  push:
    paths:
      - '.github/renovate.json5'
    branches:
      - main
      - 'releases-**'
  pull_request:
    paths:
      - '.github/renovate.json5'
  workflow_dispatch:

permissions:
  contents: read

jobs:
  validate:
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
      - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
      - run: npx --package="renovate@${RENOVATE_VERSION}" -c renovate-config-validator
        env:
          # renovate: datasource=npm depName=renovate
          RENOVATE_VERSION: 39.68.4


================================================
FILE: .github/workflows/scorecard.yml
================================================
name: Scorecard supply-chain security
on:
  schedule:
    - cron: '0 5 * * 1'
  push:
    branches:
      - main

permissions: read-all

jobs:
  analysis:
    name: Scorecard analysis
    runs-on: ubuntu-latest
    permissions:
      # Needed to upload the results to code-scanning dashboard.
      security-events: write
      # Needed to publish results and get a badge (see publish_results below).
      id-token: write

    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@fa2e9d605c4eeb9fcad4c99c224cee0c6c7f3594 # v2
        with:
          egress-policy: audit

      - name: 'Checkout code'
        uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
        with:
          persist-credentials: false
          show-progress: false

      - name: 'Run analysis'
        uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
        with:
          results_file: results.sarif
          results_format: sarif

          # Public repositories:
          #   - Publish results to OpenSSF REST API for easy access by consumers
          #   - Allows the repository to include the Scorecard badge.
          #   - See https://github.com/ossf/scorecard-action#publishing-results.
          # For private repositories:
          #   - `publish_results` will always be set to `false`, regardless
          #     of the value entered here.
          publish_results: true

      # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
      # format to the repository Actions tab.
      - name: 'Upload artifact'
        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
        with:
          name: SARIF file
          path: results.sarif
          retention-days: 5

      # Upload the results to GitHub's code scanning dashboard.
      - name: 'Upload to code-scanning'
        uses: github/codeql-action/upload-sarif@45580472a5bb82c4681c4ac726cfdb60060c2ee1 # v3.32.4
        with:
          sarif_file: results.sarif


================================================
FILE: .github/workflows/stale.yml
================================================
name: Close Stale PRs
on:
  schedule:
    - cron: '30 1 * * *'
permissions:
  contents: read

jobs:
  stale:
    permissions:
      issues: write  # for actions/stale to close stale issues
      pull-requests: write  # for actions/stale to close stale PRs
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10
        with:
          stale-pr-message: 'This issue is stale because it has been open for 1 month with no activity. Remove stale label or comment or this will be closed in 1 month.'
          stale-issue-message: 'This issue is stale because it has been open for 1 month with no activity. Remove stale label or comment or this will be closed in 1 month.'
          remove-stale-when-updated: true
          exempt-pr-labels: "never-stale"
          exempt-issue-labels: "never-stale"
          # 1 month
          days-before-stale: 31
          # 1 month
          days-before-close: 31
          only-labels: 'waiting-on-response'


================================================
FILE: .github/workflows/test.yml
================================================
name: tester

on:
  push:
    branches:
      - "main"
      - "release-**"
  pull_request:
    types:
      - opened
      - reopened
      - synchronize
      - ready_for_review
    branches:
      - "main"
      - "release-**"

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

permissions:
  contents: read

env:
  TERRAFORM_VERSION: 1.11.1
  NGROK_DOWNLOAD_URL: https://bin.equinox.io/a/bNzUz3YQtcB/ngrok-v3-3.33.1-linux-amd64.tar.gz

jobs:
  changes:
    permissions:
      contents: read  # for dorny/paths-filter to fetch a list of changed files
      pull-requests: read  # for dorny/paths-filter to read pull requests
    outputs:
      should-run-tests: ${{ steps.changes.outputs.go == 'true' }}
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
      - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
        id: changes
        with:
          filters: |
            go:
              - '**.go'
              - '**.txt' # golden file test output
              - 'go.*'
              - '**.tmpl'
              - '.github/workflows/test.yml'
  test:
    needs: [changes]
    if: needs.changes.outputs.should-run-tests == 'true'
    name: Tests
    runs-on: ubuntu-24.04
    # Use latest testing environment for automatic updates
    # Previous: ghcr.io/runatlantis/testing-env:latest@sha256:725981e9090c977f8055f5ec5ba7a63430a8f0337ab955978e6b8cc2cd0236c3
    container: ghcr.io/runatlantis/testing-env:latest@sha256:d1654766a99fa7042c96fcb19da42cee36f042b1ae67f106237e3cbbaf059732
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4

      # need to setup go toolchain explicitly
      - uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5
        with:
          go-version-file: go.mod

      - run: make test-all
      - run: make check-fmt

      ###########################################################
      # Notifying #contributors about test failure on main branch
      ###########################################################
      - name: Slack failure notification
        if: ${{ github.ref == 'refs/heads/main' && failure() }}
        uses: slackapi/slack-github-action@91efab103c0de0a537f72a35f6b8cda0ee76bf0a # v2.1.1
        with:
          payload: |
            {
              "blocks": [
                {
                  "type": "section",
                  "text": {
                    "type": "mrkdwn",
                    "text": ":x: Failed GitHub Action:"
                  }
                },
                {
                  "type": "section",
                  "fields": [
                    {
                      "type": "mrkdwn",
                      "text": "*Workflow:*\n<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|${{ github.workflow }}>"
                    },
                    {
                      "type": "mrkdwn",
                      "text": "*Job:*\n${{ github.job }}"
                    },
                    {
                      "type": "mrkdwn",
                      "text": "*Repo:*\n${{ github.repository }}"
                    }
                  ]
                }
              ]
            }
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
          SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK

  skip-test:
    needs: [changes]
    if: needs.changes.outputs.should-run-tests == 'false'
    name: Tests
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - run: 'echo "No build required"'

  e2e-github:
    runs-on: ubuntu-24.04
    # dont run e2e tests on forked PRs
    if: github.event.pull_request.head.repo.fork == false
    env:
      ATLANTIS_GH_USER: ${{ secrets.ATLANTISBOT_GITHUB_USERNAME }}
      ATLANTIS_GH_TOKEN: ${{ secrets.ATLANTISBOT_GITHUB_TOKEN }}
      NGROK_AUTH_TOKEN: ${{ secrets.ATLANTISBOT_NGROK_AUTH_TOKEN }}
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
      - uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5
        with:
          go-version-file: go.mod

      # This version of TF will be downloaded before Atlantis is started.
      # We do this instead of setting --default-tf-version because setting
      # that flag starts the download asynchronously so we'd have a race
      # condition.
      - uses: hashicorp/setup-terraform@b9cd54a3c349d3f38e8881555d616ced269862dd # v3
        with:
          terraform_version: ${{ env.TERRAFORM_VERSION }}

      - name: Setup ngrok
        run: |
          wget -q -O ngrok.tar.gz ${NGROK_DOWNLOAD_URL}
          tar -xzf ngrok.tar.gz
          chmod +x ngrok
          ./ngrok version
      - name: Setup gitconfig
        run: |
          git config --global user.email "maintainers@runatlantis.io"
          git config --global user.name "atlantisbot"

      - run: |
          make build-service
          ./scripts/e2e.sh
  e2e-gitlab:
    runs-on: ubuntu-24.04
    # dont run e2e tests on forked PRs
    if: github.event.pull_request.head.repo.fork == false
    env:
      ATLANTIS_GITLAB_USER: ${{ secrets.ATLANTISBOT_GITLAB_USERNAME }}
      ATLANTIS_GITLAB_TOKEN: ${{ secrets.ATLANTISBOT_GITLAB_TOKEN }}
      NGROK_AUTH_TOKEN: ${{ secrets.ATLANTISBOT_NGROK_AUTH_TOKEN }}
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
      - uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5
        with:
          go-version-file: go.mod

      # This version of TF will be downloaded before Atlantis is started.
      # We do this instead of setting --default-tf-version because setting
      # that flag starts the download asynchronously so we'd have a race
      # condition.
      - uses: hashicorp/setup-terraform@b9cd54a3c349d3f38e8881555d616ced269862dd # v3
        with:
          terraform_version: ${{ env.TERRAFORM_VERSION }}

      - name: Setup ngrok
        run: |
          wget -q -O ngrok.tar.gz ${NGROK_DOWNLOAD_URL}
          tar -xzf ngrok.tar.gz
          chmod +x ngrok
          ./ngrok version
      - name: Setup gitconfig
        run: |
          git config --global user.email "maintainers@runatlantis.io"
          git config --global user.name "atlantisbot"

      - run: |
          make build-service
          ./scripts/e2e.sh


================================================
FILE: .github/workflows/testing-env-image.yml
================================================
name: testing-env-image

on:
  push:
    branches:
      - 'main'
      - 'release-**'
  pull_request:
    branches:
      - 'main'
      - 'release-**'
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

permissions:
  contents: read

jobs:
  changes:
    permissions:
      contents: read  # for dorny/paths-filter to fetch a list of changed files
      pull-requests: read  # for dorny/paths-filter to read pull requests
    outputs:
      should-run-build: ${{ steps.changes.outputs.src == 'true' }}
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
      - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
        id: changes
        with:
          filters: |
            src:
              - 'testing/**'
              - '.github/workflows/testing-env-image.yml'

  build:
    needs: [changes]
    if: needs.changes.outputs.should-run-build == 'true'
    name: Build Testing Env Image
    runs-on: ubuntu-24.04
    permissions:
      packages: write # for ghcr.io push
    steps:
    - name: Harden Runner
      uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
      with:
        egress-policy: audit

    - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4

    - name: Set up QEMU
      uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3
      with:
        image: tonistiigi/binfmt:qemu-v10.2.1@sha256:d3b963f787999e6c0219a48dba02978769286ff61a5f4d26245cb6a6e5567ea3
        platforms: arm64,arm

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3

    - name: Login to Packages Container registry
      uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
      with:
        registry: ghcr.io
        username: ${{ github.actor }}
        password: ${{ secrets.GITHUB_TOKEN }}

    - run: echo "TODAY=$(date +"%Y.%m.%d")" >> $GITHUB_ENV
    - name: Build and push testing-env:${{env.TODAY}} image
      uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
      with:
        cache-from: type=gha
        cache-to: type=gha,mode=max
        context: testing
        platforms: linux/arm64/v8,linux/amd64,linux/arm/v7
        push: ${{ github.event_name != 'pull_request' }}
        tags: |
           ghcr.io/runatlantis/testing-env:${{env.TODAY}}
           ghcr.io/runatlantis/testing-env:latest

  skip-build:
    needs: [changes]
    if: needs.changes.outputs.should-run-build == 'false'
    name: Build Testing Env Image
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - run: 'echo "No build required"'


================================================
FILE: .github/workflows/website.yml
================================================
name: website

on:
  push:
    branches:
      - 'main'
      - 'release-**'
  pull_request:
    types:
      - opened
      - reopened
      - synchronize
      - ready_for_review
    branches:
      - 'main'
      - 'release-**'

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

permissions:
  # Required: allow read access to the content for analysis.
  contents: read

jobs:
  changes:
    outputs:
      should-run-website-check: ${{ steps.changes.outputs.src == 'true' }}
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
      - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
        id: changes
        with:
          filters: |
            src:
              - 'runatlantis.io/**'
              - 'package-lock.json'
              - 'package.json'
              - '.github/workflows/website.yml'
              - '.vale.ini'
              - '_typos.toml'
              - '.github/styles/**'

  # Check that the website builds and there's no missing links.
  website-check:
    needs: [changes]
    if: github.event.pull_request.draft == false && needs.changes.outputs.should-run-website-check == 'true'
    name: Website Check
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4

      - name: Spell check
        uses: crate-ci/typos@57b11c6b7e54c402ccd9cda953f1072ec4f78e33 # v1.43.5
        with:
          files: ./runatlantis.io/docs

      - name: Vale prose linting
        run: |
          VALE_VERSION="3.9.4"
          VALE_TARBALL="vale_${VALE_VERSION}_Linux_64-bit.tar.gz"
          curl -sLO "https://github.com/errata-ai/vale/releases/download/v${VALE_VERSION}/${VALE_TARBALL}"
          echo "551f7ef5cabd53affb7b2c8bdbd4cfb6216270d53c4d6e571a567c5b5df0921d  ${VALE_TARBALL}" | sha256sum --check
          tar xz -C /tmp vale -f "${VALE_TARBALL}"
          rm "${VALE_TARBALL}"
          # api-endpoints.md intentionally uses "Github"/"Gitlab" as literal API
          # string values matching the Go source code constants; exclude it here.
          /tmp/vale --glob='!*api-endpoints.md' runatlantis.io/docs/

      - name: markdown-lint
        uses: DavidAnson/markdownlint-cli2-action@05f32210e84442804257b2a6f20b273450ec8265 # v19
        with:
          config: .markdownlint.yaml
          globs: 'runatlantis.io/**/*.md'

      - name: Link Checker
        id: lychee
        uses: lycheeverse/lychee-action@a8c4c7cb88f0c7386610c35eb25108e448569cb0 # v2.7.0
        with:
          args: >-
            --verbose
            --no-progress
            --max-concurrency 5
            --max-retries 0
            --accept 200,429
            ./runatlantis.io

      - name: setup npm
        uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
        with:
          cache: 'npm'

      - name: run http-server
        run: |
          # build site
          npm install
          npm run website:build

          # start http-server for integration testing
          npx http-server runatlantis.io/.vitepress/dist &

      - name: Run Playwright E2E tests
        run: |
          npx playwright install --with-deps
          npm run e2e

  skip-website-check:
    needs: [changes]
    if: needs.changes.outputs.should-run-website-check == 'false'
    name: Website Check
    runs-on: ubuntu-24.04
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
        with:
          egress-policy: audit

      - run: 'echo "No build required"'


================================================
FILE: .gitignore
================================================
.idea
./atlantis
*.iml
atlantis.db
output
.DS_Store
.cover
.terraform/
node_modules/
helm/test-values.yaml
*.swp
golangci-lint
atlantis
.devcontainer
atlantis.env
*.act
Dockerfile.local

# gitreleaser
dist/
tmp-CHANGELOG.md

.envrc

# IDE files
*.code-workspace

# draw.io backup files
*.bkp

# VitePress build output & cache directory
**/.vitepress/cache
**/.vitepress/dist
**/.vitepress/config.ts.timestamp-*

# playwright
test-results/

#Cursor dirs
.cursor


================================================
FILE: .golangci.yml
================================================
version: "2"
linters:
  enable:
    - modernize
    - gochecknoinits
    - gosec
    - misspell
    - revive
    - testifylint
    - unconvert
  settings:
    misspell:
      ignore-rules:
        - noteable
    revive:
      rules:
        - name: dot-imports
          disabled: true
  exclusions:
    generated: lax
    presets:
      - comments
      - common-false-positives
      - legacy
      - std-error-handling
    paths:
      - third_party$
      - builtin$
      - examples$
formatters:
  enable:
    - gofmt
  exclusions:
    generated: lax
    paths:
      - third_party$
      - builtin$
      - examples$


================================================
FILE: .goreleaser.yml
================================================
version: 2

env:
  - CGO_ENABLED=0

builds:
  - id: atlantis

    targets:
      - darwin_amd64
      - darwin_arm64
      - linux_386
      - linux_amd64
      - linux_arm
      - linux_arm64
      - windows_386
      - windows_amd64

    flags:
      - -trimpath

    ldflags:
      - -s -w
      - -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}

archives:
  - id: zip
    name_template: "{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}"
    formats:
      - zip
    files:
      - none*

checksum:
  name_template: "checksums.txt"

changelog:
  disable: true

release:
  # If set to true, will not auto-publish the release.
  # Default is false.
  draft: false

  # If set, will create a release discussion in the category specified.
  #
  # Warning: do not use categories in the 'Announcement' format.
  #  Check https://github.com/goreleaser/goreleaser/issues/2304 for more info.
  #
  # Default is empty.
  discussion_category_name: General

  # If set to auto, will mark the release as not ready for production
  # in case there is an indicator for this in the tag e.g. v1.0.0-rc1
  # If set to true, will mark the release as not ready for production.
  # Default is false.
  prerelease: auto

# TODO: This requires a gpg_private_key
#       https://github.com/marketplace/actions/goreleaser-action#signing
# signs:
#   # https://goreleaser.com/customization/sign/
#   -
#     artifacts: all

snapshot:
  name_template: "{{ incpatch .Version }}-next"


================================================
FILE: .lycheeignore
================================================
# Ignore file for the https://github.com/lycheeverse/lychee/ website link checker

# These sites have bot protection which causes a 403 Network error: Forbidden when checking
https://www.freepik.com/
https://www.flaticon.com/
https://medium.com/


================================================
FILE: .markdownlint.yaml
================================================
# MD013/line-length
#
# We're not particular about line length, generally preferring longer
# lines, since tools like Grammarly and other writing assistance tools
# work best with "normal" lines not broken up arbitrary.
#
# https://github.com/DavidAnson/markdownlint/blob/main/doc/md013.md
MD013: false

# MD033/no-inline-html
#
# We're fine with inline HTML, there are lots of valid VitePress features
# that depends on this.
#
# https://github.com/DavidAnson/markdownlint/blob/main/doc/md033.md
MD033: false

# MD024/no-duplicate-heading
#
# VitePress do not follow GitHub heading styling, so duplicate headlines
# are fine as long as they are not siblings (aka same indention hierarchy)
#
# https://github.com/DavidAnson/markdownlint/blob/main/doc/md024.md
MD024:
  siblings_only: true

# MD051/link-fragments
#
# VitePress generate these differently that markdownlint expects, so disabling
# for now, and something to improve on later (cc @jippi)
#
# https://github.com/DavidAnson/markdownlint/blob/main/doc/md051.md
MD051: false

# for blog posts
MD025: false
MD045: false
MD001: false


================================================
FILE: .node-version
================================================
24.13.1


================================================
FILE: .pre-commit-config.yaml
================================================
repos:
- repo: https://github.com/gitleaks/gitleaks
  rev: v8.16.3
  hooks:
  - id: gitleaks
- repo: https://github.com/golangci/golangci-lint
  rev: v1.52.2
  hooks:
  - id: golangci-lint
- repo: https://github.com/jumanjihouse/pre-commit-hooks
  rev: 3.0.0
  hooks:
  - id: shellcheck
- repo: https://github.com/pre-commit/mirrors-eslint
  rev: v8.38.0
  hooks:
  - id: eslint
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: v4.4.0
  hooks:
  - id: end-of-file-fixer
  - id: trailing-whitespace


================================================
FILE: .tool-versions
================================================
node 22.14.0
go 1.25.1


================================================
FILE: .vale.ini
================================================
StylesPath = .github/styles
MinAlertLevel = error

# api-endpoints.md intentionally uses the API string literals "Github" and
# "Gitlab" (which match the Go source code constants). When running Vale
# locally, exclude it with: vale --glob='!*api-endpoints.md' runatlantis.io/docs/
[*.md]
BasedOnStyles = Atlantis


================================================
FILE: .vscode/settings.json
================================================
{
    "git.alwaysSignOff": true
}


================================================
FILE: ADOPTERS.md
================================================
# Who uses Atlantis?
As the Atlantis Community grows, we'd like to keep track of our users and adopters. Please send a PR with your organization name if you are using Atlantis.

## Updating this list

1. Open a PR to directly update this list, or edit this file directly in GitHub

## Atlantis Adopters

This list is sorted in the order that organizations were added to it.

| Organization | Contact | Description of Use |
| ------------ | ------- | ------------------ |
] [Lambda](https://lambda.ai) | @genpage | Currently used for orchestrating self-service infrastructure for Lambda's Internal Platform |  


================================================
FILE: CHANGELOG.md
================================================
**NOTE:** We do not plan to update this page anymore. Please see [the releases page for the updated changelog](https://github.com/runatlantis/atlantis/releases).

---

# v0.23.3

Bugfixes and new Features

https://github.com/runatlantis/atlantis/releases/tag/v0.23.3

# v0.23.2

Bugfixes and new Features

https://github.com/runatlantis/atlantis/releases/tag/v0.23.2

# v0.23.1

Bugfixes and new Features

https://github.com/runatlantis/atlantis/releases/tag/v0.23.1

# v0.23.0

Bugfixes and new Features

## What's Changed

https://github.com/runatlantis/atlantis/releases/tag/v0.23.0

# v0.22.3

Bugfixes and new Features

## What's Changed

https://github.com/runatlantis/atlantis/releases/tag/v0.22.3

# v0.22.2

Bugfixes and new Features

## What's Changed

https://github.com/runatlantis/atlantis/releases/tag/v0.22.2

# v0.22.1

Bugfixes and new Features

## What's Changed

https://github.com/runatlantis/atlantis/releases/tag/v0.22.1

# v0.22.0

Bugfixes and new Features

## What's Changed

https://github.com/runatlantis/atlantis/releases/tag/v0.22.0

# v0.21.0

Bugfixes and new Features

## What's Changed

https://github.com/runatlantis/atlantis/releases/tag/v0.21.0

## Breaking changes
* Terraform version 1.x have been removed to deprecate beta versions of terraform and reduce the docker image size. Each version of terraform is about 80 MB. ([#2619](https://github.com/runatlantis/atlantis/pull/2619))

# v0.20.1

Bugfixes and new Features

## What's Changed

https://github.com/runatlantis/atlantis/releases/tag/v0.20.1

# v0.20.0

Broken build due to github action issues

## What's Changed

https://github.com/runatlantis/atlantis/releases/tag/v0.20.0

# v0.19.8

Bugfixes and new Features

## What's Changed

https://github.com/runatlantis/atlantis/releases/tag/v0.19.8

# v0.19.7

Bugfixes and new Features

## What's Changed

https://github.com/runatlantis/atlantis/releases/tag/v0.19.7

# v0.19.6

Bugfixes and new Features

## What's Changed

https://github.com/runatlantis/atlantis/releases/tag/v0.19.6


# v0.19.5

Bugfixes and new Features

## What's Changed

https://github.com/runatlantis/atlantis/releases/tag/v0.19.5

## Backwards Incompatibilities / Notes:
* `--var-file-allowlist` flag has been added to restrict the access of files on Atlantis install from pull request
  comments. Set the flag if you want to explicitly grant the access to files outside the default data directory.
  
  Previously, any file could be passed to `-var-file`. Now only files under the directories in the allowlist are permitted.

# v0.19.4

Bugfixes and new Features

## What's Changed

https://github.com/runatlantis/atlantis/releases/tag/v0.19.4

# v0.19.3

Bugfixes and new Features

## What's Changed

https://github.com/runatlantis/atlantis/releases/tag/v0.19.3

# v0.19.2

Bug fix release for github and update docs to reflect the docker registry support change.

## What's Changed

* fix: fix unmarshall error in graphql call by @raymondchen625 in https://github.com/runatlantis/atlantis/pull/2128
* docs: update docker registry link to ghcr by @marceloboeira in https://github.com/runatlantis/atlantis/pull/2130

# v0.19.1

Bug fix release, most importantly fixing the wrong version number associated with v0.19.0.

And it also contains fixes for `bitbucketcloud` and `gitlab`.

## What's Changed

* build(deps): bump actions/checkout from 2 to 3 by @dependabot in https://github.com/runatlantis/atlantis/pull/2119
* build(deps): bump github.com/xanzy/go-gitlab from 0.55.1 to 0.58.0 by @dependabot in https://github.com/runatlantis/atlantis/pull/2118
* fix(bitbucketcloud): Ensure status key has at most 40 characters by @maxbrunet in https://github.com/runatlantis/atlantis/pull/2037
* fix(gitlab-client): change `pending` to `running` state by @syphernl in https://github.com/runatlantis/atlantis/pull/1971
* fix(bitbucketcloud)!: Use AccountID as username instead of Nickname by @maxbrunet in https://github.com/runatlantis/atlantis/pull/2034

# v0.19.0

Feature release for:
- multi-arch docker images
- add `pending` status for apply

## What's Changed

* docs: moving streaming logs section from top-level navigation to docs by @Aayyush in https://github.com/runatlantis/atlantis/pull/2066
* fix(docker): Multi-arch Docker images, attempt two by @Tenzer in https://github.com/runatlantis/atlantis/pull/2114
* feat: add a pending status for apply when running plan command by @AndreZiviani in https://github.com/runatlantis/atlantis/pull/2053

# v0.18.5

Maintenance release:
- Drop Dockerhub support (#2103)
- fixing the most recent multiplatform image build issue. (#2104)

## What's Changed

* ci: drop circleci docker hub update by @chenrui333 in https://github.com/runatlantis/atlantis/pull/2102
* fix(docker): fix docker runtime issue by @chenrui333 in https://github.com/runatlantis/atlantis/pull/2106
* deps: tf 1.1.7 by @chenrui333 in https://github.com/runatlantis/atlantis/pull/2108

# v0.18.4

Maintenance release for security patches with atlantis-base image

## What's Changed

* fix(web-templates): use CleanedBasePath for titles by @jvrplmlmn in https://github.com/runatlantis/atlantis/pull/2091
* build(deps): bump runatlantis/atlantis-base from 2021.12.15 to 2022.03.02
* docker: bump git-lfs and gosu dependencies by @hi-artem in https://github.com/runatlantis/atlantis/pull/2096
* fix(docker): fix base image for multi-platform build by @Tenzer in https://github.com/runatlantis/atlantis/pull/2099
* fix(docker): fix installation of git-lfs in armv7 image by @Tenzer in https://github.com/runatlantis/atlantis/pull/2100
* fix(docker): download Terraform and conftest versions matching image architecture by @Tenzer in https://github.com/runatlantis/atlantis/pull/2101

# v0.18.3

## What's Changed

* Fix URL generation by @PertsevRoman in https://github.com/runatlantis/atlantis/pull/2021
* deps: terraform 1.1.5 by @lazzurs in https://github.com/runatlantis/atlantis/pull/2042
* docs: update devops PR link by @chenrui333 in https://github.com/runatlantis/atlantis/pull/2033
* Moving config files to core/config by @msarvar in https://github.com/runatlantis/atlantis/pull/2036
* docs: fix policy example with custom workflow by @aliscott in https://github.com/runatlantis/atlantis/pull/2049
* docs: fix some typos by @ocaisa in https://github.com/runatlantis/atlantis/pull/2048
* fix: get user teams with GitHub GraphQL API by @raymondchen625 in https://github.com/runatlantis/atlantis/pull/2045
* build(deps): bump github.com/xanzy/go-gitlab from 0.54.3 to 0.54.4 by @dependabot in https://github.com/runatlantis/atlantis/pull/2050
* docs: add user facing documentation for real-time logs by @Aayyush in https://github.com/runatlantis/atlantis/pull/1963
* feat: Use UUIDs to identify log streaming jobs by @Aayyush in https://github.com/runatlantis/atlantis/pull/2051
* build(deps): bump ajv from 6.5.1 to 6.12.6 by @dependabot in https://github.com/runatlantis/atlantis/pull/2060
* build(deps): bump github.com/xanzy/go-gitlab from 0.54.4 to 0.55.1 by @dependabot in https://github.com/runatlantis/atlantis/pull/2061
* build(deps): bump github.com/golang-jwt/jwt/v4 from 4.2.0 to 4.3.0 by @dependabot in https://github.com/runatlantis/atlantis/pull/2062
* build(deps): bump github.com/microcosm-cc/bluemonday from 1.0.17 to 1.0.18 by @dependabot in https://github.com/runatlantis/atlantis/pull/2063
* build(deps): bump go.uber.org/zap from 1.20.0 to 1.21.0 by @dependabot in https://github.com/runatlantis/atlantis/pull/2064
* deps: tf 1.1.6 by @chenrui333 in https://github.com/runatlantis/atlantis/pull/2071
* Removing web credentials from debug log by @pkaramol in https://github.com/runatlantis/atlantis/pull/2072
* build(deps): bump github.com/gorilla/websocket from 1.4.2 to 1.5.0 by @dependabot in https://github.com/runatlantis/atlantis/pull/2077
* build(deps): bump prismjs from 1.25.0 to 1.27.0 by @dependabot in https://github.com/runatlantis/atlantis/pull/2086
* fix(web-templates): use CleanedBasePath for static content by @jvrplmlmn in https://github.com/runatlantis/atlantis/pull/2079

# v0.18.2

## What's Changed

* deps: terraform 1.1.3 by @chenrui333 in https://github.com/runatlantis/atlantis/pull/1982
* deps: conftest 0.30.0 by @chenrui333 in https://github.com/runatlantis/atlantis/pull/1983
* build(deps): bump github.com/xanzy/go-gitlab from 0.52.2 to 0.54.3 by @dependabot in https://github.com/runatlantis/atlantis/pull/1986
* build(deps): bump github.com/hashicorp/go-version from 1.3.0 to 1.4.0 by @dependabot in https://github.com/runatlantis/atlantis/pull/1987
* build(deps): bump go.uber.org/zap from 1.19.1 to 1.20.0 by @dependabot in https://github.com/runatlantis/atlantis/pull/1988
* docs: document `undiverged` apply requirement in more places by @fishpen0 in https://github.com/runatlantis/atlantis/pull/1992
* fix: fix autoplan when .terraform.lock.hcl is modified by @gezb in https://github.com/runatlantis/atlantis/pull/1991
* feat: add XTerm JS to the server static files by @Ka1wa in https://github.com/runatlantis/atlantis/pull/1985
* feat: post workflow hooks by @tim775 in https://github.com/runatlantis/atlantis/pull/1990
* docs: add colon to policy checking yaml by @williamlord-wise in https://github.com/runatlantis/atlantis/pull/1996
* docs: include infracost ref in post-workflow-hooks by @ilamtap in https://github.com/runatlantis/atlantis/pull/1997
* fix(docs): update screenshot for Bitbucket server webhook configuration by @kuzm1ch in https://github.com/runatlantis/atlantis/pull/1995
* fix: make IsOwner policy check case-insensitive by @edbighead in https://github.com/runatlantis/atlantis/pull/1989
* build(deps): bump github.com/bradleyfalzon/ghinstallation/v2 from 2.0.3 to 2.0.4 by @dependabot in https://github.com/runatlantis/atlantis/pull/2004
* build(deps): bump github.com/hashicorp/go-getter from 1.5.10 to 1.5.11 by @dependabot in https://github.com/runatlantis/atlantis/pull/2003
* docs: fix incorrect wildcard and more precise instruction to --gh-team-allowlist option. by @keitap in https://github.com/runatlantis/atlantis/pull/2005
* fix: support for terraform workspaces by @bschaeffer in https://github.com/runatlantis/atlantis/pull/2006
* deps: terraform 1.1.4 by @chenrui333 in https://github.com/runatlantis/atlantis/pull/2011
* fix: add back basic auth support by @Aayyush in https://github.com/runatlantis/atlantis/pull/2008
* chore: improve `/healthz` endpoint performance by @inkel in https://github.com/runatlantis/atlantis/pull/2014
* fix: Update GenerateProjectJobURL to account for nested repo names by @Aayyush in https://github.com/runatlantis/atlantis/pull/2012
* fix: broken Log Streaming URL when working directory is set to "./"  by @Aayyush in https://github.com/runatlantis/atlantis/pull/2015
* fix: retry /files/ requests to github by @iainlane in https://github.com/runatlantis/atlantis/pull/2002

# v0.18.1

Maintenance release for bug fixes as well as release multi-platform builds for atlantis docker images.

## What's Changed

* Revert "feat: filter out atlantis/apply from mergeability clause (#18… by @nishkrishnan in https://github.com/runatlantis/atlantis/pull/1968
* build(deps): bump github.com/microcosm-cc/bluemonday from 1.0.16 to 1.0.17 by @dependabot in https://github.com/runatlantis/atlantis/pull/1969
* fix:include no GitHub allowlist rules by default by @paulerickson in https://github.com/runatlantis/atlantis/pull/1973
* fix: default permissions for gh-team-allowlist. by @nishkrishnan in https://github.com/runatlantis/atlantis/pull/1974
* docs: documentation for slack integration by @syphernl in https://github.com/runatlantis/atlantis/pull/1972
* workflows(atlantis-image): fix building and publishing of Docker images by @Tenzer in https://github.com/runatlantis/atlantis/pull/1975
* fix: allowed regexp prefixes for exact matches by @bmbferreira in https://github.com/runatlantis/atlantis/pull/1962
* deps: conftest 0.29.0 by @chenrui333 in https://github.com/runatlantis/atlantis/pull/1977

# v0.18.0

Feature release of adding capability of streaming terraform logs, also added the capability of supporting tf 1.0.x (which was missed in the v0.17.6 release).

## What's Changed

* deps: terraform 1.1.2 by @chenrui333 in https://github.com/runatlantis/atlantis/pull/1952
* build(deps): bump github.com/spf13/viper from 1.10.0 to 1.10.1 by @dependabot in https://github.com/runatlantis/atlantis/pull/1956
* Dockerfile: Add support for last Terraform 1.0.x version in AVAILABLE_TERRAFORM_VERSIONS by @javierbeaumont in https://github.com/runatlantis/atlantis/pull/1957
* feat: add GitHub team allowlist configuration option by @paulerickson in https://github.com/runatlantis/atlantis/pull/1694
* fix: fallback to default TF version in apply step by @sapslaj in https://github.com/runatlantis/atlantis/pull/1931
* docs: typo in heading level by @moretea in https://github.com/runatlantis/atlantis/pull/1960
* docs: clarify example for `--azuredevops-token` flag by @MarkIannucci in https://github.com/runatlantis/atlantis/pull/1712
* docs: update github docs links by @chenrui333 in https://github.com/runatlantis/atlantis/pull/1964
* build(deps): bump github.com/hashicorp/go-getter from 1.5.9 to 1.5.10 by @dependabot in https://github.com/runatlantis/atlantis/pull/1961
* feat: streaming terraform logs in real-time by @Aayyush in https://github.com/runatlantis/atlantis/pull/1937

# v0.17.6

## What's Changed

* docs: clarify maximum version limit by @tomharrisonjr in https://github.com/runatlantis/atlantis/pull/1894
* fix: allow requests to /healthz without authentication by @wendtek in https://github.com/runatlantis/atlantis/pull/1896
* docs: document approve_policies command in comment_parser by @dupuy26 in https://github.com/runatlantis/atlantis/pull/1886
* feat: adds `allowed_regexp_prefixes` parameter to use with the `--enable-regexp-cmd` flag by @bmbferreira in https://github.com/runatlantis/atlantis/pull/1884
* refactor: Add PullStatusFetcher interface by @nishkrishnan in https://github.com/runatlantis/atlantis/pull/1904
* build(deps): bump github.com/urfave/negroni from 0.3.0 to 1.0.0 by @dependabot in https://github.com/runatlantis/atlantis/pull/1922
* build(deps): bump github.com/xanzy/go-gitlab from 0.51.1 to 0.52.2 by @dependabot in https://github.com/runatlantis/atlantis/pull/1921
* build(deps): bump github.com/golang-jwt/jwt/v4 from 4.1.0 to 4.2.0 by @dependabot in https://github.com/runatlantis/atlantis/pull/1928
* docs: add clarity and further policy_check examples by @DaveHewy in https://github.com/runatlantis/atlantis/pull/1925
* build(deps): bump github.com/spf13/viper from 1.9.0 to 1.10.0 by @dependabot in https://github.com/runatlantis/atlantis/pull/1934
* deps: terraform 1.1.1 by @chenrui333 in https://github.com/runatlantis/atlantis/pull/1939
* deps: alpine 3.15 by @chenrui333 in https://github.com/runatlantis/atlantis/pull/1941
* docs: fix policy check documentation examples by @DaveHewy in https://github.com/runatlantis/atlantis/pull/1945
* docker: make multi-platform atlantis image by @chenrui333 in https://github.com/runatlantis/atlantis/pull/1943

# v0.17.5

## What's Changed

* refactor: move from io/ioutil to io and os package by @Juneezee in https://github.com/runatlantis/atlantis/pull/1843
* chore: use golang-jwt/jwt to replace dgrijalva/jwt-go by @barn in https://github.com/runatlantis/atlantis/pull/1845
* fix(azure): allow host to be specified in user_config for on premise installation by @dandcg in https://github.com/runatlantis/atlantis/pull/1860
* feat: filter out atlantis/apply from mergeability clause by @nishkrishnan in https://github.com/runatlantis/atlantis/pull/1856
* feat: add BasicAuth Support to Atlantis ServeHTTP by @fblgit in https://github.com/runatlantis/atlantis/pull/1777
* fix(azure): allow correct path to be derived for on premise installation  by @dandcg in https://github.com/runatlantis/atlantis/pull/1863
* feat: add new bitbucket server webhook event type pr:from_ref_updated(#198) by @kuzm1ch in https://github.com/runatlantis/atlantis/pull/1866
* Move runtime common under existing runtime package. by @nishkrishnan in https://github.com/runatlantis/atlantis/pull/1875
* feat: use goreleaser to replace the binary-release script by @chenrui333 in https://github.com/runatlantis/atlantis/pull/1873

# v0.17.4

## What's Changed

* build(deps): bump tar from 4.4.15 to 4.4.19 by @dependabot in https://github.com/runatlantis/atlantis/pull/1783
* build: tf 1.0.6 by @chenrui333 in https://github.com/runatlantis/atlantis/pull/1786
* Bump testing image conftest version to 0.27 by @nishkrishnan in https://github.com/runatlantis/atlantis/pull/1787
* Actually bump testing image conftest version to 0.27 by @nishkrishnan in https://github.com/runatlantis/atlantis/pull/1788
* build: fix testing-env img process by @chenrui333 in https://github.com/runatlantis/atlantis/pull/1789
* e2e: update dockerfile by @chenrui333 in https://github.com/runatlantis/atlantis/pull/1790
* build(deps): bump runatlantis/atlantis-base from 2021.06.22 to 2021.08.31 by @dependabot in https://github.com/runatlantis/atlantis/pull/1794
* build(deps): bump github.com/xanzy/go-gitlab from 0.50.3 to 0.50.4 by @dependabot in https://github.com/runatlantis/atlantis/pull/1795
* fix a log error typo by @danpilch in https://github.com/runatlantis/atlantis/pull/1796
* Set ParallelPolicyCheckEnabled to the same value as ParallelPlanEnabled by @msarvar in https://github.com/runatlantis/atlantis/pull/1802
* docs: Add missing --silence-vcs-status-no-plans flag by @franklad in https://github.com/runatlantis/atlantis/pull/1803
* build(lint): use revive instead of golint by @minamijoyo in https://github.com/runatlantis/atlantis/pull/1801
* build(deps): bump github.com/hashicorp/go-getter from 1.5.7 to 1.5.8 by @dependabot in https://github.com/runatlantis/atlantis/pull/1807
* build(deps): bump go.uber.org/zap from 1.19.0 to 1.19.1 by @dependabot in https://github.com/runatlantis/atlantis/pull/1808
* docs: add missing the `branch` key in the reference for server side repo config by @minamijoyo in https://github.com/runatlantis/atlantis/pull/1784
* build: tf 1.0.7 by @chenrui333 in https://github.com/runatlantis/atlantis/pull/1811
* deps: conftest 0.28.0 by @chenrui333 in https://github.com/runatlantis/atlantis/pull/1819
* deps: conftest 0.28.1 by @chenrui333 in https://github.com/runatlantis/atlantis/pull/1826
* build(deps): bump prismjs from 1.24.0 to 1.25.0 by @dependabot in https://github.com/runatlantis/atlantis/pull/1823
* Updating client interface and adding ApprovalStatus model by @Aayyush in https://github.com/runatlantis/atlantis/pull/1827
* Fix title level by @xiao-pp in https://github.com/runatlantis/atlantis/pull/1822
* build(deps): bump github.com/xanzy/go-gitlab from 0.50.4 to 0.51.1 by @dependabot in https://github.com/runatlantis/atlantis/pull/1831
* Add support for deleting a branch on merge in BitBucket Server by @wpbeckwith in https://github.com/runatlantis/atlantis/pull/1792
* deps: tf 1.0.8 by @chenrui333 in https://github.com/runatlantis/atlantis/pull/1837
* build(deps): bump github.com/spf13/viper from 1.8.1 to 1.9.0 by @dependabot in https://github.com/runatlantis/atlantis/pull/1821
* Document --auto-merge-disabled option by @dupuy26 in https://github.com/runatlantis/atlantis/pull/1838
* testdrive: update terraformVersion by @chenrui333 in https://github.com/runatlantis/atlantis/pull/1839
* Improve github pull request call retries by @aristocrates in https://github.com/runatlantis/atlantis/pull/1810

# v0.17.3
Feature release with a number of improvements related to Gitlab support, a new command, better formatting etc. Some broken features have been fixed in along with some regressions.

## Features/Improvements
* Add version command to Atlantis for getting the current terraform version ([#1691](https://github.com/runatlantis/atlantis/pull/1691) by @pjsier)
* Support "Pipelines must succeed", "All discussions must be resolved" in Gitlab `apply_requirements` ([#1675](https://github.com/runatlantis/atlantis/pull/1675) by @devlucasc)
* Add support for specifying github app key as a string ([#1706](https://github.com/runatlantis/atlantis/pull/1706) by @dhaven)
* Add flag to enable rich github markdown formatting of terraform outputs ([#1751](https://github.com/runatlantis/atlantis/pull/1751) by @enochlo)
  * Note: Depending on feedback here, we will consider just enabling this by default in a future release.
* Add support for splitting large comments into batches for Gitlab ([#1755](https://github.com/runatlantis/atlantis/pull/1755) by @krrrr38)

## Bug Fixes
* Fix remote ops detection for tf >= 1.0.0 ([#1687](https://github.com/runatlantis/atlantis/pull/1687) by @taavitani)
* Fix Gitlab auto-merge race condition [#1609](https://github.com/runatlantis/atlantis/issues/1609) ([#1675](https://github.com/runatlantis/atlantis/pull/1675) by @devlucasc)
* Fix an issue where `--parallel-pool-size` was being ignored ([#1705](https://github.com/runatlantis/atlantis/pull/1705) by @Schtolc)
* Fix an issue where applies can occur on draft merge requests in Gitlab ([#1736](https://github.com/runatlantis/atlantis/pull/1736) by @devlucasc)
* Fix regression where .terraform.lock.hcl would prevent future operations from upgrading providers even with the `-upgrade` present ([#1701](https://github.com/runatlantis/atlantis/pull/1701) by @gezb)
* Fix issue with branch regex matcher which would always allow all branches ([#1768](https://github.com/runatlantis/atlantis/pull/1768) by @minamijoyo)

## Dependencies
* Upgrade default tf version to 1.0.5 ([#1662](https://github.com/runatlantis/atlantis/pull/1765) by @chenrui333)
* Upgrade go version to 0.17 ([#1766](https://github.com/runatlantis/atlantis/pull/1766) by @chenrui1333)
* Upgrade alpine to v3.14, addressing  CVE-2021-36159, CVE-2021-22924, CVE-2021-22923 and CVE-2021-22925 vulnerabilities ([#1770](https://github.com/runatlantis/atlantis/pull/1770) by @chenrui1333)

## Backwards Incompatibilities/Notes
* If you are using GHCR and are using the `atlantis:latest` docker image, this now points to the latest release as opposed to the tip of master.  If you want to work off the tip of master, then you should now use `atlantis:dev`

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.3/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.3/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.3/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.3/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.17.3`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Github Container Registry
[`ghcr.io/runatlantis/atlantis:v0.17.3`](https://github.com/runatlantis/atlantis/pkgs/container/atlantis)

## Diff v0.17.2..v0.17.3
https://github.com/runatlantis/atlantis/compare/v0.17.2...v0.17.3

# v0.17.2
Patch release containing bug fixes.

## Bug Fixes
* Fix a regression introduced where approving failing policies would create a secondary status in pending without ever being marked as successful ([#1672](https://github.com/runatlantis/atlantis/pull/1672) by @nishkrishnan)
* Fix a bug where pre-workflow hooks cannot find atlantis.yaml when run on non-default workspaces. ([#1620](https://github.com/runatlantis/atlantis/pull/1620) by @giuli007)

## Dependencies
* Upgrade default tf version to 1.0.1 ([#1662](https://github.com/runatlantis/atlantis/pull/1662) by @chenrui333)

## Backwards Incompatibilities/Notes
* If you're using the Atlantis Docker image and aren't setting the `--default-tf-version` flag
  then the default version of Terraform will now be 1.0.1. Simply set the above
  flag to your desired default version to avoid any issues.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.2/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.2/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.2/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.2/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.17.2`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Github Container Registry
[`ghcr.io/runatlantis/atlantis:v0.17.2`](https://github.com/runatlantis/atlantis/pkgs/container/atlantis)

## Diff v0.17.1..v0.17.2
https://github.com/runatlantis/atlantis/compare/v0.17.1...v0.17.2

# v0.17.1
Feature release containing a number of bug fixes.

Note: as of this release we are now also publishing releases to [Github Container Registry](https://github.com/runatlantis/atlantis/pkgs/container/atlantis/). We will stop publishing releases to [Dockerhub](https://hub.docker.com/r/runatlantis/atlantis/) in a subsequent major version release, please migrate any workflows to start using Github Container Registry in the meantime.

## Features/Improvements
* Add extra args support for policy checking command ([#1511](https://github.com/runatlantis/atlantis/pull/1511) by @nishkrishnan)
* Add undiverged apply requirement ([#1587](https://github.com/runatlantis/atlantis/pull/1587) by @pcalley)
* Modify logging timestamp to be ISO8601 ([#1625](https://github.com/runatlantis/atlantis/pull/1625) by @tkishore1192)
* Add run step environment variable SHOWFILE ([#1611](https://github.com/runatlantis/atlantis/pull/1611) by @mhennecke)
* Add flag to disable automerge for `atlantis apply` ([#1533](https://github.com/runatlantis/atlantis/pull/1533) by @spirosoik)
* Add support for deduping extra terraform args ([#1651](https://github.com/runatlantis/atlantis/pull/1651) by @gezb)
* Preserving terraform.lock.hcl when present by not upgrading during terraform init ([#1651](https://github.com/runatlantis/atlantis/pull/1651) by @gezb)

## Bug Fixes
* Fix a bug with the hide previous command logic ([#1549](https://github.com/runatlantis/atlantis/pull/1549) by @nishkrishnan)
* Fix a bug with Azure Dev ops Prs where only the recent commit was used to get the diff ([#1521](https://github.com/runatlantis/atlantis/pull/1521) by @nishkrishnan)
* Fix bug with deleting source branch on merging Azure Dev Ops PRs ([#1560](https://github.com/runatlantis/atlantis/pull/1560) by @tapaszto)
* Fix regression with parallelApply and parallelPlan args being in the wrong order and therefore swapped. ([#1574](https://github.com/runatlantis/atlantis/pull/1574) by @Fauzyy)
* Fix nil pointer deference when `disable-repo-locking` is true. ([#1557](https://github.com/runatlantis/atlantis/pull/1557) by @Fauzyy)
* Fix azure dev ops max comment characters to api limit ([#1585](https://github.com/runatlantis/atlantis/pull/1585) by @mhennecke)
* Fix bug where required terraform version was not being loaded when policy checks are enabled ([#1658](https://github.com/runatlantis/atlantis/pull/1658) by @msarvar)
* Fix bug where plan summary was not shown when changes outside of Terraform were detected ([#1593](https://github.com/runatlantis/atlantis/pull/1593) by @chroju)

## Dependencies
* Upgrade conftest binary version to 0.25 ([#1516](https://github.com/runatlantis/atlantis/pull/1579) by @msarvar)
* Upgrade default tf version to 1.0 ([#1622](https://github.com/runatlantis/atlantis/pull/1622) by @chenrui333)

## Backwards Incompatibilities/Notes
* If you're using the Atlantis Docker image and aren't setting the `--default-tf-version` flag
  then the default version of Terraform will now be 1.0. Simply set the above
  flag to your desired default version to avoid any issues.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.1/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.1/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.1/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.1/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.17.1`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Github Container Registry
[`ghcr.io/runatlantis/atlantis:v0.17.1`](https://github.com/runatlantis/atlantis/pkgs/container/atlantis)

## Diff v0.17.0..v0.17.1
https://github.com/runatlantis/atlantis/compare/v0.17.0...v0.17.1


# v0.17.0
Feature release encompassing this version's pre-release with some bug fixes and improvements that make this stable.

## Features/Improvements
* Add `--enable-policy-checks` which adds a policy checking step to the Atlantis workflow and runs server-side conftest policies on the terraform plan output. ([#1317](https://github.com/runatlantis/atlantis/pull/1317) by @msarvar and @nishkrishnan)
    - Supports `atlantis approve_policies` which allows a set of blessed github users to approve failing policies.
* Support pre-workflow hooks on all comment/auto triggered commands ([#1418](https://github.com/runatlantis/atlantis/pull/1418) by @nishkrishnan)
* Add branch allowlist matcher to server side repo config ([#1383](https://github.com/runatlantis/atlantis/pull/1383) by @dghubble)
* Add support for regex commands ([#1419](https://github.com/runatlantis/atlantis/pull/1419) by @bewie)
* Add support for a global apply lock ([#1473](https://github.com/runatlantis/atlantis/pull/1473) by @msarvar)
* Add structured logging support ([#1467](https://github.com/runatlantis/atlantis/pull/1467) by @nishkrishnan)
* Ensure policy checks is its own apply requirement ([#1499](https://github.com/runatlantis/atlantis/pull/1499) by @nishkrishnan)
* Add `--silence-no-projects` which silences Atlantis from responding to PRs when there are no projects ([#1469](https://github.com/runatlantis/atlantis/pull/1469) by @GenPage)
* Add plan summary to unfolded part of the comment ([#1518](https://github.com/runatlantis/atlantis/pull/1518) by @wkrysmann)
* Add `--autoplan-file-list` which allows modifying the global list of files that trigger project planning ([#1475](https://github.com/runatlantis/atlantis/pull/1475) by @Omicron7)
* Add server-side repo config support to delete the source branch when automerge is configured ([#1357](https://github.com/runatlantis/atlantis/pull/1357) by @tapaszto)

## Bug Fixes
* Fix output for Terraform 0.14 projects not filtering out refreshing of state. ([#1352](https://github.com/runatlantis/atlantis/pull/1352) by @mathcantin)

## Dependencies
* Upgrade conftest binary version to 0.23 ([#1516](https://github.com/runatlantis/atlantis/pull/1516) by @msarvar)
* Upgrade default tf version to 0.15.1 and add latest patch versions for old terraform minor versions ([#1472](https://github.com/runatlantis/atlantis/pull/1512) by @bryantbiggs)

## Backwards Incompatibilities/Notes
* If you're using the Atlantis Docker image and aren't setting the `--default-tf-version` flag
  then the default version of Terraform will now be 0.15.1. Simply set the above
  flag to your desired default version to avoid any issues.
* Hashicorp's GPG keys were [exposed](https://discuss.hashicorp.com/t/hcsec-2021-12-codecov-security-event-and-hashicorp-gpg-key-exposure/23512). This PR adds the latest patch versions for each Terraform minor version which has new keys.


## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.0/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.0/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.0/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.0/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.17.0`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.16.1..v0.17.0
https://github.com/runatlantis/atlantis/compare/v0.16.1...v0.17.0

# v0.17.0-beta
Feature release. Due to a sizeable refactor and the number of configuration settings supported in Atlantis, this is a pre-release and should not be considered fully stable.

## Features
* Add `--enable-policy-checks` which adds a policy checking step to the Atlantis workflow and runs server-side conftest policies on the terraform plan output. ([#1317](https://github.com/runatlantis/atlantis/pull/1317) by @msarvar and @nishkrishnan)
    - Supports `atlantis approve_policies` which allows a set of blessed github users to approve failing policies.
* Support pre-workflow hooks on all comment/auto triggered commands ([#1418](https://github.com/runatlantis/atlantis/pull/1418) by @nishkrishnan)
* Add `HEAD_COMMIT` to run steps
* Update terraform version to 0.14.7

## Backwards Incompatibilities/Notes
* If you're using the Atlantis Docker image and aren't setting the `--default-tf-version` flag
  then the default version of Terraform will now be 0.14.7. Simply set the above
  flag to your desired default version to avoid any issues.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.0-beta/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.0-beta/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.0-beta/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.17.0-beta/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.17.0-beta`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.16.1..v0.17.0-beta
https://github.com/runatlantis/atlantis/compare/v0.16.1...v0.17.0-beta


# v0.16.1
Few improvements and a number of bug fixes

## Features/Improvements
* Add `--gh-app-slug` which allows fetching of gh app user. ([#1334](https://github.com/runatlantis/atlantis/pull/1334) by @nishkrishnan) (Also fixes [#1161](https://github.com/runatlantis/atlantis/issues/1161))
* Add `--disable-repo-locking` flag. ([#1340](https://github.com/runatlantis/atlantis/pull/1340) by @gezb) (Closes [#1212](https://github.com/runatlantis/atlantis/issues/1212))
* Pass atlantis/apply when there are no plans ([#1323](https://github.com/runatlantis/atlantis/pull/1323) by @raxod502-plaid)
* Update terraform version to 0.14.5

## Bugfixes
* Fix bug with error messaging and incorrect casting ([#1327](https://github.com/runatlantis/atlantis/pull/1327) by @acastle)
* Fix bug where .auto.tfvars.json files were being ignored in 0.16.0 (Fixes [#1330](https://github.com/runatlantis/atlantis/issues/1330) by @gekO)
* Fix Azure DevOps automerge by dynamically fetching user id (Fixes [#1152](https://github.com/runatlantis/atlantis/issues/1152) by @tapaszto)
* Replace slack GetChannels with GetConversations due to API deprecation (Fixes [#1210](https://github.com/runatlantis/atlantis/issues/1210) by @thlacroix)
* Set TF_WORKSPACE for remote runs to target correct workspace (Fixes [#661](https://github.com/runatlantis/atlantis/issues/661) by @m1pl)
* Fix for restricting what workflows each repo has access to without exposing custom workflow definitions (Fixes [#1358](https://github.com/runatlantis/atlantis/issues/1358) by @netguino)

## Backwards Incompatibilities / Notes:
* If you're using the Atlantis Docker image and aren't setting the `--default-tf-version` flag
  then the default version of Terraform will now be 0.14.5. Simply set the above
  flag to your desired default version to avoid any issues.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.16.1/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.16.1/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.16.1/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.16.1/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.16.1`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.16.0..v0.16.1
https://github.com/runatlantis/atlantis/compare/v0.16.0...v0.16.1


# v0.16.0

## Description
Feature release with some new flags and bugfixes.

This release is thanks to our new Atlantis maintainer team:
* [@chenrui333](https://github.com/chenrui333)
* [@nishkrishnan](https://github.com/nishkrishnan)
* [@acastle](https://github.com/acastle)
* [@unRob](https://github.com/unRob)
* [@jamengual](https://github.com/jamengual)

## Features
* Allow configuring number of concurrent plans/applies via new `-parallel-pool-size` flag ([#1177](https://github.com/runatlantis/atlantis/pull/1177) by @dmattia)
* Add new flag `-disable-apply` that will disable the ability to run all applies ([#1230](https://github.com/runatlantis/atlantis/pull/1230) by @gezb)
* This release will release with an arm64 binary ([#1291](https://github.com/runatlantis/atlantis/pull/1291) by @pgroudas)
* Add `pre_workflow_hooks` steps to allow for running custom scripts before workflow execution ([#1255](https://github.com/runatlantis/atlantis/pull/1255) by @msarvar)
* Update default Terraform version to 0.14.3

## Bugfixes
* Fix bug checking for up to date branches when using GitHub App installation and `-checkout-strategy=merge` (Fixes [#1236](https://github.com/runatlantis/atlantis/issues/1236) by @nishkrishnan)
* Fix version detection for versions with prereleases when running Terraform >= 0.12.0 (Fixes [#1276](https://github.com/runatlantis/atlantis/issues/1276) by @acastle)
* Fix bug detecting Terraform files ([#1253](https://github.com/runatlantis/atlantis/pull/1253) by @surminus)

## Backwards Incompatibilities / Notes:
* If you're using the Atlantis Docker image and aren't setting the `--default-tf-version` flag
  then the default version of Terraform will now be 0.14.3. Simply set the above
  flag to your desired default version to avoid any issues.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.16.0/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.16.0/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.16.0/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.16.0/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.16.0`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.15.1..v0.16.0
https://github.com/runatlantis/atlantis/compare/v0.15.1...v0.16.0

# v0.15.1

## Description
Bugfix release.

## Bugfixes
* Fix `required_version` detection not working for Terraform 0.13.0 ([#1153](https://github.com/runatlantis/atlantis/issues/1153) by @joerx)
* Fix editing comments on draft PRs causing plan to re-run ([#1194](https://github.com/runatlantis/atlantis/issues/1194))
* Fix Azure DevOps apply status checks not working ([#1172](https://github.com/runatlantis/atlantis/issues/1172) by @acastle)
* Fix checkout-strategy=merge not working when using the GitHub app installation ([#1193](https://github.com/runatlantis/atlantis/issues/1193) by @nishkrishnan)

## Backwards Incompatibilities / Notes:
* If you're using the Atlantis Docker image and aren't setting the `--default-tf-version` flag
  then the default version of Terraform will now be 0.13.4. Simply set the above
  flag to your desired default version to avoid any issues.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.15.1/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.15.1/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.15.1/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.15.1/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.15.1`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.15.0..v0.15.1
https://github.com/runatlantis/atlantis/compare/v0.15.0...v0.15.1

# v0.15.0

## Description
Relatively small release with some bugfixes and a couple of features. Also sets
default Terraform version to 0.13.0.

## Features
* Bump default Terraform version to 0.13.0
* Retry GitHub calls to prevent 404 issues ([#1019](https://github.com/runatlantis/atlantis/issues/1019))
* Update GitLab library to handle rate limiting issues ([#1142](https://github.com/runatlantis/atlantis/issues/1142) by @LAKostis)
* Alpine version n Docker image is now 3.12 (up from 3.11) ([#1136](https://github.com/runatlantis/atlantis/pull/1136) by @lazzurs)
* Add new flag `--skip-clone-no-changes` that will skip cloning the repo during autoplan if there are no changes to Terraform projects.
  This will only apply for GitHub and GitLab and only for repos that have `atlantis.yaml` files. ([#1158](https://github.com/runatlantis/atlantis/pull/1158) by @cucxabong)
* Add new flag `--disable-autoplan` that will globally disable autoplanning. ([#1159](https://github.com/runatlantis/atlantis/pull/1159) by @ValdirGuerra)

## Bugfixes
* Fix `--hide-prev-plan-comments` bug ([#1009](https://github.com/runatlantis/atlantis/issues/1009) by @goodspark)
* Fix comment splitting bug ([#1109](https://github.com/runatlantis/atlantis/pull/1109) by @crainte)
* Fix Azure DevOps bug when cloning a repo with spaces in its name ([#1079](https://github.com/runatlantis/atlantis/issues/1079) by @mcdafydd)

## Backwards Incompatibilities / Notes:
* If you're using the Atlantis Docker image and aren't setting the `--default-tf-version` flag
  then the default version of Terraform will now be 0.13.0. Simply set the above
  flag to your desired default version to avoid any issues.
* `--repo-whitelist` is now deprecated in favour of `--repo-allowlist`. The previous
  flag will still work.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.15.0/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.15.0/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.15.0/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.15.0/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.15.0`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.14.0..v0.15.0
https://github.com/runatlantis/atlantis/compare/v0.14.0...v0.15.0

# v0.14.0

## Description
This release brings a big new feature: the ability to install Atlantis as a GitHub App! Thanks to [@unRob](https://github.com/unRob) for this amazing feature.

## Features
* Support installation via a GitHub App. See https://www.runatlantis.io/docs/access-credentials.html#github-app for instructions. ([#1088](https://github.com/runatlantis/atlantis/pull/1088) by @unRob)
* Add new `atlantis unlock` command that can be run on pull requests to discard all plans and unlock all projects associated with that PR. ([#1091](https://github.com/runatlantis/atlantis/pull/1091) by @parmouraly)
* Add debug-level logging for GitHub calls ([#1042](https://github.com/runatlantis/atlantis/pull/1042) by @cket)
* The repo-relative directory is now available in custom workflows via the environment variable `REPO_REL_DIR` ([#1063](https://github.com/runatlantis/atlantis/pull/1063) by @llamahunter)
* Upgrade the default Terraform version to 0.12.27.
* Update jQuery to 1.5.1 to fix a security issue with the older version.
* Update `gosu` in the Atlantis Docker image to 1.12 ([#1104](https://github.com/runatlantis/atlantis/pull/1104) by @lazzurs)
* Ignore changes to `.tflint.hcl` ([#1075](https://github.com/runatlantis/atlantis/pull/1075) by @unRob)

## Bugfixes
* `--write-git-credentials` now works with Azure DevOps ([#1070](https://github.com/runatlantis/atlantis/pull/1070) by @markbrennan)
* Partly fix `--hide-prev-plan-comments` on GitHub Enterprise ([#1072](https://github.com/runatlantis/atlantis/pull/1072) by @goodspark)
* Fix bug where Atlantis would auto-merge a PR if `apply` was run after the locks were discarded (Fixes [#1006](https://github.com/runatlantis/atlantis/issues/1006) by @parmouraly)
* Fix bug when using `--hide-prev-plan-comments` where if a plan output was split across multiple comments only the first comment would get hidden (Fixes [#1021](https://github.com/runatlantis/atlantis/issues/1021) by @crainte)

## Backwards Incompatibilities / Notes:
* If you're using the Atlantis Docker image and aren't setting the `--default-tf-version` flag
  then the default version of Terraform will now be 0.12.27. Simply set the above
  flag to your desired default version to avoid any issues.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.14.0/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.14.0/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.14.0/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.14.0/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.14.0`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.13.0..v0.14.0
https://github.com/runatlantis/atlantis/compare/v0.13.0...v0.14.0

# v0.13.0

## Description
This release enables support for running plans and applies in parallel **only when using Terraform workspaces**.
It also enables graceful shutdown for Atlantis where it waits for in-progress plans and applies to complete.
See below for the complete list.

## Features
* Upgrade default Terraform version in Docker image to 0.12.26.
* Add support for parallel plans and applies ([#926](https://github.com/runatlantis/atlantis/pull/926) by @Fauzyy)

  Running in parallel is only supported if you're using workspaces to separate your projects.
  Projects in separate directories can **not** be run in parallel currently.
  To use, set

  ```yaml
  parallel_plan: true
  parallel_apply: true
  ```

  In your repo-level `atlantis.yaml` file.
* Add support for graceful shutdown ([#1051](https://github.com/runatlantis/atlantis/pull/1051) by @benoit74).
  When Atlantis receive a SIGINT or SIGTERM it won't shut down immediately. It will wait for
  in-progress plans and applies to complete. Any new actions, e.g. comments or autoplans
  will be refused and an error comment will be posted to the PR indicating that Atlantis is shutting
  down and the user should try again later.

  In addition, a new `/status` endpoint has been added that currently only returns
  the number of in-progress operations and whether the server is shutting down.

* GitHub: A new flag `--allow-draft-prs` has been added that will re-enable the ability
  for users to run plan and apply on GitHub draft PRs. This ability was removed in
  v0.12.0. ([#1053](https://github.com/runatlantis/atlantis/pull/1053) by @cket)
* GitHub: Preserve original commit message when automerging ([#1049](https://github.com/runatlantis/atlantis/pull/1049) by @pratikmallya).

  This change removes the `[Atlantis] Automatically merging after successful apply` commit message
  and instead has GitHub autogenerate the commit message similarly to how it would when
  you click the "Merge" button in the UI.
* Change log level for HTTP requests from INFO to DBUG, e.g.
  ```
  2020/05/26 12:16:20+0000 [INFO] server: GET /healthz – respond HTTP 200
  2020/05/26 12:16:36+0000 [INFO] server: GET /healthz – from <IP>
  ```
  ([#1056](https://github.com/runatlantis/atlantis/pull/1056) by @tammert)
* GitLab: Use correct link to merge requests (previously used `#<num>` instead of `!<num>`) ([#1059](https://github.com/runatlantis/atlantis/pull/1059) by @EppO)

## Bugfixes
* Azure DevOps: Project links link to pull requests now (Fixes [#957](https://github.com/runatlantis/atlantis/issues/957) by @mcdafydd)
* GitHub: Release locks when GitHub draft PRs are closed ([#1038](https://github.com/runatlantis/atlantis/pull/1038) by @andrewring)
* Ensure git-lfs is in our Docker image (Fixes [#1054](https://github.com/runatlantis/atlantis/pull/1054))

## Backwards Incompatibilities / Notes:
* If you're using the Atlantis Docker image and aren't setting the `--default-tf-version` flag
  then the default version of Terraform will now be 0.12.26. Simply set the above
  flag to your desired default version to avoid any issues.
* HTTP requests are now logged as DBUG instead of INFO to reduce log spam. If you
  still want to see these logs you must run with `--log-level=debug`.
* Atlantis will no longer immediately shutdown when it receives a SIGINT or SIGTERM,
  it will now wait for in-progress plans and applies to complete. To stop Atlantis
  without waiting, send a SIGKILL.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.13.0/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.13.0/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.13.0/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.13.0/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.13.0`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.12.0..v0.13.0
https://github.com/runatlantis/atlantis/compare/v0.12.0...v0.13.0

# v0.12.0

## Description
This release contains one much-awaited GitHub-only feature: the ability to hide previous
plan comments with the `--hide-prev-plan-comments` flag. It also contains
a host of other small features and fags.

## Features
* GitHub: Add `--hide-prev-plan-comments` flag. When set, previous plan comments will be marked as outdated in GitHub's UI.
  This collapses them making a PR with lots of plan comments easier to read. ([#994](https://github.com/runatlantis/atlantis/pull/994) by @goodspark)
* GitHub: Ignore draft PRs until they're changed to "ready for review". ([#977](https://github.com/runatlantis/atlantis/pull/977) by @cket)
* Upgrade default Terraform version in Docker image to 0.12.24.
* Set `as_user` param when sending slack notifications so the message is decorated appropriately ([#907](https://github.com/runatlantis/atlantis/pull/907) by @tmcevoy14)
* Add Git LFS support ([#872](https://github.com/runatlantis/atlantis/pull/872) by @remilapeyre)
* Add `--silence-vcs-status-no-plans` flag that silences VCS commit status when autoplan finds no projects to plan.
  When set, Atlantis won't create any VCS statuses if there no projects to plan. ([#959](https://github.com/runatlantis/atlantis/pull/959) by @cket)
* Add `--disable-markdown-folding` flag that disables folding for long plan/apply outputs. ([#960](https://github.com/runatlantis/atlantis/pull/960) by @mhumeSF)
* Ignore casing when setting log levels, e.g. `--log-level=INFO` now works. ([#976](https://github.com/runatlantis/atlantis/pull/976) by @jpreese)
* Azure DevOps: Add policy checking. ([#984](https://github.com/runatlantis/atlantis/pull/984) by @jpreese)
* Upgrade boltdb to latest maintained version. ([#992](https://github.com/runatlantis/atlantis/pull/992) by @amasover)

## Bugfixes
* Azure DevOps: Prevent pull request updated events from triggering autoplan when the event was caused by a change in approvals. (Fixes [#946](https://github.com/runatlantis/atlantis/issues/946) by @mcdafydd)

## Backwards Incompatibilities / Notes:
* GitHub draft PRs are now ignored until they're marked "ready for review" and opened as regular PRs.
  **NOTE: ** This functionality was added back in Atlantis v0.13.0 via the `--allow-draft-prs` flag.
* If you're using the Atlantis Docker image and aren't setting the `--default-tf-version` flag
  then the default version of Terraform will now be 0.12.24. Simply set the above
  flag to your desired default version to avoid any issues.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.12.0/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.12.0/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.12.0/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.12.0/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.12.0`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.11.1..v0.12.0
https://github.com/runatlantis/atlantis/compare/v0.11.1...v0.12.0

# v0.11.1

## Description
Using the latest Alpine Docker image (3.11) to mitigate some vulnerabilities
in that image.

## Security
* Use Alpine 3.11 to mitigate:
    1. CVE-2019-5482: `curl <7.66.0-r0` https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5482
    2. CVE-2019-5481: `curl <7.66.0-r0` https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5481
    3. CVE-2019-15903: `expat <2.2.7-r1` and `git <2.22.0r0`  https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-15903
    4. CVE-2018-20843: `expat <2.2.7-r0` and `git <2.22.0-r0`  https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-20843
    5. CVE-2019-14697: `musl <1.1.22-r3` https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-14697

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.11.1/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.11.1/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.11.1/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.11.1/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.11.1`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.11.0..v0.11.1
https://github.com/runatlantis/atlantis/compare/v0.11.0...v0.11.1

# v0.11.0

## Description
Small release with a couple new config flags from contributors.

## Features
* Upgrade default Terraform version in Docker image to 0.12.19.
* Add new `--tf-download-url` flag to allow overriding the default download base URL of `https://releases.hashicorp.com`.
  ([#787](https://github.com/runatlantis/atlantis/pull/787) by @cullenmcdermott)
* Add new `--vcs-status-name` flag to allow configuring the name Atlantis uses for its
  PR statuses. Useful if running multiple Atlantis servers on the same repo. ([#841](https://github.com/runatlantis/atlantis/pull/841) by @js-timbirkett)
* Add new `--silence-fork-pr-errors` flag to silence errors from fork PRs in
  orgs that use fork PRs for non-terraform changes. ([#885](https://github.com/runatlantis/atlantis/pull/885) by @kinghrothgar)

## Bugfixes
* Fix Atlantis Dockerfile subcommand detection (Fixes [#870](https://github.com/runatlantis/atlantis/issues/870) by @sparky005)
* Fix `--write-git-creds` command for BitBucket modules (Fixes [#873](https://github.com/runatlantis/atlantis/issues/873) by @ImperialXT)
* Fix issue where Atlantis was failing on Azure DevOps PRs with branch protection (Fixes [#880](https://github.com/runatlantis/atlantis/issues/880) by @mcdafydd)
* Fix issue where project's set with an absolute dir, e.g. `dir: /a/b/c` would actually use
  that directory instead of making it relative to the reo root (Fixes [#849](https://github.com/runatlantis/atlantis/issues/849)).
* Fix issue where changes to `terragrunt.hcl` files weren't being detected when
  using `atlantis.yaml` files (Fixes [#803](https://github.com/runatlantis/atlantis/issues/803) by @JoshiiSinfield)

## Backwards Incompatibilities / Notes:
* If you're using the Atlantis Docker image and aren't setting the `--default-tf-version` flag
  then the default version of Terraform will now be 0.12.19. Simply set the above
  flag to your desired default version to avoid any issues.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.11.0/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.11.0/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.11.0/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.11.0/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.11.0`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.10.2..v0.11.0
https://github.com/runatlantis/atlantis/compare/v0.10.2...v0.11.0

# v0.10.2

## Description
Some small features in this release and some bug fixes.
* Exclusions are now supported in `when_modified` config so you can ignore changes
  in files that you don't want to trigger plan on.
* Emojis are now supported in Azure DevOps 🎉.

## Features
* Upgrade Terraform in Docker image to 0.12.16.
* Add support for [kustomize](https://kustomize.io/) ([#785](https://github.com/runatlantis/atlantis/pull/785) by @tobbbles)
* Use emojis in comments for Azure DevOps ([#863](https://github.com/runatlantis/atlantis/pull/863) by @mcdafydd)
* Allow exclusions to be specified in `when_modified`, e.g. `when_modified: ["!this-file.tf"]` ([#847](https://github.com/runatlantis/atlantis/pull/847) by @leonsodhi-lf)
* When using `--checkout-strategy=merge` warn users if the branch they're merging into has been updated ([#804](https://github.com/runatlantis/atlantis/issues/804) by @MRinalducci)

## Bugfixes
* Support `/` in branch names for Azure DevOps (Fixes [#835](https://github.com/runatlantis/atlantis/issues/835) by @mcdafydd)
* Fix bug where a server-side workflow with the name "default" wasn't being used (Fixes [#860](https://github.com/runatlantis/atlantis/issues/860))
* Fix GitLab error due to API updates (Fixes [#864](https://github.com/runatlantis/atlantis/issues/846))

## Backwards Incompatibilities / Notes:
* If you're using the Atlantis Docker image and aren't setting the `--default-tf-version` flag
  then the default version of Terraform will now be 0.12.16. Simply set the above
  flag to your desired default version to avoid any issues.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.10.2/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.10.2/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.10.2/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.10.2/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.10.2`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.10.1..v0.10.2
https://github.com/runatlantis/atlantis/compare/v0.10.1...v0.10.2

# v0.10.1

## Description
Small release that is built using Go 1.13.3 to mitigate a
CVE (https://99designs.ca/blog/engineering/request-smuggling/).

## Features
* Error out when user has an atlantis.yml file (wrong extension, needs .yaml) ([#816](https://github.com/runatlantis/atlantis/pull/816) by @mdcurran)

## Bugfixes
None

## Backwards Incompatibilities / Notes:
If you had an `atlantis.yml` file (note the `.yml` extension), previously Atlantis ignored it.
Now it will error to warn you that it's not being used.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.10.1/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.10.1/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.10.1/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.10.1/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.10.1`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.10.0..v0.10.1
https://github.com/runatlantis/atlantis/compare/v0.10.0...v0.10.1

# v0.10.0

## Description
Lots of new features in this release: Azure DevOps support,
automatic Terraform version detection and private module cloning support.
All by community contributors!

## Features
* Support for Azure DevOps ([719](https://github.com/runatlantis/atlantis/pull/719) by @mcdafydd)
* Support detecting Terraform version from `terraform { required_version = "=<version>" }` block ([#789](https://github.com/runatlantis/atlantis/pull/789) by @kennethtxytqw)
* Improve `--write-git-creds` command so that it supports ssh private modules ([#799](https://github.com/runatlantis/atlantis/pull/799) by @ImperialXT)
* Default TF version is now 0.12.12
* Logo is now bigger on locks listing ([#783](https://github.com/runatlantis/atlantis/pull/783) by @Nuru)

## Bugfixes
* Fix error when using GitLab with the "Delete source branch" setting (Fixes [#760](https://github.com/runatlantis/atlantis/issues/760))
* Fix repo whitelist when using wildcard in the middle, ex. `github.com/*-something` (Fixes [#692](https://github.com/runatlantis/atlantis/issues/692) by @dedamico)

## Backwards Incompatibilities / Notes:
* If you're using the Atlantis Docker image and aren't setting the `--default-tf-version` flag
  then the default version of Terraform will now be 0.12.12. Simply set the above
  flag to your desired default version to avoid any issues.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.10.0/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.10.0/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.10.0/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.10.0/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.10.0`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.9.0..v0.10.0
https://github.com/runatlantis/atlantis/compare/v0.9.0...v0.10.0

# v0.9.0

## Description
This release contains a new step for custom workflows called `env`. It allows
users to set environment variables statically and dynamically for their workflows:
```yaml
workflows:
  env:
    plan:
      steps:
      - env:
          name: STATIC
          value: set-statically
      - env:
          name: DYNAMIC
          command: echo set-dynamically
      - run: echo $STATIC $DYNAMIC # outputs 'set-statically set-dynamically'
```

## Features
* New `env` step in custom workflows ([#751](https://github.com/runatlantis/atlantis/pull/751))
* New flag `--write-git-creds` helps Atlantis support private module sources. ([#711](https://github.com/runatlantis/atlantis/pull/711))
* Upgrade Terraform to 0.12.7 in our base Docker image.
* Support for Terragrunt > 0.19.0 ([#748](https://github.com/runatlantis/atlantis/pull/748))
* The directory where Atlantis downloads Terraform binaries is now in the PATH
of custom workflows ([#678](https://github.com/runatlantis/atlantis/pull/678))
* `dumb-init` and `gosu` upgraded in our Docker image ([#730](https://github.com/runatlantis/atlantis/pull/730))

## Bugfixes
* The Terraform version specified in `terraform_version` is now downloaded even
if there are only custom steps (Fixes [#675](https://github.com/runatlantis/atlantis/issues/675))

## Backwards Incompatibilities / Notes:
* If you're using the Atlantis Docker image and aren't setting the `--default-tf-version` flag
  then the default version of Terraform will now be 0.12.7. Simply set the above
  flag to your desired default version to avoid any issues.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.9.0/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.9.0/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.9.0/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.9.0/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.9.0`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.8.3..v0.9.0
https://github.com/runatlantis/atlantis/compare/v0.8.3...v0.9.0

# v0.8.3

## Description
This release contains an important security fix in addition to some fixes and
changes for Terraform Cloud/Enterprise users. It's highly recommended that all
Atlantis users upgrade to this release. See the Security
section below for more details.

## Security
* Additional arguments specified in Atlantis comments, ex. `atlantis plan -- -var=foo=bar`
  are now escaped before being appended to the relevant Terraform command. (Fixes [#697](https://github.com/runatlantis/atlantis/pull/697)).
  Previously, a comment like `atlantis plan -- -var=$(touch foo)` would execute
  the `touch foo` command because the extra arguments weren't being escaped properly.
  This means anyone with comment access to an Atlantis repo could execute arbitrary
  code. Because of the severity of this issue, all users should upgrade to this version.
* Upgrade to latest version of Alpine Linux in our Docker image to mitigate
  vulnerabilities found in libssh2. (Fixes [#687](https://github.com/runatlantis/atlantis/issues/687))

## Features
* Upgrade Terraform to 0.12.3 in our base Docker image.
* Additional arguments specified in Atlantis comments, ex. `atlantis plan -- -var=foo=bar`
  are now available in custom run steps as the `COMMENT_ARGS` environment variable. (Fixes [#670](https://github.com/runatlantis/atlantis/issues/670))
* A new flag `--tfe-hostname` is available for specifying a Terraform Enterprise private installation's hostname
  when using the remote backend integration. ([#706](https://github.com/runatlantis/atlantis/pull/706))

## Bugfixes
* Parse Bitbucket Cloud pull request rejected events properly. (Fixes [#676](https://github.com/runatlantis/atlantis/issues/676))
* Terraform >= 0.12.0 works with Terraform Cloud/Enterprise remote operations. (Fixes [#704](https://github.com/runatlantis/atlantis/issues/704))

## Backwards Incompatibilities / Notes:
* If you were previously relying on being able to execute code in the additional
  arguments of comments, ex. `atlantis plan -- -var='foo=$(echo $SECRET)'` this
  is no longer possible. Instead you will need to write a custom workflow with a
  custom step or the extra_args config.
* If you're using the Atlantis Docker image and aren't setting the `--default-tf-version` flag
  then the default version of Terraform will now be 0.12.3. Simply set the above
  flag to your desired default version to avoid any issues.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.8.3/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.8.3/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.8.3/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.8.3/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.8.3`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.8.2..v0.8.3
https://github.com/runatlantis/atlantis/compare/v0.8.2...v0.8.3

# v0.8.2

## Description
Small bugfix release for Bitbucket Cloud users running with "require mergeable".

## Features
* Update default Terraform version to 0.12.1.
* Include directory in Slack message ([#660](https://github.com/runatlantis/atlantis/issues/660)).

## Bugfixes
* Atlantis would not allow applies for all Bitbucket Cloud pull requests if running with "require mergeable"
  even if the pull request *was* mergeable due to an API change. (Fixes [#672](https://github.com/runatlantis/atlantis/issues/672))

## Backwards Incompatibilities / Notes:
* If you're using the Atlantis Docker image and aren't setting the `--default-tf-version` flag
  then the default version of Terraform will now be 0.12.1. Simply set the above
  flag to your desired default version to avoid any issues.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.8.2/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.8.2/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.8.2/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.8.2/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.8.2`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.8.1..v0.8.2
https://github.com/runatlantis/atlantis/compare/v0.8.1...v0.8.2

# v0.8.1

## Description
Small bugfix release for Bitbucket Cloud users running with require approval.

## Features
None

## Bugfixes
* Atlantis would panic when checking if pull requests were approved for Bitbucket
  Cloud due to an API change. (Fixes [#652](https://github.com/runatlantis/atlantis/issues/652))

## Backwards Incompatibilities / Notes:
None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.8.1/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.8.1/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.8.1/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.8.1/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.8.1`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.8.0..v0.8.1
https://github.com/runatlantis/atlantis/compare/v0.8.0...v0.8.1

# v0.8.0

## Description
This release upgrades the default version of Terraform to 0.12.
If you're running Atlantis with the `--default-tf-version` flag set (which
you always should) then this won't affect you at all.

## Features
* Upgrade default Terraform version to 0.12
* Add new `--disable-apply-all` flag that disables running `atlantis apply`
  without any flags. ([#645](https://github.com/runatlantis/atlantis/pull/645))

## Bugfixes
None

## Backwards Incompatibilities / Notes:
* If you're using the Atlantis Docker image and aren't setting the `--default-tf-version` flag
  then the default version of Terraform will now be 0.12. Simply set the above
  flag to your desired default version of Terraform and 0.12 won't be used.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.8.0/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.8.0/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.8.0/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.8.0/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.8.0`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.7.2..v0.8.0
https://github.com/runatlantis/atlantis/compare/v0.7.2...v0.8.0

# v0.7.2

## Description
Small release containing an important security fix and some bugfixes.

## Features
None

## Bugfixes
* Atlantis would post its Git credentials as pull request comment and in logs if the git clone failed. (Fixes [#615](https://github.com/runatlantis/atlantis/issues/615))
* Atlantis would comment the same output twice during errors of custom run steps. (Fixes [#519](https://github.com/runatlantis/atlantis/issues/519))
* `atlantis testdrive` had unreadable output on solarized terminals. (Fixes [#575](https://github.com/runatlantis/atlantis/issues/575))

## Backwards Incompatibilities / Notes:
None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.7.2/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.7.2/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.7.2/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.7.2/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.7.2`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.7.1..v0.7.2
https://github.com/runatlantis/atlantis/compare/v0.7.1...v0.7.2

# v0.7.1

## Description
Small bugfix release to fix an issue when using `--checkout-strategy=merge`.

## Features
* `PROJECT_NAME` is now available as an environment variable to custom `run` steps. ([#578](https://github.com/runatlantis/atlantis/pull/578))

## Bugfixes
* Fix deleting unapplied plans when `--checkout-strategy=merge` is used. (Fixes [#582](https://github.com/runatlantis/atlantis/issues/582))

## Backwards Incompatibilities / Notes:
None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.7.1/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.7.1/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.7.1/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.7.1/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.7.1`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.7.0..v0.7.1
https://github.com/runatlantis/atlantis/compare/v0.7.0...v0.7.1

# v0.7.0

## Description
This release implements Server-Side Repo Config which allows users to write
`atlantis.yaml`-style config on the server rather than in individual repos.
The Server Side config also allow Atlantis operators to control what individual
repos can do in their `atlantis.yaml` files. Read [docs](https://www.runatlantis.io/docs/server-side-repo-config.html) for more details.

## Features
* Server-Side Repo Config. Read [docs](https://www.runatlantis.io/docs/server-side-repo-config.html)
  and [use cases](https://www.runatlantis.io/docs/server-side-repo-config.html#use-cases) for full details. ([#47](https://github.com/runatlantis/atlantis/issues/47))
  * New flag `atlantis server` flag `--repo-config` for specifying the
    repo config file .
  * New flag `--repo-config-json` for specifying the repo config as a JSON string
    instead of having to write a config file to disk.
  * All repos can now create `atlantis.yaml` files to configure their projects,
    however by default, those files can't create custom workflows or set Apply
    Requirements.
* New version `3` of `atlantis.yaml` fixes a small issue with how we were parsing
  custom `run` steps. Previously we were doing additional parsing which caused some
  users to have to add extra escaping to their commands. Now this is no longer
  required. See the Backwards Compatibility section for more details.

## Bugfixes
* Fix bug where running `atlantis apply` to apply all outstanding plans wouldn't work if
  you had more than one project defined in the exact same directory and workspace. (Fixes [#365](https://github.com/runatlantis/atlantis/issues/365))

## Backwards Incompatibilities / Notes:
* The server-side config changes are fully backwards compatible. The biggest
  difference is that all repos can now create `atlantis.yaml` files, but without
  being able to create custom workflows or set apply requirements. This will
  allow users to configure their projects, workspaces and terraform versions
  at a repo level without enabling those repos to run custom code or circumvent
  apply requirements set server-side.
* `atlantis.yaml` has a new version `3`. If you continue to use version `2`, you
  will experience no changes. If you want to upgrade to version `3`, then
  if you're not using any custom `run` steps in your workflows you can upgrade
  the version number without additional changes.

  If you are using `run` steps, check our [upgrade guide](https://www.runatlantis.io/docs/upgrading-atlantis-yaml.html#upgrading-from-v2-to-v3)
  to see if you need to make any changes before upgrading.
* Flags `--require-approval`, `--require-mergeable` and `--allow-repo-config` are
  deprecated in favour of creating a server-side repo config file that applies
  the same configuration. If you run `atlantis server` with those flags, a
  deprecation warning will be printed telling you what server-side config is
  recommended instead.
* If you have projects configured with the same directory and workspace (which means
  you're probably using the `-backend-config` flag) **and** their names contain `/`'s,
  then you'll have to re-run `atlantis plan` after upgrading if you had any unapplied plans.

  An example of what config would mean you need to re-plan:
  ```yaml
  projects:
  - name: name/with/slashes
    dir: samedir
    workflow: a
  - name: another/with/slashes
    dir: samedir
    workflow: b
  a:
     plan:
       steps:
       - run: rm -rf .terraform
       - init:
           extra_args: [-backend-config=staging.backend.tfvars]
       - plan
  b:
     plan:
       steps:
       - run: rm -rf .terraform
       - init:
           extra_args: [-backend-config=staging.backend.tfvars]
       - plan
  ```

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.7.0/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.7.0/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.7.0/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.7.0/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.7.0`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.6.0..v0.7.0
https://github.com/runatlantis/atlantis/compare/v0.6.0...v0.7.0

# v0.6.0

## Description
This release introduces a new flag `--default-tf-version=<version>` that allows users
to set the version of Terraform that Atlantis defaults to. Atlantis will automatically
download that version on startup so users don't need to build their own custom
Docker images.

Atlantis will also now automatically download any Terraform version specified in
`atlantis.yaml`:
```yaml
version: 2
projects:
- dir: .
  terraform_version: v0.12.0-beta1 # Will be downloaded automatically.
```

## Features
* New flag: `--default-tf-version=<version>` will cause Atlantis to automatically download
  and use that version of Terraform by default. Atlantis will also automatically
  download terraform versions specified in `atlantis.yaml` via the `terraform_version`
  config key. ([#538](https://github.com/runatlantis/atlantis/pull/538))
* New status check names mean that the Atlantis checks will appear together (at least on GitHub).
  ([#545](https://github.com/runatlantis/atlantis/pull/545))
* Upgrade base Docker image to use Alpine 3.9. Alpine 3.9 mitigates
  [CVE-2018-19486](https://nvd.nist.gov/vuln/detail/CVE-2018-19486). ([#541](https://github.com/runatlantis/atlantis/pull/541))

## Bugfixes
None

## Backwards Incompatibilities / Notes:
* Our Docker image `runatlantis/atlantis` has Terraform `v0.11.13` now. If you
  use the new flag `--default-tf-version=<desired version>` then you won't
  be affected by this change (nor for subsequent version upgrades).
* The Atlantis status checks have been renamed from what they looked like in `v0.5.*`.
  Previously the names were: `plan/atlantis` and `apply/atlantis`. Now the
  names are `atlantis/plan` and `atlantis/apply`.

  This change will only affect you if you're requiring those status checks to pass via a setting in
  your Git host (ex. via GitHub protected branches). If so, you'll need to change
  your settings to require the new names to pass and un-require the old names.

  > If you were on a version lower than `v0.5.*` then read the backwards compatibility
    notes for release `0.5.0`.

  **NOTE from the maintainer**: I take backwards compatibility seriously and I
  apologize that the status checks are changing again so soon after the 0.5 release
  also changed them. I know that if you have many repos and require the checks
  to pass that it is a large task to change them all again.

  In this case, I decided that the tradeoff was worth it because the
  0.5 release has only been out for a couple of weeks so hopefully not everyone
  has upgraded to it. The new check names makes them a lot easier to read
  (at least on GitHub) because they appear next to each other now due to
  alphabetical sorting. In this case I felt like it was better to get this change
  done as soon as possible rather than having this annoying UX issue stay around
  forever.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.6.0/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.6.0/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.6.0/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.6.0/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.6.0`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

## Diff v0.5.1..v0.6.0
https://github.com/runatlantis/atlantis/compare/v0.5.1...v0.6.0

# v0.5.1

## Description
This is a bugfix release to fix a bug where Atlantis was replying to comments
that weren't directed to it.

Diff: https://github.com/runatlantis/atlantis/compare/v0.5.0...v0.5.1

## Features
* On Bitbucket Cloud and Server, Atlantis now responds if it's invoked with the
  username it's running under, ex. @my-bb-atlantis-user. This is the same
  functionality as GitHub and GitLab. ([#534](https://github.com/runatlantis/atlantis/pull/534))

## Bugfixes
* Atlantis ignore comments that aren't addressed to it. (Fixes [#533](https://github.com/runatlantis/atlantis/issues/533))

## Backwards Incompatibilities / Notes:
* On Bitbucket Cloud and Server, Atlantis now responds if it's invoked with the
  username it's running under, ex. @my-bb-atlantis-user. This is the same
  functionality as GitHub and GitLab.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.5.1/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.5.1/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.5.1/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.5.1/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.5.1`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

# v0.5.0

## Description
This release has two big features: New Status Checks and Terraform Enterprise
Integration.

**New Status Checks:**

The new status checks split the old status check into `plan` and `apply` phases.
Each check now tracks the status of each project modified in the pull request.
For example if two projects are modified, the `plan` check might read:
> 2/2 projects planned successfully.

And the `apply` check might read:
> 0/2 projects applied successfully.

Users can now use their Git host's settings to require these checks pass
before a pull request is merged and be confident that all changes have been
applied (for example).

**Terraform Enterprise Integration:**

Atlantis now integrates with the Terraform Enterprise (TFE)
via the [remote backend](https://www.terraform.io/docs/backends/types/remote.html).
Atlantis will run `terraform` commands as usual, however those commands will
actually be executed *remotely* in Terraform Enterprise.

Using Atlantis with Terraform Enterprise gives you access to TFE features like:
* Real-time streaming output
* Ability to cancel in-progress commands
* Secret variables
* [Sentinel](https://www.hashicorp.com/sentinel)
Without having to change your pull request workflow.

Diff: https://github.com/runatlantis/atlantis/compare/v0.4.15...v0.5.0

## Features
* Split single status check into one for `plan` and one for `apply` (see above).
* Support using Atlantis with Terraform Enterprise via
 [remote operations](https://www.terraform.io/docs/backends/operations.html) (see above).
* Add `USER_NAME` environment variable for custom steps to use. ([#489](https://github.com/runatlantis/atlantis/pull/489))
* Support Bitbucket Cloud's upcoming API deprecations. ([#502](https://github.com/runatlantis/atlantis/pull/502))
* Support Bitbucket Server hosted at a basepath, ex. `bitbucket.mycompany.com/pathprefix` (Fixes [#508](https://github.com/runatlantis/atlantis/issues/508))

## Bugfixes
* Allow Bitbucket Server diagnostics checks. (Fixes [#474](https://github.com/runatlantis/atlantis/issues/474))
* Fix automerge for Bitbucket Server. (Fixes [#479](https://github.com/runatlantis/atlantis/issues/479))
* Run `terraform init` with `-upgrade`. (Fixes [#443](https://github.com/runatlantis/atlantis/issues/443))
* If a pull request is deleted in Bitbucket Server, delete locks. (Fixes [#498](https://github.com/runatlantis/atlantis/issues/498))
* Support directories with spaces, ex `atlantis plan -d 'dir with spaces'`. (Fixes [#423](https://github.com/runatlantis/atlantis/issues/423))
* Ignore Terragrunt cache directories that were causing duplicate applies. (Fixes [#487](https://github.com/runatlantis/atlantis/issues/487))
* Fix `atlantis testdrive` for latest version of ngrok.

## Backwards Incompatibilities / Notes:
* **New Status Checks** - If you have settings in your Git host that require the Atlantis commit status
  check to be in a certain condition, you will need to modify that setting as follows:

  Previously, Atlantis set a single check with the name `Atlantis`. Now there are
  two checks with the names `plan/atlantis` and `apply/atlantis`. If you had
  previously required the `Atlantis` check to pass, you should now require both
  the `plan/atlantis` and `apply/atlantis` checks to pass.

  The behaviour has also changed. Previously, the single Atlantis check
  would represent the status of the **last
  run command**. For example, if I ran `atlantis plan` and it failed, the check
  would be in a *Failed* state. If I ran `atlantis apply -p project1` and it succeeded,
  then the check would be in a *Success* state, regardless of the status of other projects
  in the pull request.

  Now, each check represents the plan/apply status of **all** projects modified in
  the pull request. For example, say I open up a pull request that modifies
  two projects, one in directory `proj1` and the other in `proj2`. If autoplanning
  is enabled, and both plans succeed, then there will be a single status check:
  * `plan/atlantis - 2/2 projects planned successfully` (success)

  If I run `atlantis apply -d proj1`, then Atlantis will set a pending apply check:
  * `plan/atlantis - 2/2 projects planned successfully` (success)
  * `apply/atlantis - 1/2 projects applied successfully` (pending)

  If I apply the final project with `atlantis apply -d proj2`, then my checks
  will look like:
  * `plan/atlantis - 2/2 projects planned successfully` (success)
  * `apply/atlantis - 2/2 projects applied successfully` (success)

* `terraform init` is now run with `-upgrade=true`. Previously, it used Terraform's
  default setting which was `false`.

  This means that `terraform` will always update to the latest version of plugins
  and modules. For example, if you're using a module source of
    ```hcl
    source = "git::https://example.com/vpc.git?ref=master"
    ```
  then `terraform init` will now always use the version on `master` whereas
  previously, if you had already run `atlantis plan` before `master` was updated,
  a new `atlantis plan` wouldn't pull the latest changes and would just use
  the cached version.

  This is unlikely to cause any issues because most users already expected Atlantis
  to use the most up-to-date version of modules/plugins within the set constraints.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.5.0/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.5.0/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.5.0/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.5.0/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.5.0`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

# v0.4.15

## Description
This is a bugfix release containing an important fix to how Atlantis executes Terraform. A
bug was introduced in v0.4.14 that causes Atlantis to hang indefinitely when
executing Terraform when there is a lot of output from Terraform.

In addition, there's a fix to automerge when you require rebasing or commit
squashing in GitHub and a fix for the mergeability check if you're requiring
the Atlantis status to pass in GitHub.

Diff: https://github.com/runatlantis/atlantis/compare/v0.4.14...v0.4.15

## Features
None – this is a bugfix release.

## Bugfixes
* Atlantis hangs on large plans. (Fixes [#474](https://github.com/runatlantis/atlantis/issues/474))
* Automerge now works on GitHub if you require a rebase or squash merge. ([#466](https://github.com/runatlantis/atlantis/pull/466))
* Automerge now works on Bitbucket if previously you were getting XSRF errors. (Fixes [#465](https://github.com/runatlantis/atlantis/issues/465))
* Requiring `mergeable` now works on GitHub if you are also requiring the Atlantis status to pass before merging. (Fixes [#453](https://github.com/runatlantis/atlantis/issues/453))

## Backwards Incompatibilities / Notes:
None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.15/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.15/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.15/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.15/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.4.15`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

# v0.4.14

## Description
**WARNING:** This release contains a bug that causes Terraform execution to stall
on large infrastructures. Please use v0.4.15 instead.

This release contains two big new features: Automerge and Checkout Strategy.

Automerge is a much asked for feature that allows Atlantis to automatically
merge your pull requests if all plans have been applied successfully.
It can be enabled via the `--automerge` flag, or via an `atlantis.yaml` setting:
```yaml
version: 2
automerge: true
projects:
- ...
```

Checkout Strategy allows you to choose if Atlantis checks out the exact branch
from the pull request or what the destination branch will look like once the pull
request is merged. You can choose your checkout strategy via the `--checkout-strategy`
flag which supports `branch` (the default) or `merge`.

Diff: https://github.com/runatlantis/atlantis/compare/v0.4.13...v0.4.14

## Features
* Can now be configured to **automatically merge pull requests** after all plans have
  been applied. See https://www.runatlantis.io/docs/automerging.html. (Fixes [#186](https://github.com/runatlantis/atlantis/issues/186))
* New `--checkout-strategy` flag which supports checking out the code as it will
  look once the pull request was merged. Previously we only supported checking out
  the pull request branch which might be out of date with the destination branch
  and so cause Terraform to delete resources that have already been applied.
  See https://www.runatlantis.io/docs/checkout-strategy.html. (Fixes [#35](https://github.com/runatlantis/atlantis/issues/35)
* Support Terraform 0.12 by version detection and then changing how Atlantis runs
  its Terraform commands. ([#419](https://github.com/runatlantis/atlantis/pull/419))
* New `--tfe-token` flag to support using Terraform Enterprise's Free Remote State Storage. ([#419](https://github.com/runatlantis/atlantis/pull/419))

## Bugfixes
* Run plan in directory when file is moved. (Fixes [#413](https://github.com/runatlantis/atlantis/issues/413))
* Fix bug where when Terraform crashed, Atlantis would hang indefinitely. ([#421](https://github.com/runatlantis/atlantis/pull/421))

## Backwards Incompatibilities / Notes:
None

## Downloads
**The release downloads have been deleted because this release contains a critical bug**

## Docker
**The release downloads have been deleted because this release contains a critical bug**

# v0.4.13

## Description
This release is focused on quick-wins, bugfixes and one new feature that allows
users to require pull requests be "mergeable", before allowing for `atlantis apply`.

The mergeable apply requirement is very useful for GitHub users where it allows
them to require pull requests be approved by specific users or require certain
status checks to pass. See https://www.runatlantis.io/docs/apply-requirements.html#mergeable for
more information.

Diff: https://github.com/runatlantis/atlantis/compare/v0.4.12...v0.4.13

## Features
* Introduce a new (optional) `mergeable` apply requirement that requires pull requests to be mergeable prior to allowing `apply` to run. (Fixes [#43](https://github.com/runatlantis/atlantis/issues/43))
* If users have workspaces configured for a directory via an `atlantis.yaml` file, only allow
    commands to be run on those workspaces. All commands attempted to be run on different workspaces will error out.

    For example, if I have an `atlantis.yaml` file:
    ```yaml
    version: 2
    projects:
    - dir: mydir
      workspace: default
    - dir: mydir
      workspace: staging
    ```
    Then I can run `atlantis apply -d mydir -w default` and `atlantis apply -d mydir -w staging`
    but I will receive an error if I run `atlantis apply -d mydir -w somethingelse`.

* If users are setting the `name` key for their projects in `atlantis.yaml`, then
  include the project name in the comment output so it's easier to identify which
  plan/apply output is for which project. (Fixes [#353](https://github.com/runatlantis/atlantis/issues/353)))
* Bump the Terraform version in the Docker image to `0.11.11`.
* Tweak logging to add timezone to the timestamp and make the output more readable. ([#402](https://github.com/runatlantis/atlantis/pull/402))
* Warn users if running `atlantis apply -- -target=myresource` because `-target` can
  only be specified during `atlantis plan`. (Fixes [#399](https://github.com/runatlantis/atlantis/issues/399))

## Bugfixes
* If `terraform plan` returns an error, print the error to the pull request. ([#381](https://github.com/runatlantis/atlantis/pull/381))
* Split Bitbucket Server comments into multiple comments if over the max size. (Fixes [#280](https://github.com/runatlantis/atlantis/issues/280))
* Fix issue where if users specified `--gitlab-hostname` without a scheme then Atlantis wouldn't parse the URL correctly. ([#377](https://github.com/runatlantis/atlantis/issues/377))
* Give better error message if GitLab users are commenting on commits instead of a merge request. (Fixes [#150](https://github.com/runatlantis/atlantis/issues/150), [#390](https://github.com/runatlantis/atlantis/issues/390))
* If an error occurs early in request processing, comment that error back on the pull request.
  Previously, we *were* commenting back on errors but not for errors very early in the processing. (Fixes [#398](https://github.com/runatlantis/atlantis/issues/398))

## Backwards Incompatibilities / Notes:
* The version of Terraform installed in the `runatlantis/atlantis` Docker image
  is now `0.11.11`. Previously it was `0.11.10`.
* If you are a) using an `atlantis.yaml` file and b) defining Terraform workspaces
    and c) running plan and apply against workspaces that **were not** defined in the
    `atlantis.yaml` file, then this no longer works.

    You will now need to define all the workspaces in the `atlantis.yaml` file.
    For example, say you had the following config:
    ```yaml
    version: 2
    projects:
    - dir: mydir
      workspace: production
    ```

    And you used to run:
    ```
    atlantis plan -d mydir -w anotherworkspace
    atlantis apply -d mydir -w anotherworkspace
    ```

    For this to work now, you need to add the `anotherworkspace` workspace to your
    `atlantis.yaml` file:
    ```yaml
    version: 2
    projects:
    - dir: mydir
      workspace: production
    - dir: mydir
      workspace: anotherworkspace
    ```


## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.13/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.13/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.13/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.13/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.4.13`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

# v0.4.12

## Description
Small feature and bug fix release. If you're using GitLab <11.1 then your
comment formatting is fixed!

Diff: https://github.com/runatlantis/atlantis/compare/v0.4.11...v0.4.12

## Features
- Atlantis can now be hosted behind a path-based router and its UI will still
  render correctly. For example, you could host atlantis at mydomain.com/mypath,
  then run `atlantis server --atlantis-url https://mydomain.com/mypath` and when
  atlantis renders its UI, all the URLs will have the `/mypath` prefix so the UI
  renders properly. (Fixes [#213](https://github.com/runatlantis/atlantis/issues/213))
- Log warning if GitLab hostname isn't resolvable. (Fixes [#359](https://github.com/runatlantis/atlantis/issues/359))
- Support running our official Docker image `runatlantis/atlantis` on OpenShift. OpenShift runs images
  with random uids so we needed to build in support for that. (Fixes [#345](https://github.com/runatlantis/atlantis/issues/345))

## Bugfixes
- If the output is too long for a single GitHub comment, maintain formatting when
  splitting into multiple comments. (Fixes [#111](https://github.com/runatlantis/atlantis/issues/111))
- Fix bug with using the pagination API in BitBucket. ([#354](https://github.com/runatlantis/atlantis/pull/354))
- If using GitLab < 11.1 then don't use expandable markdown comments. (Fixes [#315](https://github.com/runatlantis/atlantis/issues/315))
- Fix output from custom steps that came before the plan step from being removed. ([#367](https://github.com/runatlantis/atlantis/pull/367))

## Backwards Incompatibilities / Notes:
We made [changes](https://github.com/runatlantis/atlantis/pull/346) to the base image (`runatlantis/atlantis-base`) that
`runatlantis/atlantis` is built off of. These changes **should not** affect your
running of atlantis unless you're building your own custom images and were relying
on specific user permissions. Even then we don't anticipate any problems.

These are the changes in detail:
1. Previously, the permissions of `/home/atlantis` were:
     ```bash
     $ ls -la /home/atlantis/
     drwxr-sr-x    2 atlantis atlantis      4096 Sep 13 22:49 .
     ```
   Now they are:
    ```bash
    $ ls -la /home/atlantis/
    drwxrwxr-x    2 atlantis root          4096 Nov 28 21:22 .
    ```
   * The directory is now owned by the `root` group.
   * Its group permissions now include `w` and `x`.

   This was needed because OpenShift runs Docker images as random uid's under
   the root group and so now those random uid's can use `/home/atlantis` as their
   data directory.

1. Previously, the `atlantis` user was only part of its own group:
    ```bash
    $ gosu atlantis sh
    $ whoami
    atlantis
    $ groups
    atlantis
    ```

    Now it's also part of the `root` group:
    ```bash
    $ gosu atlantis sh
    $ groups
    atlantis root
    ```
1. Previously, the permissions for `/etc/passwd` were:
    ```bash
    $ ls -la /etc/passwd
    -rw-r--r--    1 root     root          1284 Sep 13 22:49 /etc/passwd
    ```

    Now the permissions are:
    ```bash
    $ ls -la /etc/passwd
    -rw-rw-r--    1 root     root          1284 Nov 28 21:22 /etc/passwd
    ```

    The `w` group permission was added so that in OpenShift, the random uid can write
    their own login entry (https://github.com/runatlantis/atlantis/blob/main/docker-entrypoint.sh#L28)
    which is required because `terraform` expects the running user to have an entry
    in `/etc/passwd`.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.12/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.12/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.12/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.12/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.4.12`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

# v0.4.11

## Description
Medium sized release that updates the Terraform version and makes `terraform plan`
output smaller by removing the `Refreshing...` output.

Diff: https://github.com/runatlantis/atlantis/compare/v0.4.10...v0.4.11

## Features
* Upgraded Docker image to use Terraform 0.11.10
* `terraform plan` output is shorter now thanks to remove the `Refreshing...` output ([#339](https://github.com/runatlantis/atlantis/pull/339))
* Project names specified in `atlantis.yaml` can now contain `/`'s. This is useful
if you want to name your projects similar to the directories they're in. (Fixes [#253](https://github.com/runatlantis/atlantis/issues/253))
* Added new flag `--silence-whitelist-errors` which prevents Atlantis from comment back on pull requests
from non-whitelisted repos. This is useful if you want to add the Atlantis webhook to a whole organization
and then control which repos are actioned on via the whitelist. (Fixes [#312](https://github.com/runatlantis/atlantis/issues/312))
* The message when the project is locked is now more helpful. ([#336](https://github.com/runatlantis/atlantis/pull/336))
* Run `terraform plan` with `-var atlantis_repo_owner=runatlantis -var atlantis_repo_name=atlantis -var atlantis_pull_num=10`
(if the repo was runatlantis/atlantis) ([#300](https://github.com/runatlantis/atlantis/pull/300))

## Bugfixes
* Quote plan filenames so that Bitbucket projects with spaces in their names still work (Fixes [#302](https://github.com/runatlantis/atlantis/issues/302))

## Backwards Incompatibilities / Notes:
* Atlantis now runs `terraform plan` with
    ```bash
    -var atlantis_repo_owner=runatlantis \
    -var atlantis_repo_name=atlantis \
    -var atlantis_pull_num=10
    ```

    (in this example the repo that Atlantis is running on is runatlantis/atlantis).

    If you were using those variables in your terraform code:
    ```hcl
    variable "atlantis_repo_owner" {
      default = "my_default"
    }
    ```

    Then Atlantis will be overriding those variables with its own values. To prevent
    this, you need to rename your variables.

    If you aren't using those variables then this change won't affect you.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.11/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.11/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.11/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.11/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.4.11`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

# v0.4.10

## Description
Small bugfix release to fix issues with new comment format.

Diff: https://github.com/runatlantis/atlantis/compare/v0.4.9...v0.4.10

## Features
None

## Bugfixes
* Fix bad comment rendering ([#294](https://github.com/runatlantis/atlantis/issues/294))
* Fix `plan` not working on Bitbucket Server when repo owner contains spaces ([#290](https://github.com/runatlantis/atlantis/issues/290))

## Backwards Incompatibilities / Notes:
None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.10/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.10/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.10/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.10/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.4.10`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

# v0.4.9

## Description
This release is mostly focused on changing how comments look. Terraform output
is now automatically hidden if it's over 12 lines long:
![https://user-images.githubusercontent.com/1034429/45580771-d4603b80-b849-11e8-8c4b-5984bd0bff7f.png](https://user-images.githubusercontent.com/1034429/45580771-d4603b80-b849-11e8-8c4b-5984bd0bff7f.png)
Also the red and green highlighting for added and removed resources is fixed:
![https://user-images.githubusercontent.com/1034429/45580777-d9bd8600-b849-11e8-8f2d-867fbf4e72d7.png](https://user-images.githubusercontent.com/1034429/45580777-d9bd8600-b849-11e8-8f2d-867fbf4e72d7.png)

Diff: https://github.com/runatlantis/atlantis/compare/v0.4.8...v0.4.9

## Features
* Terraform output over 12 lines is hidden in comment until expanded
* `terraform plan` output is highlighted correctly
* Terraform is now executed with `-var atlantis_repo={repo name} -var atlantis_pull_num {pull num}`.
This will allow users to trace Atlantis `terraform` executions in CloudTrail back to a specific
user and pull request if using assume role by creating a specific name for the session Terraform initiates.
```
provider "aws" {
  assume_role {
    role_arn     = "arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME"
    session_name = "${var.atlantis_user}-${var.atlantis_repo}-${var.atlantis_pull_num}"
  }
}
```

## Bugfixes
* Run terraform with `-input=false` ([#268](https://github.com/runatlantis/atlantis/issues/268)).

## Backwards Incompatibilities / Notes:
* We set two new Terraform variables: `atlantis_repo` and `atlantis_pull_num`. If
you were using variables with those names in your code you will need to rename them
in your code.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.9/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.9/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.9/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.9/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.4.9`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

# v0.4.8

## Description
Security release to upgrade the Docker image to the latest version of Alpine linux that fixes
this bug: https://justi.cz/security/2018/09/13/alpine-apk-rce.html

Diff: https://github.com/runatlantis/atlantis/compare/v0.4.7...v0.4.8

## Features
None

## Bugfixes
* Change server startup message to INFO from WARN level.

## Backwards Incompatibilities / Notes:
None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.8/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.8/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.8/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.8/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.4.8`](https://hub.docker.com/r/runatlantis/atlantis/tags/)


# v0.4.7

## Description
Support GitLab repos nested under multiple levels and use the latest version of Terraform: 0.11.8!

## Features
* Support GitLab groups which allow repos to be nested under multiple levels,
ex. `gitlab.com/owner/group/subgroup/subsubgroup/repo`
* Use latest version of Terraform: 0.11.8 in Docker image

## Bugfixes
* When running with `TF_LOG` set, Atlantis will start normally. Previously it
would error out due to attempting to parse the stderr output of the `terraform version`
command.

## Backwards Incompatibilities / Notes:
None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.7/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.7/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.7/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.7/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.4.7`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

# v0.4.6

## Description
Just a small bugfix release.

## Features
None

## Bugfixes
* If `terraform init` fails, include the failure logs in the comment posted back to the PR.

## Backwards Incompatibilities / Notes:
None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.6/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.6/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.6/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.6/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.4.6`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

# v0.4.5

## Features
* `atlantis apply` now applies **all** unapplied plans instead of just the plan in the root directory. ([#169](https://github.com/runatlantis/atlantis/issues/169))
* `atlantis plan` now plans **all** modified projects instead of just the root directory.
* Plan comments now contain instructions for how to run apply or re-run plan.

## Bugfixes
* Ignore approvals from the pull request author (Bitbucket Cloud only). Fixes ([#201](https://github.com/runatlantis/atlantis/issues/201))
* When double clicking on a GitHub comment, ex.
    ```
    atlantis apply
    ```
  GitHub would add two newlines to the end. If this was then pasted into a new
  comment, Atlantis would accept it because of the extra newlines. This has been fixed
  and the comment with two newlines will be accepted.

## Backwards Incompatibilities / Notes:
* `atlantis apply` now applies **all** unapplied plans. Previously it would only apply the plan in the root directory and default workspace.
* `atlantis plan` now plans **all** modified projects. Previously it would only run plan in the root directory and default workspace.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.5/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.5/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.5/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.5/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.4.5`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

# v0.4.4

## Features
* Supports Bitbucket Server ([#190](https://github.com/runatlantis/atlantis/issues/190)).

## Bugfixes
* Fix `/etc/hosts` not being respected ([#196](https://github.com/runatlantis/atlantis/issues/196)).

## Backwards Incompatibilities / Notes:
None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.4/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.4/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.4/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.4/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.4.4`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

# v0.4.3

## Features
* Supports Bitbucket Cloud (bitbucket.org) ([#30](https://github.com/runatlantis/atlantis/issues/30)).

## Bugfixes
None

## Backwards Incompatibilities / Notes:
None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.3/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.3/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.3/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.3/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.4.3`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

# v0.4.2

## Features
* Don't comment on pull request if autoplan determines there are no projects to plan in.
This was getting very noisy for users who use their repos for more than just Terraform ([#183](https://github.com/runatlantis/atlantis/issues/183)).

## Bugfixes
None

## Backwards Incompatibilities / Notes:
None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.2/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.2/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.2/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.2/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.4.2`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

# v0.4.1

## Features
* Add new `/healthz` endpoint for health checking in Kubernetes ([#102](https://github.com/runatlantis/atlantis/issues/102))
* Set `$PLANFILE` environment variable to expected location of plan file when running custom steps ([#168](https://github.com/runatlantis/atlantis/issues/168))
    * This enables overriding the command Atlantis uses to `plan` and substituting your own or piping through a custom script.
* Changed default pattern to detect changed files to `*.tf*` from `*.tf` in order
to trigger on `.tfvars` files.

## Bugfixes
None

## Backwards Incompatibilities / Notes:
None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.1/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.1/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.1/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.1/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.4.1`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

# v0.4.0

## Features
* Autoplanning - Atlantis will automatically run `plan` on new pull requests and
when new commits are pushed to the pull request.
* New repository `atlantis.yaml` format that supports:
    * Complete customization of plans run
    * Single config file for whole repository
    * Controlling autoplanning
* Moved docs to standalone website from the README.
* Fixes:
    * [#113](https://github.com/runatlantis/atlantis/issues/113)
    * [#50](https://github.com/runatlantis/atlantis/issues/50)
    * [#46](https://github.com/runatlantis/atlantis/issues/46)
    * [#39](https://github.com/runatlantis/atlantis/issues/39)
    * [#28](https://github.com/runatlantis/atlantis/issues/28)
    * [#26](https://github.com/runatlantis/atlantis/issues/26)
    * [#4](https://github.com/runatlantis/atlantis/issues/4)

## Bugfixes

## Backwards Incompatibilities / Notes:
- The old `atlantis.yaml` config file format is not supported. You will need to migrate to the new config
format, see: https://www.runatlantis.io/docs/upgrading-atlantis-yaml.html
- To use the new config file, you must run Atlantis with `--allow-repo-config`.
- Atlantis will now try to automatically plan. To disable this, you'll need to create an `atlantis.yaml` file
as follows:
```yaml
version: 2
projects:
- dir: mydir
  autoplan:
    enabled: false
```
- `atlantis apply` no longer applies all un-applied plans but instead applies only the plan in the root directory and default workspace. This will be reverted in an upcoming release
- `atlantis plan` no longer plans in all modified projects but instead runs plan only in the root directory and default workspace. This will be reverted in an upcoming release.

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.0/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.0/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.0/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.4.0/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.4.0`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

# v0.3.11

## Features
None

## Bugfixes
* If the `TF_LOG` environment variable is set, should still be able to start. Previously `atlantis server` would exit immediately because it couldn't parse the output of `terraform version`.

## Backwards Incompatibilities / Notes:
None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.11/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.11/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.11/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.11/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.3.11`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

# v0.3.10

## Features
* Rename `atlantis bootstrap` to `atlantis testdrive` to make it clearer that it
doesn't set up Atlantis for you. Fixes ([#129](https://github.com/runatlantis/atlantis/issues/129)).
* Atlantis will now comment on a pull request when a plan/lock is discarded from
the Atlantis UI. Fixes ([#27](https://github.com/runatlantis/atlantis/issues/27)).

## Bugfixes
* Fix issue during `atlantis bootstrap` where ngrok tunnel took a long time to start.
Atlantis will now wait until it sees the expected log entry before continuing.
Fixes ([#92](https://github.com/runatlantis/atlantis/issues/92)).
* Fix missing error checking during `atlantis bootstrap`. ([#130](https://github.com/runatlantis/atlantis/pulls/130)).

## Backwards Incompatibilities / Notes:
* `atlantis bootstrap` renamed to `atlantis testdrive`

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.10/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.10/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.10/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.10/atlantis_linux_arm.zip)

## Docker
[`runatlantis/atlantis:v0.3.10`](https://hub.docker.com/r/runatlantis/atlantis/tags/)

# v0.3.9

## Features
* None

## Bugfixes
* Fix GitLab approvals not actually checking approval ([#114](https://github.com/runatlantis/atlantis/issues/114))

## Backwards Incompatibilities / Notes:
* None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.9/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.9/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.9/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.9/atlantis_linux_arm.zip)

# v0.3.8

## Features
* Terraform 0.11.7 in Docker image
* Docker build now verifies terraform install via checksum

## Bugfixes
* None

## Backwards Incompatibilities / Notes:
* None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.8/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.8/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.8/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.8/atlantis_linux_arm.zip)

# v0.3.7

## Bugfixes
* `--repo-whitelist` is now case insensitive. Fixes ([#95](https://github.com/runatlantis/atlantis/issues/95)).

## Backwards Incompatibilities / Notes:
* None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.7/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.7/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.7/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.7/atlantis_linux_arm.zip)

# v0.3.6

## Features
* `atlantis server -h` has newlines between flags so it's easier to read ([#91](https://github.com/runatlantis/atlantis/issues/91)).

## Bugfixes
* `atlantis bootstrap` uses a custom ngrok config file so it should work even
if the user is already running another ngrok tunnel ([#93](https://github.com/runatlantis/atlantis/issues/93)).

## Backwards Incompatibilities / Notes:
* None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.6/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.6/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.6/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.6/atlantis_linux_arm.zip)

# v0.3.5

## Features
* Log a warning if unable to update commit status. ([#84](https://github.com/runatlantis/atlantis/issues/84))

## Backwards Incompatibilities / Notes:
* None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.5/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.5/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.5/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.5/atlantis_linux_arm.zip)

# v0.3.4
## Description
This release delivers some speed improvements through caching plugins and
not running `terraform workspace select` unnecessarily. In my testing it saves ~20s per run.

## Features
* All config flags can now be specified by environment variables. Fixes ([#38](https://github.com/runatlantis/atlantis/issues/38)).
  * Completed thanks to @psalaberria002!
* Run terraform with the `TF_PLUGIN_CACHE_DIR` env var set. Fixes ([#34](https://github.com/runatlantis/atlantis/issues/34)).
  * This will cache plugins and make `terraform init` faster. Terraform will still download new versions of plugins. See https://www.terraform.io/docs/configuration/providers.html#provider-plugin-cache for more details.
  * In my testing this saves >10s per run.
* Run terraform with `TF_IN_AUTOMATION=true` so the output won't contain suggestions to run commands that you can't run via Atlantis. ([#82](https://github.com/runatlantis/atlantis/pull/82)).
* Don't run `terraform workspace select` unless we actually need to switch workspaces. ([#82](https://github.com/runatlantis/atlantis/pull/82)).
  * In my testing this saves ~10s.

## Bug Fixes
* Validate that workspace doesn't contain a path when running ex. `atlantis plan -w /jdlkj`. This was already not a valid workspace name according to Terraform. ([#78](https://github.com/runatlantis/atlantis/pull/78)).
* Error out if `ngrok` is already running when running `atlantis bootstrap` ([#81](https://github.com/runatlantis/atlantis/pull/81)).

## Backwards Incompatibilities / Notes:
* None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.4/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.4/atlantis_linux_386.zip)
* [atlantis_linux_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.4/atlantis_linux_amd64.zip)
* [atlantis_linux_arm.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.4/atlantis_linux_arm.zip)

# v0.3.3

## Features
* Atlantis version shown in footer of web UI. Fixes ([#33](https://github.com/runatlantis/atlantis/issues/33)).

## Bug Fixes
* GitHub comments greater than the max length will be split into multiple comments. Fixes ([#55](https://github.com/runatlantis/atlantis/issues/55)).

## Backwards Incompatibilities / Notes:
* None

## Downloads
* [atlantis_darwin_amd64.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.3/atlantis_darwin_amd64.zip)
* [atlantis_linux_386.zip](https://github.com/runatlantis/atlantis/releases/download/v0.3.3/atlantis_linux_3
Download .txt
gitextract_5epp6u6d/

├── .adr-dir
├── .clusterfuzzlite/
│   ├── Dockerfile
│   └── build.sh
├── .codecov.yml
├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── cherry-pick-bot.yml
│   ├── copilot-instructions.md
│   ├── labeler.yml
│   ├── release.yml
│   ├── renovate.json5
│   ├── styles/
│   │   └── Atlantis/
│   │       └── ProductTerms.yml
│   └── workflows/
│       ├── atlantis-image.yml
│       ├── clusterfuzzlite.yml
│       ├── codeql.yml
│       ├── dependency-review.yml
│       ├── labeler.yml
│       ├── lint.yml
│       ├── pr-lint.yml
│       ├── pr-size-labeler.yml
│       ├── release.yml
│       ├── renovate-config.yml
│       ├── scorecard.yml
│       ├── stale.yml
│       ├── test.yml
│       ├── testing-env-image.yml
│       └── website.yml
├── .gitignore
├── .golangci.yml
├── .goreleaser.yml
├── .lycheeignore
├── .markdownlint.yaml
├── .node-version
├── .pre-commit-config.yaml
├── .tool-versions
├── .vale.ini
├── .vscode/
│   └── settings.json
├── ADOPTERS.md
├── CHANGELOG.md
├── CODEOWNERS
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── Dockerfile.dev
├── LICENSE
├── MAINTAINERS.md
├── Makefile
├── README.md
├── RELEASE.md
├── SECURITY.md
├── _typos.toml
├── atlantis-features-version-analysis.md
├── cmd/
│   ├── bootstrap.go
│   ├── cmd.go
│   ├── help_fmt.go
│   ├── root.go
│   ├── server.go
│   ├── server_test.go
│   └── version.go
├── docker-compose.yml
├── docker-entrypoint.sh
├── docs/
│   └── adr/
│       └── 0001-record-architecture-decisions.md
├── e2e/
│   ├── .gitignore
│   ├── Makefile
│   ├── README.md
│   ├── e2e.go
│   ├── github.go
│   ├── gitlab.go
│   ├── go.mod
│   ├── go.sum
│   ├── main.go
│   └── vcs.go
├── go.mod
├── go.sum
├── goss.yaml
├── kustomize/
│   ├── bundle.yaml
│   └── kustomization.yaml
├── main.go
├── netlify.toml
├── package.json
├── playwright.config.cjs
├── runatlantis.io/
│   ├── .vitepress/
│   │   ├── components/
│   │   │   ├── Banner.vue
│   │   │   └── shims.d.ts
│   │   ├── config.ts
│   │   ├── navbars.ts
│   │   ├── sidebars.ts
│   │   └── theme/
│   │       └── index.ts
│   ├── blog/
│   │   ├── 2017/
│   │   │   └── introducing-atlantis.md
│   │   ├── 2018/
│   │   │   ├── atlantis-0-4-4-now-supports-bitbucket.md
│   │   │   ├── hosting-our-static-site/
│   │   │   │   └── code/
│   │   │   │       ├── cloudfront.tf
│   │   │   │       ├── dns.tf
│   │   │   │       ├── full.tf
│   │   │   │       ├── main.tf
│   │   │   │       ├── s3-bucket.tf
│   │   │   │       └── ssl-cert.tf
│   │   │   ├── hosting-our-static-site-over-ssl-with-s3-acm-cloudfront-and-terraform.md
│   │   │   ├── joining-hashicorp.md
│   │   │   ├── putting-the-dev-into-devops-why-your-developers-should-write-terraform-too.md
│   │   │   └── terraform-and-the-dangers-of-applying-locally.md
│   │   ├── 2019/
│   │   │   └── 4-reasons-to-try-hashicorps-new-free-terraform-remote-state-storage.md
│   │   ├── 2024/
│   │   │   ├── april-2024-survey-results.md
│   │   │   └── integrating-atlantis-with-opentofu.md
│   │   └── 2025/
│   │       └── atlantis-on-google-cloud-run.md
│   ├── blog.md
│   ├── contributing/
│   │   ├── events-controller.md
│   │   └── glossary.md
│   ├── contributing.md
│   ├── docs/
│   │   ├── access-credentials.md
│   │   ├── api-endpoints.md
│   │   ├── apply-requirements.md
│   │   ├── automerging.md
│   │   ├── autoplanning.md
│   │   ├── checkout-strategy.md
│   │   ├── command-requirements.md
│   │   ├── configuring-atlantis.md
│   │   ├── configuring-webhooks.md
│   │   ├── custom-policy-checks.md
│   │   ├── custom-workflows.md
│   │   ├── deployment.md
│   │   ├── faq.md
│   │   ├── how-atlantis-works.md
│   │   ├── installation-guide.md
│   │   ├── locking.md
│   │   ├── policy-checking.md
│   │   ├── post-workflow-hooks.md
│   │   ├── pre-workflow-hooks.md
│   │   ├── provider-credentials.md
│   │   ├── repo-and-project-permissions.md
│   │   ├── repo-level-atlantis-yaml.md
│   │   ├── requirements.md
│   │   ├── security.md
│   │   ├── sending-notifications-via-webhooks.md
│   │   ├── server-configuration.md
│   │   ├── server-side-repo-config.md
│   │   ├── stats.md
│   │   ├── streaming-logs.md
│   │   ├── terraform-cloud.md
│   │   ├── terraform-versions.md
│   │   ├── troubleshooting-https.md
│   │   ├── upgrading-atlantis-yaml.md
│   │   ├── using-atlantis.md
│   │   └── webhook-secrets.md
│   ├── docs.md
│   ├── e2e/
│   │   └── site-check.spec.js
│   ├── guide/
│   │   ├── test-drive.md
│   │   └── testing-locally.md
│   ├── guide.md
│   ├── index.md
│   └── terraform/
│       ├── main.tf
│       └── versions.tf
├── scripts/
│   ├── addlicense.sh
│   ├── coverage.sh
│   ├── download-release.sh
│   ├── e2e.sh
│   ├── fmt.sh
│   ├── go-generate.sh
│   └── pin_ci_terraform_providers.sh
├── server/
│   ├── controllers/
│   │   ├── api_controller.go
│   │   ├── api_controller_test.go
│   │   ├── events/
│   │   │   ├── azuredevops_request_validator.go
│   │   │   ├── azuredevops_request_validator_test.go
│   │   │   ├── events_controller.go
│   │   │   ├── events_controller_e2e_test.go
│   │   │   ├── events_controller_test.go
│   │   │   ├── github_request_validator.go
│   │   │   ├── github_request_validator_test.go
│   │   │   ├── gitlab_request_parser_validator.go
│   │   │   ├── gitlab_request_parser_validator_test.go
│   │   │   ├── mocks/
│   │   │   │   ├── mock_azuredevops_request_validator.go
│   │   │   │   ├── mock_github_request_validator.go
│   │   │   │   └── mock_gitlab_request_parser_validator.go
│   │   │   └── testdata/
│   │   │       ├── bb-server-pull-deleted-event.json
│   │   │       ├── githubIssueCommentEvent.json
│   │   │       ├── githubIssueCommentEvent_notAllowlisted.json
│   │   │       ├── githubPullRequestClosedEvent.json
│   │   │       ├── githubPullRequestOpenedEvent.json
│   │   │       ├── gitlabMergeCommentEvent_notAllowlisted.json
│   │   │       ├── gitlabMergeCommentEvent_shouldIgnore.json
│   │   │       ├── null_provider_lockfile_old_version
│   │   │       └── test-repos/
│   │   │           ├── automerge/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── dir1/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── dir2/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── exp-output-apply-dir1.txt
│   │   │           │   ├── exp-output-apply-dir2.txt
│   │   │           │   ├── exp-output-automerge.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   └── exp-output-merge.txt
│   │   │           ├── import-multiple-project/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── dir1/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── dir2/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-import-dummy1.txt
│   │   │           │   ├── exp-output-import-multiple-projects.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   └── exp-output-plan-again.txt
│   │   │           ├── import-single-project/
│   │   │           │   ├── exp-output-apply-no-projects.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-import-dummy1.txt
│   │   │           │   ├── exp-output-import-dummy2.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── exp-output-plan-again.txt
│   │   │           │   ├── main.tf
│   │   │           │   └── versions.tf
│   │   │           ├── import-single-project-var/
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-import-count.txt
│   │   │           │   ├── exp-output-import-foreach.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── exp-output-plan-again.txt
│   │   │           │   ├── main.tf
│   │   │           │   └── versions.tf
│   │   │           ├── import-workspace/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── dir1/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── exp-output-import-dir1-ops-dummy1.txt
│   │   │           │   ├── exp-output-import-dir1-ops-dummy2.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   └── exp-output-plan.txt
│   │   │           ├── modules/
│   │   │           │   ├── exp-output-apply-production.txt
│   │   │           │   ├── exp-output-apply-staging.txt
│   │   │           │   ├── exp-output-autoplan-only-staging.txt
│   │   │           │   ├── exp-output-merge-all-dirs.txt
│   │   │           │   ├── exp-output-merge-only-staging.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── exp-output-plan-production.txt
│   │   │           │   ├── exp-output-plan-staging.txt
│   │   │           │   ├── modules/
│   │   │           │   │   └── null/
│   │   │           │   │       ├── main.tf
│   │   │           │   │       └── versions.tf
│   │   │           │   ├── production/
│   │   │           │   │   └── main.tf
│   │   │           │   └── staging/
│   │   │           │       └── main.tf
│   │   │           ├── modules-yaml/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-production.txt
│   │   │           │   ├── exp-output-apply-staging.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge-all-dirs.txt
│   │   │           │   ├── exp-output-merge-only-staging.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── exp-output-plan-production.txt
│   │   │           │   ├── exp-output-plan-staging.txt
│   │   │           │   ├── modules/
│   │   │           │   │   └── null/
│   │   │           │   │       ├── main.tf
│   │   │           │   │       └── versions.tf
│   │   │           │   ├── production/
│   │   │           │   │   └── main.tf
│   │   │           │   └── staging/
│   │   │           │       └── main.tf
│   │   │           ├── policy-checks/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-apply-reqs/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-clear-approval/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies-clear.txt
│   │   │           │   ├── exp-output-approve-policies-success.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-custom-run-steps/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-diff-owner/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-disabled-previous-match/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-disabled-repo/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-disabled-repo-server-side/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-enabled-repo/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-enabled-repo-server-side/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-extra-args/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-failed.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-approve-policies.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── policy-checks-multi-projects/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── dir1/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── dir2/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-auto-policy-check-quiet.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   └── repos.yaml
│   │   │           ├── policy-checks-success-silent/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── policies/
│   │   │           │   │   └── policy.rego
│   │   │           │   └── repos.yaml
│   │   │           ├── repo-config-file/
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   └── infrastructure/
│   │   │           │       ├── custom-name-atlantis.yaml
│   │   │           │       ├── production/
│   │   │           │       │   ├── main.tf
│   │   │           │       │   └── versions.tf
│   │   │           │       └── staging/
│   │   │           │           ├── main.tf
│   │   │           │           └── versions.tf
│   │   │           ├── server-side-cfg/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-apply-default-workspace.txt
│   │   │           │   ├── exp-output-apply-staging-workspace.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── repos.yaml
│   │   │           │   └── versions.tf
│   │   │           ├── simple/
│   │   │           │   ├── exp-output-allow-command-unknown-import.txt
│   │   │           │   ├── exp-output-apply-var-all.txt
│   │   │           │   ├── exp-output-apply-var-default-workspace.txt
│   │   │           │   ├── exp-output-apply-var-new-workspace.txt
│   │   │           │   ├── exp-output-apply-var.txt
│   │   │           │   ├── exp-output-apply.txt
│   │   │           │   ├── exp-output-atlantis-plan-new-workspace.txt
│   │   │           │   ├── exp-output-atlantis-plan-var-overridden.txt
│   │   │           │   ├── exp-output-atlantis-plan.txt
│   │   │           │   ├── exp-output-auto-policy-check.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge-workspaces.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   └── versions.tf
│   │   │           ├── simple-with-lockfile/
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-plan.txt
│   │   │           │   ├── main.tf
│   │   │           │   └── versions.tf
│   │   │           ├── simple-yaml/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── exp-output-allow-command-unknown-apply.txt
│   │   │           │   ├── exp-output-apply-all.txt
│   │   │           │   ├── exp-output-apply-default.txt
│   │   │           │   ├── exp-output-apply-locked.txt
│   │   │           │   ├── exp-output-apply-staging.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── exp-output-plan-default.txt
│   │   │           │   ├── exp-output-plan-staging.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── staging.tfvars
│   │   │           │   └── versions.tf
│   │   │           ├── state-rm-multiple-project/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── dir1/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── dir2/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-import-dummy1.txt
│   │   │           │   ├── exp-output-import-dummy2.txt
│   │   │           │   ├── exp-output-merged.txt
│   │   │           │   ├── exp-output-plan-again.txt
│   │   │           │   ├── exp-output-plan.txt
│   │   │           │   └── exp-output-state-rm-multiple-projects.txt
│   │   │           ├── state-rm-single-project/
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-import-count.txt
│   │   │           │   ├── exp-output-import-foreach.txt
│   │   │           │   ├── exp-output-import-simple.txt
│   │   │           │   ├── exp-output-merged.txt
│   │   │           │   ├── exp-output-plan-again.txt
│   │   │           │   ├── exp-output-plan.txt
│   │   │           │   ├── exp-output-state-rm-foreach.txt
│   │   │           │   ├── exp-output-state-rm-multiple.txt
│   │   │           │   ├── main.tf
│   │   │           │   └── versions.tf
│   │   │           ├── state-rm-workspace/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── dir1/
│   │   │           │   │   ├── main.tf
│   │   │           │   │   └── versions.tf
│   │   │           │   ├── exp-output-import-dummy1.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── exp-output-plan-again.txt
│   │   │           │   ├── exp-output-plan.txt
│   │   │           │   └── exp-output-state-rm-dummy1.txt
│   │   │           ├── tfvars-yaml/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── default.backend.tfvars
│   │   │           │   ├── default.tfvars
│   │   │           │   ├── exp-output-apply-default.txt
│   │   │           │   ├── exp-output-apply-staging.txt
│   │   │           │   ├── exp-output-autoplan.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── staging.backend.tfvars
│   │   │           │   ├── staging.tfvars
│   │   │           │   └── versions.tf
│   │   │           ├── tfvars-yaml-no-autoplan/
│   │   │           │   ├── atlantis.yaml
│   │   │           │   ├── default.backend.tfvars
│   │   │           │   ├── default.tfvars
│   │   │           │   ├── exp-output-apply-default.txt
│   │   │           │   ├── exp-output-apply-staging.txt
│   │   │           │   ├── exp-output-merge.txt
│   │   │           │   ├── exp-output-plan-default.txt
│   │   │           │   ├── exp-output-plan-staging.txt
│   │   │           │   ├── main.tf
│   │   │           │   ├── staging.backend.tfvars
│   │   │           │   ├── staging.tfvars
│   │   │           │   └── versions.tf
│   │   │           └── workspace-parallel-yaml/
│   │   │               ├── atlantis.yaml
│   │   │               ├── exp-output-apply-all-production.txt
│   │   │               ├── exp-output-apply-all-staging.txt
│   │   │               ├── exp-output-autoplan-production.txt
│   │   │               ├── exp-output-autoplan-staging.txt
│   │   │               ├── exp-output-merge.txt
│   │   │               ├── production/
│   │   │               │   ├── main.tf
│   │   │               │   └── versions.tf
│   │   │               └── staging/
│   │   │                   ├── main.tf
│   │   │                   └── versions.tf
│   │   ├── github_app_controller.go
│   │   ├── jobs_controller.go
│   │   ├── locks_controller.go
│   │   ├── locks_controller_test.go
│   │   ├── status_controller.go
│   │   ├── status_controller_test.go
│   │   ├── web_templates/
│   │   │   ├── mocks/
│   │   │   │   └── mock_template_writer.go
│   │   │   ├── templates/
│   │   │   │   ├── github-app.html.tmpl
│   │   │   │   ├── index.html.tmpl
│   │   │   │   ├── lock.html.tmpl
│   │   │   │   ├── project-jobs-error.html.tmpl
│   │   │   │   └── project-jobs.html.tmpl
│   │   │   ├── web_templates.go
│   │   │   └── web_templates_test.go
│   │   └── websocket/
│   │       ├── mux.go
│   │       ├── mux_test.go
│   │       └── writer.go
│   ├── core/
│   │   ├── boltdb/
│   │   │   ├── boltdb.go
│   │   │   └── boltdb_test.go
│   │   ├── config/
│   │   │   ├── cfgfuzz/
│   │   │   │   └── fuzz_test.go
│   │   │   ├── parser_validator.go
│   │   │   ├── parser_validator_test.go
│   │   │   ├── raw/
│   │   │   │   ├── autodiscover.go
│   │   │   │   ├── autodiscover_test.go
│   │   │   │   ├── autoplan.go
│   │   │   │   ├── autoplan_test.go
│   │   │   │   ├── global_cfg.go
│   │   │   │   ├── metrics.go
│   │   │   │   ├── metrics_test.go
│   │   │   │   ├── policies.go
│   │   │   │   ├── policies_test.go
│   │   │   │   ├── project.go
│   │   │   │   ├── project_test.go
│   │   │   │   ├── raw.go
│   │   │   │   ├── raw_test.go
│   │   │   │   ├── repo_cfg.go
│   │   │   │   ├── repo_cfg_test.go
│   │   │   │   ├── repo_locks.go
│   │   │   │   ├── repo_locks_test.go
│   │   │   │   ├── stage.go
│   │   │   │   ├── stage_test.go
│   │   │   │   ├── step.go
│   │   │   │   ├── step_test.go
│   │   │   │   ├── team_authz.go
│   │   │   │   ├── workflow.go
│   │   │   │   ├── workflow_step.go
│   │   │   │   ├── workflow_step_test.go
│   │   │   │   └── workflow_test.go
│   │   │   └── valid/
│   │   │       ├── autodiscover.go
│   │   │       ├── autodiscover_test.go
│   │   │       ├── global_cfg.go
│   │   │       ├── global_cfg_test.go
│   │   │       ├── policies.go
│   │   │       ├── policies_test.go
│   │   │       ├── repo_cfg.go
│   │   │       ├── repo_cfg_test.go
│   │   │       ├── repo_locks.go
│   │   │       ├── team_authz.go
│   │   │       └── valid.go
│   │   ├── db/
│   │   │   ├── db.go
│   │   │   └── mocks/
│   │   │       └── mock_database.go
│   │   ├── locking/
│   │   │   ├── apply_locking.go
│   │   │   ├── locking.go
│   │   │   ├── locking_test.go
│   │   │   └── mocks/
│   │   │       ├── mock_apply_lock_checker.go
│   │   │       ├── mock_apply_locker.go
│   │   │       └── mock_locker.go
│   │   ├── redis/
│   │   │   ├── redis.go
│   │   │   └── redis_test.go
│   │   ├── runtime/
│   │   │   ├── apply_step_runner.go
│   │   │   ├── apply_step_runner_internal_test.go
│   │   │   ├── apply_step_runner_test.go
│   │   │   ├── cache/
│   │   │   │   ├── mocks/
│   │   │   │   │   ├── mock_key_serializer.go
│   │   │   │   │   └── mock_version_path.go
│   │   │   │   ├── version_path.go
│   │   │   │   └── version_path_test.go
│   │   │   ├── common/
│   │   │   │   ├── common.go
│   │   │   │   └── common_test.go
│   │   │   ├── env_step_runner.go
│   │   │   ├── env_step_runner_test.go
│   │   │   ├── executor.go
│   │   │   ├── external_team_allowlist_runner.go
│   │   │   ├── import_step_runner.go
│   │   │   ├── import_step_runner_test.go
│   │   │   ├── init_step_runner.go
│   │   │   ├── init_step_runner_test.go
│   │   │   ├── minimum_version_step_runner_delegate.go
│   │   │   ├── minimum_version_step_runner_delegate_test.go
│   │   │   ├── mocks/
│   │   │   │   ├── mock_async_tfexec.go
│   │   │   │   ├── mock_external_team_allowlist_runner.go
│   │   │   │   ├── mock_post_workflows_hook_runner.go
│   │   │   │   ├── mock_pre_workflows_hook_runner.go
│   │   │   │   ├── mock_pull_approved_checker.go
│   │   │   │   ├── mock_runner.go
│   │   │   │   ├── mock_status_updater.go
│   │   │   │   └── mock_versionedexecutorworkflow.go
│   │   │   ├── models/
│   │   │   │   ├── exec.go
│   │   │   │   ├── filepath.go
│   │   │   │   ├── mocks/
│   │   │   │   │   ├── mock_exec.go
│   │   │   │   │   └── mock_filepath.go
│   │   │   │   ├── shell_command_runner.go
│   │   │   │   └── shell_command_runner_test.go
│   │   │   ├── multienv_step_runner.go
│   │   │   ├── multienv_step_runner_internal_test.go
│   │   │   ├── multienv_step_runner_test.go
│   │   │   ├── plan_step_runner.go
│   │   │   ├── plan_step_runner_test.go
│   │   │   ├── plan_type_step_runner_delegate.go
│   │   │   ├── plan_type_step_runner_delegate_test.go
│   │   │   ├── policy/
│   │   │   │   ├── conftest_client.go
│   │   │   │   ├── conftest_client_test.go
│   │   │   │   └── mocks/
│   │   │   │       ├── mock_conftest_client.go
│   │   │   │       └── mock_downloader.go
│   │   │   ├── policy_check_step_runner.go
│   │   │   ├── policy_check_step_runner_test.go
│   │   │   ├── post_workflow_hook_runner.go
│   │   │   ├── post_workflow_hook_runner_test.go
│   │   │   ├── pre_workflow_hook_runner.go
│   │   │   ├── pre_workflow_hook_runner_test.go
│   │   │   ├── pull_approved_checker.go
│   │   │   ├── run_step_runner.go
│   │   │   ├── run_step_runner_test.go
│   │   │   ├── runtime.go
│   │   │   ├── runtime_test.go
│   │   │   ├── show_step_runner.go
│   │   │   ├── show_step_runner_test.go
│   │   │   ├── state_rm_step_runner.go
│   │   │   ├── state_rm_step_runner_test.go
│   │   │   ├── version_step_runner.go
│   │   │   ├── version_step_runner_test.go
│   │   │   ├── workspace_step_runner_delegate.go
│   │   │   └── workspace_step_runner_delegate_test.go
│   │   └── terraform/
│   │       ├── ansi/
│   │       │   ├── strip.go
│   │       │   └── strip_test.go
│   │       ├── distribution.go
│   │       ├── distribution_test.go
│   │       ├── downloader.go
│   │       ├── downloader_test.go
│   │       ├── mocks/
│   │       │   └── mock_downloader.go
│   │       └── tfclient/
│   │           ├── mocks/
│   │           │   └── mock_terraform_client.go
│   │           ├── terraform_client.go
│   │           ├── terraform_client_internal_test.go
│   │           └── terraform_client_test.go
│   ├── events/
│   │   ├── apply_command_runner.go
│   │   ├── apply_command_runner_test.go
│   │   ├── approve_policies_command_runner.go
│   │   ├── automerger.go
│   │   ├── cancel_command_runner.go
│   │   ├── cancellation_tracker.go
│   │   ├── command/
│   │   │   ├── context.go
│   │   │   ├── lock.go
│   │   │   ├── name.go
│   │   │   ├── name_test.go
│   │   │   ├── project_context.go
│   │   │   ├── project_context_test.go
│   │   │   ├── project_result.go
│   │   │   ├── project_result_test.go
│   │   │   ├── result.go
│   │   │   ├── result_test.go
│   │   │   ├── scope_tags.go
│   │   │   ├── team_allowlist_checker.go
│   │   │   └── team_allowlist_checker_test.go
│   │   ├── command_requirement_handler.go
│   │   ├── command_requirement_handler_test.go
│   │   ├── command_runner.go
│   │   ├── command_runner_internal_test.go
│   │   ├── command_runner_test.go
│   │   ├── command_type.go
│   │   ├── comment_parser.go
│   │   ├── comment_parser_test.go
│   │   ├── commit_status_updater.go
│   │   ├── commit_status_updater_test.go
│   │   ├── db_updater.go
│   │   ├── delete_lock_command.go
│   │   ├── delete_lock_command_test.go
│   │   ├── drainer.go
│   │   ├── drainer_test.go
│   │   ├── event_parser.go
│   │   ├── event_parser_test.go
│   │   ├── external_team_allowlist_checker.go
│   │   ├── external_team_allowlist_checker_test.go
│   │   ├── github_app_working_dir.go
│   │   ├── github_app_working_dir_test.go
│   │   ├── import_command_runner.go
│   │   ├── import_command_runner_test.go
│   │   ├── instrumented_project_command_builder.go
│   │   ├── instrumented_project_command_runner.go
│   │   ├── instrumented_pull_closed_executor.go
│   │   ├── markdown_renderer.go
│   │   ├── markdown_renderer_test.go
│   │   ├── mock_workingdir_test.go
│   │   ├── mocks/
│   │   │   ├── mock_azuredevops_pull_getter.go
│   │   │   ├── mock_cancellation_tracker.go
│   │   │   ├── mock_command_requirement_handler.go
│   │   │   ├── mock_command_runner.go
│   │   │   ├── mock_comment_building.go
│   │   │   ├── mock_comment_parsing.go
│   │   │   ├── mock_commit_status_updater.go
│   │   │   ├── mock_custom_step_runner.go
│   │   │   ├── mock_delete_lock_command.go
│   │   │   ├── mock_env_step_runner.go
│   │   │   ├── mock_event_parsing.go
│   │   │   ├── mock_github_pull_getter.go
│   │   │   ├── mock_gitlab_merge_request_getter.go
│   │   │   ├── mock_job_message_sender.go
│   │   │   ├── mock_job_url_setter.go
│   │   │   ├── mock_lock_url_generator.go
│   │   │   ├── mock_pending_plan_finder.go
│   │   │   ├── mock_post_workflow_hook_url_generator.go
│   │   │   ├── mock_post_workflows_hooks_command_runner.go
│   │   │   ├── mock_pre_workflow_hook_url_generator.go
│   │   │   ├── mock_pre_workflows_hooks_command_runner.go
│   │   │   ├── mock_project_command_builder.go
│   │   │   ├── mock_project_command_runner.go
│   │   │   ├── mock_project_lock.go
│   │   │   ├── mock_pull_cleaner.go
│   │   │   ├── mock_resource_cleaner.go
│   │   │   ├── mock_step_runner.go
│   │   │   ├── mock_webhooks_sender.go
│   │   │   ├── mock_working_dir.go
│   │   │   └── mock_working_dir_locker.go
│   │   ├── models/
│   │   │   ├── commit_status.go
│   │   │   ├── commit_status_test.go
│   │   │   ├── models.go
│   │   │   ├── models_test.go
│   │   │   └── testdata/
│   │   │       └── fixtures.go
│   │   ├── modules.go
│   │   ├── modules_test.go
│   │   ├── pending_plan_finder.go
│   │   ├── pending_plan_finder_test.go
│   │   ├── plan_command_runner.go
│   │   ├── plan_command_runner_test.go
│   │   ├── policy_check_command_runner.go
│   │   ├── post_workflow_hooks_command_runner.go
│   │   ├── post_workflow_hooks_command_runner_test.go
│   │   ├── pre_workflow_hooks_command_runner.go
│   │   ├── pre_workflow_hooks_command_runner_test.go
│   │   ├── project_command_builder.go
│   │   ├── project_command_builder_internal_test.go
│   │   ├── project_command_builder_test.go
│   │   ├── project_command_context_builder.go
│   │   ├── project_command_context_builder_test.go
│   │   ├── project_command_pool_executor.go
│   │   ├── project_command_runner.go
│   │   ├── project_command_runner_test.go
│   │   ├── project_finder.go
│   │   ├── project_finder_test.go
│   │   ├── project_locker.go
│   │   ├── project_locker_test.go
│   │   ├── pull_closed_executor.go
│   │   ├── pull_closed_executor_test.go
│   │   ├── pull_status_fetcher.go
│   │   ├── pull_updater.go
│   │   ├── repo_allowlist_checker.go
│   │   ├── repo_allowlist_checker_test.go
│   │   ├── repo_branch_test.go
│   │   ├── state_command_runner.go
│   │   ├── templates/
│   │   │   ├── apply_unwrapped_success.tmpl
│   │   │   ├── apply_wrapped_success.tmpl
│   │   │   ├── approve_all_projects.tmpl
│   │   │   ├── failure.tmpl
│   │   │   ├── failure_with_log.tmpl
│   │   │   ├── import_success_unwrapped.tmpl
│   │   │   ├── import_success_wrapped.tmpl
│   │   │   ├── log.tmpl
│   │   │   ├── merged_again.tmpl
│   │   │   ├── multi_project_apply.tmpl
│   │   │   ├── multi_project_apply_footer.tmpl
│   │   │   ├── multi_project_header.tmpl
│   │   │   ├── multi_project_import.tmpl
│   │   │   ├── multi_project_plan.tmpl
│   │   │   ├── multi_project_plan_footer.tmpl
│   │   │   ├── multi_project_policy.tmpl
│   │   │   ├── multi_project_policy_unsuccessful.tmpl
│   │   │   ├── multi_project_state_rm.tmpl
│   │   │   ├── multi_project_version.tmpl
│   │   │   ├── plan_success_unwrapped.tmpl
│   │   │   ├── plan_success_wrapped.tmpl
│   │   │   ├── policy_check.tmpl
│   │   │   ├── policy_check_results_unwrapped.tmpl
│   │   │   ├── policy_check_results_wrapped.tmpl
│   │   │   ├── single_project_apply.tmpl
│   │   │   ├── single_project_import_success.tmpl
│   │   │   ├── single_project_plan_success.tmpl
│   │   │   ├── single_project_plan_unsuccessful.tmpl
│   │   │   ├── single_project_policy_unsuccessful.tmpl
│   │   │   ├── single_project_state_rm_success.tmpl
│   │   │   ├── single_project_version_success.tmpl
│   │   │   ├── single_project_version_unsuccessful.tmpl
│   │   │   ├── state_rm_success_unwrapped.tmpl
│   │   │   ├── state_rm_success_wrapped.tmpl
│   │   │   ├── unwrapped_err.tmpl
│   │   │   ├── unwrapped_err_with_log.tmpl
│   │   │   ├── version_unwrapped_success.tmpl
│   │   │   ├── version_wrapped_success.tmpl
│   │   │   └── wrapped_err.tmpl
│   │   ├── testdata/
│   │   │   ├── bitbucket-cloud-comment-event.json
│   │   │   ├── bitbucket-cloud-pull-event-created.json
│   │   │   ├── bitbucket-cloud-pull-event-fulfilled.json
│   │   │   ├── bitbucket-cloud-pull-event-rejected.json
│   │   │   ├── bitbucket-cloud-pull-event-updated.json
│   │   │   ├── bitbucket-server-comment-event.json
│   │   │   ├── bitbucket-server-get-pull-changes.json
│   │   │   ├── bitbucket-server-get-pull.json
│   │   │   ├── bitbucket-server-pull-event-created.json
│   │   │   ├── bitbucket-server-pull-event-declined.json
│   │   │   ├── bitbucket-server-pull-event-merged.json
│   │   │   ├── fs/
│   │   │   │   ├── repoA/
│   │   │   │   │   ├── baz/
│   │   │   │   │   │   ├── init.tf
│   │   │   │   │   │   └── mods.tf
│   │   │   │   │   ├── modules/
│   │   │   │   │   │   ├── bar/
│   │   │   │   │   │   │   └── bar.tf
│   │   │   │   │   │   └── foo/
│   │   │   │   │   │       ├── foo.tf
│   │   │   │   │   │       └── mods.tf
│   │   │   │   │   └── qux/
│   │   │   │   │       └── quxx/
│   │   │   │   │           ├── init.tf
│   │   │   │   │           └── mods.tf
│   │   │   │   └── repoB/
│   │   │   │       ├── dev/
│   │   │   │       │   └── quxx/
│   │   │   │       │       ├── init.tf
│   │   │   │       │       └── mods.tf
│   │   │   │       ├── modules/
│   │   │   │       │   ├── bar/
│   │   │   │       │   │   └── bar.tf
│   │   │   │       │   └── foo/
│   │   │   │       │       ├── foo.tf
│   │   │   │       │       └── mods.tf
│   │   │   │       └── prod/
│   │   │   │           └── quxx/
│   │   │   │               ├── init.tf
│   │   │   │               └── mods.tf
│   │   │   ├── gitlab-get-merge-request-subgroup.json
│   │   │   ├── gitlab-get-merge-request.json
│   │   │   ├── gitlab-merge-request-comment-event-subgroup.json
│   │   │   ├── gitlab-merge-request-comment-event.json
│   │   │   ├── gitlab-merge-request-event-mark-as-ready.json
│   │   │   ├── gitlab-merge-request-event-subgroup.json
│   │   │   ├── gitlab-merge-request-event-update-assignee.json
│   │   │   ├── gitlab-merge-request-event-update-description.json
│   │   │   ├── gitlab-merge-request-event-update-labels.json
│   │   │   ├── gitlab-merge-request-event-update-milestone.json
│   │   │   ├── gitlab-merge-request-event-update-mixed.json
│   │   │   ├── gitlab-merge-request-event-update-new-commit.json
│   │   │   ├── gitlab-merge-request-event-update-reviewer.json
│   │   │   ├── gitlab-merge-request-event-update-target-branch.json
│   │   │   ├── gitlab-merge-request-event-update-title.json
│   │   │   ├── gitlab-merge-request-event.json
│   │   │   └── test-repos/
│   │   │       ├── cloud-block-without-workspace-name/
│   │   │       │   └── main.tf
│   │   │       ├── no-cloud-block/
│   │   │       │   └── main.tf
│   │   │       └── workspace-configured/
│   │   │           └── main.tf
│   │   ├── unlock_command_runner.go
│   │   ├── var_file_allowlist_checker.go
│   │   ├── var_file_allowlist_checker_test.go
│   │   ├── vcs/
│   │   │   ├── azuredevops/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_internal_test.go
│   │   │   │   ├── client_test.go
│   │   │   │   └── testdata/
│   │   │   │       ├── fixtures.go
│   │   │   │       ├── policyevaluations.json
│   │   │   │       └── pr.json
│   │   │   ├── bitbucketcloud/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── models.go
│   │   │   │   └── testdata/
│   │   │   │       ├── comments.json
│   │   │   │       ├── pull-approved-by-author.json
│   │   │   │       ├── pull-approved-multiple.json
│   │   │   │       ├── pull-approved.json
│   │   │   │       ├── pull-unapproved.json
│   │   │   │       └── user.json
│   │   │   ├── bitbucketserver/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── models.go
│   │   │   │   └── testdata/
│   │   │   │       └── pull-request.json
│   │   │   ├── client.go
│   │   │   ├── client_test.go
│   │   │   ├── common/
│   │   │   │   ├── common.go
│   │   │   │   ├── common_test.go
│   │   │   │   ├── git_cred_writer.go
│   │   │   │   ├── git_cred_writer_test.go
│   │   │   │   ├── instrumented_client.go
│   │   │   │   ├── request_validation.go
│   │   │   │   └── request_validation_test.go
│   │   │   ├── gitea/
│   │   │   │   ├── client.go
│   │   │   │   └── models.go
│   │   │   ├── github/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_internal_test.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── config.go
│   │   │   │   ├── credentials.go
│   │   │   │   ├── credentials_test.go
│   │   │   │   ├── instrumented_client.go
│   │   │   │   ├── mocks/
│   │   │   │   │   ├── mock_credentials.go
│   │   │   │   │   └── mock_github_pull_request_getter.go
│   │   │   │   ├── testdata/
│   │   │   │   │   ├── fixtures.go
│   │   │   │   │   ├── pull-request-mergeability/
│   │   │   │   │   │   ├── branch-protection-expected.json
│   │   │   │   │   │   ├── branch-protection-failed.json
│   │   │   │   │   │   ├── branch-protection-passed.json
│   │   │   │   │   │   ├── repository-id.json
│   │   │   │   │   │   ├── ruleset-atlantis-apply-expected.json
│   │   │   │   │   │   ├── ruleset-atlantis-apply-pending.json
│   │   │   │   │   │   ├── ruleset-check-expected.json
│   │   │   │   │   │   ├── ruleset-check-failed-other-atlantis.json
│   │   │   │   │   │   ├── ruleset-check-failed.json
│   │   │   │   │   │   ├── ruleset-check-neutral.json
│   │   │   │   │   │   ├── ruleset-check-passed.json
│   │   │   │   │   │   ├── ruleset-check-pending-other-atlantis.json
│   │   │   │   │   │   ├── ruleset-check-pending.json
│   │   │   │   │   │   ├── ruleset-check-skipped.json
│   │   │   │   │   │   ├── ruleset-evaluate-workflow-failed.json
│   │   │   │   │   │   ├── ruleset-optional-check-failed.json
│   │   │   │   │   │   ├── ruleset-optional-status-failed.json
│   │   │   │   │   │   ├── ruleset-workflow-expected.json
│   │   │   │   │   │   ├── ruleset-workflow-failed-first-check-successful.json
│   │   │   │   │   │   ├── ruleset-workflow-failed.json
│   │   │   │   │   │   ├── ruleset-workflow-passed-multiple-runs.json
│   │   │   │   │   │   ├── ruleset-workflow-passed-sha-match.json
│   │   │   │   │   │   ├── ruleset-workflow-passed-sha-mismatch.json
│   │   │   │   │   │   ├── ruleset-workflow-passed-with-global-codeql.json
│   │   │   │   │   │   └── ruleset-workflow-passed.json
│   │   │   │   │   ├── pull-request.json
│   │   │   │   │   └── repo.json
│   │   │   │   ├── token_rotator.go
│   │   │   │   └── token_rotator_test.go
│   │   │   ├── gitlab/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   └── testdata/
│   │   │   │       ├── changes-available.json
│   │   │   │       ├── changes-pending.json
│   │   │   │       ├── detailed-merge-status-ci-must-pass.json
│   │   │   │       ├── detailed-merge-status-need-rebase.json
│   │   │   │       ├── group-membership-success.json
│   │   │   │       ├── head-pipeline-not-available.json
│   │   │   │       ├── merge-success-with-label.json
│   │   │   │       ├── merge-success.json
│   │   │   │       ├── pipeline-blocking-discussions-unresolved.json
│   │   │   │       ├── pipeline-remaining-approvals.json
│   │   │   │       ├── pipeline-success.json
│   │   │   │       ├── pipeline-with-pipeline-skipped.json
│   │   │   │       ├── pipeline-work-in-progress.json
│   │   │   │       ├── project-success.json
│   │   │   │       ├── pull-request.json
│   │   │   │       ├── user-multiple.json
│   │   │   │       ├── user-none.json
│   │   │   │       └── user-success.json
│   │   │   ├── mocks/
│   │   │   │   ├── mock_client.go
│   │   │   │   └── mock_pull_req_status_fetcher.go
│   │   │   ├── not_configured_vcs_client.go
│   │   │   ├── proxy.go
│   │   │   ├── pull_status_fetcher.go
│   │   │   └── vcs.go
│   │   ├── version_command_runner.go
│   │   ├── webhooks/
│   │   │   ├── http.go
│   │   │   ├── http_test.go
│   │   │   ├── mocks/
│   │   │   │   ├── mock_sender.go
│   │   │   │   ├── mock_slack_client.go
│   │   │   │   └── mock_underlying_slack_client.go
│   │   │   ├── slack.go
│   │   │   ├── slack_client.go
│   │   │   ├── slack_client_test.go
│   │   │   ├── slack_test.go
│   │   │   ├── webhooks.go
│   │   │   └── webhooks_test.go
│   │   ├── working_dir.go
│   │   ├── working_dir_locker.go
│   │   ├── working_dir_locker_test.go
│   │   └── working_dir_test.go
│   ├── jobs/
│   │   ├── job_url_setter.go
│   │   ├── job_url_setter_test.go
│   │   ├── mocks/
│   │   │   ├── mock_project_command_output_handler.go
│   │   │   ├── mock_project_job_url_generator.go
│   │   │   └── mock_project_status_updater.go
│   │   ├── project_command_output_handler.go
│   │   └── project_command_output_handler_test.go
│   ├── logging/
│   │   ├── log.go
│   │   ├── logging_test.go
│   │   ├── mocks/
│   │   │   └── mock_simple_logging.go
│   │   └── simple_logger.go
│   ├── metrics/
│   │   ├── common.go
│   │   ├── counter.go
│   │   ├── counter_test.go
│   │   ├── debug.go
│   │   ├── metricstest/
│   │   │   └── scope.go
│   │   ├── scope.go
│   │   └── scope_test.go
│   ├── middleware.go
│   ├── recovery/
│   │   ├── recovery.go
│   │   └── recovery_test.go
│   ├── router.go
│   ├── router_test.go
│   ├── scheduled/
│   │   ├── executor_service.go
│   │   ├── executor_service_test.go
│   │   ├── mocks/
│   │   │   └── mock_executor_service_job.go
│   │   ├── runtime_stats.go
│   │   └── runtime_stats_test.go
│   ├── server.go
│   ├── server_internal_test.go
│   ├── server_test.go
│   ├── static/
│   │   ├── css/
│   │   │   ├── custom.css
│   │   │   ├── normalize.css
│   │   │   ├── skeleton.css
│   │   │   └── xterm-5.3.0.css
│   │   └── js/
│   │       ├── xterm-5.3.0.js
│   │       ├── xterm-addon-attach-0.9.0.js
│   │       ├── xterm-addon-fit-0.8.0.js
│   │       ├── xterm-addon-search-0.13.0.js
│   │       └── xterm-addon-search-bar.js
│   ├── user_config.go
│   ├── user_config_test.go
│   └── utils/
│       ├── os.go
│       ├── slices.go
│       ├── spellcheck.go
│       └── spellcheck_test.go
├── testdata/
│   ├── cert.pem
│   ├── cert2.pem
│   ├── key.pem
│   └── key2.pem
├── testdrive/
│   ├── github.go
│   ├── testdrive.go
│   └── utils.go
└── testing/
    ├── Dockerfile
    ├── assertions.go
    ├── hooks/
    │   └── post_push
    ├── http.go
    └── temp_files.go
Download .txt
Showing preview only (635K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5213 symbols across 382 files)

FILE: cmd/bootstrap.go
  type TestdriveCmd (line 25) | type TestdriveCmd struct
    method Init (line 28) | func (b *TestdriveCmd) Init() *cobra.Command {

FILE: cmd/help_fmt.go
  function usageTmpl (line 22) | func usageTmpl(stringFlags map[string]stringFlag, intFlags map[string]in...
  function to80CharCols (line 124) | func to80CharCols(s string) string {

FILE: cmd/root.go
  function Execute (line 29) | func Execute() {

FILE: cmd/server.go
  constant CheckoutStrategyBranch (line 36) | CheckoutStrategyBranch = "branch"
  constant CheckoutStrategyMerge (line 37) | CheckoutStrategyMerge  = "merge"
  constant TFDistributionTerraform (line 42) | TFDistributionTerraform = "terraform"
  constant TFDistributionOpenTofu (line 43) | TFDistributionOpenTofu  = "opentofu"
  constant ADWebhookPasswordFlag (line 52) | ADWebhookPasswordFlag            = "azuredevops-webhook-password"
  constant ADWebhookUserFlag (line 53) | ADWebhookUserFlag                = "azuredevops-webhook-user"
  constant ADTokenFlag (line 54) | ADTokenFlag                      = "azuredevops-token"
  constant ADUserFlag (line 55) | ADUserFlag                       = "azuredevops-user"
  constant ADHostnameFlag (line 56) | ADHostnameFlag                   = "azuredevops-hostname"
  constant AllowCommandsFlag (line 57) | AllowCommandsFlag                = "allow-commands"
  constant AllowForkPRsFlag (line 58) | AllowForkPRsFlag                 = "allow-fork-prs"
  constant AtlantisURLFlag (line 59) | AtlantisURLFlag                  = "atlantis-url"
  constant AutoDiscoverModeFlag (line 60) | AutoDiscoverModeFlag             = "autodiscover-mode"
  constant AutomergeFlag (line 61) | AutomergeFlag                    = "automerge"
  constant ParallelPlanFlag (line 62) | ParallelPlanFlag                 = "parallel-plan"
  constant ParallelApplyFlag (line 63) | ParallelApplyFlag                = "parallel-apply"
  constant AutoplanModules (line 64) | AutoplanModules                  = "autoplan-modules"
  constant AutoplanModulesFromProjects (line 65) | AutoplanModulesFromProjects      = "autoplan-modules-from-projects"
  constant AutoplanFileListFlag (line 66) | AutoplanFileListFlag             = "autoplan-file-list"
  constant BitbucketApiUserFlag (line 67) | BitbucketApiUserFlag             = "bitbucket-api-user"
  constant BitbucketBaseURLFlag (line 68) | BitbucketBaseURLFlag             = "bitbucket-base-url"
  constant BitbucketTokenFlag (line 69) | BitbucketTokenFlag               = "bitbucket-token"
  constant BitbucketUserFlag (line 70) | BitbucketUserFlag                = "bitbucket-user"
  constant BitbucketWebhookSecretFlag (line 71) | BitbucketWebhookSecretFlag       = "bitbucket-webhook-secret"
  constant CheckoutDepthFlag (line 72) | CheckoutDepthFlag                = "checkout-depth"
  constant CheckoutStrategyFlag (line 73) | CheckoutStrategyFlag             = "checkout-strategy"
  constant ConfigFlag (line 74) | ConfigFlag                       = "config"
  constant DataDirFlag (line 75) | DataDirFlag                      = "data-dir"
  constant DefaultTFDistributionFlag (line 76) | DefaultTFDistributionFlag        = "default-tf-distribution"
  constant DefaultTFVersionFlag (line 77) | DefaultTFVersionFlag             = "default-tf-version"
  constant DisableApplyAllFlag (line 78) | DisableApplyAllFlag              = "disable-apply-all"
  constant DisableAutoplanFlag (line 79) | DisableAutoplanFlag              = "disable-autoplan"
  constant DisableAutoplanLabelFlag (line 80) | DisableAutoplanLabelFlag         = "disable-autoplan-label"
  constant DisableMarkdownFoldingFlag (line 81) | DisableMarkdownFoldingFlag       = "disable-markdown-folding"
  constant DisableRepoLockingFlag (line 82) | DisableRepoLockingFlag           = "disable-repo-locking"
  constant DisableGlobalApplyLockFlag (line 83) | DisableGlobalApplyLockFlag       = "disable-global-apply-lock"
  constant DisableUnlockLabelFlag (line 84) | DisableUnlockLabelFlag           = "disable-unlock-label"
  constant DiscardApprovalOnPlanFlag (line 85) | DiscardApprovalOnPlanFlag        = "discard-approval-on-plan"
  constant EmojiReaction (line 86) | EmojiReaction                    = "emoji-reaction"
  constant EnableDiffMarkdownFormat (line 87) | EnableDiffMarkdownFormat         = "enable-diff-markdown-format"
  constant EnablePolicyChecksFlag (line 88) | EnablePolicyChecksFlag           = "enable-policy-checks"
  constant EnableRegExpCmdFlag (line 89) | EnableRegExpCmdFlag              = "enable-regexp-cmd"
  constant EnableProfilingAPI (line 90) | EnableProfilingAPI               = "enable-profiling-api"
  constant ExecutableName (line 91) | ExecutableName                   = "executable-name"
  constant FailOnPreWorkflowHookError (line 92) | FailOnPreWorkflowHookError       = "fail-on-pre-workflow-hook-error"
  constant HideUnchangedPlanComments (line 93) | HideUnchangedPlanComments        = "hide-unchanged-plan-comments"
  constant GHHostnameFlag (line 94) | GHHostnameFlag                   = "gh-hostname"
  constant GHTeamAllowlistFlag (line 95) | GHTeamAllowlistFlag              = "gh-team-allowlist"
  constant GHTokenFlag (line 96) | GHTokenFlag                      = "gh-token"
  constant GHTokenFileFlag (line 97) | GHTokenFileFlag                  = "gh-token-file"
  constant GHUserFlag (line 98) | GHUserFlag                       = "gh-user"
  constant GHAppIDFlag (line 99) | GHAppIDFlag                      = "gh-app-id"
  constant GHAppKeyFlag (line 100) | GHAppKeyFlag                     = "gh-app-key"
  constant GHAppKeyFileFlag (line 101) | GHAppKeyFileFlag                 = "gh-app-key-file"
  constant GHAppSlugFlag (line 102) | GHAppSlugFlag                    = "gh-app-slug"
  constant GHAppInstallationIDFlag (line 103) | GHAppInstallationIDFlag          = "gh-app-installation-id"
  constant GHOrganizationFlag (line 104) | GHOrganizationFlag               = "gh-org"
  constant GHWebhookSecretFlag (line 105) | GHWebhookSecretFlag              = "gh-webhook-secret"
  constant GHAllowMergeableBypassApply (line 106) | GHAllowMergeableBypassApply      = "gh-allow-mergeable-bypass-apply"
  constant GiteaBaseURLFlag (line 107) | GiteaBaseURLFlag                 = "gitea-base-url"
  constant GiteaTokenFlag (line 108) | GiteaTokenFlag                   = "gitea-token"
  constant GiteaUserFlag (line 109) | GiteaUserFlag                    = "gitea-user"
  constant GiteaWebhookSecretFlag (line 110) | GiteaWebhookSecretFlag           = "gitea-webhook-secret"
  constant GiteaPageSizeFlag (line 111) | GiteaPageSizeFlag                = "gitea-page-size"
  constant GitlabGroupAllowlistFlag (line 112) | GitlabGroupAllowlistFlag         = "gitlab-group-allowlist"
  constant GitlabHostnameFlag (line 113) | GitlabHostnameFlag               = "gitlab-hostname"
  constant GitlabTokenFlag (line 114) | GitlabTokenFlag                  = "gitlab-token"
  constant GitlabUserFlag (line 115) | GitlabUserFlag                   = "gitlab-user"
  constant GitlabWebhookSecretFlag (line 116) | GitlabWebhookSecretFlag          = "gitlab-webhook-secret"
  constant GitlabStatusRetryEnabledFlag (line 117) | GitlabStatusRetryEnabledFlag     = "gitlab-status-retry-enabled"
  constant IncludeGitUntrackedFiles (line 118) | IncludeGitUntrackedFiles         = "include-git-untracked-files"
  constant APISecretFlag (line 119) | APISecretFlag                    = "api-secret"
  constant HidePrevPlanComments (line 120) | HidePrevPlanComments             = "hide-prev-plan-comments"
  constant QuietPolicyChecks (line 121) | QuietPolicyChecks                = "quiet-policy-checks"
  constant LockingDBType (line 122) | LockingDBType                    = "locking-db-type"
  constant LogLevelFlag (line 123) | LogLevelFlag                     = "log-level"
  constant MarkdownTemplateOverridesDirFlag (line 124) | MarkdownTemplateOverridesDirFlag = "markdown-template-overrides-dir"
  constant MaxCommentsPerCommand (line 125) | MaxCommentsPerCommand            = "max-comments-per-command"
  constant ParallelPoolSize (line 126) | ParallelPoolSize                 = "parallel-pool-size"
  constant PendingApplyStatusFlag (line 127) | PendingApplyStatusFlag           = "pending-apply-status"
  constant StatsNamespace (line 128) | StatsNamespace                   = "stats-namespace"
  constant AllowDraftPRs (line 129) | AllowDraftPRs                    = "allow-draft-prs"
  constant PortFlag (line 130) | PortFlag                         = "port"
  constant RedisDB (line 131) | RedisDB                          = "redis-db"
  constant RedisHost (line 132) | RedisHost                        = "redis-host"
  constant RedisPassword (line 133) | RedisPassword                    = "redis-password"
  constant RedisPort (line 134) | RedisPort                        = "redis-port"
  constant RedisTLSEnabled (line 135) | RedisTLSEnabled                  = "redis-tls-enabled"
  constant RedisInsecureSkipVerify (line 136) | RedisInsecureSkipVerify          = "redis-insecure-skip-verify"
  constant RepoConfigFlag (line 137) | RepoConfigFlag                   = "repo-config"
  constant RepoConfigJSONFlag (line 138) | RepoConfigJSONFlag               = "repo-config-json"
  constant RepoAllowlistFlag (line 139) | RepoAllowlistFlag                = "repo-allowlist"
  constant SilenceNoProjectsFlag (line 140) | SilenceNoProjectsFlag            = "silence-no-projects"
  constant SilenceForkPRErrorsFlag (line 141) | SilenceForkPRErrorsFlag          = "silence-fork-pr-errors"
  constant SilenceVCSStatusNoPlans (line 142) | SilenceVCSStatusNoPlans          = "silence-vcs-status-no-plans"
  constant SilenceVCSStatusNoProjectsFlag (line 143) | SilenceVCSStatusNoProjectsFlag   = "silence-vcs-status-no-projects"
  constant SilenceAllowlistErrorsFlag (line 144) | SilenceAllowlistErrorsFlag       = "silence-allowlist-errors"
  constant SkipCloneNoChanges (line 145) | SkipCloneNoChanges               = "skip-clone-no-changes"
  constant SlackTokenFlag (line 146) | SlackTokenFlag                   = "slack-token"
  constant SSLCertFileFlag (line 147) | SSLCertFileFlag                  = "ssl-cert-file"
  constant SSLKeyFileFlag (line 148) | SSLKeyFileFlag                   = "ssl-key-file"
  constant RestrictFileList (line 149) | RestrictFileList                 = "restrict-file-list"
  constant TFDistributionFlag (line 150) | TFDistributionFlag               = "tf-distribution"
  constant TFDownloadFlag (line 151) | TFDownloadFlag                   = "tf-download"
  constant TFDownloadURLFlag (line 152) | TFDownloadURLFlag                = "tf-download-url"
  constant UseTFPluginCache (line 153) | UseTFPluginCache                 = "use-tf-plugin-cache"
  constant VarFileAllowlistFlag (line 154) | VarFileAllowlistFlag             = "var-file-allowlist"
  constant VCSStatusName (line 155) | VCSStatusName                    = "vcs-status-name"
  constant IgnoreVCSStatusNames (line 156) | IgnoreVCSStatusNames             = "ignore-vcs-status-names"
  constant TFEHostnameFlag (line 157) | TFEHostnameFlag                  = "tfe-hostname"
  constant TFELocalExecutionModeFlag (line 158) | TFELocalExecutionModeFlag        = "tfe-local-execution-mode"
  constant TFETokenFlag (line 159) | TFETokenFlag                     = "tfe-token"
  constant WriteGitCredsFlag (line 160) | WriteGitCredsFlag                = "write-git-creds"
  constant WebhookHttpHeaders (line 161) | WebhookHttpHeaders               = "webhook-http-headers"
  constant WebBasicAuthFlag (line 162) | WebBasicAuthFlag                 = "web-basic-auth"
  constant WebUsernameFlag (line 163) | WebUsernameFlag                  = "web-username"
  constant WebPasswordFlag (line 164) | WebPasswordFlag                  = "web-password"
  constant WebsocketCheckOrigin (line 165) | WebsocketCheckOrigin             = "websocket-check-origin"
  constant DefaultADBasicUser (line 168) | DefaultADBasicUser                  = ""
  constant DefaultADBasicPassword (line 169) | DefaultADBasicPassword              = ""
  constant DefaultADHostname (line 170) | DefaultADHostname                   = "dev.azure.com"
  constant DefaultAutoDiscoverMode (line 171) | DefaultAutoDiscoverMode             = "auto"
  constant DefaultAutoplanFileList (line 172) | DefaultAutoplanFileList             = "**/*.tf,**/*.tfvars,**/*.tfvars.j...
  constant DefaultAllowCommands (line 173) | DefaultAllowCommands                = "version,plan,apply,unlock,approve...
  constant DefaultCheckoutStrategy (line 174) | DefaultCheckoutStrategy             = CheckoutStrategyBranch
  constant DefaultCheckoutDepth (line 175) | DefaultCheckoutDepth                = 0
  constant DefaultBitbucketBaseURL (line 176) | DefaultBitbucketBaseURL             = bitbucketcloud.BaseURL
  constant DefaultDataDir (line 177) | DefaultDataDir                      = "~/.atlantis"
  constant DefaultEmojiReaction (line 178) | DefaultEmojiReaction                = ""
  constant DefaultExecutableName (line 179) | DefaultExecutableName               = "atlantis"
  constant DefaultMarkdownTemplateOverridesDir (line 180) | DefaultMarkdownTemplateOverridesDir = "~/.markdown_templates"
  constant DefaultGHHostname (line 181) | DefaultGHHostname                   = "github.com"
  constant DefaultGiteaBaseURL (line 182) | DefaultGiteaBaseURL                 = "https://gitea.com"
  constant DefaultGiteaPageSize (line 183) | DefaultGiteaPageSize                = 30
  constant DefaultGitlabHostname (line 184) | DefaultGitlabHostname               = "gitlab.com"
  constant DefaultLockingDBType (line 185) | DefaultLockingDBType                = "boltdb"
  constant DefaultLogLevel (line 186) | DefaultLogLevel                     = "info"
  constant DefaultIgnoreVCSStatusNames (line 187) | DefaultIgnoreVCSStatusNames         = ""
  constant DefaultMaxCommentsPerCommand (line 188) | DefaultMaxCommentsPerCommand        = 100
  constant DefaultParallelPoolSize (line 189) | DefaultParallelPoolSize             = 15
  constant DefaultStatsNamespace (line 190) | DefaultStatsNamespace               = "atlantis"
  constant DefaultPort (line 191) | DefaultPort                         = 4141
  constant DefaultRedisDB (line 192) | DefaultRedisDB                      = 0
  constant DefaultRedisPort (line 193) | DefaultRedisPort                    = 6379
  constant DefaultRedisTLSEnabled (line 194) | DefaultRedisTLSEnabled              = false
  constant DefaultRedisInsecureSkipVerify (line 195) | DefaultRedisInsecureSkipVerify      = false
  constant DefaultTFDistribution (line 196) | DefaultTFDistribution               = TFDistributionTerraform
  constant DefaultTFDownloadURL (line 197) | DefaultTFDownloadURL                = "https://releases.hashicorp.com"
  constant DefaultTFDownload (line 198) | DefaultTFDownload                   = true
  constant DefaultTFEHostname (line 199) | DefaultTFEHostname                  = "app.terraform.io"
  constant DefaultVCSStatusName (line 200) | DefaultVCSStatusName                = "atlantis"
  constant DefaultWebBasicAuth (line 201) | DefaultWebBasicAuth                 = false
  constant DefaultWebUsername (line 202) | DefaultWebUsername                  = "atlantis"
  constant DefaultWebPassword (line 203) | DefaultWebPassword                  = "atlantis"
  type stringFlag (line 708) | type stringFlag struct
  type intFlag (line 713) | type intFlag struct
  type int64Flag (line 718) | type int64Flag struct
  type boolFlag (line 723) | type boolFlag struct
  type ServerCmd (line 731) | type ServerCmd struct
    method Init (line 762) | func (s *ServerCmd) Init() *cobra.Command {
    method preRun (line 842) | func (s *ServerCmd) preRun() error {
    method run (line 854) | func (s *ServerCmd) run() error {
    method setDefaults (line 901) | func (s *ServerCmd) setDefaults(c *server.UserConfig, v *viper.Viper) {
    method validate (line 997) | func (s *ServerCmd) validate(userConfig server.UserConfig) error {
    method setAtlantisURL (line 1114) | func (s *ServerCmd) setAtlantisURL(userConfig *server.UserConfig) error {
    method setDataDir (line 1128) | func (s *ServerCmd) setDataDir(userConfig *server.UserConfig) error {
    method setMarkdownTemplateOverridesDir (line 1152) | func (s *ServerCmd) setMarkdownTemplateOverridesDir(userConfig *server...
    method setVarFileAllowlist (line 1175) | func (s *ServerCmd) setVarFileAllowlist(userConfig *server.UserConfig) {
    method trimAtSymbolFromUsers (line 1182) | func (s *ServerCmd) trimAtSymbolFromUsers(userConfig *server.UserConfi...
    method securityWarnings (line 1190) | func (s *ServerCmd) securityWarnings(userConfig *server.UserConfig) {
    method deprecationWarnings (line 1210) | func (s *ServerCmd) deprecationWarnings(userConfig *server.UserConfig)...
    method withErrPrint (line 1237) | func (s *ServerCmd) withErrPrint(f func(*cobra.Command, []string) erro...
    method printErr (line 1248) | func (s *ServerCmd) printErr(err error) {
  type ServerCreator (line 743) | type ServerCreator interface
  type DefaultServerCreator (line 748) | type DefaultServerCreator struct
    method NewServer (line 757) | func (d *DefaultServerCreator) NewServer(userConfig server.UserConfig,...
  type ServerStarter (line 752) | type ServerStarter interface
  function isValidLogLevel (line 1252) | func isValidLogLevel(level string) bool {

FILE: cmd/server_test.go
  type ServerCreatorMock (line 42) | type ServerCreatorMock struct
    method NewServer (line 44) | func (s *ServerCreatorMock) NewServer(userConfig server.UserConfig, _ ...
  type ServerStarterMock (line 49) | type ServerStarterMock struct
    method Start (line 51) | func (s *ServerStarterMock) Start() error {
  function TestExecute_Defaults (line 173) | func TestExecute_Defaults(t *testing.T) {
  function TestExecute_Flags (line 228) | func TestExecute_Flags(t *testing.T) {
  function getUserConfigKeysWithFlags (line 238) | func getUserConfigKeysWithFlags() []string {
  function TestUserConfigAllTested (line 258) | func TestUserConfigAllTested(t *testing.T) {
  function getDocumentedFlags (line 275) | func getDocumentedFlags(t *testing.T) []string {
  function testIsSorted (line 310) | func testIsSorted[S ~[]E, E cmp.Ordered](t *testing.T, x S) {
  function TestAllFlagsDocumented (line 331) | func TestAllFlagsDocumented(t *testing.T) {
  function TestExecute_ConfigFile (line 363) | func TestExecute_ConfigFile(t *testing.T) {
  function TestExecute_EnvironmentVariables (line 380) | func TestExecute_EnvironmentVariables(t *testing.T) {
  function TestExecute_NoConfigFlag (line 395) | func TestExecute_NoConfigFlag(t *testing.T) {
  function TestExecute_ConfigFileExtension (line 404) | func TestExecute_ConfigFileExtension(t *testing.T) {
  function TestExecute_ConfigFileMissing (line 413) | func TestExecute_ConfigFileMissing(t *testing.T) {
  function TestExecute_ConfigFileExists (line 422) | func TestExecute_ConfigFileExists(t *testing.T) {
  function TestExecute_InvalidConfig (line 433) | func TestExecute_InvalidConfig(t *testing.T) {
  function TestExecute_RepoAllowlistScheme (line 445) | func TestExecute_RepoAllowlistScheme(t *testing.T) {
  function TestExecute_ValidateLogLevel (line 456) | func TestExecute_ValidateLogLevel(t *testing.T) {
  function TestExecute_ValidateCheckoutStrategy (line 489) | func TestExecute_ValidateCheckoutStrategy(t *testing.T) {
  function TestExecute_ValidateSSLConfig (line 497) | func TestExecute_ValidateSSLConfig(t *testing.T) {
  function TestExecute_ValidateVCSConfig (line 545) | func TestExecute_ValidateVCSConfig(t *testing.T) {
  function TestExecute_ValidateAllowCommands (line 793) | func TestExecute_ValidateAllowCommands(t *testing.T) {
  function TestExecute_ExpandHomeInDataDir (line 823) | func TestExecute_ExpandHomeInDataDir(t *testing.T) {
  function TestExecute_RelativeDataDir (line 839) | func TestExecute_RelativeDataDir(t *testing.T) {
  function TestExecute_GithubUser (line 854) | func TestExecute_GithubUser(t *testing.T) {
  function TestExecute_GithubApp (line 867) | func TestExecute_GithubApp(t *testing.T) {
  function TestExecute_GithubAppWithInstallationID (line 880) | func TestExecute_GithubAppWithInstallationID(t *testing.T) {
  function TestExecute_GiteaUser (line 895) | func TestExecute_GiteaUser(t *testing.T) {
  function TestExecute_GitlabUser (line 908) | func TestExecute_GitlabUser(t *testing.T) {
  function TestExecute_BitbucketUser (line 921) | func TestExecute_BitbucketUser(t *testing.T) {
  function TestExecute_ADUser (line 934) | func TestExecute_ADUser(t *testing.T) {
  function TestExecute_BitbucketServerBaseURLScheme (line 948) | func TestExecute_BitbucketServerBaseURLScheme(t *testing.T) {
  function TestExecute_BitbucketServerBaseURLPort (line 967) | func TestExecute_BitbucketServerBaseURLPort(t *testing.T) {
  function TestExecute_RepoCfgFlags (line 979) | func TestExecute_RepoCfgFlags(t *testing.T) {
  function TestExecute_TFEHostnameOnly (line 992) | func TestExecute_TFEHostnameOnly(t *testing.T) {
  function TestExecute_AllowAndWhitelist (line 1004) | func TestExecute_AllowAndWhitelist(t *testing.T) {
  function TestExecute_AutoDetectModulesFromProjects_Env (line 1013) | func TestExecute_AutoDetectModulesFromProjects_Env(t *testing.T) {
  function TestExecute_AutoDetectModulesFromProjects (line 1021) | func TestExecute_AutoDetectModulesFromProjects(t *testing.T) {
  function TestExecute_AutoplanFileList (line 1030) | func TestExecute_AutoplanFileList(t *testing.T) {
  function TestExecute_ValidateDefaultTFDistribution (line 1077) | func TestExecute_ValidateDefaultTFDistribution(t *testing.T) {
  function setup (line 1117) | func setup(flags map[string]any, t *testing.T) *cobra.Command {
  function setupWithDefaults (line 1131) | func setupWithDefaults(flags map[string]any, t *testing.T) *cobra.Command {
  function tempFile (line 1149) | func tempFile(t *testing.T, contents string) string {
  function configVal (line 1159) | func configVal(t *testing.T, u server.UserConfig, tag string) any {
  function TestExecute_GiteaBaseURLScheme (line 1173) | func TestExecute_GiteaBaseURLScheme(t *testing.T) {
  function TestExecute_GiteaWithWebhookSecret (line 1191) | func TestExecute_GiteaWithWebhookSecret(t *testing.T) {
  function TestExecute_GiteaBaseURLPort (line 1203) | func TestExecute_GiteaBaseURLPort(t *testing.T) {

FILE: cmd/version.go
  type VersionCmd (line 23) | type VersionCmd struct
    method Init (line 28) | func (v *VersionCmd) Init() *cobra.Command {

FILE: e2e/e2e.go
  type E2ETester (line 25) | type E2ETester struct
    method Start (line 44) | func (t *E2ETester) Start(ctx context.Context) (*E2EResult, error) {
  type E2EResult (line 32) | type E2EResult struct
  function cleanUp (line 154) | func cleanUp(ctx context.Context, t *E2ETester, pullRequestNumber int, b...

FILE: e2e/github.go
  type GithubClient (line 27) | type GithubClient struct
    method Clone (line 71) | func (g GithubClient) Clone(cloneDir string) error {
    method CreateAtlantisWebhook (line 83) | func (g GithubClient) CreateAtlantisWebhook(ctx context.Context, hookU...
    method DeleteAtlantisHook (line 105) | func (g GithubClient) DeleteAtlantisHook(ctx context.Context, hookID i...
    method CreatePullRequest (line 115) | func (g GithubClient) CreatePullRequest(ctx context.Context, title, br...
    method GetAtlantisStatus (line 131) | func (g GithubClient) GetAtlantisStatus(ctx context.Context, branchNam...
    method ClosePullRequest (line 147) | func (g GithubClient) ClosePullRequest(ctx context.Context, pullReques...
    method DeleteBranch (line 156) | func (g GithubClient) DeleteBranch(ctx context.Context, branchName str...
    method IsAtlantisInProgress (line 166) | func (g GithubClient) IsAtlantisInProgress(state string) bool {
    method DidAtlantisSucceed (line 175) | func (g GithubClient) DidAtlantisSucceed(state string) bool {
  function NewGithubClient (line 35) | func NewGithubClient() *GithubClient {

FILE: e2e/gitlab.go
  type GitlabClient (line 26) | type GitlabClient struct
    method Clone (line 77) | func (g GitlabClient) Clone(cloneDir string) error {
    method CreateAtlantisWebhook (line 90) | func (g GitlabClient) CreateAtlantisWebhook(ctx context.Context, hookU...
    method DeleteAtlantisHook (line 104) | func (g GitlabClient) DeleteAtlantisHook(ctx context.Context, hookID i...
    method CreatePullRequest (line 113) | func (g GitlabClient) CreatePullRequest(ctx context.Context, title, br...
    method GetAtlantisStatus (line 128) | func (g GitlabClient) GetAtlantisStatus(ctx context.Context, branchNam...
    method ClosePullRequest (line 147) | func (g GitlabClient) ClosePullRequest(ctx context.Context, pullReques...
    method DeleteBranch (line 158) | func (g GitlabClient) DeleteBranch(ctx context.Context, branchName str...
    method IsAtlantisInProgress (line 168) | func (g GitlabClient) IsAtlantisInProgress(state string) bool {
    method DidAtlantisSucceed (line 179) | func (g GitlabClient) DidAtlantisSucceed(state string) bool {
  function NewGitlabClient (line 37) | func NewGitlabClient() *GitlabClient {

FILE: e2e/main.go
  type Project (line 33) | type Project struct
  function getVCSClient (line 38) | func getVCSClient() (VCSClient, error) {
  function main (line 52) | func main() {
  function cleanDir (line 107) | func cleanDir(path string) error {
  function startTests (line 111) | func startTests(ctx context.Context, e2e E2ETester) ([]*E2EResult, error) {

FILE: e2e/vcs.go
  type VCSClient (line 18) | type VCSClient interface

FILE: main.go
  function main (line 35) | func main() {

FILE: runatlantis.io/.vitepress/theme/index.ts
  method Layout (line 6) | Layout() {

FILE: server/controllers/api_controller.go
  constant atlantisTokenHeader (line 24) | atlantisTokenHeader = "X-Atlantis-Token"
  type APIController (line 26) | type APIController struct
    method apiReportError (line 88) | func (a *APIController) apiReportError(w http.ResponseWriter, code int...
    method Plan (line 95) | func (a *APIController) Plan(w http.ResponseWriter, r *http.Request) {
    method Apply (line 129) | func (a *APIController) Apply(w http.ResponseWriter, r *http.Request) {
    method ListLocks (line 186) | func (a *APIController) ListLocks(w http.ResponseWriter, r *http.Reque...
    method apiSetup (line 219) | func (a *APIController) apiSetup(ctx *command.Context, cmdName command...
    method apiPlan (line 240) | func (a *APIController) apiPlan(request *APIRequest, ctx *command.Cont...
    method apiApply (line 288) | func (a *APIController) apiApply(request *APIRequest, ctx *command.Con...
    method apiParseAndValidate (line 336) | func (a *APIController) apiParseAndValidate(r *http.Request) (*APIRequ...
    method respond (line 394) | func (a *APIController) respond(w http.ResponseWriter, lvl logging.Log...
  type APIRequest (line 47) | type APIRequest struct
    method getCommands (line 59) | func (a *APIRequest) getCommands(ctx *command.Context, cmdName command...
  type LockDetail (line 170) | type LockDetail struct
  type ListLocksResult (line 182) | type ListLocksResult struct

FILE: server/controllers/api_controller_test.go
  constant atlantisTokenHeader (line 29) | atlantisTokenHeader = "X-Atlantis-Token"
  constant atlantisToken (line 30) | atlantisToken = "token"
  function TestAPIController_Plan (line 32) | func TestAPIController_Plan(t *testing.T) {
  function TestAPIController_Apply (line 119) | func TestAPIController_Apply(t *testing.T) {
  function TestAPIController_Plan_PreWorkflowHooksReceiveCorrectCommand (line 210) | func TestAPIController_Plan_PreWorkflowHooksReceiveCorrectCommand(t *tes...
  function TestAPIController_Apply_PreWorkflowHooksReceiveCorrectCommand (line 243) | func TestAPIController_Apply_PreWorkflowHooksReceiveCorrectCommand(t *te...
  function TestAPIController_ListLocks (line 280) | func TestAPIController_ListLocks(t *testing.T) {
  function TestAPIController_ListLocksEmpty (line 319) | func TestAPIController_ListLocksEmpty(t *testing.T) {
  function setup (line 336) | func setup(t *testing.T) (controllers.APIController, *MockProjectCommand...

FILE: server/controllers/events/azuredevops_request_validator.go
  type AzureDevopsRequestValidator (line 18) | type AzureDevopsRequestValidator interface
  type DefaultAzureDevopsRequestValidator (line 29) | type DefaultAzureDevopsRequestValidator struct
    method Validate (line 35) | func (d *DefaultAzureDevopsRequestValidator) Validate(r *http.Request,...
    method validateWithBasicAuth (line 42) | func (d *DefaultAzureDevopsRequestValidator) validateWithBasicAuth(r *...
    method validateWithoutBasicAuth (line 50) | func (d *DefaultAzureDevopsRequestValidator) validateWithoutBasicAuth(...

FILE: server/controllers/events/azuredevops_request_validator_test.go
  function TestAzureDevopsValidate_WithBasicAuthErr (line 16) | func TestAzureDevopsValidate_WithBasicAuthErr(t *testing.T) {
  function TestAzureDevopsValidate_WithBasicAuth (line 31) | func TestAzureDevopsValidate_WithBasicAuth(t *testing.T) {
  function TestAzureDevopsValidate_WithoutSecretInvalidContentType (line 46) | func TestAzureDevopsValidate_WithoutSecretInvalidContentType(t *testing....
  function TestAzureDevopsValidate_WithoutSecretJSON (line 60) | func TestAzureDevopsValidate_WithoutSecretJSON(t *testing.T) {

FILE: server/controllers/events/events_controller.go
  constant githubHeader (line 42) | githubHeader = "X-Github-Event"
  constant gitlabHeader (line 43) | gitlabHeader = "X-Gitlab-Event"
  constant azuredevopsHeader (line 44) | azuredevopsHeader = "Request-Id"
  constant giteaHeader (line 46) | giteaHeader = "X-Gitea-Event"
  constant giteaEventTypeHeader (line 47) | giteaEventTypeHeader = "X-Gitea-Event-Type"
  constant giteaSignatureHeader (line 48) | giteaSignatureHeader = "X-Gitea-Signature"
  constant giteaRequestIDHeader (line 49) | giteaRequestIDHeader = "X-Gitea-Delivery"
  constant bitbucketEventTypeHeader (line 52) | bitbucketEventTypeHeader = "X-Event-Key"
  constant bitbucketCloudRequestIDHeader (line 53) | bitbucketCloudRequestIDHeader = "X-Request-UUID"
  constant bitbucketServerRequestIDHeader (line 54) | bitbucketServerRequestIDHeader = "X-Request-ID"
  constant bitbucketSignatureHeader (line 55) | bitbucketSignatureHeader = "X-Hub-Signature"
  constant azuredevopsTestURL (line 58) | azuredevopsTestURL = "https://fabrikam.visualstudio.com/DefaultCollectio...
  type VCSEventsController (line 62) | type VCSEventsController struct
    method Post (line 109) | func (e *VCSEventsController) Post(w http.ResponseWriter, r *http.Requ...
    method handleGithubPost (line 177) | func (e *VCSEventsController) handleGithubPost(w http.ResponseWriter, ...
    method handleBitbucketCloudPost (line 225) | func (e *VCSEventsController) handleBitbucketCloudPost(w http.Response...
    method handleBitbucketServerPost (line 255) | func (e *VCSEventsController) handleBitbucketServerPost(w http.Respons...
    method handleAzureDevopsPost (line 291) | func (e *VCSEventsController) handleAzureDevopsPost(w http.ResponseWri...
    method handleGiteaPost (line 318) | func (e *VCSEventsController) handleGiteaPost(w http.ResponseWriter, r...
    method handleGiteaPullRequestEvent (line 356) | func (e *VCSEventsController) handleGiteaPullRequestEvent(logger loggi...
    method HandleGiteaPullRequestCommentEvent (line 390) | func (e *VCSEventsController) HandleGiteaPullRequestCommentEvent(w htt...
    method HandleGithubCommentEvent (line 409) | func (e *VCSEventsController) HandleGithubCommentEvent(event *github.I...
    method HandleBitbucketCloudCommentEvent (line 438) | func (e *VCSEventsController) HandleBitbucketCloudCommentEvent(w http....
    method HandleBitbucketServerCommentEvent (line 459) | func (e *VCSEventsController) HandleBitbucketServerCommentEvent(w http...
    method handleBitbucketCloudPullRequestEvent (line 479) | func (e *VCSEventsController) handleBitbucketCloudPullRequestEvent(log...
    method handleBitbucketServerPullRequestEvent (line 509) | func (e *VCSEventsController) handleBitbucketServerPullRequestEvent(lo...
    method HandleGithubPullRequestEvent (line 541) | func (e *VCSEventsController) HandleGithubPullRequestEvent(logger logg...
    method handlePullRequestEvent (line 565) | func (e *VCSEventsController) handlePullRequestEvent(logger logging.Si...
    method handleGitlabPost (line 629) | func (e *VCSEventsController) handleGitlabPost(w http.ResponseWriter, ...
    method HandleGitlabCommentEvent (line 654) | func (e *VCSEventsController) HandleGitlabCommentEvent(w http.Response...
    method handleCommentEvent (line 675) | func (e *VCSEventsController) handleCommentEvent(logger logging.Simple...
    method HandleGitlabMergeRequestEvent (line 758) | func (e *VCSEventsController) HandleGitlabMergeRequestEvent(logger log...
    method HandleAzureDevopsPullRequestCommentedEvent (line 789) | func (e *VCSEventsController) HandleAzureDevopsPullRequestCommentedEve...
    method HandleAzureDevopsPullRequestEvent (line 842) | func (e *VCSEventsController) HandleAzureDevopsPullRequestEvent(w http...
    method supportsHost (line 891) | func (e *VCSEventsController) supportsHost(h models.VCSHostType) bool {
    method respond (line 895) | func (e *VCSEventsController) respond(w http.ResponseWriter, lvl loggi...
    method commentNotAllowlisted (line 904) | func (e *VCSEventsController) commentNotAllowlisted(baseRepo models.Re...
  type HTTPError (line 166) | type HTTPError struct
  type HTTPResponse (line 172) | type HTTPResponse struct
  function isAzureDevOpsTestRepoURL (line 915) | func isAzureDevOpsTestRepoURL(repository *azuredevops.GitRepository) bool {

FILE: server/controllers/events/events_controller_e2e_test.go
  constant conftestCommand (line 52) | conftestCommand = "conftest"
  type NoopTFDownloader (line 57) | type NoopTFDownloader struct
    method Install (line 63) | func (m *NoopTFDownloader) Install(_ string, _ string, _ *version.Vers...
  type LocalConftestCache (line 67) | type LocalConftestCache struct
    method Get (line 70) | func (m *LocalConftestCache) Get(_ *version.Version) (string, error) {
  function TestGitHubWorkflow (line 74) | func TestGitHubWorkflow(t *testing.T) {
  function TestSimpleWorkflow_terraformLockFile (line 732) | func TestSimpleWorkflow_terraformLockFile(t *testing.T) {
  function TestGitHubWorkflowWithPolicyCheck (line 901) | func TestGitHubWorkflowWithPolicyCheck(t *testing.T) {
  type setupOption (line 1299) | type setupOption struct
  function setupE2E (line 1307) | func setupE2E(t *testing.T, repoDir string, opt setupOption) (events_con...
  type mockLockURLGenerator (line 1693) | type mockLockURLGenerator struct
    method GenerateLockURL (line 1695) | func (m *mockLockURLGenerator) GenerateLockURL(_ string) string {
  type mockWebhookSender (line 1699) | type mockWebhookSender struct
    method Send (line 1701) | func (w *mockWebhookSender) Send(_ logging.SimpleLogging, _ webhooks.A...
  function GitHubCommentEvent (line 1705) | func GitHubCommentEvent(t *testing.T, comment string) *http.Request {
  function GitHubPullRequestOpenedEvent (line 1718) | func GitHubPullRequestOpenedEvent(t *testing.T, headSHA string) *http.Re...
  function GitHubPullRequestClosedEvent (line 1730) | func GitHubPullRequestClosedEvent(t *testing.T) *http.Request {
  function GitHubPullRequestParsed (line 1740) | func GitHubPullRequestParsed(headSHA string) *github.PullRequest {
  function absRepoPath (line 1771) | func absRepoPath(t *testing.T, repoDir string) string {
  function initializeRepo (line 1783) | func initializeRepo(t *testing.T, repoDir string) (string, string) {
  function runCmd (line 1806) | func runCmd(t *testing.T, dir string, name string, args ...string) string {
  function assertCommentEquals (line 1814) | func assertCommentEquals(t *testing.T, expReplies []string, act string, ...
  function mkSubDirs (line 1872) | func mkSubDirs(t *testing.T) (string, string, string) {
  function ensureRunningConftest (line 1886) | func ensureRunningConftest(t *testing.T) {
  function ensureRunning014 (line 1900) | func ensureRunning014(t *testing.T) {

FILE: server/controllers/events/events_controller_test.go
  constant githubHeader (line 44) | githubHeader = "X-Github-Event"
  constant giteaHeader (line 45) | giteaHeader = "X-Gitea-Event"
  constant gitlabHeader (line 46) | gitlabHeader = "X-Gitlab-Event"
  constant azuredevopsHeader (line 47) | azuredevopsHeader = "Request-Id"
  function TestPost_NotGithubOrGitlab (line 52) | func TestPost_NotGithubOrGitlab(t *testing.T) {
  function TestPost_UnsupportedVCSGithub (line 61) | func TestPost_UnsupportedVCSGithub(t *testing.T) {
  function TestPost_UnsupportedVCSGitea (line 72) | func TestPost_UnsupportedVCSGitea(t *testing.T) {
  function TestPost_UnsupportedVCSGitlab (line 83) | func TestPost_UnsupportedVCSGitlab(t *testing.T) {
  function TestPost_InvalidGithubSecret (line 94) | func TestPost_InvalidGithubSecret(t *testing.T) {
  function TestPost_InvalidGiteaSecret (line 105) | func TestPost_InvalidGiteaSecret(t *testing.T) {
  function TestPost_InvalidGitlabSecret (line 116) | func TestPost_InvalidGitlabSecret(t *testing.T) {
  function TestPost_UnsupportedGithubEvent (line 127) | func TestPost_UnsupportedGithubEvent(t *testing.T) {
  function TestPost_UnsupportedGiteaEvent (line 138) | func TestPost_UnsupportedGiteaEvent(t *testing.T) {
  function TestPost_UnsupportedGitlabEvent (line 150) | func TestPost_UnsupportedGitlabEvent(t *testing.T) {
  function TestPost_GitlabCommentOnCommit (line 163) | func TestPost_GitlabCommentOnCommit(t *testing.T) {
  function TestPost_GithubCommentNotCreated (line 173) | func TestPost_GithubCommentNotCreated(t *testing.T) {
  function TestPost_GithubInvalidComment (line 186) | func TestPost_GithubInvalidComment(t *testing.T) {
  function TestPost_GitlabCommentInvalidCommand (line 199) | func TestPost_GitlabCommentInvalidCommand(t *testing.T) {
  function TestPost_GithubCommentInvalidCommand (line 211) | func TestPost_GithubCommentInvalidCommand(t *testing.T) {
  function TestPost_GitlabCommentNotAllowlisted (line 226) | func TestPost_GitlabCommentNotAllowlisted(t *testing.T) {
  function TestPost_GitlabCommentNotAllowlistedWithSilenceErrors (line 260) | func TestPost_GitlabCommentNotAllowlistedWithSilenceErrors(t *testing.T) {
  function TestPost_GithubCommentNotAllowlisted (line 294) | func TestPost_GithubCommentNotAllowlisted(t *testing.T) {
  function TestPost_GithubCommentNotAllowlistedWithSilenceErrors (line 329) | func TestPost_GithubCommentNotAllowlistedWithSilenceErrors(t *testing.T) {
  function TestPost_GitlabCommentResponse (line 363) | func TestPost_GitlabCommentResponse(t *testing.T) {
  function TestPost_GithubCommentResponse (line 376) | func TestPost_GithubCommentResponse(t *testing.T) {
  function TestPost_GitlabCommentSuccess (line 394) | func TestPost_GitlabCommentSuccess(t *testing.T) {
  function TestPost_GithubCommentSuccess (line 409) | func TestPost_GithubCommentSuccess(t *testing.T) {
  function TestPost_GithubCommentReaction (line 428) | func TestPost_GithubCommentReaction(t *testing.T) {
  function TestPost_GilabCommentReaction (line 448) | func TestPost_GilabCommentReaction(t *testing.T) {
  function TestPost_GithubPullRequestInvalid (line 462) | func TestPost_GithubPullRequestInvalid(t *testing.T) {
  function TestPost_GitlabMergeRequestInvalid (line 476) | func TestPost_GitlabMergeRequestInvalid(t *testing.T) {
  function TestPost_GithubPullRequestNotAllowlisted (line 490) | func TestPost_GithubPullRequestNotAllowlisted(t *testing.T) {
  function TestPost_GitlabMergeRequestNotAllowlisted (line 506) | func TestPost_GitlabMergeRequestNotAllowlisted(t *testing.T) {
  function TestPost_GithubPullRequestUnsupportedAction (line 525) | func TestPost_GithubPullRequestUnsupportedAction(t *testing.T) {
  function TestPost_GitlabMergeRequestUnsupportedAction (line 539) | func TestPost_GitlabMergeRequestUnsupportedAction(t *testing.T) {
  function TestPost_AzureDevopsPullRequestIgnoreEvent (line 557) | func TestPost_AzureDevopsPullRequestIgnoreEvent(t *testing.T) {
  function TestPost_AzureDevopsPullRequestDeletedCommentIgnoreEvent (line 609) | func TestPost_AzureDevopsPullRequestDeletedCommentIgnoreEvent(t *testing...
  function TestPost_AzureDevopsPullRequestCommentWebhookTestIgnoreEvent (line 642) | func TestPost_AzureDevopsPullRequestCommentWebhookTestIgnoreEvent(t *tes...
  function TestPost_AzureDevopsPullRequestWebhookTestIgnoreEvent (line 690) | func TestPost_AzureDevopsPullRequestWebhookTestIgnoreEvent(t *testing.T) {
  function TestPost_AzureDevopsPullRequestCommentPassingIgnores (line 737) | func TestPost_AzureDevopsPullRequestCommentPassingIgnores(t *testing.T) {
  function TestPost_GithubPullRequestClosedErrCleaningPull (line 778) | func TestPost_GithubPullRequestClosedErrCleaningPull(t *testing.T) {
  function TestPost_GitlabMergeRequestClosedErrCleaningPull (line 797) | func TestPost_GitlabMergeRequestClosedErrCleaningPull(t *testing.T) {
  function TestPost_GithubClosedPullRequestSuccess (line 815) | func TestPost_GithubClosedPullRequestSuccess(t *testing.T) {
  function TestPost_GitlabMergeRequestSuccess (line 833) | func TestPost_GitlabMergeRequestSuccess(t *testing.T) {
  function TestPost_BBServerPullClosed (line 849) | func TestPost_BBServerPullClosed(t *testing.T) {
  function TestPost_PullOpenedOrUpdated (line 931) | func TestPost_PullOpenedOrUpdated(t *testing.T) {
  function setup (line 992) | func setup(t *testing.T) (events_controllers.VCSEventsController, *mocks...

FILE: server/controllers/events/github_request_validator.go
  type GithubRequestValidator (line 29) | type GithubRequestValidator interface
  type DefaultGithubRequestValidator (line 39) | type DefaultGithubRequestValidator struct
    method Validate (line 45) | func (d *DefaultGithubRequestValidator) Validate(r *http.Request, secr...
    method validateAgainstSecret (line 52) | func (d *DefaultGithubRequestValidator) validateAgainstSecret(r *http....
    method validateWithoutSecret (line 60) | func (d *DefaultGithubRequestValidator) validateWithoutSecret(r *http....

FILE: server/controllers/events/github_request_validator_test.go
  function TestValidate_WithSecretErr (line 27) | func TestValidate_WithSecretErr(t *testing.T) {
  function TestValidate_WithSecret (line 42) | func TestValidate_WithSecret(t *testing.T) {
  function TestValidate_WithoutSecretInvalidContentType (line 57) | func TestValidate_WithoutSecretInvalidContentType(t *testing.T) {
  function TestValidate_WithoutSecretJSON (line 71) | func TestValidate_WithoutSecretJSON(t *testing.T) {
  function TestValidate_WithoutSecretFormNoPayload (line 85) | func TestValidate_WithoutSecretFormNoPayload(t *testing.T) {
  function TestValidate_WithoutSecretForm (line 99) | func TestValidate_WithoutSecretForm(t *testing.T) {

FILE: server/controllers/events/gitlab_request_parser_validator.go
  constant secretHeader (line 26) | secretHeader = "X-Gitlab-Token"
  type GitlabRequestParserValidator (line 31) | type GitlabRequestParserValidator interface
  type DefaultGitlabRequestParserValidator (line 55) | type DefaultGitlabRequestParserValidator struct
    method ParseAndValidate (line 59) | func (d *DefaultGitlabRequestParserValidator) ParseAndValidate(r *http...

FILE: server/controllers/events/gitlab_request_parser_validator_test.go
  function TestValidate_InvalidSecret (line 30) | func TestValidate_InvalidSecret(t *testing.T) {
  function TestValidate_ValidSecret (line 42) | func TestValidate_ValidSecret(t *testing.T) {
  function TestValidate_NoSecret (line 55) | func TestValidate_NoSecret(t *testing.T) {
  function TestValidate_InvalidMergeEvent (line 68) | func TestValidate_InvalidMergeEvent(t *testing.T) {
  function TestValidate_InvalidMergeCommentEvent (line 80) | func TestValidate_InvalidMergeCommentEvent(t *testing.T) {
  function TestValidate_UnrecognizedEvent (line 92) | func TestValidate_UnrecognizedEvent(t *testing.T) {
  function TestValidate_ValidMergeEvent (line 104) | func TestValidate_ValidMergeEvent(t *testing.T) {
  function TestValidate_CommitCommentEvent (line 118) | func TestValidate_CommitCommentEvent(t *testing.T) {
  function TestValidate_ValidMergeCommentEvent (line 129) | func TestValidate_ValidMergeCommentEvent(t *testing.T) {

FILE: server/controllers/events/mocks/mock_azuredevops_request_validator.go
  type MockAzureDevopsRequestValidator (line 13) | type MockAzureDevopsRequestValidator struct
    method SetFailHandler (line 25) | func (mock *MockAzureDevopsRequestValidator) SetFailHandler(fh pegomoc...
    method FailHandler (line 26) | func (mock *MockAzureDevopsRequestValidator) FailHandler() pegomock.Fa...
    method Validate (line 28) | func (mock *MockAzureDevopsRequestValidator) Validate(r *http.Request,...
    method VerifyWasCalledOnce (line 47) | func (mock *MockAzureDevopsRequestValidator) VerifyWasCalledOnce() *Ve...
    method VerifyWasCalled (line 54) | func (mock *MockAzureDevopsRequestValidator) VerifyWasCalled(invocatio...
    method VerifyWasCalledInOrder (line 61) | func (mock *MockAzureDevopsRequestValidator) VerifyWasCalledInOrder(in...
    method VerifyWasCalledEventually (line 69) | func (mock *MockAzureDevopsRequestValidator) VerifyWasCalledEventually...
  function NewMockAzureDevopsRequestValidator (line 17) | func NewMockAzureDevopsRequestValidator(options ...pegomock.Option) *Moc...
  type VerifierMockAzureDevopsRequestValidator (line 77) | type VerifierMockAzureDevopsRequestValidator struct
    method Validate (line 84) | func (verifier *VerifierMockAzureDevopsRequestValidator) Validate(r *h...
  type MockAzureDevopsRequestValidator_Validate_OngoingVerification (line 90) | type MockAzureDevopsRequestValidator_Validate_OngoingVerification struct
    method GetCapturedArguments (line 95) | func (c *MockAzureDevopsRequestValidator_Validate_OngoingVerification)...
    method GetAllCapturedArguments (line 100) | func (c *MockAzureDevopsRequestValidator_Validate_OngoingVerification)...

FILE: server/controllers/events/mocks/mock_github_request_validator.go
  type MockGithubRequestValidator (line 13) | type MockGithubRequestValidator struct
    method SetFailHandler (line 25) | func (mock *MockGithubRequestValidator) SetFailHandler(fh pegomock.Fai...
    method FailHandler (line 26) | func (mock *MockGithubRequestValidator) FailHandler() pegomock.FailHan...
    method Validate (line 28) | func (mock *MockGithubRequestValidator) Validate(r *http.Request, secr...
    method VerifyWasCalledOnce (line 47) | func (mock *MockGithubRequestValidator) VerifyWasCalledOnce() *Verifie...
    method VerifyWasCalled (line 54) | func (mock *MockGithubRequestValidator) VerifyWasCalled(invocationCoun...
    method VerifyWasCalledInOrder (line 61) | func (mock *MockGithubRequestValidator) VerifyWasCalledInOrder(invocat...
    method VerifyWasCalledEventually (line 69) | func (mock *MockGithubRequestValidator) VerifyWasCalledEventually(invo...
  function NewMockGithubRequestValidator (line 17) | func NewMockGithubRequestValidator(options ...pegomock.Option) *MockGith...
  type VerifierMockGithubRequestValidator (line 77) | type VerifierMockGithubRequestValidator struct
    method Validate (line 84) | func (verifier *VerifierMockGithubRequestValidator) Validate(r *http.R...
  type MockGithubRequestValidator_Validate_OngoingVerification (line 90) | type MockGithubRequestValidator_Validate_OngoingVerification struct
    method GetCapturedArguments (line 95) | func (c *MockGithubRequestValidator_Validate_OngoingVerification) GetC...
    method GetAllCapturedArguments (line 100) | func (c *MockGithubRequestValidator_Validate_OngoingVerification) GetA...

FILE: server/controllers/events/mocks/mock_gitlab_request_parser_validator.go
  type MockGitlabRequestParserValidator (line 13) | type MockGitlabRequestParserValidator struct
    method SetFailHandler (line 25) | func (mock *MockGitlabRequestParserValidator) SetFailHandler(fh pegomo...
    method FailHandler (line 26) | func (mock *MockGitlabRequestParserValidator) FailHandler() pegomock.F...
    method ParseAndValidate (line 28) | func (mock *MockGitlabRequestParserValidator) ParseAndValidate(r *http...
    method VerifyWasCalledOnce (line 47) | func (mock *MockGitlabRequestParserValidator) VerifyWasCalledOnce() *V...
    method VerifyWasCalled (line 54) | func (mock *MockGitlabRequestParserValidator) VerifyWasCalled(invocati...
    method VerifyWasCalledInOrder (line 61) | func (mock *MockGitlabRequestParserValidator) VerifyWasCalledInOrder(i...
    method VerifyWasCalledEventually (line 69) | func (mock *MockGitlabRequestParserValidator) VerifyWasCalledEventuall...
  function NewMockGitlabRequestParserValidator (line 17) | func NewMockGitlabRequestParserValidator(options ...pegomock.Option) *Mo...
  type VerifierMockGitlabRequestParserValidator (line 77) | type VerifierMockGitlabRequestParserValidator struct
    method ParseAndValidate (line 84) | func (verifier *VerifierMockGitlabRequestParserValidator) ParseAndVali...
  type MockGitlabRequestParserValidator_ParseAndValidate_OngoingVerification (line 90) | type MockGitlabRequestParserValidator_ParseAndValidate_OngoingVerificati...
    method GetCapturedArguments (line 95) | func (c *MockGitlabRequestParserValidator_ParseAndValidate_OngoingVeri...
    method GetAllCapturedArguments (line 100) | func (c *MockGitlabRequestParserValidator_ParseAndValidate_OngoingVeri...

FILE: server/controllers/github_app_controller.go
  type GithubAppController (line 18) | type GithubAppController struct
    method ExchangeCode (line 47) | func (g *GithubAppController) ExchangeCode(w http.ResponseWriter, r *h...
    method New (line 92) | func (g *GithubAppController) New(w http.ResponseWriter, _ *http.Reque...
    method respond (line 159) | func (g *GithubAppController) respond(w http.ResponseWriter, lvl loggi...
  type githubWebhook (line 26) | type githubWebhook struct
  type githubAppRequest (line 33) | type githubAppRequest struct

FILE: server/controllers/jobs_controller.go
  type JobIDKeyGenerator (line 20) | type JobIDKeyGenerator struct
    method Generate (line 22) | func (g JobIDKeyGenerator) Generate(r *http.Request) (string, error) {
  type JobsController (line 31) | type JobsController struct
    method getProjectJobs (line 43) | func (j *JobsController) getProjectJobs(w http.ResponseWriter, r *http...
    method GetProjectJobs (line 60) | func (j *JobsController) GetProjectJobs(w http.ResponseWriter, r *http...
    method getProjectJobsWS (line 69) | func (j *JobsController) getProjectJobsWS(w http.ResponseWriter, r *ht...
    method GetProjectJobsWS (line 80) | func (j *JobsController) GetProjectJobsWS(w http.ResponseWriter, r *ht...
    method respond (line 93) | func (j *JobsController) respond(w http.ResponseWriter, lvl logging.Lo...

FILE: server/controllers/locks_controller.go
  type LocksController (line 23) | type LocksController struct
    method LockApply (line 39) | func (l *LocksController) LockApply(w http.ResponseWriter, _ *http.Req...
    method UnlockApply (line 51) | func (l *LocksController) UnlockApply(w http.ResponseWriter, _ *http.R...
    method GetLock (line 62) | func (l *LocksController) GetLock(w http.ResponseWriter, r *http.Reque...
    method DeleteLock (line 105) | func (l *LocksController) DeleteLock(w http.ResponseWriter, r *http.Re...
    method respond (line 151) | func (l *LocksController) respond(w http.ResponseWriter, lvl logging.L...

FILE: server/controllers/locks_controller_test.go
  function TestCreateApplyLock (line 37) | func TestCreateApplyLock(t *testing.T) {
  function TestUnlockApply (line 83) | func TestUnlockApply(t *testing.T) {
  function TestGetLockRoute_NoLockID (line 119) | func TestGetLockRoute_NoLockID(t *testing.T) {
  function TestGetLock_InvalidLockID (line 130) | func TestGetLock_InvalidLockID(t *testing.T) {
  function TestGetLock_LockerErr (line 142) | func TestGetLock_LockerErr(t *testing.T) {
  function TestGetLock_None (line 158) | func TestGetLock_None(t *testing.T) {
  function TestGetLock_Success (line 174) | func TestGetLock_Success(t *testing.T) {
  function TestDeleteLock_NoLockID (line 212) | func TestDeleteLock_NoLockID(t *testing.T) {
  function TestDeleteLock_InvalidLockID (line 221) | func TestDeleteLock_InvalidLockID(t *testing.T) {
  function TestDeleteLock_LockerErr (line 231) | func TestDeleteLock_LockerErr(t *testing.T) {
  function TestDeleteLock_None (line 247) | func TestDeleteLock_None(t *testing.T) {
  function TestDeleteLock_OldFormat (line 263) | func TestDeleteLock_OldFormat(t *testing.T) {
  function TestDeleteLock_UpdateProjectStatus (line 282) | func TestDeleteLock_UpdateProjectStatus(t *testing.T) {
  function TestDeleteLock_CommentFailed (line 349) | func TestDeleteLock_CommentFailed(t *testing.T) {
  function TestDeleteLock_CommentSuccess (line 381) | func TestDeleteLock_CommentSuccess(t *testing.T) {

FILE: server/controllers/status_controller.go
  type StatusController (line 16) | type StatusController struct
    method Get (line 29) | func (d *StatusController) Get(w http.ResponseWriter, _ *http.Request) {
  type StatusResponse (line 22) | type StatusResponse struct

FILE: server/controllers/status_controller_test.go
  function TestStatusController_Startup (line 20) | func TestStatusController_Startup(t *testing.T) {
  function TestStatusController_InProgress (line 42) | func TestStatusController_InProgress(t *testing.T) {
  function TestStatusController_Shutdown (line 66) | func TestStatusController_Shutdown(t *testing.T) {

FILE: server/controllers/web_templates/mocks/mock_template_writer.go
  type MockTemplateWriter (line 13) | type MockTemplateWriter struct
    method SetFailHandler (line 25) | func (mock *MockTemplateWriter) SetFailHandler(fh pegomock.FailHandler...
    method FailHandler (line 26) | func (mock *MockTemplateWriter) FailHandler() pegomock.FailHandler    ...
    method Execute (line 28) | func (mock *MockTemplateWriter) Execute(wr io.Writer, data interface{}...
    method VerifyWasCalledOnce (line 43) | func (mock *MockTemplateWriter) VerifyWasCalledOnce() *VerifierMockTem...
    method VerifyWasCalled (line 50) | func (mock *MockTemplateWriter) VerifyWasCalled(invocationCountMatcher...
    method VerifyWasCalledInOrder (line 57) | func (mock *MockTemplateWriter) VerifyWasCalledInOrder(invocationCount...
    method VerifyWasCalledEventually (line 65) | func (mock *MockTemplateWriter) VerifyWasCalledEventually(invocationCo...
  function NewMockTemplateWriter (line 17) | func NewMockTemplateWriter(options ...pegomock.Option) *MockTemplateWrit...
  type VerifierMockTemplateWriter (line 73) | type VerifierMockTemplateWriter struct
    method Execute (line 80) | func (verifier *VerifierMockTemplateWriter) Execute(wr io.Writer, data...
  type MockTemplateWriter_Execute_OngoingVerification (line 86) | type MockTemplateWriter_Execute_OngoingVerification struct
    method GetCapturedArguments (line 91) | func (c *MockTemplateWriter_Execute_OngoingVerification) GetCapturedAr...
    method GetAllCapturedArguments (line 96) | func (c *MockTemplateWriter_Execute_OngoingVerification) GetAllCapture...

FILE: server/controllers/web_templates/web_templates.go
  type TemplateWriter (line 44) | type TemplateWriter interface
  type LockIndexData (line 51) | type LockIndexData struct
  type ApplyLockData (line 63) | type ApplyLockData struct
  type IndexData (line 71) | type IndexData struct
  type LockDetailData (line 86) | type LockDetailData struct
  type ProjectJobData (line 104) | type ProjectJobData struct
  type ProjectJobsError (line 112) | type ProjectJobsError struct
  type GithubSetupData (line 121) | type GithubSetupData struct

FILE: server/controllers/web_templates/web_templates_test.go
  function TestIndexTemplate (line 15) | func TestIndexTemplate(t *testing.T) {
  function TestLockTemplate (line 54) | func TestLockTemplate(t *testing.T) {
  function TestProjectJobsTemplate (line 69) | func TestProjectJobsTemplate(t *testing.T) {
  function TestProjectJobsErrorTemplate (line 78) | func TestProjectJobsErrorTemplate(t *testing.T) {
  function TestGithubAppSetupTemplate (line 87) | func TestGithubAppSetupTemplate(t *testing.T) {

FILE: server/controllers/websocket/mux.go
  type PartitionKeyGenerator (line 15) | type PartitionKeyGenerator interface
  type PartitionRegistry (line 21) | type PartitionRegistry interface
  type Multiplexor (line 30) | type Multiplexor struct
    method Handle (line 61) | func (m *Multiplexor) Handle(w http.ResponseWriter, r *http.Request) e...
  function checkOriginFunc (line 36) | func checkOriginFunc(checkOrigin bool) func(r *http.Request) bool {
  function NewMultiplexor (line 45) | func NewMultiplexor(log logging.SimpleLogging, keyGenerator PartitionKey...

FILE: server/controllers/websocket/mux_test.go
  function wsHandler (line 15) | func wsHandler(t *testing.T, checkOrigin bool) http.HandlerFunc {
  function TestCheckOriginFunc (line 29) | func TestCheckOriginFunc(t *testing.T) {

FILE: server/controllers/websocket/writer.go
  function NewWriter (line 14) | func NewWriter(log logging.SimpleLogging, checkOrigin bool) *Writer {
  type Writer (line 25) | type Writer struct
    method Write (line 30) | func (w *Writer) Write(rw http.ResponseWriter, r *http.Request, input ...

FILE: server/core/boltdb/boltdb.go
  type BoltDB (line 25) | type BoltDB struct
    method TryLock (line 144) | func (b *BoltDB) TryLock(newLock models.ProjectLock) (bool, models.Pro...
    method Unlock (line 181) | func (b *BoltDB) Unlock(p models.Project, workspace string) (*models.P...
    method List (line 206) | func (b *BoltDB) List() ([]models.ProjectLock, error) {
    method LockCommand (line 236) | func (b *BoltDB) LockCommand(cmdName command.Name, lockTime time.Time)...
    method UnlockCommand (line 267) | func (b *BoltDB) UnlockCommand(cmdName command.Name) error {
    method CheckCommandLock (line 287) | func (b *BoltDB) CheckCommandLock(cmdName command.Name) (*command.Lock...
    method UnlockByPull (line 315) | func (b *BoltDB) UnlockByPull(repoFullName string, pullNum int) ([]mod...
    method GetLock (line 347) | func (b *BoltDB) GetLock(p models.Project, workspace string) (*models....
    method UpdatePullWithResults (line 375) | func (b *BoltDB) UpdatePullWithResults(pull models.PullRequest, newRes...
    method GetPullStatus (line 457) | func (b *BoltDB) GetPullStatus(pull models.PullRequest) (*models.PullS...
    method DeletePullStatus (line 476) | func (b *BoltDB) DeletePullStatus(pull models.PullRequest) error {
    method UpdateProjectStatus (line 492) | func (b *BoltDB) UpdateProjectStatus(pull models.PullRequest, workspac...
    method pullKey (line 526) | func (b *BoltDB) pullKey(pull models.PullRequest) ([]byte, error) {
    method commandLockKey (line 540) | func (b *BoltDB) commandLockKey(cmdName command.Name) string {
    method lockKey (line 544) | func (b *BoltDB) lockKey(p models.Project, workspace string) string {
    method getPullFromBucket (line 548) | func (b *BoltDB) getPullFromBucket(bucket *bolt.Bucket, key []byte) (*...
    method writePullToBucket (line 561) | func (b *BoltDB) writePullToBucket(bucket *bolt.Bucket, key []byte, pu...
    method projectResultToProject (line 569) | func (b *BoltDB) projectResultToProject(p command.ProjectResult) model...
    method Close (line 579) | func (b *BoltDB) Close() error {
  constant locksBucketName (line 33) | locksBucketName       = "runLocks"
  constant pullsBucketName (line 34) | pullsBucketName       = "pulls"
  constant globalLocksBucketName (line 35) | globalLocksBucketName = "globalLocks"
  constant pullKeySeparator (line 36) | pullKeySeparator      = "::"
  function New (line 41) | func New(dataDir string) (*BoltDB, error) {
  function NewWithDB (line 131) | func NewWithDB(db *bolt.DB, bucket string, globalBucket string) (*BoltDB...

FILE: server/core/boltdb/boltdb_test.go
  function TestLockCommandNotSet (line 49) | func TestLockCommandNotSet(t *testing.T) {
  function TestLockCommandEnabled (line 58) | func TestLockCommandEnabled(t *testing.T) {
  function TestLockCommandFail (line 71) | func TestLockCommandFail(t *testing.T) {
  function TestUnlockCommandDisabled (line 83) | func TestUnlockCommandDisabled(t *testing.T) {
  function TestMigrationOldLockKeysToNewFormat (line 103) | func TestMigrationOldLockKeysToNewFormat(t *testing.T) {
  function TestNoMigrationNeededForNewFormatKeys (line 185) | func TestNoMigrationNeededForNewFormatKeys(t *testing.T) {
  function TestUnlockCommandFail (line 229) | func TestUnlockCommandFail(t *testing.T) {
  function TestMixedLocksPresent (line 237) | func TestMixedLocksPresent(t *testing.T) {
  function TestListNoLocks (line 251) | func TestListNoLocks(t *testing.T) {
  function TestListOneLock (line 260) | func TestListOneLock(t *testing.T) {
  function TestListMultipleLocks (line 271) | func TestListMultipleLocks(t *testing.T) {
  function TestListAddRemove (line 304) | func TestListAddRemove(t *testing.T) {
  function TestLockingNoLocks (line 318) | func TestLockingNoLocks(t *testing.T) {
  function TestLockingExistingLock (line 328) | func TestLockingExistingLock(t *testing.T) {
  function TestUnlockingNoLocks (line 388) | func TestUnlockingNoLocks(t *testing.T) {
  function TestUnlocking (line 397) | func TestUnlocking(t *testing.T) {
  function TestUnlockingMultiple (line 421) | func TestUnlockingMultiple(t *testing.T) {
  function TestUnlockByPullNone (line 460) | func TestUnlockByPullNone(t *testing.T) {
  function TestUnlockByPullOne (line 469) | func TestUnlockByPullOne(t *testing.T) {
  function TestUnlockByPullAfterUnlock (line 502) | func TestUnlockByPullAfterUnlock(t *testing.T) {
  function TestUnlockByPullMatching (line 518) | func TestUnlockByPullMatching(t *testing.T) {
  function TestGetLockNotThere (line 548) | func TestGetLockNotThere(t *testing.T) {
  function TestGetLock (line 557) | func TestGetLock(t *testing.T) {
  function TestPullStatus_UpdateGet (line 574) | func TestPullStatus_UpdateGet(t *testing.T) {
  function TestPullStatus_UpdateDeleteGet (line 627) | func TestPullStatus_UpdateDeleteGet(t *testing.T) {
  function TestPullStatus_UpdateProject (line 675) | func TestPullStatus_UpdateProject(t *testing.T) {
  function TestPullStatus_UpdateNewCommit (line 743) | func TestPullStatus_UpdateNewCommit(t *testing.T) {
  function TestPullStatus_UpdateMerge_Apply (line 810) | func TestPullStatus_UpdateMerge_Apply(t *testing.T) {
  function TestPullStatus_UpdateMerge_ApprovePolicies (line 935) | func TestPullStatus_UpdateMerge_ApprovePolicies(t *testing.T) {
  function newTestDB (line 1055) | func newTestDB() (*bolt.DB, *boltdb.BoltDB) {
  function newTestDB2 (line 1084) | func newTestDB2(t *testing.T) *boltdb.BoltDB {
  function cleanupDB (line 1091) | func cleanupDB(db *bolt.DB) {

FILE: server/core/config/cfgfuzz/fuzz_test.go
  function FuzzParseRepoCfgData (line 17) | func FuzzParseRepoCfgData(f *testing.F) {

FILE: server/core/config/parser_validator.go
  type ParserValidator (line 27) | type ParserValidator struct
    method HasRepoCfg (line 32) | func (p *ParserValidator) HasRepoCfg(absRepoDir, repoConfigFile string...
    method ParseRepoCfg (line 50) | func (p *ParserValidator) ParseRepoCfg(absRepoDir string, globalCfg va...
    method ParseRepoCfgData (line 81) | func (p *ParserValidator) ParseRepoCfgData(repoCfgData []byte, globalC...
    method parseRawRepoCfg (line 97) | func (p *ParserValidator) parseRawRepoCfg(rawConfig raw.RepoCfg, globa...
    method ParseGlobalCfg (line 141) | func (p *ParserValidator) ParseGlobalCfg(configFile string, defaultCfg...
    method ParseGlobalCfgJSON (line 164) | func (p *ParserValidator) ParseGlobalCfgJSON(cfgJSON string, defaultCf...
    method validateRawGlobalCfg (line 173) | func (p *ParserValidator) validateRawGlobalCfg(rawCfg raw.GlobalCfg, d...
    method repoCfgPath (line 185) | func (p *ParserValidator) repoCfgPath(repoDir, cfgFilename string) str...
    method validateProjectNames (line 189) | func (p *ParserValidator) validateProjectNames(config valid.RepoCfg) e...
    method applyLegacyShellParsing (line 228) | func (p *ParserValidator) applyLegacyShellParsing(cfg *valid.RepoCfg) ...
    method expandProjectGlobs (line 262) | func (p *ParserValidator) expandProjectGlobs(absRepoDir string, projec...
    method dirContainsTerraformFiles (line 313) | func (p *ParserValidator) dirContainsTerraformFiles(dir string) (bool,...
    method copyProjectWithDir (line 328) | func (p *ParserValidator) copyProjectWithDir(original raw.Project, new...

FILE: server/core/config/parser_validator_test.go
  function TestHasRepoCfg_DirDoesNotExist (line 30) | func TestHasRepoCfg_DirDoesNotExist(t *testing.T) {
  function TestHasRepoCfg_FileDoesNotExist (line 37) | func TestHasRepoCfg_FileDoesNotExist(t *testing.T) {
  function TestHasRepoCfg_InvalidFileExtension (line 45) | func TestHasRepoCfg_InvalidFileExtension(t *testing.T) {
  function TestParseRepoCfg_DirDoesNotExist (line 56) | func TestParseRepoCfg_DirDoesNotExist(t *testing.T) {
  function TestParseRepoCfg_FileDoesNotExist (line 62) | func TestParseRepoCfg_FileDoesNotExist(t *testing.T) {
  function TestParseRepoCfg_BadPermissions (line 69) | func TestParseRepoCfg_BadPermissions(t *testing.T) {
  function TestParseCfgs_InvalidYAML (line 82) | func TestParseCfgs_InvalidYAML(t *testing.T) {
  function TestParseRepoCfg (line 117) | func TestParseRepoCfg(t *testing.T) {
  function TestParseRepoCfg_GlobalValidation (line 1157) | func TestParseRepoCfg_GlobalValidation(t *testing.T) {
  function TestParseGlobalCfg_NotExist (line 1177) | func TestParseGlobalCfg_NotExist(t *testing.T) {
  function TestParseGlobalCfg (line 1184) | func TestParseGlobalCfg(t *testing.T) {
  function TestParserValidator_ParseGlobalCfgJSON (line 1727) | func TestParserValidator_ParseGlobalCfgJSON(t *testing.T) {
  function TestParseRepoCfg_V2ShellParsing (line 1929) | func TestParseRepoCfg_V2ShellParsing(t *testing.T) {
  function String (line 1995) | func String(v string) *string { return &v }
  function Bool (line 1999) | func Bool(v bool) *bool { return &v }
  function defaultWorkflow (line 2001) | func defaultWorkflow(name string) valid.Workflow {
  function TestContainsGlobPattern (line 2013) | func TestContainsGlobPattern(t *testing.T) {
  function TestValidateGlobPattern (line 2046) | func TestValidateGlobPattern(t *testing.T) {
  function TestParseRepoCfg_GlobExpansion (line 2081) | func TestParseRepoCfg_GlobExpansion(t *testing.T) {
  function TestParseRepoCfg_GlobExpansionPreservesSettings (line 2227) | func TestParseRepoCfg_GlobExpansionPreservesSettings(t *testing.T) {
  function TestParseRepoCfg_GlobExpansionNoNameCopy (line 2272) | func TestParseRepoCfg_GlobExpansionNoNameCopy(t *testing.T) {

FILE: server/core/config/raw/autodiscover.go
  type AutoDiscover (line 18) | type AutoDiscover struct
    method ToValid (line 23) | func (a AutoDiscover) ToValid() *valid.AutoDiscover {
    method Validate (line 37) | func (a AutoDiscover) Validate() error {
  function DefaultAutoDiscover (line 67) | func DefaultAutoDiscover() *valid.AutoDiscover {

FILE: server/core/config/raw/autodiscover_test.go
  function TestAutoDiscover_UnmarshalYAML (line 14) | func TestAutoDiscover_UnmarshalYAML(t *testing.T) {
  function TestAutoDiscover_Validate (line 53) | func TestAutoDiscover_Validate(t *testing.T) {
  function TestAutoDiscover_ToValid (line 169) | func TestAutoDiscover_ToValid(t *testing.T) {

FILE: server/core/config/raw/autoplan.go
  type Autoplan (line 18) | type Autoplan struct
    method ToValid (line 23) | func (a Autoplan) ToValid() valid.Autoplan {
    method Validate (line 40) | func (a Autoplan) Validate() error {
  function DefaultAutoPlan (line 45) | func DefaultAutoPlan() valid.Autoplan {

FILE: server/core/config/raw/autoplan_test.go
  function TestAutoPlan_UnmarshalYAML (line 14) | func TestAutoPlan_UnmarshalYAML(t *testing.T) {
  function TestAutoplan_Validate (line 74) | func TestAutoplan_Validate(t *testing.T) {
  function TestAutoplan_ToValid (line 103) | func TestAutoplan_ToValid(t *testing.T) {

FILE: server/core/config/raw/global_cfg.go
  type GlobalCfg (line 18) | type GlobalCfg struct
    method Validate (line 49) | func (g GlobalCfg) Validate() error {
    method ToValid (line 124) | func (g GlobalCfg) ToValid(defaultCfg valid.GlobalCfg) valid.GlobalCfg {
  type Repo (line 27) | type Repo struct
    method HasRegexID (line 174) | func (r Repo) HasRegexID() bool {
    method HasRegexBranch (line 179) | func (r Repo) HasRegexBranch() bool {
    method Validate (line 183) | func (r Repo) Validate() error {
    method ToValid (line 278) | func (r Repo) ToValid(workflows map[string]valid.Workflow, globalPlanR...

FILE: server/core/config/raw/metrics.go
  type Metrics (line 12) | type Metrics struct
    method Validate (line 38) | func (m Metrics) Validate() error {
    method ToValid (line 46) | func (m Metrics) ToValid() valid.Metrics {
  type Prometheus (line 17) | type Prometheus struct
    method Validate (line 21) | func (p *Prometheus) Validate() error {
  type Statsd (line 25) | type Statsd struct
    method Validate (line 30) | func (s *Statsd) Validate() error {

FILE: server/core/config/raw/metrics_test.go
  function TestMetrics_Unmarshal (line 14) | func TestMetrics_Unmarshal(t *testing.T) {
  function TestMetrics_Validate_Success (line 50) | func TestMetrics_Validate_Success(t *testing.T) {
  function TestMetrics_Validate_Error (line 106) | func TestMetrics_Validate_Error(t *testing.T) {

FILE: server/core/config/raw/policies.go
  type PolicySets (line 13) | type PolicySets struct
    method Validate (line 20) | func (p PolicySets) Validate() error {
    method ToValid (line 27) | func (p PolicySets) ToValid() valid.PolicySets {
  type PolicyOwners (line 57) | type PolicyOwners struct
    method ToValid (line 62) | func (o PolicyOwners) ToValid() valid.PolicyOwners {
  type PolicySet (line 75) | type PolicySet struct
    method Validate (line 84) | func (p PolicySet) Validate() error {
    method ToValid (line 94) | func (p PolicySet) ToValid() valid.PolicySet {

FILE: server/core/config/raw/policies_test.go
  function TestPolicySetsConfig_YAMLMarshalling (line 16) | func TestPolicySetsConfig_YAMLMarshalling(t *testing.T) {
  function TestPolicySets_Validate (line 67) | func TestPolicySets_Validate(t *testing.T) {
  function TestPolicySets_ToValid (line 171) | func TestPolicySets_ToValid(t *testing.T) {

FILE: server/core/config/raw/project.go
  constant DefaultWorkspace (line 21) | DefaultWorkspace      = "default"
  constant ApprovedRequirement (line 22) | ApprovedRequirement   = "approved"
  constant MergeableRequirement (line 23) | MergeableRequirement  = "mergeable"
  constant UnDivergedRequirement (line 24) | UnDivergedRequirement = "undiverged"
  type Project (line 27) | type Project struct
    method Validate (line 49) | func (p Project) Validate() error {
    method ToValid (line 123) | func (p Project) ToValid() valid.Project {
  function validProjectName (line 201) | func validProjectName(name string) bool {
  function validPlanReq (line 206) | func validPlanReq(value any) error {
  function validApplyReq (line 216) | func validApplyReq(value any) error {
  function validImportReq (line 226) | func validImportReq(value any) error {
  function validDistribution (line 236) | func validDistribution(value any) error {
  function ContainsGlobPattern (line 247) | func ContainsGlobPattern(s string) bool {
  function ValidateGlobPattern (line 253) | func ValidateGlobPattern(pattern string) error {

FILE: server/core/config/raw/project_test.go
  function TestProject_UnmarshalYAML (line 16) | func TestProject_UnmarshalYAML(t *testing.T) {
  function TestProject_Validate (line 86) | func TestProject_Validate(t *testing.T) {
  function TestProject_ToValid (line 435) | func TestProject_ToValid(t *testing.T) {

FILE: server/core/config/raw/raw.go
  function VersionValidator (line 17) | func VersionValidator(value any) error {

FILE: server/core/config/raw/raw_test.go
  function Bool (line 17) | func Bool(v bool) *bool { return &v }
  function Int (line 21) | func Int(v int) *int { return &v }
  function String (line 25) | func String(v string) *string { return &v }
  function unmarshalString (line 28) | func unmarshalString(in string, out any) error {

FILE: server/core/config/raw/repo_cfg.go
  constant DefaultEmojiReaction (line 14) | DefaultEmojiReaction = ""
  constant DefaultAbortOnExecutionOrderFail (line 17) | DefaultAbortOnExecutionOrderFail = false
  type RepoCfg (line 20) | type RepoCfg struct
    method Validate (line 37) | func (r RepoCfg) Validate() error {
    method ToValid (line 55) | func (r RepoCfg) ToValid() valid.RepoCfg {

FILE: server/core/config/raw/repo_cfg_test.go
  function TestConfig_UnmarshalYAML (line 15) | func TestConfig_UnmarshalYAML(t *testing.T) {
  function TestConfig_Validate (line 219) | func TestConfig_Validate(t *testing.T) {
  function TestConfig_ToValid (line 253) | func TestConfig_ToValid(t *testing.T) {

FILE: server/core/config/raw/repo_locks.go
  type RepoLocks (line 11) | type RepoLocks struct
    method ToValid (line 15) | func (a RepoLocks) ToValid() *valid.RepoLocks {
    method Validate (line 27) | func (a RepoLocks) Validate() error {

FILE: server/core/config/raw/repo_locks_test.go
  function TestRepoLocks_UnmarshalYAML (line 14) | func TestRepoLocks_UnmarshalYAML(t *testing.T) {
  function TestRepoLocks_Validate (line 49) | func TestRepoLocks_Validate(t *testing.T) {
  function TestRepoLocks_ToValid (line 104) | func TestRepoLocks_ToValid(t *testing.T) {

FILE: server/core/config/raw/stage.go
  type Stage (line 11) | type Stage struct
    method Validate (line 15) | func (s Stage) Validate() error {
    method ToValid (line 21) | func (s Stage) ToValid() valid.Stage {

FILE: server/core/config/raw/stage_test.go
  function TestStage_UnmarshalYAML (line 15) | func TestStage_UnmarshalYAML(t *testing.T) {
  function TestStage_Validate (line 53) | func TestStage_Validate(t *testing.T) {
  function TestStage_ToValid (line 69) | func TestStage_ToValid(t *testing.T) {

FILE: server/core/config/raw/step.go
  constant ExtraArgsKey (line 22) | ExtraArgsKey        = "extra_args"
  constant NameArgKey (line 23) | NameArgKey          = "name"
  constant CommandArgKey (line 24) | CommandArgKey       = "command"
  constant ValueArgKey (line 25) | ValueArgKey         = "value"
  constant OutputArgKey (line 26) | OutputArgKey        = "output"
  constant RunStepName (line 27) | RunStepName         = "run"
  constant PlanStepName (line 28) | PlanStepName        = "plan"
  constant ShowStepName (line 29) | ShowStepName        = "show"
  constant PolicyCheckStepName (line 30) | PolicyCheckStepName = "policy_check"
  constant ApplyStepName (line 31) | ApplyStepName       = "apply"
  constant InitStepName (line 32) | InitStepName        = "init"
  constant EnvStepName (line 33) | EnvStepName         = "env"
  constant MultiEnvStepName (line 34) | MultiEnvStepName    = "multienv"
  constant ImportStepName (line 35) | ImportStepName      = "import"
  constant StateRmStepName (line 36) | StateRmStepName     = "state_rm"
  constant ShellArgKey (line 37) | ShellArgKey         = "shell"
  constant ShellArgsArgKey (line 38) | ShellArgsArgKey     = "shellArgs"
  type Step (line 82) | type Step struct
    method UnmarshalYAML (line 94) | func (s *Step) UnmarshalYAML(unmarshal func(any) error) error {
    method MarshalYAML (line 98) | func (s Step) MarshalYAML() (any, error) {
    method UnmarshalJSON (line 102) | func (s *Step) UnmarshalJSON(data []byte) error {
    method MarshalJSON (line 108) | func (s *Step) MarshalJSON() ([]byte, error) {
    method validStepName (line 116) | func (s Step) validStepName(stepName string) bool {
    method Validate (line 128) | func (s Step) Validate() error {
    method ToValid (line 401) | func (s Step) ToValid() valid.Step {
    method unmarshalGeneric (line 521) | func (s *Step) unmarshalGeneric(unmarshal func(any) error) error {
    method marshalGeneric (line 578) | func (s Step) marshalGeneric() (any, error) {

FILE: server/core/config/raw/step_test.go
  function TestStepConfig_YAMLMarshalling (line 16) | func TestStepConfig_YAMLMarshalling(t *testing.T) {
  function TestStep_Validate (line 181) | func TestStep_Validate(t *testing.T) {
  function TestStep_ToValid (line 509) | func TestStep_ToValid(t *testing.T) {
  type MapType (line 843) | type MapType
  type EnvType (line 844) | type EnvType
  type RunType (line 845) | type RunType
  type MultiEnvType (line 846) | type MultiEnvType

FILE: server/core/config/raw/team_authz.go
  type TeamAuthz (line 8) | type TeamAuthz struct
    method ToValid (line 13) | func (t *TeamAuthz) ToValid() valid.TeamAuthz {

FILE: server/core/config/raw/workflow.go
  type Workflow (line 11) | type Workflow struct
    method Validate (line 19) | func (w Workflow) Validate() error {
    method toValidStage (line 29) | func (w Workflow) toValidStage(stage *Stage, defaultStage valid.Stage)...
    method ToValid (line 37) | func (w Workflow) ToValid(name string) valid.Workflow {

FILE: server/core/config/raw/workflow_step.go
  type WorkflowHook (line 21) | type WorkflowHook struct
    method UnmarshalYAML (line 25) | func (s *WorkflowHook) UnmarshalYAML(unmarshal func(any) error) error {
    method MarshalYAML (line 29) | func (s WorkflowHook) MarshalYAML() (any, error) {
    method UnmarshalJSON (line 33) | func (s *WorkflowHook) UnmarshalJSON(data []byte) error {
    method MarshalJSON (line 39) | func (s *WorkflowHook) MarshalJSON() ([]byte, error) {
    method Validate (line 47) | func (s WorkflowHook) Validate() error {
    method ToValid (line 75) | func (s WorkflowHook) ToValid() *valid.WorkflowHook {
    method unmarshalGeneric (line 95) | func (s *WorkflowHook) unmarshalGeneric(unmarshal func(any) error) err...
    method marshalGeneric (line 110) | func (s WorkflowHook) marshalGeneric() (any, error) {

FILE: server/core/config/raw/workflow_step_test.go
  function TestWorkflowHook_YAMLMarshalling (line 15) | func TestWorkflowHook_YAMLMarshalling(t *testing.T) {
  function TestGlobalConfigStep_Validate (line 79) | func TestGlobalConfigStep_Validate(t *testing.T) {
  function TestWorkflowHook_ToValid (line 126) | func TestWorkflowHook_ToValid(t *testing.T) {

FILE: server/core/config/raw/workflow_test.go
  function TestWorkflow_UnmarshalYAML (line 15) | func TestWorkflow_UnmarshalYAML(t *testing.T) {
  function TestWorkflow_Validate (line 122) | func TestWorkflow_Validate(t *testing.T) {
  function TestWorkflow_ToValid (line 140) | func TestWorkflow_ToValid(t *testing.T) {

FILE: server/core/config/valid/autodiscover.go
  type AutoDiscoverMode (line 9) | type AutoDiscoverMode
  constant AutoDiscoverEnabledMode (line 12) | AutoDiscoverEnabledMode  AutoDiscoverMode = "enabled"
  constant AutoDiscoverDisabledMode (line 13) | AutoDiscoverDisabledMode AutoDiscoverMode = "disabled"
  constant AutoDiscoverAutoMode (line 14) | AutoDiscoverAutoMode     AutoDiscoverMode = "auto"
  type AutoDiscover (line 17) | type AutoDiscover struct
    method IsPathIgnored (line 22) | func (a AutoDiscover) IsPathIgnored(path string) bool {

FILE: server/core/config/valid/autodiscover_test.go
  function TestConfig_IsPathIgnoredForAutoDiscover (line 13) | func TestConfig_IsPathIgnoredForAutoDiscover(t *testing.T) {

FILE: server/core/config/valid/global_cfg.go
  constant MergeableCommandReq (line 16) | MergeableCommandReq = "mergeable"
  constant ApprovedCommandReq (line 17) | ApprovedCommandReq = "approved"
  constant UnDivergedCommandReq (line 18) | UnDivergedCommandReq = "undiverged"
  constant PoliciesPassedCommandReq (line 19) | PoliciesPassedCommandReq = "policies_passed"
  constant PlanRequirementsKey (line 20) | PlanRequirementsKey = "plan_requirements"
  constant ApplyRequirementsKey (line 21) | ApplyRequirementsKey = "apply_requirements"
  constant ImportRequirementsKey (line 22) | ImportRequirementsKey = "import_requirements"
  constant WorkflowKey (line 23) | WorkflowKey = "workflow"
  constant AllowedOverridesKey (line 24) | AllowedOverridesKey = "allowed_overrides"
  constant AllowCustomWorkflowsKey (line 25) | AllowCustomWorkflowsKey = "allow_custom_workflows"
  constant DefaultWorkflowName (line 26) | DefaultWorkflowName = "default"
  constant DeleteSourceBranchOnMergeKey (line 27) | DeleteSourceBranchOnMergeKey = "delete_source_branch_on_merge"
  constant RepoLockingKey (line 28) | RepoLockingKey = "repo_locking"
  constant RepoLocksKey (line 29) | RepoLocksKey = "repo_locks"
  constant PolicyCheckKey (line 30) | PolicyCheckKey = "policy_check"
  constant CustomPolicyCheckKey (line 31) | CustomPolicyCheckKey = "custom_policy_check"
  constant AutoDiscoverKey (line 32) | AutoDiscoverKey = "autodiscover"
  constant SilencePRCommentsKey (line 33) | SilencePRCommentsKey = "silence_pr_comments"
  constant DefaultAtlantisFile (line 38) | DefaultAtlantisFile = "atlantis.yaml"
  type GlobalCfg (line 48) | type GlobalCfg struct
    method MergeProjectCfg (line 292) | func (g GlobalCfg) MergeProjectCfg(log logging.SimpleLogging, repoID s...
    method DefaultProjCfg (line 436) | func (g GlobalCfg) DefaultProjCfg(log logging.SimpleLogging, repoID st...
    method RepoAutoDiscoverCfg (line 462) | func (g GlobalCfg) RepoAutoDiscoverCfg(repoID string) *AutoDiscover {
    method ValidateRepoCfg (line 472) | func (g GlobalCfg) ValidateRepoCfg(rCfg RepoCfg, repoID string) error {
    method getMatchingCfg (line 594) | func (g GlobalCfg) getMatchingCfg(log logging.SimpleLogging, repoID st...
    method MatchingRepo (line 706) | func (g GlobalCfg) MatchingRepo(repoID string) *Repo {
    method RepoConfigFile (line 718) | func (g GlobalCfg) RepoConfigFile(repoID string) string {
  type Metrics (line 56) | type Metrics struct
  type Statsd (line 61) | type Statsd struct
  type Prometheus (line 66) | type Prometheus struct
  type Repo (line 71) | type Repo struct
    method IDMatches (line 267) | func (r Repo) IDMatches(otherID string) bool {
    method BranchMatches (line 275) | func (r Repo) BranchMatches(other string) bool {
    method IDString (line 283) | func (r Repo) IDString() string {
  type MergedProjectCfg (line 98) | type MergedProjectCfg struct
  type WorkflowHook (line 124) | type WorkflowHook struct
  type GlobalCfgArgs (line 190) | type GlobalCfgArgs struct
  function NewGlobalCfgFromArgs (line 201) | func NewGlobalCfgFromArgs(args GlobalCfgArgs) GlobalCfg {

FILE: server/core/config/valid/global_cfg_test.go
  function TestNewGlobalCfg (line 22) | func TestNewGlobalCfg(t *testing.T) {
  function TestGlobalCfg_ValidateRepoCfg (line 163) | func TestGlobalCfg_ValidateRepoCfg(t *testing.T) {
  function TestGlobalCfg_WithPolicySets (line 524) | func TestGlobalCfg_WithPolicySets(t *testing.T) {
  function TestGlobalCfg_MergeProjectCfg (line 657) | func TestGlobalCfg_MergeProjectCfg(t *testing.T) {
  function TestRepo_IDMatches (line 1086) | func TestRepo_IDMatches(t *testing.T) {
  function TestRepo_IDString (line 1099) | func TestRepo_IDString(t *testing.T) {
  function TestRepo_BranchMatches (line 1104) | func TestRepo_BranchMatches(t *testing.T) {
  function TestGlobalCfg_MatchingRepo (line 1119) | func TestGlobalCfg_MatchingRepo(t *testing.T) {
  function TestGlobalCfg_PolicyCheckOverride (line 1188) | func TestGlobalCfg_PolicyCheckOverride(t *testing.T) {
  function String (line 1434) | func String(v string) *string { return &v }
  function Bool (line 1438) | func Bool(v bool) *bool { return &v }

FILE: server/core/config/valid/policies.go
  constant LocalPolicySet (line 14) | LocalPolicySet  string = "local"
  constant GithubPolicySet (line 15) | GithubPolicySet string = "github"
  type PolicySets (line 21) | type PolicySets struct
    method HasPolicies (line 42) | func (p *PolicySets) HasPolicies() bool {
    method HasTeamOwners (line 47) | func (p *PolicySets) HasTeamOwners() bool {
    method AllTeams (line 76) | func (p *PolicySets) AllTeams() []string {
  type PolicyOwners (line 28) | type PolicyOwners struct
    method IsOwner (line 57) | func (o *PolicyOwners) IsOwner(username string, userTeams []string) bo...
  type PolicySet (line 33) | type PolicySet struct

FILE: server/core/config/valid/policies_test.go
  function TestPoliciesConfig_HasTeamOwners (line 13) | func TestPoliciesConfig_HasTeamOwners(t *testing.T) {
  function TestPoliciesConfig_IsOwners (line 71) | func TestPoliciesConfig_IsOwners(t *testing.T) {
  function TestPoliciesConfig_AllTeams (line 127) | func TestPoliciesConfig_AllTeams(t *testing.T) {

FILE: server/core/config/valid/repo_cfg.go
  type RepoCfg (line 19) | type RepoCfg struct
    method FindProjectsByDirWorkspace (line 39) | func (r RepoCfg) FindProjectsByDirWorkspace(repoRelDir string, workspa...
    method FindProjectsByDir (line 50) | func (r RepoCfg) FindProjectsByDir(dir string) []Project {
    method FindProjectsByDirPattern (line 62) | func (r RepoCfg) FindProjectsByDirPattern(pattern string) []Project {
    method FindProjectsByDirPatternWorkspace (line 74) | func (r RepoCfg) FindProjectsByDirPatternWorkspace(pattern string, wor...
    method FindProjectByName (line 89) | func (r RepoCfg) FindProjectByName(name string) *Project {
    method FindProjectsByName (line 99) | func (r RepoCfg) FindProjectsByName(name string) []Project {
    method AutoDiscoverEnabled (line 133) | func (r RepoCfg) AutoDiscoverEnabled(defaultAutoDiscoverMode AutoDisco...
    method ValidateWorkspaceAllowed (line 152) | func (r RepoCfg) ValidateWorkspaceAllowed(repoRelDir string, workspace...
  function ContainsDirGlobPattern (line 85) | func ContainsDirGlobPattern(s string) bool {
  function isRegexAllowed (line 117) | func isRegexAllowed(name string, allowedRegexpPrefixes []string) bool {
  type Project (line 177) | type Project struct
    method GetName (line 201) | func (p Project) GetName() string {
  type Autoplan (line 208) | type Autoplan struct
  type PostProcessRunOutputOption (line 214) | type PostProcessRunOutputOption
  constant PostProcessRunOutputShow (line 217) | PostProcessRunOutputShow            = "show"
  constant PostProcessRunOutputHide (line 218) | PostProcessRunOutputHide            = "hide"
  constant PostProcessRunOutputStripRefreshing (line 219) | PostProcessRunOutputStripRefreshing = "strip_refreshing"
  constant PostProcessRunOutputFilterRegexKey (line 220) | PostProcessRunOutputFilterRegexKey  = "filter_regex"
  type Stage (line 223) | type Stage struct
  type CommandShell (line 228) | type CommandShell struct
    method String (line 233) | func (s CommandShell) String() string {
  type Step (line 237) | type Step struct
  type Workflow (line 258) | type Workflow struct

FILE: server/core/config/valid/repo_cfg_test.go
  function TestConfig_FindProjectsByDir (line 16) | func TestConfig_FindProjectsByDir(t *testing.T) {
  function TestConfig_AutoDiscoverEnabled (line 223) | func TestConfig_AutoDiscoverEnabled(t *testing.T) {
  function TestConfig_FindProjectsByDirPattern (line 332) | func TestConfig_FindProjectsByDirPattern(t *testing.T) {
  function TestConfig_FindProjectsByDirPatternWorkspace (line 415) | func TestConfig_FindProjectsByDirPatternWorkspace(t *testing.T) {
  function TestContainsDirGlobPattern (line 473) | func TestContainsDirGlobPattern(t *testing.T) {

FILE: server/core/config/valid/repo_locks.go
  type RepoLocksMode (line 7) | type RepoLocksMode
  constant RepoLocksDisabledMode (line 15) | RepoLocksDisabledMode RepoLocksMode = "disabled"
  constant RepoLocksOnPlanMode (line 16) | RepoLocksOnPlanMode   RepoLocksMode = "on_plan"
  constant RepoLocksOnApplyMode (line 17) | RepoLocksOnApplyMode  RepoLocksMode = "on_apply"
  type RepoLocks (line 20) | type RepoLocks struct

FILE: server/core/config/valid/team_authz.go
  type TeamAuthz (line 6) | type TeamAuthz struct

FILE: server/core/config/valid/valid.go
  constant DefaultAutoPlanEnabled (line 8) | DefaultAutoPlanEnabled = true

FILE: server/core/db/db.go
  type Database (line 29) | type Database interface

FILE: server/core/db/mocks/mock_database.go
  type MockDatabase (line 22) | type MockDatabase struct
    method EXPECT (line 41) | func (m *MockDatabase) EXPECT() *MockDatabaseMockRecorder {
    method CheckCommandLock (line 46) | func (m *MockDatabase) CheckCommandLock(cmdName command.Name) (*comman...
    method Close (line 61) | func (m *MockDatabase) Close() error {
    method DeletePullStatus (line 75) | func (m *MockDatabase) DeletePullStatus(pull models.PullRequest) error {
    method GetLock (line 89) | func (m *MockDatabase) GetLock(project models.Project, workspace strin...
    method GetPullStatus (line 104) | func (m *MockDatabase) GetPullStatus(pull models.PullRequest) (*models...
    method List (line 119) | func (m *MockDatabase) List() ([]models.ProjectLock, error) {
    method LockCommand (line 134) | func (m *MockDatabase) LockCommand(cmdName command.Name, lockTime time...
    method TryLock (line 149) | func (m *MockDatabase) TryLock(lock models.ProjectLock) (bool, models....
    method Unlock (line 165) | func (m *MockDatabase) Unlock(project models.Project, workspace string...
    method UnlockByPull (line 180) | func (m *MockDatabase) UnlockByPull(repoFullName string, pullNum int) ...
    method UnlockCommand (line 195) | func (m *MockDatabase) UnlockCommand(cmdName command.Name) error {
    method UpdateProjectStatus (line 209) | func (m *MockDatabase) UpdateProjectStatus(pull models.PullRequest, wo...
    method UpdatePullWithResults (line 223) | func (m *MockDatabase) UpdatePullWithResults(pull models.PullRequest, ...
  type MockDatabaseMockRecorder (line 29) | type MockDatabaseMockRecorder struct
    method CheckCommandLock (line 55) | func (mr *MockDatabaseMockRecorder) CheckCommandLock(cmdName any) *gom...
    method Close (line 69) | func (mr *MockDatabaseMockRecorder) Close() *gomock.Call {
    method DeletePullStatus (line 83) | func (mr *MockDatabaseMockRecorder) DeletePullStatus(pull any) *gomock...
    method GetLock (line 98) | func (mr *MockDatabaseMockRecorder) GetLock(project, workspace any) *g...
    method GetPullStatus (line 113) | func (mr *MockDatabaseMockRecorder) GetPullStatus(pull any) *gomock.Ca...
    method List (line 128) | func (mr *MockDatabaseMockRecorder) List() *gomock.Call {
    method LockCommand (line 143) | func (mr *MockDatabaseMockRecorder) LockCommand(cmdName, lockTime any)...
    method TryLock (line 159) | func (mr *MockDatabaseMockRecorder) TryLock(lock any) *gomock.Call {
    method Unlock (line 174) | func (mr *MockDatabaseMockRecorder) Unlock(project, workspace any) *go...
    method UnlockByPull (line 189) | func (mr *MockDatabaseMockRecorder) UnlockByPull(repoFullName, pullNum...
    method UnlockCommand (line 203) | func (mr *MockDatabaseMockRecorder) UnlockCommand(cmdName any) *gomock...
    method UpdateProjectStatus (line 217) | func (mr *MockDatabaseMockRecorder) UpdateProjectStatus(pull, workspac...
    method UpdatePullWithResults (line 232) | func (mr *MockDatabaseMockRecorder) UpdatePullWithResults(pull, newRes...
  function NewMockDatabase (line 34) | func NewMockDatabase(ctrl *gomock.Controller) *MockDatabase {

FILE: server/core/locking/apply_locking.go
  type ApplyLockChecker (line 18) | type ApplyLockChecker interface
  type ApplyLocker (line 25) | type ApplyLocker interface
  type ApplyCommandLock (line 36) | type ApplyCommandLock struct
  type ApplyClient (line 46) | type ApplyClient struct
    method LockApply (line 63) | func (c *ApplyClient) LockApply() (ApplyCommandLock, error) {
    method UnlockApply (line 85) | func (c *ApplyClient) UnlockApply() error {
    method CheckApplyLock (line 100) | func (c *ApplyClient) CheckApplyLock() (ApplyCommandLock, error) {
  function NewApplyClient (line 52) | func NewApplyClient(database db.Database, disableApply bool, disableGlob...

FILE: server/core/locking/locking.go
  type TryLockResponse (line 29) | type TryLockResponse struct
  type Client (line 39) | type Client struct
    method TryLock (line 64) | func (c *Client) TryLock(p models.Project, workspace string, pull mode...
    method Unlock (line 83) | func (c *Client) Unlock(key string) (*models.ProjectLock, error) {
    method List (line 93) | func (c *Client) List() (map[string]models.ProjectLock, error) {
    method UnlockByPull (line 106) | func (c *Client) UnlockByPull(repoFullName string, pullNum int) ([]mod...
    method GetLock (line 114) | func (c *Client) GetLock(key string) (*models.ProjectLock, error) {
    method key (line 128) | func (c *Client) key(p models.Project, workspace string) string {
    method lockKeyToProjectWorkspace (line 140) | func (c *Client) lockKeyToProjectWorkspace(key string) (models.Project...
  type Locker (line 45) | type Locker interface
  function NewClient (line 54) | func NewClient(database db.Database) *Client {
  function IsCurrentLocking (line 132) | func IsCurrentLocking(key string) ([]string, error) {
  type NoOpLocker (line 148) | type NoOpLocker struct
    method TryLock (line 156) | func (c *NoOpLocker) TryLock(p models.Project, workspace string, _ mod...
    method Unlock (line 164) | func (c *NoOpLocker) Unlock(_ string) (*models.ProjectLock, error) {
    method List (line 170) | func (c *NoOpLocker) List() (map[string]models.ProjectLock, error) {
    method UnlockByPull (line 176) | func (c *NoOpLocker) UnlockByPull(_ string, _ int) ([]models.ProjectLo...
    method GetLock (line 184) | func (c *NoOpLocker) GetLock(_ string) (*models.ProjectLock, error) {
    method key (line 188) | func (c *NoOpLocker) key(p models.Project, workspace string) string {
  function NewNoOpLocker (line 151) | func NewNoOpLocker() *NoOpLocker {

FILE: server/core/locking/locking_test.go
  function TestTryLock_Err (line 39) | func TestTryLock_Err(t *testing.T) {
  function TestTryLock_Success (line 49) | func TestTryLock_Success(t *testing.T) {
  function TestUnlock_InvalidKey (line 60) | func TestUnlock_InvalidKey(t *testing.T) {
  function TestUnlock_Err (line 70) | func TestUnlock_Err(t *testing.T) {
  function TestUnlock (line 79) | func TestUnlock(t *testing.T) {
  function TestList_Err (line 89) | func TestList_Err(t *testing.T) {
  function TestList (line 98) | func TestList(t *testing.T) {
  function TestUnlockByPull (line 110) | func TestUnlockByPull(t *testing.T) {
  function TestGetLock_BadKey (line 119) | func TestGetLock_BadKey(t *testing.T) {
  function TestGetLock_Err (line 128) | func TestGetLock_Err(t *testing.T) {
  function TestGetLock (line 137) | func TestGetLock(t *testing.T) {
  function TestTryLock_NoOpLocker (line 147) | func TestTryLock_NoOpLocker(t *testing.T) {
  function TestUnlock_NoOpLocker (line 155) | func TestUnlock_NoOpLocker(t *testing.T) {
  function TestList_NoOpLocker (line 162) | func TestList_NoOpLocker(t *testing.T) {
  function TestUnlockByPull_NoOpLocker (line 169) | func TestUnlockByPull_NoOpLocker(t *testing.T) {
  function TestGetLock_NoOpLocker (line 175) | func TestGetLock_NoOpLocker(t *testing.T) {
  function TestApplyLocker (line 183) | func TestApplyLocker(t *testing.T) {
  function TestIsCurrentLocking_ValidKey (line 295) | func TestIsCurrentLocking_ValidKey(t *testing.T) {
  function TestIsCurrentLocking_ValidKeyWithNestedPath (line 307) | func TestIsCurrentLocking_ValidKeyWithNestedPath(t *testing.T) {
  function TestIsCurrentLocking_InvalidKeyOldFormat (line 319) | func TestIsCurrentLocking_InvalidKeyOldFormat(t *testing.T) {
  function TestIsCurrentLocking_InvalidKeySinglePart (line 327) | func TestIsCurrentLocking_InvalidKeySinglePart(t *testing.T) {
  function TestIsCurrentLocking_EmptyKey (line 335) | func TestIsCurrentLocking_EmptyKey(t *testing.T) {

FILE: server/core/locking/mocks/mock_apply_lock_checker.go
  type MockApplyLockChecker (line 20) | type MockApplyLockChecker struct
    method EXPECT (line 39) | func (m *MockApplyLockChecker) EXPECT() *MockApplyLockCheckerMockRecor...
    method CheckApplyLock (line 44) | func (m *MockApplyLockChecker) CheckApplyLock() (locking.ApplyCommandL...
  type MockApplyLockCheckerMockRecorder (line 27) | type MockApplyLockCheckerMockRecorder struct
    method CheckApplyLock (line 53) | func (mr *MockApplyLockCheckerMockRecorder) CheckApplyLock() *gomock.C...
  function NewMockApplyLockChecker (line 32) | func NewMockApplyLockChecker(ctrl *gomock.Controller) *MockApplyLockChec...

FILE: server/core/locking/mocks/mock_apply_locker.go
  type MockApplyLocker (line 20) | type MockApplyLocker struct
    method EXPECT (line 39) | func (m *MockApplyLocker) EXPECT() *MockApplyLockerMockRecorder {
    method CheckApplyLock (line 44) | func (m *MockApplyLocker) CheckApplyLock() (locking.ApplyCommandLock, ...
    method LockApply (line 59) | func (m *MockApplyLocker) LockApply() (locking.ApplyCommandLock, error) {
    method UnlockApply (line 74) | func (m *MockApplyLocker) UnlockApply() error {
  type MockApplyLockerMockRecorder (line 27) | type MockApplyLockerMockRecorder struct
    method CheckApplyLock (line 53) | func (mr *MockApplyLockerMockRecorder) CheckApplyLock() *gomock.Call {
    method LockApply (line 68) | func (mr *MockApplyLockerMockRecorder) LockApply() *gomock.Call {
    method UnlockApply (line 82) | func (mr *MockApplyLockerMockRecorder) UnlockApply() *gomock.Call {
  function NewMockApplyLocker (line 32) | func NewMockApplyLocker(ctrl *gomock.Controller) *MockApplyLocker {

FILE: server/core/locking/mocks/mock_locker.go
  type MockLocker (line 21) | type MockLocker struct
    method EXPECT (line 40) | func (m *MockLocker) EXPECT() *MockLockerMockRecorder {
    method GetLock (line 45) | func (m *MockLocker) GetLock(key string) (*models.ProjectLock, error) {
    method List (line 60) | func (m *MockLocker) List() (map[string]models.ProjectLock, error) {
    method TryLock (line 75) | func (m *MockLocker) TryLock(p models.Project, workspace string, pull ...
    method Unlock (line 90) | func (m *MockLocker) Unlock(key string) (*models.ProjectLock, error) {
    method UnlockByPull (line 105) | func (m *MockLocker) UnlockByPull(repoFullName string, pullNum int) ([...
  type MockLockerMockRecorder (line 28) | type MockLockerMockRecorder struct
    method GetLock (line 54) | func (mr *MockLockerMockRecorder) GetLock(key any) *gomock.Call {
    method List (line 69) | func (mr *MockLockerMockRecorder) List() *gomock.Call {
    method TryLock (line 84) | func (mr *MockLockerMockRecorder) TryLock(p, workspace, pull, user any...
    method Unlock (line 99) | func (mr *MockLockerMockRecorder) Unlock(key any) *gomock.Call {
    method UnlockByPull (line 114) | func (mr *MockLockerMockRecorder) UnlockByPull(repoFullName, pullNum a...
  function NewMockLocker (line 33) | func NewMockLocker(ctrl *gomock.Controller) *MockLocker {

FILE: server/core/redis/redis.go
  type RedisDB (line 25) | type RedisDB struct
    method TryLock (line 100) | func (r *RedisDB) TryLock(newLock models.ProjectLock) (bool, models.Pr...
    method Unlock (line 128) | func (r *RedisDB) Unlock(project models.Project, workspace string) (*m...
    method List (line 147) | func (r *RedisDB) List() ([]models.ProjectLock, error) {
    method GetLock (line 170) | func (r *RedisDB) GetLock(project models.Project, workspace string) (*...
    method UnlockByPull (line 190) | func (r *RedisDB) UnlockByPull(repoFullName string, pullNum int) ([]mo...
    method LockCommand (line 218) | func (r *RedisDB) LockCommand(cmdName command.Name, lockTime time.Time...
    method UnlockCommand (line 245) | func (r *RedisDB) UnlockCommand(cmdName command.Name) error {
    method CheckCommandLock (line 258) | func (r *RedisDB) CheckCommandLock(cmdName command.Name) (*command.Loc...
    method UpdateProjectStatus (line 277) | func (r *RedisDB) UpdateProjectStatus(pull models.PullRequest, workspa...
    method GetPullStatus (line 310) | func (r *RedisDB) GetPullStatus(pull models.PullRequest) (*models.Pull...
    method DeletePullStatus (line 323) | func (r *RedisDB) DeletePullStatus(pull models.PullRequest) error {
    method UpdatePullWithResults (line 335) | func (r *RedisDB) UpdatePullWithResults(pull models.PullRequest, newRe...
    method getPull (line 412) | func (r *RedisDB) getPull(key string) (*models.PullStatus, error) {
    method writePull (line 427) | func (r *RedisDB) writePull(key string, pull models.PullStatus) error {
    method deletePull (line 439) | func (r *RedisDB) deletePull(key string) error {
    method lockKey (line 447) | func (r *RedisDB) lockKey(p models.Project, workspace string) string {
    method commandLockKey (line 451) | func (r *RedisDB) commandLockKey(cmdName command.Name) string {
    method pullKey (line 455) | func (r *RedisDB) pullKey(pull models.PullRequest) (string, error) {
    method projectResultToProject (line 468) | func (r *RedisDB) projectResultToProject(p command.ProjectResult) mode...
    method Close (line 478) | func (r *RedisDB) Close() error {
  constant pullKeySeparator (line 30) | pullKeySeparator = "::"
  function New (line 33) | func New(hostname string, port int, password string, tlsEnabled bool, in...
  function NewWithClient (line 90) | func NewWithClient(client *redis.Client, _ string, _ string) (*RedisDB, ...

FILE: server/core/redis/redis_test.go
  function TestRedisWithTLS (line 53) | func TestRedisWithTLS(t *testing.T) {
  function TestLockCommandNotSet (line 89) | func TestLockCommandNotSet(t *testing.T) {
  function TestLockCommandEnabled (line 98) | func TestLockCommandEnabled(t *testing.T) {
  function TestLockCommandFail (line 111) | func TestLockCommandFail(t *testing.T) {
  function TestUnlockCommandDisabled (line 123) | func TestUnlockCommandDisabled(t *testing.T) {
  function TestUnlockCommandFail (line 143) | func TestUnlockCommandFail(t *testing.T) {
  function TestMigrationOldLockKeysToNewFormat (line 151) | func TestMigrationOldLockKeysToNewFormat(t *testing.T) {
  function TestNoMigrationNeededForNewFormatKeys (line 204) | func TestNoMigrationNeededForNewFormatKeys(t *testing.T) {
  function TestMixedLocksPresent (line 246) | func TestMixedLocksPresent(t *testing.T) {
  function TestListNoLocks (line 261) | func TestListNoLocks(t *testing.T) {
  function TestListOneLock (line 270) | func TestListOneLock(t *testing.T) {
  function TestListMultipleLocks (line 281) | func TestListMultipleLocks(t *testing.T) {
  function TestListAddRemove (line 314) | func TestListAddRemove(t *testing.T) {
  function TestLockingNoLocks (line 328) | func TestLockingNoLocks(t *testing.T) {
  function TestLockingExistingLock (line 338) | func TestLockingExistingLock(t *testing.T) {
  function TestUnlockingNoLocks (line 399) | func TestUnlockingNoLocks(t *testing.T) {
  function TestUnlocking (line 408) | func TestUnlocking(t *testing.T) {
  function TestUnlockingMultiple (line 432) | func TestUnlockingMultiple(t *testing.T) {
  function TestUnlockByPullNone (line 471) | func TestUnlockByPullNone(t *testing.T) {
  function TestUnlockByPullOne (line 480) | func TestUnlockByPullOne(t *testing.T) {
  function TestUnlockByPullAfterUnlock (line 513) | func TestUnlockByPullAfterUnlock(t *testing.T) {
  function TestUnlockByPullMatching (line 529) | func TestUnlockByPullMatching(t *testing.T) {
  function TestGetLockNotThere (line 559) | func TestGetLockNotThere(t *testing.T) {
  function TestGetLock (line 568) | func TestGetLock(t *testing.T) {
  function TestPullStatus_UpdateGet (line 585) | func TestPullStatus_UpdateGet(t *testing.T) {
  function TestPullStatus_UpdateDeleteGet (line 638) | func TestPullStatus_UpdateDeleteGet(t *testing.T) {
  function TestPullStatus_UpdateProject (line 686) | func TestPullStatus_UpdateProject(t *testing.T) {
  function TestPullStatus_UpdateNewCommit (line 754) | func TestPullStatus_UpdateNewCommit(t *testing.T) {
  function TestPullStatus_UpdateMerge_Apply (line 821) | func TestPullStatus_UpdateMerge_Apply(t *testing.T) {
  function TestPullStatus_UpdateMerge_ApprovePolicies (line 946) | func TestPullStatus_UpdateMerge_ApprovePolicies(t *testing.T) {
  function newTestRedis (line 1065) | func newTestRedis(mr *miniredis.Miniredis) *redis.RedisDB {
  function newTestRedisTLS (line 1073) | func newTestRedisTLS(mr *miniredis.Miniredis) *redis.RedisDB {
  function generateLocalhostCert (line 1081) | func generateLocalhostCert() ([]byte, []byte, error) {

FILE: server/core/runtime/apply_step_runner.go
  type ApplyStepRunner (line 23) | type ApplyStepRunner struct
    method Run (line 31) | func (a *ApplyStepRunner) Run(ctx command.ProjectContext, extraArgs []...
    method hasTargetFlag (line 80) | func (a *ApplyStepRunner) hasTargetFlag(ctx command.ProjectContext, ex...
    method cleanRemoteApplyOutput (line 97) | func (a *ApplyStepRunner) cleanRemoteApplyOutput(out string) string {
    method runRemoteApply (line 119) | func (a *ApplyStepRunner) runRemoteApply(
    method remotePlanChanged (line 209) | func (a *ApplyStepRunner) remotePlanChanged(planfileContents string, a...
    method atConfirmApplyPrompt (line 233) | func (a *ApplyStepRunner) atConfirmApplyPrompt(applyLines []string) bo...

FILE: server/core/runtime/apply_step_runner_internal_test.go
  function TestCleanRemoteOpOutput (line 12) | func TestCleanRemoteOpOutput(t *testing.T) {

FILE: server/core/runtime/apply_step_runner_test.go
  function TestRun_NoDir (line 30) | func TestRun_NoDir(t *testing.T) {
  function TestRun_NoPlanFile (line 41) | func TestRun_NoPlanFile(t *testing.T) {
  function TestRun_Success (line 53) | func TestRun_Success(t *testing.T) {
  function TestRun_AppliesCorrectProjectPlan (line 85) | func TestRun_AppliesCorrectProjectPlan(t *testing.T) {
  function TestApplyStepRunner_TestRun_UsesConfiguredTFVersion (line 119) | func TestApplyStepRunner_TestRun_UsesConfiguredTFVersion(t *testing.T) {
  function TestApplyStepRunner_TestRun_UsesConfiguredDistribution (line 153) | func TestApplyStepRunner_TestRun_UsesConfiguredDistribution(t *testing.T) {
  function TestRun_UsingTarget (line 191) | func TestRun_UsingTarget(t *testing.T) {
  function TestRun_RemoteApply_Success (line 270) | func TestRun_RemoteApply_Success(t *testing.T) {
  function TestRun_RemoteApply_PlanChanged (line 327) | func TestRun_RemoteApply_PlanChanged(t *testing.T) {
  type remoteApplyMock (line 398) | type remoteApplyMock struct
    method RunCommandAsync (line 412) | func (r *remoteApplyMock) RunCommandAsync(_ command.ProjectContext, _ ...

FILE: server/core/runtime/cache/mocks/mock_key_serializer.go
  type MockKeySerializer (line 13) | type MockKeySerializer struct
    method SetFailHandler (line 25) | func (mock *MockKeySerializer) SetFailHandler(fh pegomock.FailHandler)...
    method FailHandler (line 26) | func (mock *MockKeySerializer) FailHandler() pegomock.FailHandler     ...
    method Serialize (line 28) | func (mock *MockKeySerializer) Serialize(key *go_version.Version) (str...
    method VerifyWasCalledOnce (line 47) | func (mock *MockKeySerializer) VerifyWasCalledOnce() *VerifierMockKeyS...
    method VerifyWasCalled (line 54) | func (mock *MockKeySerializer) VerifyWasCalled(invocationCountMatcher ...
    method VerifyWasCalledInOrder (line 61) | func (mock *MockKeySerializer) VerifyWasCalledInOrder(invocationCountM...
    method VerifyWasCalledEventually (line 69) | func (mock *MockKeySerializer) VerifyWasCalledEventually(invocationCou...
  function NewMockKeySerializer (line 17) | func NewMockKeySerializer(options ...pegomock.Option) *MockKeySerializer {
  type VerifierMockKeySerializer (line 77) | type VerifierMockKeySerializer struct
    method Serialize (line 84) | func (verifier *VerifierMockKeySerializer) Serialize(key *go_version.V...
  type MockKeySerializer_Serialize_OngoingVerification (line 90) | type MockKeySerializer_Serialize_OngoingVerification struct
    method GetCapturedArguments (line 95) | func (c *MockKeySerializer_Serialize_OngoingVerification) GetCapturedA...
    method GetAllCapturedArguments (line 100) | func (c *MockKeySerializer_Serialize_OngoingVerification) GetAllCaptur...

FILE: server/core/runtime/cache/mocks/mock_version_path.go
  type MockExecutionVersionCache (line 13) | type MockExecutionVersionCache struct
    method SetFailHandler (line 25) | func (mock *MockExecutionVersionCache) SetFailHandler(fh pegomock.Fail...
    method FailHandler (line 26) | func (mock *MockExecutionVersionCache) FailHandler() pegomock.FailHand...
    method Get (line 28) | func (mock *MockExecutionVersionCache) Get(key *go_version.Version) (s...
    method VerifyWasCalledOnce (line 47) | func (mock *MockExecutionVersionCache) VerifyWasCalledOnce() *Verifier...
    method VerifyWasCalled (line 54) | func (mock *MockExecutionVersionCache) VerifyWasCalled(invocationCount...
    method VerifyWasCalledInOrder (line 61) | func (mock *MockExecutionVersionCache) VerifyWasCalledInOrder(invocati...
    method VerifyWasCalledEventually (line 69) | func (mock *MockExecutionVersionCache) VerifyWasCalledEventually(invoc...
  function NewMockExecutionVersionCache (line 17) | func NewMockExecutionVersionCache(options ...pegomock.Option) *MockExecu...
  type VerifierMockExecutionVersionCache (line 77) | type VerifierMockExecutionVersionCache struct
    method Get (line 84) | func (verifier *VerifierMockExecutionVersionCache) Get(key *go_version...
  type MockExecutionVersionCache_Get_OngoingVerification (line 90) | type MockExecutionVersionCache_Get_OngoingVerification struct
    method GetCapturedArguments (line 95) | func (c *MockExecutionVersionCache_Get_OngoingVerification) GetCapture...
    method GetAllCapturedArguments (line 100) | func (c *MockExecutionVersionCache_Get_OngoingVerification) GetAllCapt...

FILE: server/core/runtime/cache/version_path.go
  type ExecutionVersionCache (line 17) | type ExecutionVersionCache interface
  type KeySerializer (line 21) | type KeySerializer interface
  type DefaultDiskLookupKeySerializer (line 25) | type DefaultDiskLookupKeySerializer struct
    method Serialize (line 29) | func (s *DefaultDiskLookupKeySerializer) Serialize(key *version.Versio...
  type ExecutionVersionDiskLayer (line 35) | type ExecutionVersionDiskLayer struct
    method Get (line 44) | func (v *ExecutionVersionDiskLayer) Get(key *version.Version) (string,...
  type ExecutionVersionMemoryLayer (line 85) | type ExecutionVersionMemoryLayer struct
    method Get (line 93) | func (v *ExecutionVersionMemoryLayer) Get(key *version.Version) (strin...
  function NewExecutionVersionLayeredLoadingCache (line 116) | func NewExecutionVersionLayeredLoadingCache(

FILE: server/core/runtime/cache/version_path_test.go
  function TestExecutionVersionDiskLayer (line 19) | func TestExecutionVersionDiskLayer(t *testing.T) {
  function TestExecutionVersionMemoryLayer (line 199) | func TestExecutionVersionMemoryLayer(t *testing.T) {

FILE: server/core/runtime/common/common.go
  function DeDuplicateExtraArgs (line 15) | func DeDuplicateExtraArgs(commandArgs []string, extraArgs []string) []st...
  function FileExists (line 65) | func FileExists(path string) bool {
  function IsFileTracked (line 75) | func IsFileTracked(cloneDir string, filename string) (bool, error) {

FILE: server/core/runtime/common/common_test.go
  function Test_DeDuplicateExtraArgs (line 15) | func Test_DeDuplicateExtraArgs(t *testing.T) {
  function runCmd (line 95) | func runCmd(t *testing.T, dir string, name string, args ...string) string {
  function initRepo (line 104) | func initRepo(t *testing.T) string {
  function TestIsFileTracked (line 117) | func TestIsFileTracked(t *testing.T) {

FILE: server/core/runtime/env_step_runner.go
  type EnvStepRunner (line 15) | type EnvStepRunner struct
    method Run (line 22) | func (r *EnvStepRunner) Run(

FILE: server/core/runtime/env_step_runner_test.go
  function TestEnvStepRunner_Run (line 23) | func TestEnvStepRunner_Run(t *testing.T) {

FILE: server/core/runtime/executor.go
  type VersionedExecutorWorkflow (line 15) | type VersionedExecutorWorkflow interface
  type Executor (line 21) | type Executor interface
  type ExecutorVersionEnsurer (line 26) | type ExecutorVersionEnsurer interface

FILE: server/core/runtime/external_team_allowlist_runner.go
  type ExternalTeamAllowlistRunner (line 17) | type ExternalTeamAllowlistRunner interface
  type DefaultExternalTeamAllowlistRunner (line 21) | type DefaultExternalTeamAllowlistRunner struct
    method Run (line 23) | func (r DefaultExternalTeamAllowlistRunner) Run(ctx models.TeamAllowli...

FILE: server/core/runtime/import_step_runner.go
  type importStepRunner (line 16) | type importStepRunner struct
    method Run (line 31) | func (p *importStepRunner) Run(ctx command.ProjectContext, extraArgs [...
  function NewImportStepRunner (line 22) | func NewImportStepRunner(terraformExecutor TerraformExec, defaultTfDistr...

FILE: server/core/runtime/import_step_runner_test.go
  function TestImportStepRunner_Run_Success (line 22) | func TestImportStepRunner_Run_Success(t *testing.T) {
  function TestImportStepRunner_Run_Workspace (line 54) | func TestImportStepRunner_Run_Workspace(t *testing.T) {
  function TestImportStepRunner_Run_UsesConfiguredDistribution (line 93) | func TestImportStepRunner_Run_UsesConfiguredDistribution(t *testing.T) {

FILE: server/core/runtime/init_step_runner.go
  type InitStepRunner (line 17) | type InitStepRunner struct
    method Run (line 23) | func (i *InitStepRunner) Run(ctx command.ProjectContext, extraArgs []s...

FILE: server/core/runtime/init_step_runner_test.go
  function TestRun_UsesGetOrInitForRightVersion (line 26) | func TestRun_UsesGetOrInitForRightVersion(t *testing.T) {
  function TestInitStepRunner_TestRun_UsesConfiguredDistribution (line 87) | func TestInitStepRunner_TestRun_UsesConfiguredDistribution(t *testing.T) {
  function TestRun_ShowInitOutputOnError (line 154) | func TestRun_ShowInitOutputOnError(t *testing.T) {
  function TestRun_InitOmitsUpgradeFlagIfLockFileTracked (line 179) | func TestRun_InitOmitsUpgradeFlagIfLockFileTracked(t *testing.T) {
  function TestRun_InitKeepsUpgradeFlagIfLockFileNotPresent (line 219) | func TestRun_InitKeepsUpgradeFlagIfLockFileNotPresent(t *testing.T) {
  function TestRun_InitKeepUpgradeFlagIfLockFilePresentAndTFLessThanPoint14 (line 250) | func TestRun_InitKeepUpgradeFlagIfLockFilePresentAndTFLessThanPoint14(t ...
  function TestRun_InitExtraArgsDeDupe (line 285) | func TestRun_InitExtraArgsDeDupe(t *testing.T) {
  function TestRun_InitDeletesLockFileIfPresentAndNotTracked (line 355) | func TestRun_InitDeletesLockFileIfPresentAndNotTracked(t *testing.T) {
  function runCmd (line 393) | func runCmd(t *testing.T, dir string, name string, args ...string) string {
  function initRepo (line 402) | func initRepo(t *testing.T) string {

FILE: server/core/runtime/minimum_version_step_runner_delegate.go
  type minimumVersionStepRunnerDelegate (line 15) | type minimumVersionStepRunnerDelegate struct
    method Run (line 35) | func (r *minimumVersionStepRunnerDelegate) Run(ctx command.ProjectCont...
  function NewMinimumVersionStepRunnerDelegate (line 21) | func NewMinimumVersionStepRunnerDelegate(minimumVersionStr string, defau...

FILE: server/core/runtime/minimum_version_step_runner_delegate_test.go
  function TestRunMinimumVersionDelegate (line 16) | func TestRunMinimumVersionDelegate(t *testing.T) {

FILE: server/core/runtime/mocks/mock_async_tfexec.go
  type MockAsyncTFExec (line 16) | type MockAsyncTFExec struct
    method SetFailHandler (line 28) | func (mock *MockAsyncTFExec) SetFailHandler(fh pegomock.FailHandler) {...
    method FailHandler (line 29) | func (mock *MockAsyncTFExec) FailHandler() pegomock.FailHandler      {...
    method RunCommandAsync (line 31) | func (mock *MockAsyncTFExec) RunCommandAsync(ctx command.ProjectContex...
    method VerifyWasCalledOnce (line 58) | func (mock *MockAsyncTFExec) VerifyWasCalledOnce() *VerifierMockAsyncT...
    method VerifyWasCalled (line 65) | func (mock *MockAsyncTFExec) VerifyWasCalled(invocationCountMatcher pe...
    method VerifyWasCalledInOrder (line 72) | func (mock *MockAsyncTFExec) VerifyWasCalledInOrder(invocationCountMat...
    method VerifyWasCalledEventually (line 80) | func (mock *MockAsyncTFExec) VerifyWasCalledEventually(invocationCount...
  function NewMockAsyncTFExec (line 20) | func NewMockAsyncTFExec(options ...pegomock.Option) *MockAsyncTFExec {
  type VerifierMockAsyncTFExec (line 88) | type VerifierMockAsyncTFExec struct
    method RunCommandAsync (line 95) | func (verifier *VerifierMockAsyncTFExec) RunCommandAsync(ctx command.P...
  type MockAsyncTFExec_RunCommandAsync_OngoingVerification (line 101) | type MockAsyncTFExec_RunCommandAsync_OngoingVerification struct
    method GetCapturedArguments (line 106) | func (c *MockAsyncTFExec_RunCommandAsync_OngoingVerification) GetCaptu...
    method GetAllCapturedArguments (line 111) | func (c *MockAsyncTFExec_RunCommandAsync_OngoingVerification) GetAllCa...

FILE: server/core/runtime/mocks/mock_external_team_allowlist_runner.go
  type MockExternalTeamAllowlistRunner (line 13) | type MockExternalTeamAllowlistRunner struct
    method SetFailHandler (line 25) | func (mock *MockExternalTeamAllowlistRunner) SetFailHandler(fh pegomoc...
    method FailHandler (line 26) | func (mock *MockExternalTeamAllowlistRunner) FailHandler() pegomock.Fa...
    method Run (line 28) | func (mock *MockExternalTeamAllowlistRunner) Run(ctx models.TeamAllowl...
    method VerifyWasCalledOnce (line 47) | func (mock *MockExternalTeamAllowlistRunner) VerifyWasCalledOnce() *Ve...
    method VerifyWasCalled (line 54) | func (mock *MockExternalTeamAllowlistRunner) VerifyWasCalled(invocatio...
    method VerifyWasCalledInOrder (line 61) | func (mock *MockExternalTeamAllowlistRunner) VerifyWasCalledInOrder(in...
    method VerifyWasCalledEventually (line 69) | func (mock *MockExternalTeamAllowlistRunner) VerifyWasCalledEventually...
  function NewMockExternalTeamAllowlistRunner (line 17) | func NewMockExternalTeamAllowlistRunner(options ...pegomock.Option) *Moc...
  type VerifierMockExternalTeamAllowlistRunner (line 77) | type VerifierMockExternalTeamAllowlistRunner struct
    method Run (line 84) | func (verifier *VerifierMockExternalTeamAllowlistRunner) Run(ctx model...
  type MockExternalTeamAllowlistRunner_Run_OngoingVerification (line 90) | type MockExternalTeamAllowlistRunner_Run_OngoingVerification struct
    method GetCapturedArguments (line 95) | func (c *MockExternalTeamAllowlistRunner_Run_OngoingVerification) GetC...
    method GetAllCapturedArguments (line 100) | func (c *MockExternalTeamAllowlistRunner_Run_OngoingVerification) GetA...

FILE: server/core/runtime/mocks/mock_post_workflows_hook_runner.go
  type MockPostWorkflowHookRunner (line 13) | type MockPostWorkflowHookRunner struct
    method SetFailHandler (line 25) | func (mock *MockPostWorkflowHookRunner) SetFailHandler(fh pegomock.Fai...
    method FailHandler (line 26) | func (mock *MockPostWorkflowHookRunner) FailHandler() pegomock.FailHan...
    method Run (line 28) | func (mock *MockPostWorkflowHookRunner) Run(ctx models.WorkflowHookCom...
    method VerifyWasCalledOnce (line 51) | func (mock *MockPostWorkflowHookRunner) VerifyWasCalledOnce() *Verifie...
    method VerifyWasCalled (line 58) | func (mock *MockPostWorkflowHookRunner) VerifyWasCalled(invocationCoun...
    method VerifyWasCalledInOrder (line 65) | func (mock *MockPostWorkflowHookRunner) VerifyWasCalledInOrder(invocat...
    method VerifyWasCalledEventually (line 73) | func (mock *MockPostWorkflowHookRunner) VerifyWasCalledEventually(invo...
  function NewMockPostWorkflowHookRunner (line 17) | func NewMockPostWorkflowHookRunner(options ...pegomock.Option) *MockPost...
  type VerifierMockPostWorkflowHookRunner (line 81) | type VerifierMockPostWorkflowHookRunner struct
    method Run (line 88) | func (verifier *VerifierMockPostWorkflowHookRunner) Run(ctx models.Wor...
  type MockPostWorkflowHookRunner_Run_OngoingVerification (line 94) | type MockPostWorkflowHookRunner_Run_OngoingVerification struct
    method GetCapturedArguments (line 99) | func (c *MockPostWorkflowHookRunner_Run_OngoingVerification) GetCaptur...
    method GetAllCapturedArguments (line 104) | func (c *MockPostWorkflowHookRunner_Run_OngoingVerification) GetAllCap...

FILE: server/core/runtime/mocks/mock_pre_workflows_hook_runner.go
  type MockPreWorkflowHookRunner (line 13) | type MockPreWorkflowHookRunner struct
    method SetFailHandler (line 25) | func (mock *MockPreWorkflowHookRunner) SetFailHandler(fh pegomock.Fail...
    method FailHandler (line 26) | func (mock *MockPreWorkflowHookRunner) FailHandler() pegomock.FailHand...
    method Run (line 28) | func (mock *MockPreWorkflowHookRunner) Run(ctx models.WorkflowHookComm...
    method VerifyWasCalledOnce (line 51) | func (mock *MockPreWorkflowHookRunner) VerifyWasCalledOnce() *Verifier...
    method VerifyWasCalled (line 58) | func (mock *MockPreWorkflowHookRunner) VerifyWasCalled(invocationCount...
    method VerifyWasCalledInOrder (line 65) | func (mock *MockPreWorkflowHookRunner) VerifyWasCalledInOrder(invocati...
    method VerifyWasCalledEventually (line 73) | func (mock *MockPreWorkflowHookRunner) VerifyWasCalledEventually(invoc...
  function NewMockPreWorkflowHookRunner (line 17) | func NewMockPreWorkflowHookRunner(options ...pegomock.Option) *MockPreWo...
  type VerifierMockPreWorkflowHookRunner (line 81) | type VerifierMockPreWorkflowHookRunner struct
    method Run (line 88) | func (verifier *VerifierMockPreWorkflowHookRunner) Run(ctx models.Work...
  type MockPreWorkflowHookRunner_Run_OngoingVerification (line 94) | type MockPreWorkflowHookRunner_Run_OngoingVerification struct
    method GetCapturedArguments (line 99) | func (c *MockPreWorkflowHookRunner_Run_OngoingVerification) GetCapture...
    method GetAllCapturedArguments (line 104) | func (c *MockPreWorkflowHookRunner_Run_OngoingVerification) GetAllCapt...

FILE: server/core/runtime/mocks/mock_pull_approved_checker.go
  type MockPullApprovedChecker (line 14) | type MockPullApprovedChecker struct
    method SetFailHandler (line 26) | func (mock *MockPullApprovedChecker) SetFailHandler(fh pegomock.FailHa...
    method FailHandler (line 27) | func (mock *MockPullApprovedChecker) FailHandler() pegomock.FailHandle...
    method PullIsApproved (line 29) | func (mock *MockPullApprovedChecker) PullIsApproved(logger logging.Sim...
    method VerifyWasCalledOnce (line 48) | func (mock *MockPullApprovedChecker) VerifyWasCalledOnce() *VerifierMo...
    method VerifyWasCalled (line 55) | func (mock *MockPullApprovedChecker) VerifyWasCalled(invocationCountMa...
    method VerifyWasCalledInOrder (line 62) | func (mock *MockPullApprovedChecker) VerifyWasCalledInOrder(invocation...
    method VerifyWasCalledEventually (line 70) | func (mock *MockPullApprovedChecker) VerifyWasCalledEventually(invocat...
  function NewMockPullApprovedChecker (line 18) | func NewMockPullApprovedChecker(options ...pegomock.Option) *MockPullApp...
  type VerifierMockPullApprovedChecker (line 78) | type VerifierMockPullApprovedChecker struct
    method PullIsApproved (line 85) | func (verifier *VerifierMockPullApprovedChecker) PullIsApproved(logger...
  type MockPullApprovedChecker_PullIsApproved_OngoingVerification (line 91) | type MockPullApprovedChecker_PullIsApproved_OngoingVerification struct
    method GetCapturedArguments (line 96) | func (c *MockPullApprovedChecker_PullIsApproved_OngoingVerification) G...
    method GetAllCapturedArguments (line 101) | func (c *MockPullApprovedChecker_PullIsApproved_OngoingVerification) G...

FILE: server/core/runtime/mocks/mock_runner.go
  type MockRunner (line 13) | type MockRunner struct
    method SetFailHandler (line 25) | func (mock *MockRunner) SetFailHandler(fh pegomock.FailHandler) { mock...
    method FailHandler (line 26) | func (mock *MockRunner) FailHandler() pegomock.FailHandler      { retu...
    method Run (line 28) | func (mock *MockRunner) Run(ctx command.ProjectContext, extraArgs []st...
    method VerifyWasCalledOnce (line 47) | func (mock *MockRunner) VerifyWasCalledOnce() *VerifierMockRunner {
    method VerifyWasCalled (line 54) | func (mock *MockRunner) VerifyWasCalled(invocationCountMatcher pegomoc...
    method VerifyWasCalledInOrder (line 61) | func (mock *MockRunner) VerifyWasCalledInOrder(invocationCountMatcher ...
    method VerifyWasCalledEventually (line 69) | func (mock *MockRunner) VerifyWasCalledEventually(invocationCountMatch...
  function NewMockRunner (line 17) | func NewMockRunner(options ...pegomock.Option) *MockRunner {
  type VerifierMockRunner (line 77) | type VerifierMockRunner struct
    method Run (line 84) | func (verifier *VerifierMockRunner) Run(ctx command.ProjectContext, ex...
  type MockRunner_Run_OngoingVerification (line 90) | type MockRunner_Run_OngoingVerification struct
    method GetCapturedArguments (line 95) | func (c *MockRunner_Run_OngoingVerification) GetCapturedArguments() (c...
    method GetAllCapturedArguments (line 100) | func (c *MockRunner_Run_OngoingVerification) GetAllCapturedArguments()...

FILE: server/core/runtime/mocks/mock_status_updater.go
  type MockStatusUpdater (line 14) | type MockStatusUpdater struct
    method SetFailHandler (line 26) | func (mock *MockStatusUpdater) SetFailHandler(fh pegomock.FailHandler)...
    method FailHandler (line 27) | func (mock *MockStatusUpdater) FailHandler() pegomock.FailHandler     ...
    method UpdateProject (line 29) | func (mock *MockStatusUpdater) UpdateProject(ctx command.ProjectContex...
    method VerifyWasCalledOnce (line 44) | func (mock *MockStatusUpdater) VerifyWasCalledOnce() *VerifierMockStat...
    method VerifyWasCalled (line 51) | func (mock *MockStatusUpdater) VerifyWasCalled(invocationCountMatcher ...
    method VerifyWasCalledInOrder (line 58) | func (mock *MockStatusUpdater) VerifyWasCalledInOrder(invocationCountM...
    method VerifyWasCalledEventually (line 66) | func (mock *MockStatusUpdater) VerifyWasCalledEventually(invocationCou...
  function NewMockStatusUpdater (line 18) | func NewMockStatusUpdater(options ...pegomock.Option) *MockStatusUpdater {
  type VerifierMockStatusUpdater (line 74) | type VerifierMockStatusUpdater struct
    method UpdateProject (line 81) | func (verifier *VerifierMockStatusUpdater) UpdateProject(ctx command.P...
  type MockStatusUpdater_UpdateProject_OngoingVerification (line 87) | type MockStatusUpdater_UpdateProject_OngoingVerification struct
    method GetCapturedArguments (line 92) | func (c *MockStatusUpdater_UpdateProject_OngoingVerification) GetCaptu...
    method GetAllCapturedArguments (line 97) | func (c *MockStatusUpdater_UpdateProject_OngoingVerification) GetAllCa...

FILE: server/core/runtime/mocks/mock_versionedexecutorworkflow.go
  type MockVersionedExecutorWorkflow (line 15) | type MockVersionedExecutorWorkflow struct
    method SetFailHandler (line 27) | func (mock *MockVersionedExecutorWorkflow) SetFailHandler(fh pegomock....
    method FailHandler (line 28) | func (mock *MockVersionedExecutorWorkflow) FailHandler() pegomock.Fail...
    method EnsureExecutorVersion (line 30) | func (mock *MockVersionedExecutorWorkflow) EnsureExecutorVersion(log l...
    method Run (line 49) | func (mock *MockVersionedExecutorWorkflow) Run(ctx command.ProjectCont...
    method VerifyWasCalledOnce (line 68) | func (mock *MockVersionedExecutorWorkflow) VerifyWasCalledOnce() *Veri...
    method VerifyWasCalled (line 75) | func (mock *MockVersionedExecutorWorkflow) VerifyWasCalled(invocationC...
    method VerifyWasCalledInOrder (line 82) | func (mock *MockVersionedExecutorWorkflow) VerifyWasCalledInOrder(invo...
    method VerifyWasCalledEventually (line 90) | func (mock *MockVersionedExecutorWorkflow) VerifyWasCalledEventually(i...
  function NewMockVersionedExecutorWorkflow (line 19) | func NewMockVersionedExecutorWorkflow(options ...pegomock.Option) *MockV...
  type VerifierMockVersionedExecutorWorkflow (line 98) | type VerifierMockVersionedExecutorWorkflow struct
    method EnsureExecutorVersion (line 105) | func (verifier *VerifierMockVersionedExecutorWorkflow) EnsureExecutorV...
    method Run (line 140) | func (verifier *VerifierMockVersionedExecutorWorkflow) Run(ctx command...
  type MockVersionedExecutorWorkflow_EnsureExecutorVersion_OngoingVerification (line 111) | type MockVersionedExecutorWorkflow_EnsureExecutorVersion_OngoingVerifica...
    method GetCapturedArguments (line 116) | func (c *MockVersionedExecutorWorkflow_EnsureExecutorVersion_OngoingVe...
    method GetAllCapturedArguments (line 121) | func (c *MockVersionedExecutorWorkflow_EnsureExecutorVersion_OngoingVe...
  type MockVersionedExecutorWorkflow_Run_OngoingVerification (line 146) | type MockVersionedExecutorWorkflow_Run_OngoingVerification struct
    method GetCapturedArguments (line 151) | func (c *MockVersionedExecutorWorkflow_Run_OngoingVerification) GetCap...
    method GetAllCapturedArguments (line 156) | func (c *MockVersionedExecutorWorkflow_Run_OngoingVerification) GetAll...

FILE: server/core/runtime/models/exec.go
  type Exec (line 15) | type Exec interface
  type LocalExec (line 20) | type LocalExec struct
    method LookPath (line 22) | func (e LocalExec) LookPath(file string) (string, error) {
    method CombinedOutput (line 30) | func (e LocalExec) CombinedOutput(args []string, envs map[string]strin...

FILE: server/core/runtime/models/filepath.go
  type FilePath (line 13) | type FilePath interface
  type LocalFilePath (line 20) | type LocalFilePath
    method NotExists (line 22) | func (fp LocalFilePath) NotExists() bool {
    method Join (line 28) | func (fp LocalFilePath) Join(elem ...string) FilePath {
    method Symlink (line 37) | func (fp LocalFilePath) Symlink(newname string) (FilePath, error) {
    method Resolve (line 41) | func (fp LocalFilePath) Resolve() string {

FILE: server/core/runtime/models/mocks/mock_exec.go
  type MockExec (line 12) | type MockExec struct
    method SetFailHandler (line 24) | func (mock *MockExec) SetFailHandler(fh pegomock.FailHandler) { mock.f...
    method FailHandler (line 25) | func (mock *MockExec) FailHandler() pegomock.FailHandler      { return...
    method CombinedOutput (line 27) | func (mock *MockExec) CombinedOutput(args []string, envs map[string]st...
    method LookPath (line 46) | func (mock *MockExec) LookPath(file string) (string, error) {
    method VerifyWasCalledOnce (line 65) | func (mock *MockExec) VerifyWasCalledOnce() *VerifierMockExec {
    method VerifyWasCalled (line 72) | func (mock *MockExec) VerifyWasCalled(invocationCountMatcher pegomock....
    method VerifyWasCalledInOrder (line 79) | func (mock *MockExec) VerifyWasCalledInOrder(invocationCountMatcher pe...
    method VerifyWasCalledEventually (line 87) | func (mock *MockExec) VerifyWasCalledEventually(invocationCountMatcher...
  function NewMockExec (line 16) | func NewMockExec(options ...pegomock.Option) *MockExec {
  type VerifierMockExec (line 95) | type VerifierMockExec struct
    method CombinedOutput (line 102) | func (verifier *VerifierMockExec) CombinedOutput(args []string, envs m...
    method LookPath (line 143) | func (verifier *VerifierMockExec) LookPath(file string) *MockExec_Look...
  type MockExec_CombinedOutput_OngoingVerification (line 108) | type MockExec_CombinedOutput_OngoingVerification struct
    method GetCapturedArguments (line 113) | func (c *MockExec_CombinedOutput_OngoingVerification) GetCapturedArgum...
    method GetAllCapturedArguments (line 118) | func (c *MockExec_CombinedOutput_OngoingVerification) GetAllCapturedAr...
  type MockExec_LookPath_OngoingVerification (line 149) | type MockExec_LookPath_OngoingVerification struct
    method GetCapturedArguments (line 154) | func (c *MockExec_LookPath_OngoingVerification) GetCapturedArguments()...
    method GetAllCapturedArguments (line 159) | func (c *MockExec_LookPath_OngoingVerification) GetAllCapturedArgument...

FILE: server/core/runtime/models/mocks/mock_filepath.go
  type MockFilePath (line 13) | type MockFilePath struct
    method SetFailHandler (line 25) | func (mock *MockFilePath) SetFailHandler(fh pegomock.FailHandler) { mo...
    method FailHandler (line 26) | func (mock *MockFilePath) FailHandler() pegomock.FailHandler      { re...
    method Join (line 28) | func (mock *MockFilePath) Join(elem ...string) models.FilePath {
    method NotExists (line 46) | func (mock *MockFilePath) NotExists() bool {
    method Resolve (line 61) | func (mock *MockFilePath) Resolve() string {
    method Symlink (line 76) | func (mock *MockFilePath) Symlink(newname string) (models.FilePath, er...
    method VerifyWasCalledOnce (line 95) | func (mock *MockFilePath) VerifyWasCalledOnce() *VerifierMockFilePath {
    method VerifyWasCalled (line 102) | func (mock *MockFilePath) VerifyWasCalled(invocationCountMatcher pegom...
    method VerifyWasCalledInOrder (line 109) | func (mock *MockFilePath) VerifyWasCalledInOrder(invocationCountMatche...
    method VerifyWasCalledEventually (line 117) | func (mock *MockFilePath) VerifyWasCalledEventually(invocationCountMat...
  function NewMockFilePath (line 17) | func NewMockFilePath(options ...pegomock.Option) *MockFilePath {
  type VerifierMockFilePath (line 125) | type VerifierMockFilePath struct
    method Join (line 132) | func (verifier *VerifierMockFilePath) Join(elem ...string) *MockFilePa...
    method NotExists (line 167) | func (verifier *VerifierMockFilePath) NotExists() *MockFilePath_NotExi...
    method Resolve (line 184) | func (verifier *VerifierMockFilePath) Resolve() *MockFilePath_Resolve_...
    method Symlink (line 201) | func (verifier *VerifierMockFilePath) Symlink(newname string) *MockFil...
  type MockFilePath_Join_OngoingVerification (line 141) | type MockFilePath_Join_OngoingVerification struct
    method GetCapturedArguments (line 146) | func (c *MockFilePath_Join_OngoingVerification) GetCapturedArguments()...
    method GetAllCapturedArguments (line 151) | func (c *MockFilePath_Join_OngoingVerification) GetAllCapturedArgument...
  type MockFilePath_NotExists_OngoingVerification (line 173) | type MockFilePath_NotExists_OngoingVerification struct
    method GetCapturedArguments (line 178) | func (c *MockFilePath_NotExists_OngoingVerification) GetCapturedArgume...
    method GetAllCapturedArguments (line 181) | func (c *MockFilePath_NotExists_OngoingVerification) GetAllCapturedArg...
  type MockFilePath_Resolve_OngoingVerification (line 190) | type MockFilePath_Resolve_OngoingVerification struct
    method GetCapturedArguments (line 195) | func (c *MockFilePath_Resolve_OngoingVerification) GetCapturedArgument...
    method GetAllCapturedArguments (line 198) | func (c *MockFilePath_Resolve_OngoingVerification) GetAllCapturedArgum...
  type MockFilePath_Symlink_OngoingVerification (line 207) | type MockFilePath_Symlink_OngoingVerification struct
    method GetCapturedArguments (line 212) | func (c *MockFilePath_Symlink_OngoingVerification) GetCapturedArgument...
    method GetAllCapturedArguments (line 217) | func (c *MockFilePath_Symlink_OngoingVerification) GetAllCapturedArgum...

FILE: server/core/runtime/models/shell_command_runner.go
  constant BufioScannerBufferSize (line 22) | BufioScannerBufferSize = 10 * 1024 * 1024
  type Line (line 25) | type Line struct
  type ShellCommandRunner (line 34) | type ShellCommandRunner struct
    method Run (line 74) | func (s *ShellCommandRunner) Run(ctx command.ProjectContext) (string, ...
    method RunCommandAsync (line 99) | func (s *ShellCommandRunner) RunCommandAsync(ctx command.ProjectContex...
  function NewShellCommandRunner (line 43) | func NewShellCommandRunner(

FILE: server/core/runtime/models/shell_command_runner_test.go
  function TestShellCommandRunner_Run (line 20) | func TestShellCommandRunner_Run(t *testing.T) {

FILE: server/core/runtime/multienv_step_runner.go
  type MultiEnvStepRunner (line 17) | type MultiEnvStepRunner struct
    method Run (line 23) | func (r *MultiEnvStepRunner) Run(
  function parseMultienvLine (line 70) | func parseMultienvLine(in string) ([]string, error) {
  function unescape (line 153) | func unescape(s string, escaped bool) string {

FILE: server/core/runtime/multienv_step_runner_internal_test.go
  function TestMultiEnvStepRunner_Run_parser (line 11) | func TestMultiEnvStepRunner_Run_parser(t *testing.T) {

FILE: server/core/runtime/multienv_step_runner_test.go
  function TestMultiEnvStepRunner_Run (line 23) | func TestMultiEnvStepRunner_Run(t *testing.T) {

FILE: server/core/runtime/plan_step_runner.go
  constant defaultWorkspace (line 20) | defaultWorkspace = "default"
  constant refreshKeyword (line 21) | refreshKeyword   = "Refreshing state..."
  constant refreshSeparator (line 22) | refreshSeparator = "----------------------------------------------------...
  type planStepRunner (line 31) | type planStepRunner struct
    method Run (line 50) | func (p *planStepRunner) Run(ctx command.ProjectContext, extraArgs []s...
    method isRemoteOpsErr (line 75) | func (p *planStepRunner) isRemoteOpsErr(output string, err error) bool {
    method remotePlan (line 84) | func (p *planStepRunner) remotePlan(ctx command.ProjectContext, extraA...
    method buildPlanCmd (line 116) | func (p *planStepRunner) buildPlanCmd(ctx command.ProjectContext, extr...
    method tfVars (line 150) | func (p *planStepRunner) tfVars(ctx command.ProjectContext, tfVersion ...
    method flatten (line 173) | func (p *planStepRunner) flatten(slices [][]string) []string {
    method fmtPlanOutput (line 187) | func (p *planStepRunner) fmtPlanOutput(output string, tfVersion *versi...
    method runRemotePlan (line 201) | func (p *planStepRunner) runRemotePlan(
  function NewPlanStepRunner (line 39) | func NewPlanStepRunner(terraformExecutor TerraformExec, defaultTfDistrib...
  function StripRefreshingFromPlanOutput (line 253) | func StripRefreshingFromPlanOutput(output string, tfVersion *version.Ver...
  function FilterRegexFromPlanOutput (line 278) | func FilterRegexFromPlanOutput(output string, filterRegex *regexp.Regexp...

FILE: server/core/runtime/plan_step_runner_test.go
  function TestRun_AddsEnvVarFile (line 30) | func TestRun_AddsEnvVarFile(t *testing.T) {
  function TestRun_UsesDiffPathForProject (line 100) | func TestRun_UsesDiffPathForProject(t *testing.T) {
  function TestRun_PlanFmt (line 158) | func TestRun_PlanFmt(t *testing.T) {
  function TestRun_OutputOnErr (line 237) | func TestRun_OutputOnErr(t *testing.T) {
  function TestRun_NoOptionalVarsIn012 (line 275) | func TestRun_NoOptionalVarsIn012(t *testing.T) {
  function TestRun_RemoteOps (line 348) | func TestRun_RemoteOps(t *testing.T) {
  function TestStripRefreshingFromPlanOutput (line 497) | func TestStripRefreshingFromPlanOutput(t *testing.T) {
  function TestPlanStepRunner_TestRun_UsesConfiguredDistribution (line 561) | func TestPlanStepRunner_TestRun_UsesConfiguredDistribution(t *testing.T) {
  function TestFilterRegexFromPlanOutput (line 637) | func TestFilterRegexFromPlanOutput(t *testing.T) {
  type remotePlanMock (line 675) | type remotePlanMock struct
    method RunCommandAsync (line 682) | func (r *remotePlanMock) RunCommandAsync(_ command.ProjectContext, _ s...
  function stringSliceEquals (line 696) | func stringSliceEquals(a, b []string) bool {

FILE: server/core/runtime/plan_type_step_runner_delegate.go
  function NewPlanTypeStepRunnerDelegate (line 14) | func NewPlanTypeStepRunnerDelegate(defaultRunner Runner, remotePlanRunne...
  type planTypeStepRunnerDelegate (line 22) | type planTypeStepRunnerDelegate struct
    method isRemotePlan (line 27) | func (p *planTypeStepRunnerDelegate) isRemotePlan(planFile string) (bo...
    method Run (line 37) | func (p *planTypeStepRunnerDelegate) Run(ctx command.ProjectContext, e...

FILE: server/core/runtime/plan_type_step_runner_delegate_test.go
  function TestRunDelegate (line 32) | func TestRunDelegate(t *testing.T) {
  function TestRunDelegate_UsesConfiguredDistribution (line 172) | func TestRunDelegate_UsesConfiguredDistribution(t *testing.T) {

FILE: server/core/runtime/policy/conftest_client.go
  constant DefaultConftestVersionEnvKey (line 31) | DefaultConftestVersionEnvKey = "DEFAULT_CONFTEST_VERSION"
  constant conftestBinaryName (line 32) | conftestBinaryName           = "conftest"
  constant conftestDownloadURLPrefix (line 33) | conftestDownloadURLPrefix    = "https://github.com/open-policy-agent/con...
  type Arg (line 36) | type Arg struct
    method build (line 41) | func (a Arg) build() []string {
  function NewPolicyArg (line 45) | func NewPolicyArg(parameter string) Arg {
  type ConftestTestCommandArgs (line 52) | type ConftestTestCommandArgs struct
    method build (line 59) | func (c ConftestTestCommandArgs) build() ([]string, error) {
  type SourceResolver (line 84) | type SourceResolver interface
  type LocalSourceResolver (line 89) | type LocalSourceResolver struct
    method Resolve (line 92) | func (p *LocalSourceResolver) Resolve(policySet valid.PolicySet) (stri...
  type SourceResolverProxy (line 98) | type SourceResolverProxy struct
    method Resolve (line 102) | func (p *SourceResolverProxy) Resolve(policySet valid.PolicySet) (stri...
  type Downloader (line 113) | type Downloader interface
  type ConfTestGoGetterVersionDownloader (line 117) | type ConfTestGoGetterVersionDownloader struct
    method GetAny (line 119) | func (c ConfTestGoGetterVersionDownloader) GetAny(dst, src string) err...
  type ConfTestVersionDownloader (line 124) | type ConfTestVersionDownloader struct
    method downloadConfTestVersion (line 128) | func (c ConfTestVersionDownloader) downloadConfTestVersion(v *version....
  type ConfTestExecutorWorkflow (line 156) | type ConfTestExecutorWorkflow struct
    method Run (line 190) | func (c *ConfTestExecutorWorkflow) Run(ctx command.ProjectContext, exe...
    method sanitizeOutput (line 262) | func (c *ConfTestExecutorWorkflow) sanitizeOutput(inputFile string, ou...
    method EnsureExecutorVersion (line 266) | func (c *ConfTestExecutorWorkflow) EnsureExecutorVersion(log logging.S...
  function NewConfTestExecutorWorkflow (line 163) | func NewConfTestExecutorWorkflow(log logging.SimpleLogging, versionRootD...
  function getDefaultVersion (line 295) | func getDefaultVersion() (*version.Version, error) {
  function isValidConftestOutput (line 313) | func isValidConftestOutput(output string) bool {
  function hasFailures (line 323) | func hasFailures(output string) bool {
  function getPlatform (line 331) | func getPlatform() string {

FILE: server/core/runtime/policy/conftest_client_test.go
  function TestConfTestVersionDownloader (line 23) | func TestConfTestVersionDownloader(t *testing.T) {
  function TestEnsureExecutorVersion (line 58) | func TestEnsureExecutorVersion(t *testing.T) {
  function TestRun (line 140) | func TestRun(t *testing.T) {

FILE: server/core/runtime/policy/mocks/mock_conftest_client.go
  type MockSourceResolver (line 13) | type MockSourceResolver struct
    method SetFailHandler (line 25) | func (mock *MockSourceResolver) SetFailHandler(fh pegomock.FailHandler...
    method FailHandler (line 26) | func (mock *MockSourceResolver) FailHandler() pegomock.FailHandler    ...
    method Resolve (line 28) | func (mock *MockSourceResolver) Resolve(policySet valid.PolicySet) (st...
    method VerifyWasCalledOnce (line 47) | func (mock *MockSourceResolver) VerifyWasCalledOnce() *VerifierMockSou...
    method VerifyWasCalled (line 54) | func (mock *MockSourceResolver) VerifyWasCalled(invocationCountMatcher...
    method VerifyWasCalledInOrder (line 61) | func (mock *MockSourceResolver) VerifyWasCalledInOrder(invocationCount...
    method VerifyWasCalledEventually (line 69) | func (mock *MockSourceResolver) VerifyWasCalledEventually(invocationCo...
  function NewMockSourceResolver (line 17) | func NewMockSourceResolver(options ...pegomock.Option) *MockSourceResolv...
  type VerifierMockSourceResolver (line 77) | type VerifierMockSourceResolver struct
    method Resolve (line 84) | func (verifier *VerifierMockSourceResolver) Resolve(policySet valid.Po...
  type MockSourceResolver_Resolve_OngoingVerification (line 90) | type MockSourceResolver_Resolve_OngoingVerification struct
    method GetCapturedArguments (line 95) | func (c *MockSourceResolver_Resolve_OngoingVerification) GetCapturedAr...
    method GetAllCapturedArguments (line 100) | func (c *MockSourceResolver_Resolve_OngoingVerification) GetAllCapture...

FILE: server/core/runtime/policy/mocks/mock_downloader.go
  type MockDownloader (line 12) | type MockDownloader struct
    method SetFailHandler (line 24) | func (mock *MockDownloader) SetFailHandler(fh pegomock.FailHandler) { ...
    method FailHandler (line 25) | func (mock *MockDownloader) FailHandler() pegomock.FailHandler      { ...
    method GetAny (line 27) | func (mock *MockDownloader) GetAny(dst string, src string) error {
    method VerifyWasCalledOnce (line 42) | func (mock *MockDownloader) VerifyWasCalledOnce() *VerifierMockDownloa...
    method VerifyWasCalled (line 49) | func (mock *MockDownloader) VerifyWasCalled(invocationCountMatcher peg...
    method VerifyWasCalledInOrder (line 56) | func (mock *MockDownloader) VerifyWasCalledInOrder(invocationCountMatc...
    method VerifyWasCalledEventually (line 64) | func (mock *MockDownloader) VerifyWasCalledEventually(invocationCountM...
  function NewMockDownloader (line 16) | func NewMockDownloader(options ...pegomock.Option) *MockDownloader {
  type VerifierMockDownloader (line 72) | type VerifierMockDownloader struct
    method GetAny (line 79) | func (verifier *VerifierMockDownloader) GetAny(dst string, src string)...
  type MockDownloader_GetAny_OngoingVerification (line 85) | type MockDownloader_GetAny_OngoingVerification struct
    method GetCapturedArguments (line 90) | func (c *MockDownloader_GetAny_OngoingVerification) GetCapturedArgumen...
    method GetAllCapturedArguments (line 95) | func (c *MockDownloader_GetAny_OngoingVerification) GetAllCapturedArgu...

FILE: server/core/runtime/policy_check_step_runner.go
  type policyCheckStepRunner (line 15) | type policyCheckStepRunner struct
    method Run (line 32) | func (p *policyCheckStepRunner) Run(ctx command.ProjectContext, extraA...
  function NewPolicyCheckStepRunner (line 21) | func NewPolicyCheckStepRunner(defaultTfDistribution terraform.Distributi...

FILE: server/core/runtime/policy_check_step_runner_test.go
  function TestRun (line 20) | func TestRun(t *testing.T) {

FILE: server/core/runtime/post_workflow_hook_runner.go
  type PostWorkflowHookRunner (line 18) | type PostWorkflowHookRunner interface
  type DefaultPostWorkflowHookRunner (line 22) | type DefaultPostWorkflowHookRunner struct
    method Run (line 26) | func (wh DefaultPostWorkflowHookRunner) Run(ctx models.WorkflowHookCom...

FILE: server/core/runtime/post_workflow_hook_runner_test.go
  function TestPostWorkflowHookRunner_Run (line 22) | func TestPostWorkflowHookRunner_Run(t *testing.T) {

FILE: server/core/runtime/pre_workflow_hook_runner.go
  type PreWorkflowHookRunner (line 18) | type PreWorkflowHookRunner interface
  type DefaultPreWorkflowHookRunner (line 22) | type DefaultPreWorkflowHookRunner struct
    method Run (line 26) | func (wh DefaultPreWorkflowHookRunner) Run(ctx models.WorkflowHookComm...

FILE: server/core/runtime/pre_workflow_hook_runner_test.go
  function commandNotFoundErrorFormat (line 23) | func commandNotFoundErrorFormat(shell string) string {
  function unterminatedStringError (line 33) | func unterminatedStringError(shell, shellArgs string) string {
  function TestPreWorkflowHookRunner_Run (line 42) | func TestPreWorkflowHookRunner_Run(t *testing.T) {

FILE: server/core/runtime/pull_approved_checker.go
  type PullApprovedChecker (line 13) | type PullApprovedChecker interface

FILE: server/core/runtime/run_step_runner.go
  type RunStepRunner (line 23) | type RunStepRunner struct
    method Run (line 32) | func (r *RunStepRunner) Run(

FILE: server/core/runtime/run_step_runner_test.go
  function TestRunStepRunner_Run (line 27) | func TestRunStepRunner_Run(t *testing.T) {

FILE: server/core/runtime/runtime.go
  constant lineBeforeRunURL (line 25) | lineBeforeRunURL     = "To view this run in a browser, visit:"
  constant planfileSlashReplace (line 26) | planfileSlashReplace = "::"
  type TerraformExec (line 31) | type TerraformExec interface
  type AsyncTFExec (line 42) | type AsyncTFExec interface
  type StatusUpdater (line 56) | type StatusUpdater interface
  type Runner (line 63) | type Runner interface
  type NullRunner (line 68) | type NullRunner struct
    method Run (line 70) | func (p NullRunner) Run(ctx command.ProjectContext, _ []string, _ stri...
  type RemoteBackendUnsupportedRunner (line 76) | type RemoteBackendUnsupportedRunner struct
    method Run (line 78) | func (p RemoteBackendUnsupportedRunner) Run(ctx command.ProjectContext...
  function MustConstraint (line 84) | func MustConstraint(constraint string) version.Constraints {
  function GetPlanFilename (line 94) | func GetPlanFilename(workspace string, projName string) string {
  function IsRemotePlan (line 104) | func IsRemotePlan(planContents []byte) bool {
  function ProjectNameFromPlanfile (line 114) | func ProjectNameFromPlanfile(workspace string, filename string) (string,...

FILE: server/core/runtime/runtime_test.go
  function TestGetPlanFilename (line 14) | func TestGetPlanFilename(t *testing.T) {
  function TestProjectNameFromPlanfile (line 63) | func TestProjectNameFromPlanfile(t *testing.T) {

FILE: server/core/runtime/show_step_runner.go
  constant minimumShowTfVersion (line 16) | minimumShowTfVersion string = "0.12.0"
  function NewShowStepRunner (line 18) | func NewShowStepRunner(executor TerraformExec, defaultTfDistribution ter...
  type showStepRunner (line 30) | type showStepRunner struct
    method Run (line 36) | func (p *showStepRunner) Run(ctx command.ProjectContext, _ []string, p...

FILE: server/core/runtime/show_step_runner_test.go
  function TestShowStepRunnner (line 23) | func TestShowStepRunnner(t *testing.T) {

FILE: server/core/runtime/state_rm_step_runner.go
  type stateRmStepRunner (line 16) | type stateRmStepRunner struct
    method Run (line 31) | func (p *stateRmStepRunner) Run(ctx command.ProjectContext, extraArgs ...
  function NewStateRmStepRunner (line 22) | func NewStateRmStepRunner(terraformExecutor TerraformExec, defaultTfDist...

FILE: server/core/runtime/state_rm_step_runner_test.go
  function TestStateRmStepRunner_Run_Success (line 22) | func TestStateRmStepRunner_Run_Success(t *testing.T) {
  function TestStateRmStepRunner_Run_Workspace (line 54) | func TestStateRmStepRunner_Run_Workspace(t *testing.T) {
  function TestStateRmStepRunner_Run_UsesConfiguredDistribution (line 93) | func TestStateRmStepRunner_Run_UsesConfiguredDistribution(t *testing.T) {

FILE: server/core/runtime/version_step_runner.go
  type VersionStepRunner (line 15) | type VersionStepRunner struct
    method Run (line 22) | func (v *VersionStepRunner) Run(ctx command.ProjectContext, _ []string...

FILE: server/core/runtime/version_step_runner_test.go
  function TestRunVersionStep (line 20) | func TestRunVersionStep(t *testing.T) {
  function TestVersionStepRunner_Run_UsesConfiguredDistribution (line 60) | func TestVersionStepRunner_Run_UsesConfiguredDistribution(t *testing.T) {

FILE: server/core/runtime/workspace_step_runner_delegate.go
  type workspaceStepRunnerDelegate (line 16) | type workspaceStepRunnerDelegate struct
    method Run (line 32) | func (r *workspaceStepRunnerDelegate) Run(ctx command.ProjectContext, ...
    method switchWorkspace (line 53) | func (r *workspaceStepRunnerDelegate) switchWorkspace(ctx command.Proj...
  function NewWorkspaceStepRunnerDelegate (line 23) | func NewWorkspaceStepRunnerDelegate(terraformExecutor TerraformExec, def...

FILE: server/core/runtime/workspace_step_runner_delegate_test.go
  function TestRun_NoWorkspaceIn08 (line 21) | func TestRun_NoWorkspaceIn08(t *testing.T) {
  function TestRun_ErrWorkspaceIn08 (line 60) | func TestRun_ErrWorkspaceIn08(t *testing.T) {
  function TestRun_SwitchesWorkspace (line 79) | func TestRun_SwitchesWorkspace(t *testing.T) {
  function TestRun_SwitchesWorkspaceDistribution (line 134) | func TestRun_SwitchesWorkspaceDistribution(t *testing.T) {
  function TestRun_CreatesWorkspace (line 195) | func TestRun_CreatesWorkspace(t *testing.T) {
  function TestRun_NoWorkspaceSwitchIfNotNecessary (line 261) | func TestRun_NoWorkspaceSwitchIfNotNecessary(t *testing.T) {

FILE: server/core/terraform/ansi/strip.go
  constant ansi (line 10) | ansi = "[\u001B\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)...
  function Strip (line 14) | func Strip(str string) string {

FILE: server/core/terraform/ansi/strip_test.go
  function TestStrip (line 8) | func TestStrip(t *testing.T) {

FILE: server/core/terraform/distribution.go
  type Distribution (line 17) | type Distribution interface
  function NewDistribution (line 24) | func NewDistribution(distribution string) Distribution {
  type DistributionOpenTofu (line 32) | type DistributionOpenTofu struct
    method BinName (line 48) | func (*DistributionOpenTofu) BinName() string {
    method Downloader (line 52) | func (d *DistributionOpenTofu) Downloader() Downloader {
    method ResolveConstraint (line 56) | func (*DistributionOpenTofu) ResolveConstraint(ctx context.Context, co...
  function NewDistributionOpenTofu (line 36) | func NewDistributionOpenTofu() Distribution {
  function NewDistributionOpenTofuWithDownloader (line 42) | func NewDistributionOpenTofuWithDownloader(downloader Downloader) Distri...
  type DistributionTerraform (line 96) | type DistributionTerraform struct
    method BinName (line 112) | func (*DistributionTerraform) BinName() string {
    method Downloader (line 116) | func (d *DistributionTerraform) Downloader() Downloader {
    method ResolveConstraint (line 120) | func (*DistributionTerraform) ResolveConstraint(ctx context.Context, c...
  function NewDistributionTerraform (line 100) | func NewDistributionTerraform() Distribution {
  function NewDistributionTerraformWithDownloader (line 106) | func NewDistributionTerraformWithDownloader(downloader Downloader) Distr...

FILE: server/core/terraform/distribution_test.go
  function TestOpenTofuBinName (line 14) | func TestOpenTofuBinName(t *testing.T) {
  function TestResolveOpenTofuVersions (line 19) | func TestResolveOpenTofuVersions(t *testing.T) {
  function TestTerraformBinName (line 26) | func TestTerraformBinName(t *testing.T) {
  function TestResolveTerraformVersions (line 31) | func TestResolveTerraformVersions(t *testing.T) {

FILE: server/core/terraform/downloader.go
  type Downloader (line 22) | type Downloader interface
  type TofuDownloader (line 26) | type TofuDownloader struct
    method Install (line 28) | func (d *TofuDownloader) Install(ctx context.Context, dir string, _dow...
  type TerraformDownloader (line 49) | type TerraformDownloader struct
    method Install (line 51) | func (d *TerraformDownloader) Install(ctx context.Context, dir string,...

FILE: server/core/terraform/downloader_test.go
  function TestTerraformInstall (line 17) | func TestTerraformInstall(t *testing.T) {
  function TestOpenTofuInstall (line 34) | func TestOpenTofuInstall(t *testing.T) {

FILE: server/core/terraform/mocks/mock_downloader.go
  type MockDownloader (line 14) | type MockDownloader struct
    method SetFailHandler (line 26) | func (mock *MockDownloader) SetFailHandler(fh pegomock.FailHandler) { ...
    method FailHandler (line 27) | func (mock *MockDownloader) FailHandler() pegomock.FailHandler      { ...
    method Install (line 29) | func (mock *MockDownloader) Install(ctx context.Context, dir string, d...
    method VerifyWasCalledOnce (line 48) | func (mock *MockDownloader) VerifyWasCalledOnce() *VerifierMockDownloa...
    method VerifyWasCalled (line 55) | func (mock *MockDownloader) VerifyWasCalled(invocationCountMatcher peg...
    method VerifyWasCalledInOrder (line 62) | func (mock *MockDownloader) VerifyWasCalledInOrder(invocationCountMatc...
    method VerifyWasCalledEventually (line 70) | func (mock *MockDownloader) VerifyWasCalledEventually(invocationCountM...
  function NewMockDownloader (line 18) | func NewMockDownloader(options ...pegomock.Option) *MockDownloader {
  type VerifierMockDownloader (line 78) | type VerifierMockDownloader struct
    method Install (line 85) | func (verifier *VerifierMockDownloader) Install(ctx context.Context, d...
  type MockDownloader_Install_OngoingVerification (line 91) | type MockDownloader_Install_OngoingVerification struct
    method GetCapturedArguments (line 96) | func (c *MockDownloader_Install_OngoingVerification) GetCapturedArgume...
    method GetAllCapturedArguments (line 101) | func (c *MockDownloader_Install_OngoingVerification) GetAllCapturedArg...

FILE: server/core/terraform/tfclient/mocks/mock_terraform_client.go
  type MockClient (line 16) | type MockClient struct
    method SetFailHandler (line 28) | func (mock *MockClient) SetFailHandler(fh pegomock.FailHandler) { mock...
    method FailHandler (line 29) | func (mock *MockClient) FailHandler() pegomock.FailHandler      { retu...
    method DetectVersion (line 31) | func (mock *MockClient) DetectVersion(log logging.SimpleLogging, proje...
    method EnsureVersion (line 46) | func (mock *MockClient) EnsureVersion(log logging.SimpleLogging, d ter...
    method RunCommandWithVersion (line 61) | func (mock *MockClient) RunCommandWithVersion(ctx command.ProjectConte...
    method VerifyWasCalledOnce (line 80) | func (mock *MockClient) VerifyWasCalledOnce() *VerifierMockClient {
    method VerifyWasCalled (line 87) | func (mock *MockClient) VerifyWasCalled(invocationCountMatcher pegomoc...
    method VerifyWasCalledInOrder (line 94) | func (mock *MockClient) VerifyWasCalledInOrder(invocationCountMatcher ...
    method VerifyWasCalledEventually (line 102) | func (mock *MockClient) VerifyWasCalledEventually(invocationCountMatch...
  function NewMockClient (line 20) | func NewMockClient(options ...pegomock.Option) *MockClient {
  type VerifierMockClient (line 110) | type VerifierMockClient struct
    method DetectVersion (line 117) | func (verifier *VerifierMockClient) DetectVersion(log logging.SimpleLo...
    method EnsureVersion (line 152) | func (verifier *VerifierMockClient) EnsureVersion(log logging.SimpleLo...
    method RunCommandWithVersion (line 193) | func (verifier *VerifierMockClient) RunCommandWithVersion(ctx command....
  type MockClient_DetectVersion_OngoingVerification (line 123) | type MockClient_DetectVersion_OngoingVerification struct
    method GetCapturedArguments (line 128) | func (c *MockClient_DetectVersion_OngoingVerification) GetCapturedArgu...
    method GetAllCapturedArguments (line 133) | func (c *MockClient_DetectVersion_OngoingVerification) GetAllCapturedA...
  type MockClient_EnsureVersion_OngoingVerification (line 158) | type MockClient_EnsureVersion_OngoingVerification struct
    method GetCapturedArguments (line 163) | func (c *MockClient_EnsureVersion_OngoingVerification) GetCapturedArgu...
    method GetAllCapturedArguments (line 168) | func (c *MockClient_EnsureVersion_OngoingVerification) GetAllCapturedA...
  type MockClient_RunCommandWithVersion_OngoingVerification (line 199) | type MockClient_RunCommandWithVersion_OngoingVerification struct
    method GetCapturedArguments (line 204) | func (c *MockClient_RunCommandWithVersion_OngoingVerification) GetCapt...
    method GetAllCapturedArguments (line 209) | func (c *MockClient_RunCommandWithVersion_OngoingVerification) GetAllC...

FILE: server/core/terraform/tfclient/terraform_client.go
  type Client (line 46) | type Client interface
  type DefaultClient (line 59) | type DefaultClient struct
    method DefaultDistribution (line 259) | func (c *DefaultClient) DefaultDistribution() terraform.Distribution {
    method DefaultVersion (line 265) | func (c *DefaultClient) DefaultVersion() *version.Version {
    method TerraformBinDir (line 270) | func (c *DefaultClient) TerraformBinDir() string {
    method ExtractExactRegex (line 278) | func (c *DefaultClient) ExtractExactRegex(log logging.SimpleLogging, v...
    method DetectVersion (line 294) | func (c *DefaultClient) DetectVersion(log logging.SimpleLogging, proje...
    method EnsureVersion (line 333) | func (c *DefaultClient) EnsureVersion(log logging.SimpleLogging, d ter...
    method RunCommandWithVersion (line 350) | func (c *DefaultClient) RunCommandWithVersion(ctx command.ProjectConte...
    method prepExecCmd (line 395) | func (c *DefaultClient) prepExecCmd(log logging.SimpleLogging, d terra...
    method prepCmd (line 408) | func (c *DefaultClient) prepCmd(log logging.SimpleLogging, d terraform...
    method RunCommandAsync (line 454) | func (c *DefaultClient) RunCommandAsync(ctx command.ProjectContext, pa...
  function NewClientWithDefaultVersion (line 103) | func NewClientWithDefaultVersion(
  function NewTestClient (line 190) | func NewTestClient(
  function NewClient (line 228) | func NewClient(
  function MustConstraint (line 482) | func MustConstraint(v string) version.Constraints {
  function ensureVersion (line 492) | func ensureVersion(
  function generateRCFile (line 548) | func generateRCFile(tfeToken string, tfeHostname string, home string) er...
  function isAsyncEligibleCommand (line 575) | func isAsyncEligibleCommand(cmd string) bool {
  function getVersion (line 584) | func getVersion(tfBinary string, binName string) (*version.Version, erro...

FILE: server/core/terraform/tfclient/terraform_client_internal_test.go
  function TestGenerateRCFile_WritesFile (line 27) | func TestGenerateRCFile_WritesFile(t *testing.T) {
  function TestGenerateRCFile_WillNotOverwrite (line 43) | func TestGenerateRCFile_WillNotOverwrite(t *testing.T) {
  function TestGenerateRCFile_NoErrIfContentsSame (line 57) | func TestGenerateRCFile_NoErrIfContentsSame(t *testing.T) {
  function TestGenerateRCFile_ErrIfCannotRead (line 73) | func TestGenerateRCFile_ErrIfCannotRead(t *testing.T) {
  function TestGenerateRCFile_ErrIfCannotWrite (line 86) | func TestGenerateRCFile_ErrIfCannotWrite(t *testing.T) {
  function TestDefaultClient_RunCommandWithVersion_EnvVars (line 94) | func TestDefaultClient_RunCommandWithVersion_EnvVars(t *testing.T) {
  function TestDefaultClient_RunCommandWithVersion_Error (line 137) | func TestDefaultClient_RunCommandWithVersion_Error(t *testing.T) {
  function TestDefaultClient_RunCommandAsync_Success (line 181) | func TestDefaultClient_RunCommandAsync_Success(t *testing.T) {
  function TestDefaultClient_RunCommandAsync_BigOutput (line 233) | func TestDefaultClient_RunCommandAsync_BigOutput(t *testing.T) {
  function TestDefaultClient_RunCommandAsync_StderrOutput (line 286) | func TestDefaultClient_RunCommandAsync_StderrOutput(t *testing.T) {
  function TestDefaultClient_RunCommandAsync_ExitOne (line 328) | func TestDefaultClient_RunCommandAsync_ExitOne(t *testing.T) {
  function TestDefaultClient_RunCommandAsync_Input (line 371) | func TestDefaultClient_RunCommandAsync_Input(t *testing.T) {
  function waitCh (line 415) | func waitCh(ch <-chan runtimemodels.Line) (string, error) {

FILE: server/core/terraform/tfclient/terraform_client_test.go
  function TestMustConstraint_PanicsOnBadConstraint (line 38) | func TestMustConstraint_PanicsOnBadConstraint(t *testing.T) {
  function TestMustConstraint (line 49) | func TestMustConstraint(t *testing.T) {
  function TestNewClient_LocalTFOnly (line 59) | func TestNewClient_LocalTFOnly(t *testing.T) {
  function TestNewClient_LocalTFMatchesFlag (line 97) | func TestNewClient_LocalTFMatchesFlag(t *testing.T) {
  function TestNewClient_NoTF (line 134) | func TestNewClient_NoTF(t *testing.T) {
  function TestNewClient_DefaultTFFlagInPath (line 151) | func TestNewClient_DefaultTFFlagInPath(t *testing.T) {
  function TestNewClient_DefaultTFFlagInBinDir (line 184) | func TestNewClient_DefaultTFFlagInBinDir(t *testing.T) {
  function TestNewClient_DefaultTFFlagDownload (line 214) | func TestNewClient_DefaultTFFlagDownload(t *testing.T) {
  function TestNewClient_BadVersion (line 253) | func TestNewClient_BadVersion(t *testing.T) {
  function TestRunCommandWithVersion_DLsTF (line 264) | func TestRunCommandWithVersion_DLsTF(t *testing.T) {
  function TestEnsureVersion_downloaded (line 298) | func TestEnsureVersion_downloaded(t *testing.T) {
  function TestEnsureVersion_downloaded_customURL (line 330) | func TestEnsureVersion_downloaded_customURL(t *testing.T) {
  function TestEnsureVersion_downloaded_downloadingDisabled (line 363) | func TestEnsureVersion_downloaded_downloadingDisabled(t *testing.T) {
  function tempSetEnv (line 389) | func tempSetEnv(t *testing.T, key string, value string) func() {
  function mkSubDirs (line 396) | func mkSubDirs(t *testing.T) (string, string, string) {
  function TestDefaultProjectCommandBuilder_TerraformVersion (line 410) | func TestDefaultProjectCommandBuilder_TerraformVersion(t *testing.T) {
  function TestExtractExactRegex (line 544) | func TestExtractExactRegex(t *testing.T) {

FILE: server/events/apply_command_runner.go
  function NewApplyCommandRunner (line 14) | func NewApplyCommandRunner(
  type ApplyCommandRunner (line 50) | type ApplyCommandRunner struct
    method Run (line 73) | func (a *ApplyCommandRunner) Run(ctx *command.Context, cmd *CommentCom...
    method IsLocked (line 184) | func (a *ApplyCommandRunner) IsLocked() (bool, error) {
    method isParallelEnabled (line 190) | func (a *ApplyCommandRunner) isParallelEnabled(projectCmds []command.P...
    method updateCommitStatus (line 194) | func (a *ApplyCommandRunner) updateCommitStatus(ctx *command.Context, ...

FILE: server/events/apply_command_runner_test.go
  function TestApplyCommandRunner_IsLocked (line 24) | func TestApplyCommandRunner_IsLocked(t *testing.T) {
  function TestApplyCommandRunner_IsSilenced (line 87) | func TestApplyCommandRunner_IsSilenced(t *testing.T) {
  function TestApplyCommandRunner_ExecutionOrder (line 231) | func TestApplyCommandRunner_ExecutionOrder(t *testing.T) {

FILE: server/events/approve_policies_command_runner.go
  function NewApprovePoliciesCommandRunner (line 12) | func NewApprovePoliciesCommandRunner(
  type ApprovePoliciesCommandRunner (line 34) | type ApprovePoliciesCommandRunner struct
    method Run (line 47) | func (a *ApprovePoliciesCommandRunner) Run(ctx *command.Context, cmd *...
    method updateCommitStatus (line 95) | func (a *ApprovePoliciesCommandRunner) updateCommitStatus(ctx *command...

FILE: server/events/automerger.go
  type AutoMerger (line 14) | type AutoMerger struct
    method automerge (line 19) | func (c *AutoMerger) automerge(ctx *command.Context, pullStatus models...
    method automergeEnabled (line 52) | func (c *AutoMerger) automergeEnabled(projectCmds []command.ProjectCon...
    method deleteSourceBranchOnMergeEnabled (line 62) | func (c *AutoMerger) deleteSourceBranchOnMergeEnabled(projectCmds []co...

FILE: server/events/cancel_command_runner.go
  constant cancelComment (line 8) | cancelComment = "Cancelled all queued operations and released working di...
  function NewCancelCommandRunner (line 11) | func NewCancelCommandRunner(
  type CancelCommandRunner (line 27) | type CancelCommandRunner struct
    method Run (line 35) | func (c *CancelCommandRunner) Run(ctx *command.Context, cmd *CommentCo...

FILE: server/events/cancellation_tracker.go
  type CancellationTracker (line 11) | type CancellationTracker interface
  type DefaultCancellationTracker (line 17) | type DefaultCancellationTracker struct
    method Cancel (line 29) | func (p *DefaultCancellationTracker) Cancel(pull models.PullRequest) {
    method IsCancelled (line 38) | func (p *DefaultCancellationTracker) IsCancelled(pull models.PullReque...
    method Clear (line 46) | func (p *DefaultCancellationTracker) Clear(pull models.PullRequest) {
  function NewCancellationTracker (line 22) | func NewCancellationTracker() *DefaultCancellationTracker {
  function pullKey (line 52) | func pullKey(pull models.PullRequest) string {

FILE: server/events/command/context.go
  type Trigger (line 13) | type Trigger
  constant AutoTrigger (line 17) | AutoTrigger Trigger = iota
  constant CommentTrigger (line 20) | CommentTrigger
  type Context (line 25) | type Context struct

FILE: server/events/command/lock.go
  type LockMetadata (line 11) | type LockMetadata struct
  type Lock (line 17) | type Lock struct
    method LockTime (line 23) | func (l *Lock) LockTime() time.Time {
    method IsLocked (line 27) | func (l *Lock) IsLocked() bool {

FILE: server/events/command/name.go
  type Name (line 15) | type Name
    method TitleString (line 60) | func (c Name) TitleString() string {
    method String (line 65) | func (c Name) String() string {
    method DefaultUsage (line 90) | func (c Name) DefaultUsage() string {
    method SubCommands (line 102) | func (c Name) SubCommands() []string {
    method CommandArgCount (line 112) | func (c Name) CommandArgCount(subCommand string) (*ArgCount, error) {
  constant Apply (line 19) | Apply Name = iota
  constant Plan (line 21) | Plan
  constant Unlock (line 23) | Unlock
  constant PolicyCheck (line 25) | PolicyCheck
  constant ApprovePolicies (line 27) | ApprovePolicies
  constant Autoplan (line 29) | Autoplan
  constant Version (line 31) | Version
  constant Import (line 33) | Import
  constant State (line 35) | State
  constant Cancel (line 37) | Cancel
  type ArgCount (line 41) | type ArgCount struct
    method IsMatchCount (line 127) | func (a ArgCount) IsMatchCount(count int) bool {
  function ParseCommandName (line 142) | func ParseCommandName(name string) (Name, error) {

FILE: server/events/command/name_test.go
  function TestName_TitleString (line 17) | func TestName_TitleString(t *testing.T) {
  function TestName_String (line 34) | func TestName_String(t *testing.T) {
  function TestName_DefaultUsage (line 57) | func TestName_DefaultUsage(t *testing.T) {
  function TestName_SubCommands (line 80) | func TestName_SubCommands(t *testing.T) {
  function TestName_CommandArgCount (line 103) | func TestName_CommandArgCount(t *testing.T) {
  function TestArgCount_IsMatchCount (line 134) | func TestArgCount_IsMatchCount(t *testing.T) {
  function TestParseCommandName (line 172) | func TestParseCommandName(t *testing.T) {

FILE: server/events/command/project_context.go
  constant planfileSlashReplace (line 19) | planfileSlashReplace = "::"
  type ProjectContext (line 24) | type ProjectContext struct
    method SetProjectScopeTags (line 143) | func (p ProjectContext) SetProjectScopeTags(scope tally.Scope) tally.S...
    method GetShowResultFileName (line 162) | func (p ProjectContext) GetShowResultFileName() string {
    method GetPolicyCheckResultFileName (line 171) | func (p ProjectContext) GetPolicyCheckResultFileName() string {
    method PullInfo (line 180) | func (p ProjectContext) PullInfo() string {
    method PolicyCleared (line 203) | func (p ProjectContext) PolicyCleared() bool {
  function buildPullInfo (line 187) | func buildPullInfo(repoName string, pullNum int, projectName string, rel...
  function getProjectIdentifier (line 192) | func getProjectIdentifier(relRepoDir string, projectName string) string {

FILE: server/events/command/project_context_test.go
  function TestPolicyCheckResults_PolicyFuncs (line 16) | func TestPolicyCheckResults_PolicyFuncs(t *testing.T) {

FILE: server/events/command/project_result.go
  type ProjectResult (line 11) | type ProjectResult struct
    method CommitStatus (line 34) | func (p ProjectResult) CommitStatus() models.CommitStatus {
    method PolicyStatus (line 45) | func (p ProjectResult) PolicyStatus() []models.PolicySetStatus {
    method PlanStatus (line 61) | func (p ProjectResult) PlanStatus() models.ProjectPlanStatus {
    method IsSuccessful (line 93) | func (p ProjectResult) IsSuccessful() bool {
  type ProjectCommandOutput (line 22) | type ProjectCommandOutput struct

FILE: server/events/command/project_result_test.go
  function TestProjectResult_IsSuccessful (line 15) | func TestProjectResult_IsSuccessful(t *testing.T) {
  function TestProjectResult_PlanStatus (line 69) | func TestProjectResult_PlanStatus(t *testing.T) {
  function TestPlanSuccess_Summary (line 184) | func TestPlanSuccess_Summary(t *testing.T) {
  function BenchmarkPlanSuccess_Summary (line 285) | func BenchmarkPlanSuccess_Summary(b *testing.B) {

FILE: server/events/command/result.go
  type Result (line 7) | type Result struct
    method HasErrors (line 19) | func (c Result) HasErrors() bool {

FILE: server/events/command/result_test.go
  function TestCommandResult_HasErrors (line 15) | func TestCommandResult_HasErrors(t *testing.T) {

FILE: server/events/command/scope_tags.go
  type ProjectScopeTags (line 12) | type ProjectScopeTags struct
    method Loadtags (line 22) | func (s ProjectScopeTags) Loadtags() map[string]string {
  function toSnakeCase (line 35) | func toSnakeCase(str string) string {

FILE: server/events/command/team_allowlist_checker.go
  constant wildcard (line 13) | wildcard = "*"
  type mapOfStrings (line 16) | type mapOfStrings
  type TeamAllowlistChecker (line 18) | type TeamAllowlistChecker interface
  type DefaultTeamAllowlistChecker (line 34) | type DefaultTeamAllowlistChecker struct
    method HasRules (line 56) | func (checker *DefaultTeamAllowlistChecker) HasRules() bool {
    method IsCommandAllowedForTeam (line 62) | func (checker *DefaultTeamAllowlistChecker) IsCommandAllowedForTeam(_ ...
    method IsCommandAllowedForAnyTeam (line 75) | func (checker *DefaultTeamAllowlistChecker) IsCommandAllowedForAnyTeam...
    method AllTeams (line 95) | func (checker *DefaultTeamAllowlistChecker) AllTeams() []string {
  function NewTeamAllowlistChecker (line 39) | func NewTeamAllowlistChecker(allowlist string) (*DefaultTeamAllowlistChe...

FILE: server/events/command/team_allowlist_checker_test.go
  function TestNewTeamAllowListChecker (line 15) | func TestNewTeamAllowListChecker(t *testing.T) {
  function TestNewTeamAllowListCheckerEmpty (line 21) | func TestNewTeamAllowListCheckerEmpty(t *testing.T) {
  function TestIsCommandAllowedForTeam (line 28) | func TestIsCommandAllowedForTeam(t *testing.T) {
  function TestIsCommandAllowedForAnyTeam (line 39) | func TestIsCommandAllowedForAnyTeam(t *testing.T) {

FILE: server/events/command_requirement_handler.go
  type CommandRequirementHandler (line 16) | type CommandRequirementHandler interface
  type DefaultCommandRequirementHandler (line 23) | type DefaultCommandRequirementHandler struct
    method ValidateProjectDependencies (line 27) | func (a *DefaultCommandRequirementHandler) ValidateProjectDependencies...
    method ValidatePlanProject (line 41) | func (a *DefaultCommandRequirementHandler) ValidatePlanProject(repoDir...
    method ValidateApplyProject (line 45) | func (a *DefaultCommandRequirementHandler) ValidateApplyProject(repoDi...
    method ValidateImportProject (line 49) | func (a *DefaultCommandRequirementHandler) ValidateImportProject(repoD...
    method validateCommandRequirement (line 53) | func (a *DefaultCommandRequirementHandler) validateCommandRequirement(...

FILE: server/events/command_requirement_handler_test.go
  function TestAggregateApplyRequirements_ValidatePlanProject (line 22) | func TestAggregateApplyRequirements_ValidatePlanProject(t *testing.T) {
  function TestAggregateApplyRequirements_ValidateApplyProject (line 122) | func TestAggregateApplyRequirements_ValidateApplyProject(t *testing.T) {
  function TestRequirements_ValidateProjectDependencies (line 232) | func TestRequirements_ValidateProjectDependencies(t *testing.T) {
  function TestAggregateApplyRequirements_ValidateImportProject (line 358) | func TestAggregateApplyRequirements_ValidateImportProject(t *testing.T) {

FILE: server/events/command_runner.go
  constant ShutdownComment (line 37) | ShutdownComment = "Atlantis server is shutting down, please try again la...
  type CommandRunner (line 43) | type CommandRunner interface
  type GithubPullGetter (line 54) | type GithubPullGetter interface
  type AzureDevopsPullGetter (line 62) | type AzureDevopsPullGetter interface
  type GitlabMergeRequestGetter (line 70) | type GitlabMergeRequestGetter interface
  type CommentCommandRunner (line 76) | type CommentCommandRunner interface
  function buildCommentCommandRunner (line 80) | func buildCommentCommandRunner(
  type DefaultCommandRunner (line 96) | type DefaultCommandRunner struct
    method RunAutoplanCommand (line 139) | func (c *DefaultCommandRunner) RunAutoplanCommand(baseRepo models.Repo...
    method commentUserDoesNotHavePermissions (line 258) | func (c *DefaultCommandRunner) commentUserDoesNotHavePermissions(baseR...
    method checkUserPermissions (line 266) | func (c *DefaultCommandRunner) checkUserPermissions(repo models.Repo, ...
    method checkVarFilesInPlanCommandAllowlisted (line 288) | func (c *DefaultCommandRunner) checkVarFilesInPlanCommandAllowlisted(c...
    method RunCommentCommand (line 301) | func (c *DefaultCommandRunner) RunCommentCommand(baseRepo models.Repo,...
    method getGithubData (line 432) | func (c *DefaultCommandRunner) getGithubData(logger logging.SimpleLogg...
    method getGiteaData (line 447) | func (c *DefaultCommandRunner) getGiteaData(logger logging.SimpleLoggi...
    method getGitlabData (line 462) | func (c *DefaultCommandRunner) getGitlabData(logger logging.SimpleLogg...
    method getAzureDevopsData (line 474) | func (c *DefaultCommandRunner) getAzureDevopsData(logger logging.Simpl...
    method buildLogger (line 489) | func (c *DefaultCommandRunner) buildLogger(repoFullName string, pullNu...
    method ensureValidRepoMetadata (line 497) | func (c *DefaultCommandRunner) ensureValidRepoMetadata(
    method fetchUserTeams (line 538) | func (c *DefaultCommandRunner) fetchUserTeams(logger logging.SimpleLog...
    method validateCtxAndComment (line 548) | func (c *DefaultCommandRunner) validateCtxAndComment(ctx *command.Cont...
    method logPanics (line 578) | func (c *DefaultCommandRunner) logPanics(baseRepo models.Repo, pullNum...

FILE: server/events/command_runner_internal_test.go
  function TestApplyUpdateCommitStatus (line 15) | func TestApplyUpdateCommitStatus(t *testing.T) {
  function TestPlanUpdatePlanCommitStatus (line 109) | func TestPlanUpdatePlanCommitStatus(t *testing.T) {
  function TestPlanUpdateApplyCommitStatus (line 171) | func TestPlanUpdateApplyCommitStatus(t *testing.T) {
  type MockCSU (line 270) | type MockCSU struct
    method UpdateCombinedCount (line 280) | func (m *MockCSU) UpdateCombinedCount(_ logging.SimpleLogging, repo mo...
    method UpdateCombined (line 291) | func (m *MockCSU) UpdateCombined(_ logging.SimpleLogging, _ models.Rep...
    method UpdateProject (line 295) | func (m *MockCSU) UpdateProject(_ command.ProjectContext, _ command.Na...
    method UpdatePreWorkflowHook (line 299) | func (m *MockCSU) UpdatePreWorkflowHook(_ logging.SimpleLogging, _ mod...
    method UpdatePostWorkflowHook (line 303) | func (m *MockCSU) UpdatePostWorkflowHook(_ logging.SimpleLogging, _ mo...

FILE: server/events/command_runner_test.go
  type TestConfig (line 75) | type TestConfig struct
  function setup (line 89) | func setup(t *testing.T, options ...func(testConfig *TestConfig)) *vcsmo...
  function TestRunCommentCommand_LogPanics (line 281) | func TestRunCommentCommand_LogPanics(t *testing.T) {
  function TestRunCommentCommand_GithubPullErr (line 292) | func TestRunCommentCommand_GithubPullErr(t *testing.T) {
  function TestRunCommentCommand_GitlabMergeRequestErr (line 301) | func TestRunCommentCommand_GitlabMergeRequestErr(t *testing.T) {
  function TestRunCommentCommand_GithubPullParseErr (line 310) | func TestRunCommentCommand_GithubPullParseErr(t *testing.T) {
  function TestRunCommentCommand_CommentPreWorkflowHookFailure (line 322) | func TestRunCommentCommand_CommentPreWorkflowHookFailure(t *testing.T) {
  function TestRunCommentCommand_TeamAllowListChecker (line 336) | func TestRunCommentCommand_TeamAllowListChecker(t *testing.T) {
  function TestRunCommentCommand_ForkPRDisabled (line 374) | func TestRunCommentCommand_ForkPRDisabled(t *testing.T) {
  function TestRunCommentCommand_ForkPRDisabled_SilenceEnabled (line 399) | func TestRunCommentCommand_ForkPRDisabled_SilenceEnabled(t *testing.T) {
  function TestRunCommentCommandPlan_NoProjects_SilenceEnabled (line 418) | func TestRunCommentCommandPlan_NoProjects_SilenceEnabled(t *testing.T) {
  function TestRunCommentCommandPlan_NoProjectsTarget_SilenceEnabled (line 441) | func TestRunCommentCommandPlan_NoProjectsTarget_SilenceEnabled(t *testin...
  function TestRunCommentCommandApply_NoProjects_SilenceEnabled (line 465) | func TestRunCommentCommandApply_NoProjects_SilenceEnabled(t *testing.T) {
  function TestRunCommentCommandApprovePolicy_NoProjects_SilenceEnabled (line 481) | func TestRunCommentCommandApprovePolicy_NoProjects_SilenceEnabled(t *tes...
  function TestRunCommentCommandUnlock_NoProjects_SilenceEnabled (line 495) | func TestRunCommentCommandUnlock_NoProjects_SilenceEnabled(t *testing.T) {
  function TestRunCommentCommandImport_NoProjects_SilenceEnabled (line 510) | func TestRunCommentCommandImport_NoProjects_SilenceEnabled(t *testing.T) {
  function TestRunCommentCommand_DisableApplyAllDisabled (line 523) | func TestRunCommentCommand_DisableApplyAllDisabled(t *testing.T) {
  function TestRunCommentCommand_DisableAutoplan (line 541) | func TestRunCommentCommand_DisableAutoplan(t *testing.T) {
  function TestRunCommentCommand_DisableAutoplanLabel (line 563) | func TestRunCommentCommand_DisableAutoplanLabel(t *testing.T) {
  function TestRunCommentCommand_DisableAutoplanLabel_PullNotLabeled (line 588) | func TestRunCommentCommand_DisableAutoplanLabel_PullNotLabeled(t *testin...
  function TestRunCommentCommand_ClosedPull (line 612) | func TestRunCommentCommand_ClosedPull(t *testing.T) {
  function TestRunCommentCommand_MatchedBranch (line 628) | func TestRunCommentCommand_MatchedBranch(t *testing.T) {
  function TestRunCommentCommand_UnmatchedBranch (line 646) | func TestRunCommentCommand_UnmatchedBranch(t *testing.T) {
  function TestRunUnlockCommand_VCSComment (line 663) | func TestRunUnlockCommand_VCSComment(t *testing.T) {
  function TestRunUnlockCommandFail_VCSComment (line 706) | func TestRunUnlockCommandFail_VCSComment(t *testing.T) {
  function TestRunUnlockCommandFail_DisableUnlockLabel (line 729) | func TestRunUnlockCommandFail_DisableUnlockLabel(t *testing.T) {
  function TestRunUnlockCommandFail_GetLabelsFail (line 755) | func TestRunUnlockCommandFail_GetLabelsFail(t *testing.T) {
  function TestRunUnlockCommandDoesntRetrieveLabelsIfDisableUnlockLabelNotSet (line 779) | func TestRunUnlockCommandDoesntRetrieveLabelsIfDisableUnlockLabelNotSet(...
  function TestRunAutoplanCommand_DeletePlans (line 805) | func TestRunAutoplanCommand_DeletePlans(t *testing.T) {
  function TestRunAutoplanCommand_FailedPreWorkflowHook_FailOnPreWorkflowHookError_False (line 834) | func TestRunAutoplanCommand_FailedPreWorkflowHook_FailOnPreWorkflowHookE...
  function TestRunAutoplanCommand_FailedPreWorkflowHook_FailOnPreWorkflowHookError_True (line 864) | func TestRunAutoplanCommand_FailedPreWorkflowHook_FailOnPreWorkflowHookE...
  function TestRunCommentCommand_FailedPreWorkflowHook_FailOnPreWorkflowHookError_False (line 896) | func TestRunCommentCommand_FailedPreWorkflowHook_FailOnPreWorkflowHookEr...
  function TestRunCommentCommand_FailedPreWorkflowHook_FailOnPreWorkflowHookError_True (line 920) | func TestRunCommentCommand_FailedPreWorkflowHook_FailOnPreWorkflowHookEr...
  function TestRunGenericPlanCommand_DeletePlans (line 941) | func TestRunGenericPlanCommand_DeletePlans(t *testing.T) {
  function TestRunSpecificPlanCommandDoesnt_DeletePlans (line 979) | func TestRunSpecificPlanCommandDoesnt_DeletePlans(t *testing.T) {
  function TestRunAutoplanCommandWithError_DeletePlans (line 1001) | func TestRunAutoplanCommandWithError_DeletePlans(t *testing.T) {
  function TestRunGenericPlanCommand_DiscardApprovals (line 1054) | func TestRunGenericPlanCommand_DiscardApprovals(t *testing.T) {
  function TestApplyMergeablityWhenPolicyCheckFails (line 1083) | func TestApplyMergeablityWhenPolicyCheckFails(t *testing.T) {
  function TestApplyWithAutoMerge_VSCMerge (line 1144) | func TestApplyWithAutoMerge_VSCMerge(t *testing.T) {
  function TestRunApply_DiscardedProjects (line 1165) | func TestRunApply_DiscardedProjects(t *testing.T) {
  function TestRunCommentCommand_DrainOngoing (line 1208) | func TestRunCommentCommand_DrainOngoing(t *testing.T) {
  function TestRunCommentCommand_DrainNotOngoing (line 1217) | func TestRunCommentCommand_DrainNotOngoing(t *testing.T) {
  function TestRunAutoplanCommand_DrainOngoing (line 1227) | func TestRunAutoplanCommand_DrainOngoing(t *testing.T) {
  function TestRunAutoplanCommand_DrainNotOngoing (line 1236) | func TestRunAutoplanCommand_DrainNotOngoing(t *testing.T) {

FILE: server/events/comment_parser.go
  constant workspaceFlagLong (line 36) | workspaceFlagLong            = "workspace"
  constant workspaceFlagShort (line 37) | workspaceFlagShort           = "w"
  constant dirFlagLong (line 38) | dirFlagLong                  = "dir"
  constant dirFlagShort (line 39) | dirFlagShort                 = "d"
  constant projectFlagLong (line 40) | projectFlagLong              = "project"
  constant projectFlagShort (line 41) | projectFlagShort             = "p"
  constant policySetFlagLong (line 42) | policySetFlagLong            = "policy-set"
  constant policySetFlagShort (line 43) | policySetFlagShort           = ""
  constant autoMergeDisabledFlagLong (line 44) | autoMergeDisabledFlagLong    = "auto-merge-disabled"
  constant autoMergeDisabledFlagShort (line 45) | autoMergeDisabledFlagShort   = ""
  constant autoMergeMethodFlagLong (line 46) | autoMergeMethodFlagLong      = "auto-merge-method"
  constant autoMergeMethodFlagShort (line 47) | autoMergeMethodFlagShort     = ""
  constant verboseFlagLong (line 48) | verboseFlagLong              = "verbose"
  constant verboseFlagShort (line 49) | verboseFlagShort             = ""
  constant clearPolicyApprovalFlagLong (line 50) | clearPolicyApprovalFlagLong  = "clear-policy-approval"
  constant clearPolicyApprovalFlagShort (line 51) | clearPolicyApprovalFlagShort = ""
  type CommentParsing (line 64) | type CommentParsing interface
  type CommentBuilder (line 73) | type CommentBuilder interface
  type CommentParser (line 83) | type CommentParser struct
    method Parse (line 148) | func (e *CommentParser) Parse(rawComment string, vcsHost models.VCSHos...
    method parseArgs (line 349) | func (e *CommentParser) parseArgs(name command.Name, args []string, fl...
    method BuildPlanComment (line 413) | func (e *CommentParser) BuildPlanComment(repoRelDir string, workspace ...
    method BuildApplyComment (line 429) | func (e *CommentParser) BuildApplyComment(repoRelDir string, workspace...
    method BuildApprovePoliciesComment (line 435) | func (e *CommentParser) BuildApprovePoliciesComment(repoRelDir string,...
    method buildFlags (line 440) | func (e *CommentParser) buildFlags(repoRelDir string, workspace string...
    method validateDir (line 474) | func (e *CommentParser) validateDir(dir string) (string, error) {
    method isAllowedCommand (line 522) | func (e *CommentParser) isAllowedCommand(cmd string) bool {
    method errMarkdown (line 531) | func (e *CommentParser) errMarkdown(errMsg string, cmd string, flagSet...
    method HelpComment (line 535) | func (e *CommentParser) HelpComment() string {
  function NewCommentParser (line 94) | func NewCommentParser(githubUser, gitlabUser, giteaUser, bitbucketUser, ...
  type CommentParseResult (line 117) | type CommentParseResult struct
  function containsGlobPattern (line 518) | func containsGlobPattern(s string) bool {

FILE: server/events/comment_parser_test.go
  function TestNewCommentParser (line 36) | func TestNewCommentParser(t *testing.T) {
  function TestParse_Ignored (line 78) | func TestParse_Ignored(t *testing.T) {
  function TestParse_ExecutableName (line 93) | func TestParse_ExecutableName(t *testing.T) {
  function TestParse_HelpResponse (line 117) | func TestParse_HelpResponse(t *testing.T) {
  function TestParse_TrimCommandString (line 147) | func TestParse_TrimCommandString(t *testing.T) {
  function TestParse_UnusedArguments (line 174) | func TestParse_UnusedArguments(t *testing.T) {
  function TestParse_UnknownShorthandFlag (line 262) | func TestParse_UnknownShorthandFlag(t *testing.T) {
  function TestParse_DidYouMeanAtlantis (line 269) | func TestParse_DidYouMeanAtlantis(t *testing.T) {
  function TestParse_InvalidCommand (line 288) | func TestParse_InvalidCommand(t *testing.T) {
  function TestParse_SubcommandUsage (line 317) | func TestParse_SubcommandUsage(t *testing.T) {
  function TestParse_InvalidFlags (line 345) | func TestParse_InvalidFlags(t *testing.T) {
  function TestParse_RelativeDirPath (line 386) | func TestParse_RelativeDirPath(t *testing.T) {
  function TestParse_GlobPatternDir (line 415) | func TestParse_GlobPatternDir(t *testing.T) {
  function TestParse_GlobPatternDirWithRelativePath (line 440) | func TestParse_GlobPatternDirWithRelativePath(t *testing.T) {
  function TestParse_InvalidGlobPattern (line 460) | func TestParse_InvalidGlobPattern(t *testing.T) {
  function TestParse_ValidCommand (line 476) | func TestParse_ValidCommand(t *testing.T) {
  function TestParse_InvalidWorkspace (line 507) | func TestParse_InvalidWorkspace(t *testing.T) {
  function TestParse_UsingProjectAtSameTimeAsWorkspaceOrDir (line 535) | func TestParse_UsingProjectAtSameTimeAsWorkspaceOrDir(t *testing.T) {
  function TestParse_Parsing (line 551) | func TestParse_Parsing(t *testing.T) {
  function TestBuildPlanApplyVersionComment (line 814) | func TestBuildPlanApplyVersionComment(t *testing.T) {
  function TestCommentParser_HelpComment (line 944) | func TestCommentParser_HelpComment(t *testing.T) {
  function TestParse_VCSUsername (line 1069) | func TestParse_VCSUsername(t *testing.T) {

FILE: server/events/commit_status_updater.go
  type CommitStatusUpdater (line 32) | type CommitStatusUpdater interface
  type DefaultCommitStatusUpdater (line 45) | type DefaultCommitStatusUpdater struct
    method UpdateCombined (line 55) | func (d *DefaultCommitStatusUpdater) UpdateCombined(logger logging.Sim...
    method UpdateCombinedCount (line 69) | func (d *DefaultCommitStatusUpdater) UpdateCombinedCount(logger loggin...
    method UpdateProject (line 85) | func (d *DefaultCommitStatusUpdater) UpdateProject(ctx command.Project...
    method UpdatePreWorkflowHook (line 111) | func (d *DefaultCommitStatusUpdater) UpdatePreWorkflowHook(log logging...
    method UpdatePostWorkflowHook (line 115) | func (d *DefaultCommitStatusUpdater) UpdatePostWorkflowHook(log loggin...
    method updateWorkflowHook (line 119) | func (d *DefaultCommitStatusUpdater) updateWorkflowHook(log logging.Si...
  function genProjectStatusDescription (line 107) | func genProjectStatusDescription(cmdName, description string) string {

FILE: server/events/commit_status_updater_test.go
  function TestUpdateCombined (line 29) | func TestUpdateCombined(t *testing.T) {
  function TestUpdateCombinedCount (line 82) | func TestUpdateCombinedCount(t *testing.T) {
  function TestDefaultCommitStatusUpdater_UpdateProjectSrc (line 151) | func TestDefaultCommitStatusUpdater_UpdateProjectSrc(t *testing.T) {
  function TestDefaultCommitStatusUpdater_UpdateProject (line 191) | func TestDefaultCommitStatusUpdater_UpdateProject(t *testing.T) {
  function TestDefaultCommitStatusUpdater_UpdateProjectCustomStatusName (line 255) | func TestDefaultCommitStatusUpdater_UpdateProjectCustomStatusName(t *tes...

FILE: server/events/db_updater.go
  type DBUpdater (line 12) | type DBUpdater struct
    method updateDB (line 16) | func (c *DBUpdater) updateDB(ctx *command.Context, pull models.PullReq...

FILE: server/events/delete_lock_command.go
  type DeleteLockCommand (line 16) | type DeleteLockCommand interface
  type DefaultDeleteLockCommand (line 22) | type DefaultDeleteLockCommand struct
    method DeleteLock (line 30) | func (l *DefaultDeleteLockCommand) DeleteLock(logger logging.SimpleLog...
    method DeleteLocksByPull (line 49) | func (l *DefaultDeleteLockCommand) DeleteLocksByPull(logger logging.Si...

FILE: server/events/delete_lock_command_test.go
  function TestDeleteLock_LockerErr (line 20) | func TestDeleteLock_LockerErr(t *testing.T) {
  function TestDeleteLock_None (line 31) | func TestDeleteLock_None(t *testing.T) {
  function TestDeleteLock_Success (line 43) | func TestDeleteLock_Success(t *testing.T) {
  function TestDeleteLocksByPull_LockerErr (line 84) | func TestDeleteLocksByPull_LockerErr(t *testing.T) {
  function TestDeleteLocksByPull_None (line 104) | func TestDeleteLocksByPull_None(t *testing.T) {
  function TestDeleteLocksByPull_SingleSuccess (line 124) | func TestDeleteLocksByPull_SingleSuccess(t *testing.T) {
  function TestDeleteLocksByPull_MultipleSuccess (line 163) | func TestDeleteLocksByPull_MultipleSuccess(t *testing.T) {

FILE: server/events/drainer.go
  type Drainer (line 12) | type Drainer struct
    method StartOp (line 27) | func (d *Drainer) StartOp() bool {
    method OpDone (line 40) | func (d *Drainer) OpDone() {
    method ShutdownBlocking (line 54) | func (d *Drainer) ShutdownBlocking() {
    method GetStatus (line 64) | func (d *Drainer) GetStatus() DrainStatus {
  type DrainStatus (line 18) | type DrainStatus struct

FILE: server/events/drainer_test.go
  function TestDrainer (line 16) | func TestDrainer(t *testing.T) {
  function TestDrainer_Shutdown (line 40) | func TestDrainer_Shutdown(t *testing.T) {

FILE: server/events/event_parser.go
  constant gitlabPullOpened (line 40) | gitlabPullOpened = "opened"
  constant usagesCols (line 41) | usagesCols = 90
  type PullCommand (line 46) | type PullCommand interface
  type PolicyCheckCommand (line 62) | type PolicyCheckCommand struct
    method CommandName (line 65) | func (c PolicyCheckCommand) CommandName() command.Name {
    method SubCommandName (line 70) | func (c PolicyCheckCommand) SubCommandName() string {
    method Dir (line 75) | func (c PolicyCheckCommand) Dir() string {
    method IsVerbose (line 80) | func (c PolicyCheckCommand) IsVerbose() bool {
    method IsAutoplan (line 85) | func (c PolicyCheckCommand) IsAutoplan() bool {
  type AutoplanCommand (line 91) | type AutoplanCommand struct
    method CommandName (line 94) | func (c AutoplanCommand) CommandName() command.Name {
    method SubCommandName (line 99) | func (c AutoplanCommand) SubCommandName() string {
    method Dir (line 104) | func (c AutoplanCommand) Dir() string {
    method IsVerbose (line 109) | func (c AutoplanCommand) IsVerbose() bool {
    method IsAutoplan (line 114) | func (c AutoplanCommand) IsAutoplan() bool {
  type CommentCommand (line 119) | type CommentCommand struct
    method IsForSpecificProject (line 152) | func (c CommentCommand) IsForSpecificProject() bool {
    method Dir (line 157) | func (c CommentCommand) Dir() string {
    method CommandName (line 162) | func (c CommentCommand) CommandName() command.Name {
    method SubCommandName (line 167) | func (c CommentCommand) SubCommandName() string {
    method IsVerbose (line 172) | func (c CommentCommand) IsVerbose() bool {
    method IsAutoplan (line 177) | func (c CommentCommand) IsAutoplan() bool {
    method String (line 182) | func (c CommentCommand) String() string {
  function NewCommentCommand (line 187) | func NewCommentCommand(repoRelDir string, flags []string, name command.N...
  type EventParsing (line 216) | type EventParsing interface
  type EventParser (line 358) | type EventParser struct
    method ParseAPIPlanRequest (line 374) | func (e *EventParser) ParseAPIPlanRequest(vcsHostType models.VCSHostTy...
    method GetBitbucketCloudPullEventType (line 396) | func (e *EventParser) GetBitbucketCloudPullEventType(eventTypeHeader s...
    method ParseBitbucketCloudPullCommentEvent (line 418) | func (e *EventParser) ParseBitbucketCloudPullCommentEvent(body []byte)...
    method parseCommonBitbucketCloudEventData (line 433) | func (e *EventParser) parseCommonBitbucketCloudEventData(event bitbuck...
    method ParseBitbucketCloudPullEvent (line 487) | func (e *EventParser) ParseBitbucketCloudPullEvent(body []byte) (pull ...
    method ParseGithubIssueCommentEvent (line 503) | func (e *EventParser) ParseGithubIssueCommentEvent(logger logging.Simp...
    method ParseGithubPullEvent (line 526) | func (e *EventParser) ParseGithubPullEvent(logger logging.SimpleLoggin...
    method ParseGithubPull (line 575) | func (e *EventParser) ParseGithubPull(logger logging.SimpleLogging, pu...
    method ParseGithubRepo (line 638) | func (e *EventParser) ParseGithubRepo(ghRepo *github.Repository) (mode...
    method ParseGiteaRepo (line 654) | func (e *EventParser) ParseGiteaRepo(repo giteasdk.Repository) (models...
    method ParseGitlabMergeRequestUpdateEvent (line 659) | func (e *EventParser) ParseGitlabMergeRequestUpdateEvent(event gitlab....
    method ParseGitlabMergeRequestEvent (line 672) | func (e *EventParser) ParseGitlabMergeRequestEvent(event gitlab.MergeE...
    method ParseGitlabMergeRequestCommentEvent (line 729) | func (e *EventParser) ParseGitlabMergeRequestCommentEvent(event gitlab...
    method ParseGiteaIssueCommentEvent (line 750) | func (e *EventParser) ParseGiteaIssueCommentEvent(comment gitea.GiteaI...
    method ParseGitlabMergeRequest (line 775) | func (e *EventParser) ParseGitlabMergeRequest(mr *gitlab.MergeRequest,...
    method GetBitbucketServerPullEventType (line 797) | func (e *EventParser) GetBitbucketServerPullEventType(eventTypeHeader ...
    method ParseBitbucketServerPullCommentEvent (line 812) | func (e *EventParser) ParseBitbucketServerPullCommentEvent(body []byte...
    method parseCommonBitbucketServerEventData (line 827) | func (e *EventParser) parseCommonBitbucketServerEventData(event bitbuc...
    method ParseBitbucketServerPullEvent (line 886) | func (e *EventParser) ParseBitbucketServerPullEvent(body []byte) (pull...
    method ParseAzureDevopsPullEvent (line 902) | func (e *EventParser) ParseAzureDevopsPullEvent(event azuredevops.Even...
    method ParseAzureDevopsPull (line 940) | func (e *EventParser) ParseAzureDevopsPull(pull *azuredevops.GitPullRe...
    method ParseAzureDevopsRepo (line 1013) | func (e *EventParser) ParseAzureDevopsRepo(adRepo *azuredevops.GitRepo...
    method ParseGiteaPullRequestEvent (line 1064) | func (e *EventParser) ParseGiteaPullRequestEvent(event giteasdk.PullRe...
    method ParseGiteaPull (line 1122) | func (e *EventParser) ParseGiteaPull(pull *giteasdk.PullRequest) (pull...

FILE: server/events/event_parser_test.go
  function TestParseGithubRepo (line 51) | func TestParseGithubRepo(t *testing.T) {
  function TestParseGithubIssueCommentEvent (line 67) | func TestParseGithubIssueCommentEvent(t *testing.T) {
  function TestParseGithubPullEvent (line 121) | func TestParseGithubPullEvent(t *testing.T) {
  function TestParseGithubPullEventFromDraft (line 170) | func TestParseGithubPullEventFromDraft(t *testing.T) {
  function TestParseGithubPullEvent_EventType (line 195) | func TestParseGithubPullEvent_EventType(t *testing.T) {
  function TestParseGithubPull (line 284) | func TestParseGithubPull(t *testing.T) {
  function TestParseGitlabMergeEvent (line 343) | func TestParseGitlabMergeEvent(t *testing.T) {
  function TestParseGitlabMergeEventFr
Condensed preview — 1015 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,489K chars).
[
  {
    "path": ".adr-dir",
    "chars": 9,
    "preview": "docs/adr\n"
  },
  {
    "path": ".clusterfuzzlite/Dockerfile",
    "chars": 202,
    "preview": "FROM gcr.io/oss-fuzz-base/base-builder-go@sha256:b940188f7306d865c69127852ec33e9c821287e6fbebaa9feb89ccc09a6e9b50\nCOPY ."
  },
  {
    "path": ".clusterfuzzlite/build.sh",
    "chars": 510,
    "preview": "#!/bin/bash -eu\n# Copyright 2025 The Atlantis Authors\n# SPDX-License-Identifier: Apache-2.0\n\n# Register go-118-fuzz-buil"
  },
  {
    "path": ".codecov.yml",
    "chars": 345,
    "preview": "coverage:\n  status:\n    # This disables the GitHub statuses from CodeCov. I found that many of the\n    # PRs I wanted to"
  },
  {
    "path": ".dockerignore",
    "chars": 134,
    "preview": "*\n!cmd/\n!scripts/download-release.sh\n!server/\n!testdrive/\n!main.go\n!go.mod\n!go.sum\n!docker-entrypoint.sh\n!atlantis\n!.clu"
  },
  {
    "path": ".editorconfig",
    "chars": 188,
    "preview": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n\n[*.md]\nin"
  },
  {
    "path": ".gitattributes",
    "chars": 92,
    "preview": "# Set the default behavior, in case people don't have core.autocrlf set.\n* text=auto eol=lf\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 2409,
    "preview": "---\nname: Bug Report\nabout: You're experiencing an issue that is different than the documented behavior.\nlabels: bug\n---"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 1968,
    "preview": "---\nname: Feature request\nabout: Propose a concrete new feature\ntitle: ''\nlabels: 'feature'\nassignees: ''\n\n---\n\n<!--- Pl"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 662,
    "preview": "## what\n\n<!--\n- Describe high-level what changed as a result of these commits (i.e. in plain-english, what do these chan"
  },
  {
    "path": ".github/cherry-pick-bot.yml",
    "chars": 45,
    "preview": "enabled: true\npreservePullRequestTitle: true\n"
  },
  {
    "path": ".github/copilot-instructions.md",
    "chars": 5424,
    "preview": "# Atlantis - Terraform Pull Request Automation\n\n**What it does:** Self-hosted Go application that listens for Terraform "
  },
  {
    "path": ".github/labeler.yml",
    "chars": 1167,
    "preview": "build:\n- changed-files:\n  - any-glob-to-any-file: 'Dockerfile*'\n\ndependencies:\n- changed-files:\n  - any-glob-to-any-file"
  },
  {
    "path": ".github/release.yml",
    "chars": 938,
    "preview": "changelog:\n  exclude:\n    labels:\n      - ignore-for-release\n      - github-actions\n    authors:\n      - octocat\n  categ"
  },
  {
    "path": ".github/renovate.json5",
    "chars": 3776,
    "preview": "{\n  extends: [\n    'config:best-practices',\n    ':separateMultipleMajorReleases',\n    'schedule:daily',\n    'security:op"
  },
  {
    "path": ".github/styles/Atlantis/ProductTerms.yml",
    "chars": 138,
    "preview": "extends: substitution\nmessage: \"Use '%s' instead of '%s'.\"\nlevel: error\nignorecase: false\nswap:\n  'Github': 'GitHub'\n  '"
  },
  {
    "path": ".github/workflows/atlantis-image.yml",
    "chars": 10463,
    "preview": "name: atlantis-image\n\non:\n  push:\n    branches:\n      - 'main'\n      - 'release-**'\n    tags:\n      - v*.*.*\n  pull_requ"
  },
  {
    "path": ".github/workflows/clusterfuzzlite.yml",
    "chars": 1774,
    "preview": "name: ClusterFuzzLite\n\non:\n  pull_request:\n    types:\n      - opened\n      - reopened\n      - synchronize\n      - ready_"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "chars": 4870,
    "preview": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# Y"
  },
  {
    "path": ".github/workflows/dependency-review.yml",
    "chars": 1080,
    "preview": "# Dependency Review Action\n#\n# This Action will scan dependency manifest files that change as part of a Pull Request,\n# "
  },
  {
    "path": ".github/workflows/labeler.yml",
    "chars": 587,
    "preview": "name: \"Pull Request Labeler\"\n\non:\n  pull_request_target:\n    types:\n      - opened\n      - reopened\n      - synchronize\n"
  },
  {
    "path": ".github/workflows/lint.yml",
    "chars": 2502,
    "preview": "name: linter\n\non:\n  pull_request:\n    types:\n      - opened\n      - reopened\n      - synchronize\n      - ready_for_revie"
  },
  {
    "path": ".github/workflows/pr-lint.yml",
    "chars": 549,
    "preview": "name: \"Lint PR\"\n\non:\n  pull_request_target:\n    types:\n      - opened\n      - edited\n      - synchronize\n\npermissions:\n "
  },
  {
    "path": ".github/workflows/pr-size-labeler.yml",
    "chars": 1176,
    "preview": "name: pr-size\n\non: [pull_request]\n\npermissions:\n  contents: read\n\njobs:\n  labeler:\n    permissions:\n      pull-requests:"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 1567,
    "preview": "name: release\n\non:\n  push:\n    tags:\n      - v*.*.*\n  workflow_dispatch:\n\npermissions:\n  contents: write  # for goreleas"
  },
  {
    "path": ".github/workflows/renovate-config.yml",
    "chars": 809,
    "preview": "name: renovate-config\n\non:\n  push:\n    paths:\n      - '.github/renovate.json5'\n    branches:\n      - main\n      - 'relea"
  },
  {
    "path": ".github/workflows/scorecard.yml",
    "chars": 2077,
    "preview": "name: Scorecard supply-chain security\non:\n  schedule:\n    - cron: '0 5 * * 1'\n  push:\n    branches:\n      - main\n\npermis"
  },
  {
    "path": ".github/workflows/stale.yml",
    "chars": 1170,
    "preview": "name: Close Stale PRs\non:\n  schedule:\n    - cron: '30 1 * * *'\npermissions:\n  contents: read\n\njobs:\n  stale:\n    permiss"
  },
  {
    "path": ".github/workflows/test.yml",
    "chars": 7295,
    "preview": "name: tester\n\non:\n  push:\n    branches:\n      - \"main\"\n      - \"release-**\"\n  pull_request:\n    types:\n      - opened\n  "
  },
  {
    "path": ".github/workflows/testing-env-image.yml",
    "chars": 3159,
    "preview": "name: testing-env-image\n\non:\n  push:\n    branches:\n      - 'main'\n      - 'release-**'\n  pull_request:\n    branches:\n   "
  },
  {
    "path": ".github/workflows/website.yml",
    "chars": 4064,
    "preview": "name: website\n\non:\n  push:\n    branches:\n      - 'main'\n      - 'release-**'\n  pull_request:\n    types:\n      - opened\n "
  },
  {
    "path": ".gitignore",
    "chars": 461,
    "preview": ".idea\n./atlantis\n*.iml\natlantis.db\noutput\n.DS_Store\n.cover\n.terraform/\nnode_modules/\nhelm/test-values.yaml\n*.swp\ngolangc"
  },
  {
    "path": ".golangci.yml",
    "chars": 623,
    "preview": "version: \"2\"\nlinters:\n  enable:\n    - modernize\n    - gochecknoinits\n    - gosec\n    - misspell\n    - revive\n    - testi"
  },
  {
    "path": ".goreleaser.yml",
    "chars": 1483,
    "preview": "version: 2\n\nenv:\n  - CGO_ENABLED=0\n\nbuilds:\n  - id: atlantis\n\n    targets:\n      - darwin_amd64\n      - darwin_arm64\n   "
  },
  {
    "path": ".lycheeignore",
    "chars": 246,
    "preview": "# Ignore file for the https://github.com/lycheeverse/lychee/ website link checker\n\n# These sites have bot protection whi"
  },
  {
    "path": ".markdownlint.yaml",
    "chars": 1091,
    "preview": "# MD013/line-length\n#\n# We're not particular about line length, generally preferring longer\n# lines, since tools like Gr"
  },
  {
    "path": ".node-version",
    "chars": 8,
    "preview": "24.13.1\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 511,
    "preview": "repos:\n- repo: https://github.com/gitleaks/gitleaks\n  rev: v8.16.3\n  hooks:\n  - id: gitleaks\n- repo: https://github.com/"
  },
  {
    "path": ".tool-versions",
    "chars": 23,
    "preview": "node 22.14.0\ngo 1.25.1\n"
  },
  {
    "path": ".vale.ini",
    "chars": 313,
    "preview": "StylesPath = .github/styles\nMinAlertLevel = error\n\n# api-endpoints.md intentionally uses the API string literals \"Github"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 34,
    "preview": "{\n    \"git.alwaysSignOff\": true\n}\n"
  },
  {
    "path": "ADOPTERS.md",
    "chars": 610,
    "preview": "# Who uses Atlantis?\nAs the Atlantis Community grows, we'd like to keep track of our users and adopters. Please send a P"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 140354,
    "preview": "**NOTE:** We do not plan to update this page anymore. Please see [the releases page for the updated changelog](https://g"
  },
  {
    "path": "CODEOWNERS",
    "chars": 288,
    "preview": "# https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/ab"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3449,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 8962,
    "preview": "# Contributing <!-- omit in toc -->\n\n# Table of Contents <!-- omit in toc -->\n- [Reporting Issues](#reporting-issues)\n- "
  },
  {
    "path": "Dockerfile",
    "chars": 10444,
    "preview": "# syntax=docker/dockerfile:1@sha256:4a43a54dd1fedceb30ba47e76cfcf2b47304f4161c0caeac2db1c61804ea3c91\n# what distro is th"
  },
  {
    "path": "Dockerfile.dev",
    "chars": 173,
    "preview": "FROM ghcr.io/runatlantis/atlantis:latest@sha256:bdf219f4ee5a87435ef1f1b0ffc39cf8e86d39bd67d2fac6d86f25a8500c4ce2\nCOPY at"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "MAINTAINERS.md",
    "chars": 925,
    "preview": "The current Maintainers Group for the [Atlantis] Project consists of:\n\n| Name                | GitHub ID                "
  },
  {
    "path": "Makefile",
    "chars": 3701,
    "preview": "BUILD_ID := $(shell git rev-parse --short HEAD 2>/dev/null || echo no-commit-id)\nWORKSPACE := $(shell pwd)\nPKG := $(shel"
  },
  {
    "path": "README.md",
    "chars": 2390,
    "preview": "# Atlantis <!-- omit in toc -->\n\n[![Latest Release](https://img.shields.io/github/release/runatlantis/atlantis.svg)](htt"
  },
  {
    "path": "RELEASE.md",
    "chars": 4521,
    "preview": "# Releases\n\n## Cadence\n\nAtlantis follows a **monthly release cadence** to provide regular, predictable updates while mai"
  },
  {
    "path": "SECURITY.md",
    "chars": 420,
    "preview": "# Security Policy\n\n## Reporting a Vulnerability\n\nWe take security issues seriously. Please report a security vulnerabili"
  },
  {
    "path": "_typos.toml",
    "chars": 255,
    "preview": "[default.extend-words]\n# HashiCorp is a proper company name; the \"Hashi\" prefix is intentional\nhashi = \"hashi\"\n# \"ue\" is"
  },
  {
    "path": "atlantis-features-version-analysis.md",
    "chars": 11522,
    "preview": "# Atlantis Features Version Analysis\n\nThis document provides a comprehensive analysis of Atlantis features and the versi"
  },
  {
    "path": "cmd/bootstrap.go",
    "chars": 1268,
    "preview": "// Copyright 2017 HootSuite Media Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the License);\n// you may no"
  },
  {
    "path": "cmd/cmd.go",
    "chars": 794,
    "preview": "// Copyright 2017 HootSuite Media Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the License);\n// you may no"
  },
  {
    "path": "cmd/help_fmt.go",
    "chars": 3916,
    "preview": "// Copyright 2025 The Atlantis Authors\n// SPDX-License-Identifier: Apache-2.0\n\npackage cmd\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"s"
  },
  {
    "path": "cmd/root.go",
    "chars": 983,
    "preview": "// Copyright 2017 HootSuite Media Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the License);\n// you may no"
  },
  {
    "path": "cmd/server.go",
    "chars": 51560,
    "preview": "// Copyright 2017 HootSuite Media Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the License);\n// you may no"
  },
  {
    "path": "cmd/server_test.go",
    "chars": 32948,
    "preview": "// Copyright 2017 HootSuite Media Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the License);\n// you may no"
  },
  {
    "path": "cmd/version.go",
    "chars": 1087,
    "preview": "// Copyright 2017 HootSuite Media Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the License);\n// you may no"
  },
  {
    "path": "docker-compose.yml",
    "chars": 941,
    "preview": "# Note: This file is only used for Atlantis local development\nservices:\n  ngrok:\n    image: ngrok/ngrok:latest@sha256:de"
  },
  {
    "path": "docker-entrypoint.sh",
    "chars": 2600,
    "preview": "#!/usr/bin/env -S dumb-init --single-child /bin/sh\n\n# dumb-init is run in single child mode. By default dumb-init will f"
  },
  {
    "path": "docs/adr/0001-record-architecture-decisions.md",
    "chars": 832,
    "preview": "# 1. Record architecture decisions\n\nDate: 2023-05-09\n\n## Status\n\nAccepted\n\n## Context\n\nWe need to record the architectur"
  },
  {
    "path": "e2e/.gitignore",
    "chars": 15,
    "preview": "atlantis-tests\n"
  },
  {
    "path": "e2e/Makefile",
    "chars": 445,
    "preview": "WORKSPACE := $(shell pwd)\n\n.PHONY: test\n\n.DEFAULT_GOAL := help\nhelp: ## List targets & descriptions\n\t@cat Makefile* | gr"
  },
  {
    "path": "e2e/README.md",
    "chars": 387,
    "preview": "# End to end tests\n\nTests run against actual repos in various VCS providers\n\n## Configuration\n\n### Gitlab\n\nUser: https:/"
  },
  {
    "path": "e2e/e2e.go",
    "chars": 5230,
    "preview": "// Copyright 2017 HootSuite Media Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the License);\n// you may no"
  },
  {
    "path": "e2e/github.go",
    "chars": 4970,
    "preview": "// Copyright 2017 HootSuite Media Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the License);\n// you may no"
  },
  {
    "path": "e2e/gitlab.go",
    "chars": 5388,
    "preview": "// Copyright 2017 HootSuite Media Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the License);\n// you may no"
  },
  {
    "path": "e2e/go.mod",
    "chars": 541,
    "preview": "module github.com/runatlantis/atlantis/e2e\n\ngo 1.25.4\n\nrequire (\n\tgithub.com/google/go-github/v83 v83.0.0\n\tgithub.com/ha"
  },
  {
    "path": "e2e/go.sum",
    "chars": 3477,
    "preview": "github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.m"
  },
  {
    "path": "e2e/main.go",
    "chars": 3625,
    "preview": "// Copyright 2017 HootSuite Media Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the License);\n// you may no"
  },
  {
    "path": "e2e/vcs.go",
    "chars": 1247,
    "preview": "// Copyright 2017 HootSuite Media Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the License);\n// you may no"
  },
  {
    "path": "go.mod",
    "chars": 6384,
    "preview": "module github.com/runatlantis/atlantis\n\ngo 1.25.4\n\nrequire (\n\tcode.gitea.io/sdk/gitea v0.23.2\n\tgithub.com/Masterminds/sp"
  },
  {
    "path": "go.sum",
    "chars": 80200,
    "preview": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1"
  },
  {
    "path": "goss.yaml",
    "chars": 733,
    "preview": "# See: https://github.com/goss-org/goss/blob/master/docs/gossfile.md\n\ncommand:\n  # ensure atlantis is available\n  atlant"
  },
  {
    "path": "kustomize/bundle.yaml",
    "chars": 2107,
    "preview": "---\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: atlantis\nspec:\n  serviceName: atlantis\n  replicas: 1\n  updat"
  },
  {
    "path": "kustomize/kustomization.yaml",
    "chars": 89,
    "preview": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nresources:\n- bundle.yaml\n"
  },
  {
    "path": "main.go",
    "chars": 1966,
    "preview": "// Copyright 2017 HootSuite Media Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the License);\n// you may no"
  },
  {
    "path": "netlify.toml",
    "chars": 771,
    "preview": "# Netlify Config, https://www.netlify.com/docs/netlify-toml-reference/\n[build]\nbase = \"/\"\ncommand = \"npm install && npm "
  },
  {
    "path": "package.json",
    "chars": 782,
    "preview": "{\n  \"license\": \"Apache-2.0\",\n  \"type\": \"module\",\n  \"devDependencies\": {\n    \"@playwright/test\": \"1.58.2\",\n    \"@types/no"
  },
  {
    "path": "playwright.config.cjs",
    "chars": 56,
    "preview": "module.exports = {\n  testDir: './runatlantis.io/e2e'\n};\n"
  },
  {
    "path": "runatlantis.io/.vitepress/components/Banner.vue",
    "chars": 1771,
    "preview": "<script setup lang=\"ts\">\nimport { useElementSize } from '@vueuse/core';\nimport { ref, watchEffect } from 'vue';\nconst el"
  },
  {
    "path": "runatlantis.io/.vitepress/components/shims.d.ts",
    "chars": 137,
    "preview": "declare module '*.vue' {\n  import type { DefineComponent } from 'vue';\n  const component: DefineComponent;\n  export defa"
  },
  {
    "path": "runatlantis.io/.vitepress/config.ts",
    "chars": 6012,
    "preview": "import { generateSitemap as sitemap } from \"sitemap-ts\"\nimport footnote from 'markdown-it-footnote'\nimport { defineConfi"
  },
  {
    "path": "runatlantis.io/.vitepress/navbars.ts",
    "chars": 221,
    "preview": "const en = [\n  { text: \"Home\", link: \"/\" },\n  { text: \"Guide\", link: \"/guide\" },\n  { text: \"Docs\", link: \"/docs\" },\n  { "
  },
  {
    "path": "runatlantis.io/.vitepress/sidebars.ts",
    "chars": 5762,
    "preview": "const en = [\n  {\n    text: \"Guide\",\n    link: \"/guide\",\n    collapsed: false,\n    items: [\n      { text: \"Test Drive\", l"
  },
  {
    "path": "runatlantis.io/.vitepress/theme/index.ts",
    "chars": 290,
    "preview": "import DefaultTheme from \"vitepress/theme\";\nimport { defineAsyncComponent, h } from 'vue';\n\nexport default {\n  ...Defaul"
  },
  {
    "path": "runatlantis.io/blog/2017/introducing-atlantis.md",
    "chars": 6469,
    "preview": "---\ntitle: Introducing Atlantis\nlang: en-US\n---\n\n# Introducing Atlantis\n\n::: info\nThis post was originally written on Se"
  },
  {
    "path": "runatlantis.io/blog/2018/atlantis-0-4-4-now-supports-bitbucket.md",
    "chars": 4204,
    "preview": "---\ntitle: Atlantis 0.4.4 Now Supports Bitbucket\nlang: en-US\n---\n\n# Atlantis 0.4.4 Now Supports Bitbucket\n\n::: info\nThis"
  },
  {
    "path": "runatlantis.io/blog/2018/hosting-our-static-site/code/cloudfront.tf",
    "chars": 1853,
    "preview": "resource \"aws_cloudfront_distribution\" \"www_distribution\" {\n  // origin is where CloudFront gets its content from.\n  ori"
  },
  {
    "path": "runatlantis.io/blog/2018/hosting-our-static-site/code/dns.tf",
    "chars": 614,
    "preview": "// We want AWS to host our zone so its nameservers can point to our CloudFront\n// distribution.\nresource \"aws_route53_zo"
  },
  {
    "path": "runatlantis.io/blog/2018/hosting-our-static-site/code/full.tf",
    "chars": 2062,
    "preview": "resource \"aws_s3_bucket\" \"root\" {\n  bucket = \"${var.root_domain_name}\"\n  acl    = \"public-read\"\n  policy = <<POLICY\n{\n  "
  },
  {
    "path": "runatlantis.io/blog/2018/hosting-our-static-site/code/main.tf",
    "chars": 396,
    "preview": "// This block tells Terraform that we're going to provision AWS resources.\nprovider \"aws\" {\n  region = \"us-east-1\"\n}\n\n//"
  },
  {
    "path": "runatlantis.io/blog/2018/hosting-our-static-site/code/s3-bucket.tf",
    "chars": 1085,
    "preview": "resource \"aws_s3_bucket\" \"www\" {\n  // Our bucket's name is going to be the same as our site's domain name.\n  bucket = \"$"
  },
  {
    "path": "runatlantis.io/blog/2018/hosting-our-static-site/code/ssl-cert.tf",
    "chars": 586,
    "preview": "// Use the AWS Certificate Manager to create an SSL cert for our domain.\n// This resource won't be created until you rec"
  },
  {
    "path": "runatlantis.io/blog/2018/hosting-our-static-site-over-ssl-with-s3-acm-cloudfront-and-terraform.md",
    "chars": 8035,
    "preview": "---\ntitle: Hosting Our Static Site over SSL with S3, ACM, CloudFront and Terraform\nlang: en-US\n---\n\n# Hosting Our Static"
  },
  {
    "path": "runatlantis.io/blog/2018/joining-hashicorp.md",
    "chars": 3612,
    "preview": "---\ntitle: I'm Joining HashiCorp!\nlang: en-US\n---\n\n# I'm Joining HashiCorp\n\n::: info\nThis post was originally written on"
  },
  {
    "path": "runatlantis.io/blog/2018/putting-the-dev-into-devops-why-your-developers-should-write-terraform-too.md",
    "chars": 9420,
    "preview": "---\ntitle: \"Putting The Dev Into DevOps: Why Your Developers Should Write Terraform Too\"\nlang: en-US\n---\n\n# Putting The "
  },
  {
    "path": "runatlantis.io/blog/2018/terraform-and-the-dangers-of-applying-locally.md",
    "chars": 6586,
    "preview": "---\ntitle: Terraform And The Dangers Of Applying Locally\nlang: en-US\n---\n\n# Terraform And The Dangers Of Applying Locall"
  },
  {
    "path": "runatlantis.io/blog/2019/4-reasons-to-try-hashicorps-new-free-terraform-remote-state-storage.md",
    "chars": 6685,
    "preview": "---\ntitle: 4 Reasons To Try HashiCorp's (New) Free Terraform Remote State Storage\nlang: en-US\n---\n\n# 4 Reasons To Try Ha"
  },
  {
    "path": "runatlantis.io/blog/2024/april-2024-survey-results.md",
    "chars": 2910,
    "preview": "---\ntitle: Atlantis User Survey Results\nlang: en-US\n---\n\n# Atlantis User Survey Results\n\nIn April 2024, the Core Atlanti"
  },
  {
    "path": "runatlantis.io/blog/2024/integrating-atlantis-with-opentofu.md",
    "chars": 6213,
    "preview": "---\ntitle: Integrating Atlantis with Opentofu\nlang: en-US\n---\n\n# Integrating Atlantis with Opentofu\n\n::: info\nThis post "
  },
  {
    "path": "runatlantis.io/blog/2025/atlantis-on-google-cloud-run.md",
    "chars": 20747,
    "preview": "---\ntitle: Atlantis on Google Cloud Run\nlang: en-US\n---\n\n# Atlantis on Google Cloud Run\n\n::: info\nThough written for Goo"
  },
  {
    "path": "runatlantis.io/blog.md",
    "chars": 1797,
    "preview": "---\ntitle: Welcome to Our Blog\naside: false\n---\n\n# Welcome to Our Blog\n\nWe are thrilled to have you here! Our blog is a "
  },
  {
    "path": "runatlantis.io/contributing/events-controller.md",
    "chars": 4930,
    "preview": "# Events Controller\n\nWebhooks are the primary interaction between the Version Control System (VCS)\nand Atlantis. Each VC"
  },
  {
    "path": "runatlantis.io/contributing/glossary.md",
    "chars": 876,
    "preview": "# Glossary\n\nThe Atlantis community uses many words and phrases to work more efficiently.\nYou will find the most common o"
  },
  {
    "path": "runatlantis.io/contributing.md",
    "chars": 502,
    "preview": "---\naside: false\n---\n# Atlantis Contributing Documentation\n\nThese docs are for users who want to contribute to the Atlan"
  },
  {
    "path": "runatlantis.io/docs/access-credentials.md",
    "chars": 9348,
    "preview": "# Git Host Access Credentials\n\nThis page describes how to create credentials for your Git host (GitHub, GitLab, Gitea, B"
  },
  {
    "path": "runatlantis.io/docs/api-endpoints.md",
    "chars": 7803,
    "preview": "# API Endpoints\n\nAside from interacting via pull request comments, Atlantis could respond to a limited number of API end"
  },
  {
    "path": "runatlantis.io/docs/apply-requirements.md",
    "chars": 117,
    "preview": "# Apply Requirements\n\n:::warning REDIRECT\nThis page is moved to [Command Requirements](command-requirements.md).\n:::\n"
  },
  {
    "path": "runatlantis.io/docs/automerging.md",
    "chars": 2134,
    "preview": "# Automerging\n\nAtlantis can be configured to automatically merge a pull request after all plans have\nbeen successfully a"
  },
  {
    "path": "runatlantis.io/docs/autoplanning.md",
    "chars": 2338,
    "preview": "# Autoplanning\n\nOn any **new** pull request or **new commit** to an existing pull request, Atlantis will attempt to\nrun "
  },
  {
    "path": "runatlantis.io/docs/checkout-strategy.md",
    "chars": 2801,
    "preview": "# Checkout Strategy\n\nYou can configure how Atlantis checks out the code from your pull request via\nthe `--checkout-strat"
  },
  {
    "path": "runatlantis.io/docs/command-requirements.md",
    "chars": 11755,
    "preview": "# Command Requirements\n\n## Intro\n\nAtlantis requires certain conditions be satisfied **before** `atlantis apply` and `atl"
  },
  {
    "path": "runatlantis.io/docs/configuring-atlantis.md",
    "chars": 1012,
    "preview": "# Configuring Atlantis\n\nThere are three methods for configuring Atlantis:\n\n1. Passing flags to the `atlantis server` com"
  },
  {
    "path": "runatlantis.io/docs/configuring-webhooks.md",
    "chars": 8744,
    "preview": "# Configuring Webhooks\n\nAtlantis needs to receive Webhooks from your Git host so that it can respond to pull request eve"
  },
  {
    "path": "runatlantis.io/docs/custom-policy-checks.md",
    "chars": 1619,
    "preview": "# Custom Policy Checks\n\nIf you want to run custom policy tools or scripts instead of the built-in Conftest integration, "
  },
  {
    "path": "runatlantis.io/docs/custom-workflows.md",
    "chars": 28956,
    "preview": "# Custom Workflows\n\nCustom workflows can be defined to override the default commands that Atlantis\nruns.\n\n## Usage\n\nCust"
  },
  {
    "path": "runatlantis.io/docs/deployment.md",
    "chars": 28002,
    "preview": "# Deployment\n\nThis page covers getting Atlantis up and running in your infrastructure.\n\n::: tip Prerequisites\n\n* You hav"
  },
  {
    "path": "runatlantis.io/docs/faq.md",
    "chars": 2141,
    "preview": "# FAQ\n\n**Q: Does Atlantis affect Terraform [remote state](https://developer.hashicorp.com/terraform/language/state/remot"
  },
  {
    "path": "runatlantis.io/docs/how-atlantis-works.md",
    "chars": 210,
    "preview": "# How Atlantis Works\n\nThis section of docs talks about how Atlantis works at a deeper level.\n\n* [Locking](locking.md)\n* "
  },
  {
    "path": "runatlantis.io/docs/installation-guide.md",
    "chars": 1063,
    "preview": "# Installation Guide\n\nThis guide is for installing a **production-ready** instance of Atlantis onto your\ninfrastructure:"
  },
  {
    "path": "runatlantis.io/docs/locking.md",
    "chars": 2892,
    "preview": "# Locking\n\nWhen `plan` is run, the directory and Terraform workspace are **Locked** until the pull request is merged or "
  },
  {
    "path": "runatlantis.io/docs/policy-checking.md",
    "chars": 9510,
    "preview": "# Conftest Policy Checking\n\nAtlantis supports running server-side [conftest](https://www.conftest.dev/) policies against"
  },
  {
    "path": "runatlantis.io/docs/post-workflow-hooks.md",
    "chars": 5270,
    "preview": "# Post Workflow Hooks\n\nPost workflow hooks can be defined to run scripts after default or custom\nworkflows are executed."
  },
  {
    "path": "runatlantis.io/docs/pre-workflow-hooks.md",
    "chars": 5081,
    "preview": "# Pre Workflow Hooks\n\nPre workflow hooks can be defined to run scripts before default or custom\nworkflows are executed. "
  },
  {
    "path": "runatlantis.io/docs/provider-credentials.md",
    "chars": 5320,
    "preview": "# Provider Credentials\n\nAtlantis runs Terraform by simply executing `terraform plan` and `apply` commands\non the server "
  },
  {
    "path": "runatlantis.io/docs/repo-and-project-permissions.md",
    "chars": 11138,
    "preview": "# Repo and Project Permissions\n\nSometimes it may be necessary to limit who can run which commands, such as\nrestricting w"
  },
  {
    "path": "runatlantis.io/docs/repo-level-atlantis-yaml.md",
    "chars": 24528,
    "preview": "# Repo Level atlantis.yaml Config\n\nAn `atlantis.yaml` file specified at the root of a Terraform repo allows you\nto instr"
  },
  {
    "path": "runatlantis.io/docs/requirements.md",
    "chars": 3465,
    "preview": "# Requirements\n\nAtlantis works with most Git hosts and Terraform setups. Read on to confirm\nit works with yours.\n\n## Git"
  },
  {
    "path": "runatlantis.io/docs/security.md",
    "chars": 5677,
    "preview": "# Security\n\n## Exploits\n\nBecause you usually run Atlantis on a server with credentials that allow access to your infrast"
  },
  {
    "path": "runatlantis.io/docs/sending-notifications-via-webhooks.md",
    "chars": 4746,
    "preview": "# Sending notifications via webhooks\n\nIt is possible to send notifications to external systems whenever an apply is bein"
  },
  {
    "path": "runatlantis.io/docs/server-configuration.md",
    "chars": 54381,
    "preview": "# Server Configuration\n\nThis page explains how to configure the `atlantis server` command.\n\nConfiguration to `atlantis s"
  },
  {
    "path": "runatlantis.io/docs/server-side-repo-config.md",
    "chars": 28780,
    "preview": "# Server Side Repo Config\n\nA Server-Side Config file is used for more groups of server config that can't reasonably be e"
  },
  {
    "path": "runatlantis.io/docs/stats.md",
    "chars": 3689,
    "preview": "# Metrics/Stats\n\nAtlantis exposes a set of metrics for each of its operations including errors, successes, and latencies"
  },
  {
    "path": "runatlantis.io/docs/streaming-logs.md",
    "chars": 869,
    "preview": "# Real-time logs\n\nAtlantis supports streaming terraform logs in real time by default. Currently, only two commands are s"
  },
  {
    "path": "runatlantis.io/docs/terraform-cloud.md",
    "chars": 4304,
    "preview": "# Terraform Cloud/Enterprise\n\n::: tip NOTE\nTerraform Enterprise was [recently renamed](https://www.hashicorp.com/blog/in"
  },
  {
    "path": "runatlantis.io/docs/terraform-versions.md",
    "chars": 2194,
    "preview": "# Terraform Versions\n\nYou can customize which version of Terraform Atlantis defaults to by setting\nthe `--default-tf-ver"
  },
  {
    "path": "runatlantis.io/docs/troubleshooting-https.md",
    "chars": 1393,
    "preview": "# HTTPS, SSL, TLS\n\nWhen using a self-signed certificate for Atlantis (with flags `--ssl-cert-file` and `--ssl-key-file`)"
  },
  {
    "path": "runatlantis.io/docs/upgrading-atlantis-yaml.md",
    "chars": 4802,
    "preview": "# Upgrading atlantis.yaml\n\n## Upgrading From v2 To v3\n\nAtlantis version `v0.7.0` introduced a new version 3 of `atlantis"
  },
  {
    "path": "runatlantis.io/docs/using-atlantis.md",
    "chars": 12157,
    "preview": "# Using Atlantis\n\nAtlantis triggers commands via pull request comments.\n![Help Command](./images/pr-comment-help.png)\n\n:"
  },
  {
    "path": "runatlantis.io/docs/webhook-secrets.md",
    "chars": 1482,
    "preview": "# Webhook Secrets\n\nAtlantis uses Webhook secrets to validate that the webhooks it receives from your\nGit host are legiti"
  },
  {
    "path": "runatlantis.io/docs.md",
    "chars": 803,
    "preview": "---\naside: false\n---\n# Atlantis Documentation\n\nThese docs are for users that are ready to get Atlantis installed and sta"
  },
  {
    "path": "runatlantis.io/e2e/site-check.spec.js",
    "chars": 375,
    "preview": "import { test } from '@playwright/test';\n\ntest('page should load without errors', async ({ page }) => {\n  // Listen for "
  },
  {
    "path": "runatlantis.io/guide/test-drive.md",
    "chars": 824,
    "preview": "# Test Drive\n\nTo test drive Atlantis on an example repo, download the latest release from\n[GitHub](https://github.com/ru"
  },
  {
    "path": "runatlantis.io/guide/testing-locally.md",
    "chars": 14929,
    "preview": "# Testing Locally\n\nThese instructions are for running Atlantis **locally on your own computer** so you can test it out a"
  },
  {
    "path": "runatlantis.io/guide.md",
    "chars": 2914,
    "preview": "# Introduction\n\n## Getting Started\n\n* If you'd like to just test out running Atlantis on an **example repo** check out t"
  },
  {
    "path": "runatlantis.io/index.md",
    "chars": 1465,
    "preview": "---\n# https://vitepress.dev/reference/default-theme-home-page\nlayout: home\n\npageClass: home-custom\n\nhero:\n  name: Atlant"
  },
  {
    "path": "runatlantis.io/terraform/main.tf",
    "chars": 2090,
    "preview": "// This project sets up DNS entries for runatlantis.io. The site is hosted\n// on Netlify.\n\nprovider \"aws\" {\n  region = \""
  },
  {
    "path": "runatlantis.io/terraform/versions.tf",
    "chars": 46,
    "preview": "\nterraform {\n  required_version = \">= 0.12\"\n}\n"
  },
  {
    "path": "scripts/addlicense.sh",
    "chars": 366,
    "preview": "#!/usr/bin/env bash\n# Copyright 2025 The Atlantis Authors\n# SPDX-License-Identifier: Apache-2.0\n\n\nset -euo pipefail\n\nif "
  },
  {
    "path": "scripts/coverage.sh",
    "chars": 858,
    "preview": "#!/bin/sh\n# Taken and modified from https://github.com/mlafeldt/chef-runner/blob/v0.7.0/script/coverage\n# Generate test "
  },
  {
    "path": "scripts/download-release.sh",
    "chars": 1527,
    "preview": "#!/bin/sh\nCOMMAND_NAME=${1:-terraform}\nTARGETPLATFORM=${2:-\"linux/amd64\"}\nDEFAULT_VERSION=${3:-\"1.8.0\"}\nAVAILABLE_VERSIO"
  },
  {
    "path": "scripts/e2e.sh",
    "chars": 2129,
    "preview": "#!/usr/bin/env bash\n\nset -euo pipefail\nIFS=$'\\n\\t'\nATLANTIS_PID=\"\"\nNGROK_PID=\"\"\n\nfunction cleanup() {\n    cleanupPid \"$A"
  },
  {
    "path": "scripts/fmt.sh",
    "chars": 519,
    "preview": "#!/usr/bin/env bash\n\nset -euo pipefail\n\ngo install golang.org/x/tools/cmd/goimports@latest\n\ngobin=\"$(go env GOPATH)/bin\""
  },
  {
    "path": "scripts/go-generate.sh",
    "chars": 191,
    "preview": "#!/bin/bash\n\nset -eou pipefail\n\npkgs=$(go list ./... | grep -v mocks | grep -v matchers | grep -v e2e | grep -v static)\n"
  },
  {
    "path": "scripts/pin_ci_terraform_providers.sh",
    "chars": 2047,
    "preview": "#!/bin/bash\n\n# Script to pin terraform providers in e2e tests\n\nRANDOM_PROVIDER_VERSION=\"3.6.1\"\nNULL_PROVIDER_VERSION=\"3."
  },
  {
    "path": "server/controllers/api_controller.go",
    "chars": 13514,
    "preview": "// Copyright 2025 The Atlantis Authors\n// SPDX-License-Identifier: Apache-2.0\n\npackage controllers\n\nimport (\n\t\"encoding/"
  },
  {
    "path": "server/controllers/api_controller_test.go",
    "chars": 12516,
    "preview": "// Copyright 2025 The Atlantis Authors\n// SPDX-License-Identifier: Apache-2.0\n\npackage controllers_test\n\nimport (\n\t\"byte"
  },
  {
    "path": "server/controllers/events/azuredevops_request_validator.go",
    "chars": 2227,
    "preview": "// Copyright 2025 The Atlantis Authors\n// SPDX-License-Identifier: Apache-2.0\n\npackage events\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"n"
  },
  {
    "path": "server/controllers/events/azuredevops_request_validator_test.go",
    "chars": 2535,
    "preview": "// Copyright 2025 The Atlantis Authors\n// SPDX-License-Identifier: Apache-2.0\n\npackage events_test\n\nimport (\n\t\"bytes\"\n\t\""
  },
  {
    "path": "server/controllers/events/events_controller.go",
    "chars": 36894,
    "preview": "// Copyright 2017 HootSuite Media Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the License);\n// you may no"
  },
  {
    "path": "server/controllers/events/events_controller_e2e_test.go",
    "chars": 63770,
    "preview": "// Copyright 2025 The Atlantis Authors\n// SPDX-License-Identifier: Apache-2.0\n\npackage events_test\n\nimport (\n\t\"bytes\"\n\t\""
  },
  {
    "path": "server/controllers/events/events_controller_test.go",
    "chars": 41812,
    "preview": "// Copyright 2017 HootSuite Media Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the License);\n// you may no"
  },
  {
    "path": "server/controllers/events/github_request_validator.go",
    "chars": 2825,
    "preview": "// Copyright 2017 HootSuite Media Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the License);\n// you may no"
  },
  {
    "path": "server/controllers/events/github_request_validator_test.go",
    "chars": 4154,
    "preview": "// Copyright 2017 HootSuite Media Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the License);\n// you may no"
  },
  {
    "path": "server/controllers/events/gitlab_request_parser_validator.go",
    "chars": 3609,
    "preview": "// Copyright 2017 HootSuite Media Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the License);\n// you may no"
  },
  {
    "path": "server/controllers/events/gitlab_request_parser_validator_test.go",
    "chars": 17315,
    "preview": "// Copyright 2017 HootSuite Media Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the License);\n// you may no"
  },
  {
    "path": "server/controllers/events/mocks/mock_azuredevops_request_validator.go",
    "chars": 4680,
    "preview": "// Code generated by pegomock. DO NOT EDIT.\n// Source: github.com/runatlantis/atlantis/server/controllers/events (interf"
  },
  {
    "path": "server/controllers/events/mocks/mock_github_request_validator.go",
    "chars": 4298,
    "preview": "// Code generated by pegomock. DO NOT EDIT.\n// Source: github.com/runatlantis/atlantis/server/controllers/events (interf"
  },
  {
    "path": "server/controllers/events/mocks/mock_gitlab_request_parser_validator.go",
    "chars": 4570,
    "preview": "// Code generated by pegomock. DO NOT EDIT.\n// Source: github.com/runatlantis/atlantis/server/controllers/events (interf"
  },
  {
    "path": "server/controllers/events/testdata/bb-server-pull-deleted-event.json",
    "chars": 2255,
    "preview": "{\n  \"eventKey\":\"pr:deleted\",\n  \"date\":\"2017-09-19T11:16:17+1000\",\n  \"actor\":{\n    \"name\":\"admin\",\n    \"emailAddress\":\"ad"
  },
  {
    "path": "server/controllers/events/testdata/githubIssueCommentEvent.json",
    "chars": 11048,
    "preview": "{\n  \"action\": \"created\",\n  \"issue\": {\n    \"url\": \"https://api.github.com/repos/runatlantis/atlantis-tests/issues/1\",\n   "
  },
  {
    "path": "server/controllers/events/testdata/githubIssueCommentEvent_notAllowlisted.json",
    "chars": 10307,
    "preview": "{\n  \"action\": \"created\",\n  \"issue\": {\n    \"url\": \"https://api.github.com/repos/baxterthehacker/public-repo/issues/2\",\n  "
  },
  {
    "path": "server/controllers/events/testdata/githubPullRequestClosedEvent.json",
    "chars": 26078,
    "preview": "{\n  \"action\": \"closed\",\n  \"number\": 2,\n  \"pull_request\": {\n    \"url\": \"https://api.github.com/repos/runatlantis/atlantis"
  },
  {
    "path": "server/controllers/events/testdata/githubPullRequestOpenedEvent.json",
    "chars": 25992,
    "preview": "{\n  \"action\": \"opened\",\n  \"number\": 2,\n  \"pull_request\": {\n    \"url\": \"https://api.github.com/repos/runatlantis/atlantis"
  },
  {
    "path": "server/controllers/events/testdata/gitlabMergeCommentEvent_notAllowlisted.json",
    "chars": 4305,
    "preview": "{\n  \"object_kind\": \"note\",\n  \"user\": {\n    \"name\": \"Administrator\",\n    \"username\": \"root\",\n    \"avatar_url\": \"http://ww"
  },
  {
    "path": "server/controllers/events/testdata/gitlabMergeCommentEvent_shouldIgnore.json",
    "chars": 4311,
    "preview": "{\n  \"object_kind\": \"note\",\n  \"user\": {\n    \"name\": \"Administrator\",\n    \"username\": \"root\",\n    \"avatar_url\": \"http://ww"
  },
  {
    "path": "server/controllers/events/testdata/null_provider_lockfile_old_version",
    "chars": 1345,
    "preview": "# This file is maintained automatically by \"terraform init\".\n# Manual edits may be lost in future updates.\n\nprovider \"re"
  },
  {
    "path": "server/controllers/events/testdata/test-repos/automerge/atlantis.yaml",
    "chars": 61,
    "preview": "version: 3\nautomerge: true\nprojects:\n- dir: dir1\n- dir: dir2\n"
  },
  {
    "path": "server/controllers/events/testdata/test-repos/automerge/dir1/main.tf",
    "chars": 53,
    "preview": "resource \"null_resource\" \"automerge\" {\n  count = 1\n}\n"
  },
  {
    "path": "server/controllers/events/testdata/test-repos/automerge/dir1/versions.tf",
    "chars": 117,
    "preview": "terraform {\n  required_providers {\n    null = {\n      source  = \"hashicorp/null\"\n      version = \"3.2.4\"\n    }\n  }\n}\n"
  },
  {
    "path": "server/controllers/events/testdata/test-repos/automerge/dir2/main.tf",
    "chars": 53,
    "preview": "resource \"null_resource\" \"automerge\" {\n  count = 1\n}\n"
  },
  {
    "path": "server/controllers/events/testdata/test-repos/automerge/dir2/versions.tf",
    "chars": 117,
    "preview": "terraform {\n  required_providers {\n    null = {\n      source  = \"hashicorp/null\"\n      version = \"3.2.4\"\n    }\n  }\n}\n"
  },
  {
    "path": "server/controllers/events/testdata/test-repos/automerge/exp-output-apply-dir1.txt",
    "chars": 240,
    "preview": "Ran Apply for dir: `dir1` workspace: `default`\n\n```diff\nnull_resource.automerge[0]: Creating...\nnull_resource.automerge["
  },
  {
    "path": "server/controllers/events/testdata/test-repos/automerge/exp-output-apply-dir2.txt",
    "chars": 240,
    "preview": "Ran Apply for dir: `dir2` workspace: `default`\n\n```diff\nnull_resource.automerge[0]: Creating...\nnull_resource.automerge["
  },
  {
    "path": "server/controllers/events/testdata/test-repos/automerge/exp-output-automerge.txt",
    "chars": 72,
    "preview": "Automatically merging because all plans have been successfully applied.\n"
  },
  {
    "path": "server/controllers/events/testdata/test-repos/automerge/exp-output-autoplan.txt",
    "chars": 1816,
    "preview": "Ran Plan for 2 projects:\n\n1. dir: `dir1` workspace: `default`\n1. dir: `dir2` workspace: `default`\n---\n\n### 1. dir: `dir1"
  },
  {
    "path": "server/controllers/events/testdata/test-repos/automerge/exp-output-merge.txt",
    "chars": 158,
    "preview": "Locks and plans deleted for the projects and workspaces modified in this pull request:\n\n- dir: `dir1` workspace: `defaul"
  },
  {
    "path": "server/controllers/events/testdata/test-repos/import-multiple-project/atlantis.yaml",
    "chars": 45,
    "preview": "version: 3\nprojects:\n- dir: dir1\n- dir: dir2\n"
  },
  {
    "path": "server/controllers/events/testdata/test-repos/import-multiple-project/dir1/main.tf",
    "chars": 52,
    "preview": "resource \"random_id\" \"dummy1\" {\n  byte_length = 1\n}\n"
  },
  {
    "path": "server/controllers/events/testdata/test-repos/import-multiple-project/dir1/versions.tf",
    "chars": 142,
    "preview": "provider \"random\" {}\nterraform {\n  required_providers {\n    random = {\n      source  = \"hashicorp/random\"\n      version "
  },
  {
    "path": "server/controllers/events/testdata/test-repos/import-multiple-project/dir2/main.tf",
    "chars": 52,
    "preview": "resource \"random_id\" \"dummy2\" {\n  byte_length = 1\n}\n"
  },
  {
    "path": "server/controllers/events/testdata/test-repos/import-multiple-project/dir2/versions.tf",
    "chars": 142,
    "preview": "provider \"random\" {}\nterraform {\n  required_providers {\n    random = {\n      source  = \"hashicorp/random\"\n      version "
  },
  {
    "path": "server/controllers/events/testdata/test-repos/import-multiple-project/exp-output-autoplan.txt",
    "chars": 2375,
    "preview": "Ran Plan for 2 projects:\n\n1. dir: `dir1` workspace: `default`\n1. dir: `dir2` workspace: `default`\n---\n\n### 1. dir: `dir1"
  },
  {
    "path": "server/controllers/events/testdata/test-repos/import-multiple-project/exp-output-import-dummy1.txt",
    "chars": 572,
    "preview": "Ran Import for dir: `dir1` workspace: `default`\n\n```diff\nrandom_id.dummy1: Importing from ID \"AA\"...\nrandom_id.dummy1: I"
  }
]

// ... and 815 more files (download for full content)

About this extraction

This page contains the full source code of the runatlantis/atlantis GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1015 files (4.8 MB), approximately 1.3M tokens, and a symbol index with 5213 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!