resolveRemoteDefaultBranch queries the origin remote to determine the remote's default branch (the target of HEAD) and returns the corresponding local branch reference name (e.g. refs/heads/master).
(repo *git.Repository, authMethod transport.AuthMethod)
| 676 | // resolveRemoteDefaultBranch queries the origin remote to determine the remote's default branch |
| 677 | // (the target of HEAD) and returns the corresponding local branch reference name (e.g. refs/heads/master). |
| 678 | func resolveRemoteDefaultBranch(repo *git.Repository, authMethod transport.AuthMethod) (resolvedRemoteBranch, error) { |
| 679 | if err := syncRemoteReferences(repo, authMethod); err != nil { |
| 680 | return resolvedRemoteBranch{}, fmt.Errorf("resolve remote default: sync remote refs: %w", err) |
| 681 | } |
| 682 | remote, err := repo.Remote("origin") |
| 683 | if err != nil { |
| 684 | return resolvedRemoteBranch{}, fmt.Errorf("resolve remote default: get remote: %w", err) |
| 685 | } |
| 686 | refs, err := remote.List(&git.ListOptions{Auth: authMethod}) |
| 687 | if err != nil { |
| 688 | if resolved, ok := resolveRemoteDefaultBranchFromLocal(repo); ok { |
| 689 | return resolved, nil |
| 690 | } |
| 691 | return resolvedRemoteBranch{}, fmt.Errorf("resolve remote default: list remote refs: %w", err) |
| 692 | } |
| 693 | for _, r := range refs { |
| 694 | if r.Name() == plumbing.HEAD { |
| 695 | if r.Type() == plumbing.SymbolicReference { |
| 696 | if target, ok := normalizeRemoteBranchReference(r.Target()); ok { |
| 697 | return resolvedRemoteBranch{name: target}, nil |
| 698 | } |
| 699 | } |
| 700 | s := r.String() |
| 701 | if idx := strings.Index(s, "->"); idx != -1 { |
| 702 | if target, ok := normalizeRemoteBranchReference(plumbing.ReferenceName(strings.TrimSpace(s[idx+2:]))); ok { |
| 703 | return resolvedRemoteBranch{name: target}, nil |
| 704 | } |
| 705 | } |
| 706 | } |
| 707 | } |
| 708 | if resolved, ok := resolveRemoteDefaultBranchFromLocal(repo); ok { |
| 709 | return resolved, nil |
| 710 | } |
| 711 | for _, r := range refs { |
| 712 | if normalized, ok := normalizeRemoteBranchReference(r.Name()); ok { |
| 713 | return resolvedRemoteBranch{name: normalized, hash: r.Hash()}, nil |
| 714 | } |
| 715 | } |
| 716 | return resolvedRemoteBranch{}, fmt.Errorf("resolve remote default: remote default branch not found") |
| 717 | } |
| 718 | |
| 719 | func resolveRemoteDefaultBranchFromLocal(repo *git.Repository) (resolvedRemoteBranch, bool) { |
| 720 | ref, err := repo.Reference(plumbing.ReferenceName("refs/remotes/origin/HEAD"), true) |
no test coverage detected