diff options
| author | 2026-06-13 16:02:55 +0000 | |
|---|---|---|
| committer | 2026-06-13 16:02:55 +0000 | |
| commit | 1fb7a56388dd10361aee699a288a1ac5ae4814ee (patch) | |
| tree | 1b94997e48e3b06a2fb065569a90ede77941b465 /object | |
| parent | object/tag: Don't clone on parse (diff) | |
object/tag: Clone
Diffstat (limited to 'object')
| -rw-r--r-- | object/tag/clone.go | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/object/tag/clone.go b/object/tag/clone.go new file mode 100644 index 00000000..0f792bc1 --- /dev/null +++ b/object/tag/clone.go @@ -0,0 +1,29 @@ +package tag + +import "bytes" + +// Clone returns a deep copy of the tag +// whose byte fields are independent of any memory the original may alias. +// +// Labels: Life-Independent. +func (tag *Tag) Clone() *Tag { + clone := &Tag{ + TargetID: tag.TargetID, + TargetType: tag.TargetType, + Name: bytes.Clone(tag.Name), + Tagger: tag.Tagger.Clone(), + Message: bytes.Clone(tag.Message), + } + + if tag.ExtraHeaders != nil { + clone.ExtraHeaders = make([]ExtraHeader, len(tag.ExtraHeaders)) + for i, h := range tag.ExtraHeaders { + clone.ExtraHeaders[i] = ExtraHeader{ + Key: bytes.Clone(h.Key), + Value: bytes.Clone(h.Value), + } + } + } + + return clone +} |
