@@ -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.
125125func (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.
154158func (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 {
276280func (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 {
422422func (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+ }
0 commit comments