Skip to content

Instantly share code, notes, and snippets.

@sithembiso
Last active March 15, 2023 16:17

Revisions

  1. sithembiso revised this gist Oct 26, 2015. 1 changed file with 28 additions and 38 deletions.
    66 changes: 28 additions & 38 deletions pull.go
    Original file line number Diff line number Diff line change
    @@ -10,7 +10,7 @@ func (repo *Repo) Pull() error {
    return err
    }

    // Fetch remote changes
    // Locate remote
    remote, err := repo.Remotes.Lookup("origin")
    if err != nil {
    return err
    @@ -41,50 +41,16 @@ func (repo *Repo) Pull() error {
    if err != nil {
    return err
    }
    fmt.Println(analysis)
    fmt.Println(
    git.MergeAnalysisNone,
    git.MergeAnalysisNormal,
    git.MergeAnalysisUnborn,
    git.MergeAnalysisUpToDate,
    git.MergeAnalysisFastForward,
    )

    // Get repo head
    head, err := repo.Head()
    if err != nil {
    return err
    }

    if analysis == git.MergeAnalysisUpToDate {
    if analysis & git.MergeAnalysisUpToDate != 0 {
    return nil
    } else if analysis == git.MergeAnalysisFastForward {

    // Fast-forward changes
    // Get remote tree
    remoteTree, err := repo.LookupTree(remoteBranchID)
    if err != nil {
    return err
    }

    // Checkout
    if err := repo.CheckoutTree(remoteTree, nil); err != nil {
    return err
    }

    branchRef, err := repo.References.Lookup("refs/heads/"+name)
    if err != nil {
    return err
    }

    // Point branch to the object
    branchRef.SetTarget(remoteBranchID, "")
    if _, err := head.SetTarget(remoteBranchID, ""); err != nil {
    return err
    }

    } else if analysis == git.MergeAnalysisNormal {
    fmt.Println("Analysing")
    } else if analysis & git.MergeAnalysisNormal != 0 {
    // Just merge changes
    if err := repo.Merge([]*git.AnnotatedCommit{annotatedCommit}, nil, nil); err != nil {
    return err
    @@ -96,7 +62,7 @@ func (repo *Repo) Pull() error {
    }

    if index.HasConflicts() {
    return errors.New("Conflicts encountered")
    return errors.New("Conflicts encountered. Please resolve them.")
    }

    // Make the merge commit
    @@ -130,6 +96,30 @@ func (repo *Repo) Pull() error {

    // Clean up
    repo.StateCleanup()
    } else if analysis & git.MergeAnalysisFastForward != 0 {
    // Fast-forward changes
    // Get remote tree
    remoteTree, err := repo.LookupTree(remoteBranchID)
    if err != nil {
    return err
    }

    // Checkout
    if err := repo.CheckoutTree(remoteTree, nil); err != nil {
    return err
    }

    branchRef, err := repo.References.Lookup("refs/heads/"+name)
    if err != nil {
    return err
    }

    // Point branch to the object
    branchRef.SetTarget(remoteBranchID, "")
    if _, err := head.SetTarget(remoteBranchID, ""); err != nil {
    return err
    }

    } else {
    return fmt.Errorf("Unexpected merge analysis result %d", analysis)
    }
  2. sithembiso created this gist Oct 26, 2015.
    138 changes: 138 additions & 0 deletions pull.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,138 @@
    func (repo *Repo) Pull() error {
    branch, err := repo.Branch()
    if err != nil {
    return err
    }

    // Get the name
    name, err := branch.Name()
    if err != nil {
    return err
    }

    // Fetch remote changes
    remote, err := repo.Remotes.Lookup("origin")
    if err != nil {
    return err
    }

    // Fetch changes from remote
    if err := remote.Fetch([]string{}, nil, ""); err != nil {
    return err
    }

    // Get remote master
    remoteBranch, err := repo.References.Lookup("refs/remotes/origin/"+name)
    if err != nil {
    return err
    }

    remoteBranchID := remoteBranch.Target()
    // Get annotated commit
    annotatedCommit, err := repo.AnnotatedCommitFromRef(remoteBranch)
    if err != nil {
    return err
    }

    // Do the merge analysis
    mergeHeads := make([]*git.AnnotatedCommit, 1)
    mergeHeads[0] = annotatedCommit
    analysis, _, err := repo.MergeAnalysis(mergeHeads)
    if err != nil {
    return err
    }
    fmt.Println(analysis)
    fmt.Println(
    git.MergeAnalysisNone,
    git.MergeAnalysisNormal,
    git.MergeAnalysisUnborn,
    git.MergeAnalysisUpToDate,
    git.MergeAnalysisFastForward,
    )

    // Get repo head
    head, err := repo.Head()
    if err != nil {
    return err
    }

    if analysis == git.MergeAnalysisUpToDate {
    return nil
    } else if analysis == git.MergeAnalysisFastForward {

    // Fast-forward changes
    // Get remote tree
    remoteTree, err := repo.LookupTree(remoteBranchID)
    if err != nil {
    return err
    }

    // Checkout
    if err := repo.CheckoutTree(remoteTree, nil); err != nil {
    return err
    }

    branchRef, err := repo.References.Lookup("refs/heads/"+name)
    if err != nil {
    return err
    }

    // Point branch to the object
    branchRef.SetTarget(remoteBranchID, "")
    if _, err := head.SetTarget(remoteBranchID, ""); err != nil {
    return err
    }

    } else if analysis == git.MergeAnalysisNormal {
    fmt.Println("Analysing")
    // Just merge changes
    if err := repo.Merge([]*git.AnnotatedCommit{annotatedCommit}, nil, nil); err != nil {
    return err
    }
    // Check for conflicts
    index, err := repo.Index()
    if err != nil {
    return err
    }

    if index.HasConflicts() {
    return errors.New("Conflicts encountered")
    }

    // Make the merge commit
    sig, err := repo.DefaultSignature()
    if err != nil {
    return err
    }

    // Get Write Tree
    treeId, err := index.WriteTree()
    if err != nil {
    return err
    }

    tree, err := repo.LookupTree(treeId)
    if err != nil {
    return err
    }

    localCommit, err := repo.LookupCommit(head.Target())
    if err != nil {
    return err
    }

    remoteCommit, err := repo.LookupCommit(remoteBranchID)
    if err != nil {
    return err
    }

    repo.CreateCommit("HEAD", sig, sig, "", tree, localCommit, remoteCommit)

    // Clean up
    repo.StateCleanup()
    } else {
    return fmt.Errorf("Unexpected merge analysis result %d", analysis)
    }

    return nil
    }