diff --git a/Makefile b/Makefile index f802043aa9..265a716704 100644 --- a/Makefile +++ b/Makefile @@ -210,7 +210,7 @@ DIFF_OBJS = \ LIB_OBJS = \ blob.o commit.o connect.o csum-file.o cache-tree.o base85.o \ - date.o diff-delta.o entry.o exec_cmd.o ident.o index.o \ + date.o diff-delta.o entry.o exec_cmd.o ident.o lockfile.o \ object.o pack-check.o patch-delta.o path.o pkt-line.o \ quote.o read-cache.o refs.o run-command.o dir.o \ server-info.o setup.o sha1_file.o sha1_name.o strbuf.o \ diff --git a/builtin-add.c b/builtin-add.c index 02fe38b0c4..bfbbb1bf52 100644 --- a/builtin-add.c +++ b/builtin-add.c @@ -122,7 +122,7 @@ static int add_file_to_index(const char *path, int verbose) return 0; } -static struct cache_file cache_file; +static struct lock_file lock_file; int cmd_add(int argc, const char **argv, char **envp) { @@ -134,9 +134,9 @@ int cmd_add(int argc, const char **argv, char **envp) git_config(git_default_config); - newfd = hold_index_file_for_update(&cache_file, get_index_file()); + newfd = hold_lock_file_for_update(&lock_file, get_index_file()); if (newfd < 0) - die("unable to create new cachefile"); + die("unable to create new index file"); if (read_cache() < 0) die("index file corrupt"); @@ -181,7 +181,7 @@ int cmd_add(int argc, const char **argv, char **envp) if (active_cache_changed) { if (write_cache(newfd, active_cache, active_nr) || - commit_index_file(&cache_file)) + commit_lock_file(&lock_file)) die("Unable to write new index file"); } diff --git a/builtin-apply.c b/builtin-apply.c index 6a4fb9663d..e113c74dd8 100644 --- a/builtin-apply.c +++ b/builtin-apply.c @@ -2072,7 +2072,7 @@ static void write_out_results(struct patch *list, int skipped_patch) } } -static struct cache_file cache_file; +static struct lock_file lock_file; static struct excludes { struct excludes *next; @@ -2133,8 +2133,12 @@ static int apply_patch(int fd, const char *filename) apply = 0; write_index = check_index && apply; - if (write_index && newfd < 0) - newfd = hold_index_file_for_update(&cache_file, get_index_file()); + if (write_index && newfd < 0) { + newfd = hold_lock_file_for_update(&lock_file, + get_index_file()); + if (newfd < 0) + die("unable to create new index file"); + } if (check_index) { if (read_cache() < 0) die("unable to read index file"); @@ -2312,8 +2316,8 @@ int cmd_apply(int argc, const char **argv, char **envp) if (write_index) { if (write_cache(newfd, active_cache, active_nr) || - commit_index_file(&cache_file)) - die("Unable to write new cachefile"); + commit_lock_file(&lock_file)) + die("Unable to write new index file"); } return 0; diff --git a/builtin-read-tree.c b/builtin-read-tree.c index 8d1a22d373..bb50fbd274 100644 --- a/builtin-read-tree.c +++ b/builtin-read-tree.c @@ -853,7 +853,7 @@ static void prime_cache_tree(void) static const char read_tree_usage[] = "git-read-tree ( | -m [--aggressive] [-u | -i] [ []])"; -static struct cache_file cache_file; +static struct lock_file lock_file; int cmd_read_tree(int argc, const char **argv, char **envp) { @@ -864,9 +864,9 @@ int cmd_read_tree(int argc, const char **argv, char **envp) setup_git_directory(); git_config(git_default_config); - newfd = hold_index_file_for_update(&cache_file, get_index_file()); + newfd = hold_lock_file_for_update(&lock_file, get_index_file()); if (newfd < 0) - die("unable to create new cachefile"); + die("unable to create new index file"); git_config(git_default_config); @@ -981,7 +981,7 @@ int cmd_read_tree(int argc, const char **argv, char **envp) } if (write_cache(newfd, active_cache, active_nr) || - commit_index_file(&cache_file)) + commit_lock_file(&lock_file)) die("unable to write new index file"); return 0; } diff --git a/builtin-rm.c b/builtin-rm.c index e7793a20f5..ef2f8b5d09 100644 --- a/builtin-rm.c +++ b/builtin-rm.c @@ -41,7 +41,7 @@ static int remove_file(const char *name) return ret; } -static struct cache_file cache_file; +static struct lock_file lock_file; int cmd_rm(int argc, const char **argv, char **envp) { @@ -53,7 +53,7 @@ int cmd_rm(int argc, const char **argv, char **envp) git_config(git_default_config); - newfd = hold_index_file_for_update(&cache_file, get_index_file()); + newfd = hold_lock_file_for_update(&lock_file, get_index_file()); if (newfd < 0) die("unable to create new index file"); @@ -144,7 +144,7 @@ int cmd_rm(int argc, const char **argv, char **envp) if (active_cache_changed) { if (write_cache(newfd, active_cache, active_nr) || - commit_index_file(&cache_file)) + commit_lock_file(&lock_file)) die("Unable to write new index file"); } diff --git a/cache.h b/cache.h index d530af97cc..d5d7fe4f8c 100644 --- a/cache.h +++ b/cache.h @@ -167,13 +167,13 @@ extern void fill_stat_cache_info(struct cache_entry *ce, struct stat *st); #define REFRESH_IGNORE_MISSING 0x0008 /* ignore non-existent */ extern int refresh_cache(unsigned int flags); -struct cache_file { - struct cache_file *next; - char lockfile[PATH_MAX]; +struct lock_file { + struct lock_file *next; + char filename[PATH_MAX]; }; -extern int hold_index_file_for_update(struct cache_file *, const char *path); -extern int commit_index_file(struct cache_file *); -extern void rollback_index_file(struct cache_file *); +extern int hold_lock_file_for_update(struct lock_file *, const char *path); +extern int commit_lock_file(struct lock_file *); +extern void rollback_lock_file(struct lock_file *); /* Environment bits from configuration mechanism */ extern int trust_executable_bit; diff --git a/checkout-index.c b/checkout-index.c index 9876af6fd6..ea40bc29be 100644 --- a/checkout-index.c +++ b/checkout-index.c @@ -168,7 +168,7 @@ static int checkout_all(void) static const char checkout_cache_usage[] = "git-checkout-index [-u] [-q] [-a] [-f] [-n] [--stage=[123]|all] [--prefix=] [--temp] [--] ..."; -static struct cache_file cache_file; +static struct lock_file lock_file; int main(int argc, char **argv) { @@ -211,9 +211,8 @@ int main(int argc, char **argv) if (!strcmp(arg, "-u") || !strcmp(arg, "--index")) { state.refresh_cache = 1; if (newfd < 0) - newfd = hold_index_file_for_update - (&cache_file, - get_index_file()); + newfd = hold_lock_file_for_update + (&lock_file, get_index_file()); if (newfd < 0) die("cannot open index.lock file."); continue; @@ -262,7 +261,7 @@ int main(int argc, char **argv) */ if (state.refresh_cache) { close(newfd); newfd = -1; - rollback_index_file(&cache_file); + rollback_lock_file(&lock_file); } state.refresh_cache = 0; } @@ -312,7 +311,7 @@ int main(int argc, char **argv) if (0 <= newfd && (write_cache(newfd, active_cache, active_nr) || - commit_index_file(&cache_file))) - die("Unable to write new cachefile"); + commit_lock_file(&lock_file))) + die("Unable to write new index file"); return 0; } diff --git a/index.c b/index.c deleted file mode 100644 index f92b960ae4..0000000000 --- a/index.c +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2005, Junio C Hamano - */ -#include -#include "cache.h" - -static struct cache_file *cache_file_list; - -static void remove_lock_file(void) -{ - while (cache_file_list) { - if (cache_file_list->lockfile[0]) - unlink(cache_file_list->lockfile); - cache_file_list = cache_file_list->next; - } -} - -static void remove_lock_file_on_signal(int signo) -{ - remove_lock_file(); - signal(SIGINT, SIG_DFL); - raise(signo); -} - -int hold_index_file_for_update(struct cache_file *cf, const char *path) -{ - int fd; - sprintf(cf->lockfile, "%s.lock", path); - fd = open(cf->lockfile, O_RDWR | O_CREAT | O_EXCL, 0666); - if (fd >=0 && !cf->next) { - cf->next = cache_file_list; - cache_file_list = cf; - signal(SIGINT, remove_lock_file_on_signal); - atexit(remove_lock_file); - } - return fd; -} - -int commit_index_file(struct cache_file *cf) -{ - char indexfile[PATH_MAX]; - int i; - strcpy(indexfile, cf->lockfile); - i = strlen(indexfile) - 5; /* .lock */ - indexfile[i] = 0; - i = rename(cf->lockfile, indexfile); - cf->lockfile[0] = 0; - return i; -} - -void rollback_index_file(struct cache_file *cf) -{ - if (cf->lockfile[0]) - unlink(cf->lockfile); - cf->lockfile[0] = 0; -} - diff --git a/lockfile.c b/lockfile.c new file mode 100644 index 0000000000..9bc60837aa --- /dev/null +++ b/lockfile.c @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2005, Junio C Hamano + */ +#include +#include "cache.h" + +static struct lock_file *lock_file_list; + +static void remove_lock_file(void) +{ + while (lock_file_list) { + if (lock_file_list->filename[0]) + unlink(lock_file_list->filename); + lock_file_list = lock_file_list->next; + } +} + +static void remove_lock_file_on_signal(int signo) +{ + remove_lock_file(); + signal(SIGINT, SIG_DFL); + raise(signo); +} + +int hold_lock_file_for_update(struct lock_file *lk, const char *path) +{ + int fd; + sprintf(lk->filename, "%s.lock", path); + fd = open(lk->filename, O_RDWR | O_CREAT | O_EXCL, 0666); + if (fd >=0 && !lk->next) { + lk->next = lock_file_list; + lock_file_list = lk; + signal(SIGINT, remove_lock_file_on_signal); + atexit(remove_lock_file); + } + return fd; +} + +int commit_lock_file(struct lock_file *lk) +{ + char result_file[PATH_MAX]; + int i; + strcpy(result_file, lk->filename); + i = strlen(result_file) - 5; /* .lock */ + result_file[i] = 0; + i = rename(lk->filename, result_file); + lk->filename[0] = 0; + return i; +} + +void rollback_lock_file(struct lock_file *lk) +{ + if (lk->filename[0]) + unlink(lk->filename); + lk->filename[0] = 0; +} + diff --git a/update-index.c b/update-index.c index 956b6b34f9..fbccc4a67b 100644 --- a/update-index.c +++ b/update-index.c @@ -186,7 +186,7 @@ static void chmod_path(int flip, const char *path) die("git-update-index: cannot chmod %cx '%s'", flip, path); } -static struct cache_file cache_file; +static struct lock_file lock_file; static void update_one(const char *path, const char *prefix, int prefix_length) { @@ -489,9 +489,9 @@ int main(int argc, const char **argv) git_config(git_default_config); - newfd = hold_index_file_for_update(&cache_file, get_index_file()); + newfd = hold_lock_file_for_update(&lock_file, get_index_file()); if (newfd < 0) - die("unable to create new cachefile"); + die("unable to create new index file"); entries = read_cache(); if (entries < 0) @@ -645,8 +645,8 @@ int main(int argc, const char **argv) finish: if (active_cache_changed) { if (write_cache(newfd, active_cache, active_nr) || - commit_index_file(&cache_file)) - die("Unable to write new cachefile"); + commit_lock_file(&lock_file)) + die("Unable to write new index file"); } return has_errors ? 1 : 0; diff --git a/write-tree.c b/write-tree.c index 7a4f691d8a..d6a605893d 100644 --- a/write-tree.c +++ b/write-tree.c @@ -11,7 +11,7 @@ static int missing_ok = 0; static const char write_tree_usage[] = "git-write-tree [--missing-ok]"; -static struct cache_file cache_file; +static struct lock_file lock_file; int main(int argc, char **argv) { @@ -19,7 +19,7 @@ int main(int argc, char **argv) setup_git_directory(); - newfd = hold_index_file_for_update(&cache_file, get_index_file()); + newfd = hold_lock_file_for_update(&lock_file, get_index_file()); entries = read_cache(); if (argc == 2) { if (!strcmp(argv[1], "--missing-ok")) @@ -45,7 +45,7 @@ int main(int argc, char **argv) die("git-write-tree: error building trees"); if (0 <= newfd) { if (!write_cache(newfd, active_cache, active_nr)) - commit_index_file(&cache_file); + commit_lock_file(&lock_file); } /* Not being able to write is fine -- we are only interested * in updating the cache-tree part, and if the next caller