X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=refs.c;h=6c91ae6468f859897a358ebd97f4143e44cda874;hb=fcc387db9bc453dc7e07a262873481af2ee9e5c8;hp=7a2c56e64b8cea71a83217ba39e718234b96b876;hpb=68283999f8ae0e9286f8b7f199905b77d608cb80;p=git.git diff --git a/refs.c b/refs.c index 7a2c56e6..6c91ae64 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,8 +76,8 @@ int create_symref(const char *git_HEAD, const char *refs_heads_master) char ref[1000]; int fd, len, written; -#if USE_SYMLINK_HEAD - if (!only_use_symrefs) { +#ifndef NO_SYMLINK_HEAD + if (prefer_symlink_refs) { unlink(git_HEAD); if (!symlink(refs_heads_master, git_HEAD)) return 0; @@ -118,7 +114,7 @@ int read_ref(const char *filename, unsigned char *sha1) return -1; } -static int do_for_each_ref(const char *base, int (*fn)(const char *path, const unsigned char *sha1)) +static int do_for_each_ref(const char *base, int (*fn)(const char *path, const unsigned char *sha1), int trim) { int retval = 0; DIR *dir = opendir(git_path("%s", base)); @@ -150,16 +146,21 @@ static int do_for_each_ref(const char *base, int (*fn)(const char *path, const u if (stat(git_path("%s", path), &st) < 0) continue; if (S_ISDIR(st.st_mode)) { - retval = do_for_each_ref(path, fn); + retval = do_for_each_ref(path, fn, trim); if (retval) 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); + } + retval = fn(path + trim, sha1); if (retval) break; } @@ -179,7 +180,22 @@ int head_ref(int (*fn)(const char *path, const unsigned char *sha1)) int for_each_ref(int (*fn)(const char *path, const unsigned char *sha1)) { - return do_for_each_ref("refs", fn); + return do_for_each_ref("refs", fn, 0); +} + +int for_each_tag_ref(int (*fn)(const char *path, const unsigned char *sha1)) +{ + return do_for_each_ref("refs/tags", fn, 10); +} + +int for_each_branch_ref(int (*fn)(const char *path, const unsigned char *sha1)) +{ + return do_for_each_ref("refs/heads", fn, 11); +} + +int for_each_remote_ref(int (*fn)(const char *path, const unsigned char *sha1)) +{ + return do_for_each_ref("refs/remotes", fn, 13); } static char *ref_file_name(const char *ref) @@ -272,7 +288,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; } @@ -347,14 +363,6 @@ int check_ref_format(const char *ref) if (!ch) { if (level < 2) return -1; /* at least of form "heads/blah" */ - - /* Do not allow ref name to end in "HEAD" - * Note that cp is poiting at one past NUL at the end. - * i.e. cp[-1] = NUL. - */ - if (5 <= cp - ref && !strcmp(cp - 5, "HEAD")) - return -1; - return 0; } }