Documentation/git-cherry-pick: Add --replay and --no-commit.
[gitweb.git] / refs.c
diff --git a/refs.c b/refs.c
index a52b038eefdf22fce20d1a81180c97def0613cdb..d2aec73edcbe06cf63009ac7dd85fa53b6c995b9 100644 (file)
--- a/refs.c
+++ b/refs.c
 #define USE_SYMLINK_HEAD 1
 #endif
 
-int validate_symref(const char *path)
-{
-       struct stat st;
-       char *buf, buffer[256];
-       int len, fd;
-
-       if (lstat(path, &st) < 0)
-               return -1;
-
-       /* Make sure it is a "refs/.." symlink */
-       if (S_ISLNK(st.st_mode)) {
-               len = readlink(path, buffer, sizeof(buffer)-1);
-               if (len >= 5 && !memcmp("refs/", buffer, 5))
-                       return 0;
-               return -1;
-       }
-
-       /*
-        * Anything else, just open it and try to see if it is a symbolic ref.
-        */
-       fd = open(path, O_RDONLY);
-       if (fd < 0)
-               return -1;
-       len = read(fd, buffer, sizeof(buffer)-1);
-       close(fd);
-
-       /*
-        * Is it a symbolic ref?
-        */
-       if (len < 4 || memcmp("ref:", buffer, 4))
-               return -1;
-       buf = buffer + 4;
-       len -= 4;
-       while (len && isspace(*buf))
-               buf++, len--;
-       if (len >= 5 && !memcmp("refs/", buf, 5))
-               return 0;
-       return -1;
-}
-
 const char *resolve_ref(const char *path, unsigned char *sha1, int reading)
 {
        int depth = MAXDEPTH, len;
@@ -121,10 +81,12 @@ int create_symref(const char *git_HEAD, const char *refs_heads_master)
        int fd, len, written;
 
 #if USE_SYMLINK_HEAD
-       unlink(git_HEAD);
-       if (!symlink(refs_heads_master, git_HEAD))
-               return 0;
-       fprintf(stderr, "no symlink - falling back to symbolic ref\n");
+       if (!only_use_symrefs) {
+               unlink(git_HEAD);
+               if (!symlink(refs_heads_master, git_HEAD))
+                       return 0;
+               fprintf(stderr, "no symlink - falling back to symbolic ref\n");
+       }
 #endif
 
        len = snprintf(ref, sizeof(ref), "ref: %s\n", refs_heads_master);
@@ -330,6 +292,8 @@ int write_ref_sha1(const char *ref, int fd, const unsigned char *sha1)
                return -1;
        filename = ref_file_name(ref);
        lock_filename = ref_lock_file_name(ref);
+       if (safe_create_leading_directories(filename))
+               die("unable to create leading directory for %s", filename);
        retval = write_ref_file(filename, lock_filename, fd, sha1);
        free(filename);
        free(lock_filename);
@@ -396,6 +360,8 @@ int write_ref_sha1_unlocked(const char *ref, const unsigned char *sha1)
                return -1;
        filename = ref_file_name(ref);
        lock_filename = ref_lock_file_name(ref);
+       if (safe_create_leading_directories(filename))
+               die("unable to create leading directory for %s", filename);
        fd = open(lock_filename, O_WRONLY | O_CREAT | O_EXCL, 0666);
        if (fd < 0) {
                error("Writing %s", lock_filename);