Skip to content

Commit cd7ee08

Browse files
committed
Merge branch 'main' into qualified_update
2 parents 3505314 + df9529f commit cd7ee08

File tree

7 files changed

+47
-28
lines changed

7 files changed

+47
-28
lines changed

api/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@ require (
99
github.com/magefile/mage v1.15.0
1010
)
1111

12-
require golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359 // indirect
12+
require golang.org/x/sys v0.1.0 // indirect

api/go.sum

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
1313
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
1414
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
1515
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
16-
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359 h1:2B5p2L5IfGiD7+b9BOoRMC6DgObAVZV+Fsp050NqXik=
1716
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
17+
golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
18+
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1819
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
1920
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
2021
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

cmd/new.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cmd
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"log/slog"
78

@@ -33,6 +34,7 @@ func newWorkUnit(ctx context.Context, workUnitName string, ctor workUnitCtor) er
3334
return err
3435
}
3536
srv := tmux.MaybeCurrentServer()
37+
hasCurrentServer := srv != nil
3638
if srv == nil {
3739
srv = tmux.DefaultServer()
3840
}
@@ -56,10 +58,14 @@ func newWorkUnit(ctx context.Context, workUnitName string, ctor workUnitCtor) er
5658
if err != nil {
5759
return err
5860
}
59-
if err := srv.AttachOrSwitch(ctx, sesh); err != nil {
60-
return fmt.Errorf("failed to attach to newly created session %q: %w", sesh.ID(), err)
61+
if !hasCurrentServer {
62+
// Attaching to a session hangs until the client is detached.
63+
err = stopTrace()
6164
}
62-
return nil
65+
if err1 := srv.AttachOrSwitch(ctx, sesh); err1 != nil {
66+
err = errors.Join(err, fmt.Errorf("failed to attach to newly created session %q: %w", sesh.ID(), err))
67+
}
68+
return err
6369
}
6470

6571
type sessionKey struct {

cmd/root.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ var stopTrace = sync.OnceValue(func() error {
175175
if err := f.Close(); err != nil {
176176
return fmt.Errorf("closing trace file: %w", err)
177177
}
178+
} else {
179+
slog.Debug("Not recording trace.", "duration", dur)
178180
}
179181
return nil
180182
})

cmd/update.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ func update(ctx context.Context) error {
154154
if err != nil {
155155
return err
156156
}
157-
return updateTmux(ctx, state, curRepo, curWorkUnit)
157+
return updateTmux(ctx, state, curRepo, curWorkUnit, true)
158158
}
159159

160160
// Executed within tmux. Update the repo state.
@@ -174,7 +174,7 @@ func update(ctx context.Context) error {
174174
return nil
175175
}
176176

177-
func updateTmux(ctx context.Context, st *state.State, repo api.Repository, workUnit string) error {
177+
func updateTmux(ctx context.Context, st *state.State, repo api.Repository, workUnit string, endTrace bool) error {
178178
sesh := st.Session(repo, workUnit)
179179
if sesh == nil {
180180
var err error
@@ -183,7 +183,12 @@ func updateTmux(ctx context.Context, st *state.State, repo api.Repository, workU
183183
return err
184184
}
185185
}
186-
return sesh.Server().AttachOrSwitch(ctx, sesh)
186+
var err error
187+
if endTrace {
188+
// Attaching to a session hangs until the client is detached.
189+
err = stopTrace()
190+
}
191+
return errors.Join(sesh.Server().AttachOrSwitch(ctx, sesh), err)
187192
}
188193

189194
func updateTo(ctx context.Context, sessionName state.WorkUnitName) error {
@@ -229,7 +234,7 @@ func updateTo(ctx context.Context, sessionName state.WorkUnitName) error {
229234
needsSwitch = true
230235
}
231236
if needsSwitch {
232-
if err := updateTmux(ctx, st, repo, sessionName.WorkUnit); err != nil {
237+
if err := updateTmux(ctx, st, repo, workUnitName, !hasCurrentServer); err != nil {
233238
return err
234239
}
235240
update = true

tmux/state/state.go

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type State struct {
2222
sessions tmux.Sessions
2323

2424
// tmux sessions in srv with their associated repositories.
25-
sessionsByName map[WorkUnitName]tmux.Session
25+
sessionsByName map[WorkUnitName]session
2626
sessionsByID map[string]workUnit
2727
// An index of unqualified repo names that exist in sessions.
2828
unqualifiedRepos map[string]int
@@ -43,7 +43,7 @@ func New(ctx context.Context, srv tmux.Server, vcs api.VersionControlSystems) (*
4343
st := &State{
4444
srv: srv,
4545
sessions: sessions,
46-
sessionsByName: make(map[WorkUnitName]tmux.Session),
46+
sessionsByName: make(map[WorkUnitName]session),
4747
sessionsByID: make(map[string]workUnit),
4848
unqualifiedRepos: make(map[string]int),
4949
repos: make(map[RepoName]api.Repository),
@@ -103,7 +103,7 @@ func New(ctx context.Context, srv tmux.Server, vcs api.VersionControlSystems) (*
103103
}
104104

105105
parsed := ParseSessionName(repo, name)
106-
st.sessionsByName[parsed] = sesh
106+
st.sessionsByName[parsed] = session{sesh, name}
107107
st.sessionsByID[sesh.ID()] = workUnit{repo, parsed.WorkUnit}
108108
st.unqualifiedRepos[parsed.Repo]++
109109
logger.Info("Found work unit in tmux session.", "name", parsed)
@@ -123,7 +123,11 @@ func (st *State) SessionName(n WorkUnitName) string {
123123

124124
// Sessions returns all tmux sessions keyed by their work unit.
125125
func (st *State) Sessions() map[WorkUnitName]tmux.Session {
126-
return maps.Clone(st.sessionsByName)
126+
ret := make(map[WorkUnitName]tmux.Session, len(st.sessionsByName))
127+
for k, v := range st.sessionsByName {
128+
ret[k] = v.sesh
129+
}
130+
return ret
127131
}
128132

129133
// UnknownSessions returns all tmux sessions that didn't appear to have a work
@@ -153,11 +157,11 @@ func (st *State) Repositories() map[RepoName]api.Repository {
153157
// Session determines if a tmux session for the given work unit exists.
154158
func (st *State) Session(repo api.Repository, workUnitName string) tmux.Session {
155159
n := NewWorkUnitName(repo, workUnitName)
156-
ret := st.sessionsByName[n]
157-
if ret != nil {
158-
slog.Info("Found existing tmux session for work unit.", "id", ret.ID(), "name", n)
160+
ret, ok := st.sessionsByName[n]
161+
if ok {
162+
slog.Info("Found existing tmux session for work unit.", "id", ret.sesh.ID(), "name", n)
159163
}
160-
return ret
164+
return ret.sesh
161165
}
162166

163167
// NewSession creates a tmux session for the given work unit.
@@ -177,7 +181,7 @@ func (st *State) NewSession(ctx context.Context, repo api.Repository, workUnitNa
177181
return nil, fmt.Errorf("failed to create tmux session %q: %w", n, err)
178182
}
179183

180-
st.sessionsByName[name] = sesh
184+
st.sessionsByName[name] = session{sesh, n}
181185
st.sessionsByID[sesh.ID()] = workUnit{repo, name.WorkUnit}
182186
st.unqualifiedRepos[name.Repo]++
183187
st.repos[name.RepoName] = repo
@@ -204,13 +208,13 @@ func (st *State) RenameSession(ctx context.Context, repo api.Repository, old, ne
204208
return fmt.Errorf("tmux session %q already exists", st.SessionName(newName))
205209
}
206210

207-
if err := sesh.Rename(ctx, st.SessionName(newName)); err != nil {
211+
if err := sesh.sesh.Rename(ctx, st.SessionName(newName)); err != nil {
208212
return err
209213
}
210214

211215
delete(st.sessionsByName, oldName)
212216
st.sessionsByName[newName] = sesh
213-
st.sessionsByID[sesh.ID()] = workUnit{repo, newName.WorkUnit}
217+
st.sessionsByID[sesh.sesh.ID()] = workUnit{repo, newName.WorkUnit}
214218

215219
if err := st.updateSessionNames(ctx); err != nil {
216220
slog.Warn("Failed to update tmux session names.", "error", err)
@@ -276,14 +280,10 @@ func (st *State) PruneSessions(ctx context.Context) error {
276280
func (st *State) updateSessionNames(ctx context.Context) error {
277281
defer trace.StartRegion(ctx, "State.updateSessionNames()").End()
278282

279-
names, err := st.sessions.Property(ctx, tmux.SessionName)
280-
if err != nil {
281-
return fmt.Errorf("could not resolve session names: %w", err)
282-
}
283283
var errs []error
284284
for k, sesh := range st.sessionsByName {
285-
if got, want := names[sesh], st.SessionName(k); got != want {
286-
if err := sesh.Rename(ctx, want); err != nil {
285+
if got, want := sesh.name, st.SessionName(k); got != want {
286+
if err := sesh.sesh.Rename(ctx, want); err != nil {
287287
errs = append(errs, err)
288288
continue
289289
}
@@ -422,3 +422,8 @@ type workUnit struct {
422422
func (wu workUnit) name() WorkUnitName {
423423
return NewWorkUnitName(wu.repo, wu.workUnitName)
424424
}
425+
426+
type session struct {
427+
sesh tmux.Session
428+
name string
429+
}

tmux/state/state_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -551,8 +551,8 @@ func simplifyState(t *testing.T, st *State) simplifiedState {
551551
for n, sesh := range st.sessionsByName {
552552
ret.WorkUnits = append(ret.WorkUnits, n)
553553

554-
if wu, ok := st.sessionsByID[sesh.ID()]; !ok || wu.name() != n {
555-
t.Errorf("sessionsByID[%q] = %q, %t, expected %q", sesh.ID(), wu.name(), ok, n)
554+
if wu, ok := st.sessionsByID[sesh.sesh.ID()]; !ok || wu.name() != n {
555+
t.Errorf("sessionsByID[%q] = %q, %t, expected %q", sesh.sesh.ID(), wu.name(), ok, n)
556556
}
557557
}
558558
for id, wu := range st.sessionsByID {

0 commit comments

Comments
 (0)