Merge branch 'jc/detached-head'
* jc/detached-head: git-checkout: handle local changes sanely when detaching HEAD git-checkout: safety check for detached HEAD checks existing refs git-checkout: fix branch name output from the command git-checkout: safety when coming back from the detached HEAD state. git-checkout: rewording comments regarding detached HEAD. git-checkout: do not warn detaching HEAD when it is already detached. Detached HEAD (experimental) git-branch: show detached HEAD git-status: show detached HEAD
This commit is contained in:
26
path.c
26
path.c
@ -90,10 +90,11 @@ int git_mkstemp(char *path, size_t len, const char *template)
|
||||
}
|
||||
|
||||
|
||||
int validate_symref(const char *path)
|
||||
int validate_headref(const char *path)
|
||||
{
|
||||
struct stat st;
|
||||
char *buf, buffer[256];
|
||||
unsigned char sha1[20];
|
||||
int len, fd;
|
||||
|
||||
if (lstat(path, &st) < 0)
|
||||
@ -119,14 +120,23 @@ int validate_symref(const char *path)
|
||||
/*
|
||||
* Is it a symbolic ref?
|
||||
*/
|
||||
if (len < 4 || memcmp("ref:", buffer, 4))
|
||||
if (len < 4)
|
||||
return -1;
|
||||
buf = buffer + 4;
|
||||
len -= 4;
|
||||
while (len && isspace(*buf))
|
||||
buf++, len--;
|
||||
if (len >= 5 && !memcmp("refs/", buf, 5))
|
||||
if (!memcmp("ref:", buffer, 4)) {
|
||||
buf = buffer + 4;
|
||||
len -= 4;
|
||||
while (len && isspace(*buf))
|
||||
buf++, len--;
|
||||
if (len >= 5 && !memcmp("refs/", buf, 5))
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Is this a detached HEAD?
|
||||
*/
|
||||
if (!get_sha1_hex(buffer, sha1))
|
||||
return 0;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -241,7 +251,7 @@ char *enter_repo(char *path, int strict)
|
||||
return NULL;
|
||||
|
||||
if (access("objects", X_OK) == 0 && access("refs", X_OK) == 0 &&
|
||||
validate_symref("HEAD") == 0) {
|
||||
validate_headref("HEAD") == 0) {
|
||||
putenv("GIT_DIR=.");
|
||||
check_repository_format();
|
||||
return path;
|
||||
|
Reference in New Issue
Block a user