summaryrefslogtreecommitdiffstats
path: root/pkg/commands/git.go
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2018-08-14 17:47:33 +1000
committerJesse Duffield <jessedduffield@gmail.com>2018-08-14 17:47:33 +1000
commit9ecd7908aaefcda1f3654728aa20a4f5ca648b5c (patch)
tree2d1fea619acb25cc83e75acc7e3da55106ad7fcd /pkg/commands/git.go
parent95c7df4c61a31a0940eee4981beda78981c651eb (diff)
refactor commands to depend less on the shell
Diffstat (limited to 'pkg/commands/git.go')
-rw-r--r--pkg/commands/git.go114
1 files changed, 52 insertions, 62 deletions
diff --git a/pkg/commands/git.go b/pkg/commands/git.go
index 22d15ebdb..6523dd747 100644
--- a/pkg/commands/git.go
+++ b/pkg/commands/git.go
@@ -41,7 +41,7 @@ func (c *GitCommand) SetupGit() {
// GetStashEntries stash entryies
func (c *GitCommand) GetStashEntries() []StashEntry {
stashEntries := make([]StashEntry, 0)
- rawString, _ := c.OSCommand.RunDirectCommand("git stash list --pretty='%gs'")
+ rawString, _ := c.OSCommand.RunCommandWithOutput("git stash list --pretty='%gs'")
for i, line := range utils.SplitLines(rawString) {
stashEntries = append(stashEntries, stashEntryFromLine(line, i))
}
@@ -58,7 +58,7 @@ func stashEntryFromLine(line string, index int) StashEntry {
// GetStashEntryDiff stash diff
func (c *GitCommand) GetStashEntryDiff(index int) (string, error) {
- return c.OSCommand.RunCommand("git stash show -p --color stash@{" + fmt.Sprint(index) + "}")
+ return c.OSCommand.RunCommandWithOutput("git stash show -p --color stash@{" + fmt.Sprint(index) + "}")
}
func includes(array []string, str string) bool {
@@ -98,22 +98,14 @@ func (c *GitCommand) GetStatusFiles() []File {
}
// StashDo modify stash
-func (c *GitCommand) StashDo(index int, method string) (string, error) {
+func (c *GitCommand) StashDo(index int, method string) error {
return c.OSCommand.RunCommand("git stash " + method + " stash@{" + fmt.Sprint(index) + "}")
}
// StashSave save stash
-func (c *GitCommand) StashSave(message string) (string, error) {
- output, err := c.OSCommand.RunCommand("git stash save " + c.OSCommand.Quote(message))
- if err != nil {
- return output, err
- }
- // if there are no local changes to save, the exit code is 0, but we want
- // to raise an error
- if output == "No local changes to save\n" {
- return output, errors.New(output)
- }
- return output, nil
+// TODO: before calling this, check if there is anything to save
+func (c *GitCommand) StashSave(message string) error {
+ return c.OSCommand.RunCommand("git stash save " + c.OSCommand.Quote(message))
}
// MergeStatusFiles merge status files
@@ -147,7 +139,7 @@ func (c *GitCommand) MergeStatusFiles(oldFiles, newFiles []File) []File {
}
func (c *GitCommand) verifyInGitRepo() {
- if output, err := c.OSCommand.RunCommand("git status"); err != nil {
+ if output, err := c.OSCommand.RunCommandWithOutput("git status"); err != nil {
fmt.Println(output)
os.Exit(1)
}
@@ -155,7 +147,7 @@ func (c *GitCommand) verifyInGitRepo() {
// GetBranchName branch name
func (c *GitCommand) GetBranchName() (string, error) {
- return c.OSCommand.RunDirectCommand("git symbolic-ref --short HEAD")
+ return c.OSCommand.RunCommandWithOutput("git symbolic-ref --short HEAD")
}
func (c *GitCommand) navigateToRepoRootDirectory() {
@@ -189,11 +181,11 @@ func (c *GitCommand) ResetHard() error {
// UpstreamDifferenceCount checks how many pushables/pullables there are for the
// current branch
func (c *GitCommand) UpstreamDifferenceCount() (string, string) {
- pushableCount, err := c.OSCommand.RunDirectCommand("git rev-list @{u}..head --count")
+ pushableCount, err := c.OSCommand.RunCommandWithOutput("git rev-list @{u}..head --count")
if err != nil {
return "?", "?"
}
- pullableCount, err := c.OSCommand.RunDirectCommand("git rev-list head..@{u} --count")
+ pullableCount, err := c.OSCommand.RunCommandWithOutput("git rev-list head..@{u} --count")
if err != nil {
return "?", "?"
}
@@ -203,7 +195,7 @@ func (c *GitCommand) UpstreamDifferenceCount() (string, string) {
// GetCommitsToPush Returns the sha's of the commits that have not yet been pushed
// to the remote branch of the current branch
func (c *GitCommand) GetCommitsToPush() []string {
- pushables, err := c.OSCommand.RunDirectCommand("git rev-list @{u}..head --abbrev-commit")
+ pushables, err := c.OSCommand.RunCommandWithOutput("git rev-list @{u}..head --abbrev-commit")
if err != nil {
return make([]string, 0)
}
@@ -211,43 +203,43 @@ func (c *GitCommand) GetCommitsToPush() []string {
}
// RenameCommit renames the topmost commit with the given name
-func (c *GitCommand) RenameCommit(name string) (string, error) {
- return c.OSCommand.RunDirectCommand("git commit --allow-empty --amend -m " + c.OSCommand.Quote(name))
+func (c *GitCommand) RenameCommit(name string) error {
+ return c.OSCommand.RunCommand("git commit --allow-empty --amend -m " + c.OSCommand.Quote(name))
}
// Fetch fetch git repo
-func (c *GitCommand) Fetch() (string, error) {
- return c.OSCommand.RunDirectCommand("git fetch")
+func (c *GitCommand) Fetch() error {
+ return c.OSCommand.RunCommand("git fetch")
}
// ResetToCommit reset to commit
-func (c *GitCommand) ResetToCommit(sha string) (string, error) {
- return c.OSCommand.RunDirectCommand("git reset " + sha)
+func (c *GitCommand) ResetToCommit(sha string) error {
+ return c.OSCommand.RunCommand("git reset " + sha)
}
// NewBranch create new branch
-func (c *GitCommand) NewBranch(name string) (string, error) {
- return c.OSCommand.RunDirectCommand("git checkout -b " + name)
+func (c *GitCommand) NewBranch(name string) error {
+ return c.OSCommand.RunCommand("git checkout -b " + name)
}
// DeleteBranch delete branch
-func (c *GitCommand) DeleteBranch(branch string) (string, error) {
+func (c *GitCommand) DeleteBranch(branch string) error {
return c.OSCommand.RunCommand("git branch -d " + branch)
}
// ListStash list stash
func (c *GitCommand) ListStash() (string, error) {
- return c.OSCommand.RunDirectCommand("git stash list")
+ return c.OSCommand.RunCommandWithOutput("git stash list")
}
// Merge merge
-func (c *GitCommand) Merge(branchName string) (string, error) {
- return c.OSCommand.RunDirectCommand("git merge --no-edit " + branchName)
+func (c *GitCommand) Merge(branchName string) error {
+ return c.OSCommand.RunCommand("git merge --no-edit " + branchName)
}
// AbortMerge abort merge
-func (c *GitCommand) AbortMerge() (string, error) {
- return c.OSCommand.RunDirectCommand("git merge --abort")
+func (c *GitCommand) AbortMerge() error {
+ return c.OSCommand.RunCommand("git merge --abort")
}
// UsingGpg tells us whether the user has gpg enabled so that we can know
@@ -269,30 +261,29 @@ func (c *GitCommand) Commit(g *gocui.Gui, message string) (*exec.Cmd, error) {
if c.UsingGpg() {
return c.OSCommand.PrepareSubProcess(c.OSCommand.Platform.shell, c.OSCommand.Platform.shellArg, command)
}
- // TODO: make these runDirectCommand functions just return an error
- _, err := c.OSCommand.RunDirectCommand(command)
- return nil, err
+ return nil, c.OSCommand.RunCommand(command)
}
// Pull pull from repo
-func (c *GitCommand) Pull() (string, error) {
+func (c *GitCommand) Pull() error {
return c.OSCommand.RunCommand("git pull --no-edit")
}
// Push push to a branch
-func (c *GitCommand) Push(branchName string) (string, error) {
- return c.OSCommand.RunDirectCommand("git push -u origin " + branchName)
+func (c *GitCommand) Push(branchName string) error {
+ return c.OSCommand.RunCommand("git push -u origin " + branchName)
}
// SquashPreviousTwoCommits squashes a commit down to the one below it
// retaining the message of the higher commit
-func (c *GitCommand) SquashPreviousTwoCommits(message string) (string, error) {
- return c.OSCommand.RunDirectCommand("git reset --soft HEAD^ && git commit --amend -m " + c.OSCommand.Quote(message))
+func (c *GitCommand) SquashPreviousTwoCommits(message string) error {
+ // TODO: test this
+ return c.OSCommand.RunCommand("git reset --soft HEAD^ && git commit --amend -m " + c.OSCommand.Quote(message))
}
// SquashFixupCommit squashes a 'FIXUP' commit into the commit beneath it,
// retaining the commit message of the lower commit
-func (c *GitCommand) SquashFixupCommit(branchName string, shaValue string) (string, error) {
+func (c *GitCommand) SquashFixupCommit(branchName string, shaValue string) error {
var err error
commands := []string{
"git checkout -q " + shaValue,
@@ -303,7 +294,7 @@ func (c *GitCommand) SquashFixupCommit(branchName string, shaValue string) (stri
ret := ""
for _, command := range commands {
c.Log.Info(command)
- output, err := c.OSCommand.RunDirectCommand(command)
+ output, err := c.OSCommand.RunCommandWithOutput(command)
ret += output
if err != nil {
c.Log.Info(ret)
@@ -313,23 +304,25 @@ func (c *GitCommand) SquashFixupCommit(branchName string, shaValue string) (stri
if err != nil {
// We are already in an error state here so we're just going to append
// the output of these commands
- output, _ := c.OSCommand.RunDirectCommand("git branch -d " + shaValue)
+ output, _ := c.OSCommand.RunCommandWithOutput("git branch -d " + shaValue)
ret += output
- output, _ = c.OSCommand.RunDirectCommand("git checkout " + branchName)
+ output, _ = c.OSCommand.RunCommandWithOutput("git checkout " + branchName)
ret += output
}
- return ret, err
+ if err != nil {
+ return errors.New(ret)
+ }
+ return nil
}
// CatFile obtain the contents of a file
func (c *GitCommand) CatFile(file string) (string, error) {
- return c.OSCommand.RunDirectCommand("cat " + file)
+ return c.OSCommand.RunCommandWithOutput("cat " + file)
}
// StageFile stages a file
func (c *GitCommand) StageFile(file string) error {
- _, err := c.OSCommand.RunCommand("git add " + file)
- return err
+ return c.OSCommand.RunCommand("git add " + file)
}
// UnStageFile unstages a file
@@ -340,18 +333,17 @@ func (c *GitCommand) UnStageFile(file string, tracked bool) error {
} else {
command = "git rm --cached "
}
- _, err := c.OSCommand.RunCommand(command + file)
- return err
+ return c.OSCommand.RunCommand(command + file)
}
// GitStatus returns the plaintext short status of the repo
func (c *GitCommand) GitStatus() (string, error) {
- return c.OSCommand.RunCommand("git status --untracked-files=all --short")
+ return c.OSCommand.RunCommandWithOutput("git status --untracked-files=all --short")
}
// IsInMergeState states whether we are still mid-merge
func (c *GitCommand) IsInMergeState() (bool, error) {
- output, err := c.OSCommand.RunCommand("git status --untracked-files=all")
+ output, err := c.OSCommand.RunCommandWithOutput("git status --untracked-files=all")
if err != nil {
return false, err
}
@@ -362,16 +354,14 @@ func (c *GitCommand) IsInMergeState() (bool, error) {
func (c *GitCommand) RemoveFile(file File) error {
// if the file isn't tracked, we assume you want to delete it
if !file.Tracked {
- _, err := c.OSCommand.RunCommand("rm -rf ./" + file.Name)
- return err
+ return c.OSCommand.RunCommand("rm -rf ./" + file.Name)
}
// if the file is tracked, we assume you want to just check it out
- _, err := c.OSCommand.RunCommand("git checkout " + file.Name)
- return err
+ return c.OSCommand.RunCommand("git checkout " + file.Name)
}
// Checkout checks out a branch, with --force if you set the force arg to true
-func (c *GitCommand) Checkout(branch string, force bool) (string, error) {
+func (c *GitCommand) Checkout(branch string, force bool) error {
forceArg := ""
if force {
forceArg = "--force "
@@ -394,7 +384,7 @@ func (c *GitCommand) PrepareCommitSubProcess() (*exec.Cmd, error) {
// Currently it limits the result to 100 commits, but when we get async stuff
// working we can do lazy loading
func (c *GitCommand) GetBranchGraph(branchName string) (string, error) {
- return c.OSCommand.RunCommand("git log --graph --color --abbrev-commit --decorate --date=relative --pretty=medium -100 " + branchName)
+ return c.OSCommand.RunCommandWithOutput("git log --graph --color --abbrev-commit --decorate --date=relative --pretty=medium -100 " + branchName)
}
// Map (from https://gobyexample.com/collection-functions)
@@ -452,7 +442,7 @@ func (c *GitCommand) GetCommits() []Commit {
func (c *GitCommand) GetLog() string {
// currently limiting to 30 for performance reasons
// TODO: add lazyloading when you scroll down
- result, err := c.OSCommand.RunDirectCommand("git log --oneline -30")
+ result, err := c.OSCommand.RunCommandWithOutput("git log --oneline -30")
if err != nil {
// assume if there is an error there are no commits yet for this branch
return ""
@@ -469,7 +459,7 @@ func (c *GitCommand) Ignore(filename string) {
// Show shows the diff of a commit
func (c *GitCommand) Show(sha string) string {
- result, err := c.OSCommand.RunDirectCommand("git show --color " + sha)
+ result, err := c.OSCommand.RunCommandWithOutput("git show --color " + sha)
if err != nil {
panic(err)
}
@@ -492,6 +482,6 @@ func (c *GitCommand) Diff(file File) string {
}
command := "git diff --color " + cachedArg + deletedArg + trackedArg + file.Name
// for now we assume an error means the file was deleted
- s, _ := c.OSCommand.RunCommand(command)
+ s, _ := c.OSCommand.RunCommandWithOutput(command)
return s
}