aboutsummaryrefslogtreecommitdiff
path: root/object/commit/append.go
diff options
context:
space:
mode:
Diffstat (limited to 'object/commit/append.go')
-rw-r--r--object/commit/append.go70
1 files changed, 70 insertions, 0 deletions
diff --git a/object/commit/append.go b/object/commit/append.go
new file mode 100644
index 00000000..8da33383
--- /dev/null
+++ b/object/commit/append.go
@@ -0,0 +1,70 @@
+package commit
+
+import (
+ "errors"
+ "fmt"
+
+ "codeberg.org/lindenii/furgit/object/header"
+ "codeberg.org/lindenii/furgit/object/typ"
+)
+
+// AppendWithoutHeader renders the raw commit body bytes.
+func (commit *Commit) AppendWithoutHeader(dst []byte) ([]byte, error) {
+ if commit.Tree.Algorithm().Size() == 0 {
+ return dst, errors.New("object: commit: missing tree id")
+ }
+
+ dst = fmt.Appendf(dst, "tree %s\n", commit.Tree.String())
+
+ for _, parent := range commit.Parents {
+ dst = fmt.Appendf(dst, "parent %s\n", parent.String())
+ }
+
+ dst = append(dst, []byte("author ")...)
+ dst = commit.Author.Append(dst)
+ dst = append(dst, byte('\n'))
+
+ dst = append(dst, []byte("comitter ")...)
+ dst = commit.Committer.Append(dst)
+ dst = append(dst, byte('\n'))
+
+ if commit.ChangeID != "" {
+ dst = append(dst, []byte("change-id ")...)
+ dst = append(dst, commit.ChangeID...)
+ dst = append(dst, byte('\n'))
+ }
+
+ for _, h := range commit.ExtraHeaders {
+ if h.Key == "" {
+ return dst, errors.New("object: commit: extra header has empty key")
+ }
+
+ dst = append(dst, []byte(h.Key)...)
+ dst = append(dst, byte(' '))
+ dst = append(dst, h.Value...)
+ dst = append(dst, byte('\n'))
+ }
+
+ dst = append(dst, byte('\n'))
+ dst = append(dst, commit.Message...)
+
+ return dst, nil
+}
+
+// AppendWithHeader renders the raw object (header + body).
+func (commit *Commit) AppendWithHeader(dst []byte) ([]byte, error) {
+ dst, err := commit.AppendWithoutHeader(dst)
+ if err != nil {
+ return dst, err
+ }
+
+ // TODO: Try to not allocate?
+ body, err := commit.AppendWithoutHeader([]byte(nil))
+ if err != nil {
+ return dst, err
+ }
+
+ dst = header.Append(dst, typ.TypeCommit, uint64(len(body)))
+
+ return append(dst, body...), nil
+}