diff --git a/git/commits.go b/git/commits.go index aad1039..e29c62f 100644 --- a/git/commits.go +++ b/git/commits.go @@ -36,20 +36,46 @@ func Commits(commitrange string) ([]CommitEntry, error) { return commits, nil } -// CommitEntry represents a single commit's information from `git` +// FieldNames are for the formating and rendering of the CommitEntry structs. +// Keys here are from git log pretty format "format:..." +var FieldNames = map[string]string{ + "%h": "abbreviated_commit", + "%p": "abbreviated_parent", + "%t": "abbreviated_tree", + "%aD": "author_date", + "%aE": "author_email", + "%aN": "author_name", + "%b": "body", + "%H": "commit", + "%N": "commit_notes", + "%cD": "committer_date", + "%cE": "committer_email", + "%cN": "committer_name", + "%e": "encoding", + "%P": "parent", + "%D": "refs", + "%f": "sanitized_subject_line", + "%GS": "signer", + "%GK": "signer_key", + "%s": "subject", + "%G?": "verification_flag", +} + +// CommitEntry represents a single commit's information from `git`. +// See also FieldNames type CommitEntry map[string]string var ( prettyFormat = `--pretty=format:` - formatSubject = `%s` + formatAuthorEmail = `%aE` + formatAuthorName = `%aN` formatBody = `%b` formatCommit = `%H` - formatAuthorName = `%aN` - formatAuthorEmail = `%aE` - formatCommitterName = `%cN` - formatCommitterEmail = `%cE` - formatSigner = `%GS` formatCommitNotes = `%N` + formatCommitterEmail = `%cE` + formatCommitterName = `%cN` + formatSigner = `%GS` + formatSubject = `%s` formatMap = `{"commit": "%H", "abbreviated_commit": "%h", "tree": "%T", "abbreviated_tree": "%t", "parent": "%P", "abbreviated_parent": "%p", "refs": "%D", "encoding": "%e", "sanitized_subject_line": "%f", "verification_flag": "%G?", "signer_key": "%GK", "author_date": "%aD" , "committer_date": "%cD" }` ) diff --git a/git/commits_test.go b/git/commits_test.go new file mode 100644 index 0000000..0194934 --- /dev/null +++ b/git/commits_test.go @@ -0,0 +1,55 @@ +package git + +import ( + "encoding/json" + "io/ioutil" + "testing" +) + +func TestCommitEntry(t *testing.T) { + c, err := HeadCommit() + if err != nil { + t.Fatal(err) + } + cr, err := Commits(c) + if err != nil { + t.Fatal(err) + } + for _, c := range cr { + for _, cV := range FieldNames { + found := false + for k := range c { + if k == cV { + found = true + } + } + if !found { + t.Errorf("failed to find field names: %q", c) + } + } + } +} + +func TestMarshal(t *testing.T) { + buf, err := ioutil.ReadFile("testdata/commits.json") + if err != nil { + t.Fatal(err) + } + cr := []CommitEntry{} + if err := json.Unmarshal(buf, &cr); err != nil { + t.Error(err) + } + for _, c := range cr { + for _, cV := range FieldNames { + found := false + for k := range c { + if k == cV { + found = true + } + } + if !found { + t.Errorf("failed to find field names: %q", c) + } + } + } +} diff --git a/git/testdata/commits.json b/git/testdata/commits.json new file mode 100644 index 0000000..7735912 --- /dev/null +++ b/git/testdata/commits.json @@ -0,0 +1 @@ +[{"abbreviated_commit":"769b402","abbreviated_parent":"eba7575","abbreviated_tree":"f3490fa","author_date":"Thu, 14 Jan 2016 10:29:35 -0500","author_email":"vbatts@hashbangbash.com","author_name":"Vincent Batts","body":"so you can test and just check return code\n\nSigned-off-by: Vincent Batts \u003cvbatts@hashbangbash.com\u003e","commit":"769b4028a4732f5134848aa970e73e2d6edc3175","commit_notes":"","committer_date":"Thu, 14 Jan 2016 10:29:35 -0500","committer_email":"vbatts@hashbangbash.com","committer_name":"Vincent Batts","encoding":"","parent":"eba7575f7eccc9ee1aa5874769b44a62b612947d","refs":"HEAD -\u003e master, origin/master, origin/HEAD","sanitized_subject_line":"main-adding-a-quiet-flag-to-reduce-the-output","signer":"","signer_key":"","subject":"main: adding a quiet flag to reduce the output","tree":"f3490fa57c956658a78348651bf75dfad15e5f68","verification_flag":"N"},{"abbreviated_commit":"eba7575","abbreviated_parent":"09c2bd4","abbreviated_tree":"77c40ce","author_date":"Tue, 6 Oct 2015 10:55:42 -0400","author_email":"vbatts@hashbangbash.com","author_name":"Vincent Batts","body":"Signed-off-by: Vincent Batts \u003cvbatts@hashbangbash.com\u003e","commit":"eba7575f7eccc9ee1aa5874769b44a62b612947d","commit_notes":"","committer_date":"Tue, 6 Oct 2015 10:55:42 -0400","committer_email":"vbatts@hashbangbash.com","committer_name":"Vincent Batts","encoding":"","parent":"09c2bd43dc6f0508f461f9e1088013abbd3fa3d5","refs":"","sanitized_subject_line":"README-information-about-rules","signer":"","signer_key":"","subject":"README: information about rules","tree":"77c40ce1580d215d8cac2d997d41d08baa6b2546","verification_flag":"N"},{"abbreviated_commit":"09c2bd4","abbreviated_parent":"b243ca4","abbreviated_tree":"f88ab5a","author_date":"Tue, 6 Oct 2015 10:51:22 -0400","author_email":"vbatts@hashbangbash.com","author_name":"Vincent Batts","body":"Signed-off-by: Vincent Batts \u003cvbatts@hashbangbash.com\u003e","commit":"09c2bd43dc6f0508f461f9e1088013abbd3fa3d5","commit_notes":"","committer_date":"Tue, 6 Oct 2015 10:51:22 -0400","committer_email":"vbatts@hashbangbash.com","committer_name":"Vincent Batts","encoding":"","parent":"b243ca47707576f7551094dd26c8e4647f093acf","refs":"","sanitized_subject_line":"README-more-usage","signer":"","signer_key":"","subject":"README: more usage","tree":"f88ab5a60a21f177e37b7eee3ee7c2c0e15f0892","verification_flag":"N"},{"abbreviated_commit":"b243ca4","abbreviated_parent":"d614ccf","abbreviated_tree":"a0c3f0b","author_date":"Tue, 6 Oct 2015 10:47:00 -0400","author_email":"vbatts@hashbangbash.com","author_name":"Vincent Batts","body":"Signed-off-by: Vincent Batts \u003cvbatts@hashbangbash.com\u003e","commit":"b243ca47707576f7551094dd26c8e4647f093acf","commit_notes":"","committer_date":"Tue, 6 Oct 2015 10:48:03 -0400","committer_email":"vbatts@hashbangbash.com","committer_name":"Vincent Batts","encoding":"","parent":"d614ccf9970296e9619e28883748be653801dbf3","refs":"","sanitized_subject_line":"README-adding-install-and-usage","signer":"","signer_key":"","subject":"README: adding install and usage","tree":"a0c3f0b74f503938d7d7c31a5d6e937410d520ae","verification_flag":"N"},{"abbreviated_commit":"d614ccf","abbreviated_parent":"b9413c6","abbreviated_tree":"785f2f5","author_date":"Tue, 6 Oct 2015 10:44:04 -0400","author_email":"vbatts@hashbangbash.com","author_name":"Vincent Batts","body":"for cleanliness and ease of testing\n\nSigned-off-by: Vincent Batts \u003cvbatts@hashbangbash.com\u003e","commit":"d614ccf9970296e9619e28883748be653801dbf3","commit_notes":"","committer_date":"Tue, 6 Oct 2015 10:44:04 -0400","committer_email":"vbatts@hashbangbash.com","committer_name":"Vincent Batts","encoding":"","parent":"b9413c60c83d6f25d8979292d09ddceff0cde111","refs":"","sanitized_subject_line":"run-tests-in-a-runner","signer":"","signer_key":"","subject":"*: run tests in a runner","tree":"785f2f51a0e92f590053745be8e915116e4e8c59","verification_flag":"N"},{"abbreviated_commit":"b9413c6","abbreviated_parent":"5e74abd","abbreviated_tree":"997fcb4","author_date":"Mon, 5 Oct 2015 19:02:31 -0400","author_email":"vbatts@hashbangbash.com","author_name":"Vincent Batts","body":"Signed-off-by: Vincent Batts \u003cvbatts@hashbangbash.com\u003e","commit":"b9413c60c83d6f25d8979292d09ddceff0cde111","commit_notes":"","committer_date":"Mon, 5 Oct 2015 19:02:31 -0400","committer_email":"vbatts@hashbangbash.com","committer_name":"Vincent Batts","encoding":"","parent":"5e74abd1b2560d91647280da8374978763cb3b0f","refs":"","sanitized_subject_line":"shortsubject-add-a-subject-length-check","signer":"","signer_key":"","subject":"shortsubject: add a subject length check","tree":"997fcb4cf30c0f25ac5feb907ff5a977b8a65ae6","verification_flag":"N"},{"abbreviated_commit":"5e74abd","abbreviated_parent":"07a982f","abbreviated_tree":"6605800","author_date":"Mon, 5 Oct 2015 18:55:05 -0400","author_email":"vbatts@hashbangbash.com","author_name":"Vincent Batts","body":"Signed-off-by: Vincent Batts \u003cvbatts@hashbangbash.com\u003e","commit":"5e74abd1b2560d91647280da8374978763cb3b0f","commit_notes":"","committer_date":"Mon, 5 Oct 2015 18:55:05 -0400","committer_email":"vbatts@hashbangbash.com","committer_name":"Vincent Batts","encoding":"","parent":"07a982ff94318262732e6422daa75f1f51340b60","refs":"","sanitized_subject_line":"comments-and-golint","signer":"","signer_key":"","subject":"*: comments and golint","tree":"6605800cc08fc9906b9ab9819413d2adaffd0ed5","verification_flag":"N"},{"abbreviated_commit":"07a982f","abbreviated_parent":"03bda4b","abbreviated_tree":"8a81024","author_date":"Mon, 5 Oct 2015 18:45:33 -0400","author_email":"vbatts@hashbangbash.com","author_name":"Vincent Batts","body":"Signed-off-by: Vincent Batts \u003cvbatts@hashbangbash.com\u003e","commit":"07a982ff94318262732e6422daa75f1f51340b60","commit_notes":"","committer_date":"Mon, 5 Oct 2015 18:49:06 -0400","committer_email":"vbatts@hashbangbash.com","committer_name":"Vincent Batts","encoding":"","parent":"03bda4bcb2e741bc3e540ac171ba229bcfb47b9c","refs":"","sanitized_subject_line":"git-add-verbose-output-of-the-commands-run","signer":"","signer_key":"","subject":"git: add verbose output of the commands run","tree":"8a81024ef0d4e93d5852180f3c3f9ce10ae09cdb","verification_flag":"N"},{"abbreviated_commit":"03bda4b","abbreviated_parent":"c10ba9c","abbreviated_tree":"e41fbcb","author_date":"Mon, 5 Oct 2015 18:29:24 -0400","author_email":"vbatts@hashbangbash.com","author_name":"Vincent Batts","body":"Signed-off-by: Vincent Batts \u003cvbatts@hashbangbash.com\u003e","commit":"03bda4bcb2e741bc3e540ac171ba229bcfb47b9c","commit_notes":"","committer_date":"Mon, 5 Oct 2015 18:49:02 -0400","committer_email":"vbatts@hashbangbash.com","committer_name":"Vincent Batts","encoding":"","parent":"c10ba9c097ba2d5e0d5e834ae43252276a177e94","refs":"","sanitized_subject_line":"main-add-filtering-of-rules-to-run","signer":"","signer_key":"","subject":"main: add filtering of rules to run","tree":"e41fbcb527138c2cf49ee05d8adc55ba5d4d22f6","verification_flag":"N"},{"abbreviated_commit":"c10ba9c","abbreviated_parent":"","abbreviated_tree":"06f0e7a","author_date":"Mon, 5 Oct 2015 16:16:52 -0400","author_email":"vbatts@hashbangbash.com","author_name":"Vincent Batts","body":"Signed-off-by: Vincent Batts \u003cvbatts@hashbangbash.com\u003e","commit":"c10ba9c097ba2d5e0d5e834ae43252276a177e94","commit_notes":"","committer_date":"Mon, 5 Oct 2015 18:48:23 -0400","committer_email":"vbatts@hashbangbash.com","committer_name":"Vincent Batts","encoding":"","parent":"","refs":"","sanitized_subject_line":"Initial-commit","signer":"","signer_key":"","subject":"Initial commit","tree":"06f0e7a5b91783b052759a91c25fab7a22ce3ab4","verification_flag":"N"}] \ No newline at end of file