aboutsummaryrefslogtreecommitdiff
path: root/object/tag_serialize.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-02-20 21:20:35 +0800
committerGravatar Runxi Yu2026-02-20 21:51:00 +0800
commitb5a545a3d883026d61beac5556fec2a45e9ec3d3 (patch)
tree6281f89df21cb4b63a16bbcb057c5f186c40b148 /object/tag_serialize.go
parenttestgit: Add test harnesses (diff)
signatureNo signature
object: Add basic object code
Diffstat (limited to 'object/tag_serialize.go')
-rw-r--r--object/tag_serialize.go57
1 files changed, 57 insertions, 0 deletions
diff --git a/object/tag_serialize.go b/object/tag_serialize.go
new file mode 100644
index 00000000..9600b81f
--- /dev/null
+++ b/object/tag_serialize.go
@@ -0,0 +1,57 @@
+package object
+
+import (
+ "bytes"
+ "fmt"
+)
+
+func (tag *Tag) serialize() ([]byte, error) {
+ if tag.Target.Size() == 0 {
+ return nil, ErrInvalidObject
+ }
+
+ var buf bytes.Buffer
+ fmt.Fprintf(&buf, "object %s\n", tag.Target.String())
+
+ tyName, err := typeName(tag.TargetType)
+ if err != nil {
+ return nil, fmt.Errorf("object: tag: invalid target type %d", tag.TargetType)
+ }
+ buf.WriteString("type ")
+ buf.WriteString(tyName)
+ buf.WriteByte('\n')
+
+ buf.WriteString("tag ")
+ buf.Write(tag.Name)
+ buf.WriteByte('\n')
+
+ if tag.Tagger != nil {
+ taggerBytes, err := tag.Tagger.Serialize()
+ if err != nil {
+ return nil, err
+ }
+ buf.WriteString("tagger ")
+ buf.Write(taggerBytes)
+ buf.WriteByte('\n')
+ }
+
+ buf.WriteByte('\n')
+ buf.Write(tag.Message)
+ return buf.Bytes(), nil
+}
+
+// Serialize renders the raw object (header + body).
+func (tag *Tag) Serialize() ([]byte, error) {
+ body, err := tag.serialize()
+ if err != nil {
+ return nil, err
+ }
+ header, err := headerForType(TypeTag, 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
+}