@@ -915,129 +915,141 @@ func resourceGitlabProjectDelete(ctx context.Context, d *schema.ResourceData, me
915
915
func editOrAddPushRules (ctx context.Context , client * gitlab.Client , projectID string , d * schema.ResourceData ) error {
916
916
log .Printf ("[DEBUG] Editing push rules for project %q" , projectID )
917
917
918
- editOptions := expandEditProjectPushRuleOptions (d )
919
- _ , _ , err := client .Projects .EditProjectPushRule (projectID , editOptions , gitlab .WithContext (ctx ))
920
- if err == nil {
921
- return nil
922
- }
918
+ pushRules , _ , err := client .Projects .GetProjectPushRules (d .Id (), gitlab .WithContext (ctx ))
919
+ if is404 (err ) || pushRules .ID == 0 {
920
+ if addOptions , needToAdd := expandAddProjectPushRuleOptions (d ); needToAdd {
921
+ log .Printf ("[DEBUG] Creating new push rules for project %q" , projectID )
922
+ _ , _ , err = client .Projects .AddProjectPushRule (projectID , addOptions , gitlab .WithContext (ctx ))
923
+ if err != nil {
924
+ return err
925
+ }
926
+ } else {
927
+ log .Printf ("[DEBUG] Don't create new push rules for defaults for project %q" , projectID )
928
+ }
923
929
924
- var httpErr * gitlab.ErrorResponse
925
- if ! errors .As (err , & httpErr ) || httpErr .Response .StatusCode != http .StatusNotFound {
926
- return err
930
+ return nil
927
931
}
928
932
929
- // A 404 could mean that the push rules need to be re-created.
930
-
931
- log .Printf ("[DEBUG] Failed to edit push rules for project %q: %v" , projectID , err )
932
- log .Printf ("[DEBUG] Creating new push rules for project %q" , projectID )
933
-
934
- addOptions := expandAddProjectPushRuleOptions (d )
935
- _ , _ , err = client .Projects .AddProjectPushRule (projectID , addOptions , gitlab .WithContext (ctx ))
936
- if err != nil {
937
- return err
933
+ editOptions := expandEditProjectPushRuleOptions (d , pushRules )
934
+ log .Printf ("[DEBUG] Editing existing push rules for project %q" , projectID )
935
+ _ , _ , err = client .Projects .EditProjectPushRule (projectID , editOptions , gitlab .WithContext (ctx ))
936
+ if err == nil {
937
+ return nil
938
938
}
939
939
940
940
return nil
941
941
}
942
942
943
- func expandEditProjectPushRuleOptions (d * schema.ResourceData ) * gitlab.EditProjectPushRuleOptions {
943
+ func expandEditProjectPushRuleOptions (d * schema.ResourceData , currentPushRules * gitlab. ProjectPushRules ) * gitlab.EditProjectPushRuleOptions {
944
944
options := & gitlab.EditProjectPushRuleOptions {}
945
945
946
- if d .HasChange ("push_rules.0.author_email_regex" ) {
946
+ if d .HasChange ("push_rules.0.author_email_regex" ) || d . Get ( "push_rules.0.author_email_regex" ) != currentPushRules . AuthorEmailRegex {
947
947
options .AuthorEmailRegex = gitlab .String (d .Get ("push_rules.0.author_email_regex" ).(string ))
948
948
}
949
949
950
- if d .HasChange ("push_rules.0.branch_name_regex" ) {
950
+ if d .HasChange ("push_rules.0.branch_name_regex" ) || d . Get ( "push_rules.0.branch_name_regex" ) != currentPushRules . BranchNameRegex {
951
951
options .BranchNameRegex = gitlab .String (d .Get ("push_rules.0.branch_name_regex" ).(string ))
952
952
}
953
953
954
- if d .HasChange ("push_rules.0.commit_message_regex" ) {
954
+ if d .HasChange ("push_rules.0.commit_message_regex" ) || d . Get ( "push_rules.0.commit_message_regex" ) != currentPushRules . CommitMessageRegex {
955
955
options .CommitMessageRegex = gitlab .String (d .Get ("push_rules.0.commit_message_regex" ).(string ))
956
956
}
957
957
958
- if d .HasChange ("push_rules.0.commit_message_negative_regex" ) {
958
+ if d .HasChange ("push_rules.0.commit_message_negative_regex" ) || d . Get ( "push_rules.0.commit_message_negative_regex" ) != currentPushRules . CommitMessageNegativeRegex {
959
959
options .CommitMessageNegativeRegex = gitlab .String (d .Get ("push_rules.0.commit_message_negative_regex" ).(string ))
960
960
}
961
961
962
- if d .HasChange ("push_rules.0.file_name_regex" ) {
962
+ if d .HasChange ("push_rules.0.file_name_regex" ) || d . Get ( "push_rules.0.file_name_regex" ) != currentPushRules . FileNameRegex {
963
963
options .FileNameRegex = gitlab .String (d .Get ("push_rules.0.file_name_regex" ).(string ))
964
964
}
965
965
966
- if d .HasChange ("push_rules.0.commit_committer_check" ) {
966
+ if d .HasChange ("push_rules.0.commit_committer_check" ) || d . Get ( "push_rules.0.commit_committer_check" ) != currentPushRules . CommitCommitterCheck {
967
967
options .CommitCommitterCheck = gitlab .Bool (d .Get ("push_rules.0.commit_committer_check" ).(bool ))
968
968
}
969
969
970
- if d .HasChange ("push_rules.0.deny_delete_tag" ) {
970
+ if d .HasChange ("push_rules.0.deny_delete_tag" ) || d . Get ( "push_rules.0.deny_delete_tag" ) != currentPushRules . DenyDeleteTag {
971
971
options .DenyDeleteTag = gitlab .Bool (d .Get ("push_rules.0.deny_delete_tag" ).(bool ))
972
972
}
973
973
974
- if d .HasChange ("push_rules.0.member_check" ) {
974
+ if d .HasChange ("push_rules.0.member_check" ) || d . Get ( "push_rules.0.member_check" ) != currentPushRules . MemberCheck {
975
975
options .MemberCheck = gitlab .Bool (d .Get ("push_rules.0.member_check" ).(bool ))
976
976
}
977
977
978
- if d .HasChange ("push_rules.0.prevent_secrets" ) {
978
+ if d .HasChange ("push_rules.0.prevent_secrets" ) || d . Get ( "push_rules.0.prevent_secrets" ) != currentPushRules . PreventSecrets {
979
979
options .PreventSecrets = gitlab .Bool (d .Get ("push_rules.0.prevent_secrets" ).(bool ))
980
980
}
981
981
982
- if d .HasChange ("push_rules.0.reject_unsigned_commits" ) {
982
+ if d .HasChange ("push_rules.0.reject_unsigned_commits" ) || d . Get ( "push_rules.0.reject_unsigned_commits" ) != currentPushRules . RejectUnsignedCommits {
983
983
options .RejectUnsignedCommits = gitlab .Bool (d .Get ("push_rules.0.reject_unsigned_commits" ).(bool ))
984
984
}
985
985
986
- if d .HasChange ("push_rules.0.max_file_size" ) {
986
+ if d .HasChange ("push_rules.0.max_file_size" ) || d . Get ( "push_rules.0.max_file_size" ) != currentPushRules . MaxFileSize {
987
987
options .MaxFileSize = gitlab .Int (d .Get ("push_rules.0.max_file_size" ).(int ))
988
988
}
989
989
990
990
return options
991
991
}
992
992
993
- func expandAddProjectPushRuleOptions (d * schema.ResourceData ) * gitlab.AddProjectPushRuleOptions {
993
+ func expandAddProjectPushRuleOptions (d * schema.ResourceData ) ( * gitlab.AddProjectPushRuleOptions , bool ) {
994
994
options := & gitlab.AddProjectPushRuleOptions {}
995
+ needToAdd := false
995
996
996
997
if v , ok := d .GetOk ("push_rules.0.author_email_regex" ); ok {
997
998
options .AuthorEmailRegex = gitlab .String (v .(string ))
999
+ needToAdd = true
998
1000
}
999
1001
1000
1002
if v , ok := d .GetOk ("push_rules.0.branch_name_regex" ); ok {
1001
1003
options .BranchNameRegex = gitlab .String (v .(string ))
1004
+ needToAdd = true
1002
1005
}
1003
1006
1004
1007
if v , ok := d .GetOk ("push_rules.0.commit_message_regex" ); ok {
1005
1008
options .CommitMessageRegex = gitlab .String (v .(string ))
1009
+ needToAdd = true
1006
1010
}
1007
1011
1008
1012
if v , ok := d .GetOk ("push_rules.0.commit_message_negative_regex" ); ok {
1009
1013
options .CommitMessageNegativeRegex = gitlab .String (v .(string ))
1014
+ needToAdd = true
1010
1015
}
1011
1016
1012
1017
if v , ok := d .GetOk ("push_rules.0.file_name_regex" ); ok {
1013
1018
options .FileNameRegex = gitlab .String (v .(string ))
1019
+ needToAdd = true
1014
1020
}
1015
1021
1016
1022
if v , ok := d .GetOk ("push_rules.0.commit_committer_check" ); ok {
1017
1023
options .CommitCommitterCheck = gitlab .Bool (v .(bool ))
1024
+ needToAdd = true
1018
1025
}
1019
1026
1020
1027
if v , ok := d .GetOk ("push_rules.0.deny_delete_tag" ); ok {
1021
1028
options .DenyDeleteTag = gitlab .Bool (v .(bool ))
1029
+ needToAdd = true
1022
1030
}
1023
1031
1024
1032
if v , ok := d .GetOk ("push_rules.0.member_check" ); ok {
1025
1033
options .MemberCheck = gitlab .Bool (v .(bool ))
1034
+ needToAdd = true
1026
1035
}
1027
1036
1028
1037
if v , ok := d .GetOk ("push_rules.0.prevent_secrets" ); ok {
1029
1038
options .PreventSecrets = gitlab .Bool (v .(bool ))
1039
+ needToAdd = true
1030
1040
}
1031
1041
1032
1042
if v , ok := d .GetOk ("push_rules.0.reject_unsigned_commits" ); ok {
1033
1043
options .RejectUnsignedCommits = gitlab .Bool (v .(bool ))
1044
+ needToAdd = true
1034
1045
}
1035
1046
1036
1047
if v , ok := d .GetOk ("push_rules.0.max_file_size" ); ok {
1037
1048
options .MaxFileSize = gitlab .Int (v .(int ))
1049
+ needToAdd = true
1038
1050
}
1039
1051
1040
- return options
1052
+ return options , needToAdd
1041
1053
}
1042
1054
1043
1055
func flattenProjectPushRules (pushRules * gitlab.ProjectPushRules ) (values []map [string ]interface {}) {
0 commit comments