func isTempBranchHash(hash string) (bool, error) { // Check whether the temp branch actually exists. // Obviously we want to return false when there is no such branch. exists, err := git.LocalBranchExists(constants.TempBranchName) if err != nil { return false, err } if !exists { return false, nil } // In case the temp branch exists, compare the hashes. tempHash, err := git.BranchHexsha(constants.TempBranchName) if err != nil { return false, err } return tempHash == hash, nil }
func merge(mergeTask, current, parent string) (act action.Action, err error) { // Remember the current branch hash. currentSHA, err := git.BranchHexsha(current) if err != nil { return nil, err } // Checkout the parent branch so that we can perform the merge. if err := git.Checkout(parent); err != nil { return nil, err } // Checkout the current branch on return to be consistent. defer func() { if ex := git.Checkout(current); ex != nil { if err == nil { err = ex } else { errs.Log(ex) } } }() // Perform the merge. // Use --no-ff in case -merge_no_ff is set. if flagMergeNoFF { err = git.Merge(current, "--no-ff") } else { err = git.Merge(current) } if err != nil { return nil, err } // Return a rollback action. return action.ActionFunc(func() (err error) { log.Rollback(mergeTask) task := fmt.Sprintf("Reset branch '%v' to the original position", current) // Get the branch is the current branch now. currentNow, err := gitutil.CurrentBranch() if err != nil { return errs.NewError(task, err) } // Checkout current in case it is not the same as the current branch now. if currentNow != current { if err := git.Checkout(current); err != nil { return errs.NewError(task, err) } defer func() { if ex := git.Checkout(currentNow); ex != nil { if err == nil { err = ex } else { errs.Log(ex) } } }() } // Reset the branch to the original position. if err := git.Reset("--keep", currentSHA); err != nil { return errs.NewError(task, err) } return nil }), nil }