func createProject()

in internal/provider/sdk/resource_gitlab_project.go [2137:2489]


func createProject(ctx context.Context, d *schema.ResourceData, client *gitlab.Client) (*gitlab.Project, diag.Diagnostics) {
	options := &gitlab.CreateProjectOptions{
		Name: gitlab.Ptr(d.Get("name").(string)),
	}

	if v, ok := d.GetOk("path"); ok {
		options.Path = gitlab.Ptr(v.(string))
	}

	if v, ok := d.GetOk("namespace_id"); ok {
		options.NamespaceID = gitlab.Ptr(v.(int))
	}

	if v, ok := d.GetOk("description"); ok {
		options.Description = gitlab.Ptr(v.(string))
	}

	if v, ok := d.GetOk("default_branch"); ok {
		options.DefaultBranch = gitlab.Ptr(v.(string))
	}

	if v, ok := d.GetOk("tags"); ok {
		// TODO: Remove TagList on next breaking change. TagList and Topics aren't completely synonymous.
		// nolint:staticcheck // SA1019
		options.TagList = stringSetToStringSlice(v.(*schema.Set))
	}

	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("container_registry_enabled"); ok {
		// nolint:staticcheck // SA1019
		options.ContainerRegistryEnabled = gitlab.Ptr(v.(bool))
	}

	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("initialize_with_readme"); ok {
		options.InitializeWithReadme = gitlab.Ptr(v.(bool))
	}

	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("pipelines_enabled"); ok {
		// nolint:staticcheck // SA1019
		options.JobsEnabled = gitlab.Ptr(v.(bool))
	}

	if v, ok := d.GetOk("import_url"); ok {
		importURL, err := constructImportUrl(v.(string), d.Get("import_url_username").(string), d.Get("import_url_password").(string))
		if err != nil {
			return nil, diag.Errorf("Unable to construct import URL for API: %s", err)
		}
		options.ImportURL = gitlab.Ptr(importURL)
	}

	if v, ok := d.GetOk("template_name"); ok {
		options.TemplateName = gitlab.Ptr(v.(string))
	}

	if v, ok := d.GetOk("template_project_id"); ok {
		options.TemplateProjectID = gitlab.Ptr(v.(int))
	}

	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("use_custom_template"); ok {
		// There is currently a bug where `use_custom_template` returns a 500 if the
		// value is set to `false`, requiring it to be set to `null` instead to work.
		// As a result, only apply this value if it's "true"
		if v.(bool) {
			options.UseCustomTemplate = gitlab.Ptr(v.(bool))
		}
	}

	if v, ok := d.GetOk("group_with_project_templates_id"); ok {
		options.GroupWithProjectTemplatesID = gitlab.Ptr(v.(int))
	}

	if v, ok := d.GetOk("pages_access_level"); ok {
		options.PagesAccessLevel = stringToAccessControlValue(v.(string))
	}

	if v, ok := d.GetOk("ci_config_path"); ok {
		options.CIConfigPath = gitlab.Ptr(v.(string))
	}

	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("resolve_outdated_diff_discussions"); ok {
		options.ResolveOutdatedDiffDiscussions = gitlab.Ptr(v.(bool))
	}

	if v, ok := d.GetOk("analytics_access_level"); ok {
		options.AnalyticsAccessLevel = stringToAccessControlValue(v.(string))
	}

	if v, ok := d.GetOk("auto_cancel_pending_pipelines"); ok {
		options.AutoCancelPendingPipelines = gitlab.Ptr(v.(string))
	}

	if v, ok := d.GetOk("auto_devops_deploy_strategy"); ok {
		options.AutoDevopsDeployStrategy = gitlab.Ptr(v.(string))
	}

	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("auto_devops_enabled"); ok {
		options.AutoDevopsEnabled = gitlab.Ptr(v.(bool))
	}

	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("autoclose_referenced_issues"); ok {
		options.AutocloseReferencedIssues = gitlab.Ptr(v.(bool))
	}

	if v, ok := d.GetOk("build_git_strategy"); ok {
		options.BuildGitStrategy = gitlab.Ptr(v.(string))
	}

	if v, ok := d.GetOk("build_timeout"); ok {
		options.BuildTimeout = gitlab.Ptr(v.(int))
	}

	if v, ok := d.GetOk("builds_access_level"); ok {
		options.BuildsAccessLevel = stringToAccessControlValue(v.(string))
	}

	if _, ok := d.GetOk("container_expiration_policy"); ok {
		options.ContainerExpirationPolicyAttributes = expandContainerExpirationPolicyAttributes(d)
	}

	if v, ok := d.GetOk("container_registry_access_level"); ok {
		options.ContainerRegistryAccessLevel = stringToAccessControlValue(v.(string))
	}

	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("emails_enabled"); ok {
		options.EmailsEnabled = gitlab.Ptr(v.(bool))
	}

	if v, ok := d.GetOk("external_authorization_classification_label"); ok {
		options.ExternalAuthorizationClassificationLabel = gitlab.Ptr(v.(string))
	}

	if v, ok := d.GetOk("forking_access_level"); ok {
		options.ForkingAccessLevel = stringToAccessControlValue(v.(string))
	}

	if v, ok := d.GetOk("issues_access_level"); ok {
		options.IssuesAccessLevel = stringToAccessControlValue(v.(string))
	}

	if v, ok := d.GetOk("merge_requests_access_level"); ok {
		options.MergeRequestsAccessLevel = stringToAccessControlValue(v.(string))
	}

	// Ignore deprecated public_builds in favor of public_jobs.
	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("public_jobs"); ok {
		options.PublicBuilds = gitlab.Ptr(v.(bool))
	} else if v, ok := d.GetOkExists("public_builds"); ok {
		options.PublicBuilds = gitlab.Ptr(v.(bool))
	}

	if v, ok := d.GetOk("repository_access_level"); ok {
		options.RepositoryAccessLevel = stringToAccessControlValue(v.(string))
	}

	if v, ok := d.GetOk("repository_storage"); ok {
		options.RepositoryStorage = gitlab.Ptr(v.(string))
	}

	if v, ok := d.GetOk("requirements_access_level"); ok {
		options.RequirementsAccessLevel = stringToAccessControlValue(v.(string))
	}

	if v, ok := d.GetOk("security_and_compliance_access_level"); ok {
		options.SecurityAndComplianceAccessLevel = stringToAccessControlValue(v.(string))
	}

	if v, ok := d.GetOk("snippets_access_level"); ok {
		options.SnippetsAccessLevel = stringToAccessControlValue(v.(string))
	}

	if v, ok := d.GetOk("suggestion_commit_message"); ok {
		options.SuggestionCommitMessage = gitlab.Ptr(v.(string))
	}

	if v, ok := d.GetOk("topics"); ok {
		options.Topics = stringSetToStringSlice(v.(*schema.Set))
	}

	if v, ok := d.GetOk("wiki_access_level"); ok {
		options.WikiAccessLevel = stringToAccessControlValue(v.(string))
	}

	if v, ok := d.GetOk("squash_commit_template"); ok {
		options.SquashCommitTemplate = gitlab.Ptr(v.(string))
	}

	if v, ok := d.GetOk("merge_commit_template"); ok {
		options.MergeCommitTemplate = gitlab.Ptr(v.(string))
	}

	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("request_access_enabled"); ok {
		options.RequestAccessEnabled = gitlab.Ptr(v.(bool))
	}
	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("issues_enabled"); ok {
		options.IssuesEnabled = gitlab.Ptr(v.(bool))
	}
	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("merge_requests_enabled"); ok {
		// nolint:staticcheck // SA1019
		options.MergeRequestsEnabled = gitlab.Ptr(v.(bool))
	}

	if v, ok := d.GetOk("approvals_before_merge"); ok {
		options.ApprovalsBeforeMerge = gitlab.Ptr(v.(int)) //nolint:staticcheck
	}

	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("wiki_enabled"); ok {
		// nolint:staticcheck // SA1019
		options.WikiEnabled = gitlab.Ptr(v.(bool))
	}
	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("snippets_enabled"); ok {
		// nolint:staticcheck // SA1019
		options.SnippetsEnabled = gitlab.Ptr(v.(bool))
	}
	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("lfs_enabled"); ok {
		options.LFSEnabled = gitlab.Ptr(v.(bool))
	}

	if v, ok := d.GetOk("visibility_level"); ok {
		options.Visibility = stringToVisibilityLevel(v.(string))
	}

	if v, ok := d.GetOk("merge_method"); ok {
		options.MergeMethod = stringToMergeMethod(v.(string))
	}

	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("only_allow_merge_if_pipeline_succeeds"); ok {
		options.OnlyAllowMergeIfPipelineSucceeds = gitlab.Ptr(v.(bool))
	}
	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("only_allow_merge_if_all_discussions_are_resolved"); ok {
		options.OnlyAllowMergeIfAllDiscussionsAreResolved = gitlab.Ptr(v.(bool))
	}
	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("allow_merge_on_skipped_pipeline"); ok {
		options.AllowMergeOnSkippedPipeline = gitlab.Ptr(v.(bool))
	}
	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("shared_runners_enabled"); ok {
		options.SharedRunnersEnabled = gitlab.Ptr(v.(bool))
	}
	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("group_runners_enabled"); ok {
		options.GroupRunnersEnabled = gitlab.Ptr(v.(bool))
	}
	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("remove_source_branch_after_merge"); ok {
		options.RemoveSourceBranchAfterMerge = gitlab.Ptr(v.(bool))
	}
	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("packages_enabled"); ok {
		options.PackagesEnabled = gitlab.Ptr(v.(bool))
	}
	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("printing_merge_request_link_enabled"); ok {
		options.PrintingMergeRequestLinkEnabled = gitlab.Ptr(v.(bool))
	}
	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("mirror"); ok {
		options.Mirror = gitlab.Ptr(v.(bool))
	}
	// nolint:staticcheck // SA1019 ignore deprecated GetOkExists
	// lintignore: XR001 // TODO: replace with alternative for GetOkExists
	if v, ok := d.GetOkExists("mirror_trigger_builds"); ok {
		options.MirrorTriggerBuilds = gitlab.Ptr(v.(bool))
	}

	if v, ok := d.GetOk("ci_config_path"); ok {
		options.CIConfigPath = gitlab.Ptr(v.(string))
	}

	if v, ok := d.GetOk("squash_option"); ok {
		options.SquashOption = stringToSquashOptionValue(v.(string))
	}

	avatar, err := handleAvatarOnCreate(d)
	if err != nil {
		return nil, diag.FromErr(err)
	}
	if avatar != nil {
		options.Avatar = &gitlab.ProjectAvatar{
			Filename: avatar.Filename,
			Image:    avatar.Image,
		}
	}

	if v, ok := d.GetOk("releases_access_level"); ok {
		options.ReleasesAccessLevel = stringToAccessControlValue(v.(string))
	}

	if v, ok := d.GetOk("environments_access_level"); ok {
		options.EnvironmentsAccessLevel = stringToAccessControlValue(v.(string))
	}

	if v, ok := d.GetOk("feature_flags_access_level"); ok {
		options.FeatureFlagsAccessLevel = stringToAccessControlValue(v.(string))
	}

	if v, ok := d.GetOk("infrastructure_access_level"); ok {
		options.InfrastructureAccessLevel = stringToAccessControlValue(v.(string))
	}

	if v, ok := d.GetOk("monitor_access_level"); ok {
		options.MonitorAccessLevel = stringToAccessControlValue(v.(string))
	}

	tflog.Debug(ctx, fmt.Sprintf("[DEBUG] create gitlab project %q", *options.Name))

	project, _, err := client.Projects.CreateProject(options, gitlab.WithContext(ctx))
	if err != nil {
		return nil, diag.FromErr(err)
	}

	return project, nil
}