X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=refs.c;h=03398ccc531c15e549b66c43a176fd7b2bde4aca;hb=53909056da869eb79c2a20699794b63c8c87e7fd;hp=ac2619851d63e45a5f0d97b780e59af60fcc182b;hpb=5e80092f7e6db09a40a62e837ca3f74f0bc5ad73;p=git.git diff --git a/refs.c b/refs.c index ac261985..03398ccc 100644 --- a/refs.c +++ b/refs.c @@ -6,10 +6,6 @@ /* We allow "recursive" symbolic refs. Only within reason, though */ #define MAXDEPTH 5 -#ifndef USE_SYMLINK_HEAD -#define USE_SYMLINK_HEAD 1 -#endif - const char *resolve_ref(const char *path, unsigned char *sha1, int reading) { int depth = MAXDEPTH, len; @@ -80,7 +76,7 @@ int create_symref(const char *git_HEAD, const char *refs_heads_master) char ref[1000]; int fd, len, written; -#if USE_SYMLINK_HEAD +#ifdef USE_SYMLINK_HEAD if (!only_use_symrefs) { unlink(git_HEAD); if (!symlink(refs_heads_master, git_HEAD)) @@ -155,10 +151,15 @@ static int do_for_each_ref(const char *base, int (*fn)(const char *path, const u break; continue; } - if (read_ref(git_path("%s", path), sha1) < 0) + if (read_ref(git_path("%s", path), sha1) < 0) { + error("%s points nowhere!", path); continue; - if (!has_sha1_file(sha1)) + } + if (!has_sha1_file(sha1)) { + error("%s does not point to a valid " + "commit object!", path); continue; + } retval = fn(path, sha1); if (retval) break; @@ -272,7 +273,7 @@ static int write_ref_file(const char *filename, char term = '\n'; if (write(fd, hex, 40) < 40 || write(fd, &term, 1) < 1) { - error("Couldn't write %s\n", filename); + error("Couldn't write %s", filename); close(fd); return -1; } @@ -292,6 +293,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); @@ -311,7 +314,9 @@ int write_ref_sha1(const char *ref, int fd, const unsigned char *sha1) static inline int bad_ref_char(int ch) { return (((unsigned) ch) <= ' ' || - ch == '~' || ch == '^' || ch == ':'); + ch == '~' || ch == '^' || ch == ':' || + /* 2.13 Pattern Matching Notation */ + ch == '?' || ch == '*' || ch == '['); } int check_ref_format(const char *ref) @@ -358,6 +363,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);