- commit
- 0ea845e
- parent
- 27c3aef
- author
- Eric Bower
- date
- 2024-05-07 16:58:09 -0400 EDT
working
1 files changed,
+54,
-36
M
mdw.go
M
mdw.go
+54,
-36
1@@ -19,17 +19,17 @@ import (
2 "github.com/charmbracelet/wish"
3 )
4
5-func gitServiceCommands(sesh ssh.Session, be *Backend, cmd, repo string) error {
6- name := utils.SanitizeRepo(repo)
7+func gitServiceCommands(sesh ssh.Session, be *Backend, cmd, repoName string) error {
8+ name := utils.SanitizeRepo(repoName)
9 // git bare repositories should end in ".git"
10 // https://git-scm.com/docs/gitrepository-layout
11- repoName := name + ".git"
12+ repoID := be.RepoID(name)
13 reposDir := be.ReposDir()
14- err := git.EnsureWithin(reposDir, repoName)
15+ err := git.EnsureWithin(reposDir, repoID)
16 if err != nil {
17 return err
18 }
19- repoPath := filepath.Join(reposDir, repoName)
20+ repoPath := filepath.Join(reposDir, repoID)
21 serviceCmd := git.ServiceCommand{
22 Stdin: sesh,
23 Stdout: sesh,
24@@ -53,12 +53,6 @@ func gitServiceCommands(sesh ssh.Session, be *Backend, cmd, repo string) error {
25 return nil
26 }
27
28-func try(sesh ssh.Session, err error) {
29- if err != nil {
30- wish.Fatalln(sesh, err)
31- }
32-}
33-
34 func flagSet(sesh ssh.Session, cmdName string) *flag.FlagSet {
35 cmd := flag.NewFlagSet(cmdName, flag.ContinueOnError)
36 cmd.SetOutput(sesh)
37@@ -76,7 +70,7 @@ func flagSet(sesh ssh.Session, cmdName string) *flag.FlagSet {
38 type GitPatchRequest interface {
39 GetRepos() ([]string, error)
40 SubmitPatchRequest(pubkey string, repoID string, patches io.Reader) (*PatchRequest, error)
41- SubmitPatch(pubkey string, prID int64, patch io.Reader, review bool) (*Patch, error)
42+ SubmitPatch(pubkey string, prID int64, review bool, patch io.Reader) (*Patch, error)
43 GetPatchRequests() ([]*PatchRequest, error)
44 GetPatchesByPrID(prID int64) ([]*Patch, error)
45 UpdatePatchRequest(prID int64, status string) error
46@@ -136,15 +130,12 @@ func (cmd PrCmd) UpdatePatchRequest(prID int64, status string) error {
47 return err
48 }
49
50-func (cmd PrCmd) SubmitPatch(pubkey string, prID int64, patch io.Reader, review bool) (*Patch, error) {
51+func (cmd PrCmd) SubmitPatch(pubkey string, prID int64, review bool, patch io.Reader) (*Patch, error) {
52 pr := PatchRequest{}
53 err := cmd.Backend.DB.Get(&pr, "SELECT * FROM patch_requests WHERE id=?", prID)
54 if err != nil {
55 return nil, err
56 }
57- if pr.ID == 0 {
58- return nil, fmt.Errorf("patch request (ID: %d) does not exist", prID)
59- }
60
61 // need to read io.Reader from session twice
62 var buf bytes.Buffer
63@@ -179,7 +170,7 @@ func (cmd PrCmd) SubmitPatch(pubkey string, prID int64, patch io.Reader, review
64 }
65
66 var patchRec Patch
67- err = cmd.Backend.DB.Get(&patchRec, "SELECT * FROM patches WHERE id=?")
68+ err = cmd.Backend.DB.Get(&patchRec, "SELECT * FROM patches WHERE id=?", patchID)
69 return &patchRec, err
70 }
71
72@@ -260,12 +251,18 @@ func GitPatchRequestMiddleware(be *Backend, pr GitPatchRequest) wish.Middleware
73 if cmd == "git-receive-pack" || cmd == "git-upload-pack" {
74 repoName := args[1]
75 err := gitServiceCommands(sesh, be, cmd, repoName)
76- try(sesh, err)
77+ if err != nil {
78+ wish.Fatalln(sesh, err)
79+ return
80+ }
81 } else if cmd == "help" {
82 wish.Println(sesh, "commands: [help, pr, ls, git-receive-pack, git-upload-pack]")
83 } else if cmd == "ls" {
84 repos, err := pr.GetRepos()
85- try(sesh, err)
86+ if err != nil {
87+ wish.Fatalln(sesh, err)
88+ return
89+ }
90 wish.Printf(sesh, "Name\tDir\n")
91 for _, repo := range repos {
92 wish.Printf(
93@@ -282,19 +279,26 @@ func GitPatchRequestMiddleware(be *Backend, pr GitPatchRequest) wish.Middleware
94 closed := prCmd.Bool("close", false, "mark patch request as closed")
95 review := prCmd.Bool("review", false, "mark patch request as reviewed")
96
97- fmt.Println(args)
98+ var err error
99+ err = prCmd.Parse(args[2:])
100+ if err != nil {
101+ wish.Fatalln(sesh, err)
102+ return
103+ }
104 subCmd := strings.TrimSpace(args[1])
105
106 repoID := ""
107 var prID int64
108- var err error
109 // figure out subcommand based on what was passed in
110 if subCmd == "ls" {
111 // skip proccessing
112 } else if isNumRe.MatchString(subCmd) {
113 // we probably have a patch request id
114 prID, err = strconv.ParseInt(subCmd, 10, 64)
115- try(sesh, err)
116+ if err != nil {
117+ wish.Fatalln(sesh, err)
118+ return
119+ }
120 subCmd = "patchRequest"
121 } else {
122 // we probably have a repo name
123@@ -304,7 +308,10 @@ func GitPatchRequestMiddleware(be *Backend, pr GitPatchRequest) wish.Middleware
124
125 if subCmd == "ls" {
126 prs, err := pr.GetPatchRequests()
127- try(sesh, err)
128+ if err != nil {
129+ wish.Fatalln(sesh, err)
130+ return
131+ }
132 wish.Printf(sesh, "Name\tID\n")
133 for _, req := range prs {
134 wish.Printf(sesh, "%s\t%d\n", req.Name, req.ID)
135@@ -319,9 +326,12 @@ func GitPatchRequestMiddleware(be *Backend, pr GitPatchRequest) wish.Middleware
136 } else if subCmd == "patchRequest" {
137 if *out {
138 patches, err := pr.GetPatchesByPrID(prID)
139- try(sesh, err)
140+ if err != nil {
141+ wish.Fatalln(sesh, err)
142+ return
143+ }
144
145- if len(patches) == 0 {
146+ if len(patches) == 1 {
147 wish.Println(sesh, patches[0].RawText)
148 return
149 }
150@@ -335,37 +345,45 @@ func GitPatchRequestMiddleware(be *Backend, pr GitPatchRequest) wish.Middleware
151 return
152 }
153 err := pr.UpdatePatchRequest(prID, "accept")
154- try(sesh, err)
155+ if err != nil {
156+ wish.Fatalln(sesh, err)
157+ return
158+ }
159 } else if *closed {
160 if !be.IsAdmin(sesh.PublicKey()) {
161 wish.Fatalln(sesh, "must be admin to close PR")
162 return
163 }
164 err := pr.UpdatePatchRequest(prID, "close")
165- try(sesh, err)
166+ if err != nil {
167+ wish.Fatalln(sesh, err)
168+ return
169+ }
170 } else {
171- rv := *review
172 isAdmin := be.IsAdmin(sesh.PublicKey())
173- if !isAdmin {
174- rv = false
175- }
176 var req PatchRequest
177 err = be.DB.Get(&req, "SELECT * FROM patch_requests WHERE id=?", prID)
178- try(sesh, err)
179- isOwner := req.Pubkey != be.Pubkey(sesh.PublicKey())
180- if !isAdmin && !isOwner {
181+ if err != nil {
182+ wish.Fatalln(sesh, err)
183+ return
184+ }
185+ isPrOwner := req.Pubkey == be.Pubkey(sesh.PublicKey())
186+ if !isAdmin && !isPrOwner {
187 wish.Fatalln(sesh, "unauthorized, you are not the owner of this Patch Request")
188 return
189 }
190
191- patch, err := pr.SubmitPatch(pubkey, prID, sesh, rv)
192+ patch, err := pr.SubmitPatch(pubkey, prID, *review, sesh)
193 if err != nil {
194 wish.Fatalln(sesh, err)
195 return
196 }
197 if *review {
198 err = pr.UpdatePatchRequest(prID, "review")
199- try(sesh, err)
200+ if err != nil {
201+ wish.Fatalln(sesh, err)
202+ return
203+ }
204 }
205 wish.Printf(sesh, "Patch submitted! (ID:%d)\n", patch.ID)
206 }