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
}