Mirror of https://git.jolheiser.com/ugit
at cue 1.9 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 case "tags": 54 tagValues := strings.Split(opt.Value, ",") 55 for _, tagValue := range tagValues { 56 var remove bool 57 if strings.HasPrefix(tagValue, "-") { 58 remove = true 59 tagValue = strings.TrimPrefix(tagValue, "-") 60 } 61 tagValue = strings.ToLower(tagValue) 62 if remove { 63 repo.Meta.Tags.Remove(tagValue) 64 } else { 65 repo.Meta.Tags.Add(tagValue) 66 } 67 } 68 } 69 } 70 if changed { 71 return repo.SaveMeta() 72 } 73 return nil 74}