Hold a task's merge while another task in the project is merging
This commit is contained in:
@@ -66,6 +66,9 @@ type Manager struct {
|
||||
setups map[string]bool
|
||||
setupFailures map[string]string
|
||||
|
||||
mergeMu sync.Mutex
|
||||
mergeHolders map[string]string
|
||||
|
||||
bad *badLines
|
||||
watchStop chan struct{}
|
||||
}
|
||||
@@ -111,6 +114,7 @@ func New(st *store.Store, limits Limits, worktreeRoot, leadRoot string) *Manager
|
||||
snaps: map[string]*snapState{},
|
||||
setups: map[string]bool{},
|
||||
setupFailures: map[string]string{},
|
||||
mergeHolders: map[string]string{},
|
||||
bad: newBadLines(),
|
||||
watchStop: make(chan struct{}),
|
||||
}
|
||||
@@ -270,6 +274,11 @@ func (m *Manager) retire(ctx context.Context, sess api.AgentSession, actor strin
|
||||
}
|
||||
|
||||
func (m *Manager) Recover(ctx context.Context) error {
|
||||
err := m.recoverMerges(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
sessions, err := m.store.SessionsInState(ctx, api.AgentSessionStateRunning)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -290,7 +299,7 @@ func (m *Manager) Recover(ctx context.Context) error {
|
||||
return err
|
||||
}
|
||||
if sess.Owner == "" {
|
||||
m.takeMerge(task.Id)
|
||||
m.abandonMerge(task.Id, task.ProjectId)
|
||||
}
|
||||
continue
|
||||
}
|
||||
@@ -312,6 +321,7 @@ func (m *Manager) Recover(ctx context.Context) error {
|
||||
}
|
||||
|
||||
go m.deliverAllLeads()
|
||||
go m.startHeldMerges(context.Background())
|
||||
return m.drain(ctx)
|
||||
}
|
||||
|
||||
@@ -764,7 +774,7 @@ func (m *Manager) pump(l *live) {
|
||||
slog.Error("record session exit", "session", l.id, "err", err)
|
||||
}
|
||||
if l.owner == "" {
|
||||
m.takeMerge(l.taskID)
|
||||
m.abandonMerge(l.taskID, l.projectID)
|
||||
m.fileError(l, "The agent process exited mid-turn. Send a message to resume it.")
|
||||
}
|
||||
|
||||
@@ -925,10 +935,15 @@ func (m *Manager) handle(ctx context.Context, l *live, ev claude.Event) error {
|
||||
return nil
|
||||
}
|
||||
mergeBy := m.takeMerge(l.taskID)
|
||||
if mergeBy != "" && finished {
|
||||
switch {
|
||||
case mergeBy != "" && finished:
|
||||
m.logUndelivered(ctx, l.id, "turn ended in merge")
|
||||
go m.finishMerge(l, mergeBy)
|
||||
return nil
|
||||
case mergeBy != "":
|
||||
go m.releaseMerge(l.projectID, l.taskID)
|
||||
default:
|
||||
go m.nextMerge(l.projectID)
|
||||
}
|
||||
err = m.Deliver(ctx, l.id)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user