Skip to content

Commit

Permalink
PR chain for publish cmd (#30)
Browse files Browse the repository at this point in the history
  • Loading branch information
Bhacaz authored Jul 2, 2024
1 parent 7b964a9 commit b31db24
Show file tree
Hide file tree
Showing 7 changed files with 291 additions and 57 deletions.
6 changes: 6 additions & 0 deletions cmd/publish.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ var publishCmd = &cobra.Command{
Open a pull request base on the previous branch of the stack.
Show the GitHub link if the remote is GitHub.`,
RunE: func(cmd *cobra.Command, args []string) error {
prChain, _ := cmd.Flags().GetBool("pr-chain")
if prChain {
return stacksManager().PrChain()
}

return stacksManager().Publish()
},
}
Expand All @@ -32,4 +37,5 @@ func init() {
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
// publishCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
publishCmd.Flags().BoolP("pr-chain", "p", false, "Display PR number chain of the stack with GH-CLI.")
}
12 changes: 7 additions & 5 deletions internal/git/git.go → internal/cliexec/cliexec.go
Original file line number Diff line number Diff line change
@@ -1,22 +1,24 @@
package git
package cliexec

import (
"github.com/Bhacaz/gostacking/internal/printer"
"os/exec"
"strings"
)

type InterfaceGitExecutor interface {
type InterfaceCliExecutor interface {
Exec(command ...string) (string, error)
}

type Executor struct {
baseCliCmd string
verbose bool
printer printer.Printer
}

func NewExecutor(verbose bool) Executor {
func NewExecutor(baseCliCmd string, verbose bool) Executor {
return Executor{
baseCliCmd: baseCliCmd,
verbose: verbose,
printer: printer.NewPrinter(),
}
Expand All @@ -29,9 +31,9 @@ func (e Executor) println(a ...interface{}) {
}

func (e Executor) Exec(gitCmdArgs ...string) (string, error) {
e.println("CMD:\t", "git", strings.Join(gitCmdArgs, " "))
e.println("CMD:\t", e.baseCliCmd, strings.Join(gitCmdArgs, " "))

execCmd := exec.Command("git", gitCmdArgs...)
execCmd := exec.Command(e.baseCliCmd, gitCmdArgs...)
output, err := execCmd.CombinedOutput()
result := strings.TrimSuffix(string(output), "\n")

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package git
package cliexec

//import (
// "errors"
Expand Down
30 changes: 30 additions & 0 deletions internal/stack/gh_read.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package stack

import (
"errors"
"strings"
)

func (sm StacksManager) ghCliConfigure() error {
output, err := sm.ghExecutor.Exec("auth", "status")
if err != nil && strings.Contains(output, "not found") {
return errors.New("GH-CLI not found")
}
if strings.Contains(output, "You are not logged") {
return errors.New(output)
}
if err != nil {
return err
}
return nil
}

func (sm StacksManager) ghPrNumber(branchName string) (string, error) {
output, err := sm.ghExecutor.Exec("pr", "view", branchName, "-q", ".number", "--json=number")

if err != nil {
return "", err
}

return output, nil
}
9 changes: 9 additions & 0 deletions internal/stack/git_read.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,15 @@ func (sm StacksManager) defaultBranchWithRemote() (string, error) {
return main, nil
}

func (sm StacksManager) defaultBranch() (string, error) {
branch, err := sm.defaultBranchWithRemote()
if err != nil {
return "", err
}

return strings.Replace(branch, "origin/", "", 1), nil
}

func (sm StacksManager) commitsBetweenBranches(baseBranch string, nextBranch string) ([]string, error) {
output, err := sm.gitExecutor.Exec("log", "--no-merges", "--reverse", "--right-only", "--pretty=format:%h %s - %cr", baseBranch+"..."+nextBranch)
if err != nil {
Expand Down
39 changes: 35 additions & 4 deletions internal/stack/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,28 @@ package stack
import (
"errors"
"fmt"
"github.com/Bhacaz/gostacking/internal/cliexec"
"github.com/Bhacaz/gostacking/internal/color"
"github.com/Bhacaz/gostacking/internal/git"
"github.com/Bhacaz/gostacking/internal/printer"
"slices"
"strings"
)

type StacksManager struct {
stacks *StacksData
gitExecutor git.InterfaceGitExecutor
gitExecutor cliexec.InterfaceCliExecutor
ghExecutor cliexec.InterfaceCliExecutor
printer printer.Printer
}

func NewManager(gitVerbose bool) StacksManager {
func NewManager(cliVerbose bool) StacksManager {
return StacksManager{
stacks: &StacksData{
StacksPersister: StacksPersistingFile{},
},
printer: printer.NewPrinter(),
gitExecutor: git.NewExecutor(gitVerbose),
gitExecutor: cliexec.NewExecutor("git", cliVerbose),
ghExecutor: cliexec.NewExecutor("gh", cliVerbose),
}
}

Expand Down Expand Up @@ -457,6 +459,35 @@ func (sm StacksManager) Publish() error {
return nil
}

func (sm StacksManager) PrChain() error {
err := sm.ghCliConfigure()
if err != nil {
return err
}

sm.stacks.LoadStacks()
data := *sm.stacks
branches, _ := data.GetBranchesByName(data.CurrentStack)

defaultBranch, err := sm.defaultBranch()
if err != nil {
return err
}

result := defaultBranch

for _, branch := range branches {
prNumber, err := sm.ghPrNumber(branch)
if err != nil {
return err
}
result += fmt.Sprint(" ← ", "#", prNumber)
}

sm.printer.Println(result)
return nil
}

func (sm StacksManager) syncFirstBranch(firstBranch string, push bool, mergeDefaultBranch bool) error {
if mergeDefaultBranch {
defaultBranch, err := sm.defaultBranchWithRemote()
Expand Down
Loading

0 comments on commit b31db24

Please sign in to comment.