mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-03 17:57:25 +00:00
index: report when it's locked
Report the index being locked with its own error code in order to be able to differentiate, as a locked index is typically the result of a crashed process or concurrent access, both of which often require user intervention to fix.
This commit is contained in:
parent
8f81ea45ca
commit
3d27687475
@ -32,6 +32,7 @@ typedef enum {
|
|||||||
GIT_ENONFASTFORWARD = -11,
|
GIT_ENONFASTFORWARD = -11,
|
||||||
GIT_EINVALIDSPEC = -12,
|
GIT_EINVALIDSPEC = -12,
|
||||||
GIT_EMERGECONFLICT = -13,
|
GIT_EMERGECONFLICT = -13,
|
||||||
|
GIT_ELOCKED = -14,
|
||||||
|
|
||||||
GIT_PASSTHROUGH = -30,
|
GIT_PASSTHROUGH = -30,
|
||||||
GIT_ITEROVER = -31,
|
GIT_ITEROVER = -31,
|
||||||
|
@ -53,7 +53,7 @@ static int lock_file(git_filebuf *file, int flags)
|
|||||||
giterr_clear(); /* actual OS error code just confuses */
|
giterr_clear(); /* actual OS error code just confuses */
|
||||||
giterr_set(GITERR_OS,
|
giterr_set(GITERR_OS,
|
||||||
"Failed to lock file '%s' for writing", file->path_lock);
|
"Failed to lock file '%s' for writing", file->path_lock);
|
||||||
return -1;
|
return GIT_ELOCKED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,7 +66,7 @@ static int lock_file(git_filebuf *file, int flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (file->fd < 0)
|
if (file->fd < 0)
|
||||||
return -1;
|
return file->fd;
|
||||||
|
|
||||||
file->fd_is_open = true;
|
file->fd_is_open = true;
|
||||||
|
|
||||||
@ -197,7 +197,7 @@ static int write_deflate(git_filebuf *file, void *source, size_t len)
|
|||||||
|
|
||||||
int git_filebuf_open(git_filebuf *file, const char *path, int flags)
|
int git_filebuf_open(git_filebuf *file, const char *path, int flags)
|
||||||
{
|
{
|
||||||
int compression;
|
int compression, error = -1;
|
||||||
size_t path_len;
|
size_t path_len;
|
||||||
|
|
||||||
/* opening an already open buffer is a programming error;
|
/* opening an already open buffer is a programming error;
|
||||||
@ -282,7 +282,7 @@ int git_filebuf_open(git_filebuf *file, const char *path, int flags)
|
|||||||
memcpy(file->path_lock + path_len, GIT_FILELOCK_EXTENSION, GIT_FILELOCK_EXTLENGTH);
|
memcpy(file->path_lock + path_len, GIT_FILELOCK_EXTENSION, GIT_FILELOCK_EXTLENGTH);
|
||||||
|
|
||||||
/* open the file for locking */
|
/* open the file for locking */
|
||||||
if (lock_file(file, flags) < 0)
|
if ((error = lock_file(file, flags)) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -290,7 +290,7 @@ int git_filebuf_open(git_filebuf *file, const char *path, int flags)
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
git_filebuf_cleanup(file);
|
git_filebuf_cleanup(file);
|
||||||
return -1;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
int git_filebuf_hash(git_oid *oid, git_filebuf *file)
|
int git_filebuf_hash(git_oid *oid, git_filebuf *file)
|
||||||
|
@ -70,7 +70,7 @@ int git_futils_creat_locked(const char *path, const mode_t mode)
|
|||||||
|
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
giterr_set(GITERR_OS, "Failed to create locked file '%s'", path);
|
giterr_set(GITERR_OS, "Failed to create locked file '%s'", path);
|
||||||
return -1;
|
return errno == EEXIST ? GIT_ELOCKED : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return fd;
|
return fd;
|
||||||
|
@ -498,8 +498,12 @@ int git_index_write(git_index *index)
|
|||||||
git_vector_sort(&index->reuc);
|
git_vector_sort(&index->reuc);
|
||||||
|
|
||||||
if ((error = git_filebuf_open(
|
if ((error = git_filebuf_open(
|
||||||
&file, index->index_file_path, GIT_FILEBUF_HASH_CONTENTS)) < 0)
|
&file, index->index_file_path, GIT_FILEBUF_HASH_CONTENTS)) < 0) {
|
||||||
|
if (error == GIT_ELOCKED)
|
||||||
|
giterr_set(GITERR_INDEX, "The index is locked. This might be due to a concurrrent or crashed process");
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
if ((error = write_index(index, &file)) < 0) {
|
if ((error = write_index(index, &file)) < 0) {
|
||||||
git_filebuf_cleanup(&file);
|
git_filebuf_cleanup(&file);
|
||||||
|
@ -459,3 +459,28 @@ void test_index_tests__preserves_case(void)
|
|||||||
git_repository_free(repo);
|
git_repository_free(repo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_index_tests__elocked(void)
|
||||||
|
{
|
||||||
|
git_repository *repo;
|
||||||
|
git_index *index;
|
||||||
|
git_filebuf file = GIT_FILEBUF_INIT;
|
||||||
|
const git_error *err;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
cl_set_cleanup(&cleanup_myrepo, NULL);
|
||||||
|
|
||||||
|
cl_git_pass(git_repository_init(&repo, "./myrepo", 0));
|
||||||
|
cl_git_pass(git_repository_index(&index, repo));
|
||||||
|
|
||||||
|
/* Lock the index file so we fail to lock it */
|
||||||
|
cl_git_pass(git_filebuf_open(&file, index->index_file_path, 0));
|
||||||
|
error = git_index_write(index);
|
||||||
|
cl_assert_equal_i(GIT_ELOCKED, error);
|
||||||
|
|
||||||
|
err = giterr_last();
|
||||||
|
cl_assert_equal_i(err->klass, GITERR_INDEX);
|
||||||
|
|
||||||
|
git_filebuf_cleanup(&file);
|
||||||
|
git_index_free(index);
|
||||||
|
git_repository_free(repo);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user