Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package terragrunt for openSUSE:Factory checked in at 2023-06-11 19:55:15 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/terragrunt (Old) and /work/SRC/openSUSE:Factory/.terragrunt.new.15902 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "terragrunt" Sun Jun 11 19:55:15 2023 rev:51 rq:1091992 version:0.46.1 Changes: -------- --- /work/SRC/openSUSE:Factory/terragrunt/terragrunt.changes 2023-06-01 17:19:51.582281062 +0200 +++ /work/SRC/openSUSE:Factory/.terragrunt.new.15902/terragrunt.changes 2023-06-11 19:57:59.048138030 +0200 @@ -1,0 +2,12 @@ +Fri Jun 02 04:50:38 UTC 2023 - ka...@b1-systems.de + +- Update to version 0.46.1: + * Fixed reading of outputs during destroy (#2589) + +------------------------------------------------------------------- +Fri Jun 02 04:49:13 UTC 2023 - ka...@b1-systems.de + +- Update to version 0.46.0: + * fix: redirecting stdout to stderr in hook commands (#2587) + +------------------------------------------------------------------- Old: ---- terragrunt-0.45.18.obscpio New: ---- terragrunt-0.46.1.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ terragrunt.spec ++++++ --- /var/tmp/diff_new_pack.WY32x3/_old 2023-06-11 19:57:59.836142783 +0200 +++ /var/tmp/diff_new_pack.WY32x3/_new 2023-06-11 19:57:59.840142806 +0200 @@ -19,7 +19,7 @@ %define __arch_install_post export NO_BRP_STRIP_DEBUG=true Name: terragrunt -Version: 0.45.18 +Version: 0.46.1 Release: 0 Summary: Thin wrapper for Terraform for working with multiple Terraform modules License: MIT ++++++ _service ++++++ --- /var/tmp/diff_new_pack.WY32x3/_old 2023-06-11 19:57:59.876143024 +0200 +++ /var/tmp/diff_new_pack.WY32x3/_new 2023-06-11 19:57:59.880143047 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/gruntwork-io/terragrunt</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v0.45.18</param> + <param name="revision">v0.46.1</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">enable</param> <param name="versionrewrite-pattern">v(.*)</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.WY32x3/_old 2023-06-11 19:57:59.900143168 +0200 +++ /var/tmp/diff_new_pack.WY32x3/_new 2023-06-11 19:57:59.904143193 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/gruntwork-io/terragrunt</param> - <param name="changesrevision">1494e777b1f2ce18797ce1c9e46859bdef7f33ed</param></service></servicedata> + <param name="changesrevision">e190fa3d9a0a92c32fd5d031851775a702179db7</param></service></servicedata> (No newline at EOF) ++++++ terragrunt-0.45.18.obscpio -> terragrunt-0.46.1.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.45.18/cli/cli_app.go new/terragrunt-0.46.1/cli/cli_app.go --- old/terragrunt-0.45.18/cli/cli_app.go 2023-05-31 13:37:00.000000000 +0200 +++ new/terragrunt-0.46.1/cli/cli_app.go 2023-06-01 20:15:40.000000000 +0200 @@ -705,12 +705,18 @@ workingDir = *curHook.WorkingDir } + var suppressStdout bool + if curHook.SuppressStdout != nil && *curHook.SuppressStdout { + suppressStdout = true + } + actionToExecute := curHook.Execute[0] actionParams := curHook.Execute[1:] + _, possibleError := shell.RunShellCommandWithOutput( terragruntOptions, workingDir, - false, + suppressStdout, false, actionToExecute, actionParams..., ) @@ -765,6 +771,11 @@ workingDir = *curHook.WorkingDir } + var suppressStdout bool + if curHook.SuppressStdout != nil && *curHook.SuppressStdout { + suppressStdout = true + } + actionToExecute := curHook.Execute[0] actionParams := curHook.Execute[1:] @@ -776,7 +787,7 @@ _, possibleError := shell.RunShellCommandWithOutput( terragruntOptions, workingDir, - false, + suppressStdout, false, actionToExecute, actionParams..., ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.45.18/config/config.go new/terragrunt-0.46.1/config/config.go --- old/terragrunt-0.45.18/config/config.go 2023-05-31 13:37:00.000000000 +0200 +++ new/terragrunt-0.46.1/config/config.go 2023-06-01 20:15:40.000000000 +0200 @@ -328,19 +328,21 @@ // Hook specifies terraform commands (apply/plan) and array of os commands to execute type Hook struct { - Name string `hcl:"name,label" cty:"name"` - Commands []string `hcl:"commands,attr" cty:"commands"` - Execute []string `hcl:"execute,attr" cty:"execute"` - RunOnError *bool `hcl:"run_on_error,attr" cty:"run_on_error"` - WorkingDir *string `hcl:"working_dir,attr" cty:"working_dir"` + Name string `hcl:"name,label" cty:"name"` + Commands []string `hcl:"commands,attr" cty:"commands"` + Execute []string `hcl:"execute,attr" cty:"execute"` + RunOnError *bool `hcl:"run_on_error,attr" cty:"run_on_error"` + SuppressStdout *bool `hcl:"suppress_stdout,attr" cty:"suppress_stdout"` + WorkingDir *string `hcl:"working_dir,attr" cty:"working_dir"` } type ErrorHook struct { - Name string `hcl:"name,label" cty:"name"` - Commands []string `hcl:"commands,attr" cty:"commands"` - Execute []string `hcl:"execute,attr" cty:"execute"` - OnErrors []string `hcl:"on_errors,attr" cty:"on_errors"` - WorkingDir *string `hcl:"working_dir,attr" cty:"working_dir"` + Name string `hcl:"name,label" cty:"name"` + Commands []string `hcl:"commands,attr" cty:"commands"` + Execute []string `hcl:"execute,attr" cty:"execute"` + OnErrors []string `hcl:"on_errors,attr" cty:"on_errors"` + SuppressStdout *bool `hcl:"suppress_stdout,attr" cty:"suppress_stdout"` + WorkingDir *string `hcl:"working_dir,attr" cty:"working_dir"` } func (conf *Hook) String() string { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.45.18/config/dependency.go new/terragrunt-0.46.1/config/dependency.go --- old/terragrunt-0.45.18/config/dependency.go 2023-05-31 13:37:00.000000000 +0200 +++ new/terragrunt-0.46.1/config/dependency.go 2023-06-01 20:15:40.000000000 +0200 @@ -488,6 +488,8 @@ func cloneTerragruntOptionsForDependencyOutput(terragruntOptions *options.TerragruntOptions, targetConfig string) (*options.TerragruntOptions, error) { targetOptions := cloneTerragruntOptionsForDependency(terragruntOptions, targetConfig) targetOptions.IncludeModulePrefix = false + // just read outputs, so no need to check for dependent modules + targetOptions.CheckDependentModules = false targetOptions.TerraformCommand = "output" targetOptions.TerraformCliArgs = []string{"output", "-json"} @@ -819,7 +821,10 @@ return nil, errors.WithStackTrace(err) } - stdoutBufferWriter.Flush() + err = stdoutBufferWriter.Flush() + if err != nil { + return nil, errors.WithStackTrace(err) + } jsonString := stdoutBuffer.String() jsonBytes := []byte(strings.TrimSpace(jsonString)) targetTGOptions.Logger.Debugf("Retrieved output from %s as json: %s", targetConfig, jsonString) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.45.18/docs/_docs/04_reference/config-blocks-and-attributes.md new/terragrunt-0.46.1/docs/_docs/04_reference/config-blocks-and-attributes.md --- old/terragrunt-0.45.18/docs/_docs/04_reference/config-blocks-and-attributes.md 2023-05-31 13:37:00.000000000 +0200 +++ new/terragrunt-0.46.1/docs/_docs/04_reference/config-blocks-and-attributes.md 2023-06-01 20:15:40.000000000 +0200 @@ -100,6 +100,7 @@ `terragrunt-read-config` and `init-from-module` hooks, and the terraform module directory for other command hooks. - `run_on_error` (optional) : If set to true, this hook will run even if a previous hook hit an error, or in the case of "after" hooks, if the Terraform command hit an error. Default is false. + - `suppress_stdout` (optional) : If set to true, the stdout output of the executed commands will be suppressed. This can be useful when there are scripts relying on terraform's output and any other output would break their parsing. - `after_hook` (block): Nested blocks used to specify command hooks that should be run after `terraform` is called. Hooks run from the terragrunt configuration directory (the directory where `terragrunt.hcl` lives). Supports the same diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.45.18/shell/run_shell_cmd.go new/terragrunt-0.46.1/shell/run_shell_cmd.go --- old/terragrunt-0.45.18/shell/run_shell_cmd.go 2023-05-31 13:37:00.000000000 +0200 +++ new/terragrunt-0.46.1/shell/run_shell_cmd.go 2023-06-01 20:15:40.000000000 +0200 @@ -7,7 +7,6 @@ "os" "os/exec" "os/signal" - "reflect" "strings" "syscall" "time" @@ -84,12 +83,6 @@ if terragruntOptions.IncludeModulePrefix { prefix = terragruntOptions.OutputPrefix } - // Terragrunt can run some commands (such as terraform remote config) before running the actual terraform - // command requested by the user. The output of these other commands should not end up on stdout as this - // breaks scripts relying on terraform's output. - if !reflect.DeepEqual(terragruntOptions.TerraformCliArgs, args) { - outWriter = terragruntOptions.ErrWriter - } if workingDir == "" { cmd.Dir = terragruntOptions.WorkingDir diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.45.18/shell/run_shell_cmd_test.go new/terragrunt-0.46.1/shell/run_shell_cmd_test.go --- old/terragrunt-0.45.18/shell/run_shell_cmd_test.go 2023-05-31 13:37:00.000000000 +0200 +++ new/terragrunt-0.46.1/shell/run_shell_cmd_test.go 2023-06-01 20:15:40.000000000 +0200 @@ -44,7 +44,7 @@ stderr = new(bytes.Buffer) terragruntOptions.TerraformCliArgs = []string{} - terragruntOptions.Writer = stdout + terragruntOptions.Writer = stderr terragruntOptions.ErrWriter = stderr cmd = RunShellCommand(terragruntOptions, "terraform", "--version") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.45.18/test/fixture-destroy-dependent-module/a/main.tf new/terragrunt-0.46.1/test/fixture-destroy-dependent-module/a/main.tf --- old/terragrunt-0.45.18/test/fixture-destroy-dependent-module/a/main.tf 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.46.1/test/fixture-destroy-dependent-module/a/main.tf 2023-06-01 20:15:40.000000000 +0200 @@ -0,0 +1,9 @@ +resource "local_file" "file" { + content = "module-a" + filename = "module-a.txt" + file_permission = "0644" +} + +output "value" { + value = local_file.file.filename +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.45.18/test/fixture-destroy-dependent-module/b/main.tf new/terragrunt-0.46.1/test/fixture-destroy-dependent-module/b/main.tf --- old/terragrunt-0.45.18/test/fixture-destroy-dependent-module/b/main.tf 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.46.1/test/fixture-destroy-dependent-module/b/main.tf 2023-06-01 20:15:40.000000000 +0200 @@ -0,0 +1,9 @@ +resource "local_file" "file" { + content = "module-b" + filename = "module-b.txt" + file_permission = "0644" +} + +output "value" { + value = local_file.file.filename +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.45.18/test/fixture-destroy-dependent-module/c/main.tf new/terragrunt-0.46.1/test/fixture-destroy-dependent-module/c/main.tf --- old/terragrunt-0.45.18/test/fixture-destroy-dependent-module/c/main.tf 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.46.1/test/fixture-destroy-dependent-module/c/main.tf 2023-06-01 20:15:40.000000000 +0200 @@ -0,0 +1,9 @@ +resource "local_file" "file" { + content = "module-c" + filename = "module-c.txt" + file_permission = "0644" +} + +output "value" { + value = local_file.file.filename +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.45.18/test/fixture-destroy-dependent-module/c/terragrunt.hcl new/terragrunt-0.46.1/test/fixture-destroy-dependent-module/c/terragrunt.hcl --- old/terragrunt-0.45.18/test/fixture-destroy-dependent-module/c/terragrunt.hcl 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.46.1/test/fixture-destroy-dependent-module/c/terragrunt.hcl 2023-06-01 20:15:40.000000000 +0200 @@ -0,0 +1,13 @@ +dependency "a" { + config_path = "../a" +} + +dependency "b" { + config_path = "../b" +} + +inputs = { + test_a_arn = dependency.a.outputs.value + test_b_arn = dependency.b.outputs.value +} + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.45.18/test/fixture-hooks/init-once/with-source-no-backend-suppress-hook-stdout/terragrunt.hcl new/terragrunt-0.46.1/test/fixture-hooks/init-once/with-source-no-backend-suppress-hook-stdout/terragrunt.hcl --- old/terragrunt-0.45.18/test/fixture-hooks/init-once/with-source-no-backend-suppress-hook-stdout/terragrunt.hcl 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.46.1/test/fixture-hooks/init-once/with-source-no-backend-suppress-hook-stdout/terragrunt.hcl 2023-06-01 20:15:40.000000000 +0200 @@ -0,0 +1,19 @@ +terraform { + source = "../base-module" + + # SHOULD execute. + # If AFTER_INIT_FROM_MODULE_ONLY_ONCE is not echoed exactly once, the test failed + after_hook "after_init_from_module" { + commands = ["init-from-module"] + execute = ["echo","AFTER_INIT_FROM_MODULE_ONLY_ONCE"] + suppress_stdout = true + } + + # SHOULD execute. + # If AFTER_INIT_ONLY_ONCE is not echoed exactly once, the test failed + after_hook "after_init" { + commands = ["init"] + execute = ["echo","AFTER_INIT_ONLY_ONCE"] + suppress_stdout = true + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.45.18/test/integration_test.go new/terragrunt-0.46.1/test/integration_test.go --- old/terragrunt-0.45.18/test/integration_test.go 2023-05-31 13:37:00.000000000 +0200 +++ new/terragrunt-0.46.1/test/integration_test.go 2023-06-01 20:15:40.000000000 +0200 @@ -49,109 +49,110 @@ // hard-code this to match the test fixture for now const ( - TERRAFORM_REMOTE_STATE_S3_REGION = "us-west-2" - TERRAFORM_REMOTE_STATE_GCP_REGION = "eu" - TEST_FIXTURE_PATH = "fixture/" - TEST_FIXTURE_CODEGEN_PATH = "fixture-codegen" - TEST_FIXTURE_GCS_PATH = "fixture-gcs/" - TEST_FIXTURE_GCS_BYO_BUCKET_PATH = "fixture-gcs-byo-bucket/" - TEST_FIXTURE_STACK = "fixture-stack/" - TEST_FIXTURE_GRAPH_DEPENDENCIES = "fixture-graph-dependencies" - TEST_FIXTURE_OUTPUT_ALL = "fixture-output-all" - TEST_FIXTURE_OUTPUT_FROM_REMOTE_STATE = "fixture-output-from-remote-state" - TEST_FIXTURE_OUTPUT_FROM_DEPENDENCY = "fixture-output-from-dependency" - TEST_FIXTURE_STDOUT = "fixture-download/stdout-test" - TEST_FIXTURE_EXTRA_ARGS_PATH = "fixture-extra-args/" - TEST_FIXTURE_ENV_VARS_BLOCK_PATH = "fixture-env-vars-block/" - TEST_FIXTURE_SKIP = "fixture-skip/" - TEST_FIXTURE_CONFIG_SINGLE_JSON_PATH = "fixture-config-files/single-json-config" - TEST_FIXTURE_PREVENT_DESTROY_OVERRIDE = "fixture-prevent-destroy-override/child" - TEST_FIXTURE_PREVENT_DESTROY_NOT_SET = "fixture-prevent-destroy-not-set/child" - TEST_FIXTURE_LOCAL_PREVENT_DESTROY = "fixture-download/local-with-prevent-destroy" - TEST_FIXTURE_LOCAL_PREVENT_DESTROY_DEPENDENCIES = "fixture-download/local-with-prevent-destroy-dependencies" - TEST_FIXTURE_LOCAL_INCLUDE_PREVENT_DESTROY_DEPENDENCIES = "fixture-download/local-include-with-prevent-destroy-dependencies" - TEST_FIXTURE_NOT_EXISTING_SOURCE = "fixture-download/invalid-path" - TEST_FIXTURE_EXTERNAL_DEPENDENCIE = "fixture-external-dependencies" - TEST_FIXTURE_MISSING_DEPENDENCIE = "fixture-missing-dependencies/main" - TEST_FIXTURE_GET_OUTPUT = "fixture-get-output" - TEST_FIXTURE_HOOKS_BEFORE_ONLY_PATH = "fixture-hooks/before-only" - TEST_FIXTURE_HOOKS_ALL_PATH = "fixture-hooks/all" - TEST_FIXTURE_HOOKS_AFTER_ONLY_PATH = "fixture-hooks/after-only" - TEST_FIXTURE_HOOKS_BEFORE_AND_AFTER_PATH = "fixture-hooks/before-and-after" - TEST_FIXTURE_HOOKS_BEFORE_AFTER_AND_ERROR_MERGE_PATH = "fixture-hooks/before-after-and-error-merge" - TEST_FIXTURE_HOOKS_SKIP_ON_ERROR_PATH = "fixture-hooks/skip-on-error" - TEST_FIXTURE_ERROR_HOOKS_PATH = "fixture-hooks/error-hooks" - TEST_FIXTURE_HOOKS_ONE_ARG_ACTION_PATH = "fixture-hooks/one-arg-action" - TEST_FIXTURE_HOOKS_EMPTY_STRING_COMMAND_PATH = "fixture-hooks/bad-arg-action/empty-string-command" - TEST_FIXTURE_HOOKS_EMPTY_COMMAND_LIST_PATH = "fixture-hooks/bad-arg-action/empty-command-list" - TEST_FIXTURE_HOOKS_INTERPOLATIONS_PATH = "fixture-hooks/interpolations" - TEST_FIXTURE_HOOKS_INIT_ONCE_NO_SOURCE_NO_BACKEND = "fixture-hooks/init-once/no-source-no-backend" - TEST_FIXTURE_HOOKS_INIT_ONCE_NO_SOURCE_WITH_BACKEND = "fixture-hooks/init-once/no-source-with-backend" - TEST_FIXTURE_HOOKS_INIT_ONCE_WITH_SOURCE_NO_BACKEND = "fixture-hooks/init-once/with-source-no-backend" - TEST_FIXTURE_HOOKS_INIT_ONCE_WITH_SOURCE_WITH_BACKEND = "fixture-hooks/init-once/with-source-with-backend" - TEST_FIXTURE_HOOKS_WORKING_DIR = "fixture-hooks/working_dir" - TEST_FIXTURE_FAILED_TERRAFORM = "fixture-failure" - TEST_FIXTURE_EXIT_CODE = "fixture-exit-code" - TEST_FIXTURE_AUTO_RETRY_RERUN = "fixture-auto-retry/re-run" - TEST_FIXTURE_AUTO_RETRY_EXHAUST = "fixture-auto-retry/exhaust" - TEST_FIXTURE_AUTO_RETRY_CUSTOM_ERRORS = "fixture-auto-retry/custom-errors" - TEST_FIXTURE_AUTO_RETRY_CUSTOM_ERRORS_NOT_SET = "fixture-auto-retry/custom-errors-not-set" - TEST_FIXTURE_AUTO_RETRY_APPLY_ALL_RETRIES = "fixture-auto-retry/apply-all" - TEST_FIXTURE_AUTO_RETRY_CONFIGURABLE_RETRIES = "fixture-auto-retry/configurable-retries" - TEST_FIXTURE_AUTO_RETRY_CONFIGURABLE_RETRIES_ERROR_1 = "fixture-auto-retry/configurable-retries-incorrect-retry-attempts" - TEST_FIXTURE_AUTO_RETRY_CONFIGURABLE_RETRIES_ERROR_2 = "fixture-auto-retry/configurable-retries-incorrect-sleep-interval" - TEST_FIXTURE_AWS_PROVIDER_PATCH = "fixture-aws-provider-patch" - TEST_FIXTURE_INPUTS = "fixture-inputs" - TEST_FIXTURE_LOCALS_ERROR_UNDEFINED_LOCAL = "fixture-locals-errors/undefined-local" - TEST_FIXTURE_LOCALS_ERROR_UNDEFINED_LOCAL_BUT_INPUT = "fixture-locals-errors/undefined-local-but-input" - TEST_FIXTURE_LOCALS_CANONICAL = "fixture-locals/canonical" - TEST_FIXTURE_LOCALS_IN_INCLUDE = "fixture-locals/local-in-include" - TEST_FIXTURE_LOCAL_RUN_ONCE = "fixture-locals/run-once" - TEST_FIXTURE_LOCAL_RUN_MULTIPLE = "fixture-locals/run-multiple" - TEST_FIXTURE_LOCALS_IN_INCLUDE_CHILD_REL_PATH = "qa/my-app" - TEST_FIXTURE_READ_CONFIG = "fixture-read-config" - TEST_FIXTURE_READ_IAM_ROLE = "fixture-read-config/iam_role_in_file" - TEST_FIXTURE_IAM_ROLES_MULTIPLE_MODULES = "fixture-read-config/iam_roles_multiple_modules" - TEST_FIXTURE_RELATIVE_INCLUDE_CMD = "fixture-relative-include-cmd" - TEST_FIXTURE_AWS_GET_CALLER_IDENTITY = "fixture-get-aws-caller-identity" - TEST_FIXTURE_GET_REPO_ROOT = "fixture-get-repo-root" - TEST_FIXTURE_PATH_RELATIVE_FROM_INCLUDE = "fixture-get-path/fixture-path_relative_from_include" - TEST_FIXTURE_GET_PATH_FROM_REPO_ROOT = "fixture-get-path/fixture-get-path-from-repo-root" - TEST_FIXTURE_GET_PATH_TO_REPO_ROOT = "fixture-get-path/fixture-get-path-to-repo-root" - TEST_FIXTURE_GET_PLATFORM = "fixture-get-platform" - TEST_FIXTURE_GET_TERRAGRUNT_SOURCE_HCL = "fixture-get-terragrunt-source-hcl" - TEST_FIXTURE_GET_TERRAGRUNT_SOURCE_CLI = "fixture-get-terragrunt-source-cli" - TEST_FIXTURE_REGRESSIONS = "fixture-regressions" - TEST_FIXTURE_PLANFILE_ORDER = "fixture-planfile-order-test" - TEST_FIXTURE_DIRS_PATH = "fixture-dirs" - TEST_FIXTURE_PARALLELISM = "fixture-parallelism" - TEST_FIXTURE_SOPS = "fixture-sops" - TEST_FIXTURE_DESTROY_WARNING = "fixture-destroy-warning" - TEST_FIXTURE_INCLUDE_PARENT = "fixture-include-parent" - TEST_FIXTURE_AUTO_INIT = "fixture-download/init-on-source-change" - TEST_FIXTURE_DISJOINT = "fixture-stack/disjoint" - TEST_FIXTURE_BROKEN_LOCALS = "fixture-broken-locals" - TEST_FIXTURE_BROKEN_DEPENDENCY = "fixture-broken-dependency" - TEST_FIXTURE_RENDER_JSON_METADATA = "fixture-render-json-metadata" - TEST_FIXTURE_RENDER_JSON_MOCK_OUTPUTS = "fixture-render-json-mock-outputs" - TEST_FIXTURE_STARTSWITH = "fixture-startswith" - TEST_FIXTURE_TIMECMP = "fixture-timecmp" - TEST_FIXTURE_TIMECMP_INVALID_TIMESTAMP = "fixture-timecmp-errors/invalid-timestamp" - TEST_FIXTURE_ENDSWITH = "fixture-endswith" - TEST_FIXTURE_TFLINT_NO_ISSUES_FOUND = "fixture-tflint/no-issues-found" - TEST_FIXTURE_TFLINT_ISSUES_FOUND = "fixture-tflint/issues-found" - TEST_FIXTURE_TFLINT_NO_CONFIG_FILE = "fixture-tflint/no-config-file" - TEST_FIXTURE_TFLINT_MODULE_FOUND = "fixture-tflint/module-found" - TEST_FIXTURE_TFLINT_NO_TF_SOURCE_PATH = "fixture-tflint/no-tf-source" - TEST_FIXTURE_PARALLEL_RUN = "fixture-parallel-run" - TEST_FIXTURE_INIT_ERROR = "fixture-init-error" - TEST_FIXTURE_MODULE_PATH_ERROR = "fixture-module-path-in-error" - TEST_FIXTURE_HCLFMT_DIFF = "fixture-hclfmt-diff" - TERRAFORM_BINARY = "terraform" - TERRAFORM_FOLDER = ".terraform" - TERRAFORM_STATE = "terraform.tfstate" - TERRAFORM_STATE_BACKUP = "terraform.tfstate.backup" - TERRAGRUNT_CACHE = ".terragrunt-cache" + TERRAFORM_REMOTE_STATE_S3_REGION = "us-west-2" + TERRAFORM_REMOTE_STATE_GCP_REGION = "eu" + TEST_FIXTURE_PATH = "fixture/" + TEST_FIXTURE_CODEGEN_PATH = "fixture-codegen" + TEST_FIXTURE_GCS_PATH = "fixture-gcs/" + TEST_FIXTURE_GCS_BYO_BUCKET_PATH = "fixture-gcs-byo-bucket/" + TEST_FIXTURE_STACK = "fixture-stack/" + TEST_FIXTURE_GRAPH_DEPENDENCIES = "fixture-graph-dependencies" + TEST_FIXTURE_OUTPUT_ALL = "fixture-output-all" + TEST_FIXTURE_OUTPUT_FROM_REMOTE_STATE = "fixture-output-from-remote-state" + TEST_FIXTURE_OUTPUT_FROM_DEPENDENCY = "fixture-output-from-dependency" + TEST_FIXTURE_STDOUT = "fixture-download/stdout-test" + TEST_FIXTURE_EXTRA_ARGS_PATH = "fixture-extra-args/" + TEST_FIXTURE_ENV_VARS_BLOCK_PATH = "fixture-env-vars-block/" + TEST_FIXTURE_SKIP = "fixture-skip/" + TEST_FIXTURE_CONFIG_SINGLE_JSON_PATH = "fixture-config-files/single-json-config" + TEST_FIXTURE_PREVENT_DESTROY_OVERRIDE = "fixture-prevent-destroy-override/child" + TEST_FIXTURE_PREVENT_DESTROY_NOT_SET = "fixture-prevent-destroy-not-set/child" + TEST_FIXTURE_LOCAL_PREVENT_DESTROY = "fixture-download/local-with-prevent-destroy" + TEST_FIXTURE_LOCAL_PREVENT_DESTROY_DEPENDENCIES = "fixture-download/local-with-prevent-destroy-dependencies" + TEST_FIXTURE_LOCAL_INCLUDE_PREVENT_DESTROY_DEPENDENCIES = "fixture-download/local-include-with-prevent-destroy-dependencies" + TEST_FIXTURE_NOT_EXISTING_SOURCE = "fixture-download/invalid-path" + TEST_FIXTURE_EXTERNAL_DEPENDENCIE = "fixture-external-dependencies" + TEST_FIXTURE_MISSING_DEPENDENCIE = "fixture-missing-dependencies/main" + TEST_FIXTURE_GET_OUTPUT = "fixture-get-output" + TEST_FIXTURE_HOOKS_BEFORE_ONLY_PATH = "fixture-hooks/before-only" + TEST_FIXTURE_HOOKS_ALL_PATH = "fixture-hooks/all" + TEST_FIXTURE_HOOKS_AFTER_ONLY_PATH = "fixture-hooks/after-only" + TEST_FIXTURE_HOOKS_BEFORE_AND_AFTER_PATH = "fixture-hooks/before-and-after" + TEST_FIXTURE_HOOKS_BEFORE_AFTER_AND_ERROR_MERGE_PATH = "fixture-hooks/before-after-and-error-merge" + TEST_FIXTURE_HOOKS_SKIP_ON_ERROR_PATH = "fixture-hooks/skip-on-error" + TEST_FIXTURE_ERROR_HOOKS_PATH = "fixture-hooks/error-hooks" + TEST_FIXTURE_HOOKS_ONE_ARG_ACTION_PATH = "fixture-hooks/one-arg-action" + TEST_FIXTURE_HOOKS_EMPTY_STRING_COMMAND_PATH = "fixture-hooks/bad-arg-action/empty-string-command" + TEST_FIXTURE_HOOKS_EMPTY_COMMAND_LIST_PATH = "fixture-hooks/bad-arg-action/empty-command-list" + TEST_FIXTURE_HOOKS_INTERPOLATIONS_PATH = "fixture-hooks/interpolations" + TEST_FIXTURE_HOOKS_INIT_ONCE_NO_SOURCE_NO_BACKEND = "fixture-hooks/init-once/no-source-no-backend" + TEST_FIXTURE_HOOKS_INIT_ONCE_NO_SOURCE_WITH_BACKEND = "fixture-hooks/init-once/no-source-with-backend" + TEST_FIXTURE_HOOKS_INIT_ONCE_WITH_SOURCE_NO_BACKEND = "fixture-hooks/init-once/with-source-no-backend" + TEST_FIXTURE_HOOKS_INIT_ONCE_WITH_SOURCE_NO_BACKEND_SUPPRESS_HOOK_STDOUT = "fixture-hooks/init-once/with-source-no-backend-suppress-hook-stdout" + TEST_FIXTURE_HOOKS_INIT_ONCE_WITH_SOURCE_WITH_BACKEND = "fixture-hooks/init-once/with-source-with-backend" + TEST_FIXTURE_FAILED_TERRAFORM = "fixture-failure" + TEST_FIXTURE_EXIT_CODE = "fixture-exit-code" + TEST_FIXTURE_AUTO_RETRY_RERUN = "fixture-auto-retry/re-run" + TEST_FIXTURE_AUTO_RETRY_EXHAUST = "fixture-auto-retry/exhaust" + TEST_FIXTURE_AUTO_RETRY_CUSTOM_ERRORS = "fixture-auto-retry/custom-errors" + TEST_FIXTURE_AUTO_RETRY_CUSTOM_ERRORS_NOT_SET = "fixture-auto-retry/custom-errors-not-set" + TEST_FIXTURE_AUTO_RETRY_APPLY_ALL_RETRIES = "fixture-auto-retry/apply-all" + TEST_FIXTURE_AUTO_RETRY_CONFIGURABLE_RETRIES = "fixture-auto-retry/configurable-retries" + TEST_FIXTURE_AUTO_RETRY_CONFIGURABLE_RETRIES_ERROR_1 = "fixture-auto-retry/configurable-retries-incorrect-retry-attempts" + TEST_FIXTURE_AUTO_RETRY_CONFIGURABLE_RETRIES_ERROR_2 = "fixture-auto-retry/configurable-retries-incorrect-sleep-interval" + TEST_FIXTURE_AWS_PROVIDER_PATCH = "fixture-aws-provider-patch" + TEST_FIXTURE_INPUTS = "fixture-inputs" + TEST_FIXTURE_LOCALS_ERROR_UNDEFINED_LOCAL = "fixture-locals-errors/undefined-local" + TEST_FIXTURE_LOCALS_ERROR_UNDEFINED_LOCAL_BUT_INPUT = "fixture-locals-errors/undefined-local-but-input" + TEST_FIXTURE_LOCALS_CANONICAL = "fixture-locals/canonical" + TEST_FIXTURE_LOCALS_IN_INCLUDE = "fixture-locals/local-in-include" + TEST_FIXTURE_LOCAL_RUN_ONCE = "fixture-locals/run-once" + TEST_FIXTURE_LOCAL_RUN_MULTIPLE = "fixture-locals/run-multiple" + TEST_FIXTURE_LOCALS_IN_INCLUDE_CHILD_REL_PATH = "qa/my-app" + TEST_FIXTURE_READ_CONFIG = "fixture-read-config" + TEST_FIXTURE_READ_IAM_ROLE = "fixture-read-config/iam_role_in_file" + TEST_FIXTURE_IAM_ROLES_MULTIPLE_MODULES = "fixture-read-config/iam_roles_multiple_modules" + TEST_FIXTURE_RELATIVE_INCLUDE_CMD = "fixture-relative-include-cmd" + TEST_FIXTURE_AWS_GET_CALLER_IDENTITY = "fixture-get-aws-caller-identity" + TEST_FIXTURE_GET_REPO_ROOT = "fixture-get-repo-root" + TEST_FIXTURE_PATH_RELATIVE_FROM_INCLUDE = "fixture-get-path/fixture-path_relative_from_include" + TEST_FIXTURE_GET_PATH_FROM_REPO_ROOT = "fixture-get-path/fixture-get-path-from-repo-root" + TEST_FIXTURE_GET_PATH_TO_REPO_ROOT = "fixture-get-path/fixture-get-path-to-repo-root" + TEST_FIXTURE_GET_PLATFORM = "fixture-get-platform" + TEST_FIXTURE_GET_TERRAGRUNT_SOURCE_HCL = "fixture-get-terragrunt-source-hcl" + TEST_FIXTURE_GET_TERRAGRUNT_SOURCE_CLI = "fixture-get-terragrunt-source-cli" + TEST_FIXTURE_REGRESSIONS = "fixture-regressions" + TEST_FIXTURE_PLANFILE_ORDER = "fixture-planfile-order-test" + TEST_FIXTURE_DIRS_PATH = "fixture-dirs" + TEST_FIXTURE_PARALLELISM = "fixture-parallelism" + TEST_FIXTURE_SOPS = "fixture-sops" + TEST_FIXTURE_DESTROY_WARNING = "fixture-destroy-warning" + TEST_FIXTURE_INCLUDE_PARENT = "fixture-include-parent" + TEST_FIXTURE_AUTO_INIT = "fixture-download/init-on-source-change" + TEST_FIXTURE_DISJOINT = "fixture-stack/disjoint" + TEST_FIXTURE_BROKEN_LOCALS = "fixture-broken-locals" + TEST_FIXTURE_BROKEN_DEPENDENCY = "fixture-broken-dependency" + TEST_FIXTURE_RENDER_JSON_METADATA = "fixture-render-json-metadata" + TEST_FIXTURE_RENDER_JSON_MOCK_OUTPUTS = "fixture-render-json-mock-outputs" + TEST_FIXTURE_STARTSWITH = "fixture-startswith" + TEST_FIXTURE_TIMECMP = "fixture-timecmp" + TEST_FIXTURE_TIMECMP_INVALID_TIMESTAMP = "fixture-timecmp-errors/invalid-timestamp" + TEST_FIXTURE_ENDSWITH = "fixture-endswith" + TEST_FIXTURE_TFLINT_NO_ISSUES_FOUND = "fixture-tflint/no-issues-found" + TEST_FIXTURE_TFLINT_ISSUES_FOUND = "fixture-tflint/issues-found" + TEST_FIXTURE_TFLINT_NO_CONFIG_FILE = "fixture-tflint/no-config-file" + TEST_FIXTURE_TFLINT_MODULE_FOUND = "fixture-tflint/module-found" + TEST_FIXTURE_TFLINT_NO_TF_SOURCE_PATH = "fixture-tflint/no-tf-source" + TEST_FIXTURE_PARALLEL_RUN = "fixture-parallel-run" + TEST_FIXTURE_INIT_ERROR = "fixture-init-error" + TEST_FIXTURE_MODULE_PATH_ERROR = "fixture-module-path-in-error" + TEST_FIXTURE_HCLFMT_DIFF = "fixture-hclfmt-diff" + TEST_FIXTURE_DESTROY_DEPENDENT_MODULE = "fixture-destroy-dependent-module" + TERRAFORM_BINARY = "terraform" + TERRAFORM_FOLDER = ".terraform" + TERRAFORM_STATE = "terraform.tfstate" + TERRAFORM_STATE_BACKUP = "terraform.tfstate.backup" + TERRAGRUNT_CACHE = ".terragrunt-cache" qaMyAppRelPath = "qa/my-app" fixtureDownload = "fixture-download" @@ -174,7 +175,7 @@ ) err := runTerragruntCommand(t, fmt.Sprintf("terragrunt apply -auto-approve --terragrunt-non-interactive --terragrunt-working-dir %s", rootPath), &stdout, &stderr) - output := stderr.String() + output := stdout.String() if err != nil { t.Errorf("Did not expect to get error: %s", err.Error()) @@ -205,8 +206,7 @@ ) err := runTerragruntCommand(t, fmt.Sprintf("terragrunt apply -auto-approve --terragrunt-non-interactive --terragrunt-working-dir %s", rootPath), &stdout, &stderr) - output := stderr.String() - + output := stdout.String() if err != nil { t.Errorf("Did not expect to get error: %s", err.Error()) } @@ -231,7 +231,7 @@ err := runTerragruntCommand(t, fmt.Sprintf("terragrunt apply -auto-approve --terragrunt-non-interactive --terragrunt-working-dir %s --terragrunt-log-level debug", rootPath), &stdout, &stderr) logBufferContentsLineByLine(t, stdout, "apply stdout") logBufferContentsLineByLine(t, stderr, "apply stderr") - output := stderr.String() + output := stdout.String() if err != nil { t.Errorf("Did not expect to get error: %s", err.Error()) @@ -261,7 +261,7 @@ ) err := runTerragruntCommand(t, fmt.Sprintf("terragrunt apply -auto-approve --terragrunt-non-interactive --terragrunt-working-dir %s", rootPath), &stdout, &stderr) - output := stderr.String() + output := stdout.String() if err != nil { t.Errorf("Did not expect to get error: %s", err.Error()) @@ -360,7 +360,7 @@ _, beforeException := ioutil.ReadFile(rootPath + "/before.out") _, afterException := ioutil.ReadFile(rootPath + "/after.out") - output := stderr.String() + output := stdout.String() if err != nil { t.Errorf("Did not expect to get error: %s", err.Error()) @@ -389,7 +389,8 @@ stdout := bytes.Buffer{} stderr := bytes.Buffer{} - runTerragruntCommand(t, fmt.Sprintf("terragrunt apply -auto-approve --terragrunt-non-interactive --terragrunt-config %s --terragrunt-working-dir %s", tmpTerragruntConfigPath, childPath), &stdout, &stderr) + err := runTerragruntCommand(t, fmt.Sprintf("terragrunt apply -auto-approve --terragrunt-non-interactive --terragrunt-config %s --terragrunt-working-dir %s", tmpTerragruntConfigPath, childPath), &stdout, &stderr) + assert.ErrorContains(t, err, "executable file not found in $PATH") _, beforeException := ioutil.ReadFile(childPath + "/before.out") _, beforeChildException := ioutil.ReadFile(childPath + "/before-child.out") @@ -428,7 +429,7 @@ assert.Error(t, err) - output := stderr.String() + output := stdout.String() assert.Contains(t, output, "BEFORE_SHOULD_DISPLAY") assert.NotContains(t, output, "BEFORE_NODISPLAY") @@ -542,7 +543,7 @@ ) err := runTerragruntCommand(t, fmt.Sprintf("terragrunt apply -auto-approve --terragrunt-non-interactive --terragrunt-working-dir %s", rootPath), &stdout, &stderr) - erroutput := stderr.String() + output := stdout.String() homePath := os.Getenv("HOME") if homePath == "" { @@ -553,7 +554,7 @@ t.Errorf("Did not expect to get error: %s", err.Error()) } - assert.Contains(t, erroutput, homePath) + assert.Contains(t, output, homePath) } @@ -1847,9 +1848,9 @@ func TestTerragruntInfo(t *testing.T) { t.Parallel() - cleanupTerraformFolder(t, TEST_FIXTURE_HOOKS_INIT_ONCE_WITH_SOURCE_NO_BACKEND) + cleanupTerraformFolder(t, TEST_FIXTURE_HOOKS_INIT_ONCE_WITH_SOURCE_NO_BACKEND_SUPPRESS_HOOK_STDOUT) tmpEnvPath := copyEnvironment(t, "fixture-hooks/init-once") - rootPath := util.JoinPath(tmpEnvPath, TEST_FIXTURE_HOOKS_INIT_ONCE_WITH_SOURCE_NO_BACKEND) + rootPath := util.JoinPath(tmpEnvPath, TEST_FIXTURE_HOOKS_INIT_ONCE_WITH_SOURCE_NO_BACKEND_SUPPRESS_HOOK_STDOUT) showStdout := bytes.Buffer{} showStderr := bytes.Buffer{} @@ -3399,20 +3400,22 @@ }, "before_hook": map[string]interface{}{ "before_hook_1": map[string]interface{}{ - "name": "before_hook_1", - "commands": []interface{}{"apply", "plan"}, - "execute": []interface{}{"touch", "before.out"}, - "working_dir": nil, - "run_on_error": true, + "name": "before_hook_1", + "commands": []interface{}{"apply", "plan"}, + "execute": []interface{}{"touch", "before.out"}, + "working_dir": nil, + "run_on_error": true, + "suppress_stdout": nil, }, }, "after_hook": map[string]interface{}{ "after_hook_1": map[string]interface{}{ - "name": "after_hook_1", - "commands": []interface{}{"apply", "plan"}, - "execute": []interface{}{"touch", "after.out"}, - "working_dir": nil, - "run_on_error": true, + "name": "after_hook_1", + "commands": []interface{}{"apply", "plan"}, + "execute": []interface{}{"touch", "after.out"}, + "working_dir": nil, + "run_on_error": true, + "suppress_stdout": nil, }, }, "error_hook": map[string]interface{}{}, @@ -3710,7 +3713,7 @@ err := runTerragruntCommand(t, fmt.Sprintf("terragrunt run-all apply --terragrunt-modules-that-include parent.hcl --terragrunt-modules-that-include common.hcl --terragrunt-non-interactive --terragrunt-working-dir %s", tmpEnvPath), &stdout, &stderr) require.NoError(t, err) - out := stderr.String() + out := stdout.String() assert.Equal(t, 1, strings.Count(out, "parent_hcl_file")) assert.Equal(t, 1, strings.Count(out, "dependency_hcl")) assert.Equal(t, 1, strings.Count(out, "common_hcl")) @@ -4581,7 +4584,7 @@ runTerragruntCommand(t, fmt.Sprintf("terragrunt init --terragrunt-working-dir %s", TEST_FIXTURE_LOCAL_RUN_ONCE), &stdout, &stderr) - errout := string(stderr.Bytes()) + errout := string(stdout.Bytes()) assert.Equal(t, 1, strings.Count(errout, "foo")) } @@ -4595,7 +4598,7 @@ runTerragruntCommand(t, fmt.Sprintf("terragrunt init --terragrunt-working-dir %s", TEST_FIXTURE_LOCAL_RUN_MULTIPLE), &stdout, &stderr) - errout := string(stderr.Bytes()) + errout := string(stdout.Bytes()) // Check for cached values between locals and inputs sections assert.Equal(t, 1, strings.Count(errout, "potato")) @@ -4663,9 +4666,9 @@ stderr := bytes.Buffer{} err := runTerragruntCommand(t, fmt.Sprintf("terragrunt version --terragrunt-log-level trace --terragrunt-non-interactive --terragrunt-working-dir %s", appPath), &stdout, &stderr) require.NoError(t, err) - errout := string(stderr.Bytes()) - assert.Equal(t, 1, strings.Count(errout, "\npath_relative_to_inclue: app\n")) - assert.Equal(t, 0, strings.Count(errout, "\npath_relative_to_inclue: .\n")) + output := string(stdout.Bytes()) + assert.Equal(t, 1, strings.Count(output, "path_relative_to_inclue: app\n")) + assert.Equal(t, 0, strings.Count(output, "path_relative_to_inclue: .\n")) } func TestTerragruntInitConfirmation(t *testing.T) { @@ -5493,6 +5496,38 @@ assert.Contains(t, output, string(expectedDiff)) } +func TestDestroyDependentModule(t *testing.T) { + t.Parallel() + + cleanupTerraformFolder(t, TEST_FIXTURE_DESTROY_DEPENDENT_MODULE) + tmpEnvPath, _ := filepath.EvalSymlinks(copyEnvironment(t, TEST_FIXTURE_DESTROY_DEPENDENT_MODULE)) + rootPath := util.JoinPath(tmpEnvPath, TEST_FIXTURE_DESTROY_DEPENDENT_MODULE) + + output, err := exec.Command("git", "init", rootPath).CombinedOutput() + if err != nil { + t.Fatalf("Error initializing git repo: %v\n%s", err, string(output)) + } + // apply each module in order + runTerragrunt(t, fmt.Sprintf("terragrunt apply -auto-approve --terragrunt-non-interactive --terragrunt-working-dir %s", util.JoinPath(rootPath, "a"))) + runTerragrunt(t, fmt.Sprintf("terragrunt apply -auto-approve --terragrunt-non-interactive --terragrunt-working-dir %s", util.JoinPath(rootPath, "b"))) + runTerragrunt(t, fmt.Sprintf("terragrunt apply -auto-approve --terragrunt-non-interactive --terragrunt-working-dir %s", util.JoinPath(rootPath, "c"))) + + config.ClearOutputCache() + + // destroy module which have outputs from other modules + stdout := bytes.Buffer{} + stderr := bytes.Buffer{} + + err = runTerragruntCommand(t, fmt.Sprintf("terragrunt destroy -auto-approve --terragrunt-non-interactive --terragrunt-log-level debug --terragrunt-working-dir %s", util.JoinPath(rootPath, "c")), &stdout, &stderr) + assert.NoError(t, err) + + assert.True(t, strings.Contains(stderr.String(), util.JoinPath(rootPath, "b", "terragrunt.hcl"))) + assert.True(t, strings.Contains(stderr.String(), util.JoinPath(rootPath, "a", "terragrunt.hcl"))) + + assert.True(t, strings.Contains(stderr.String(), "\"value\": \"module-b.txt\"")) + assert.True(t, strings.Contains(stderr.String(), "\"value\": \"module-a.txt\"")) +} + func validateOutput(t *testing.T, outputs map[string]TerraformOutput, key string, value interface{}) { t.Helper() output, hasPlatform := outputs[key] ++++++ terragrunt.obsinfo ++++++ --- /var/tmp/diff_new_pack.WY32x3/_old 2023-06-11 19:58:00.632147583 +0200 +++ /var/tmp/diff_new_pack.WY32x3/_new 2023-06-11 19:58:00.632147583 +0200 @@ -1,5 +1,5 @@ name: terragrunt -version: 0.45.18 -mtime: 1685533020 -commit: 1494e777b1f2ce18797ce1c9e46859bdef7f33ed +version: 0.46.1 +mtime: 1685643340 +commit: e190fa3d9a0a92c32fd5d031851775a702179db7 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/terragrunt/vendor.tar.gz /work/SRC/openSUSE:Factory/.terragrunt.new.15902/vendor.tar.gz differ: char 5, line 1