Skip to content

Commit 7b256a7

Browse files
committed
first commit
0 parents  commit 7b256a7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+8896
-0
lines changed

.idea/git-json-diff.iml

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/misc.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/modules.xml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/vcs.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/workspace.xml

Lines changed: 182 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Gopkg.lock

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Gopkg.toml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
2+
# Gopkg.toml example
3+
#
4+
# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
5+
# for detailed Gopkg.toml documentation.
6+
#
7+
# required = ["github.com/user/thing/cmd/thing"]
8+
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
9+
#
10+
# [[constraint]]
11+
# name = "github.com/user/project"
12+
# version = "1.0.0"
13+
#
14+
# [[constraint]]
15+
# name = "github.com/user/project2"
16+
# branch = "dev"
17+
# source = "github.com/myfork/project2"
18+
#
19+
# [[override]]
20+
# name = "github.com/x/y"
21+
# version = "2.4.0"
22+

git.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package git_json_diff
2+
3+
import (
4+
"os/exec"
5+
"log"
6+
"io/ioutil"
7+
diff "github.com/yudai/gojsondiff"
8+
"fmt"
9+
"encoding/json"
10+
"github.com/yudai/gojsondiff/formatter"
11+
)
12+
13+
func isGitInstall() bool {
14+
if _, err := exec.LookPath("git"); err != nil {
15+
return false
16+
}
17+
return true
18+
}
19+
20+
func RetriveFileContentWithCommitId(filePath, commitid string) (string, error) {
21+
if isGitInstall() {
22+
log.Fatalln("cannot find git command")
23+
}
24+
cmd := exec.Command("git", "show " + commitid + ":" + filePath)
25+
stdout, err := cmd.StdoutPipe()
26+
if err != nil {
27+
log.Fatal(err)
28+
}
29+
defer func() {
30+
stdout.Close()
31+
}()
32+
33+
if err := cmd.Start(); err != nil {
34+
log.Fatal(err)
35+
}
36+
if err := cmd.Wait(); err != nil {
37+
log.Fatal(err)
38+
}
39+
b, err := ioutil.ReadAll(stdout)
40+
return string(b), err
41+
}
42+
43+
func Compare(jsonText1, jsonText2, outFormat string) (string, error) {
44+
differ := diff.New()
45+
d, err := differ.Compare([]byte(jsonText1), []byte(jsonText2))
46+
if err != nil {
47+
return "", err
48+
}
49+
if !d.Modified() {
50+
return "", err
51+
}
52+
return formatDiff(d, jsonText1, outFormat, true)
53+
}
54+
55+
func formatDiff(d diff.Diff, prevJsonText string, format string, enableColor bool) (ret string, err error) {
56+
if format == "ascii" {
57+
var aJson map[string]interface{}
58+
json.Unmarshal([]byte(prevJsonText), &aJson)
59+
60+
config := formatter.AsciiFormatterConfig{
61+
ShowArrayIndex: true,
62+
Coloring: enableColor,
63+
}
64+
65+
formatTransfer := formatter.NewAsciiFormatter(aJson, config)
66+
return formatTransfer.Format(d)
67+
}
68+
69+
if format == "delta" {
70+
formatTransfer := formatter.NewDeltaFormatter()
71+
return formatTransfer.Format(d)
72+
}
73+
return "", fmt.Errorf("unkonw format %s", format)
74+
}

main.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package git_json_diff
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"os"
7+
"log"
8+
)
9+
10+
func main() {
11+
filePath := flag.String("file", "", "file in repo to show diff")
12+
commit1 := flag.String("commit1", "HEAD", "commit id, as current version, to fetch the file content, default HEAD")
13+
commit2 := flag.String("commit2", "HEAD^", "commit id, as the old version, to fetch the file content , default HEAD^")
14+
format := flag.String("format", "ascii", "Diff Output Format (ascii, delta)")
15+
flag.Parse()
16+
17+
if len(flag.Args()) == 0 {
18+
flag.Usage()
19+
os.Exit(1)
20+
}
21+
22+
jsonText1, err := RetriveFileContentWithCommitId(*filePath, *commit1)
23+
if err != nil {
24+
log.Fatalln(err)
25+
}
26+
jsonText2, err := RetriveFileContentWithCommitId(*filePath, *commit2)
27+
if err != nil {
28+
log.Fatalln(err)
29+
}
30+
31+
diffString, err := Compare(jsonText1, jsonText2, *format)
32+
if err != nil {
33+
log.Fatalln(err)
34+
}
35+
fmt.Println(diffString)
36+
37+
}

0 commit comments

Comments
 (0)