mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-21 20:14:44 +00:00
clean up state metadata more consistently
This commit is contained in:
parent
300d192f7e
commit
bab0b9f2d2
@ -488,13 +488,13 @@ GIT_EXTERN(int) git_repository_message(char *out, size_t len, git_repository *re
|
|||||||
GIT_EXTERN(int) git_repository_message_remove(git_repository *repo);
|
GIT_EXTERN(int) git_repository_message_remove(git_repository *repo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove all the metadata associated with an ongoing git merge, including
|
* Remove all the metadata associated with an ongoing command like merge,
|
||||||
* MERGE_HEAD, MERGE_MSG, etc.
|
* revert, cherry-pick, etc. For example: MERGE_HEAD, MERGE_MSG, etc.
|
||||||
*
|
*
|
||||||
* @param repo A repository object
|
* @param repo A repository object
|
||||||
* @return 0 on success, or error
|
* @return 0 on success, or error
|
||||||
*/
|
*/
|
||||||
GIT_EXTERN(int) git_repository_merge_cleanup(git_repository *repo);
|
GIT_EXTERN(int) git_repository_state_cleanup(git_repository *repo);
|
||||||
|
|
||||||
typedef int (*git_repository_fetchhead_foreach_cb)(const char *ref_name,
|
typedef int (*git_repository_fetchhead_foreach_cb)(const char *ref_name,
|
||||||
const char *remote_url,
|
const char *remote_url,
|
||||||
|
46
src/merge.c
46
src/merge.c
@ -2362,6 +2362,17 @@ done:
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int merge_state_cleanup(git_repository *repo)
|
||||||
|
{
|
||||||
|
const char *state_files[] = {
|
||||||
|
GIT_MERGE_HEAD_FILE,
|
||||||
|
GIT_MERGE_MODE_FILE,
|
||||||
|
GIT_MERGE_MSG_FILE,
|
||||||
|
};
|
||||||
|
|
||||||
|
return git_repository__cleanup_files(repo, state_files, ARRAY_SIZE(state_files));
|
||||||
|
}
|
||||||
|
|
||||||
int git_merge(
|
int git_merge(
|
||||||
git_merge_result **out,
|
git_merge_result **out,
|
||||||
git_repository *repo,
|
git_repository *repo,
|
||||||
@ -2453,7 +2464,7 @@ int git_merge(
|
|||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
on_error:
|
on_error:
|
||||||
git_repository_merge_cleanup(repo);
|
merge_state_cleanup(repo);
|
||||||
|
|
||||||
git_index_free(index_new);
|
git_index_free(index_new);
|
||||||
git__free(result);
|
git__free(result);
|
||||||
@ -2497,39 +2508,6 @@ int git_merge__setup(
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
int git_repository_merge_cleanup(git_repository *repo)
|
|
||||||
{
|
|
||||||
int error = 0;
|
|
||||||
git_buf merge_head_path = GIT_BUF_INIT,
|
|
||||||
merge_mode_path = GIT_BUF_INIT,
|
|
||||||
merge_msg_path = GIT_BUF_INIT;
|
|
||||||
|
|
||||||
assert(repo);
|
|
||||||
|
|
||||||
if (git_buf_joinpath(&merge_head_path, repo->path_repository, GIT_MERGE_HEAD_FILE) < 0 ||
|
|
||||||
git_buf_joinpath(&merge_mode_path, repo->path_repository, GIT_MERGE_MODE_FILE) < 0 ||
|
|
||||||
git_buf_joinpath(&merge_msg_path, repo->path_repository, GIT_MERGE_MSG_FILE) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (git_path_isfile(merge_head_path.ptr)) {
|
|
||||||
if ((error = p_unlink(merge_head_path.ptr)) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (git_path_isfile(merge_mode_path.ptr))
|
|
||||||
(void)p_unlink(merge_mode_path.ptr);
|
|
||||||
|
|
||||||
if (git_path_isfile(merge_msg_path.ptr))
|
|
||||||
(void)p_unlink(merge_msg_path.ptr);
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
git_buf_free(&merge_msg_path);
|
|
||||||
git_buf_free(&merge_mode_path);
|
|
||||||
git_buf_free(&merge_head_path);
|
|
||||||
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Merge result data */
|
/* Merge result data */
|
||||||
|
|
||||||
int git_merge_result_is_uptodate(git_merge_result *merge_result)
|
int git_merge_result_is_uptodate(git_merge_result *merge_result)
|
||||||
|
@ -1965,6 +1965,42 @@ int git_repository_state(git_repository *repo)
|
|||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int git_repository__cleanup_files(git_repository *repo, const char *files[], size_t files_len)
|
||||||
|
{
|
||||||
|
git_buf path = GIT_BUF_INIT;
|
||||||
|
size_t i;
|
||||||
|
int error = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < files_len; ++i) {
|
||||||
|
git_buf_clear(&path);
|
||||||
|
|
||||||
|
if ((error = git_buf_joinpath(&path, repo->path_repository, files[i])) < 0 ||
|
||||||
|
(git_path_isfile(git_buf_cstr(&path)) &&
|
||||||
|
(error = p_unlink(git_buf_cstr(&path))) < 0))
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
git_buf_free(&path);
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *state_files[] = {
|
||||||
|
GIT_MERGE_HEAD_FILE,
|
||||||
|
GIT_MERGE_MODE_FILE,
|
||||||
|
GIT_MERGE_MSG_FILE,
|
||||||
|
GIT_REVERT_HEAD_FILE,
|
||||||
|
GIT_CHERRY_PICK_HEAD_FILE,
|
||||||
|
};
|
||||||
|
|
||||||
|
int git_repository_state_cleanup(git_repository *repo)
|
||||||
|
{
|
||||||
|
assert(repo);
|
||||||
|
|
||||||
|
return git_repository__cleanup_files(repo, state_files, ARRAY_SIZE(state_files));
|
||||||
|
}
|
||||||
|
|
||||||
int git_repository_is_shallow(git_repository *repo)
|
int git_repository_is_shallow(git_repository *repo)
|
||||||
{
|
{
|
||||||
git_buf path = GIT_BUF_INIT;
|
git_buf path = GIT_BUF_INIT;
|
||||||
|
@ -169,4 +169,6 @@ GIT_INLINE(int) git_repository__ensure_not_bare(
|
|||||||
return GIT_EBAREREPO;
|
return GIT_EBAREREPO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int git_repository__cleanup_files(git_repository *repo, const char *files[], size_t files_len);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -149,7 +149,7 @@ int git_reset(
|
|||||||
(error = git_index_write(index)) < 0)
|
(error = git_index_write(index)) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if ((error = git_repository_merge_cleanup(repo)) < 0) {
|
if ((error = git_repository_state_cleanup(repo)) < 0) {
|
||||||
giterr_set(GITERR_INDEX, "%s - failed to clean up merge data", ERROR_MSG);
|
giterr_set(GITERR_INDEX, "%s - failed to clean up merge data", ERROR_MSG);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
37
src/revert.c
37
src/revert.c
@ -9,7 +9,6 @@
|
|||||||
#include "repository.h"
|
#include "repository.h"
|
||||||
#include "filebuf.h"
|
#include "filebuf.h"
|
||||||
#include "merge.h"
|
#include "merge.h"
|
||||||
#include "revert.h"
|
|
||||||
|
|
||||||
#include "git2/types.h"
|
#include "git2/types.h"
|
||||||
#include "git2/merge.h"
|
#include "git2/merge.h"
|
||||||
@ -103,6 +102,13 @@ static int revert_normalize_opts(
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int revert_state_cleanup(git_repository *repo)
|
||||||
|
{
|
||||||
|
const char *state_files[] = { GIT_REVERT_HEAD_FILE, GIT_MERGE_MSG_FILE };
|
||||||
|
|
||||||
|
return git_repository__cleanup_files(repo, state_files, ARRAY_SIZE(state_files));
|
||||||
|
}
|
||||||
|
|
||||||
int git_revert(
|
int git_revert(
|
||||||
git_repository *repo,
|
git_repository *repo,
|
||||||
git_commit *commit,
|
git_commit *commit,
|
||||||
@ -175,7 +181,7 @@ int git_revert(
|
|||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
on_error:
|
on_error:
|
||||||
git_revert__cleanup(repo);
|
revert_state_cleanup(repo);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
git_index_free(index_new);
|
git_index_free(index_new);
|
||||||
@ -188,30 +194,3 @@ done:
|
|||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
int git_revert__cleanup(git_repository *repo)
|
|
||||||
{
|
|
||||||
int error = 0;
|
|
||||||
git_buf revert_head_path = GIT_BUF_INIT,
|
|
||||||
merge_msg_path = GIT_BUF_INIT;
|
|
||||||
|
|
||||||
assert(repo);
|
|
||||||
|
|
||||||
if (git_buf_joinpath(&revert_head_path, repo->path_repository, GIT_REVERT_HEAD_FILE) < 0 ||
|
|
||||||
git_buf_joinpath(&merge_msg_path, repo->path_repository, GIT_MERGE_MSG_FILE) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (git_path_isfile(revert_head_path.ptr)) {
|
|
||||||
if ((error = p_unlink(revert_head_path.ptr)) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (git_path_isfile(merge_msg_path.ptr))
|
|
||||||
(void)p_unlink(merge_msg_path.ptr);
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
git_buf_free(&merge_msg_path);
|
|
||||||
git_buf_free(&revert_head_path);
|
|
||||||
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
14
src/revert.h
14
src/revert.h
@ -1,14 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) the libgit2 contributors. All rights reserved.
|
|
||||||
*
|
|
||||||
* This file is part of libgit2, distributed under the GNU GPL v2 with
|
|
||||||
* a Linking Exception. For full terms see the included COPYING file.
|
|
||||||
*/
|
|
||||||
#ifndef INCLUDE_revert_h__
|
|
||||||
#define INCLUDE_revert_h__
|
|
||||||
|
|
||||||
#include "git2/repository.h"
|
|
||||||
|
|
||||||
int git_revert__cleanup(git_repository *repo);
|
|
||||||
|
|
||||||
#endif
|
|
Loading…
Reference in New Issue
Block a user