Pull fetches refspec from remoteName and merges them on top of HEAD.
(remoteName, refspec string)
| 13 | |
| 14 | // Pull fetches refspec from remoteName and merges them on top of HEAD. |
| 15 | func (p *Project) Pull(remoteName, refspec string) error { |
| 16 | // fetch from remote |
| 17 | if err := p.Fetch(remoteName, refspec); err != nil { |
| 18 | return err |
| 19 | } |
| 20 | |
| 21 | // if branch, use remote branch ref |
| 22 | branchName := "" |
| 23 | if strings.HasPrefix(refspec, branchRef) { |
| 24 | branchName = strings.TrimPrefix(refspec, branchRef) |
| 25 | refspec = fmt.Sprintf("refs/remotes/%s/%s", remoteName, branchName) |
| 26 | } |
| 27 | |
| 28 | ref, err := p.repo.References.Lookup(refspec) |
| 29 | if err != nil { |
| 30 | return err |
| 31 | } |
| 32 | |
| 33 | // get annotated commit of fetched branch's tip |
| 34 | aCommit, err := p.repo.AnnotatedCommitFromRef(ref) |
| 35 | if err != nil { |
| 36 | return err |
| 37 | } |
| 38 | |
| 39 | head, err := p.repo.Head() |
| 40 | // create new branch for head if doesn't exist |
| 41 | if err != nil && strings.HasSuffix(err.Error(), "not found") { |
| 42 | branch := "master" |
| 43 | if len(branchName) != 0 { |
| 44 | branch = branchName |
| 45 | } |
| 46 | |
| 47 | commit, err := ref.Peel(git.ObjectCommit) |
| 48 | if err != nil { |
| 49 | return err |
| 50 | } |
| 51 | |
| 52 | if _, err = p.repo.CreateBranch(branch, commit.(*git.Commit), false); err != nil { |
| 53 | return err |
| 54 | } |
| 55 | |
| 56 | return p.repo.SetHead(fmt.Sprintf("refs/heads/%s", branch)) |
| 57 | } else if err != nil { |
| 58 | return err |
| 59 | } |
| 60 | |
| 61 | path, err := p.TempWorkdir() |
| 62 | if err != nil { |
| 63 | return fmt.Errorf("could not setup temporary working directory: %v", err) |
| 64 | } |
| 65 | defer p.CleanupWorkdir(path) |
| 66 | |
| 67 | // Perform analysis of merge |
| 68 | mergeHeads := []*git.AnnotatedCommit{aCommit} |
| 69 | analysis, _, err := p.repo.MergeAnalysis(mergeHeads) |
| 70 | if err != nil { |
| 71 | return err |
| 72 | } |
nothing calls this directly
no test coverage detected