Teach tree_entry_interesting() that the tree entries are sorted.
[gitweb.git] / lockfile.c
index 9bc60837aa12fbe2e659ff6fb5b52e862fbe03c3..4824f4dc026e7b3f978fe4e9b2154335359e9d2e 100644 (file)
@@ -1,7 +1,6 @@
 /*
  * Copyright (c) 2005, Junio C Hamano
  */
-#include <signal.h>
 #include "cache.h"
 
 static struct lock_file *lock_file_list;
@@ -22,17 +21,35 @@ static void remove_lock_file_on_signal(int 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;
        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);
+       if (0 <= fd) {
+               if (!lk->on_list) {
+                       lk->next = lock_file_list;
+                       lock_file_list = lk;
+                       lk->on_list = 1;
+               }
+               if (lock_file_list) {
+                       signal(SIGINT, remove_lock_file_on_signal);
+                       atexit(remove_lock_file);
+               }
+               if (adjust_shared_perm(lk->filename))
+                       return error("cannot fix permission bits on %s",
+                                    lk->filename);
        }
+       else
+               lk->filename[0] = 0;
+       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.lock': %s", path, strerror(errno));
        return fd;
 }