repos / git-pr

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

commit
69f5fd6
parent
24079e6
author
Eric Bower
date
2025-03-13 13:16:06 -0400 EDT
refactor(cli): replace `pr print` with `print`

chore(cli): remove `pr diff`
4 files changed,  +65, -97
M cli.go
M cli.go
+55, -85
  1@@ -148,8 +148,33 @@ func prSummary(be *Backend, pr GitPatchRequest, sesh ssh.Session, prID int64) er
  2 	return nil
  3 }
  4 
  5+func printPatchsetFromID(sesh ssh.Session, pr GitPatchRequest, psID int64) error {
  6+	patches, err := pr.GetPatchesByPatchsetID(psID)
  7+	if err != nil {
  8+		return err
  9+	}
 10+	printPatches(sesh, patches)
 11+	return nil
 12+}
 13+
 14+func printPatchsetFromPrID(sesh ssh.Session, pr GitPatchRequest, prID int64) error {
 15+	patchsets, err := pr.GetPatchsetsByPrID(prID)
 16+	if err != nil {
 17+		return err
 18+	}
 19+	ps := patchsets[len(patchsets)-1]
 20+	patches, err := pr.GetPatchesByPatchsetID(ps.ID)
 21+	if err != nil {
 22+		return err
 23+	}
 24+
 25+	printPatches(sesh, patches)
 26+	return nil
 27+}
 28+
 29 func NewCli(sesh ssh.Session, be *Backend, pr GitPatchRequest) *cli.App {
 30-	desc := `Patch requests (PR) are the simplest way to submit, review, and accept changes to your git repository.
 31+	desc := `Patchbin: a supercharged pastebin for git collaboration.
 32+
 33 Here's how it works:
 34 	- External contributor clones repo (git-clone)
 35 	- External contributor makes a code change (git-add & git-commit)
 36@@ -347,6 +372,35 @@ Here's how it works:
 37 					},
 38 				},
 39 			},
 40+			{
 41+				Name:      "print",
 42+				Usage:     "Print patches in a patchset",
 43+				Args:      true,
 44+				ArgsUsage: "[pr-X] or [ps-X]",
 45+				Action: func(cCtx *cli.Context) error {
 46+					args := cCtx.Args()
 47+					raw := args.First()
 48+					split := strings.Split(raw, "-")
 49+					if len(split) < 2 {
 50+						return fmt.Errorf("must provide ID in format: pr-X, ps-X")
 51+					}
 52+
 53+					prefix := split[0]
 54+					id, err := strToInt(split[1])
 55+					if err != nil {
 56+						return err
 57+					}
 58+
 59+					switch prefix {
 60+					case "pr":
 61+						err = printPatchsetFromPrID(sesh, pr, id)
 62+					case "ps":
 63+						err = printPatchsetFromID(sesh, pr, id)
 64+					}
 65+
 66+					return err
 67+				},
 68+			},
 69 			{
 70 				Name:  "pr",
 71 				Usage: "Manage Patch Requests (PR)",
 72@@ -522,90 +576,6 @@ Here's how it works:
 73 							return prSummary(be, pr, sesh, prq.ID)
 74 						},
 75 					},
 76-					{
 77-						Name:      "diff",
 78-						Usage:     "Print a diff between the last two patchsets in a PR",
 79-						Args:      true,
 80-						ArgsUsage: "[prID]",
 81-						Action: func(cCtx *cli.Context) error {
 82-							args := cCtx.Args()
 83-							if !args.Present() {
 84-								return fmt.Errorf("must provide a patch request ID")
 85-							}
 86-
 87-							prID, err := strToInt(args.First())
 88-							if err != nil {
 89-								return err
 90-							}
 91-
 92-							patchsets, err := pr.GetPatchsetsByPrID(prID)
 93-							if err != nil {
 94-								be.Logger.Error("cannot get latest patchset", "err", err)
 95-								return err
 96-							}
 97-
 98-							if len(patchsets) == 0 {
 99-								return fmt.Errorf("no patchsets found for pr: %d", prID)
100-							}
101-
102-							latest := patchsets[len(patchsets)-1]
103-							var prev *Patchset
104-							if len(patchsets) > 1 {
105-								prev = patchsets[len(patchsets)-2]
106-							}
107-
108-							rangeDiff, err := pr.DiffPatchsets(prev, latest)
109-							if err != nil {
110-								be.Logger.Error("could not diff patchset", "err", err)
111-								return err
112-							}
113-
114-							wish.Println(sesh, RangeDiffToStr(rangeDiff))
115-							return nil
116-						},
117-					},
118-					{
119-						Name:      "print",
120-						Usage:     "Print the patches for a PR",
121-						Args:      true,
122-						ArgsUsage: "[prID]",
123-						Flags: []cli.Flag{
124-							&cli.StringFlag{
125-								Name:    "patchset",
126-								Usage:   "Provide patchset ID to print a specific patchset (`patchset-xxx`, default is latest)",
127-								Aliases: []string{"ps"},
128-							},
129-						},
130-						Action: func(cCtx *cli.Context) error {
131-							args := cCtx.Args()
132-							if !args.Present() {
133-								return fmt.Errorf("must provide a patch request ID")
134-							}
135-
136-							prID, err := strToInt(args.First())
137-							if err != nil {
138-								return err
139-							}
140-
141-							patchsets, err := pr.GetPatchsetsByPrID(prID)
142-							if err != nil {
143-								return err
144-							}
145-
146-							patchset, err := getPatchsetFromOpt(patchsets, cCtx.String("patchset"))
147-							if err != nil {
148-								return err
149-							}
150-
151-							patches, err := pr.GetPatchesByPatchsetID(patchset.ID)
152-							if err != nil {
153-								return err
154-							}
155-
156-							printPatches(sesh, patches)
157-							return nil
158-						},
159-					},
160 					{
161 						Name:      "summary",
162 						Usage:     "Display metadata related to a PR",
M tmpl/pr-header.html
+4, -6
 1@@ -17,16 +17,14 @@
 2   <details>
 3     <summary>Help</summary>
 4     <div class="group">
 5+      <pre class="m-0"># checkout latest patchset
 6+ssh {{.MetaData.URL}} print pr-{{.Pr.ID}} | git am -3</pre>
 7+      <pre class="m-0"># checkout any patchset in a patch request
 8+ssh {{.MetaData.URL}} print ps-X | git am -3</pre>
 9       <pre class="m-0"># add changes to patch request
10 git format-patch {{.Branch}} --stdout | ssh {{.MetaData.URL}} pr add {{.Pr.ID}}</pre>
11       <pre class="m-0"># add review to patch request
12 git format-patch {{.Branch}} --stdout | ssh {{.MetaData.URL}} pr add --review {{.Pr.ID}}</pre>
13-      <pre class="m-0"># remove patchset
14-ssh {{.MetaData.URL}} ps rm ps-x</pre>
15-      <pre class="m-0"># checkout all patches
16-ssh {{.MetaData.URL}} pr print {{.Pr.ID}} | git am -3</pre>
17-      <pre class="m-0"># print a diff between the last two patches in a patch request
18-ssh {{.MetaData.URL}} pr diff {{.Pr.ID}}</pre>
19       <pre class="m-0"># accept PR
20 ssh {{.MetaData.URL}} pr accept {{.Pr.ID}}</pre>
21       <pre class="m-0"># close PR
M tmpl/repo-detail.html
+3, -3
 1@@ -27,11 +27,11 @@ ssh {{.MetaData.URL}} pr ls {{.Username}}/{{.Name}}</pre>
 2 <main class="group">
 3   <div>
 4     filter
 5-    <a href="/">open</a> <code>{{.NumOpen}}</code>
 6+    <a href="/r/{{.Username}}/{{.Name}}">open</a> <code>{{.NumOpen}}</code>
 7     &middot;
 8-    <a href="/?status=accepted">accepted</a> <code>{{.NumAccepted}}</code>
 9+    <a href="/r/{{.Username}}/{{.Name}}?status=accepted">accepted</a> <code>{{.NumAccepted}}</code>
10     &middot;
11-    <a href="/?status=closed">closed</a> <code>{{.NumClosed}}</code>
12+    <a href="/r/{{.Username}}/{{.Name}}?status=closed">closed</a> <code>{{.NumClosed}}</code>
13   </div>
14   {{template "pr-table" .Prs}}
15 </main>
M tmpl/user-detail.html
+3, -3
 1@@ -26,11 +26,11 @@
 2 <main class="group">
 3   <div>
 4     filter
 5-    <a href="/">open</a> <code>{{.NumOpen}}</code>
 6+    <a href="/r/{{.UserData.Name}}">open</a> <code>{{.NumOpen}}</code>
 7     &middot;
 8-    <a href="/?status=accepted">accepted</a> <code>{{.NumAccepted}}</code>
 9+    <a href="/r/{{.UserData.Name}}?status=accepted">accepted</a> <code>{{.NumAccepted}}</code>
10     &middot;
11-    <a href="/?status=closed">closed</a> <code>{{.NumClosed}}</code>
12+    <a href="/r/{{.UserData.Name}}?status=closed">closed</a> <code>{{.NumClosed}}</code>
13   </div>
14   {{template "pr-table" .Prs}}
15 </main>