mirror of
				https://git.proxmox.com/git/libgit2
				synced 2025-10-31 16:19:17 +00:00 
			
		
		
		
	branch: remove config section upon deletion
This commit is contained in:
		
							parent
							
								
									5edb846e03
								
							
						
					
					
						commit
						0b98a8a424
					
				
							
								
								
									
										49
									
								
								src/branch.c
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								src/branch.c
									
									
									
									
									
								
							| @ -89,6 +89,50 @@ cleanup: | ||||
| 	return error; | ||||
| } | ||||
| 
 | ||||
| static int delete_config_entries_cb( | ||||
| 	const char *var_name, | ||||
| 	const char *value, | ||||
| 	void *payload) | ||||
| { | ||||
| 	git_config *config; | ||||
| 
 | ||||
| 	GIT_UNUSED(value); | ||||
| 
 | ||||
| 	config = (git_config *)payload; | ||||
| 
 | ||||
| 	return git_config_delete(config, var_name); | ||||
| } | ||||
| 
 | ||||
| static int delete_branch_config_entries( | ||||
| 	git_repository *repo, | ||||
| 	const char *branch_name) | ||||
| { | ||||
| 	git_config *config; | ||||
| 	git_buf pattern = GIT_BUF_INIT; | ||||
| 	int error = -1; | ||||
| 
 | ||||
| 	git_buf_sets(&pattern, "branch\\."); | ||||
| 	git_buf_puts_escape_regex(&pattern,  branch_name); | ||||
| 	git_buf_puts(&pattern, "\\..+"); | ||||
| 	if (git_buf_oom(&pattern)) | ||||
| 		goto cleanup; | ||||
| 
 | ||||
| 	if (git_repository_config__weakptr(&config, repo) < 0) | ||||
| 		goto cleanup; | ||||
| 
 | ||||
| 	if ((error = git_config_foreach_match( | ||||
| 			config, | ||||
| 			git_buf_cstr(&pattern), | ||||
| 			delete_config_entries_cb, config)) < 0) | ||||
| 		goto cleanup; | ||||
| 
 | ||||
| 	error = 0; | ||||
| 
 | ||||
| cleanup: | ||||
| 	git_buf_free(&pattern); | ||||
| 	return error; | ||||
| } | ||||
| 
 | ||||
| int git_branch_delete(git_reference *branch) | ||||
| { | ||||
| 	int is_head; | ||||
| @ -110,6 +154,11 @@ int git_branch_delete(git_reference *branch) | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	if (delete_branch_config_entries( | ||||
| 		git_reference_owner(branch),  | ||||
| 		git_reference_name(branch) + strlen(GIT_REFS_HEADS_DIR)) < 0) | ||||
| 			goto on_error; | ||||
| 
 | ||||
| 	return git_reference_delete(branch); | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										22
									
								
								tests-clar/config/config_helpers.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								tests-clar/config/config_helpers.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | ||||
| #include "clar_libgit2.h" | ||||
| #include "config_helpers.h" | ||||
| #include "repository.h" | ||||
| 
 | ||||
| void assert_config_entry_existence( | ||||
| 	git_repository *repo, | ||||
| 	const char *name, | ||||
| 	bool is_supposed_to_exist) | ||||
| { | ||||
| 	git_config *config; | ||||
| 	const char *out; | ||||
| 	int result; | ||||
| 
 | ||||
| 	cl_git_pass(git_repository_config__weakptr(&config, repo)); | ||||
| 	 | ||||
| 	result = git_config_get_string(&out, config, name); | ||||
| 
 | ||||
| 	if (is_supposed_to_exist) | ||||
| 		cl_git_pass(result); | ||||
| 	else | ||||
| 		cl_assert_equal_i(GIT_ENOTFOUND, result); | ||||
| } | ||||
							
								
								
									
										4
									
								
								tests-clar/config/config_helpers.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								tests-clar/config/config_helpers.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| extern void assert_config_entry_existence( | ||||
| 	git_repository *repo, | ||||
| 	const char *name, | ||||
| 	bool is_supposed_to_exist); | ||||
| @ -1,6 +1,7 @@ | ||||
| #include "clar_libgit2.h" | ||||
| #include "refs.h" | ||||
| #include "repo/repo_helpers.h" | ||||
| #include "config/config_helpers.h" | ||||
| 
 | ||||
| static git_repository *repo; | ||||
| static git_reference *fake_remote; | ||||
| @ -90,3 +91,17 @@ void test_refs_branches_delete__can_delete_a_remote_branch(void) | ||||
| 	cl_git_pass(git_branch_lookup(&branch, repo, "nulltoken/master", GIT_BRANCH_REMOTE)); | ||||
| 	cl_git_pass(git_branch_delete(branch)); | ||||
| } | ||||
| 
 | ||||
| void test_refs_branches_delete__deleting_a_branch_removes_related_configuration_data(void) | ||||
| { | ||||
| 	git_reference *branch; | ||||
| 
 | ||||
| 	assert_config_entry_existence(repo, "branch.track-local.remote", true); | ||||
| 	assert_config_entry_existence(repo, "branch.track-local.merge", true); | ||||
| 
 | ||||
| 	cl_git_pass(git_branch_lookup(&branch, repo, "track-local", GIT_BRANCH_LOCAL)); | ||||
| 	cl_git_pass(git_branch_delete(branch)); | ||||
| 
 | ||||
| 	assert_config_entry_existence(repo, "branch.track-local.remote", false); | ||||
| 	assert_config_entry_existence(repo, "branch.track-local.merge", false); | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 nulltoken
						nulltoken