Mirror of https://git.jolheiser.com/ugit
at ffdhall 59 lines 1.5 kB view raw
1package git 2 3import ( 4 "context" 5 "io" 6 "strconv" 7 "strings" 8 9 "github.com/go-git/go-git/v5" 10 "github.com/go-git/go-git/v5/plumbing/protocol/packp" 11 "github.com/go-git/go-git/v5/plumbing/serverinfo" 12 "github.com/go-git/go-git/v5/storage/filesystem" 13) 14 15// ReadWriteContexter is the interface required to operate on git protocols 16type ReadWriteContexter interface { 17 io.ReadWriteCloser 18 Context() context.Context 19} 20 21type Protocoler interface { 22 HTTPInfoRefs(ReadWriteContexter) error 23 HTTPUploadPack(ReadWriteContexter) error 24 SSHUploadPack(ReadWriteContexter) error 25 SSHReceivePack(ReadWriteContexter, *Repo) error 26} 27 28// UpdateServerInfo handles updating server info for the git repo 29func UpdateServerInfo(repo string) error { 30 r, err := git.PlainOpen(repo) 31 if err != nil { 32 return err 33 } 34 fs := r.Storer.(*filesystem.Storage).Filesystem() 35 return serverinfo.UpdateServerInfo(r.Storer, fs) 36} 37 38// HandlePushOptions handles all relevant push options for a [Repo] and saves the new [RepoMeta] 39func HandlePushOptions(repo *Repo, opts []*packp.Option) error { 40 var changed bool 41 for _, opt := range opts { 42 switch strings.ToLower(opt.Key) { 43 case "desc", "description": 44 changed = repo.Meta.Description != opt.Value 45 repo.Meta.Description = opt.Value 46 case "private": 47 private, err := strconv.ParseBool(opt.Value) 48 if err != nil { 49 continue 50 } 51 changed = repo.Meta.Private != private 52 repo.Meta.Private = private 53 } 54 } 55 if changed { 56 return repo.SaveMeta() 57 } 58 return nil 59}