Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package opentofu for openSUSE:Factory checked in at 2026-07-14 13:52:10 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/opentofu (Old) and /work/SRC/openSUSE:Factory/.opentofu.new.1991 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "opentofu" Tue Jul 14 13:52:10 2026 rev:52 rq:1365470 version:1.12.4 Changes: -------- --- /work/SRC/openSUSE:Factory/opentofu/opentofu.changes 2026-06-19 17:19:31.670266732 +0200 +++ /work/SRC/openSUSE:Factory/.opentofu.new.1991/opentofu.changes 2026-07-14 13:52:33.828417343 +0200 @@ -1,0 +2,14 @@ +Tue Jul 14 05:08:43 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 1.12.4: + * BUG FIXES: + - tofu plan -out no longer fails when the plan includes a + resource with lifecycle { destroy = false } that needs + replacement, which previously errored with invalid change + action ForgetThenCreate. (#4324) + - Moved block now correctly compares provider source addresses. + (#4280)[https://github.com//pull/4280] + - Correct Source Provider Address now passed into Provider + MoveResource requests. (#4355)[https://github.com//pull/4355] + +------------------------------------------------------------------- Old: ---- opentofu-1.12.3.obscpio New: ---- opentofu-1.12.4.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ opentofu.spec ++++++ --- /var/tmp/diff_new_pack.RixtSq/_old 2026-07-14 13:52:36.920524254 +0200 +++ /var/tmp/diff_new_pack.RixtSq/_new 2026-07-14 13:52:36.924524392 +0200 @@ -19,7 +19,7 @@ %define executable_name tofu Name: opentofu -Version: 1.12.3 +Version: 1.12.4 Release: 0 Summary: Declaratively manage your cloud infrastructure License: MPL-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.RixtSq/_old 2026-07-14 13:52:36.996526882 +0200 +++ /var/tmp/diff_new_pack.RixtSq/_new 2026-07-14 13:52:37.004527158 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/opentofu/opentofu.git</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">refs/tags/v1.12.3</param> + <param name="revision">refs/tags/v1.12.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.RixtSq/_old 2026-07-14 13:52:37.036528265 +0200 +++ /var/tmp/diff_new_pack.RixtSq/_new 2026-07-14 13:52:37.040528403 +0200 @@ -3,6 +3,6 @@ <param name="url">https://github.com/opentofu/opentofu/</param> <param name="changesrevision">bdcbf091aab886499ed7718d7f558b428fffce39</param></service><service name="tar_scm"> <param name="url">https://github.com/opentofu/opentofu.git</param> - <param name="changesrevision">e33607a2e3b29bfc7cf9f4dcdc261e669e3a457b</param></service></servicedata> + <param name="changesrevision">d5291190380d16aa5ef4590facbe0719d7fa165f</param></service></servicedata> (No newline at EOF) ++++++ opentofu-1.12.3.obscpio -> opentofu-1.12.4.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentofu-1.12.3/CHANGELOG.md new/opentofu-1.12.4/CHANGELOG.md --- old/opentofu-1.12.3/CHANGELOG.md 2026-06-18 15:19:06.000000000 +0200 +++ new/opentofu-1.12.4/CHANGELOG.md 2026-07-13 17:08:17.000000000 +0200 @@ -1,6 +1,14 @@ The v1.12.x release series is supported until **February 1 2027**. -## 1.12.4 (unreleased) +## 1.12.5 (unreleased) + +## 1.12.4 + +BUG FIXES: + +- `tofu plan -out` no longer fails when the plan includes a resource with `lifecycle { destroy = false }` that needs replacement, which previously errored with `invalid change action ForgetThenCreate`. ([#4324](https://github.com/opentofu/opentofu/issues/4324)) +- Moved block now correctly compares provider source addresses. (#4280)[https://github.com/opentofu/opentofu/pull/4280] +- Correct Source Provider Address now passed into Provider MoveResource requests. (#4355)[https://github.com/opentofu/opentofu/pull/4355] ## 1.12.3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentofu-1.12.3/internal/plans/planfile/tfplan.go new/opentofu-1.12.4/internal/plans/planfile/tfplan.go --- old/opentofu-1.12.3/internal/plans/planfile/tfplan.go 2026-06-18 15:19:06.000000000 +0200 +++ new/opentofu-1.12.4/internal/plans/planfile/tfplan.go 2026-07-13 17:08:17.000000000 +0200 @@ -433,6 +433,10 @@ ret.Action = plans.DeleteThenCreate beforeIdx = 0 afterIdx = 1 + case planproto.Action_FORGET_THEN_CREATE: + ret.Action = plans.ForgetThenCreate + beforeIdx = 0 + afterIdx = 1 default: return nil, fmt.Errorf("invalid change action %s", rawChange.Action) } @@ -897,6 +901,9 @@ case plans.CreateThenDelete: ret.Action = planproto.Action_CREATE_THEN_DELETE ret.Values = []*planproto.DynamicValue{before, after} + case plans.ForgetThenCreate: + ret.Action = planproto.Action_FORGET_THEN_CREATE + ret.Values = []*planproto.DynamicValue{before, after} default: return nil, fmt.Errorf("invalid change action %s", change.Action) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentofu-1.12.3/internal/plans/planfile/tfplan_test.go new/opentofu-1.12.4/internal/plans/planfile/tfplan_test.go --- old/opentofu-1.12.3/internal/plans/planfile/tfplan_test.go 2026-06-18 15:19:06.000000000 +0200 +++ new/opentofu-1.12.4/internal/plans/planfile/tfplan_test.go 2026-07-13 17:08:17.000000000 +0200 @@ -156,6 +156,31 @@ Addr: addrs.Resource{ Mode: addrs.ManagedResourceMode, Type: "test_thing", + Name: "forget_then_create", + }.Instance(addrs.IntKey(0)).Absolute(addrs.RootModuleInstance), + PrevRunAddr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "test_thing", + Name: "forget_then_create", + }.Instance(addrs.IntKey(0)).Absolute(addrs.RootModuleInstance), + ProviderAddr: addrs.AbsProviderConfig{ + Provider: addrs.NewDefaultProvider("test"), + Module: addrs.RootModule, + }, + ChangeSrc: plans.ChangeSrc{ + Action: plans.ForgetThenCreate, + Before: mustNewDynamicValue(cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("old-id"), + }), objTy), + After: mustNewDynamicValue(cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("new-id"), + }), objTy), + }, + }, + { + Addr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "test_thing", Name: "importing", }.Instance(addrs.IntKey(1)).Absolute(addrs.RootModuleInstance), PrevRunAddr: addrs.Resource{ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentofu-1.12.3/internal/tofu/context_plan.go new/opentofu-1.12.4/internal/tofu/context_plan.go --- old/opentofu-1.12.3/internal/tofu/context_plan.go 2026-06-18 15:19:06.000000000 +0200 +++ new/opentofu-1.12.4/internal/tofu/context_plan.go 2026-07-13 17:08:17.000000000 +0200 @@ -969,7 +969,11 @@ prevRunAddr = move.From } - if isResourceMovedToDifferentType(addr, prevRunAddr) { + // Note: provider addr is provided twice; + // we cannot compare the currently configured provider + // with the resource's provider from the previous state, so + // we'll skip the provider check + if isResourceMovedToDifferentType(addr, prevRunAddr, provider, provider) { // We don't report drift in case of resource type change continue } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentofu-1.12.3/internal/tofu/context_plan2_test.go new/opentofu-1.12.4/internal/tofu/context_plan2_test.go --- old/opentofu-1.12.3/internal/tofu/context_plan2_test.go 2026-06-18 15:19:06.000000000 +0200 +++ new/opentofu-1.12.4/internal/tofu/context_plan2_test.go 2026-07-13 17:08:17.000000000 +0200 @@ -33,6 +33,8 @@ "github.com/opentofu/opentofu/internal/providers" "github.com/opentofu/opentofu/internal/states" "github.com/opentofu/opentofu/internal/tfdiags" + + regaddr "github.com/opentofu/registry-address/v2" ) func TestContext2Plan_removedDuringRefresh(t *testing.T) { @@ -1792,6 +1794,124 @@ }) } } +func TestContext2Plan_movedResourceToDifferentProvider(t *testing.T) { + // This tests a rare scenario where providers might + // change during a move, as brought up here: + // https://github.com/opentofu/opentofu/issues/4271 + + type test struct { + name string + schema providers.Schema + resType string + config map[string]string + attrsJSON []byte + } + + tests := []test{ + { + name: "providers have same local name, but different namespace", + schema: constructProviderSchemaForTesting(map[string]*configschema.Attribute{ + "test_number": { + Type: cty.Number, + Optional: true, + }, + }), + resType: "test_object", + config: map[string]string{ + "main.tf": ` + terraform { + required_providers { + test = { + source = "opentofu/test" + } + } + } + + resource "test_object" "new" { + + } + moved { + from = test_object.old + to = test_object.new + } + `, + }, + attrsJSON: []byte(`{}`), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + oldAddr := mustResourceInstanceAddr(tt.resType + ".old") + m := testModuleInline(t, tt.config) + + providerAddr1 := addrs.AbsProviderConfig{ + Provider: regaddr.Provider{ + Type: addrs.MustParseProviderPart("test"), + Namespace: "hashicorp", + Hostname: addrs.DefaultProviderRegistryHost, + }, + Module: addrs.RootModule, + } + + providerAddr2 := addrs.AbsProviderConfig{ + Provider: regaddr.Provider{ + Type: addrs.MustParseProviderPart("test"), + Namespace: "opentofu", + Hostname: addrs.DefaultProviderRegistryHost, + }, + Module: addrs.RootModule, + } + + state := states.BuildState( + func(s *states.SyncState) { + s.SetResourceProvider(oldAddr.ContainingResource(), providerAddr1) + s.SetResourceInstanceCurrent(oldAddr, &states.ResourceInstanceObjectSrc{ + Status: states.ObjectReady, + AttrsJSON: tt.attrsJSON, + }, providerAddr1, addrs.NoKey) + }) + + provider1 := &MockProvider{ + // Old provider, saved in state as the previous provider address + GetProviderSchemaResponse: &providers.GetProviderSchemaResponse{ + ResourceTypes: map[string]providers.Schema{ + tt.resType: tt.schema, + }, + }, + } + + provider2 := &MockProvider{ + // New provider has identical schema; we register it with a new address, but same provider name + GetProviderSchemaResponse: &providers.GetProviderSchemaResponse{ + ResourceTypes: map[string]providers.Schema{ + tt.resType: tt.schema, + }, + }, + } + + providerFactory := map[addrs.Provider]providers.Factory{ + providerAddr1.Provider: testProviderFuncFixed(provider1), + providerAddr2.Provider: testProviderFuncFixed(provider2), + } + + ctx := testContext2(t, &ContextOpts{ + Plugins: plugins.NewLibrary(providerFactory, nil), + }) + + _, diags := ctx.Plan(context.Background(), m, state, &PlanOpts{ + Mode: plans.NormalMode, + }) + + if !provider2.MoveResourceStateCalled { + // We want the provider to move to the other state + t.Fatal("expected a call to MoveResourceState, but none occurred") + } + + assertNoErrors(t, diags) + }) + } +} func TestContext2Plan_movedResourceCollision(t *testing.T) { addrNoKey := mustResourceInstanceAddr("test_object.a") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentofu-1.12.3/internal/tofu/node_resource_abstract.go new/opentofu-1.12.4/internal/tofu/node_resource_abstract.go --- old/opentofu-1.12.3/internal/tofu/node_resource_abstract.go 2026-06-18 15:19:06.000000000 +0200 +++ new/opentofu-1.12.4/internal/tofu/node_resource_abstract.go 2026-07-13 17:08:17.000000000 +0200 @@ -602,8 +602,8 @@ return diags } -func isResourceMovedToDifferentType(newAddr, oldAddr addrs.AbsResourceInstance) bool { - return newAddr.Resource.Resource.Type != oldAddr.Resource.Resource.Type +func isResourceMovedToDifferentType(newAddr, oldAddr addrs.AbsResourceInstance, providerAddr, oldProviderAddr addrs.Provider) bool { + return newAddr.Resource.Resource.Type != oldAddr.Resource.Resource.Type || !providerAddr.Equals(oldProviderAddr) } // readResourceInstanceState reads the current object for a specific instance in @@ -632,15 +632,18 @@ // prevAddr will match the newAddr if the resource wasn't moved (prevRunAddr checks move results) prevAddr := n.prevRunAddr(evalCtx) + providerAddr, prevProviderAddr := n.getResourceProviderAddrs(evalCtx, addr) transformArgs := stateTransformArgs{ currentAddr: addr, + currentProviderAddr: providerAddr, prevAddr: prevAddr, + prevProviderAddr: prevProviderAddr, provider: provider, objectSrc: src, currentSchema: schema.Block, currentSchemaVersion: currentVersion, } - if isResourceMovedToDifferentType(addr, prevAddr) { + if isResourceMovedToDifferentType(addr, prevAddr, providerAddr, prevProviderAddr) { src, diags = moveResourceState(transformArgs) } else { src, diags = upgradeResourceState(transformArgs) @@ -648,7 +651,7 @@ // Upgrade identity if needed if src != nil && src.IdentityJSON != nil { - src, diags = upgradeResourceIdentity(ctx, addr, src, provider, providerSchema, diags) + src, diags = upgradeResourceIdentity(ctx, addr, src, provider, prevProviderAddr, providerSchema, diags) } if n.Config != nil { @@ -666,6 +669,18 @@ return obj, diags } +func (n *NodeAbstractResourceInstance) getResourceProviderAddrs(evalCtx EvalContext, addr addrs.AbsResourceInstance) (addrs.Provider, addrs.Provider) { + // temporarily set prevProviderAddr to the current one, + // and use it if prevRunState is not set in this context + providerAddr := n.Provider() + prevProviderAddr := providerAddr + prevRunState := evalCtx.PrevRunState() + if prevRunState != nil { + prevProviderAddr = prevRunState.ResourceProvider(addr.AffectedAbsResource()).Provider + } + return providerAddr, prevProviderAddr +} + // readResourceInstanceStateDeposed reads the deposed object for a specific // instance in the state. func (n *NodeAbstractResourceInstance) readResourceInstanceStateDeposed(ctx context.Context, evalCtx EvalContext, addr addrs.AbsResourceInstance, key states.DeposedKey) (*states.ResourceInstanceObject, tfdiags.Diagnostics) { @@ -696,15 +711,18 @@ } // prevAddr will match the newAddr if the resource wasn't moved (prevRunAddr checks move results) prevAddr := n.prevRunAddr(evalCtx) + providerAddr, prevProviderAddr := n.getResourceProviderAddrs(evalCtx, addr) transformArgs := stateTransformArgs{ currentAddr: addr, + currentProviderAddr: providerAddr, prevAddr: prevAddr, + prevProviderAddr: prevProviderAddr, provider: provider, objectSrc: src, currentSchema: schema.Block, currentSchemaVersion: currentVersion, } - if isResourceMovedToDifferentType(addr, prevAddr) { + if isResourceMovedToDifferentType(addr, prevAddr, providerAddr, prevProviderAddr) { src, diags = moveResourceState(transformArgs) } else { src, diags = upgradeResourceState(transformArgs) @@ -712,7 +730,7 @@ // Upgrade identity if needed if src != nil && src.IdentityJSON != nil { - src, diags = upgradeResourceIdentity(ctx, addr, src, provider, providerSchema, diags) + src, diags = upgradeResourceIdentity(ctx, addr, src, provider, prevProviderAddr, providerSchema, diags) } if n.Config != nil { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentofu-1.12.3/internal/tofu/upgrade_resource_state.go new/opentofu-1.12.4/internal/tofu/upgrade_resource_state.go --- old/opentofu-1.12.3/internal/tofu/upgrade_resource_state.go 2026-06-18 15:19:06.000000000 +0200 +++ new/opentofu-1.12.4/internal/tofu/upgrade_resource_state.go 2026-07-13 17:08:17.000000000 +0200 @@ -24,8 +24,14 @@ type stateTransformArgs struct { // currentAddr is the current/latest address of the resource currentAddr addrs.AbsResourceInstance + // currentProviderAddr is the current/latest address of the resource's provider + currentProviderAddr addrs.Provider + // prevAddr is the previous address of the resource - prevAddr addrs.AbsResourceInstance + prevAddr addrs.AbsResourceInstance + // prevProviderAddr is the previous address of the resource's provider + prevProviderAddr addrs.Provider + provider providers.Interface objectSrc *states.ResourceInstanceObjectSrc // currentSchema is the latest schema of the resource @@ -66,8 +72,7 @@ args.objectSrc.AttrsJSON = stripRemovedStateAttributes(args.objectSrc.AttrsJSON, args.currentSchema.ImpliedType()) } - // TODO: This should eventually use a proper FQN. - providerType := args.currentAddr.Resource.Resource.ImpliedProvider() + providerType := args.currentProviderAddr if args.objectSrc.SchemaVersion > args.currentSchemaVersion { log.Printf("[TRACE] upgradeResourceStateTransform: can't downgrade state for %s from version %d to %d", args.currentAddr, args.objectSrc.SchemaVersion, args.currentSchemaVersion) @@ -133,7 +138,7 @@ func moveResourceStateTransform(args stateTransformArgs) (cty.Value, []byte, tfdiags.Diagnostics) { log.Printf("[TRACE] moveResourceStateTransform: new address: %s, previous address: %s", args.currentAddr, args.prevAddr) req := providers.MoveResourceStateRequest{ - SourceProviderAddress: args.prevAddr.Resource.Resource.ImpliedProvider(), + SourceProviderAddress: args.prevProviderAddr.String(), SourceTypeName: args.prevAddr.Resource.Resource.Type, SourceSchemaVersion: args.objectSrc.SchemaVersion, SourceStateJSON: args.objectSrc.AttrsJSON, @@ -171,7 +176,7 @@ // marshaling/unmarshaling of the new value, but we'll check it here // anyway for robustness, e.g. for in-process providers. if errs := newState.Type().TestConformance(args.currentSchema.ImpliedType()); len(errs) > 0 { - providerType := args.currentAddr.Resource.Resource.ImpliedProvider() + providerType := args.currentProviderAddr for _, err := range errs { diags = diags.Append(tfdiags.Sourceless( tfdiags.Error, @@ -285,6 +290,7 @@ addr addrs.AbsResourceInstance, src *states.ResourceInstanceObjectSrc, provider providers.Interface, + providerAddr addrs.Provider, providerSchema providers.ProviderSchema, diags tfdiags.Diagnostics, ) (*states.ResourceInstanceObjectSrc, tfdiags.Diagnostics) { @@ -307,7 +313,7 @@ return src, diags.Append(tfdiags.Sourceless( tfdiags.Error, "Resource identity managed by newer provider version", - fmt.Sprintf("The current identity of %s was created by a newer provider version than is currently selected. Upgrade the %s provider to work with this identity.", addr, addr.Resource.Resource.ImpliedProvider()), + fmt.Sprintf("The current identity of %s was created by a newer provider version than is currently selected. Upgrade the %s provider to work with this identity.", addr, providerAddr), )) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentofu-1.12.3/internal/tofu/upgrade_resource_state_test.go new/opentofu-1.12.4/internal/tofu/upgrade_resource_state_test.go --- old/opentofu-1.12.3/internal/tofu/upgrade_resource_state_test.go 2026-06-18 15:19:06.000000000 +0200 +++ new/opentofu-1.12.4/internal/tofu/upgrade_resource_state_test.go 2026-07-13 17:08:17.000000000 +0200 @@ -180,8 +180,10 @@ }, } return stateTransformArgs{ - currentAddr: mustResourceInstanceAddr("foo2_instance.cur"), - prevAddr: mustResourceInstanceAddr("foo_instance.prev"), + currentAddr: mustResourceInstanceAddr("foo2_instance.cur"), + currentProviderAddr: addrs.NewDefaultProvider("foo2"), + prevAddr: mustResourceInstanceAddr("foo_instance.prev"), + prevProviderAddr: addrs.NewDefaultProvider("foo"), provider: &MockProvider{ ConfigureProviderCalled: true, MoveResourceStateResponse: &providers.MoveResourceStateResponse{ @@ -227,7 +229,7 @@ name: "Move check request", args: getMoveStateArgs(), wantRequest: &providers.MoveResourceStateRequest{ - SourceProviderAddress: "foo", + SourceProviderAddress: addrs.NewDefaultProvider("foo").String(), SourceTypeName: "foo_instance", SourceSchemaVersion: 2, SourceStateJSON: []byte(`{"foo":"bar"}`), @@ -279,8 +281,10 @@ }, } args := stateTransformArgs{ - currentAddr: mustResourceInstanceAddr("foo_instance.cur"), - prevAddr: mustResourceInstanceAddr("foo_instance.cur"), + currentAddr: mustResourceInstanceAddr("foo_instance.cur"), + currentProviderAddr: addrs.NewDefaultProvider("foo"), + prevAddr: mustResourceInstanceAddr("foo_instance.cur"), + prevProviderAddr: addrs.NewDefaultProvider("foo"), provider: &MockProvider{ ConfigureProviderCalled: true, UpgradeResourceStateResponse: &providers.UpgradeResourceStateResponse{ @@ -403,7 +407,8 @@ { name: "flatmap state should be removed after transformation", args: stateTransformArgs{ - currentAddr: mustResourceInstanceAddr("test_instance.foo"), + currentAddr: mustResourceInstanceAddr("test_instance.foo"), + currentProviderAddr: addrs.NewDefaultProvider("test"), provider: &MockProvider{ GetProviderSchemaResponse: testProviderSchema("test"), }, @@ -661,7 +666,7 @@ for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - gotSrc, diags := upgradeResourceIdentity(t.Context(), tt.currentAddr, tt.src, tt.provider, tt.providerSchema, nil) + gotSrc, diags := upgradeResourceIdentity(t.Context(), tt.currentAddr, tt.src, tt.provider, addrs.NewDefaultProvider("test"), tt.providerSchema, nil) if tt.wantErr != "" { if !diags.HasErrors() { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentofu-1.12.3/version/VERSION new/opentofu-1.12.4/version/VERSION --- old/opentofu-1.12.3/version/VERSION 2026-06-18 15:19:06.000000000 +0200 +++ new/opentofu-1.12.4/version/VERSION 2026-07-13 17:08:17.000000000 +0200 @@ -1 +1 @@ -1.12.3 +1.12.4 ++++++ opentofu.obsinfo ++++++ --- /var/tmp/diff_new_pack.RixtSq/_old 2026-07-14 13:52:42.564719405 +0200 +++ /var/tmp/diff_new_pack.RixtSq/_new 2026-07-14 13:52:42.568719543 +0200 @@ -1,5 +1,5 @@ name: opentofu -version: 1.12.3 -mtime: 1781788746 -commit: e33607a2e3b29bfc7cf9f4dcdc261e669e3a457b +version: 1.12.4 +mtime: 1783955297 +commit: d5291190380d16aa5ef4590facbe0719d7fa165f ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/opentofu/vendor.tar.gz /work/SRC/openSUSE:Factory/.opentofu.new.1991/vendor.tar.gz differ: char 133, line 1
