in internal/provider/sdk/resource_gitlab_repository_file.go [133:246]
func resourceGitlabRepositoryFileCreate(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
project := d.Get("project").(string)
filePath := d.Get("file_path").(string)
tflog.Debug(ctx, fmt.Sprintf("[DEBUG] gitlab_repository_file: waiting for lock to create %s/%s", project, filePath))
if err := resourceGitlabRepositoryFileApiLock.lock(ctx); err != nil {
return diag.FromErr(err)
}
defer resourceGitlabRepositoryFileApiLock.unlock()
tflog.Debug(ctx, fmt.Sprintf("[DEBUG] gitlab_repository_file: got lock to create %s/%s", project, filePath))
client := meta.(*gitlab.Client)
content := d.Get("content").(string)
options := &gitlab.CreateFileOptions{
Branch: gitlab.Ptr(d.Get("branch").(string)),
AuthorEmail: gitlab.Ptr(d.Get("author_email").(string)),
AuthorName: gitlab.Ptr(d.Get("author_name").(string)),
Encoding: gitlab.Ptr(d.Get("encoding").(string)),
Content: gitlab.Ptr(content),
}
if startBranch, ok := d.GetOk("start_branch"); ok {
options.StartBranch = gitlab.Ptr(startBranch.(string))
}
if executeFilemode, ok := d.GetOk("execute_filemode"); ok {
options.ExecuteFilemode = gitlab.Ptr(executeFilemode.(bool))
}
if commitMessage, ok := d.GetOk("commit_message"); ok {
options.CommitMessage = gitlab.Ptr(commitMessage.(string))
} else {
options.CommitMessage = gitlab.Ptr(d.Get("create_commit_message").(string))
}
if overwriteOnCreate, ok := d.GetOk("overwrite_on_create"); ok && overwriteOnCreate.(bool) {
readOptions := &gitlab.GetFileOptions{
Ref: gitlab.Ptr(*options.Branch),
}
var existingRepositoryFile *gitlab.File
// Try to get the file to check if it exists
err := retry.RetryContext(ctx, d.Timeout(schema.TimeoutUpdate), func() *retry.RetryError {
var err error
existingRepositoryFile, _, err = client.RepositoryFiles.GetFile(project, filePath, readOptions, gitlab.WithContext(ctx))
if err != nil {
if isRefreshError(err) {
return retry.RetryableError(err)
}
if !api.Is404(err) {
return retry.NonRetryableError(err)
}
}
if existingRepositoryFile != nil {
tflog.Debug(ctx, fmt.Sprintf("[DEBUG] %s already exists and overwrite_on_create is true. File will be overwritten.", filePath))
updateOptions := &gitlab.UpdateFileOptions{
Branch: gitlab.Ptr(*options.Branch),
AuthorEmail: gitlab.Ptr(d.Get("author_email").(string)),
AuthorName: gitlab.Ptr(d.Get("author_name").(string)),
Encoding: gitlab.Ptr(d.Get("encoding").(string)),
Content: gitlab.Ptr(content),
}
if startBranch, ok := d.GetOk("start_branch"); ok {
updateOptions.StartBranch = gitlab.Ptr(startBranch.(string))
}
if executeFilemode, ok := d.GetOk("execute_filemode"); ok {
updateOptions.ExecuteFilemode = gitlab.Ptr(executeFilemode.(bool))
}
if commitMessage, ok := d.GetOk("commit_message"); ok {
updateOptions.CommitMessage = gitlab.Ptr(commitMessage.(string))
} else {
updateOptions.CommitMessage = gitlab.Ptr(d.Get("update_commit_message").(string))
}
updateOptions.LastCommitID = gitlab.Ptr(existingRepositoryFile.LastCommitID)
_, _, err := client.RepositoryFiles.UpdateFile(project, filePath, updateOptions, gitlab.WithContext(ctx))
if err != nil {
if isRefreshError(err) {
return retry.RetryableError(err)
}
return retry.NonRetryableError(err)
}
}
return nil
})
if err != nil {
return diag.FromErr(err)
}
if existingRepositoryFile != nil {
d.SetId(resourceGitLabRepositoryFileBuildId(project, *options.Branch, existingRepositoryFile.FilePath))
return resourceGitlabRepositoryFileRead(ctx, d, meta)
}
}
err := retry.RetryContext(ctx, d.Timeout(schema.TimeoutCreate), func() *retry.RetryError {
repositoryFile, _, err := client.RepositoryFiles.CreateFile(project, filePath, options, gitlab.WithContext(ctx))
if err != nil {
if isRefreshError(err) {
return retry.RetryableError(err)
}
return retry.NonRetryableError(err)
}
d.SetId(resourceGitLabRepositoryFileBuildId(project, repositoryFile.Branch, repositoryFile.FilePath))
return nil
})
if err != nil {
return diag.FromErr(err)
}
return resourceGitlabRepositoryFileRead(ctx, d, meta)
}