This commit is contained in:
Ian Gulliver
2026-10-14 21:01:38 -07:00
parent 9e741ede32
commit b2bd894677
20 changed files with 585 additions and 343 deletions
+20 -53
View File
@@ -291,49 +291,33 @@ func (s *Server) MergeTask(w http.ResponseWriter, r *http.Request, taskID string
writeStoreError(w, err)
return
}
if u.GitName == "" || u.GitEmail == "" {
writeError(w, http.StatusBadRequest, errors.New("set your git name and email (PUT /api/me) before merging"))
sess, err := s.agents.Merge(r.Context(), t, p, u)
if err != nil {
writeAgentError(w, err)
return
}
writeJSON(w, http.StatusAccepted, sess)
}
func (s *Server) MergeIn(w http.ResponseWriter, r *http.Request, taskID string) {
t, p, ok := s.activeTask(w, r, taskID)
if !ok {
return
}
sessions, err := s.store.ListSessions(r.Context(), t.Id)
u, err := s.store.GetUser(r.Context(), actor(r))
if err != nil {
writeStoreError(w, err)
return
}
for _, sess := range sessions {
if sess.State == api.AgentSessionStateRunning || sess.State == api.AgentSessionStateQueued {
writeError(w, http.StatusConflict, fmt.Errorf("session %s is %s; wait for the turn to end or interrupt it", sess.Id, sess.State))
return
}
}
commit, err := git.SquashMerge(p.RepoPath, t.WorktreePath, p.DefaultBranch, squashMessage(t), []string{
"GIT_AUTHOR_NAME=" + u.GitName,
"GIT_AUTHOR_EMAIL=" + u.GitEmail,
"GIT_COMMITTER_NAME=" + u.GitName,
"GIT_COMMITTER_EMAIL=" + u.GitEmail,
})
conflict := &git.ConflictError{}
if errors.As(err, &conflict) {
writeError(w, http.StatusConflict, err)
return
}
sess, err := s.agents.MergeIn(r.Context(), t, u, p.DefaultBranch)
if err != nil {
writeError(w, http.StatusInternalServerError, err)
writeAgentError(w, err)
return
}
if !s.removeTask(w, r, t, p) {
return
}
t, err = s.store.MergeTask(r.Context(), taskID, commit, actor(r))
if err != nil {
writeStoreError(w, err)
return
}
writeJSON(w, http.StatusOK, t)
writeJSON(w, http.StatusAccepted, sess)
}
func (s *Server) DiscardTask(w http.ResponseWriter, r *http.Request, taskID string) {
@@ -342,11 +326,13 @@ func (s *Server) DiscardTask(w http.ResponseWriter, r *http.Request, taskID stri
return
}
if !s.removeTask(w, r, t, p) {
err := s.agents.RemoveTask(r.Context(), t, p, actor(r))
if err != nil {
writeError(w, http.StatusInternalServerError, err)
return
}
t, err := s.store.DiscardTask(r.Context(), taskID, actor(r))
t, err = s.store.DiscardTask(r.Context(), taskID, actor(r))
if err != nil {
writeStoreError(w, err)
return
@@ -354,10 +340,6 @@ func (s *Server) DiscardTask(w http.ResponseWriter, r *http.Request, taskID stri
writeJSON(w, http.StatusOK, t)
}
func squashMessage(t api.Task) string {
return t.Title
}
func (s *Server) activeTask(w http.ResponseWriter, r *http.Request, taskID string) (api.Task, api.Project, bool) {
t, err := s.store.GetTask(r.Context(), taskID)
if err != nil {
@@ -378,21 +360,6 @@ func (s *Server) activeTask(w http.ResponseWriter, r *http.Request, taskID strin
return t, p, true
}
func (s *Server) removeTask(w http.ResponseWriter, r *http.Request, t api.Task, p api.Project) bool {
err := s.agents.StopTask(r.Context(), t.Id, actor(r))
if err != nil {
writeError(w, http.StatusInternalServerError, err)
return false
}
err = git.RemoveWorktree(p.RepoPath, t.WorktreePath, t.Branch)
if err != nil {
writeError(w, http.StatusInternalServerError, err)
return false
}
return true
}
func (s *Server) GetStatus(w http.ResponseWriter, r *http.Request) {
c, err := s.store.Counts(r.Context())
if err != nil {