func()

in pkg/git/git.go [104:156]


func (gp *GitProvider) CreateRemoteBranch(key, user, p, name, fromcommit string, port int32) error {
	log.Info("start creating remote branch", logBranchNameKey, name)

	r, err := git.PlainOpen(p)
	if err != nil {
		return fmt.Errorf(errPlainOpenTmpl, p, err)
	}

	ref, err := r.Head()
	if err != nil {
		return fmt.Errorf("failed to get git HEAD reference: %w", err)
	}

	if fromcommit != "" {
		_, err = r.CommitObject(plumbing.NewHash(fromcommit))
		if err != nil {
			return fmt.Errorf("failed to get commit %s: %w", fromcommit, err)
		}

		ref = plumbing.NewReferenceFromStrings(name, fromcommit)
	}

	branches, err := r.Branches()
	if err != nil {
		return fmt.Errorf("failed to get branches iterator: %w", err)
	}

	exists, err := isBranchExists(name, branches)
	if err != nil {
		return err
	}

	if exists {
		log.Info("branch already exists. skip creating", logBranchNameKey, name)
		return nil
	}

	newRef := plumbing.NewReferenceFromStrings(fmt.Sprintf("refs/heads/%v", name), ref.Hash().String())

	err = r.Storer.SetReference(newRef)
	if err != nil {
		return fmt.Errorf("failed to set refference: %w", err)
	}

	err = gp.PushChanges(key, user, p, port, "--all")
	if err != nil {
		return err
	}

	log.Info("branch has been created", logBranchNameKey, name)

	return nil
}