@@ -54,8 +54,8 @@ func (m *uploadStateForYamlSync) Apply(ctx context.Context, b *bundle.Bundle) di
5454
5555 _ , snapshotPath := b .StateFilenameConfigSnapshot (ctx )
5656
57- diags := m .convertState (ctx , b , snapshotPath )
58- if diags .HasError () {
57+ created , diags := m .convertState (ctx , b , snapshotPath )
58+ if diags .HasError () || ! created {
5959 return diags
6060 }
6161
@@ -92,10 +92,22 @@ func uploadState(ctx context.Context, b *bundle.Bundle) error {
9292 return nil
9393}
9494
95- func (m * uploadStateForYamlSync ) convertState (ctx context.Context , b * bundle.Bundle , snapshotPath string ) (diags diag.Diagnostics ) {
95+ func (m * uploadStateForYamlSync ) convertState (ctx context.Context , b * bundle.Bundle , snapshotPath string ) (bool , diag.Diagnostics ) {
9696 terraformResources , err := terraform .ParseResourcesState (ctx , b )
9797 if err != nil {
98- return diag .FromErr (err )
98+ return false , diag .FromErr (fmt .Errorf ("failed to parse terraform state for config snapshot: %w" , err ))
99+ }
100+
101+ // ParseResourcesState returns nil when the terraform state file doesn't exist
102+ // (e.g. first deploy with no resources).
103+ if terraformResources == nil {
104+ return false , nil
105+ }
106+
107+ _ , localTerraformPath := b .StateFilenameTerraform (ctx )
108+ data , err := os .ReadFile (localTerraformPath )
109+ if err != nil {
110+ return false , diag .FromErr (fmt .Errorf ("failed to read terraform state for config snapshot: %w" , err ))
99111 }
100112
101113 state := make (map [string ]dstate.ResourceEntry )
@@ -111,18 +123,12 @@ func (m *uploadStateForYamlSync) convertState(ctx context.Context, b *bundle.Bun
111123 }
112124 }
113125
114- _ , localTerraformPath := b .StateFilenameTerraform (ctx )
115- data , err := os .ReadFile (localTerraformPath )
116- if err != nil {
117- return diag .FromErr (err )
118- }
119-
120126 var tfState struct {
121127 Lineage string `json:"lineage"`
122128 Serial int `json:"serial"`
123129 }
124130 if err := json .Unmarshal (data , & tfState ); err != nil {
125- return diag .FromErr (err )
131+ return false , diag .FromErr (err )
126132 }
127133
128134 migratedDB := dstate .NewDatabase (tfState .Lineage , tfState .Serial + 1 )
@@ -141,26 +147,27 @@ func (m *uploadStateForYamlSync) convertState(ctx context.Context, b *bundle.Bun
141147 interpolatedRoot := b .Config .Value ()
142148 uninterpolatedRoot , err := reverseInterpolate (interpolatedRoot )
143149 if err != nil {
144- return diag .FromErr (fmt .Errorf ("failed to reverse interpolation: %w" , err ))
150+ return false , diag .FromErr (fmt .Errorf ("failed to reverse interpolation: %w" , err ))
145151 }
146152
147153 var uninterpolatedConfig config.Root
148154 err = uninterpolatedConfig .Mutate (func (_ dyn.Value ) (dyn.Value , error ) {
149155 return uninterpolatedRoot , nil
150156 })
151157 if err != nil {
152- return diag .FromErr (fmt .Errorf ("failed to create uninterpolated config: %w" , err ))
158+ return false , diag .FromErr (fmt .Errorf ("failed to create uninterpolated config: %w" , err ))
153159 }
154160
155161 plan , err := deploymentBundle .CalculatePlan (ctx , b .WorkspaceClient (), & uninterpolatedConfig , snapshotPath )
156162 if err != nil {
157- return diag .FromErr (err )
163+ return false , diag .FromErr (err )
158164 }
159165
160166 for _ , entry := range plan .Plan {
161167 entry .Action = deployplan .Update
162168 }
163169
170+ var diags diag.Diagnostics
164171 for key := range plan .Plan {
165172 etag := etags [key ]
166173 if etag == "" {
@@ -178,7 +185,7 @@ func (m *uploadStateForYamlSync) convertState(ctx context.Context, b *bundle.Bun
178185
179186 deploymentBundle .Apply (ctx , b .WorkspaceClient (), plan , direct .MigrateMode (true ))
180187
181- return diags
188+ return true , diags
182189}
183190
184191// reverseInterpolate reverses the terraform.Interpolate transformation.
0 commit comments