Show the merge prompt before fetching so Merge has no blank pause
This commit is contained in:
@@ -117,12 +117,7 @@ func (m *Manager) projectMerge(projectID string) *projectMerge {
|
||||
}
|
||||
|
||||
func (m *Manager) startMerge(ctx context.Context, pm *projectMerge, task api.Task, project api.Project, user api.User) error {
|
||||
err := git.FetchFastForward(ctx, project.RepoPath, project.DefaultBranch)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = m.store.SetMergingBy(ctx, task.Id, user.Login)
|
||||
err := m.store.SetMergingBy(ctx, task.Id, user.Login)
|
||||
if errors.Is(err, store.ErrNotFound) {
|
||||
return fmt.Errorf("%w: task %s is being discarded", ErrConflict, task.Id)
|
||||
}
|
||||
@@ -131,13 +126,83 @@ func (m *Manager) startMerge(ctx context.Context, pm *projectMerge, task api.Tas
|
||||
}
|
||||
pm.holder = task.Id
|
||||
|
||||
prompt := mergeInPrompt(project.DefaultBranch) + fmt.Sprintf(" When this turn ends, byre squashes this branch onto %s and pushes it; if you stop, call stop_merge first so it doesn't. ", project.DefaultBranch) + summaryRequest
|
||||
_, err = m.sendMergeIn(ctx, task, user, prompt)
|
||||
sess, err := m.mergeSession(ctx, task, user)
|
||||
if err != nil {
|
||||
m.takeMerge(task.Id)
|
||||
pm.holder = ""
|
||||
return err
|
||||
}
|
||||
return err
|
||||
|
||||
prompt := mergeInPrompt(project.DefaultBranch) + fmt.Sprintf(" When this turn ends, byre squashes this branch onto %s and pushes it; if you stop, call stop_merge first so it doesn't. ", project.DefaultBranch) + summaryRequest
|
||||
go m.launchMerge(sess, task, project, prompt)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Manager) mergeSession(ctx context.Context, task api.Task, user api.User) (api.AgentSession, error) {
|
||||
sessions, err := m.store.ListSessions(ctx, task.Id)
|
||||
if err != nil {
|
||||
return api.AgentSession{}, err
|
||||
}
|
||||
|
||||
sess := api.AgentSession{}
|
||||
for _, s := range sessions {
|
||||
if s.State != api.AgentSessionStateCompleted {
|
||||
sess = s
|
||||
}
|
||||
}
|
||||
if sess.Id == "" {
|
||||
sess, err = m.newSession(ctx, task, user, "")
|
||||
if err != nil {
|
||||
return api.AgentSession{}, err
|
||||
}
|
||||
}
|
||||
|
||||
err = transition(ctx, m.store, sess.Id, api.AgentSessionStateIdle, api.AgentSessionStateRunning, "byre")
|
||||
return sess, err
|
||||
}
|
||||
|
||||
func (m *Manager) launchMerge(sess api.AgentSession, task api.Task, project api.Project, prompt string) {
|
||||
ctx := context.Background()
|
||||
err := m.deliverMerge(ctx, sess, task, project, prompt)
|
||||
if err == nil {
|
||||
return
|
||||
}
|
||||
slog.Error("start merge turn", "task", task.Id, "err", err)
|
||||
m.failStart(ctx, sess.Id, "byre", err)
|
||||
m.abandonMerge(task.Id, project.Id)
|
||||
}
|
||||
|
||||
func (m *Manager) deliverMerge(ctx context.Context, sess api.AgentSession, task api.Task, project api.Project, prompt string) error {
|
||||
l, err := m.ensureLive(ctx, sess, task)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = m.syncModel(ctx, l, sess.Model)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = m.prepareMessage(ctx, l, "byre", prompt, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
m.mu.Lock()
|
||||
l.fetching = true
|
||||
m.mu.Unlock()
|
||||
|
||||
err = git.FetchFastForward(ctx, project.RepoPath, project.DefaultBranch)
|
||||
|
||||
m.mu.Lock()
|
||||
l.fetching = false
|
||||
interrupted := l.interrupted
|
||||
m.mu.Unlock()
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if interrupted {
|
||||
return errors.New("interrupted before the merge started")
|
||||
}
|
||||
return l.sess.send(ctx, prompt, nil)
|
||||
}
|
||||
|
||||
func (m *Manager) recoverMerges(ctx context.Context) error {
|
||||
|
||||
Reference in New Issue
Block a user