(refNames string)
| 278 | } |
| 279 | |
| 280 | func parseRefNames(refNames string) []RefName { |
| 281 | refNames = strings.TrimSpace(refNames) |
| 282 | if refNames == "" { |
| 283 | return nil |
| 284 | } |
| 285 | |
| 286 | parts := strings.Split(refNames, ", ") |
| 287 | out := make([]RefName, 0, len(parts)) |
| 288 | for _, p := range parts { |
| 289 | p = strings.TrimSpace(p) |
| 290 | if p == "" { |
| 291 | continue |
| 292 | } |
| 293 | |
| 294 | // tag: v1.2.3 |
| 295 | if strings.HasPrefix(p, "tag: ") { |
| 296 | out = append(out, RefName{ |
| 297 | Kind: RefKindTag, |
| 298 | Name: strings.TrimSpace(strings.TrimPrefix(p, "tag: ")), |
| 299 | }) |
| 300 | continue |
| 301 | } |
| 302 | |
| 303 | // HEAD -> main |
| 304 | if strings.HasPrefix(p, "HEAD -> ") { |
| 305 | out = append(out, RefName{ |
| 306 | Kind: RefKindHEAD, |
| 307 | Name: "HEAD", |
| 308 | Target: strings.TrimSpace(strings.TrimPrefix(p, "HEAD -> ")), |
| 309 | }) |
| 310 | continue |
| 311 | } |
| 312 | |
| 313 | // origin/HEAD -> origin/main |
| 314 | if strings.Contains(p, " -> ") && strings.HasSuffix(strings.SplitN(p, " -> ", 2)[0], "/HEAD") { |
| 315 | leftRight := strings.SplitN(p, " -> ", 2) |
| 316 | out = append(out, RefName{ |
| 317 | Kind: RefKindRemoteHEAD, |
| 318 | Name: strings.TrimSpace(leftRight[0]), |
| 319 | Target: strings.TrimSpace(leftRight[1]), |
| 320 | }) |
| 321 | continue |
| 322 | } |
| 323 | |
| 324 | // Remote branch like origin/main |
| 325 | if strings.Contains(p, "/") { |
| 326 | out = append(out, RefName{ |
| 327 | Kind: RefKindRemote, |
| 328 | Name: p, |
| 329 | }) |
| 330 | continue |
| 331 | } |
| 332 | |
| 333 | // Local branch |
| 334 | out = append(out, RefName{ |
| 335 | Kind: RefKindBranch, |
| 336 | Name: p, |
| 337 | }) |
no outgoing calls