diff options
| author | <> | 2018-12-14 02:00:48 +0300 |
|---|---|---|
| committer | <> | 2018-12-14 02:00:48 +0300 |
| commit | 3de3e0da39d82b9ac928890a186e0044fd84b3a5 (patch) | |
| tree | d3f88447a97dec6806aca7892ab8f9f4f279cafb | |
| parent | files sort added (diff) | |
| download | gitbatch-3de3e0da39d82b9ac928890a186e0044fd84b3a5.tar.gz | |
improved commit feature
| -rw-r--r-- | README.md | 4 | ||||
| -rw-r--r-- | pkg/git/cmd-config.go | 10 | ||||
| -rw-r--r-- | pkg/git/cmd-status.go | 9 | ||||
| -rw-r--r-- | pkg/gui/commitview.go | 187 | ||||
| -rw-r--r-- | pkg/gui/diffview.go | 4 | ||||
| -rw-r--r-- | pkg/gui/keybindings.go | 50 | ||||
| -rw-r--r-- | pkg/gui/stagedview.go | 23 | ||||
| -rw-r--r-- | pkg/gui/stashview.go | 4 | ||||
| -rw-r--r-- | pkg/gui/statusview.go | 118 | ||||
| -rw-r--r-- | pkg/gui/unstagedview.go | 28 |
10 files changed, 283 insertions, 154 deletions
@@ -33,7 +33,9 @@ For more information; ## Further goals - add testing - full src-d/go-git integration (*having some performance issues*) -- add commit and maybe push? + - fetch, config, add, reset, commit, status, diff ✔ + - merge, rev-list, stash ✗ +- add push ## Known issues Please refer to [Known issues page](https://github.com/isacikgoz/gitbatch/wiki/Known-issues) diff --git a/pkg/git/cmd-config.go b/pkg/git/cmd-config.go index 94efe33..541b0be 100644 --- a/pkg/git/cmd-config.go +++ b/pkg/git/cmd-config.go @@ -37,7 +37,7 @@ const ( func Config(entity *RepoEntity, options ConfigOptions) (value string, err error) { // here we configure config operation // default mode is go-git (this may be configured) - configCmdMode = configCmdModeNative + configCmdMode = configCmdModeLegacy switch configCmdMode { case configCmdModeLegacy: @@ -53,7 +53,7 @@ func Config(entity *RepoEntity, options ConfigOptions) (value string, err error) // configWithGit is simply a bare git commit -m <msg> command which is flexible func configWithGit(entity *RepoEntity, options ConfigOptions) (value string, err error) { args := make([]string, 0) - args = append(args, commitCommand) + args = append(args, configCommand) if len(string(options.Site)) > 0 { args = append(args, "--"+string(options.Site)) } @@ -62,21 +62,21 @@ func configWithGit(entity *RepoEntity, options ConfigOptions) (value string, err // parse options to command line arguments out, err := GenericGitCommandWithOutput(entity.AbsPath, args) if err != nil { - log.Warn("Error at git command (commit)") return out, err } // till this step everything should be ok - return out, entity.Refresh() + return out, nil } // commitWithGoGit is the primary commit method func configWithGoGit(entity *RepoEntity, options ConfigOptions) (value string, err error) { + // TODO: add global search config, err := entity.Repository.Config() if err != nil { return value, err } value = config.Raw.Section(options.Section).Option(options.Option) - return value, entity.Refresh() + return value, nil } // AddConfig diff --git a/pkg/git/cmd-status.go b/pkg/git/cmd-status.go index d3d1918..508a27c 100644 --- a/pkg/git/cmd-status.go +++ b/pkg/git/cmd-status.go @@ -4,6 +4,7 @@ import ( "errors" "os" "regexp" + "sort" "strings" log "github.com/sirupsen/logrus" @@ -26,7 +27,7 @@ type File struct { } // FileStatus is the short representation of state of a file -type FileStatus rune +type FileStatus byte var ( // StatusNotupdated says file not updated @@ -84,8 +85,8 @@ func statusWithGit(entity *RepoEntity) ([]*File, error) { } fileslist := strings.Split(output, "\n") for _, file := range fileslist { - x := rune(file[0]) - y := rune(file[1]) + x := byte(file[0]) + y := byte(file[1]) relativePathRegex := regexp.MustCompile(`[(\w|/|.|\-)]+`) path := relativePathRegex.FindString(file[2:]) @@ -96,6 +97,7 @@ func statusWithGit(entity *RepoEntity) ([]*File, error) { Y: FileStatus(y), }) } + sort.Sort(filesAlphabetical(files)) return files, nil } @@ -117,6 +119,7 @@ func statusWithGoGit(entity *RepoEntity) ([]*File, error) { Y: FileStatus(v.Worktree), }) } + sort.Sort(filesAlphabetical(files)) return files, nil } diff --git a/pkg/gui/commitview.go b/pkg/gui/commitview.go new file mode 100644 index 0000000..8fdd63f --- /dev/null +++ b/pkg/gui/commitview.go @@ -0,0 +1,187 @@ +package gui + +import ( + "errors" + "fmt" + "regexp" + + "github.com/isacikgoz/gitbatch/pkg/git" + "github.com/jroimartin/gocui" +) + +var ( + commitFrameViewFeature = viewFeature{Name: "commitframe", Title: " Frame "} + commitUserNameLabelFeature = viewFeature{Name: "commitusername", Title: " Name: "} + commitUserEmailLabelViewFeature = viewFeature{Name: "commituseremail", Title: " E-Mail: "} + + // these views used as a input for the credentials + commitMessageViewFeature = viewFeature{Name: "commitmessage", Title: " Commit Mesage "} + commitUserUserViewFeature = viewFeature{Name: "authuser", Title: " Name "} + commitUserEmailViewFeature = viewFeature{Name: "authpasswd", Title: " E-Mail "} + + commitViews = []viewFeature{commitMessageViewFeature, commitUserUserViewFeature, commitUserEmailViewFeature} + commitLabelViews = []viewFeature{commitFrameViewFeature, commitUserNameLabelFeature, commitUserEmailLabelViewFeature} +) + +// open the commit message views +func (gui *Gui) openCommitMessageView(g *gocui.Gui, v *gocui.View) error { + maxX, maxY := g.Size() + commitMesageReturnView = v.Name() + v_frame, err := g.SetView(commitFrameViewFeature.Name, maxX/2-30, maxY/2-4, maxX/2+30, maxY/2+3) + if err != nil { + if err != gocui.ErrUnknownView { + return err + } + v_frame.Frame = true + fmt.Fprintln(v_frame, " Enter your commit message:") + } + v, err = g.SetView(commitMessageViewFeature.Name, maxX/2-29, maxY/2-3, maxX/2+29, maxY/2) + if err != nil { + if err != gocui.ErrUnknownView { + return err + } + v.Frame = false + v.Wrap = true + v.Editable = true + v.Editor = gocui.DefaultEditor + g.Cursor = true + } + if err := gui.openCommitUserNameView(g); err != nil { + return err + } + if err := gui.openCommitUserEmailView(g); err != nil { + return err + } + gui.updateKeyBindingsView(g, commitMessageViewFeature.Name) + if _, err := g.SetCurrentView(commitMessageViewFeature.Name); err != nil { + return err + } + return nil +} + +// open an error view to inform user with a message and a useful note +func (gui *Gui) openCommitUserNameView(g *gocui.Gui) error { + entity := gui.getSelectedRepository() + maxX, maxY := g.Size() + // first, create the label for user + vlabel, err := g.SetView(commitUserNameLabelFeature.Name, maxX/2-30, maxY/2, maxX/2-19, maxY/2+2) + if err != nil { + if err != gocui.ErrUnknownView { + return err + } + fmt.Fprintln(vlabel, commitUserNameLabelFeature.Title) + vlabel.Frame = false + } + // second, crete the user input + v, err := g.SetView(commitUserUserViewFeature.Name, maxX/2-18, maxY/2, maxX/2+29, maxY/2+2) + if err != nil { + if err != gocui.ErrUnknownView { + return err + } + name, err := git.Config(entity, git.ConfigOptions{ + Section: "user", + Option: "name", + }) + if err != nil { + return err + } + fmt.Fprintln(v, name) + v.Editable = true + v.Frame = false + } + return nil +} + +// open an error view to inform user with a message and a useful note +func (gui *Gui) openCommitUserEmailView(g *gocui.Gui) error { + entity := gui.getSelectedRepository() + maxX, maxY := g.Size() + // first, create the label for password + vlabel, err := g.SetView(commitUserEmailLabelViewFeature.Name, maxX/2-30, maxY/2+1, maxX/2-19, maxY/2+3) + if err != nil { + if err != gocui.ErrUnknownView { + return err + } + fmt.Fprintln(vlabel, commitUserEmailLabelViewFeature.Title) + vlabel.Frame = false + } + // second, crete the masked password input + v, err := g.SetView(commitUserEmailViewFeature.Name, maxX/2-18, maxY/2+1, maxX/2+29, maxY/2+3) + if err != nil { + if err != gocui.ErrUnknownView { + return err + } + email, err := git.Config(entity, git.ConfigOptions{ + Section: "user", + Option: "email", + }) + if err != nil { + return err + } + fmt.Fprintln(v, email) + v.Editable = true + v.Frame = false + } + return nil +} + +// close the opened commite mesage view +func (gui *Gui) submitCommitMessageView(g *gocui.Gui, v *gocui.View) error { + entity := gui.getSelectedRepository() + // in order to read buffer of the views, first we need to find'em + v_msg, err := g.View(commitMessageViewFeature.Name) + v_name, err := g.View(commitUserUserViewFeature.Name) + v_email, err := g.View(commitUserEmailViewFeature.Name) + // the return string of the views contain trailing new lines + re := regexp.MustCompile(`\r?\n`) + // TODO: maybe intentionally added new lines? + msg := re.ReplaceAllString(v_msg.ViewBuffer(), "") + name := re.ReplaceAllString(v_name.ViewBuffer(), "") + email := re.ReplaceAllString(v_email.ViewBuffer(), "") + if len(email) <= 0 { + return errors.New("User email needs to be provided") + } + err = git.CommitCommand(entity, git.CommitOptions{ + CommitMsg: msg, + User: name, + Email: email, + }) + if err != nil { + return err + } + entity.Refresh() + err = gui.closeCommitMessageView(g, v) + return err +} + +// focus to next view +func (gui *Gui) nextCommitView(g *gocui.Gui, v *gocui.View) error { + err := gui.nextViewOfGroup(g, v, commitViews) + return err +} + +// close the opened commite mesage view +func (gui *Gui) closeCommitMessageView(g *gocui.Gui, v *gocui.View) error { + entity := gui.getSelectedRepository() + g.Cursor = false + for _, view := range commitViews { + if err := g.DeleteView(view.Name); err != nil { + return err + } + } + for _, view := range commitLabelViews { + if err := g.DeleteView(view.Name); err != nil { + return err + } + } + if err := gui.refreshMain(g); err != nil { + return err + } + if err := gui.refreshViews(g, entity); err != nil { + return err + } + if err := refreshAllStatusView(g, entity, true); err != nil { + return err + } + return gui.closeViewCleanup(commitMesageReturnView) +} diff --git a/pkg/gui/diffview.go b/pkg/gui/diffview.go index 04c9e10..55286e9 100644 --- a/pkg/gui/diffview.go +++ b/pkg/gui/diffview.go @@ -62,9 +62,9 @@ func (gui *Gui) openFileDiffView(g *gocui.Gui, v *gocui.View) (err error) { var files []*git.File switch v.Name() { case unstageViewFeature.Name: - _, files, err = generateFileLists(entity) + _, files, err = populateFileLists(entity) case stageViewFeature.Name: - files, _, err = generateFileLists(entity) + files, _, err = populateFileLists(entity) } if err != nil { return err diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go index 1d4dd6d..4917cd4 100644 --- a/pkg/gui/keybindings.go +++ b/pkg/gui/keybindings.go @@ -206,6 +206,38 @@ func (gui *Gui) generateKeybindings() error { gui.KeyBindings = append(gui.KeyBindings, binding) } } + for _, view := range commitViews { + commitKeybindings := []*KeyBinding{ + { + View: view.Name, + Key: gocui.KeyEsc, + Modifier: gocui.ModNone, + Handler: gui.closeCommitMessageView, + Display: "esc", + Description: "close/cancel", + Vital: true, + }, { + View: view.Name, + Key: gocui.KeyTab, + Modifier: gocui.ModNone, + Handler: gui.nextCommitView, + Display: "tab", + Description: "Next Panel", + Vital: true, + }, { + View: view.Name, + Key: gocui.KeyEnter, //TODO: enter should be replaced with a better option + Modifier: gocui.ModNone, + Handler: gui.submitCommitMessageView, + Display: "ctrl + enter", + Description: "Submit", + Vital: true, + }, + } + for _, binding := range commitKeybindings { + gui.KeyBindings = append(gui.KeyBindings, binding) + } + } individualKeybindings := []*KeyBinding{ // stash view { @@ -277,24 +309,6 @@ func (gui *Gui) generateKeybindings() error { Description: "Show diff", Vital: true, }, - // commit message view - { - View: commitMessageViewFeature.Name, - Key: gocui.KeyEsc, - Modifier: gocui.ModNone, - Handler: gui.closeCommitMessageView, - Display: "esc", - Description: "Close / Cancel", - Vital: true, - }, { - View: commitMessageViewFeature.Name, - Key: gocui.KeyEnter, //TODO: enter should be replaced with a better option - Modifier: gocui.ModNone, - Handler: gui.submitCommitMessageView, - Display: "ctrl + enter", - Description: "Submit", - Vital: true, - }, // Main view controls { View: mainViewFeature.Name, diff --git a/pkg/gui/stagedview.go b/pkg/gui/stagedview.go index 294c0f7..4a6beb9 100644 --- a/pkg/gui/stagedview.go +++ b/pkg/gui/stagedview.go @@ -27,19 +27,16 @@ func (gui *Gui) openStageView(g *gocui.Gui) error { func (gui *Gui) resetChanges(g *gocui.Gui, v *gocui.View) error { entity := gui.getSelectedRepository() - files, _, err := generateFileLists(entity) - if err != nil { - return err - } - if len(files) <= 0 { - return nil - } + _, cy := v.Cursor() _, oy := v.Origin() - if err := git.Reset(entity, files[cy+oy], git.ResetOptions{}); err != nil { + if len(stagedFiles) <= 0 || len(stagedFiles) <= cy+oy { + return nil + } + if err := git.Reset(entity, stagedFiles[cy+oy], git.ResetOptions{}); err != nil { return err } - return refreshAllStatusView(g, entity) + return refreshAllStatusView(g, entity, true) } func (gui *Gui) resetAllChanges(g *gocui.Gui, v *gocui.View) error { @@ -54,7 +51,7 @@ func (gui *Gui) resetAllChanges(g *gocui.Gui, v *gocui.View) error { }); err != nil { return err } - return refreshAllStatusView(g, entity) + return refreshAllStatusView(g, entity, true) } // refresh the main view and re-render the repository representations @@ -66,11 +63,7 @@ func refreshStagedView(g *gocui.Gui, entity *git.RepoEntity) error { stageView.Clear() _, cy := stageView.Cursor() _, oy := stageView.Origin() - files, _, err := generateFileLists(entity) - if err != nil { - return err - } - for i, file := range files { + for i, file := range stagedFiles { var prefix string if i == cy+oy { prefix = prefix + selectionIndicator diff --git a/pkg/gui/stashview.go b/pkg/gui/stashview.go index 54a05db..24b4f3c 100644 --- a/pkg/gui/stashview.go +++ b/pkg/gui/stashview.go @@ -34,7 +34,7 @@ func (gui *Gui) stashChanges(g *gocui.Gui, v *gocui.View) error { return err } } - err = refreshAllStatusView(g, entity) + err = refreshAllStatusView(g, entity, true) return err } @@ -58,7 +58,7 @@ func (gui *Gui) popStash(g *gocui.Gui, v *gocui.View) error { if err := entity.Refresh(); err != nil { return err } - err = refreshAllStatusView(g, entity) + err = refreshAllStatusView(g, entity, true) return err } diff --git a/pkg/gui/statusview.go b/pkg/gui/statusview.go index c0a9c65..82df459 100644 --- a/pkg/gui/statusview.go +++ b/pkg/gui/statusview.go @@ -1,29 +1,30 @@ package gui import ( - "errors" "fmt" - "time" "github.com/isacikgoz/gitbatch/pkg/git" "github.com/jroimartin/gocui" - ggt "gopkg.in/src-d/go-git.v4" - "gopkg.in/src-d/go-git.v4/plumbing/object" ) var ( - statusHeaderViewFeature = viewFeature{Name: "status-header", Title: " Status Header "} - stageViewFeature = viewFeature{Name: "staged", Title: " Staged "} - unstageViewFeature = viewFeature{Name: "unstaged", Title: " Not Staged "} - stashViewFeature = viewFeature{Name: "stash", Title: " Stash "} - commitMessageViewFeature = viewFeature{Name: "commitmessage", Title: " Commit Mesage "} + statusHeaderViewFeature = viewFeature{Name: "status-header", Title: " Status Header "} + stageViewFeature = viewFeature{Name: "staged", Title: " Staged "} + unstageViewFeature = viewFeature{Name: "unstaged", Title: " Not Staged "} + stashViewFeature = viewFeature{Name: "stash", Title: " Stash "} + + statusViews = []viewFeature{stageViewFeature, unstageViewFeature, stashViewFeature} - statusViews = []viewFeature{stageViewFeature, unstageViewFeature, stashViewFeature} commitMesageReturnView string + stagedFiles []*git.File + unstagedFiles []*git.File ) // open the status layout func (gui *Gui) openStatusView(g *gocui.Gui, v *gocui.View) error { + if err := reloadFiles(gui.getSelectedRepository()); err != nil { + return err + } gui.openStatusHeaderView(g) gui.openStageView(g) gui.openUnStagedView(g) @@ -31,6 +32,11 @@ func (gui *Gui) openStatusView(g *gocui.Gui, v *gocui.View) error { return nil } +func reloadFiles(entity *git.RepoEntity) (err error) { + stagedFiles, unstagedFiles, err = populateFileLists(entity) + return err +} + // focus to next view func (gui *Gui) nextStatusView(g *gocui.Gui, v *gocui.View) error { err := gui.nextViewOfGroup(g, v, statusViews) @@ -62,7 +68,7 @@ func (gui *Gui) statusCursorDown(g *gocui.Gui, v *gocui.View) error { } } entity := gui.getSelectedRepository() - if err := refreshStatusView(v.Name(), g, entity); err != nil { + if err := refreshStatusView(v.Name(), g, entity, false); err != nil { return err } } @@ -80,7 +86,7 @@ func (gui *Gui) statusCursorUp(g *gocui.Gui, v *gocui.View) error { } } entity := gui.getSelectedRepository() - if err := refreshStatusView(v.Name(), g, entity); err != nil { + if err := refreshStatusView(v.Name(), g, entity, false); err != nil { return err } } @@ -113,6 +119,8 @@ func (gui *Gui) closeStatusView(g *gocui.Gui, v *gocui.View) error { if err := g.DeleteView(statusHeaderViewFeature.Name); err != nil { return err } + stagedFiles = make([]*git.File, 0) + unstagedFiles = make([]*git.File, 0) entity := gui.getSelectedRepository() if err := gui.refreshMain(g); err != nil { return err @@ -123,7 +131,7 @@ func (gui *Gui) closeStatusView(g *gocui.Gui, v *gocui.View) error { return gui.closeViewCleanup(mainViewFeature.Name) } -func generateFileLists(entity *git.RepoEntity) (staged, unstaged []*git.File, err error) { +func populateFileLists(entity *git.RepoEntity) (staged, unstaged []*git.File, err error) { files, err := git.Status(entity) if err != nil { return nil, nil, err @@ -139,14 +147,17 @@ func generateFileLists(entity *git.RepoEntity) (staged, unstaged []*git.File, er return staged, unstaged, err } -func refreshStatusView(viewName string, g *gocui.Gui, entity *git.RepoEntity) error { +func refreshStatusView(viewName string, g *gocui.Gui, entity *git.RepoEntity, reload bool) error { + if reload { + reloadFiles(entity) + } switch viewName { case stageViewFeature.Name: if err := refreshStagedView(g, entity); err != nil { return err } case unstageViewFeature.Name: - if err := refreshUnstagedView(g, entity); err != nil { + if err := refreshUnstagedView(g); err != nil { return err } case stashViewFeature.Name: @@ -157,84 +168,11 @@ func refreshStatusView(viewName string, g *gocui.Gui, entity *git.RepoEntity) er return nil } -func refreshAllStatusView(g *gocui.Gui, entity *git.RepoEntity) error { +func refreshAllStatusView(g *gocui.Gui, entity *git.RepoEntity, reload bool) error { for _, v := range statusViews { - if err := refreshStatusView(v.Name, g, entity); err != nil { + if err := refreshStatusView(v.Name, g, entity, reload); err != nil { return err } } return nil } - -// open the commit message views -func (gui *Gui) openCommitMessageView(g *gocui.Gui, v *gocui.View) error { - maxX, maxY := g.Size() - commitMesageReturnView = v.Name() - v, err := g.SetView(commitMessageViewFeature.Name, maxX/2-30, maxY/2-3, maxX/2+30, maxY/2+3) - if err != nil { - if err != gocui.ErrUnknownView { - return err - } - v.Title = commitMessageViewFeature.Title - v.Wrap = true - v.Editable = true - v.Editor = gocui.DefaultEditor - v.Highlight = true - g.Cursor = true - } - gui.updateKeyBindingsView(g, commitMessageViewFeature.Name) - if _, err := g.SetCurrentView(commitMessageViewFeature.Name); err != nil { - return err - } - return nil -} - -// close the opened commite mesage view -func (gui *Gui) submitCommitMessageView(g *gocui.Gui, v *gocui.View) error { - entity := gui.getSelectedRepository() - w, err := entity.Repository.Worktree() - if err != nil { - return err - } - config, err := entity.Repository.Config() - if err != nil { - return err - } - name := config.Raw.Section("user").Option("name") - email := config.Raw.Section("user").Option("email") - if len(email) <= 0 { - return errors.New("User email needs to be provided") - } - _, err = w.Commit(v.ViewBuffer(), &ggt.CommitOptions{ - Author: &object.Signature{ - Name: name, - Email: email, - When: time.Now(), - }, - }) - if err != nil { - return err - } - entity.Refresh() - err = gui.closeCommitMessageView(g, v) - return err -} - -// close the opened commite mesage view -func (gui *Gui) closeCommitMessageView(g *gocui.Gui, v *gocui.View) error { - entity := gui.getSelectedRepository() - g.Cursor = false - if err := g.DeleteView(commitMessageViewFeature.Name); err != nil { - return err - } - if err := gui.refreshMain(g); err != nil { - return err - } - if err := gui.refreshViews(g, entity); err != nil { - return err - } - if err := refreshAllStatusView(g, entity); err != nil { - return err - } - return gui.closeViewCleanup(commitMesageReturnView) -} diff --git a/pkg/gui/unstagedview.go b/pkg/gui/unstagedview.go index 01b16de..1a33c12 100644 --- a/pkg/gui/unstagedview.go +++ b/pkg/gui/unstagedview.go @@ -18,26 +18,22 @@ func (gui *Gui) openUnStagedView(g *gocui.Gui) error { } v.Title = unstageViewFeature.Title } - entity := gui.getSelectedRepository() - err = refreshUnstagedView(g, entity) + err = refreshUnstagedView(g) return err } func (gui *Gui) addChanges(g *gocui.Gui, v *gocui.View) error { entity := gui.getSelectedRepository() - _, files, err := generateFileLists(entity) - if err != nil { - return err - } - if len(files) <= 0 { - return nil - } + _, cy := v.Cursor() _, oy := v.Origin() - if err := git.Add(entity, files[cy+oy], git.AddOptions{}); err != nil { + if len(unstagedFiles) <= 0 || len(unstagedFiles) < cy+oy { + return nil + } + if err := git.Add(entity, unstagedFiles[cy+oy], git.AddOptions{}); err != nil { return err } - err = refreshAllStatusView(g, entity) + err := refreshAllStatusView(g, entity, true) return err } @@ -46,12 +42,12 @@ func (gui *Gui) addAllChanges(g *gocui.Gui, v *gocui.View) error { if err := git.AddAll(entity, git.AddOptions{}); err != nil { return err } - err := refreshAllStatusView(g, entity) + err := refreshAllStatusView(g, entity, true) return err } // refresh the main view and re-render the repository representations -func refreshUnstagedView(g *gocui.Gui, entity *git.RepoEntity) error { +func refreshUnstagedView(g *gocui.Gui) error { stageView, err := g.View(unstageViewFeature.Name) if err != nil { return err @@ -59,11 +55,7 @@ func refreshUnstagedView(g *gocui.Gui, entity *git.RepoEntity) error { stageView.Clear() _, cy := stageView.Cursor() _, oy := stageView.Origin() - _, files, err := generateFileLists(entity) - if err != nil { - return err - } - for i, file := range files { + for i, file := range unstagedFiles { var prefix string if i == cy+oy { prefix = prefix + selectionIndicator |
