Artifact 9e7fa0f6d7ee501c950d964e3f4954dc03f8ea71ee5f8362022588bd4c349052:
- File
cli/repo_invite.go
— part of check-in
[f5744359d3]
at
2026-04-19 16:30:54
on branch trunk
— Initial open source release
libfossil is a pure-Go implementation of the Fossil SCM, reading and writing the same .fossil SQLite repository format as upstream Fossil.
This is the first public release of code that previously lived in a private repository. The module path is github.com/danmestas/libfossil and the binary is named libfossil to avoid $PATH collisions with upstream fossil.
Included: - Repo lifecycle (create, clone), checkout/checkin, timeline, merge, diff, annotate, shun, tag, branch, bisect, stash, undo/redo - Sync-over-HTTP protocol (client and handler) - Two SQLite drivers: modernc (pure Go, default) and ncruces (wasm-capable) - Observer interfaces (SyncObserver, CheckoutObserver) with an optional OpenTelemetry implementation in observer/otel (separate submodule) - Deterministic simulation testing harness with BUGGIFY fault injection - Kong-based embeddable CLI under cli/ and a standalone binary under cmd/libfossil/ (user: [email protected], size: 1624) [annotate] [blame] [check-ins using]
package cli import ( "fmt" "time" libfossil "github.com/danmestas/libfossil" "github.com/danmestas/libfossil/internal/auth" ) // RepoInviteCmd generates an invite token for a new user. type RepoInviteCmd struct { Login string `arg:"" help:"Username for the invitee"` Cap string `help:"Capability string (e.g. oi)" required:""` URL string `help:"Sync URL to embed in token" default:""` TTL time.Duration `help:"Token time-to-live (e.g. 24h)" default:"0"` } func (c *RepoInviteCmd) Run(g *Globals) error { r, err := g.OpenRepo() if err != nil { return err } defer r.Close() password, err := generatePassword() if err != nil { return err } if err := r.CreateUser(libfossil.UserOpts{ Login: c.Login, Password: password, Caps: c.Cap, }); err != nil { return err } if c.TTL > 0 { expiry := time.Now().Add(c.TTL).Format("2006-01-02 15:04:05") r.Inner().DB().Exec("UPDATE user SET cexpire=? WHERE login=?", expiry, c.Login) } url := c.URL if url == "" { val, err := r.Config("last-sync-url") if err == nil { url = val } } tok := auth.InviteToken{ URL: url, Login: c.Login, Password: password, Caps: c.Cap, } encoded := tok.Encode() fmt.Printf("Invite for %q (capabilities: %s", c.Login, c.Cap) if c.TTL > 0 { fmt.Printf(", expires: %s", time.Now().Add(c.TTL).Format(time.RFC3339)) } fmt.Println("):") fmt.Println() fmt.Printf(" fossil repo clone --invite %s\n", encoded) fmt.Println() fmt.Println("Share this command with the recipient. It contains credentials - treat it like a password.") return nil }