From 340a0fb393a0256cd5b26eb740213265484d5d7d Mon Sep 17 00:00:00 2001 From: Ibrahim Serdar Acikgoz Date: Sun, 9 Jun 2019 23:11:51 +0300 Subject: [PATCH 01/33] remove old implementation --- cli/branch.go | 186 --------------- cli/commit.go | 57 ----- cli/log.go | 160 ------------- cli/prompt.go | 88 ------- cli/search.go | 158 ------------ cli/stat.go | 81 ------- cli/status.go | 384 ------------------------------ editor/controlsview.go | 65 ----- editor/keybindings.go | 129 ---------- editor/textview.go | 430 --------------------------------- editor/views.go | 68 ------ git/branch.go | 229 ------------------ git/commit.go | 527 ----------------------------------------- git/diff.go | 140 ----------- git/repository.go | 160 ------------- git/status.go | 252 -------------------- git/tag.go | 72 ------ img/screencast.gif | Bin 3356119 -> 0 bytes main.go | 119 ---------- 19 files changed, 3305 deletions(-) delete mode 100644 cli/branch.go delete mode 100644 cli/commit.go delete mode 100644 cli/log.go delete mode 100644 cli/prompt.go delete mode 100644 cli/search.go delete mode 100644 cli/stat.go delete mode 100644 cli/status.go delete mode 100644 editor/controlsview.go delete mode 100644 editor/keybindings.go delete mode 100644 editor/textview.go delete mode 100644 editor/views.go delete mode 100644 git/branch.go delete mode 100644 git/commit.go delete mode 100644 git/diff.go delete mode 100644 git/repository.go delete mode 100644 git/status.go delete mode 100644 git/tag.go delete mode 100644 img/screencast.gif delete mode 100644 main.go diff --git a/cli/branch.go b/cli/branch.go deleted file mode 100644 index 0a7b30c..0000000 --- a/cli/branch.go +++ /dev/null @@ -1,186 +0,0 @@ -package cli - -import ( - "fmt" - "os" - "os/exec" - "sort" - - "github.com/isacikgoz/gitin/git" - "github.com/isacikgoz/promptui" - - log "github.com/sirupsen/logrus" -) - -type BranchOptions struct { - Types BranchTypes - Sort BranchSortTypes - PromptOps *PromptOptions -} - -type BranchTypes uint8 - -const ( - LocalBranches BranchTypes = iota - RemoteBranches - AllBranches -) - -type BranchSortTypes uint8 - -const ( - BranchSortDefault BranchSortTypes = iota - BranchSortDate -) - -func BranchBuilder(r *git.Repository, opts *BranchOptions) error { - if err := r.InitializeBranches(); err != nil { - return err - } - switch opts.Types { - case LocalBranches: - i := 0 // output index - for _, b := range r.Branches { - if !b.IsRemote() { - r.Branches[i] = b - i++ - } - } - r.Branches = r.Branches[:i] - case RemoteBranches: - i := 0 // output index - for _, b := range r.Branches { - if b.IsRemote() { - r.Branches[i] = b - i++ - } - } - r.Branches = r.Branches[:i] - case AllBranches: - - } - - switch opts.Sort { - case BranchSortDate: - sort.Sort(BranchesByDate(r.Branches)) - default: - - } - return branchPrompt(r, opts.PromptOps) -} - -func branchPrompt(r *git.Repository, opts *PromptOptions) error { - - // make terminal not line wrap - fmt.Printf("\x1b[?7l") - // defer restoring line wrap - defer fmt.Printf("\x1b[?7h") - - var prompt promptui.Select - kset := make(map[promptui.CustomKey]promptui.CustomFunc) - kset[promptui.CustomKey{Key: 'q', Always: false}] = - func(in interface{}, chb chan bool, index int) error { - quitPrompt(r, chb) - return nil - } - kset[promptui.CustomKey{Key: 'd', Always: false}] = - func(in interface{}, chb chan bool, index int) error { - b := r.Branches[index] - if b == r.Branch { - return nil - } - if err := deleteBranch(r, b, "d"); err != nil { - log.Error(err) - } - chb <- false - if err := r.InitializeBranches(); err != nil { - return err - } - prompt.RefreshList(r.Branches, index) - return nil - } - kset[promptui.CustomKey{Key: 'D', Always: false}] = - func(in interface{}, chb chan bool, index int) error { - b := r.Branches[index] - if b == r.Branch { - return nil - } - if err := deleteBranch(r, b, "D"); err != nil { - log.Error(err) - } - chb <- false - if err := r.InitializeBranches(); err != nil { - return err - } - prompt.RefreshList(r.Branches, index) - return nil - } - - prompt = promptui.Select{ - Label: "Branches", - Items: r.Branches, - HideHelp: opts.HideHelp, - SearchLabel: opts.SearchLabel, - StartInSearchMode: opts.StartInSearch, - Searcher: finderFunc(opts.Finder), - Size: opts.Size, - Templates: branchTemplate(), - CustomFuncs: kset, - } - i, _, err := prompt.RunCursorAt(opts.Cursor, opts.Scroll) - - if err == nil { - cmd := exec.Command("git", "checkout", r.Branches[i].Name) - cmd.Dir = r.AbsPath - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - cmd.Stdin = os.Stdin - return cmd.Run() - } - - return nil -} - -func branchTemplate() *promptui.SelectTemplates { - templates := &promptui.SelectTemplates{ - Label: "{{ . |yellow}}:", - Active: "* {{ .Name | green }}", - Inactive: " {{ .Name }}", - Selected: "{{ .Name }}", - Extra: "delete: d checkout: enter", - Details: "\n" + - "-------------- Last Commit --------------" + "\n" + - "{{ \"Hash:\" | faint }} {{ .Hash | yellow }} " + "\n" + - "{{ \"Message:\" | faint }} {{ .LastCommitMessage }} " + "\n" + - "{{ \"Author:\" | faint }} {{ .LastCommitAuthor }} " + "\n" + - "{{ \"Date:\" | faint }} {{ .LastCommitDate }} " + "\n" + - "{{- if .IsRemote }} {{- else }} \n" + - "---------------- Status -----------------\n" + - "{{ .Status }} {{- end }}", - } - return templates -} - -func deleteBranch(r *git.Repository, b *git.Branch, mode string) error { - cmd := exec.Command("git", "branch", "-"+mode, b.Name) - cmd.Dir = r.AbsPath - if err := cmd.Run(); err == nil { - return err - } - return nil -} - -// BranchesByDate slice is the re-ordered *git.Branch slice that sorted according -// to modification date -type BranchesByDate []*git.Branch - -// Len is the interface implementation for BranchesByDate sorting function -func (s BranchesByDate) Len() int { return len(s) } - -// Swap is the interface implementation for BranchesByDate sorting function -func (s BranchesByDate) Swap(i, j int) { s[i], s[j] = s[j], s[i] } - -// Less is the interface implementation for BranchesByDate sorting function -func (s BranchesByDate) Less(i, j int) bool { - return s[i].Date().Unix() > s[j].Date().Unix() -} diff --git a/cli/commit.go b/cli/commit.go deleted file mode 100644 index b71d0a6..0000000 --- a/cli/commit.go +++ /dev/null @@ -1,57 +0,0 @@ -package cli - -import ( - "os" - "os/exec" - - "github.com/isacikgoz/gitin/git" -) - -type CommitOptions struct { - MinCommitLength int - MaxCommitLength int - Message string - PromptOps *PromptOptions -} - -func CommitBuilder(r *git.Repository, opts *CommitOptions) error { - if len(opts.Message) <= 0 { - opts.Message = "message" - } - return commitPrompt(r, opts) -} - -func commitPrompt(r *git.Repository, opts *CommitOptions) error { - args := []string{"--edit", "--quiet"} - return execCommit(r, args) -} - -func commitAmend(r *git.Repository) error { - args := []string{"--amend", "--quiet"} - return execCommit(r, args) -} - -func execCommit(r *git.Repository, args []string) error { - args = append([]string{"commit"}, args...) - cmd := exec.Command("git", args...) - cmd.Dir = r.AbsPath - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - cmd.Stdin = os.Stdin - ok := false - if err := cmd.Start(); err != nil { - return err - } - if err := cmd.Wait(); err == nil { - ok = true - } - if err := r.InitializeStatus(); err != nil { - return err - } - if ok { - if err := popGitCmd(r, r.LastCommitArgs()); err != nil { - return err - } - } - return NoErrRecurse -} diff --git a/cli/log.go b/cli/log.go deleted file mode 100644 index 823c5fc..0000000 --- a/cli/log.go +++ /dev/null @@ -1,160 +0,0 @@ -package cli - -import ( - "errors" - "fmt" - - "github.com/isacikgoz/gitin/git" - "github.com/isacikgoz/promptui" -) - -type LogOptions struct { - Mode LogMode - Author string - Before string - Committer string - MaxCount int - Since string - - PromptOps *PromptOptions -} -type LogMode uint8 - -const ( - LogNormal LogMode = iota - LogAhead - LogBehind - LogMixed -) - -func LogBuilder(r *git.Repository, opts *LogOptions) error { - var commits []*git.Commit - loadOpts := &git.CommitLoadOptions{ - MaxCount: opts.MaxCount, - Author: opts.Author, - Committer: opts.Committer, - Since: opts.Since, - Before: opts.Before, - } - if err := r.LoadAll(loadOpts); err != nil { - return err - } - switch opts.Mode { - case LogNormal: - commits = r.Commits - case LogAhead: - commits = r.Branch.Ahead - case LogBehind: - commits = r.Branch.Behind - case LogMixed: - commits = r.Branch.Ahead - commits = append(commits, r.Commits...) - } - return logPrompt(r, opts.PromptOps, commits) -} - -func logPrompt(r *git.Repository, opts *PromptOptions, commits []*git.Commit) error { - if len(commits) <= 0 { - return errors.New("there are no commits to log") - } - // make terminal not line wrap - fmt.Printf("\x1b[?7l") - // defer restoring line wrap - defer fmt.Printf("\x1b[?7h") - var recurse bool - var prompt promptui.Select - kset := make(map[promptui.CustomKey]promptui.CustomFunc) - kset[promptui.CustomKey{Key: 'q', Always: false}] = - func(in interface{}, chb chan bool, index int) error { - quitPrompt(r, chb) - return nil - } - kset[promptui.CustomKey{Key: 's', Always: false}] = - func(in interface{}, chb chan bool, index int) error { - if err := emuEnterKey(); err != nil { - chb <- true - } else { - chb <- false - } - recurse = true - if err := popGitCmd(r, []string{"show", "--stat", commits[index].Hash}); err != nil { - return err - } - o := currentOptions(&prompt, opts) - return logPrompt(r, o, commits) - } - kset[promptui.CustomKey{Key: 'd', Always: false}] = - func(in interface{}, chb chan bool, index int) error { - if err := emuEnterKey(); err != nil { - chb <- true - } else { - chb <- false - } - recurse = true - if err := popGitCmd(r, []string{"show", commits[index].Hash}); err != nil { - return err - } - o := currentOptions(&prompt, opts) - return logPrompt(r, o, commits) - } - - prompt = promptui.Select{ - Label: "Commits", - Items: commits, - HideHelp: opts.HideHelp, - StartInSearchMode: opts.StartInSearch, - PreSearchString: opts.InitSearchString, - Size: opts.Size, - SearchLabel: opts.SearchLabel, - Searcher: finderFunc(opts.Finder), - Templates: logTemplate(opts.ShowDetail), - CustomFuncs: kset, - } - i, _, err := prompt.RunCursorAt(opts.Cursor, opts.Scroll) - if recurse { - o := currentOptions(&prompt, opts) - return logPrompt(r, o, commits) - } - - if err == nil { - o := &PromptOptions{ - Cursor: 0, - Scroll: 0, - Size: opts.Size, - HideHelp: opts.HideHelp, - } - if err := statPrompt(r, commits[i], o); err != nil && err == NoErrRecurse { - o := &PromptOptions{ - Cursor: prompt.CursorPosition(), - Scroll: prompt.ScrollPosition(), - Size: opts.Size, - StartInSearch: prompt.FinishInSearchMode, - InitSearchString: prompt.PreSearchString, - ShowDetail: opts.ShowDetail, - HideHelp: opts.HideHelp, - Finder: opts.Finder, - } - return logPrompt(r, o, commits) - } - } - return nil -} - -func logTemplate(detail bool) *promptui.SelectTemplates { - templates := &promptui.SelectTemplates{ - Label: "{{ . |yellow}}:", - Active: "* {{ printf \"%.7s\" .Hash | cyan}} {{ .Summary | green}}", - Inactive: " {{ printf \"%.7s\" .Hash | cyan}} {{ .Summary}}", - Selected: "{{ .Summary }}", - Extra: "select: enter", - } - if detail { - templates.Details = ` ----------------- Commit Detail ----------------- -{{ "Hash:" | faint }} {{ .Hash | yellow }} -{{ "Author:"| faint }} {{ .Author }} -{{ "Date:" | faint }} {{ .Date }} ({{ .Since | blue }}) -{{ .CommitRefs }}` - } - return templates -} diff --git a/cli/prompt.go b/cli/prompt.go deleted file mode 100644 index 845e18b..0000000 --- a/cli/prompt.go +++ /dev/null @@ -1,88 +0,0 @@ -package cli - -import ( - "errors" - "os" - "os/exec" - "runtime" - "time" - - "github.com/isacikgoz/gitin/git" - "github.com/isacikgoz/promptui" - "github.com/micmonay/keybd_event" - log "github.com/sirupsen/logrus" -) - -// PromptOptions is the common options for building a prompt -type PromptOptions struct { - Cursor int - Scroll int - Size int - HideHelp bool - ShowDetail bool - StartInSearch bool - SearchLabel string - InitSearchString string - Finder string -} - -var ( - // NoErrRecurse is just a indactor to the caller to pop prompt back - NoErrRecurse error = errors.New("catch") -) - -func popGitCmd(r *git.Repository, args []string) error { - os.Setenv("LESS", "-RCS") - cmd := exec.Command("git", args...) - cmd.Dir = r.AbsPath - - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - cmd.Stdin = os.Stdin - - if err := cmd.Start(); err != nil { - log.Warn(err.Error()) - } - if err := cmd.Wait(); err != nil { - log.Warn(err.Error()) - } - return NoErrRecurse -} - -func currentOptions(prompt *promptui.Select, opts *PromptOptions) *PromptOptions { - return &PromptOptions{ - Cursor: prompt.CursorPosition(), - Scroll: prompt.ScrollPosition(), - Size: opts.Size, - Finder: opts.Finder, - ShowDetail: opts.ShowDetail, - HideHelp: opts.HideHelp, - } -} - -func emuEnterKey() error { - if runtime.GOOS == "linux" { - return errors.New("not supported on linux") - } - kb, err := keybd_event.NewKeyBonding() - if err != nil { - return err - } - - //set keys - kb.SetKeys(keybd_event.VK_ENTER) - err = kb.Launching() - if err != nil { - return err - } - return nil -} - -func quitPrompt(r *git.Repository, chb chan bool) { - defer os.Exit(0) - r.Close() - - chb <- true - // lets give it to readline to close itself - time.Sleep(100 * time.Millisecond) -} diff --git a/cli/search.go b/cli/search.go deleted file mode 100644 index e6dca17..0000000 --- a/cli/search.go +++ /dev/null @@ -1,158 +0,0 @@ -package cli - -import ( - "fmt" - "strings" - "sync" - - "github.com/isacikgoz/gitin/git" - "github.com/isacikgoz/promptui/list" - "github.com/sahilm/fuzzy" -) - -type interfaceSource []*interface{} - -func (is interfaceSource) String(i int) string { return fmt.Sprint(*is[i]) } - -func (is interfaceSource) Len() int { return len(is) } - -func combinedSearch(in []*interface{}, term string) []*interface{} { - scope := interfaceSource(in) - var wg sync.WaitGroup - filter := strings.ToLower(term) - if filter == "" { - return scope - } - if strings.HasSuffix(filter, "!") { - filter = filter[:len(filter)-1] - } - eMatches := make([]*interface{}, 0) - wg.Add(1) - go func() { - defer wg.Done() - for _, o := range scope { - if strings.Contains(strings.ToLower(fmt.Sprint(*o)), filter) { - eMatches = append(eMatches, o) - } - } - }() - if strings.HasSuffix(term, "!") { - wg.Wait() - return eMatches - } - fMatches := make([]*interface{}, 0) - wg.Add(1) - go func() { - defer wg.Done() - fMatches = fuzzySearch(in, term) - eMatches = append(eMatches, fMatches...) - }() - - wg.Wait() - return removeDuplicates(eMatches) -} - -func fuzzySearch(in []*interface{}, term string) []*interface{} { - scope := interfaceSource(in) - var wg sync.WaitGroup - filter := strings.ToLower(term) - if filter == "" { - return scope - } - fMatches := make([]*interface{}, 0) - wg.Add(1) - go func() { - defer wg.Done() - matches := fuzzy.FindFrom(filter, scope) - for _, m := range matches { - fMatches = append(fMatches, in[m.Index]) - } - }() - - wg.Wait() - return fMatches -} - -func basicSearch(scope []*interface{}, term string) []*interface{} { - matches := make([]*interface{}, 0) - for _, o := range scope { - if strings.Contains(strings.ToLower(fmt.Sprint(*o)), strings.ToLower(term)) { - matches = append(matches, o) - } - } - return matches -} - -// *interface{} shall implement String() interface -// removes duplicate entries from prompt.Suggest slice -func removeDuplicates(elements []*interface{}) []*interface{} { - // Use map to record duplicates as we find them. - encountered := map[*interface{}]bool{} - result := make([]*interface{}, 0) - - for v := range elements { - if encountered[elements[v]] == true { - // Do not add duplicate. - } else { - // Record this element as an encountered element. - encountered[elements[v]] = true - // Append to result slice. - result = append(result, elements[v]) - } - } - // Return the new slice. - return result -} - -func finderFunc(option string) list.Searcher { - switch option { - case "combined": - return combinedSearch - case "basic": - return basicSearch - default: - return fuzzySearch - } -} - -func specialSearch(in []*interface{}, term string) []*interface{} { - var narrowed []*interface{} - if len(term) >= 3 && term[:3] == "c: " { - for _, item := range in { - if typeSwitch(*item) == "c" { - narrowed = append(narrowed, item) - } - } - term = term[3:] - } else if len(term) >= 3 && term[:3] == "b: " { - for _, item := range in { - if typeSwitch(*item) == "b" { - narrowed = append(narrowed, item) - } - } - term = term[3:] - } else if len(term) >= 3 && term[:3] == "t: " { - for _, item := range in { - if typeSwitch(*item) == "t" { - narrowed = append(narrowed, item) - } - } - term = term[3:] - } else { - narrowed = in - } - return fuzzySearch(narrowed, term) -} - -func typeSwitch(tst interface{}) string { - switch tst.(type) { - case *git.Commit: - return "c" - case *git.Tag: - return "t" - case *git.Branch: - return "b" - default: - return " " - } -} diff --git a/cli/stat.go b/cli/stat.go deleted file mode 100644 index 253f980..0000000 --- a/cli/stat.go +++ /dev/null @@ -1,81 +0,0 @@ -package cli - -import ( - "github.com/isacikgoz/gitin/git" - "github.com/isacikgoz/promptui" -) - -func statPrompt(r *git.Repository, c *git.Commit, opts *PromptOptions) error { - var back bool - diff, err := r.DiffFromHash(c.Hash) - if err != nil { - return err - } - var recurse bool - var prompt promptui.Select - deltas := diff.Deltas() - kset := make(map[promptui.CustomKey]promptui.CustomFunc) - kset[promptui.CustomKey{Key: 'q', Always: false}] = - func(in interface{}, chb chan bool, index int) error { - if err := emuEnterKey(); err != nil { - chb <- true - } else { - chb <- false - } - recurse = false - back = true - return nil - } - kset[promptui.CustomKey{Key: 's', Always: false}] = - func(in interface{}, chb chan bool, index int) error { - if err := emuEnterKey(); err != nil { - chb <- true - } else { - chb <- false - } - recurse = true - if err = popGitCmd(r, []string{"show", "--stat", c.Hash}); err == NoErrRecurse { - return nil - } - return nil - } - - prompt = promptui.Select{ - Label: c, - Items: deltas, - HideHelp: opts.HideHelp, - Size: opts.Size, - Templates: statTemplate(c), - CustomFuncs: kset, - } - i, _, err := prompt.RunCursorAt(opts.Cursor, opts.Scroll) - if recurse { - o := currentOptions(&prompt, opts) - return statPrompt(r, c, o) - } - if back { - return NoErrRecurse - } - if err == nil { - o := currentOptions(&prompt, opts) - if err = popGitCmd(r, deltas[i].FileStatArgs(c)); err == NoErrRecurse { - return statPrompt(r, c, o) - } - } - return nil -} - -func statTemplate(c *git.Commit) *promptui.SelectTemplates { - templates := &promptui.SelectTemplates{ - Label: "{{ .Summary | yellow }}", - Active: "* {{ .String | green}} ", - Inactive: " {{ .String }}", - Extra: "stat: s select: enter", - Details: "\n" + - "---------------- Commit Detail -----------------" + "\n" + - "{{ \"Hash:\" | faint }} " + "{{ \"" + c.Hash + "\" | yellow }}" + "\n" + - "{{ \"Author:\" | faint }} " + c.Author.String() + "\n" + - "{{ \"Date:\" | faint }} " + c.Date() + " (" + "{{ \"" + c.Since() + "\" | blue }}" + ")", - } - return templates -} diff --git a/cli/status.go b/cli/status.go deleted file mode 100644 index 0cd6303..0000000 --- a/cli/status.go +++ /dev/null @@ -1,384 +0,0 @@ -package cli - -import ( - "fmt" - "io" - "os" - "os/exec" - "sort" - "strconv" - "unicode" - - "github.com/fatih/color" - "github.com/isacikgoz/gitin/editor" - "github.com/isacikgoz/gitin/git" - "github.com/isacikgoz/promptui" - "github.com/waigani/diffparser" - - log "github.com/sirupsen/logrus" -) - -// StatusOptions -type StatusOptions struct { - PromptOps *PromptOptions -} - -func StatusBuilder(r *git.Repository, opts *StatusOptions) error { - if err := r.InitializeBranches(); err != nil { - return err - } - return statusPrompt(r, opts.PromptOps) -} - -func statusPrompt(r *git.Repository, opts *PromptOptions) error { - files, err := generateFileList(r) - if err != nil { - return err - } - stop := false - if files == nil || len(files) <= 0 { - - yellow := color.New(color.FgYellow) - fmt.Println("On branch " + yellow.Sprint(r.Branch.Name)) - fmt.Println(getAheadBehind(r.Branch) + "\n") - fmt.Println("Nothing to commit, working tree clean") - return nil - } - // make terminal not line wrap - fmt.Printf("\x1b[?7l") - // defer restoring line wrap - defer fmt.Printf("\x1b[?7h") - - var prompt promptui.Select - kset := make(map[promptui.CustomKey]promptui.CustomFunc) - kset[promptui.CustomKey{Key: 'q', Always: false}] = - func(in interface{}, chb chan bool, index int) error { - quitPrompt(r, chb) - return nil - } - kset[promptui.CustomKey{Key: ' ', Always: false}] = - func(in interface{}, chb chan bool, index int) error { - e := files[index].Entry() - if e.Indexed() { - r.ResetEntry(e) - } else { - r.AddEntry(e) - } - chb <- false - var err error - files, err = generateFileList(r) - if err != nil { - return err - } - prompt.RefreshList(files, index) - return nil - } - kset[promptui.CustomKey{Key: '!', Always: false}] = - func(in interface{}, chb chan bool, index int) error { - e := files[index].Entry() - args := []string{"checkout", "--", e.String()} - if err := popGitCmd(r, args); err != nil { - log.Warn(err) - } - files, err = generateFileList(r) - if files == nil || len(files) <= 0 { - chb <- true - stop = true - return statusPrompt(r, opts) - } - chb <- false - var err error - if err != nil { - return err - } - prompt.RefreshList(files, index) - return nil - } - kset[promptui.CustomKey{Key: 'a', Always: false}] = - func(in interface{}, chb chan bool, index int) error { - r.AddAll() - var err error - files, err = generateFileList(r) - if err != nil { - return err - } - chb <- false - prompt.RefreshList(files, index) - return nil - } - kset[promptui.CustomKey{Key: 'p', Always: false}] = - func(in interface{}, chb chan bool, index int) error { - stop = true - if err := emuEnterKey(); err != nil { - log.Warn(err.Error()) - } - chb <- true - entry := files[index].entry - file, err := generateDiffFile(r, entry) - if err == nil { - editor, err := editor.NewEditor(file) - if err != nil { - log.Error(err) - return err - } - patches, err := editor.Run() - if err != nil { - log.Error(err) - } - for _, patch := range patches { - if err := applyPatch(r, entry, patch); err != nil { - return err - } - } - } else { - log.Warn(err.Error()) - } - o := &PromptOptions{ - Cursor: prompt.CursorPosition(), - Scroll: prompt.ScrollPosition(), - Size: opts.Size, - HideHelp: opts.HideHelp, - } - return statusPrompt(r, o) - } - kset[promptui.CustomKey{Key: 'r', Always: false}] = - func(in interface{}, chb chan bool, index int) error { - r.ResetAll() - var err error - files, err = generateFileList(r) - if err != nil { - return err - } - chb <- false - prompt.RefreshList(files, index) - return nil - } - kset[promptui.CustomKey{Key: 'c', Always: false}] = - func(in interface{}, chb chan bool, index int) error { - if len(getIndexedEntries(r)) <= 0 { - return nil - } - chb <- true - opt := &CommitOptions{ - PromptOps: opts, - Message: "commit message", - } - err := commitPrompt(r, opt) - if err != nil && err == NoErrRecurse { - stop = true - } else if err != NoErrRecurse { - os.Exit(0) - } - return statusPrompt(r, opts) - } - kset[promptui.CustomKey{Key: 'm', Always: false}] = - func(in interface{}, chb chan bool, index int) error { - if len(getIndexedEntries(r)) <= 0 { - return nil - } - chb <- true - err := commitAmend(r) - if err != nil && err == NoErrRecurse { - stop = true - } else if err != NoErrRecurse { - os.Exit(0) - } - return statusPrompt(r, opts) - } - - prompt = promptui.Select{ - Label: "Files", - Items: files, - HideHelp: opts.HideHelp, - Size: opts.Size, - Templates: statusTemplate(r), - CustomFuncs: kset, - } - i, _, err := prompt.RunCursorAt(opts.Cursor, opts.Scroll) - - if stop { - return nil - } - - if err == nil { - o := &PromptOptions{ - Cursor: prompt.CursorPosition(), - Scroll: prompt.ScrollPosition(), - Size: opts.Size, - HideHelp: opts.HideHelp, - } - if err := popGitCmd(r, files[i].entry.FileStatArgs()); err == NoErrRecurse { - return statusPrompt(r, o) - } - } - return err -} - -func getAheadBehind(b *git.Branch) string { - if b.Upstream == nil || b.Ahead == nil || b.Behind == nil { - return "Your branch is not tracking a remote branch." - } - cyan := color.New(color.FgCyan) - yellow := color.New(color.FgYellow) - var str string - pl := len(b.Behind) - ps := len(b.Ahead) - if ps == 0 && pl == 0 { - str = "Your branch is up to date with " + cyan.Sprint(b.Upstream.Name) + "." - } else { - if ps > 0 && pl > 0 { - str = "Your branch and " + cyan.Sprint(b.Upstream.Name) + " have diverged," - str = str + "\n" + "and have " + yellow.Sprint(strconv.Itoa(ps)) + " and " + yellow.Sprint(strconv.Itoa(pl)) + " different commits each, respectively." - str = str + "\n" + "(\"pull\" to merge the remote branch into yours)" - } else if pl > 0 && ps == 0 { - str = "Your branch is behind " + cyan.Sprint(b.Upstream.Name) + " by " + yellow.Sprint(strconv.Itoa(pl)) + " commit(s)." - str = str + "\n" + "(\"pull\" to update your local branch)" - } else if ps > 0 && pl == 0 { - str = "Your branch is ahead of " + cyan.Sprint(b.Upstream.Name) + " by " + yellow.Sprint(strconv.Itoa(ps)) + " commit(s)." - str = str + "\n" + "(\"push\" to publish your local commits)" - } - } - return str -} - -func statusTemplate(r *git.Repository) *promptui.SelectTemplates { - templates := &promptui.SelectTemplates{ - Label: "{{ . |yellow}}:", - Active: "* {{- if .Indexed }} {{ printf \"%.1s\" .Entry.StatusEntryString | green}}{{- else}} {{ printf \"%.1s\" .Entry.StatusEntryString | red}}{{- end}} {{ .Entry.String }}", - Inactive: " {{- if .Indexed }} {{ printf \"%.1s\" .Entry.StatusEntryString | green}}{{- else}} {{ printf \"%.1s\" .Entry.StatusEntryString | red}}{{- end}} {{ .Entry.String }}", - Selected: "{{ .Entry.String }}", - Extra: "add/reset: space commit: c amend: m patch: p", - Details: "\n" + - "---------------- Status -----------------" + "\n" + - "{{ \"On branch\" }} " + "{{ \"" + r.Branch.Name + "\" | yellow }}" + "\n" + - getAheadBehind(r.Branch), - } - return templates -} - -func generateDiffFile(r *git.Repository, entry *git.StatusEntry) (*diffparser.DiffFile, error) { - args := entry.FileStatArgs() - cmd := exec.Command("git", args...) - out, err := cmd.CombinedOutput() - if err != nil { - return nil, err - } - diff, err := diffparser.Parse(string(out)) - if err != nil { - return nil, err - } - return diff.Files[0], nil -} - -func applyPatch(r *git.Repository, entry *git.StatusEntry, patch string) error { - mode := []string{"apply", "--cached"} - if entry.Indexed() { - mode = []string{"apply", "--cached", "--reverse"} - } - cmd := exec.Command("git", mode...) - cmd.Dir = r.AbsPath - stdin, err := cmd.StdinPipe() - if err != nil { - return err - } - go func() { - defer stdin.Close() - io.WriteString(stdin, patch+"\n") - }() - if out, err := cmd.CombinedOutput(); err != nil { - fmt.Println(string(out)) - log.Error(err.Error()) - } - return nil -} - -// File is wrapper of the git.StatusEntry -type File struct { - index bool - entry *git.StatusEntry -} - -func generateFileList(r *git.Repository) ([]*File, error) { - if err := r.InitializeBranches(); err != nil { - return nil, err - } - if err := r.InitializeStatus(); err != nil { - return nil, err - } - files := make([]*File, 0) - for _, e := range r.Status.Entities { - if e.Indexed() { - - files = append(files, &File{ - index: true, - entry: e, - }) - - } else { - - files = append(files, &File{ - entry: e, - }) - - } - } - sort.Sort(FilesAlphabetical(files)) - return files, nil -} - -func (f *File) Indexed() bool { - return f.index -} - -func (f *File) Entry() *git.StatusEntry { - return f.entry -} - -// FilesAlphabetical slice is the re-ordered *File slice that sorted according -// to alphabetical order (A-Z) -type FilesAlphabetical []*File - -// Len is the interface implementation for Alphabetical sorting function -func (s FilesAlphabetical) Len() int { return len(s) } - -// Swap is the interface implementation for Alphabetical sorting function -func (s FilesAlphabetical) Swap(i, j int) { s[i], s[j] = s[j], s[i] } - -// Less is the interface implementation for Alphabetical sorting function -func (s FilesAlphabetical) Less(i, j int) bool { - iRunes := []rune(s[i].entry.String()) - jRunes := []rune(s[j].entry.String()) - - max := len(iRunes) - if max > len(jRunes) { - max = len(jRunes) - } - - for idx := 0; idx < max; idx++ { - ir := iRunes[idx] - jr := jRunes[idx] - - lir := unicode.ToLower(ir) - ljr := unicode.ToLower(jr) - - if lir != ljr { - return lir < ljr - } - - // the lowercase runes are the same, so compare the original - if ir != jr { - return ir < jr - } - } - return false -} - -func getIndexedEntries(r *git.Repository) []*git.StatusEntry { - files := make([]*git.StatusEntry, 0) - for _, e := range r.Status.Entities { - if e.Indexed() { - files = append(files, e) - } - } - return files -} diff --git a/editor/controlsview.go b/editor/controlsview.go deleted file mode 100644 index 2c9e358..0000000 --- a/editor/controlsview.go +++ /dev/null @@ -1,65 +0,0 @@ -package editor - -import ( - "fmt" - "strings" - - "github.com/jroimartin/gocui" -) - -// render controls -func (e *Editor) createControlsView(g *gocui.Gui, v *gocui.View) error { - e.mutex.Lock() - defer e.mutex.Unlock() - v, err := g.View(controls.name) - if err != nil { - return err - } - if _, err := g.SetViewOnTop(controls.name); err != nil { - return err - } - if _, err := g.SetCurrentView(controls.name); err != nil { - return err - } - v.Clear() - binds := e.generateControls() - sx, _ := v.Size() - for _, vw := range views { - fmt.Fprintf(v, "%s view\n", bold.Sprint(vw.header)) - fmt.Fprintf(v, "%s\n", strings.Repeat("-", sx)) - for bind, view := range binds { - if vw == view { - fmt.Fprintf(v, "• %s: %s\n", yellow.Sprint(bind.Display), bind.Description) - } - } - fmt.Fprintf(v, "\n") - } - g.Cursor = false - return nil -} - -// head back to diffhunk editor -func (e *Editor) closeControlsView(g *gocui.Gui, v *gocui.View) error { - e.mutex.Lock() - defer e.mutex.Unlock() - g.Cursor = true - if _, err := g.SetViewOnBottom(controls.name); err != nil { - return err - } - if _, err := g.SetViewOnTop(main.name); err != nil { - return err - } - if _, err := g.SetCurrentView(main.name); err != nil { - return err - } - return nil -} - -// genreate controls-view map -func (e *Editor) generateControls() map[*KeyBinding]*View { - controlmap := make(map[*KeyBinding]*View) - for pair, bind := range e.KeyBindings { - controlmap[bind] = pair.view - } - return controlmap -} diff --git a/editor/keybindings.go b/editor/keybindings.go deleted file mode 100644 index 42fd551..0000000 --- a/editor/keybindings.go +++ /dev/null @@ -1,129 +0,0 @@ -package editor - -import "github.com/jroimartin/gocui" - -// KeyBinding structs is helpful for not re-writinh the same function over and -// over again. it hold useful values to generate a controls view -type KeyBinding struct { - View string - Handler func(*gocui.Gui, *gocui.View) error - Key interface{} - Modifier gocui.Modifier - Display string - Description string - Vital bool -} - -type keyViewPair struct { - key interface{} - view *View -} - -// generate the editor controls a.k.a. keybindings -func (e *Editor) generateKeybindings() error { - keymap := make(map[*keyViewPair]*KeyBinding) - quit := &KeyBinding{ - Modifier: gocui.ModNone, - Handler: e.quit, - Display: "q", - Description: "Quit", - Vital: false, - } - keymap[&keyViewPair{'q', main}] = quit - cursorUp := &KeyBinding{ - Modifier: gocui.ModNone, - Handler: e.cursorUp, - Display: "↑, k", - Description: "Cursor up", - Vital: false, - } - keymap[&keyViewPair{gocui.KeyArrowUp, main}] = cursorUp - keymap[&keyViewPair{'k', main}] = cursorUp - cursorDown := &KeyBinding{ - Modifier: gocui.ModNone, - Handler: e.cursorDown, - Display: "↓, j", - Description: "Cursor down", - Vital: false, - } - keymap[&keyViewPair{gocui.KeyArrowDown, main}] = cursorDown - keymap[&keyViewPair{'j', main}] = cursorDown - add := &KeyBinding{ - Modifier: gocui.ModNone, - Handler: e.stageHunk, - Display: "space", - Description: "Stage/Unstage", - Vital: false, - } - keymap[&keyViewPair{gocui.KeySpace, main}] = add - nextHunk := &KeyBinding{ - Modifier: gocui.ModNone, - Handler: e.nextHunk, - Display: "n", - Description: "Next hunk", - Vital: false, - } - keymap[&keyViewPair{'n', main}] = nextHunk - prevHunk := &KeyBinding{ - Modifier: gocui.ModNone, - Handler: e.prevHunk, - Display: "N", - Description: "Previous hunk", - Vital: false, - } - keymap[&keyViewPair{'N', main}] = prevHunk - top := &KeyBinding{ - Modifier: gocui.ModNone, - Handler: e.goTop, - Display: "g", - Description: "Go to top", - Vital: false, - } - keymap[&keyViewPair{'g', main}] = top - bottom := &KeyBinding{ - Modifier: gocui.ModNone, - Handler: e.goBottom, - Display: "G", - Description: "Go to bottom", - Vital: false, - } - keymap[&keyViewPair{'G', main}] = bottom - openControls := &KeyBinding{ - Modifier: gocui.ModNone, - Handler: e.createControlsView, - Display: "c", - Description: "Open controls", - Vital: false, - } - keymap[&keyViewPair{'c', main}] = openControls - quitControls := &KeyBinding{ - Modifier: gocui.ModNone, - Handler: e.closeControlsView, - Display: "q", - Description: "Close controls", - Vital: false, - } - keymap[&keyViewPair{'q', controls}] = quitControls - e.KeyBindings = keymap - return nil -} - -// set the guis by iterating over a slice of the gui's keybindings struct -func (e *Editor) keybindings() error { - for pair, bind := range e.KeyBindings { - if err := e.g.SetKeybinding(pair.view.name, pair.key, bind.Modifier, bind.Handler); err != nil { - return err - } - } - return nil -} - -func (e *Editor) keyBindingWidth() int { - width := 10 // set minimum width - for _, bind := range e.KeyBindings { - if len(bind.Display)+len(bind.Description) > width { - width = len(bind.Display) + len(bind.Description) - } - } - return width + 4 // add some lines for clearance -} diff --git a/editor/textview.go b/editor/textview.go deleted file mode 100644 index b70bee5..0000000 --- a/editor/textview.go +++ /dev/null @@ -1,430 +0,0 @@ -package editor - -import ( - "errors" - "fmt" - "strings" - "sync" - - "github.com/fatih/color" - "github.com/jroimartin/gocui" - "github.com/waigani/diffparser" -) - -const ( - // diff header length, usually it is 4 - headerLength = 4 - // considering color escape sequence - tabToWhiteSpace = 3 + 4 -) - -var ( - // define colors - green = color.New(color.FgGreen) - yellow = color.New(color.FgYellow) - blue = color.New(color.FgBlue) - red = color.New(color.FgRed) - cyan = color.New(color.FgCyan) - hiWhite = color.New(color.FgHiWhite) - bold = color.New(color.Bold) - whitebg = color.New(color.BgWhite) - black = color.New(color.FgBlack) -) - -// Editor is the hunk editor UI -type Editor struct { - g *gocui.Gui - KeyBindings map[*keyViewPair]*KeyBinding - State *editorState - mutex *sync.Mutex -} - -// editorState holds the data depending on the editor's state -type editorState struct { - File *diffparser.DiffFile - Patches []string - editorHunks []*editorHunk -} - -// editorHunk wraps the hunk with its state -type editorHunk struct { - selected bool - staged bool - hunk *diffparser.DiffHunk -} - -// NewEditor initializes the editor, pre-checks made here -func NewEditor(file *diffparser.DiffFile) (*Editor, error) { - eHunks := make([]*editorHunk, 0) - for _, hunk := range file.Hunks { - eHunks = append(eHunks, &editorHunk{ - selected: false, - staged: false, - hunk: hunk, - }) - } - if len(eHunks) <= 0 { - return nil, errors.New("there is no diff hunks for this file") - } - eHunks[0].selected = true - initialState := &editorState{ - File: file, - editorHunks: eHunks, - } - e := &Editor{ - State: initialState, - } - var mx sync.Mutex - e.mutex = &mx - if err := e.generateKeybindings(); err != nil { - return nil, err - } - return e, nil -} - -// Run starts the editor -func (e *Editor) Run() ([]string, error) { - g, err := gocui.NewGui(gocui.OutputNormal) - if err != nil { - return nil, err - } - defer g.Close() - - e.g = g - g.Cursor = true - - g.SetManagerFunc(e.layout) - - if err := e.keybindings(); err != nil { - return nil, err - } - if err := g.MainLoop(); err != nil && err != gocui.ErrQuit { - return nil, err - } - patches := make([]string, 0) - for _, h := range e.State.editorHunks { - if h.staged { - patches = append(patches, generatePatch(e.State.File, h)) - } - } - return patches, nil -} - -// quit from gui -func (e *Editor) quit(g *gocui.Gui, v *gocui.View) error { - return gocui.ErrQuit -} - -// redraw editor's main view -func (e *Editor) updateView(index int) error { - e.mutex.Lock() - defer e.mutex.Unlock() - view, err := e.g.View("main") - if err != nil { - return err - } - view.Clear() - out := bold.Sprint(hiWhite.Sprint(e.State.File.DiffHeader)) - fmt.Fprintln(view, out) - for _, ehunk := range e.State.editorHunks { - block := "▎" //"█" - if ehunk.selected { - block = "█" //"▚" - } - if ehunk.staged { - block = green.Sprint(block) - } - for _, ln := range hunkLines(ehunk.hunk) { - fmt.Fprintf(view, "%s %s\n", block, ln) - } - } - _, cy := view.Cursor() - e.padMainView(cy) - e.hitBottom() - return nil -} - -// if there are tabs "\t" in the strings they are squeezed from fmt.Fprintf -// to handle this, "\t"'s are converted to whitespaces plus color code length -func tabsToWhitespace(input string) string { - return strings.Replace(input, "\t", strings.Repeat(" ", tabToWhiteSpace), -1) -} - -// generate printable string array from diffhunk -func hunkLines(hunk *diffparser.DiffHunk) []string { - lines := make([]string, 0) - lines = append(lines, cyan.Sprint(fmt.Sprintf("@@ -%d,%d +%d,%d @@ ", hunk.OrigRange.Start, hunk.OrigRange.Length, hunk.NewRange.Start, hunk.NewRange.Length))+ - tabsToWhitespace(hunk.HunkHeader)) - for _, line := range hunk.WholeRange.Lines { - switch line.Mode { - case diffparser.ADDED: - lines = append(lines, green.Sprint(fmt.Sprintf("+%s", tabsToWhitespace(line.Content)))) - case diffparser.REMOVED: - lines = append(lines, red.Sprint(fmt.Sprintf("-%s", tabsToWhitespace(line.Content)))) - default: - lines = append(lines, fmt.Sprintf(" %s", tabsToWhitespace(line.Content))) - } - } - return lines -} - -// generate patchable string array from diffhunk -func hunkString(hunk *diffparser.DiffHunk) string { - out := fmt.Sprintf("@@ -%d,%d +%d,%d @@ ", hunk.OrigRange.Start, hunk.OrigRange.Length, hunk.NewRange.Start, hunk.NewRange.Length) + - hunk.HunkHeader - for _, line := range hunk.WholeRange.Lines { - switch line.Mode { - case diffparser.ADDED: - out = out + "\n" + "+" - case diffparser.REMOVED: - out = out + "\n" + "-" - default: - out = out + "\n" + " " - } - out = out + line.Content - } - return out -} - -// stage/unstage diffhunk -func (e *Editor) stageHunk(g *gocui.Gui, v *gocui.View) error { - hunks := e.State.editorHunks - for _, hunk := range hunks { - if hunk.selected { - hunk.staged = !hunk.staged - } - } - e.updateView(0) - return nil -} - -// genereate patch string that will be piped into "git apply" command -func generatePatch(file *diffparser.DiffFile, hunk *editorHunk) string { - patch := file.DiffHeader - patch = patch + "\n" + hunkString(hunk.hunk) - return patch -} - -// set active hunk for current line -func (e *Editor) setHunk(line int) error { - currentTotal := 0 - for _, h := range e.State.editorHunks { - currentTotal += h.hunk.Length() - if currentTotal > line-headerLength { - e.setActiveHunk(h) - break - } - } - return nil -} - -func (e *Editor) setActiveHunk(hunk *editorHunk) { - for _, h := range e.State.editorHunks { - if h.selected { - h.selected = false - } - } - hunk.selected = true -} - -// move cursor down 1 line -func (e *Editor) cursorDown(g *gocui.Gui, v *gocui.View) error { - if v != nil { - cx, cy := v.Cursor() - ox, oy := v.Origin() - // magic number? (header and ?) - if cy+oy > e.totalDiffLines()-2 { - - } else { - if err := v.SetCursor(cx, cy+1); err != nil { - - if err := v.SetOrigin(ox, oy+1); err != nil { - return err - } - } - } - } - _, ucy := v.Cursor() - _, uoy := v.Origin() - e.setHunk(ucy + uoy) - e.updateView(0) - return nil -} - -// move cursor up 1 line -func (e *Editor) cursorUp(g *gocui.Gui, v *gocui.View) error { - if v != nil { - ox, oy := v.Origin() - cx, cy := v.Cursor() - if err := v.SetCursor(cx, cy-1); err != nil && oy > 0 { - if err := v.SetOrigin(ox, oy-1); err != nil { - return err - } - } - } - _, ucy := v.Cursor() - _, uoy := v.Origin() - e.setHunk(ucy + uoy) - e.updateView(0) - return nil -} - -// move cursor down number of current diffhunk lines -func (e *Editor) nextHunk(g *gocui.Gui, v *gocui.View) error { - currentTotal := headerLength - for _, h := range e.State.editorHunks { - currentTotal += h.hunk.Length() - if h.selected { - break - } - } - _, sy := v.Size() - total := e.totalDiffLines() - var anchor int - var newcy int - if currentTotal < sy { - newcy = currentTotal - anchor = 0 - } else if currentTotal < total { - anchor = currentTotal - newcy = 0 - } else { - return nil - } - cx, _ := v.Cursor() - if newcy > total-1 { - return nil - } - if err := v.SetCursor(cx, newcy); err == nil { - ox, _ := v.Origin() - if err := v.SetOrigin(ox, anchor); err != nil { - return err - } - } - _, ucy := v.Cursor() - _, uoy := v.Origin() - e.setHunk(ucy + uoy) - e.updateView(0) - return nil -} - -// move cursor up number of current diffhunk lines -func (e *Editor) prevHunk(g *gocui.Gui, v *gocui.View) error { - _, ucy := v.Cursor() - _, uoy := v.Origin() - var newcy, anchor int - currentTotal := headerLength - for idx, h := range e.State.editorHunks { - currentTotal += h.hunk.Length() - if h.selected { - if idx == 0 { - newcy = headerLength - anchor = 0 - break - } - currentTotal = currentTotal - h.hunk.Length() - e.State.editorHunks[idx-1].hunk.Length() - anchor = currentTotal - break - } - } - cx, _ := v.Cursor() - if err := v.SetCursor(cx, newcy); err == nil { - ox, _ := v.Origin() - if err := v.SetOrigin(ox, anchor); err != nil { - return err - } - } - _, ucy = v.Cursor() - _, uoy = v.Origin() - e.setHunk(ucy + uoy) - e.updateView(0) - return nil -} - -// go to top -func (e *Editor) goTop(g *gocui.Gui, v *gocui.View) error { - cx, _ := v.Cursor() - if err := v.SetCursor(cx, 0); err == nil { - ox, _ := v.Origin() - if err := v.SetOrigin(ox, 0); err != nil { - return err - } - } - _, ucy := v.Cursor() - _, uoy := v.Origin() - e.setHunk(ucy + uoy) - e.updateView(0) - return nil -} - -// go to bottom -func (e *Editor) goBottom(g *gocui.Gui, v *gocui.View) error { - bot := e.totalDiffLines() - _, sy := v.Size() - cx, _ := v.Cursor() - if bot < sy { - if err := v.SetCursor(cx, bot-1); err == nil { - ox, _ := v.Origin() - if err := v.SetOrigin(ox, 0); err != nil { - return err - } - } - } else { - if err := v.SetCursor(cx, sy-1); err == nil { - ox, _ := v.Origin() - if err := v.SetOrigin(ox, bot-sy); err != nil { - return err - } - } - } - - _, ucy := v.Cursor() - _, uoy := v.Origin() - e.setHunk(ucy + uoy) - e.updateView(0) - - return nil -} - -// add padding chars '~' -func (e *Editor) padMainView(cur int) error { - view, err := e.g.View("main") - if err != nil { - return err - } - _, sy := view.Size() - fmt.Fprintf(view, strings.Repeat(bold.Sprint("~\n"), sy-cur)) - return nil -} - -// total lines, since we use padding, the actual viewBufferLines is this value -func (e *Editor) totalDiffLines() int { - totalLines := headerLength - for _, eh := range e.State.editorHunks { - totalLines += eh.hunk.Length() - } - return totalLines -} - -// try to create a "less" look and feel -func (e *Editor) hitBottom() bool { - p, err := e.g.View("prompt") - if err != nil { - return false - } - p.Clear() - fmt.Fprintf(p, ":") - tdl := e.totalDiffLines() - v, err := e.g.View("main") - if err != nil { - return false - } - _, sy := v.Size() - _, oy := v.Origin() - if oy+sy >= tdl { - p.Clear() - fmt.Fprintf(p, black.Sprint(whitebg.Sprint("(END)"))) - return true - } - return false -} diff --git a/editor/views.go b/editor/views.go deleted file mode 100644 index abad27b..0000000 --- a/editor/views.go +++ /dev/null @@ -1,68 +0,0 @@ -package editor - -import ( - "fmt" - - "github.com/jroimartin/gocui" -) - -// View is a name-header pair for creating *gocui.View structs -type View struct { - name string - header string -} - -var ( - main = &View{name: "main", header: "Editor"} - prompt = &View{name: "prompt", header: ""} - controls = &View{name: "controls", header: "Controls"} - views = []*View{main, controls} -) - -// create initial layout that will be called when a resize event occurs -func (e *Editor) layout(g *gocui.Gui) error { - maxX, maxY := g.Size() - if v, err := g.SetView(main.name, -1, -1, maxX-1, maxY-1); err != nil { - if err != gocui.ErrUnknownView { - return err - } - v.Frame = false - v.Wrap = false - if _, err := g.SetCurrentView(main.name); err != nil { - return err - } - e.updateView(0) - v.SetCursor(0, headerLength) - } - if v, err := g.SetView(prompt.name, -1, maxY-2, maxX-1, maxY); err != nil { - if err != gocui.ErrUnknownView { - return err - } - v.Frame = false - v.Wrap = false - fmt.Fprintf(v, ":") - } - kbw := int(0.50*float32(e.keyBindingWidth())) + 1 - kbh := int(0.50*float32(len(e.KeyBindings))) + 1 + len(views) - - hmX := int(0.50 * float32(maxX)) - hmY := int(0.50 * float32(maxY)) - if kbh > hmY { - kbh = hmY - 1 - } - if v, err := g.SetView(controls.name, hmX-kbw, hmY-kbh, hmX+kbw, hmY+kbh); err != nil { - if err != gocui.ErrUnknownView { - return err - } - v.Frame = true - v.Title = controls.header - v.Wrap = false - g.SetViewOnBottom(controls.name) - } - e.updateView(0) - return nil -} - -func (v *View) String() string { - return v.name -} diff --git a/git/branch.go b/git/branch.go deleted file mode 100644 index 99e5138..0000000 --- a/git/branch.go +++ /dev/null @@ -1,229 +0,0 @@ -package git - -import ( - "strconv" - "strings" - "time" - - log "github.com/sirupsen/logrus" - lib "gopkg.in/libgit2/git2go.v27" -) - -// Branch is simply a lightweight movable pointer to one of repositories' commits -type Branch struct { - Name string - refType RefType - FullName string - Hash string - Upstream *Branch - Ahead []*Commit - Behind []*Commit - Clean bool - isRemote bool - lastCommit *Commit -} - -// loadBranches loads branches with the lib's branch iterator loads both remote and -// local branches -func (r *Repository) loadBranches() error { - bs := make([]*Branch, 0) - branchIter, err := r.repo.NewBranchIterator(lib.BranchAll) - if err != nil { - return err - } - defer branchIter.Free() - - err = branchIter.ForEach(func(branch *lib.Branch, branchType lib.BranchType) error { - - name, err := branch.Name() - if err != nil { - return err - } - fullname := branch.Reference.Name() - - rawOid := branch.Target() - - if rawOid == nil { - ref, err := branch.Resolve() - if err != nil { - return err - } - - rawOid = ref.Target() - } - - hash := rawOid.String() - isRemote := branch.IsRemote() - var upstream *Branch - var aheads, behinds []*Commit - if !isRemote { - us, err := branch.Upstream() - if err != nil || us == nil { - log.Warn("upstream not found") - } else { - upstream = &Branch{ - Name: strings.Replace(us.Name(), "refs/remotes/", "", 1), - FullName: us.Name(), - Hash: us.Target().String(), - isRemote: true, - } - var err1, err2 error - aheads, err1 = r.revlist(us.Target(), branch.Reference.Target()) - behinds, err2 = r.revlist(branch.Reference.Target(), us.Target()) - if err1 != nil || err2 != nil { - a, b, err := r.repo.AheadBehind(branch.Reference.Target(), us.Target()) - if err == nil { - aheads = make([]*Commit, a) - behinds = make([]*Commit, b) - } - } - } - } - b := &Branch{ - Name: name, - refType: RefTypeBranch, - FullName: fullname, - Hash: hash, - isRemote: isRemote, - Upstream: upstream, - Ahead: aheads, - Behind: behinds, - } - if b.lastCommit == nil { - objectid, err := lib.NewOid(b.Hash) - if err != nil { - } else { - commit, err := r.repo.LookupCommit(objectid) - if err != nil { - } else { - hash := commit.AsObject().Id().String() - author := &Contributor{ - Name: commit.Author().Name, - Email: commit.Author().Email, - When: commit.Author().When, - } - sum := commit.Summary() - msg := commit.Message() - - c := &Commit{ - commit: commit, - Hash: hash, - Author: author, - Message: msg, - Summary: sum, - } - b.lastCommit = c - } - } - } - if _, ok := r.RefMap[b.Hash]; !ok { - r.RefMap[b.Hash] = make([]Ref, 0) - } - refs := r.RefMap[b.Hash] - refs = append(refs, b) - r.RefMap[b.Hash] = refs - bs = append(bs, b) - return nil - }) - r.Branches = bs - head, err := r.repo.Head() - if err != nil { - return err - } - for _, b := range r.Branches { - if b.isRemote { - continue - } - if head.Target().String() == b.Hash { - b.refType = RefTypeHEAD - r.Branch = b - } - } - return err -} - -// Status genrates a string similar to "git status" -func (b *Branch) Status() string { - if b.isRemote { - return "" - } - if b.Upstream == nil || b.Ahead == nil || b.Behind == nil { - return "This branch is not tracking a remote branch." - } - var str string - pl := len(b.Behind) - ps := len(b.Ahead) - if ps == 0 && pl == 0 { - str = "This branch is up to date with " + b.Upstream.Name + "." - } else { - if ps > 0 && pl > 0 { - str = "This branch and " + b.Upstream.Name + " have diverged," - str = str + "\n" + "and have " + strconv.Itoa(ps) + " and " + strconv.Itoa(pl) + " different commits each, respectively." - str = str + "\n" + "(\"pull\" to merge the remote branch into this branch)" - } else if pl > 0 && ps == 0 { - str = "This branch is behind " + b.Upstream.Name + " by " + strconv.Itoa(pl) + " commit(s)." - str = str + "\n" + "(\"pull\" to update this local branch)" - } else if ps > 0 && pl == 0 { - str = "This branch is ahead of " + b.Upstream.Name + " by " + strconv.Itoa(ps) + " commit(s)." - str = str + "\n" + "(\"push\" to publish this local commits)" - } - } - return str -} - -// LastCommitMessage returns the message of the targeted commit by this branch -func (b *Branch) LastCommitMessage() string { - if b.lastCommit != nil { - return b.lastCommit.Summary - } - return "" -} - -// LastCommitDate returns the date of the targeted commit by this branch -func (b *Branch) LastCommitDate() string { - if b.lastCommit != nil { - return b.lastCommit.Date() - } - return "" -} - -// LastCommitAuthor returns the author of the targeted commit by this branch -func (b *Branch) LastCommitAuthor() string { - if b.lastCommit != nil { - return b.lastCommit.Author.String() - } - return "" -} - -// IsRemote is true if the ref is a remote ref -func (b *Branch) IsRemote() bool { - return b.isRemote -} - -// LastCommitDate returns the date of the targeted commit by this branch -func (b *Branch) Date() time.Time { - if b.lastCommit != nil { - return b.lastCommit.Author.When - } - return time.Now() -} - -func (b *Branch) Type() RefType { - return b.refType -} - -func (b *Branch) Target() string { - return b.Hash -} - -func (b *Branch) Display() string { - return b.Name -} - -func (b *Branch) Oid() string { - return b.Hash -} - -func (b *Branch) ShortType() rune { - return 'b' -} diff --git a/git/commit.go b/git/commit.go deleted file mode 100644 index 6edfe88..0000000 --- a/git/commit.go +++ /dev/null @@ -1,527 +0,0 @@ -package git - -import ( - "bufio" - "os" - "os/exec" - "regexp" - "strings" - "time" - - "github.com/justincampbell/timeago" - log "github.com/sirupsen/logrus" - lib "gopkg.in/libgit2/git2go.v27" -) - -// Commit is the wrapper of actual lib.Commit object -type Commit struct { - owner *Repository - commit *lib.Commit - Hash string - Author *Contributor - Message string - Summary string - Type CommitType - Heads []*Branch -} - -type CommitRefDisplay struct { - Heads []string - Tags []string - Branches []string -} - -func newRefDisplay(r *Ref) *CommitRefDisplay { - return &CommitRefDisplay{} -} - -// CommitType is the Type of the commit; it can be local or remote (upstream diff) -type CommitType string - -const ( - // LocalCommit is the commit that not pushed to remote branch - LocalCommit CommitType = "local" - // EvenCommit is the commit that recorded locally - EvenCommit CommitType = "even" - // RemoteCommit is the commit that not merged to local branch - RemoteCommit CommitType = "remote" -) - -// Contributor is the person -type Contributor struct { - Name string - Email string - When time.Time -} - -// CommitLoadOptions holds limitation while loading commits from the store -type CommitLoadOptions struct { - Author string - Before string - Committer string - MaxCount int - Since string -} - -func (r *Repository) loadCommits(from, to *lib.Oid, opts *CommitLoadOptions) ([]*Commit, error) { - cs := make([]*Commit, 0) - if to != nil && from.Equal(to) { - return cs, nil - } - walk, err := r.repo.Walk() - if err != nil { - return cs, err - } - if err := walk.Push(from); err != nil { - return cs, err - } - - defer walk.Free() - counter := 0 - limit := datefilter(opts) || signaturefilter(opts) - err = walk.Iterate(func(commit *lib.Commit) bool { - if to != nil && to.Equal(commit.AsObject().Id()) { - return false - } - c := unpackRawCommit(commit) - c.owner = r - - if limit { - if ok, _ := limitCommit(commit, opts); ok { - counter++ - cs = append(cs, c) - } - } else { - counter++ - cs = append(cs, c) - } - - if opts.MaxCount != 0 && counter >= opts.MaxCount { - return false - } - return true - }) - r.Commits = cs - return cs, nil -} - -func unpackRawCommit(raw *lib.Commit) *Commit { - oid := raw.AsObject().Id() - - hash := oid.String() - author := &Contributor{ - Name: raw.Author().Name, - Email: raw.Author().Email, - When: raw.Author().When, - } - sum := raw.Summary() - msg := raw.Message() - - c := &Commit{ - commit: raw, - Hash: hash, - Author: author, - Message: msg, - Summary: sum, - } - return c -} - -func (r *Repository) channeledCommitLoader(from, to *lib.Oid, opts *CommitLoadOptions) (<-chan *Commit, error) { - channel := make(chan *Commit, 100) - - walk, err := r.repo.Walk() - if err != nil { - return nil, err - } - if err := walk.Push(from); err != nil { - return nil, err - } - - go func() { - defer close(channel) - defer walk.Free() - - counter := 0 - limit := datefilter(opts) || signaturefilter(opts) - err = walk.Iterate(func(commit *lib.Commit) bool { - if to != nil && to.Equal(commit.AsObject().Id()) { - return false - } - c := unpackRawCommit(commit) - - if limit { - if ok, _ := limitCommit(commit, opts); ok { - counter++ - channel <- c - } - } else { - counter++ - channel <- c - } - - if opts.MaxCount != 0 && counter >= opts.MaxCount { - return false - } - return true - }) - - }() - return channel, nil -} - -// failOverShallow is a backdoor to load commits. Since gitlib.v27 cannot load -// shallow repositories this is a failover mechanism that uses actual git commands -// TODO: Fix magic numbers -func (r *Repository) failOverShallow(opts *CommitLoadOptions) ([]*Commit, error) { - file, err := os.Open(".git/shallow") - if err != nil { - return nil, err - } - scanner := bufio.NewScanner(file) - var shallow string - for scanner.Scan() { - line := scanner.Text() - if len(line) == 40 { - shallow = line - break - } - } - defer file.Close() - cmd := exec.Command("git", "rev-list", "--all") - cmd.Dir = r.AbsPath - out, err := cmd.Output() - if err != nil { - return nil, err - } - commits := make([]*Commit, 0) - re := regexp.MustCompile(`\r?\n`) - counter := 0 - limit := datefilter(opts) || signaturefilter(opts) - for _, line := range re.Split(string(out), -1) { - if line[:7] == shallow[:7] { - break - } - objectid, err := lib.NewOid(line) - if err != nil { - continue - } - commit, err := r.repo.LookupCommit(objectid) - if err != nil { - continue - } - if limit { - if ok, _ := limitCommit(commit, opts); !ok { - continue - } - } - - hash := commit.AsObject().Id().String() - author := &Contributor{ - Name: commit.Author().Name, - Email: commit.Author().Email, - When: commit.Author().When, - } - sum := commit.Summary() - msg := commit.Message() - - c := &Commit{ - commit: commit, - Hash: hash, - Author: author, - Message: msg, - Summary: sum, - } - commits = append(commits, c) - counter++ - if opts.MaxCount != 0 && counter >= opts.MaxCount { - return commits, nil - } - } - return commits, nil -} -func (c *Commit) String() string { - return c.Message + " " + c.Hash[:7] -} - -// Date returns the commits's creation date as string -func (c *Commit) Date() string { - return c.Author.When.String() -} - -// Since returns xx ago string -func (c *Commit) Since() string { - return timeago.FromTime(c.Author.When) -} - -func (c *Contributor) String() string { - return c.Name + " " + "<" + c.Email + ">" -} - -// Diff is the equivalent of "git diff ", but it is restricted to commits -func (r *Repository) Diff(c *Commit) (*Diff, error) { - // if c.commit.ParentCount() > 1 { - // return nil, errors.New("commit has multiple parents") - // } - - cTree, err := c.commit.Tree() - if err != nil { - return nil, err - } - defer cTree.Free() - var pTree *lib.Tree - if c.commit.ParentCount() > 0 { - if pTree, err = c.commit.Parent(0).Tree(); err != nil { - return nil, err - } - defer pTree.Free() - } - - opt, err := lib.DefaultDiffOptions() - if err != nil { - return nil, err - } - - diff, err := r.repo.DiffTreeToTree(pTree, cTree, &opt) - if err != nil { - return nil, err - } - defer diff.Free() - - stats, err := diff.Stats() - if err != nil { - return nil, err - } - - statsText, err := stats.String(lib.DiffStatsFull, 80) - if err != nil { - return nil, err - } - ddeltas := make([]*DiffDelta, 0) - patchs := make([]string, 0) - deltas, err := diff.NumDeltas() - if err != nil { - return nil, err - } - - var patch *lib.Patch - var patchtext string - - for i := 0; i < deltas; i++ { - if patch, err = diff.Patch(i); err != nil { - continue - } - var dd lib.DiffDelta - if dd, err = diff.GetDelta(i); err != nil { - continue - } - d := &DiffDelta{ - Status: int(dd.Status), - NewFile: &DiffFile{ - Path: dd.NewFile.Path, - Hash: dd.NewFile.Oid.String(), - }, - OldFile: &DiffFile{ - Path: dd.OldFile.Path, - Hash: dd.OldFile.Oid.String(), - }, - } - - if patchtext, err = patch.String(); err != nil { - continue - } - d.Patch = patchtext - - ddeltas = append(ddeltas, d) - patchs = append(patchs, patchtext) - - if err := patch.Free(); err != nil { - return nil, err - } - } - - d := &Diff{ - deltas: ddeltas, - stats: strings.Split(statsText, "\n"), - patchs: patchs, - } - return d, nil -} - -// DiffFromHash is a wrapper for Actual diff which takes a hash string for input -func (r *Repository) DiffFromHash(hash string) (*Diff, error) { - objectid, err := lib.NewOid(hash) - if err != nil { - return nil, err - } - c, err := r.repo.LookupCommit(objectid) - if err != nil { - return nil, err - } - return r.Diff(&Commit{commit: c}) -} - -// revlist is the wrapped of "git rev-list oid1..oid2" command -func (r *Repository) revlist(from, to *lib.Oid) ([]*Commit, error) { - commits := make([]*Commit, 0) - - cmd := exec.Command("git", "rev-list", from.String()+".."+to.String()) - cmd.Dir = r.AbsPath - out, err := cmd.Output() - if err != nil { - return commits, err - } - output := string(out) - output = strings.TrimSpace(output) - re := regexp.MustCompile(`\r?\n`) - for _, line := range re.Split(output, -1) { - objectid, err := lib.NewOid(line) - if err != nil { - continue - } - commit, err := r.repo.LookupCommit(objectid) - if err != nil { - continue - } - hash := commit.AsObject().Id().String() - author := &Contributor{ - Name: commit.Author().Name, - Email: commit.Author().Email, - When: commit.Author().When, - } - sum := commit.Summary() - msg := commit.Message() - - c := &Commit{ - commit: commit, - Hash: hash, - Author: author, - Message: msg, - Summary: sum, - } - commits = append(commits, c) - } - return commits, nil -} - -// TODO: performance improvement required, parse dates before limit -func limitCommit(commit *lib.Commit, opts *CommitLoadOptions) (bool, error) { - if len(opts.Author) > 0 { - sign := commit.Author().Name + " <" + commit.Author().Email + ">" - if strings.Contains(sign, opts.Author) { - return true, nil - } - return false, nil - } - if len(opts.Committer) > 0 { - sign := commit.Committer().Name + " <" + commit.Committer().Email + ">" - if strings.Contains(sign, opts.Committer) { - return true, nil - } - return false, nil - } - if len(opts.Before) > 0 { - cdate := commit.Author().When - udate, err := time.Parse(time.RFC3339, opts.Before) - if err != nil { - return false, err - } - if cdate.Before(udate) { - return true, nil - } - return false, nil - } - if len(opts.Since) > 0 { - cdate := commit.Author().When - udate, err := time.Parse(time.RFC3339, opts.Since) - if err != nil { - return false, err - } - if cdate.After(udate) { - return true, nil - } - return false, nil - } - return true, nil -} - -func datefilter(opts *CommitLoadOptions) bool { - if len(opts.Since) > 0 || len(opts.Before) > 0 { - return true - } - return false -} - -func signaturefilter(opts *CommitLoadOptions) bool { - if len(opts.Author) > 0 || len(opts.Committer) > 0 { - return true - } - return false -} - -func (c *Commit) CommitRefs() string { - r := c.owner - var decor string - if refs, ok := r.RefMap[c.Hash]; ok { - if len(refs) <= 0 { - return decor - } - decor = "(" - for _, ref := range refs { - switch ref.Type() { - case RefTypeHEAD: - decor += "HEAD -> " + ref.Display() + ", " - case RefTypeBranch: - decor += ref.Display() + ", " - case RefTypeTag: - decor += "tag: " + ref.Display() + ", " - } - } - decor = decor[:len(decor)-2] + ")" - } - return decor -} - -// LastCommitStat prints the stat of the last commit -func (r *Repository) LastCommitStat() string { - head, err := r.repo.Head() - if err != nil { - return "error reading last commit" - } - commit, err := r.repo.LookupCommit(head.Target()) - if err != nil { - return "error reading last commit" - } - hash := commit.AsObject().Id().String() - cmd := exec.Command("git", "show", "--stat", hash) - cmd.Dir = r.AbsPath - out, err := cmd.Output() - if err != nil { - return err.Error() - } - return string(out) -} - -// LastCommitArgs returns the args for show stat -func (r *Repository) LastCommitArgs() []string { - head, err := r.repo.Head() - if err != nil { - log.Error(err) - return nil - } - hash := string(head.Target().String()) - args := []string{"show", "--stat", hash} - return args -} - -func (c *Commit) Display() string { - return c.Summary -} - -func (c *Commit) ShortType() rune { - return 'c' -} - -func (c *Commit) Oid() string { - return c.Hash -} diff --git a/git/diff.go b/git/diff.go deleted file mode 100644 index a971354..0000000 --- a/git/diff.go +++ /dev/null @@ -1,140 +0,0 @@ -package git - -import ( - "regexp" - "strings" - - "github.com/fatih/color" -) - -type Diff struct { - deltas []*DiffDelta - stats []string - patchs []string -} - -func (d *Diff) Deltas() []*DiffDelta { - return d.deltas -} - -func (d *Diff) Patches() []string { - return d.patchs -} - -func (d *Diff) Stats() []string { - return d.stats -} - -type DiffDelta struct { - Status int - OldFile *DiffFile - NewFile *DiffFile - Patch string -} - -func (d *DiffDelta) String() string { - var s string - s = s + deltaType(d.Status) + " " // strconv.Itoa(d.Status) + " " - if len(d.OldFile.Path) > 0 && len(d.NewFile.Path) > 0 { - if d.OldFile.Path == d.NewFile.Path { - s = s + d.OldFile.Path //+ " " + d.OldFile.Hash[:7] + ".." + d.NewFile.Hash[:7] - } else { - s = s + d.OldFile.Path + " -> " + d.NewFile.Path - } - } - return s -} - -// FileStatArgs returns git command args for getting diff -func (d *DiffDelta) FileStatArgs(c *Commit) []string { - args := []string{"diff"} - if c.commit.Parent(0) == nil { - args = []string{"show", "--oneline", "--patch"} - args = append(args, c.Hash) - } else { - parent := c.commit.Parent(0).AsObject().Id().String() - args = append(args, parent+".."+c.Hash) - } - args = append(args, d.OldFile.Path) - - return args -} - -// colorize the plain diff text collected from system output -// the style is near to original diff command -func colorizeDiff(original string) (colorized []string) { - - var ( - green = color.New(color.FgGreen) - red = color.New(color.FgRed) - cyan = color.New(color.FgCyan) - ) - - colorized = strings.Split(original, "\n") - re := regexp.MustCompile(`@@ .+ @@`) - for i, line := range colorized { - if len(line) > 0 { - if line[0] == '-' { - colorized[i] = red.Sprint(line) - } else if line[0] == '+' { - colorized[i] = green.Sprint(line) - } else if re.MatchString(line) { - s := re.FindString(line) - colorized[i] = cyan.Sprint(s) + line[len(s):] - } else { - continue - } - } else { - continue - } - } - return colorized -} - -func (d *DiffDelta) PatchString() string { - return strings.Join(colorizeDiff(d.Patch), "\n") -} - -type DiffFile struct { - Path string - Hash string -} - -func deltaType(i int) string { - switch i { - case 0: - return "u" - case 1: - return "a" - - case 2: - return "d" - - case 3: - return "m" - - case 4: - return "r" - - case 5: - return "c" - - case 6: - return "i" - - case 7: - return "?" - - case 8: - return "!" - - case 9: - return "x" - - case 10: - return "x" - default: - return "" - } - -} diff --git a/git/repository.go b/git/repository.go deleted file mode 100644 index 3c7856f..0000000 --- a/git/repository.go +++ /dev/null @@ -1,160 +0,0 @@ -package git - -import ( - "errors" - "path/filepath" - - lib "gopkg.in/libgit2/git2go.v27" -) - -// Repository is the main entity of the application. -type Repository struct { - RepoID string - Name string - AbsPath string - repo *lib.Repository - Status *Status - Branch *Branch - Branches []*Branch - Commits []*Commit - Remotes []*Remote - RefMap map[string][]Ref - Tags []*Tag - Ahead int - Behind int -} - -// Remote is to communicate with the outside world. fetch, pull or push operations -// are targetted to specific remotes -type Remote struct { - Name string - URL []string -} - -type RefType uint8 - -const ( - RefTypeTag RefType = iota - RefTypeBranch - RefTypeHEAD -) - -// Ref is the wrapper of lib.Ref -type Ref interface { - Type() RefType - Oid() string - Target() string - Display() string -} - -type FuzzItem interface { - Display() string - ShortType() rune - Oid() string -} - -// Open the repository from given path and return Repository pointer -func Open(path string) (*Repository, error) { - r, absPath, err := initRepoFromPath(path) - if err != nil { - return nil, err - } - repo := &Repository{ - RepoID: "", - Name: "", - AbsPath: absPath, - repo: r, - } - repo.RefMap = make(map[string][]Ref) - if err := repo.loadStatus(); err != nil { - return nil, err - } - return repo, err -} - -// Close the repository and do required cleanup -func (r *Repository) Close() { - r.repo.Free() -} - -// InitializeBranches loads the branches -func (r *Repository) InitializeBranches() error { - if err := r.loadBranches(); err != nil { - return err - } - return nil -} - -// InitializeStatus loads the files of working dir -func (r *Repository) InitializeStatus() error { - if err := r.loadStatus(); err != nil { - return err - } - return nil -} - -// InitializeTags loads tags -func (r *Repository) InitializeTags() error { - if _, err := r.loadTags(); err != nil { - return err - } - return nil -} - -// InitializeCommits loads all commits from current HEAD -func (r *Repository) InitializeCommits(opts *CommitLoadOptions) error { - if shallow, err := r.repo.IsShallow(); shallow || err != nil { - commits, err := r.failOverShallow(opts) - r.Commits = commits - return err - } - head, err := r.repo.Head() - if err != nil { - return err - } - commits, err := r.loadCommits(head.Target(), nil, opts) - if err != nil { - return err - } - r.Commits = commits - return nil -} - -// ChanneledCommits loads all commits from current HEAD asynchrously -func (r *Repository) ChanneledCommits(opts *CommitLoadOptions) (<-chan *Commit, error) { - if shallow, err := r.repo.IsShallow(); shallow || err != nil { - return nil, errors.New("shallow repositories are not supported yet") - } - head, err := r.repo.Head() - if err != nil { - return nil, err - } - - return r.channeledCommitLoader(head.Target(), nil, opts) -} - -func initRepoFromPath(path string) (*lib.Repository, string, error) { - walk := path - for { - r, err := lib.OpenRepository(walk) - if err == nil { - return r, walk, err - } - walk = filepath.Dir(walk) - if walk == "/" { - break - } - } - return nil, walk, errors.New("cannot load a git repository from " + path) -} - -// LoadAll load all belongings of the repository -func (r *Repository) LoadAll(opts *CommitLoadOptions) error { - if err := r.InitializeTags(); err != nil { - return err - } - if err := r.InitializeBranches(); err != nil { - return err - } - return r.InitializeCommits(opts) -} diff --git a/git/status.go b/git/status.go deleted file mode 100644 index 406bf37..0000000 --- a/git/status.go +++ /dev/null @@ -1,252 +0,0 @@ -package git - -import ( - "os/exec" - "strings" - - log "github.com/sirupsen/logrus" - lib "gopkg.in/libgit2/git2go.v27" -) - -// State is the current state of the repository -type State int - -const ( - StateUnknown State = iota - StateNone - StateMerge - StateRevert - StateCherrypick - StateBisect - StateRebase - StateRebaseInteractive - StateRebaseMerge - StateApplyMailbox - StateApplyMailboxOrRebase -) - -// IndexType describes the different stages a status entry can be in -type IndexType int - -// The different status stages -const ( - IndexTypeStaged IndexType = iota - IndexTypeUnstaged - IndexTypeUntracked - IndexTypeConflicted -) - -// StatusEntryType describes the type of change a status entry has undergone -type StatusEntryType int - -// The set of supported StatusEntryTypes -const ( - StatusEntryTypeNew StatusEntryType = iota - StatusEntryTypeModified - StatusEntryTypeDeleted - StatusEntryTypeRenamed - StatusEntryTypeUntracked - StatusEntryTypeTypeChange - StatusEntryTypeConflicted -) - -// StatusEntry contains data for a single status entry -type StatusEntry struct { - index IndexType - statusEntryType StatusEntryType - diffDelta *DiffDelta -} - -// Status contains all git status data -type Status struct { - State State - Entities []*StatusEntry -} - -func (r *Repository) loadStatus() error { - statusOptions := &lib.StatusOptions{ - Show: lib.StatusShowIndexAndWorkdir, - Flags: lib.StatusOptIncludeUntracked, - } - statusList, err := r.repo.StatusList(statusOptions) - if err != nil { - return err - } - defer statusList.Free() - - count, err := statusList.EntryCount() - if err != nil { - return err - } - entities := make([]*StatusEntry, 0) - s := &Status{ - State: State(r.repo.State()), - Entities: entities, - } - for i := 0; i < count; i++ { - statusEntry, err := statusList.ByIndex(i) - if err != nil { - return err - } - if statusEntry.Status <= 0 { - continue - } - s.addToStatus(statusEntry) - } - r.Status = s - return nil -} - -var indexTypeMap = map[lib.Status]IndexType{ - lib.StatusIndexNew | lib.StatusIndexModified | lib.StatusIndexDeleted | lib.StatusIndexRenamed | lib.StatusIndexTypeChange: IndexTypeStaged, - lib.StatusWtModified | lib.StatusWtDeleted | lib.StatusWtTypeChange | lib.StatusWtRenamed: IndexTypeUnstaged, - lib.StatusWtNew: IndexTypeUntracked, - lib.StatusConflicted: IndexTypeConflicted, -} - -var statusEntryTypeMap = map[lib.Status]StatusEntryType{ - lib.StatusIndexNew: StatusEntryTypeNew, - lib.StatusIndexModified: StatusEntryTypeModified, - lib.StatusWtModified: StatusEntryTypeModified, - lib.StatusIndexDeleted: StatusEntryTypeDeleted, - lib.StatusWtDeleted: StatusEntryTypeDeleted, - lib.StatusIndexRenamed: StatusEntryTypeRenamed, - lib.StatusWtRenamed: StatusEntryTypeRenamed, - lib.StatusIndexTypeChange: StatusEntryTypeTypeChange, - lib.StatusWtTypeChange: StatusEntryTypeTypeChange, - lib.StatusWtNew: StatusEntryTypeUntracked, - lib.StatusConflicted: StatusEntryTypeConflicted, -} - -func (s *Status) addToStatus(raw lib.StatusEntry) { - for rawStatus, indexType := range indexTypeMap { - set := raw.Status & rawStatus - - if set > 0 { - var dd lib.DiffDelta - if indexType == IndexTypeStaged { - dd = raw.HeadToIndex - } else { - dd = raw.IndexToWorkdir - } - d := &DiffDelta{ - Status: int(dd.Status), - NewFile: &DiffFile{ - Path: dd.NewFile.Path, - }, - OldFile: &DiffFile{ - Path: dd.OldFile.Path, - }, - } - e := &StatusEntry{ - index: indexType, - statusEntryType: statusEntryTypeMap[set], - diffDelta: d, - } - s.Entities = append(s.Entities, e) - } - } -} - -func (e *StatusEntry) String() string { - if len(e.diffDelta.OldFile.Path) <= 0 { - return e.diffDelta.NewFile.Path - } - return e.diffDelta.OldFile.Path -} - -// Patch return the diff of the entry -func (r *Repository) Patch(e *StatusEntry) string { - var cmd *exec.Cmd - if e.statusEntryType == StatusEntryTypeUntracked { - cmd = exec.Command("git", "diff", "--no-index", "/dev/null", e.diffDelta.NewFile.Path) - } else { - cmd = exec.Command("git", "diff", e.diffDelta.OldFile.Path) - } - cmd.Dir = r.AbsPath - out, err := cmd.CombinedOutput() - if err != nil { - log.Warn(err.Error()) - } - return strings.Join(colorizeDiff(string(out)), "\n") -} - -// FileStatArgs returns git command args for getting diff -func (e *StatusEntry) FileStatArgs() []string { - var args []string - if e.index == IndexTypeStaged { - args = []string{"diff", "--cached", e.diffDelta.OldFile.Path} - } else if e.statusEntryType == StatusEntryTypeUntracked { - args = []string{"diff", "--no-index", "/dev/null", e.diffDelta.NewFile.Path} - } else { - args = []string{"diff", "--", e.diffDelta.OldFile.Path} - } - return args -} - -// StatusEntryString returns entry status in pretty format -func (e *StatusEntry) StatusEntryString() string { - switch e.statusEntryType { - case StatusEntryTypeNew: - return "Added" - case StatusEntryTypeDeleted: - return "Deleted" - case StatusEntryTypeModified: - return "Modified" - case StatusEntryTypeRenamed: - return "Renamed" - case StatusEntryTypeUntracked: - return "Untracked" - case StatusEntryTypeTypeChange: - return "Type change" - case StatusEntryTypeConflicted: - return "Conflicted" - default: - return "Unknown" - } -} - -// Indexed true if entry added to index -func (e *StatusEntry) Indexed() bool { - return e.index == IndexTypeStaged -} - -// AddEntry is the wrapper of "git add /path/to/file" command -func (r *Repository) AddEntry(e *StatusEntry) error { - cmd := exec.Command("git", "add", "--", e.diffDelta.OldFile.Path) - cmd.Dir = r.AbsPath - if err := cmd.Run(); err != nil { - return err - } - return r.loadStatus() -} - -// ResetEntry is the wrapper of "git reset path/to/file" command -func (r *Repository) ResetEntry(e *StatusEntry) error { - cmd := exec.Command("git", "reset", "HEAD", "--", e.diffDelta.OldFile.Path) - cmd.Dir = r.AbsPath - if err := cmd.Run(); err != nil { - return err - } - return r.loadStatus() -} - -// AddAll is the wrapper of "git add ." command -func (r *Repository) AddAll() error { - cmd := exec.Command("git", "add", ".") - cmd.Dir = r.AbsPath - if err := cmd.Run(); err != nil { - return err - } - return r.loadStatus() -} - -// ResetAll is the wrapper of "git reset" command -func (r *Repository) ResetAll() error { - cmd := exec.Command("git", "reset", "--mixed") - cmd.Dir = r.AbsPath - if err := cmd.Run(); err != nil { - return err - } - return r.loadStatus() -} diff --git a/git/tag.go b/git/tag.go deleted file mode 100644 index f2f6bc5..0000000 --- a/git/tag.go +++ /dev/null @@ -1,72 +0,0 @@ -package git - -// Tag is used to label and mark a specific commit in the history. -// It is usually used to mark release points -type Tag struct { - Hash string - // Target *lib.Oid - // Tagger *Contributor - Shorthand string - Name string - refType RefType - target string - // Message string -} - -// loadTags loads tags from the refs -func (r *Repository) loadTags() ([]*Tag, error) { - ts := make([]*Tag, 0) - - iter, err := r.repo.NewReferenceIterator() - if err != nil { - return ts, err - } - defer iter.Free() - - for { - ref, err := iter.Next() - if err != nil || ref == nil { - break - } - - if !ref.IsRemote() && ref.IsTag() { - - t := &Tag{ - Hash: ref.Target().String(), - refType: RefTypeTag, - Name: ref.Name(), - Shorthand: ref.Shorthand(), - } - if _, ok := r.RefMap[t.Hash]; !ok { - r.RefMap[t.Hash] = make([]Ref, 0) - } - refs := r.RefMap[t.Hash] - refs = append(refs, t) - r.RefMap[t.Hash] = refs - ts = append(ts, t) - - } - } - r.Tags = ts - return ts, nil -} - -func (t *Tag) Type() RefType { - return t.refType -} - -func (t *Tag) Target() string { - return t.target -} - -func (t *Tag) Display() string { - return t.Shorthand -} - -func (t *Tag) Oid() string { - return t.Hash -} - -func (t *Tag) ShortType() rune { - return 't' -} diff --git a/img/screencast.gif b/img/screencast.gif deleted file mode 100644 index 2e72e8539c11b03d0b1959d7fae8aae0d6867d02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3356119 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