func()

in controllers/merge_request/controller.go [229:283]


func (r *Reconcile) createChange(ctx context.Context,
	instance *gerritApi.GerritMergeRequest,
) (status *gerritApi.GerritMergeRequestStatus, retErr error) {
	// init git client
	gitClient, err := r.getGitClient(ctx, instance, r.gitWorkDir)
	if err != nil {
		return nil, errors.Wrap(err, "unable to init git client")
	}

	// clone project
	projectPath, err := gitClient.Clone(instance.Spec.ProjectName)
	if err != nil {
		return nil, errors.Wrap(err, "unable to clone repo")
	}

	// clear cloned project
	defer func() {
		if remErr := os.RemoveAll(projectPath); remErr != nil {
			retErr = remErr
		}
	}()

	// generate change id for commit or merge
	changeID, err := gitClient.GenerateChangeID()
	if err != nil {
		return nil, errors.Wrap(err, "unable to generate change id")
	}

	// perform merge or commit files from config map
	if instance.Spec.SourceBranch != "" {
		err = mergeBranches(instance, gitClient, changeID)
		if err != nil {
			return nil, errors.Wrap(err, "unable to perform merge")
		}
	} else {
		err = r.commitFiles(ctx, instance, gitClient, changeID)
		if err != nil {
			return nil, errors.Wrap(err, "unable to commit files")
		}
	}

	// push changes for review
	refSpec := fmt.Sprintf("HEAD:refs/for/%s", instance.TargetBranch())

	pushMessage, err := gitClient.Push(instance.Spec.ProjectName, "origin", refSpec)
	if err != nil {
		return nil, errors.Wrap(err, "unable to push repo")
	}

	return &gerritApi.GerritMergeRequestStatus{
		ChangeID:  changeID,
		ChangeURL: extractMrURL(pushMessage),
		Value:     StatusNew,
	}, nil
}