A vibe coded tangled fork which supports pijul.

knotserver/git: extract parseTagRecord helper from Tags

Signed-off-by: Matías Insaurralde <matias@insaurral.de>

authored by

Matías Insaurralde and committed by tangled.org fce83643 53a5d190

+70 -52
+70 -52
knotserver/git/tag.go
··· 16 16 Pattern string 17 17 } 18 18 19 + // numTagFields is the number of fields per record produced by the for-each-ref 20 + // format string built in Tags. 21 + const numTagFields = 11 22 + 23 + // parseTagRecord parses a single for-each-ref output record into an object.Tag. 24 + // 25 + // Returns (object.Tag{}, false, nil) when the record is too short and should be 26 + // skipped. Returns (object.Tag{}, false, err) when the object type is 27 + // unrecognised. Returns (tag, true, nil) on success. 28 + func parseTagRecord(line string) (object.Tag, bool, error) { 29 + parts := strings.SplitN(strings.TrimSpace(line), fieldSeparator, numTagFields) 30 + if len(parts) < 6 { 31 + return object.Tag{}, false, nil 32 + } 33 + 34 + tagName := parts[0] 35 + objectHash := parts[1] 36 + objectType := parts[2] 37 + targetHash := parts[3] // dereferenced object hash (empty for lightweight tags) 38 + // targetType := parts[4] // dereferenced object type (empty for lightweight tags) 39 + taggerName := parts[5] 40 + taggerEmail := parts[6] 41 + taggerDate := parts[7] 42 + subject := parts[8] 43 + body := parts[9] 44 + signature := parts[10] 45 + 46 + // combine subject and body for the message 47 + var message string 48 + if subject != "" && body != "" { 49 + message = subject + "\n\n" + body 50 + } else if subject != "" { 51 + message = subject 52 + } else { 53 + message = body 54 + } 55 + 56 + // parse creation time 57 + var createdAt time.Time 58 + if unix, err := strconv.ParseInt(taggerDate, 10, 64); err == nil { 59 + createdAt = time.Unix(unix, 0) 60 + } 61 + 62 + // parse object type 63 + typ, err := plumbing.ParseObjectType(objectType) 64 + if err != nil { 65 + return object.Tag{}, false, err 66 + } 67 + 68 + // strip email separators 69 + taggerEmail = strings.TrimSuffix(strings.TrimPrefix(taggerEmail, "<"), ">") 70 + 71 + return object.Tag{ 72 + Hash: plumbing.NewHash(objectHash), 73 + Name: tagName, 74 + Tagger: object.Signature{ 75 + Name: taggerName, 76 + Email: taggerEmail, 77 + When: createdAt, 78 + }, 79 + Message: message, 80 + PGPSignature: signature, 81 + TargetType: typ, 82 + Target: plumbing.NewHash(targetHash), 83 + }, true, nil 84 + } 85 + 19 86 func (g *GitRepo) Tags(opts *TagsOptions) ([]object.Tag, error) { 20 87 if opts == nil { 21 88 opts = &TagsOptions{} ··· 84 151 tags := make([]object.Tag, 0, len(records)) 85 152 86 153 for _, line := range records { 87 - parts := strings.SplitN(strings.TrimSpace(line), fieldSeparator, len(fields)) 88 - if len(parts) < 6 { 89 - continue 90 - } 91 - 92 - tagName := parts[0] 93 - objectHash := parts[1] 94 - objectType := parts[2] 95 - targetHash := parts[3] // dereferenced object hash (empty for lightweight tags) 96 - // targetType := parts[4] // dereferenced object type (empty for lightweight tags) 97 - taggerName := parts[5] 98 - taggerEmail := parts[6] 99 - taggerDate := parts[7] 100 - subject := parts[8] 101 - body := parts[9] 102 - signature := parts[10] 103 - 104 - // combine subject and body for the message 105 - var message string 106 - if subject != "" && body != "" { 107 - message = subject + "\n\n" + body 108 - } else if subject != "" { 109 - message = subject 110 - } else { 111 - message = body 112 - } 113 - 114 - // parse creation time 115 - var createdAt time.Time 116 - if unix, err := strconv.ParseInt(taggerDate, 10, 64); err == nil { 117 - createdAt = time.Unix(unix, 0) 118 - } 119 - 120 - // parse object type 121 - typ, err := plumbing.ParseObjectType(objectType) 154 + tag, ok, err := parseTagRecord(line) 122 155 if err != nil { 123 156 return nil, err 124 157 } 125 - 126 - // strip email separators 127 - taggerEmail = strings.TrimSuffix(strings.TrimPrefix(taggerEmail, "<"), ">") 128 - 129 - tag := object.Tag{ 130 - Hash: plumbing.NewHash(objectHash), 131 - Name: tagName, 132 - Tagger: object.Signature{ 133 - Name: taggerName, 134 - Email: taggerEmail, 135 - When: createdAt, 136 - }, 137 - Message: message, 138 - PGPSignature: signature, 139 - TargetType: typ, 140 - Target: plumbing.NewHash(targetHash), 158 + if !ok { 159 + continue 141 160 } 142 - 143 161 tags = append(tags, tag) 144 162 } 145 163