aboutsummaryrefslogtreecommitdiff
path: root/object/commit_serialize.go
diff options
context:
space:
mode:
Diffstat (limited to 'object/commit_serialize.go')
-rw-r--r--object/commit_serialize.go69
1 files changed, 69 insertions, 0 deletions
diff --git a/object/commit_serialize.go b/object/commit_serialize.go
new file mode 100644
index 00000000..b06e597c
--- /dev/null
+++ b/object/commit_serialize.go
@@ -0,0 +1,69 @@
+package object
+
+import (
+ "bytes"
+ "fmt"
+)
+
+func (commit *Commit) serialize() ([]byte, error) {
+ var buf bytes.Buffer
+
+ if commit.Tree.Size() == 0 {
+ return nil, ErrInvalidObject
+ }
+ fmt.Fprintf(&buf, "tree %s\n", commit.Tree.String())
+ for _, parent := range commit.Parents {
+ fmt.Fprintf(&buf, "parent %s\n", parent.String())
+ }
+
+ authorBytes, err := commit.Author.Serialize()
+ if err != nil {
+ return nil, err
+ }
+ buf.WriteString("author ")
+ buf.Write(authorBytes)
+ buf.WriteByte('\n')
+
+ committerBytes, err := commit.Committer.Serialize()
+ if err != nil {
+ return nil, err
+ }
+ buf.WriteString("committer ")
+ buf.Write(committerBytes)
+ buf.WriteByte('\n')
+
+ if commit.ChangeID != "" {
+ buf.WriteString("change-id ")
+ buf.WriteString(commit.ChangeID)
+ buf.WriteByte('\n')
+ }
+ for _, h := range commit.ExtraHeaders {
+ if h.Key == "" {
+ return nil, ErrInvalidObject
+ }
+ buf.WriteString(h.Key)
+ buf.WriteByte(' ')
+ buf.Write(h.Value)
+ buf.WriteByte('\n')
+ }
+
+ buf.WriteByte('\n')
+ buf.Write(commit.Message)
+ return buf.Bytes(), nil
+}
+
+// Serialize renders the raw object (header + body).
+func (commit *Commit) Serialize() ([]byte, error) {
+ body, err := commit.serialize()
+ if err != nil {
+ return nil, err
+ }
+ header, err := headerForType(TypeCommit, body)
+ if err != nil {
+ return nil, err
+ }
+ raw := make([]byte, len(header)+len(body))
+ copy(raw, header)
+ copy(raw[len(header):], body)
+ return raw, nil
+}