Hold a task's merge while another task in the project is merging
This commit is contained in:
@@ -917,6 +917,75 @@ func TestMergeFetchesMovedRemote(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestMergeHeldWhileAnotherMerges(t *testing.T) {
|
||||
t.Parallel()
|
||||
e := newEnv(t)
|
||||
m := e.manager()
|
||||
second := e.addTask()
|
||||
|
||||
for i, task := range []api.Task{e.task, second} {
|
||||
_, err := m.Create(e.ctx, task, e.user, fmt.Sprintf("Create a file task%d.txt containing exactly the word task.", i), testModel)
|
||||
if err != nil {
|
||||
t.Fatalf("create session: %v", err)
|
||||
}
|
||||
e.waitIdle()
|
||||
}
|
||||
|
||||
first, err := m.Merge(e.ctx, e.task, e.project, e.user)
|
||||
if err != nil {
|
||||
t.Fatalf("merge first: %v", err)
|
||||
}
|
||||
if first.MergeQueuedAt != nil {
|
||||
t.Fatalf("first merge held: %+v", first)
|
||||
}
|
||||
held, err := m.Merge(e.ctx, second, e.project, e.user)
|
||||
if err != nil {
|
||||
t.Fatalf("merge second: %v", err)
|
||||
}
|
||||
if held.MergeQueuedAt == nil {
|
||||
t.Fatalf("second merge not held: %+v", held)
|
||||
}
|
||||
_, err = m.Merge(e.ctx, held, e.project, e.user)
|
||||
if !errors.Is(err, agents.ErrConflict) {
|
||||
t.Fatalf("merging a held task again: %v, want conflict", err)
|
||||
}
|
||||
|
||||
events := e.waitFor("second task merged", func(ev api.Event) bool {
|
||||
return ev.Kind == "task.merged" && *ev.TaskId == second.Id
|
||||
})
|
||||
firstMerged, unqueued := -1, -1
|
||||
for i, ev := range events {
|
||||
switch {
|
||||
case ev.Kind == "task.merged" && *ev.TaskId == e.task.Id:
|
||||
firstMerged = i
|
||||
case ev.Kind == "task.merge_unqueued" && *ev.TaskId == second.Id:
|
||||
unqueued = i
|
||||
case ev.Kind == "inbox.created" && ev.Payload["kind"] == string(api.SessionError):
|
||||
t.Fatalf("merge filed an error: %v", ev.Payload)
|
||||
}
|
||||
}
|
||||
if firstMerged < 0 || unqueued < firstMerged {
|
||||
t.Fatalf("held merge started at event %d, first merged at %d", unqueued, firstMerged)
|
||||
}
|
||||
|
||||
tasks := map[string]api.Task{}
|
||||
for _, id := range []string{e.task.Id, second.Id} {
|
||||
tasks[id], err = e.store.GetTask(e.ctx, id)
|
||||
if err != nil {
|
||||
t.Fatalf("get task: %v", err)
|
||||
}
|
||||
if tasks[id].Status != api.TaskStatusMerged || tasks[id].MergeCommit == nil || tasks[id].MergeQueuedAt != nil {
|
||||
t.Fatalf("task after merge %+v", tasks[id])
|
||||
}
|
||||
}
|
||||
if head := gitOut(t, e.remote, "rev-parse", "main"); head != *tasks[second.Id].MergeCommit {
|
||||
t.Fatalf("remote main at %s, want second merge commit %s", head, *tasks[second.Id].MergeCommit)
|
||||
}
|
||||
if parent := gitOut(t, e.remote, "rev-parse", "main^"); parent != *tasks[e.task.Id].MergeCommit {
|
||||
t.Fatalf("second merge commit parent %s, want first merge commit %s", parent, *tasks[e.task.Id].MergeCommit)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCreateTaskTool(t *testing.T) {
|
||||
t.Parallel()
|
||||
e := newEnv(t)
|
||||
|
||||
Reference in New Issue
Block a user