summaryrefslogtreecommitdiff
path: root/commits.go
diff options
context:
space:
mode:
Diffstat (limited to 'commits.go')
-rw-r--r--commits.go101
1 files changed, 101 insertions, 0 deletions
diff --git a/commits.go b/commits.go
new file mode 100644
index 0000000..c429bca
--- /dev/null
+++ b/commits.go
@@ -0,0 +1,101 @@
+package main
+
+import (
+ "fmt"
+ "github.com/KatolaZ/git2go"
+ "golang.org/x/crypto/openpgp"
+ "os"
+ "strings"
+ "log"
+)
+
+func CommitToString(commit *git.Commit) string {
+
+ var ret string
+
+ ret += fmt.Sprintf("type: %s\n", commit.Type())
+ ret += fmt.Sprintf("Id: %s\n", commit.Id())
+ ret += fmt.Sprintf("Author: %s\n", commit.Author())
+ ret += fmt.Sprintf("Message: %s\n", commit.Message())
+ ret += fmt.Sprintf("Parent-count: %d\n", commit.ParentCount())
+
+ return ret
+}
+
+// FIXME: RETURN THE ENTITY PROVIDED BY THE CHECK, OR nil
+func check_signature(commit *git.Commit, keyring *openpgp.KeyRing) (signature, signed string, err error) {
+
+ signature, signed, err = commit.ExtractSignature()
+ if err == nil {
+
+ _, err_sig :=
+ openpgp.CheckArmoredDetachedSignature(*keyring, strings.NewReader(signed),
+ strings.NewReader(signature))
+
+ if err_sig == nil {
+ fmt.Printf("Good signature \n")
+ return signature, signed, nil
+ }
+ err = err_sig
+ }
+
+ return "", "", err
+}
+
+
+// traverse all the commits between two references, looking for scorsh
+// commands
+// fixme: we don't have just one keyring here....
+func walk_commits(msg SCORSHmsg, keyring openpgp.KeyRing) int {
+
+ fmt.Printf("Inside parse_commits\n")
+
+ reponame := msg.repo
+ old_rev := msg.old_rev
+ new_rev := msg.new_rev
+
+ repo, err := git.OpenRepository(reponame)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "Error while opening repository %s (%s)\n",
+ reponame, err)
+ return SCORSH_ERR_NO_REPO
+ }
+
+ old_rev_oid, err := git.NewOid(old_rev)
+
+ oldrev_commit, err := repo.LookupCommit(old_rev_oid)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "Commit: %s does not exist\n", old_rev)
+ return SCORSH_ERR_NO_COMMIT
+ }
+
+ new_rev_oid, err := git.NewOid(new_rev)
+
+ newrev_commit, err := repo.LookupCommit(new_rev_oid)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "Commit: %s does not exist\n", new_rev)
+ return SCORSH_ERR_NO_COMMIT
+ }
+
+ cur_commit := newrev_commit
+
+ for cur_commit.Id().String() != oldrev_commit.Id().String() {
+
+ commit, err := repo.LookupCommit(cur_commit.Id())
+ if err == nil {
+
+ fmt.Printf("%s", CommitToString(commit))
+ //signature, signed, err := check_signature(commit, &keyring)
+ _, _, err := check_signature(commit, &keyring)
+ if err != nil {
+ log.Printf("%s\n", SCORSHErr(SCORSH_ERR_SIGNATURE))
+
+ }
+ cur_commit = commit.Parent(0)
+ } else {
+ fmt.Printf("Commit %x not found!\n", cur_commit.Id())
+ return SCORSH_ERR_NO_COMMIT
+ }
+ }
+ return 0
+}