Add git-symbolic-ref
This adds the counterpart of git-update-ref that lets you read and create "symbolic refs". By default it uses a symbolic link to represent ".git/HEAD -> refs/heads/master", but it can be compiled to use the textfile symbolic ref. The places that did 'readlink .git/HEAD' and 'ln -s refs/heads/blah .git/HEAD' have been converted to use new git-symbolic-ref command, so that they can deal with either implementation. Signed-off-by: Junio C Hamano <junio@twinsun.com>
This commit is contained in:

committed by
Junio C Hamano

parent
a876ed83be
commit
8098a178b2
@ -402,25 +402,17 @@ static void fsck_object_dir(const char *path)
|
||||
|
||||
static int fsck_head_link(void)
|
||||
{
|
||||
int fd, count;
|
||||
char hex[40];
|
||||
unsigned char sha1[20];
|
||||
static char path[PATH_MAX], link[PATH_MAX];
|
||||
const char *git_dir = get_git_dir();
|
||||
const char *git_HEAD = strdup(git_path("HEAD"));
|
||||
const char *git_refs_heads_master = resolve_ref(git_HEAD, sha1, 1);
|
||||
int pfxlen = strlen(git_HEAD) - 4; /* strip .../.git/ part */
|
||||
|
||||
snprintf(path, sizeof(path), "%s/HEAD", git_dir);
|
||||
if (readlink(path, link, sizeof(link)) < 0)
|
||||
return error("HEAD is not a symlink");
|
||||
if (strncmp("refs/heads/", link, 11))
|
||||
return error("HEAD points to something strange (%s)", link);
|
||||
fd = open(path, O_RDONLY);
|
||||
if (fd < 0)
|
||||
return error("HEAD: %s", strerror(errno));
|
||||
count = read(fd, hex, sizeof(hex));
|
||||
close(fd);
|
||||
if (count < 0)
|
||||
return error("HEAD: %s", strerror(errno));
|
||||
if (count < 40 || get_sha1_hex(hex, sha1))
|
||||
if (!git_refs_heads_master)
|
||||
return error("HEAD is not a symbolic ref");
|
||||
if (strncmp(git_refs_heads_master + pfxlen, "refs/heads/", 11))
|
||||
return error("HEAD points to something strange (%s)",
|
||||
git_refs_heads_master + pfxlen);
|
||||
if (!memcmp(null_sha1, sha1, 20))
|
||||
return error("HEAD: not a valid git pointer");
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user