Close files opened by lock_file() before unlinking.
This is needed on Windows since open files cannot be unlinked. Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
2488df84a2
commit
4723ee992c
1
cache.h
1
cache.h
@ -290,6 +290,7 @@ extern int refresh_index(struct index_state *, unsigned int flags, const char **
|
|||||||
|
|
||||||
struct lock_file {
|
struct lock_file {
|
||||||
struct lock_file *next;
|
struct lock_file *next;
|
||||||
|
int fd;
|
||||||
pid_t owner;
|
pid_t owner;
|
||||||
char on_list;
|
char on_list;
|
||||||
char filename[PATH_MAX];
|
char filename[PATH_MAX];
|
||||||
|
17
lockfile.c
17
lockfile.c
@ -12,8 +12,10 @@ static void remove_lock_file(void)
|
|||||||
|
|
||||||
while (lock_file_list) {
|
while (lock_file_list) {
|
||||||
if (lock_file_list->owner == me &&
|
if (lock_file_list->owner == me &&
|
||||||
lock_file_list->filename[0])
|
lock_file_list->filename[0]) {
|
||||||
|
close(lock_file_list->fd);
|
||||||
unlink(lock_file_list->filename);
|
unlink(lock_file_list->filename);
|
||||||
|
}
|
||||||
lock_file_list = lock_file_list->next;
|
lock_file_list = lock_file_list->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -120,8 +122,6 @@ static char *resolve_symlink(char *p, size_t s)
|
|||||||
|
|
||||||
static int lock_file(struct lock_file *lk, const char *path)
|
static int lock_file(struct lock_file *lk, const char *path)
|
||||||
{
|
{
|
||||||
int fd;
|
|
||||||
|
|
||||||
if (strlen(path) >= sizeof(lk->filename)) return -1;
|
if (strlen(path) >= sizeof(lk->filename)) return -1;
|
||||||
strcpy(lk->filename, path);
|
strcpy(lk->filename, path);
|
||||||
/*
|
/*
|
||||||
@ -130,8 +130,8 @@ static int lock_file(struct lock_file *lk, const char *path)
|
|||||||
*/
|
*/
|
||||||
resolve_symlink(lk->filename, sizeof(lk->filename)-5);
|
resolve_symlink(lk->filename, sizeof(lk->filename)-5);
|
||||||
strcat(lk->filename, ".lock");
|
strcat(lk->filename, ".lock");
|
||||||
fd = open(lk->filename, O_RDWR | O_CREAT | O_EXCL, 0666);
|
lk->fd = open(lk->filename, O_RDWR | O_CREAT | O_EXCL, 0666);
|
||||||
if (0 <= fd) {
|
if (0 <= lk->fd) {
|
||||||
if (!lock_file_list) {
|
if (!lock_file_list) {
|
||||||
signal(SIGINT, remove_lock_file_on_signal);
|
signal(SIGINT, remove_lock_file_on_signal);
|
||||||
atexit(remove_lock_file);
|
atexit(remove_lock_file);
|
||||||
@ -148,7 +148,7 @@ static int lock_file(struct lock_file *lk, const char *path)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
lk->filename[0] = 0;
|
lk->filename[0] = 0;
|
||||||
return fd;
|
return lk->fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
int hold_lock_file_for_update(struct lock_file *lk, const char *path, int die_on_error)
|
int hold_lock_file_for_update(struct lock_file *lk, const char *path, int die_on_error)
|
||||||
@ -163,6 +163,7 @@ int commit_lock_file(struct lock_file *lk)
|
|||||||
{
|
{
|
||||||
char result_file[PATH_MAX];
|
char result_file[PATH_MAX];
|
||||||
int i;
|
int i;
|
||||||
|
close(lk->fd);
|
||||||
strcpy(result_file, lk->filename);
|
strcpy(result_file, lk->filename);
|
||||||
i = strlen(result_file) - 5; /* .lock */
|
i = strlen(result_file) - 5; /* .lock */
|
||||||
result_file[i] = 0;
|
result_file[i] = 0;
|
||||||
@ -194,7 +195,9 @@ int commit_locked_index(struct lock_file *lk)
|
|||||||
|
|
||||||
void rollback_lock_file(struct lock_file *lk)
|
void rollback_lock_file(struct lock_file *lk)
|
||||||
{
|
{
|
||||||
if (lk->filename[0])
|
if (lk->filename[0]) {
|
||||||
|
close(lk->fd);
|
||||||
unlink(lk->filename);
|
unlink(lk->filename);
|
||||||
|
}
|
||||||
lk->filename[0] = 0;
|
lk->filename[0] = 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user