summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--pkg/git/branch.go11
-rw-r--r--pkg/git/commit.go22
-rw-r--r--pkg/git/load.go4
-rw-r--r--pkg/git/remote.go5
-rw-r--r--pkg/git/remotebranch.go3
-rw-r--r--pkg/git/repository.go31
-rw-r--r--pkg/gui/commitsview.go13
-rw-r--r--pkg/gui/keybindings.go8
9 files changed, 88 insertions, 11 deletions
diff --git a/README.md b/README.md
index 45d6e51..ba70ce8 100644
--- a/README.md
+++ b/README.md
@@ -78,7 +78,7 @@ run the `gitbatch` command from the parent of your git repositories. For start-u
- add testing
- select all feature
- arrange repositories to an order e.g. alphabetic, last modified, etc.
-- shift keys, i.e. **s** for iterate **shift + s** for reverse iteration
+- shift keys, i.e. **s** for iterate **alt + s** for reverse iteration (partially implemented)
- recursive repository search from the filesystem
- full src-d/go-git integration (*having some performance issues*)
- implement config file to pre-define repo locations or some settings
diff --git a/pkg/git/branch.go b/pkg/git/branch.go
index 692ec5d..7c67992 100644
--- a/pkg/git/branch.go
+++ b/pkg/git/branch.go
@@ -2,6 +2,7 @@ package git
import (
"github.com/isacikgoz/gitbatch/pkg/helpers"
+ log "github.com/sirupsen/logrus"
"gopkg.in/src-d/go-git.v4"
"gopkg.in/src-d/go-git.v4/plumbing"
"regexp"
@@ -39,6 +40,7 @@ func (entity *RepoEntity) loadLocalBranches() error {
lbs := make([]*Branch, 0)
branches, err := entity.Repository.Branches()
if err != nil {
+ log.Warn("Cannot load branches " + err.Error())
return err
}
defer branches.Close()
@@ -78,11 +80,13 @@ func (entity *RepoEntity) Checkout(branch *Branch) error {
}
w, err := entity.Repository.Worktree()
if err != nil {
+ log.Warn("Cannot get work tree " + err.Error())
return err
}
if err = w.Checkout(&git.CheckoutOptions{
Branch: branch.Reference.Name(),
}); err != nil {
+ log.Warn("Cannot checkout " + err.Error())
return err
}
@@ -95,6 +99,7 @@ func (entity *RepoEntity) Checkout(branch *Branch) error {
// make this conditional on global scale
if err = entity.Remote.switchRemoteBranch(entity.Remote.Name + "/" + entity.Branch.Name); err != nil {
// probably couldn't find, but its ok.
+ log.Trace("Cannot find proper remote branch " + err.Error())
return nil
}
return nil
@@ -109,10 +114,10 @@ func (entity *RepoEntity) isClean() bool {
if status != "?" {
verbose := strings.Split(status, "\n")
lastLine := verbose[len(verbose)-1]
- // earlier versions of git returns "working directory clean" instead of
+ // earlier versions of git returns "working directory clean" instead of
//"working tree clean" message
if strings.Contains(lastLine, "working tree clean") ||
- strings.Contains(lastLine, "working directory clean") {
+ strings.Contains(lastLine, "working directory clean") {
return true
}
}
@@ -146,4 +151,4 @@ func (entity *RepoEntity) pullDiffsToUpstream() ([]*Commit, error) {
}
}
return remoteCommits, nil
-} \ No newline at end of file
+}
diff --git a/pkg/git/commit.go b/pkg/git/commit.go
index b0ba381..a15b3a4 100644
--- a/pkg/git/commit.go
+++ b/pkg/git/commit.go
@@ -3,6 +3,7 @@ package git
import (
"regexp"
+ log "github.com/sirupsen/logrus"
"gopkg.in/src-d/go-git.v4"
"gopkg.in/src-d/go-git.v4/plumbing"
"gopkg.in/src-d/go-git.v4/plumbing/object"
@@ -24,7 +25,7 @@ type CommitType string
const (
// LocalCommit is the commit that recorded locally
- LocalCommit CommitType = "local"
+ LocalCommit CommitType = "local"
// RemoteCommit is the commit that not merged to local branch
RemoteCommit CommitType = "remote"
)
@@ -46,6 +47,22 @@ func (entity *RepoEntity) NextCommit() error {
return nil
}
+// PreviousCommit iterates to opposite direction
+func (entity *RepoEntity) PreviousCommit() error {
+ currentCommitIndex := 0
+ for i, cs := range entity.Commits {
+ if cs.Hash == entity.Commit.Hash {
+ currentCommitIndex = i
+ }
+ }
+ if currentCommitIndex == 0 {
+ entity.Commit = entity.Commits[len(entity.Commits)-1]
+ return nil
+ }
+ entity.Commit = entity.Commits[currentCommitIndex-1]
+ return nil
+}
+
// loads the local commits by simply using git log way. ALso, gets the upstream
// diff commits
func (entity *RepoEntity) loadCommits() error {
@@ -53,6 +70,7 @@ func (entity *RepoEntity) loadCommits() error {
entity.Commits = make([]*Commit, 0)
ref, err := r.Head()
if err != nil {
+ log.Trace("Cannot get HEAD " + err.Error())
return err
}
@@ -61,11 +79,13 @@ func (entity *RepoEntity) loadCommits() error {
Order: git.LogOrderCommitterTime,
})
if err != nil {
+ log.Trace("git log failed " + err.Error())
return err
}
defer cIter.Close()
rmcs, err := entity.pullDiffsToUpstream()
if err != nil {
+ log.Trace("git rev-list failed " + err.Error())
return err
}
for _, rmc := range rmcs {
diff --git a/pkg/git/load.go b/pkg/git/load.go
index 6e1d6c9..69bff60 100644
--- a/pkg/git/load.go
+++ b/pkg/git/load.go
@@ -1,6 +1,7 @@
package git
import (
+ log "github.com/sirupsen/logrus"
"sync"
)
@@ -23,6 +24,9 @@ func LoadRepositoryEntities(directories []string) (entities []*RepoEntity, err e
defer wg.Done()
entity, err := InitializeRepository(d)
if err != nil {
+ log.WithFields(log.Fields{
+ "directory": d,
+ }).Trace("Cannot load git repository.")
return
}
// lock so we don't get a race if multiple go routines try to add
diff --git a/pkg/git/remote.go b/pkg/git/remote.go
index bac39d9..7ea896f 100644
--- a/pkg/git/remote.go
+++ b/pkg/git/remote.go
@@ -1,5 +1,9 @@
package git
+import (
+ log "github.com/sirupsen/logrus"
+)
+
// Remote struct is simply a collection of remote branches and wraps it with the
// name of the remote and fetch/push urls. It also holds the *selected* remote
// branch
@@ -52,6 +56,7 @@ func (entity *RepoEntity) loadRemotes() error {
}
if err != nil {
+ log.Warn("Cannot find remotes " + err.Error())
return err
}
return err
diff --git a/pkg/git/remotebranch.go b/pkg/git/remotebranch.go
index 770b016..6ece4a2 100644
--- a/pkg/git/remotebranch.go
+++ b/pkg/git/remotebranch.go
@@ -4,6 +4,7 @@ import (
"errors"
"strings"
+ log "github.com/sirupsen/logrus"
"gopkg.in/src-d/go-git.v4"
"gopkg.in/src-d/go-git.v4/plumbing"
"gopkg.in/src-d/go-git.v4/plumbing/storer"
@@ -39,6 +40,7 @@ func (remote *Remote) loadRemoteBranches(r *git.Repository) error {
remote.Branches = make([]*RemoteBranch, 0)
bs, err := remoteBranchesIter(r.Storer)
if err != nil {
+ log.Warn("Cannot initiate iterator " + err.Error())
return err
}
defer bs.Close()
@@ -62,6 +64,7 @@ func (remote *Remote) loadRemoteBranches(r *git.Repository) error {
func remoteBranchesIter(s storer.ReferenceStorer) (storer.ReferenceIter, error) {
refs, err := s.IterReferences()
if err != nil {
+ log.Warn("Cannot find references " + err.Error())
return nil, err
}
diff --git a/pkg/git/repository.go b/pkg/git/repository.go
index 822e820..73aebdf 100644
--- a/pkg/git/repository.go
+++ b/pkg/git/repository.go
@@ -5,10 +5,11 @@ import (
"os"
"github.com/isacikgoz/gitbatch/pkg/helpers"
+ log "github.com/sirupsen/logrus"
"gopkg.in/src-d/go-git.v4"
)
-// RepoEntity is the main entity of the application. The repository name is
+// RepoEntity is the main entity of the application. The repository name is
// actually the name of its folder in the host's filesystem. It holds the go-git
// repository entity along with critic entites such as remote/branches and commits
type RepoEntity struct {
@@ -32,19 +33,22 @@ const (
// Available implies repo is ready for the operation
Available RepoState = 0
// Queued means repo is queued for a operation
- Queued RepoState = 1
+ Queued RepoState = 1
// Working means an operation is jsut started for this repository
- Working RepoState = 2
+ Working RepoState = 2
// Success is the expected outcome of the operation
- Success RepoState = 3
+ Success RepoState = 3
// Fail is the unexpected outcome of the operation
- Fail RepoState = 4
+ Fail RepoState = 4
)
// InitializeRepository initializes a RepoEntity struct with its belongings.
func InitializeRepository(directory string) (entity *RepoEntity, err error) {
file, err := os.Open(directory)
if err != nil {
+ log.WithFields(log.Fields{
+ "directory": directory,
+ }).Trace("Cannot open as direcotry")
return nil, err
}
fileInfo, err := file.Stat()
@@ -53,6 +57,9 @@ func InitializeRepository(directory string) (entity *RepoEntity, err error) {
}
r, err := git.PlainOpen(directory)
if err != nil {
+ log.WithFields(log.Fields{
+ "directory": directory,
+ }).Trace("Cannot open direcotry as a git repository")
return nil, err
}
entity = &RepoEntity{RepoID: helpers.RandomString(8),
@@ -97,10 +104,16 @@ func (entity *RepoEntity) Pull() error {
// 2018-11-25: tried but it fails, will investigate.
rm := entity.Remote.Name
if err := entity.FetchWithGit(rm); err != nil {
+ log.WithFields(log.Fields{
+ "remote": rm,
+ }).Trace("Error while fetching remote")
return err
}
entity.Checkout(entity.Branch)
if err := entity.MergeWithGit(entity.Remote.Branch.Name); err != nil {
+ log.WithFields(log.Fields{
+ "branch": entity.Remote.Branch.Name,
+ }).Trace("Error while merge to branch")
entity.Refresh()
return err
}
@@ -114,6 +127,9 @@ func (entity *RepoEntity) Pull() error {
func (entity *RepoEntity) Fetch() error {
rm := entity.Remote.Name
if err := entity.FetchWithGit(rm); err != nil {
+ log.WithFields(log.Fields{
+ "remote": rm,
+ }).Trace("Error while fetching remote")
return err
}
entity.Refresh()
@@ -121,11 +137,14 @@ func (entity *RepoEntity) Fetch() error {
return nil
}
-// Merge incorporates changes from the named commits or branches into the
+// Merge incorporates changes from the named commits or branches into the
// current branch
func (entity *RepoEntity) Merge() error {
entity.Checkout(entity.Branch)
if err := entity.MergeWithGit(entity.Remote.Branch.Name); err != nil {
+ log.WithFields(log.Fields{
+ "branch": entity.Remote.Branch.Name,
+ }).Trace("Error while merge to branch")
entity.Refresh()
return err
}
diff --git a/pkg/gui/commitsview.go b/pkg/gui/commitsview.go
index 27abc69..91cb795 100644
--- a/pkg/gui/commitsview.go
+++ b/pkg/gui/commitsview.go
@@ -50,3 +50,16 @@ func (gui *Gui) nextCommit(g *gocui.Gui, v *gocui.View) error {
}
return err
}
+
+// reverse iteration handler for the commitsview
+func (gui *Gui) prevCommit(g *gocui.Gui, v *gocui.View) error {
+ var err error
+ entity := gui.getSelectedRepository()
+ if err = entity.PreviousCommit(); err != nil {
+ return err
+ }
+ if err = gui.updateCommits(g, entity); err != nil {
+ return err
+ }
+ return err
+}
diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go
index df3e4d8..f224bc3 100644
--- a/pkg/gui/keybindings.go
+++ b/pkg/gui/keybindings.go
@@ -109,6 +109,14 @@ func (gui *Gui) generateKeybindings() error {
Display: "s",
Description: "Iterate over commits",
Vital: false,
+ },{
+ View: mainViewFeature.Name,
+ Key: 's',
+ Modifier: gocui.ModAlt,
+ Handler: gui.prevCommit,
+ Display: "alt + s",
+ Description: "Iterate over commits",
+ Vital: false,
}, {
View: mainViewFeature.Name,
Key: 'd',