Mirror of https://git.jolheiser.com/ugit
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}