summaryrefslogtreecommitdiff
path: root/core/command/cmd-diff.go
diff options
context:
space:
mode:
authorIbrahim Serdar Acikgoz <serdaracikgoz86@gmail.com>2019-01-04 03:24:46 +0300
committerIbrahim Serdar Acikgoz <serdaracikgoz86@gmail.com>2019-01-04 03:24:46 +0300
commitb4547c56f3c28f0d03ee9437ec93c0e6fb6e0331 (patch)
tree0458a9afbabdb34938e287ba8c3bec5edb948f38 /core/command/cmd-diff.go
parentremove unnecessary code (diff)
downloadgitbatch-b4547c56f3c28f0d03ee9437ec93c0e6fb6e0331.tar.gz
huge refactor, package layour re-organized
Diffstat (limited to 'core/command/cmd-diff.go')
-rw-r--r--core/command/cmd-diff.go90
1 files changed, 90 insertions, 0 deletions
diff --git a/core/command/cmd-diff.go b/core/command/cmd-diff.go
new file mode 100644
index 0000000..120037a
--- /dev/null
+++ b/core/command/cmd-diff.go
@@ -0,0 +1,90 @@
+package command
+
+import (
+ "errors"
+
+ "github.com/isacikgoz/gitbatch/core/git"
+ gogit "gopkg.in/src-d/go-git.v4"
+ "gopkg.in/src-d/go-git.v4/plumbing"
+)
+
+var (
+ diffCmdMode string
+
+ diffCommand = "diff"
+ diffCmdModeLegacy = "git"
+ diffCmdModeNative = "go-git"
+)
+
+// Diff is a wrapper function for "git diff" command
+// Diff function returns the diff to previous commit detail of the given has
+// of a specific commit
+func Diff(e *git.RepoEntity, hash string) (diff string, err error) {
+ diffCmdMode = diffCmdModeNative
+
+ switch diffCmdMode {
+ case diffCmdModeLegacy:
+ return diffWithGit(e, hash)
+ case diffCmdModeNative:
+ return diffWithGoGit(e, hash)
+ }
+ return diff, errors.New("Unhandled diff operation")
+}
+
+func diffWithGit(e *git.RepoEntity, hash string) (diff string, err error) {
+ return diff, nil
+}
+
+func diffWithGoGit(e *git.RepoEntity, hash string) (diff string, err error) {
+ currentCommitIndex := 0
+ for i, cs := range e.Commits {
+ if cs.Hash == hash {
+ currentCommitIndex = i
+ }
+ }
+ if len(e.Commits)-currentCommitIndex <= 1 {
+ return "there is no diff", nil
+ }
+
+ // maybe we dont need to log the repo again?
+ commits, err := e.Repository.Log(&gogit.LogOptions{
+ From: plumbing.NewHash(e.Commit.Hash),
+ Order: gogit.LogOrderCommitterTime,
+ })
+ if err != nil {
+ return "", err
+ }
+
+ currentCommit, err := commits.Next()
+ if err != nil {
+ return "", err
+ }
+ currentTree, err := currentCommit.Tree()
+ if err != nil {
+ return diff, err
+ }
+
+ prevCommit, err := commits.Next()
+ if err != nil {
+ return "", err
+ }
+ prevTree, err := prevCommit.Tree()
+ if err != nil {
+ return diff, err
+ }
+
+ changes, err := prevTree.Diff(currentTree)
+ if err != nil {
+ return "", err
+ }
+
+ // here we collect the actual diff
+ for _, c := range changes {
+ patch, err := c.Patch()
+ if err != nil {
+ break
+ }
+ diff = diff + patch.String() + "\n"
+ }
+ return diff, nil
+}