diff options
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | pkg/git/branch.go | 11 | ||||
| -rw-r--r-- | pkg/git/commit.go | 22 | ||||
| -rw-r--r-- | pkg/git/load.go | 4 | ||||
| -rw-r--r-- | pkg/git/remote.go | 5 | ||||
| -rw-r--r-- | pkg/git/remotebranch.go | 3 | ||||
| -rw-r--r-- | pkg/git/repository.go | 31 | ||||
| -rw-r--r-- | pkg/gui/commitsview.go | 13 | ||||
| -rw-r--r-- | pkg/gui/keybindings.go | 8 |
9 files changed, 88 insertions, 11 deletions
@@ -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', |
