repos / git-pr

a self-hosted git collaboration server
git clone https://github.com/picosh/git-pr.git

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 					}