func()

in tools/eksDistroBuildToolingOpsTools/pkg/git/gogitClient.go [249:307]


func (g *GogitClient) Branch(name string) error {
	r, err := g.Client.OpenRepo()
	if err != nil {
		return fmt.Errorf("creating branch %s: %v", name, err)
	}

	localBranchRef := plumbing.NewBranchReferenceName(name)

	branchOpts := &config.Branch{
		Name:   name,
		Remote: gogit.DefaultRemoteName,
		Merge:  localBranchRef,
		Rebase: "true",
	}

	err = g.Client.CreateBranch(r, branchOpts)
	branchExistsLocally := errors.Is(err, gogit.ErrBranchExists)

	if err != nil && !branchExistsLocally {
		return fmt.Errorf("creating branch %s: %v", name, err)
	}

	if branchExistsLocally {
		logger.V(4).Info("Branch already exists locally", "branch", name)
	}

	if !branchExistsLocally {
		logger.V(4).Info("Branch does not exist locally", "branch", name)
		headref, err := g.Client.Head(r)
		if err != nil {
			return fmt.Errorf("creating branch %s: %v", name, err)
		}
		h := headref.Hash()
		err = g.Client.SetRepositoryReference(r, plumbing.NewHashReference(localBranchRef, h))
		if err != nil {
			return fmt.Errorf("creating branch %s: %v", name, err)
		}
	}

	w, err := g.Client.OpenWorktree(r)
	if err != nil {
		return fmt.Errorf("creating branch %s: %v", name, err)
	}

	err = g.Client.Checkout(w, &gogit.CheckoutOptions{
		Branch: plumbing.ReferenceName(localBranchRef.String()),
		Force:  true,
	})
	if err != nil {
		return fmt.Errorf("creating branch %s: %v", name, err)
	}

	err = g.pullIfRemoteExists(r, w, name, localBranchRef)
	if err != nil {
		return fmt.Errorf("creating branch %s: %v", name, err)
	}

	return nil
}