Skip to content

Commit f9ea964

Browse files
Chris PineChris Pine
andauthored
Do not re-execute campaign spec steps when the diff is still valid (#282)
* Do not re-execute campaign spec steps when the diff is still valid #13172 * improved comments Co-authored-by: Chris Pine <[email protected]>
1 parent 3a159bc commit f9ea964

File tree

1 file changed

+34
-22
lines changed

1 file changed

+34
-22
lines changed

internal/campaigns/executor.go

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ type Executor interface {
2323
type Task struct {
2424
Repository *graphql.Repository
2525
Steps []Step
26-
Template *ChangesetTemplate
26+
Template *ChangesetTemplate `json:"-"`
2727
}
2828

2929
func (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

Comments
 (0)