diff options
author | Junio C Hamano <junkio@cox.net> | 2007-02-04 16:54:47 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2007-02-04 16:54:47 -0800 |
commit | d1f289c5aa52bb77dc4959fb21cef032d954869f (patch) | |
tree | 525c95c67c6ae06278a99f244dc5d120c45a8747 /sha1_name.c | |
parent | 6e2e1cfb81a6a6de9fc074bd26bed8a45f73251f (diff) | |
parent | 632ac9fd12a2d4ff2c1a1fcd63492ce24315221f (diff) | |
download | git-d1f289c5aa52bb77dc4959fb21cef032d954869f.tar.gz |
Merge branch 'np/dreflog'
* np/dreflog:
show-branch -g: default to the current branch.
Let git-checkout always drop any detached head
Enable HEAD@{...} and make it independent from the current branch
scan reflogs independently from refs
add reflog when moving HEAD to a new branch
create_symref(): do not assume pathname from git_path() persists long enough
add logref support to git-symbolic-ref
move create_symref() past log_ref_write()
add reflog entries for HEAD when detached
enable separate reflog for HEAD
lock_ref_sha1_basic(): remember the original name of a ref when resolving it
make reflog filename independent from struct ref_lock
Diffstat (limited to 'sha1_name.c')
-rw-r--r-- | sha1_name.c | 62 |
1 files changed, 36 insertions, 26 deletions
diff --git a/sha1_name.c b/sha1_name.c index de8caf8cf6..d77f77097f 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -235,22 +235,23 @@ static int ambiguous_path(const char *path, int len) return slash; } +static const char *ref_fmt[] = { + "%.*s", + "refs/%.*s", + "refs/tags/%.*s", + "refs/heads/%.*s", + "refs/remotes/%.*s", + "refs/remotes/%.*s/HEAD", + NULL +}; + int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref) { - static const char *fmt[] = { - "%.*s", - "refs/%.*s", - "refs/tags/%.*s", - "refs/heads/%.*s", - "refs/remotes/%.*s", - "refs/remotes/%.*s/HEAD", - NULL - }; const char **p, *r; int refs_found = 0; *ref = NULL; - for (p = fmt; *p; p++) { + for (p = ref_fmt; *p; p++) { unsigned char sha1_from_ref[20]; unsigned char *this_result; @@ -266,6 +267,28 @@ int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref) return refs_found; } +static int dwim_log(const char *str, int len, unsigned char *sha1, char **log) +{ + const char **p; + int logs_found = 0; + + *log = NULL; + for (p = ref_fmt; *p; p++) { + struct stat st; + char *path = mkpath(*p, len, str); + if (!stat(git_path("logs/%s", path), &st) && + S_ISREG(st.st_mode)) { + if (!logs_found++) { + *log = xstrdup(path); + resolve_ref(path, sha1, 0, NULL); + } + if (!warn_ambiguous_refs) + break; + } + } + return logs_found; +} + static int get_sha1_basic(const char *str, int len, unsigned char *sha1) { static const char *warning = "warning: refname '%.*s' is ambiguous.\n"; @@ -295,7 +318,9 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1) if (!len && reflog_len) { /* allow "@{...}" to mean the current branch reflog */ refs_found = dwim_ref("HEAD", 4, sha1, &real_ref); - } else + } else if (reflog_len) + refs_found = dwim_log(str, len, sha1, &real_ref); + else refs_found = dwim_ref(str, len, sha1, &real_ref); if (!refs_found) @@ -310,21 +335,6 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1) unsigned long co_time; int co_tz, co_cnt; - /* - * We'll have an independent reflog for "HEAD" eventually - * which won't be a synonym for the current branch reflog. - * In the mean time prevent people from getting used to - * such a synonym until the work is completed. - */ - if (len && !strncmp("HEAD", str, len) && - !strncmp(real_ref, "refs/", 5)) { - error("reflog for HEAD has not been implemented yet\n" - "Maybe you could try %s%s instead, " - "or just %s for current branch..", - strchr(real_ref+5, '/')+1, str+len, str+len); - exit(-1); - } - /* Is it asking for N-th entry, or approxidate? */ for (i = nth = 0; 0 <= nth && i < reflog_len; i++) { char ch = str[at+2+i]; |