Better error message when we are unable to lock the index file

Most of the callers except the one in refs.c use the function to
update the index file.  Among the index writers, everybody
except write-tree dies if they cannot open it for writing.

This gives the function an extra argument, to tell it to die
when it cannot create a new file as the lockfile.

The only caller that does not have to die is write-tree, because
updating the index for the cache-tree part is optional and not
being able to do so does not affect the correctness.  I think we
do not have to be so careful and make the failure into die() the
same way as other callers, but that would be a different patch.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2006-08-12 01:03:47 -07:00
Родитель fd7bcfb524
Коммит 40aaae88ad
11 изменённых файлов: 20 добавлений и 32 удалений

Просмотреть файл

@ -93,9 +93,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
git_config(git_default_config); git_config(git_default_config);
newfd = hold_lock_file_for_update(&lock_file, get_index_file()); newfd = hold_lock_file_for_update(&lock_file, get_index_file(), 1);
if (newfd < 0)
die("unable to create new index file");
if (read_cache() < 0) if (read_cache() < 0)
die("index file corrupt"); die("index file corrupt");

Просмотреть файл

@ -2234,12 +2234,9 @@ static int apply_patch(int fd, const char *filename,
apply = 0; apply = 0;
write_index = check_index && apply; write_index = check_index && apply;
if (write_index && newfd < 0) { if (write_index && newfd < 0)
newfd = hold_lock_file_for_update(&lock_file, newfd = hold_lock_file_for_update(&lock_file,
get_index_file()); get_index_file(), 1);
if (newfd < 0)
die("unable to create new index file");
}
if (check_index) { if (check_index) {
if (read_cache() < 0) if (read_cache() < 0)
die("unable to read index file"); die("unable to read index file");

Просмотреть файл

@ -72,10 +72,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
git_config(git_default_config); git_config(git_default_config);
newfd = hold_lock_file_for_update(&lock_file, get_index_file()); newfd = hold_lock_file_for_update(&lock_file, get_index_file(), 1);
if (newfd < 0)
die("unable to create new index file");
if (read_cache() < 0) if (read_cache() < 0)
die("index file corrupt"); die("index file corrupt");

Просмотреть файл

@ -884,9 +884,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
git_config(git_default_config); git_config(git_default_config);
newfd = hold_lock_file_for_update(&lock_file, get_index_file()); newfd = hold_lock_file_for_update(&lock_file, get_index_file(), 1);
if (newfd < 0)
die("unable to create new index file");
git_config(git_default_config); git_config(git_default_config);

Просмотреть файл

@ -52,9 +52,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
git_config(git_default_config); git_config(git_default_config);
newfd = hold_lock_file_for_update(&lock_file, get_index_file()); newfd = hold_lock_file_for_update(&lock_file, get_index_file(), 1);
if (newfd < 0)
die("unable to create new index file");
if (read_cache() < 0) if (read_cache() < 0)
die("index file corrupt"); die("index file corrupt");

Просмотреть файл

@ -491,9 +491,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
/* We can't free this memory, it becomes part of a linked list parsed atexit() */ /* We can't free this memory, it becomes part of a linked list parsed atexit() */
lock_file = xcalloc(1, sizeof(struct lock_file)); lock_file = xcalloc(1, sizeof(struct lock_file));
newfd = hold_lock_file_for_update(lock_file, get_index_file()); newfd = hold_lock_file_for_update(lock_file, get_index_file(), 1);
if (newfd < 0)
die("unable to create new cachefile");
entries = read_cache(); entries = read_cache();
if (entries < 0) if (entries < 0)

Просмотреть файл

@ -18,7 +18,7 @@ int write_tree(unsigned char *sha1, int missing_ok, const char *prefix)
/* We can't free this memory, it becomes part of a linked list parsed atexit() */ /* We can't free this memory, it becomes part of a linked list parsed atexit() */
struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file)); struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
newfd = hold_lock_file_for_update(lock_file, get_index_file()); newfd = hold_lock_file_for_update(lock_file, get_index_file(), 0);
entries = read_cache(); entries = read_cache();
if (entries < 0) if (entries < 0)

Просмотреть файл

@ -175,7 +175,7 @@ struct lock_file {
struct lock_file *next; struct lock_file *next;
char filename[PATH_MAX]; char filename[PATH_MAX];
}; };
extern int hold_lock_file_for_update(struct lock_file *, const char *path); extern int hold_lock_file_for_update(struct lock_file *, const char *path, int);
extern int commit_lock_file(struct lock_file *); extern int commit_lock_file(struct lock_file *);
extern void rollback_lock_file(struct lock_file *); extern void rollback_lock_file(struct lock_file *);

Просмотреть файл

@ -206,7 +206,7 @@ int main(int argc, char **argv)
state.refresh_cache = 1; state.refresh_cache = 1;
if (newfd < 0) if (newfd < 0)
newfd = hold_lock_file_for_update newfd = hold_lock_file_for_update
(&lock_file, get_index_file()); (&lock_file, get_index_file(), 1);
if (newfd < 0) if (newfd < 0)
die("cannot open index.lock file."); die("cannot open index.lock file.");
continue; continue;

Просмотреть файл

@ -22,7 +22,7 @@ static void remove_lock_file_on_signal(int signo)
raise(signo); raise(signo);
} }
int hold_lock_file_for_update(struct lock_file *lk, const char *path) static int lock_file(struct lock_file *lk, const char *path)
{ {
int fd; int fd;
sprintf(lk->filename, "%s.lock", path); sprintf(lk->filename, "%s.lock", path);
@ -41,6 +41,14 @@ int hold_lock_file_for_update(struct lock_file *lk, const char *path)
return fd; return fd;
} }
int hold_lock_file_for_update(struct lock_file *lk, const char *path, int die_on_error)
{
int fd = lock_file(lk, path);
if (fd < 0 && die_on_error)
die("unable to create '%s': %s", path, strerror(errno));
return fd;
}
int commit_lock_file(struct lock_file *lk) int commit_lock_file(struct lock_file *lk)
{ {
char result_file[PATH_MAX]; char result_file[PATH_MAX];

8
refs.c
Просмотреть файл

@ -319,13 +319,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *path,
if (safe_create_leading_directories(lock->ref_file)) if (safe_create_leading_directories(lock->ref_file))
die("unable to create directory for %s", lock->ref_file); die("unable to create directory for %s", lock->ref_file);
lock->lock_fd = hold_lock_file_for_update(lock->lk, lock->ref_file); lock->lock_fd = hold_lock_file_for_update(lock->lk, lock->ref_file, 1);
if (lock->lock_fd < 0) {
error("Couldn't open lock file %s: %s",
lock->lk->filename, strerror(errno));
unlock_ref(lock);
return NULL;
}
return old_sha1 ? verify_lock(lock, old_sha1, mustexist) : lock; return old_sha1 ? verify_lock(lock, old_sha1, mustexist) : lock;
} }