summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: ed1aadf)
raw | patch | inline | side by side (parent: ed1aadf)
author | Junio C Hamano <junkio@cox.net> | |
Mon, 26 Sep 2005 02:30:24 +0000 (19:30 -0700) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Sun, 2 Oct 2005 06:19:32 +0000 (23:19 -0700) |
A symbolic ref is a regular file whose contents is "ref:", followed by
optional leading whitespaces, followed by a GIT_DIR relative pathname,
followed by optional trailing whitespaces (the optional whitespaces
are unconditionally removed, so you cannot have leading nor trailing
whitespaces). This can be used in place of a traditional symbolic
link .git/HEAD that usually points at "refs/heads/master". You can
instead have a regular file .git/HEAD whose contents is
"ref: refs/heads/master".
[jc: currently the code does not enforce the symbolic ref to begin with
refs/, unlike the symbolic link case. It may be worthwhile to require
either case to begin with refs/ and not have any /./ nor /../ in them.]
Signed-off-by: Junio C Hamano <junkio@cox.net>
optional leading whitespaces, followed by a GIT_DIR relative pathname,
followed by optional trailing whitespaces (the optional whitespaces
are unconditionally removed, so you cannot have leading nor trailing
whitespaces). This can be used in place of a traditional symbolic
link .git/HEAD that usually points at "refs/heads/master". You can
instead have a regular file .git/HEAD whose contents is
"ref: refs/heads/master".
[jc: currently the code does not enforce the symbolic ref to begin with
refs/, unlike the symbolic link case. It may be worthwhile to require
either case to begin with refs/ and not have any /./ nor /../ in them.]
Signed-off-by: Junio C Hamano <junkio@cox.net>
update-ref.c | patch | blob | history |
diff --git a/update-ref.c b/update-ref.c
index 1863b823240790c450e29c1c82041972713d716b..6919cead4beb2a8aae42c9fbac01e1093477b26d 100644 (file)
--- a/update-ref.c
+++ b/update-ref.c
for (;;) {
struct stat st;
+ char *buf;
int fd;
if (--depth < 0)
return NULL;
len = read(fd, buffer, sizeof(buffer)-1);
close(fd);
- break;
+
+ /*
+ * Is it a symbolic ref?
+ */
+ if (len < 4 || memcmp("ref:", buffer, 4))
+ break;
+ buf = buffer + 4;
+ len -= 4;
+ while (len && isspace(*buf))
+ buf++, len--;
+ while (len && isspace(buf[len-1]))
+ buf[--len] = 0;
+ path = git_path("%.*s", len, buf);
}
if (len < 40 || get_sha1_hex(buffer, sha1))
return NULL;