func (r *Repository) CrossRepoMergeBase(a vcs.CommitID, repoB vcs.Repository, b vcs.CommitID) (vcs.CommitID, error) { // libgit2 Repository inherits GitRootDir and CrossRepo from its // embedded gitcmd.Repository. var repoBDir string // path to head repo on local filesystem if repoB, ok := repoB.(gitcmd.CrossRepo); ok { repoBDir = repoB.GitRootDir() } else { return "", fmt.Errorf("git cross-repo merge-base not supported against repo type %T", repoB) } if repoBDir == r.Dir { return r.MergeBase(a, b) } r.editLock.Lock() defer r.editLock.Unlock() rem, err := r.createAndFetchFromAnonRemote(repoBDir) if err != nil { return "", err } defer rem.Free() return r.mergeBaseHoldingEditLock(a, b) }
func (r *Repository) CrossRepoDiff(base vcs.CommitID, headRepo vcs.Repository, head vcs.CommitID, opt *vcs.DiffOptions) (diff *vcs.Diff, err error) { // libgit2 Repository inherits GitRootDir and CrossRepo from its // embedded gitcmd.Repository. var headDir string // path to head repo on local filesystem if headRepo, ok := headRepo.(gitcmd.CrossRepo); ok { headDir = headRepo.GitRootDir() } else { return nil, fmt.Errorf("git cross-repo diff not supported against head repo type %T", headRepo) } if headDir == r.Dir { return r.Diff(base, head, opt) } r.editLock.Lock() defer r.editLock.Unlock() rem, err := r.createAndFetchFromAnonRemote(headDir) if err != nil { return nil, err } defer rem.Free() return r.diffHoldingEditLock(base, head, opt) }
func (r *Repository) CrossRepoDiff(base vcs.CommitID, headRepo vcs.Repository, head vcs.CommitID, opt *vcs.DiffOptions) (*vcs.Diff, error) { var headDir string // path to head repo on local filesystem if headRepo, ok := headRepo.(CrossRepo); ok { headDir = headRepo.GitRootDir() } else { return nil, fmt.Errorf("git cross-repo diff not supported against head repo type %T", headRepo) } if headDir == r.Dir { return r.Diff(base, head, opt) } if err := r.fetchRemote(headDir); err != nil { return nil, err } return r.Diff(base, head, opt) }
func (r *Repository) CrossRepoMergeBase(a vcs.CommitID, repoB vcs.Repository, b vcs.CommitID) (vcs.CommitID, error) { // libgit2 Repository inherits GitRootDir and CrossRepo from its // embedded gitcmd.Repository. var repoBDir string // path to head repo on local filesystem if repoB, ok := repoB.(CrossRepo); ok { repoBDir = repoB.GitRootDir() } else { return "", fmt.Errorf("git cross-repo merge-base not supported against repo type %T", repoB) } if repoBDir != r.Dir { if err := r.fetchRemote(repoBDir); err != nil { return "", err } } return r.MergeBase(a, b) }