- 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
+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",
+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
+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 ·
8- <a href="/?status=accepted">accepted</a> <code>{{.NumAccepted}}</code>
9+ <a href="/r/{{.Username}}/{{.Name}}?status=accepted">accepted</a> <code>{{.NumAccepted}}</code>
10 ·
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>
+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 ·
8- <a href="/?status=accepted">accepted</a> <code>{{.NumAccepted}}</code>
9+ <a href="/r/{{.UserData.Name}}?status=accepted">accepted</a> <code>{{.NumAccepted}}</code>
10 ·
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>