diff --git a/Ollie b/Ollie new file mode 100755 index 0000000..625f7bb Binary files /dev/null and b/Ollie differ diff --git a/cmd/Ollie/main.go b/cmd/Ollie/main.go index 8e4d112..0135975 100644 --- a/cmd/Ollie/main.go +++ b/cmd/Ollie/main.go @@ -153,15 +153,26 @@ func (sl *sessionList) refresh() { sl.mu.Lock() sl.allSIDs = nil + var display strings.Builder for _, l := range lines { if s := strings.TrimSpace(l); s != "" { - id, _, _ := strings.Cut(s, "\t") + id, rest, _ := strings.Cut(s, "\t") sl.allSIDs = append(sl.allSIDs, id) + short := id + if idx := strings.IndexByte(id, '-'); idx > 0 { + short = id[:idx] + } + display.WriteString(short) + if rest != "" { + display.WriteByte('\t') + display.WriteString(rest) + } + display.WriteByte('\n') } } sl.mu.Unlock() - sl.win.Write("body", []byte(raw+"\n")) + sl.win.Write("body", []byte(display.String())) sl.win.Ctl("clean") } @@ -173,8 +184,11 @@ func (sl *sessionList) resolveFullSID(text string) string { sl.mu.Lock() defer sl.mu.Unlock() for _, sid := range sl.allSIDs { - parts := strings.Split(sid, "__") - if parts[len(parts)-1] == text { + short := sid + if idx := strings.IndexByte(sid, '-'); idx > 0 { + short = sid[:idx] + } + if short == text || sid == text { return sid } } @@ -238,7 +252,11 @@ func openChat(sid string) { log.Printf("open chat %s: %v", sid, err) return } - winName := "ollie/sessions/" + sid + short := sid + if idx := strings.IndexByte(sid, '-'); idx > 0 { + short = sid[:idx] + } + winName := "ollie/sessions/" + short if data, err := read9p("session/idx"); err == nil { for _, line := range strings.Split(string(data), "\n") { fields := strings.Split(line, "\t") diff --git a/session/session.go b/session/session.go index 6ff2633..4bcb557 100644 --- a/session/session.go +++ b/session/session.go @@ -7,7 +7,6 @@ import ( "io" "os" "path/filepath" - "strconv" "strings" "sync" "time" @@ -65,11 +64,14 @@ type Session struct { saveTimer *time.Timer } -// NewSessionID generates a unique, lexicographically sortable session identifier. +// NewSessionID generates a UUIDv4 session identifier. func NewSessionID() string { - b := make([]byte, 3) + b := make([]byte, 16) rand.Read(b) //nolint:errcheck - return strconv.FormatInt(time.Now().UnixNano(), 10) + "-" + fmt.Sprintf("%06x", b) + b[6] = (b[6] & 0x0f) | 0x40 // version 4 + b[8] = (b[8] & 0x3f) | 0x80 // variant 10xx + return fmt.Sprintf("%08x-%04x-%04x-%04x-%012x", + b[0:4], b[4:6], b[6:8], b[8:10], b[10:16]) } // NextUncheckedStep returns the first unchecked step from plan bytes.