Code

Make index file locking code reusable to others.
authorJunio C Hamano <junkio@cox.net>
Tue, 6 Jun 2006 19:51:49 +0000 (12:51 -0700)
committerJunio C Hamano <junkio@cox.net>
Tue, 6 Jun 2006 21:30:58 +0000 (14:30 -0700)
The framework to create lockfiles that are removed at exit is
first used to reliably write the index file, but it is
applicable to other things, so stop calling it "cache_file".

This also rewords a few remaining error message that called the
index file "cache file".

Signed-off-by: Junio C Hamano <junkio@cox.net>
Makefile
builtin-add.c
builtin-apply.c
builtin-read-tree.c
builtin-rm.c
cache.h
checkout-index.c
index.c [deleted file]
lockfile.c [new file with mode: 0644]
update-index.c
write-tree.c

index f802043aa9684c691143c96cd9753696ae8a25ed..265a716704130f6dbf856d2132ba1b12d5a50735 100644 (file)
--- 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 \
index 02fe38b0c4c7c61bcc51544d1fd54c0b1641e2e8..bfbbb1bf52e10667f94dd574ab32fe070c98c4cb 100644 (file)
@@ -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");
        }
 
index 6a4fb9663dbfac93a7c625c13d401f411e8f5178..e113c74dd80d458116788500baca2740cfaa9a00 100644 (file)
@@ -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;
index 8d1a22d3739b8f9aaac41b99df4805fc4306dc79..bb50fbd274e2d7e73fc3c6f86a73bd22f636400e 100644 (file)
@@ -853,7 +853,7 @@ static void prime_cache_tree(void)
 
 static const char read_tree_usage[] = "git-read-tree (<sha> | -m [--aggressive] [-u | -i] <sha1> [<sha2> [<sha3>]])";
 
-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;
 }
index e7793a20f5c38ff31d4a74b7e1cec50b9a9f252e..ef2f8b5d099555c259a39985d8e765cf378e4431 100644 (file)
@@ -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 d530af97ccbcdbebcbb82fdcaeebadc66166f104..d5d7fe4f8c66b2fa39a33361b8efae56e3dbf742 100644 (file)
--- 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;
index 9876af6fd60a81d871e6be30060cc93d0e0259c7..ea40bc29bed17fbd6e3326edaa6fb3c38b742de6 100644 (file)
@@ -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=<string>] [--temp] [--] <file>...";
 
-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 (file)
index f92b960..0000000
--- a/index.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2005, Junio C Hamano
- */
-#include <signal.h>
-#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 (file)
index 0000000..9bc6083
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2005, Junio C Hamano
+ */
+#include <signal.h>
+#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;
+}
+
index 956b6b34f99a447f55fe48ef3ce1eb652524c985..fbccc4a67b95dae4ff5c4f9bb02fc28e8887bc67 100644 (file)
@@ -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;
index 7a4f691d8ab8f6f560685ec6fe71cf2d82e8a018..d6a605893dcbb4d8d65979309cf9ce1199aa8279 100644 (file)
@@ -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