Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package terragrunt for openSUSE:Factory checked in at 2025-05-31 19:17:32 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/terragrunt (Old) and /work/SRC/openSUSE:Factory/.terragrunt.new.16005 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "terragrunt" Sat May 31 19:17:32 2025 rev:231 rq:1281570 version:0.80.4 Changes: -------- --- /work/SRC/openSUSE:Factory/terragrunt/terragrunt.changes 2025-05-30 17:27:38.533014455 +0200 +++ /work/SRC/openSUSE:Factory/.terragrunt.new.16005/terragrunt.changes 2025-05-31 19:18:28.006739255 +0200 @@ -1,0 +2,14 @@ +Sat May 31 05:46:26 UTC 2025 - Johannes Kastl <opensuse_buildserv...@ojkastl.de> + +- Update to version 0.80.4: + * New Features + The exec command has gained support for use of the --tf-path + flag. This can be important when Terragrunt incidentally uses + OpenTofu/Terraform to do things like fetch outputs from + dependencies. + * What's Changed + - Add tf-path flag to exec command (#4343) + - fix: Optimizing CI cache keys (#4362) + - docs: gcp docs update (#4361) + +------------------------------------------------------------------- Old: ---- terragrunt-0.80.3.obscpio New: ---- terragrunt-0.80.4.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ terragrunt.spec ++++++ --- /var/tmp/diff_new_pack.mcdioE/_old 2025-05-31 19:18:31.222874734 +0200 +++ /var/tmp/diff_new_pack.mcdioE/_new 2025-05-31 19:18:31.222874734 +0200 @@ -17,7 +17,7 @@ Name: terragrunt -Version: 0.80.3 +Version: 0.80.4 Release: 0 Summary: Thin wrapper for Terraform for working with multiple Terraform modules License: MIT ++++++ _service ++++++ --- /var/tmp/diff_new_pack.mcdioE/_old 2025-05-31 19:18:31.278877093 +0200 +++ /var/tmp/diff_new_pack.mcdioE/_new 2025-05-31 19:18:31.282877261 +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.80.3</param> + <param name="revision">v0.80.4</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.mcdioE/_old 2025-05-31 19:18:31.302878103 +0200 +++ /var/tmp/diff_new_pack.mcdioE/_new 2025-05-31 19:18:31.306878273 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/gruntwork-io/terragrunt</param> - <param name="changesrevision">e000a44f60aaeb19cd07676b14f82a47d0ad494e</param></service></servicedata> + <param name="changesrevision">0df7eb56a5aeea64ecdc395fe9d737e8dcc9fae8</param></service></servicedata> (No newline at EOF) ++++++ terragrunt-0.80.3.obscpio -> terragrunt-0.80.4.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.80.3/cli/commands/exec/cli.go new/terragrunt-0.80.4/cli/commands/exec/cli.go --- old/terragrunt-0.80.3/cli/commands/exec/cli.go 2025-05-27 17:52:10.000000000 +0200 +++ new/terragrunt-0.80.4/cli/commands/exec/cli.go 2025-05-28 17:56:59.000000000 +0200 @@ -13,6 +13,7 @@ CommandName = "exec" InDownloadDirFlagName = "in-download-dir" + TFPathFlagName = "tf-path" ) func NewFlags(opts *options.TerragruntOptions, cmdOpts *Options, prefix flags.Prefix) cli.Flags { @@ -27,6 +28,7 @@ run.IAMAssumeRoleDurationFlagName, run.IAMAssumeRoleSessionNameFlagName, run.IAMAssumeRoleWebIdentityTokenFlagName, + run.TFPathFlagName, ), flags.NewFlag(&cli.BoolFlag{ Name: InDownloadDirFlagName, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.80.3/docs/_docs/03_community/01-contributing.md new/terragrunt-0.80.4/docs/_docs/03_community/01-contributing.md --- old/terragrunt-0.80.3/docs/_docs/03_community/01-contributing.md 2025-05-27 17:52:10.000000000 +0200 +++ new/terragrunt-0.80.4/docs/_docs/03_community/01-contributing.md 2025-05-28 17:56:59.000000000 +0200 @@ -278,6 +278,47 @@ For example, all AWS tests are prefixed with `TestAws*`. +Terragrunt also includes integration tests for Google Cloud Platform (GCP). These tests are prefixed with `TestGcp*` and are tagged with the `gcp` build tag. To run these tests, you can use the `-tags` flag set in the `GOFLAGS` environment variable, similar to AWS tests: + +```bash +GOFLAGS='-tags=gcp' go test -run 'TestGcp*' . +``` + +To successfully run the GCP tests, you must set the following environment variables: + +- `GCLOUD_SERVICE_KEY`: The service account JSON key used for authentication. +- `GOOGLE_CLOUD_PROJECT` or `GOOGLE_PROJECT_ID`: The GCP project name. +- `GOOGLE_COMPUTE_ZONE`: The compute zone name. +- `GOOGLE_IDENTITY_EMAIL`: The service account identity email. +- `GCLOUD_SERVICE_KEY_IMPERSONATOR`: (Optional) An additional service account key used in impersonation tests. + +Make sure these environment variables are set in your shell before running the tests. For example: + +```bash +export GCLOUD_SERVICE_KEY="/path/to/service-account.json" +export GOOGLE_CLOUD_PROJECT="your-gcp-project" +export GOOGLE_COMPUTE_ZONE="us-central1-a" +export GOOGLE_IDENTITY_EMAIL="service-acco...@your-gcp-project.iam.gserviceaccount.com" +export GCLOUD_SERVICE_KEY_IMPERSONATOR="/path/to/impersonator-service-account.json" +``` + +The service account used for GCP tests must have the following IAM roles in your GCP project: + +- `roles/storage.admin` +- `roles/iam.serviceAccountTokenCreator` + +You can assign these roles using the following gcloud commands: + +```bash +gcloud projects add-iam-policy-binding <gcp-project> \ + --member="<service-account>" \ + --role="roles/storage.admin" + +gcloud projects add-iam-policy-binding <gcp-project> \ + --member="<service-account>" \ + --role="roles/iam.serviceAccountTokenCreator" +``` + #### Race tests Given that Terragrunt is a tool that frequently involves concurrently running multiple things at once, there's always a risk for race conditions to occur. As such, there are dedicated tests that are run with the `-race` flag in CI to use golang's built-in tooling for identifying race conditions. @@ -328,7 +369,7 @@ Here is how the `errors` package should be used: -1. Any time you want to create your own error, create a custom type for it, and when instantiating that type, wrap it with a call to `errors.New`. That way, any time you call a method defined in the Terragrunt code, you know the error it returns already has a stacktrace and you don’t have to wrap it yourself. +1. Any time you want to create your own error, create a custom type for it, and when instantiating that type, wrap it with a call to `errors.New`. That way, any time you call a method defined in the Terragrunt code, you know the error it returns already has a stacktrace and you don't have to wrap it yourself. 2. Any time you get back an error object from a function built into Go or a 3rd party library, immediately wrap it with `errors.New`. This gives us a stacktrace as close to the source as possible. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.80.3/docs-starlight/src/content/docs/03-community/01-contributing.mdx new/terragrunt-0.80.4/docs-starlight/src/content/docs/03-community/01-contributing.mdx --- old/terragrunt-0.80.3/docs-starlight/src/content/docs/03-community/01-contributing.mdx 2025-05-27 17:52:10.000000000 +0200 +++ new/terragrunt-0.80.4/docs-starlight/src/content/docs/03-community/01-contributing.mdx 2025-05-28 17:56:59.000000000 +0200 @@ -249,6 +249,47 @@ For example, all AWS tests are prefixed with `TestAws*`. +Terragrunt also includes integration tests for Google Cloud Platform (GCP). These tests are prefixed with `TestGcp*` and are tagged with the `gcp` build tag. To run these tests, you can use the `-tags` flag set in the `GOFLAGS` environment variable, similar to AWS tests: + +```bash +GOFLAGS='-tags=gcp' go test -run 'TestGcp*' . +``` + +To successfully run the GCP tests, you must set the following environment variables: + +- `GCLOUD_SERVICE_KEY`: The service account JSON key used for authentication. +- `GOOGLE_CLOUD_PROJECT` or `GOOGLE_PROJECT_ID`: The GCP project name. +- `GOOGLE_COMPUTE_ZONE`: The compute zone name. +- `GOOGLE_IDENTITY_EMAIL`: The service account identity email. +- `GCLOUD_SERVICE_KEY_IMPERSONATOR`: (Optional) An additional service account key used in impersonation tests. + +Make sure these environment variables are set in your shell before running the tests. For example: + +```bash +export GCLOUD_SERVICE_KEY="/path/to/service-account.json" +export GOOGLE_CLOUD_PROJECT="your-gcp-project" +export GOOGLE_COMPUTE_ZONE="us-central1-a" +export GOOGLE_IDENTITY_EMAIL="service-acco...@your-gcp-project.iam.gserviceaccount.com" +export GCLOUD_SERVICE_KEY_IMPERSONATOR="/path/to/impersonator-service-account.json" +``` + +The service account used for GCP tests must have the following IAM roles in your GCP project: + +- `roles/storage.admin` +- `roles/iam.serviceAccountTokenCreator` + +You can assign these roles using the following gcloud commands: + +```bash +gcloud projects add-iam-policy-binding <gcp-project> \ + --member="<service-account>" \ + --role="roles/storage.admin" + +gcloud projects add-iam-policy-binding <gcp-project> \ + --member="<service-account>" \ + --role="roles/iam.serviceAccountTokenCreator" +``` + #### Race tests Given that Terragrunt is a tool that frequently involves concurrently running multiple things at once, there's always a risk for race conditions to occur. As such, there are dedicated tests that are run with the `-race` flag in CI to use golang's built-in tooling for identifying race conditions. @@ -299,7 +340,7 @@ Here is how the `errors` package should be used: -1. Any time you want to create your own error, create a custom type for it, and when instantiating that type, wrap it with a call to `errors.New`. That way, any time you call a method defined in the Terragrunt code, you know the error it returns already has a stacktrace and you don’t have to wrap it yourself. +1. Any time you want to create your own error, create a custom type for it, and when instantiating that type, wrap it with a call to `errors.New`. That way, any time you call a method defined in the Terragrunt code, you know the error it returns already has a stacktrace and you don't have to wrap it yourself. 2. Any time you get back an error object from a function built into Go or a 3rd party library, immediately wrap it with `errors.New`. This gives us a stacktrace as close to the source as possible. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.80.3/test/fixtures/exec-cmd-tf-path/app/main.tf new/terragrunt-0.80.4/test/fixtures/exec-cmd-tf-path/app/main.tf --- old/terragrunt-0.80.3/test/fixtures/exec-cmd-tf-path/app/main.tf 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.80.4/test/fixtures/exec-cmd-tf-path/app/main.tf 2025-05-28 17:56:59.000000000 +0200 @@ -0,0 +1,3 @@ +variable "baz" { + type = string +} \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.80.3/test/fixtures/exec-cmd-tf-path/app/terragrunt.hcl new/terragrunt-0.80.4/test/fixtures/exec-cmd-tf-path/app/terragrunt.hcl --- old/terragrunt-0.80.3/test/fixtures/exec-cmd-tf-path/app/terragrunt.hcl 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.80.4/test/fixtures/exec-cmd-tf-path/app/terragrunt.hcl 2025-05-28 17:56:59.000000000 +0200 @@ -0,0 +1,11 @@ +terraform { + source = "." +} + +dependency "dep" { + config_path = "../dep" +} + +inputs = { + baz = dependency.dep.outputs.baz +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.80.3/test/fixtures/exec-cmd-tf-path/dep/main.tf new/terragrunt-0.80.4/test/fixtures/exec-cmd-tf-path/dep/main.tf --- old/terragrunt-0.80.3/test/fixtures/exec-cmd-tf-path/dep/main.tf 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.80.4/test/fixtures/exec-cmd-tf-path/dep/main.tf 2025-05-28 17:56:59.000000000 +0200 @@ -0,0 +1,3 @@ +output "baz" { + value = "baz" +} \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.80.3/test/fixtures/exec-cmd-tf-path/dep/terragrunt.hcl new/terragrunt-0.80.4/test/fixtures/exec-cmd-tf-path/dep/terragrunt.hcl --- old/terragrunt-0.80.3/test/fixtures/exec-cmd-tf-path/dep/terragrunt.hcl 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.80.4/test/fixtures/exec-cmd-tf-path/dep/terragrunt.hcl 2025-05-28 17:56:59.000000000 +0200 @@ -0,0 +1 @@ +# Intentionally empty \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.80.3/test/fixtures/exec-cmd-tf-path/script.sh new/terragrunt-0.80.4/test/fixtures/exec-cmd-tf-path/script.sh --- old/terragrunt-0.80.3/test/fixtures/exec-cmd-tf-path/script.sh 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.80.4/test/fixtures/exec-cmd-tf-path/script.sh 2025-05-28 17:56:59.000000000 +0200 @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +echo "baz is ${TF_VAR_baz:-not set}" \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.80.3/test/fixtures/exec-cmd-tf-path/terraform-output-json.sh new/terragrunt-0.80.4/test/fixtures/exec-cmd-tf-path/terraform-output-json.sh --- old/terragrunt-0.80.3/test/fixtures/exec-cmd-tf-path/terraform-output-json.sh 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.80.4/test/fixtures/exec-cmd-tf-path/terraform-output-json.sh 2025-05-28 17:56:59.000000000 +0200 @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +# Handle -version +if [ "$1" = "-version" ]; then + echo "Terraform v1.0.0" + exit 0 +fi + +# Output variable +cat << 'EOF' +{ +"baz": { + "sensitive": false, + "type": "string", + "value": "terraform" +} +} +EOF \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.80.3/test/fixtures/exec-cmd-tf-path/tofu-output-json.sh new/terragrunt-0.80.4/test/fixtures/exec-cmd-tf-path/tofu-output-json.sh --- old/terragrunt-0.80.3/test/fixtures/exec-cmd-tf-path/tofu-output-json.sh 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.80.4/test/fixtures/exec-cmd-tf-path/tofu-output-json.sh 2025-05-28 17:56:59.000000000 +0200 @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +# Handle -version +if [ "$1" = "-version" ]; then + echo "OpenToFu v1.0.0" + exit 0 +fi + +# Output variable +cat << 'EOF' +{ +"baz": { + "sensitive": false, + "type": "string", + "value": "tofu" +} +} +EOF \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.80.3/test/integration_exec_test.go new/terragrunt-0.80.4/test/integration_exec_test.go --- old/terragrunt-0.80.3/test/integration_exec_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.80.4/test/integration_exec_test.go 2025-05-28 17:56:59.000000000 +0200 @@ -0,0 +1,111 @@ +package test_test + +import ( + "bytes" + "fmt" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/gruntwork-io/terragrunt/test/helpers" + "github.com/gruntwork-io/terragrunt/util" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestExecCommand(t *testing.T) { + t.Parallel() + + testCases := []struct { + scriptPath string + runInDir string + args []string + }{ + { + scriptPath: "./script.sh arg1 arg2", + runInDir: "", + }, + { + args: []string{"--in-download-dir"}, + scriptPath: "./script.sh arg1 arg2", + runInDir: ".terragrunt-cache", + }, + } + + for i, tc := range testCases { + t.Run(fmt.Sprintf("testCase-%d", i), func(t *testing.T) { + t.Parallel() + + helpers.CleanupTerraformFolder(t, testFixtureExecCmd) + tmpEnvPath := helpers.CopyEnvironment(t, testFixtureExecCmd) + + rootPath := util.JoinPath(tmpEnvPath, testFixtureExecCmd, "app") + rootPath, err := filepath.EvalSymlinks(rootPath) + require.NoError(t, err) + + downloadDirPath := util.JoinPath(rootPath, ".terragrunt-cache") + scriptPath := util.JoinPath(tmpEnvPath, testFixtureExecCmd, tc.scriptPath) + + err = os.Mkdir(downloadDirPath, os.ModePerm) + require.NoError(t, err) + + stdout, _, err := helpers.RunTerragruntCommandWithOutput(t, "terragrunt exec --working-dir "+rootPath+" "+strings.Join(tc.args, " ")+" -- "+scriptPath) + require.NoError(t, err) + assert.Contains(t, stdout, "The first arg is arg1. The second arg is arg2. The script is running in the directory "+util.JoinPath(rootPath, tc.runInDir)) + }) + } +} + +func TestExecCommandTfPath(t *testing.T) { + t.Parallel() + + testCases := []struct { + expected string + tfPath string + }{ + { + expected: "baz is baz", + }, + { + expected: "baz is terraform", + tfPath: "terraform-output-json.sh", + }, + { + expected: "baz is tofu", + tfPath: "tofu-output-json.sh", + }, + } + + for i, tc := range testCases { + t.Run(fmt.Sprintf("testCase-%d", i), func(t *testing.T) { + t.Parallel() + + helpers.CleanupTerraformFolder(t, testFixtureExecCmdTfPath) + tmpEnvPath := helpers.CopyEnvironment(t, testFixtureExecCmdTfPath) + + rootPath := util.JoinPath(tmpEnvPath, testFixtureExecCmdTfPath, "app") + rootPath, err := filepath.EvalSymlinks(rootPath) + require.NoError(t, err) + + downloadDirPath := util.JoinPath(rootPath, ".terragrunt-cache") + scriptPath := util.JoinPath(tmpEnvPath, testFixtureExecCmdTfPath, "./script.sh") + tfPath := "" + if tc.tfPath != "" { + tfPath = "--tf-path " + util.JoinPath(tmpEnvPath, testFixtureExecCmdTfPath, tc.tfPath) + } + + err = os.Mkdir(downloadDirPath, os.ModePerm) + require.NoError(t, err) + + depPath := util.JoinPath(tmpEnvPath, testFixtureExecCmdTfPath, "dep") + depStdout := bytes.Buffer{} + depStderr := bytes.Buffer{} + require.NoError(t, helpers.RunTerragruntCommand(t, "terragrunt apply -auto-approve --non-interactive -no-color --no-color --log-format=pretty --working-dir "+depPath, &depStdout, &depStderr)) + + stdout, _, err := helpers.RunTerragruntCommandWithOutput(t, "terragrunt --log-level debug exec "+tfPath+" --working-dir "+rootPath+" -- "+scriptPath) + require.NoError(t, err) + assert.Contains(t, stdout, tc.expected) + }) + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.80.3/test/integration_test.go new/terragrunt-0.80.4/test/integration_test.go --- old/terragrunt-0.80.3/test/integration_test.go 2025-05-27 17:52:10.000000000 +0200 +++ new/terragrunt-0.80.4/test/integration_test.go 2025-05-28 17:56:59.000000000 +0200 @@ -106,6 +106,7 @@ testFixtureStdout = "fixtures/download/stdout-test" testFixtureTfTest = "fixtures/tftest/" testFixtureExecCmd = "fixtures/exec-cmd" + testFixtureExecCmdTfPath = "fixtures/exec-cmd-tf-path" textFixtureDisjointSymlinks = "fixtures/stack/disjoint-symlinks" testFixtureLogStreaming = "fixtures/streaming" testFixtureCLIFlagHints = "fixtures/cli-flag-hints" @@ -152,49 +153,6 @@ }) } } - -func TestExecCommand(t *testing.T) { - t.Parallel() - - testCases := []struct { - scriptPath string - runInDir string - args []string - }{ - { - scriptPath: "./script.sh arg1 arg2", - runInDir: "", - }, - { - args: []string{"--in-download-dir"}, - scriptPath: "./script.sh arg1 arg2", - runInDir: ".terragrunt-cache", - }, - } - - for i, tc := range testCases { - t.Run(fmt.Sprintf("testCase-%d", i), func(t *testing.T) { - t.Parallel() - - helpers.CleanupTerraformFolder(t, testFixtureExecCmd) - tmpEnvPath := helpers.CopyEnvironment(t, testFixtureExecCmd) - - rootPath := util.JoinPath(tmpEnvPath, testFixtureExecCmd, "app") - rootPath, err := filepath.EvalSymlinks(rootPath) - require.NoError(t, err) - - downloadDirPath := util.JoinPath(rootPath, ".terragrunt-cache") - scriptPath := util.JoinPath(tmpEnvPath, testFixtureExecCmd, tc.scriptPath) - - err = os.Mkdir(downloadDirPath, os.ModePerm) - require.NoError(t, err) - - stdout, _, err := helpers.RunTerragruntCommandWithOutput(t, "terragrunt exec --working-dir "+rootPath+" "+strings.Join(tc.args, " ")+" -- "+scriptPath) - require.NoError(t, err) - assert.Contains(t, stdout, "The first arg is arg1. The second arg is arg2. The script is running in the directory "+util.JoinPath(rootPath, tc.runInDir)) - }) - } -} func TestDetailedExitCodeError(t *testing.T) { t.Parallel() ++++++ terragrunt.obsinfo ++++++ --- /var/tmp/diff_new_pack.mcdioE/_old 2025-05-31 19:18:32.666935563 +0200 +++ /var/tmp/diff_new_pack.mcdioE/_new 2025-05-31 19:18:32.670935732 +0200 @@ -1,5 +1,5 @@ name: terragrunt -version: 0.80.3 -mtime: 1748361130 -commit: e000a44f60aaeb19cd07676b14f82a47d0ad494e +version: 0.80.4 +mtime: 1748447819 +commit: 0df7eb56a5aeea64ecdc395fe9d737e8dcc9fae8 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/terragrunt/vendor.tar.gz /work/SRC/openSUSE:Factory/.terragrunt.new.16005/vendor.tar.gz differ: char 18, line 1