@@ -23,7 +23,7 @@ type Executor interface {
2323type Task struct {
2424 Repository * graphql.Repository
2525 Steps []Step
26- Template * ChangesetTemplate
26+ Template * ChangesetTemplate `json:"-"`
2727}
2828
2929func (t * Task ) cacheKey () ExecutionCacheKey {
@@ -144,15 +144,22 @@ func (x *executor) do(ctx context.Context, task *Task) (err error) {
144144 if result , err = x .cache .Get (ctx , cacheKey ); err != nil {
145145 err = errors .Wrapf (err , "checking cache for %q" , task .Repository .Name )
146146 return
147- } else if result != nil {
147+ } else if result != nil && len (result .Commits ) == 1 {
148+ // Build a new changeset spec. We don't want to use `result` as is,
149+ // because the changesetTemplate may have changed. In that case
150+ // the diff would still be valid, so we take it from the cache,
151+ // but we still build a new ChangesetSpec from the task.
152+ diff := result .Commits [0 ].Diff
153+ spec := createChangesetSpec (task , diff )
154+
148155 status .Cached = true
149- status .ChangesetSpec = result
156+ status .ChangesetSpec = spec
150157 status .FinishedAt = time .Now ()
151158 x .updateTaskStatus (task , status )
152159
153160 // Add the spec to the executor's list of completed specs.
154161 x .specsMu .Lock ()
155- x .specs = append (x .specs , result )
162+ x .specs = append (x .specs , spec )
156163 x .specsMu .Unlock ()
157164
158165 return
@@ -188,24 +195,8 @@ func (x *executor) do(ctx context.Context, task *Task) (err error) {
188195 }
189196
190197 // Build the changeset spec.
191- spec := & ChangesetSpec {
192- BaseRepository : task .Repository .ID ,
193- CreatedChangeset : & CreatedChangeset {
194- BaseRef : task .Repository .BaseRef (),
195- BaseRev : task .Repository .Rev (),
196- HeadRepository : task .Repository .ID ,
197- HeadRef : "refs/heads/" + task .Template .Branch ,
198- Title : task .Template .Title ,
199- Body : task .Template .Body ,
200- Commits : []GitCommitDescription {
201- {
202- Message : task .Template .Commit .Message ,
203- Diff : string (diff ),
204- },
205- },
206- Published : task .Template .Published ,
207- },
208- }
198+ spec := createChangesetSpec (task , string (diff ))
199+
209200 status .ChangesetSpec = spec
210201 x .updateTaskStatus (task , status )
211202
@@ -245,3 +236,24 @@ func reachedTimeout(cmdCtx context.Context, err error) bool {
245236
246237 return errors .Is (err , context .DeadlineExceeded )
247238}
239+
240+ func createChangesetSpec (task * Task , diff string ) * ChangesetSpec {
241+ return & ChangesetSpec {
242+ BaseRepository : task .Repository .ID ,
243+ CreatedChangeset : & CreatedChangeset {
244+ BaseRef : task .Repository .BaseRef (),
245+ BaseRev : task .Repository .Rev (),
246+ HeadRepository : task .Repository .ID ,
247+ HeadRef : "refs/heads/" + task .Template .Branch ,
248+ Title : task .Template .Title ,
249+ Body : task .Template .Body ,
250+ Commits : []GitCommitDescription {
251+ {
252+ Message : task .Template .Commit .Message ,
253+ Diff : string (diff ),
254+ },
255+ },
256+ Published : task .Template .Published ,
257+ },
258+ }
259+ }
0 commit comments