diff options
author | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2013-01-21 20:00:48 +0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2013-01-21 16:57:24 -0800 |
commit | 4db86e8b6e8002b3113341ad742bf2fd94d4df50 (patch) | |
tree | 0eb5b1c2082f9ba46756bb6cb9b26efe588dfd98 /setup.c | |
parent | fe73786b482f11e7a37a269c95d222a384fc5a39 (diff) | |
download | git-4db86e8b6e8002b3113341ad742bf2fd94d4df50.tar.gz git-4db86e8b6e8002b3113341ad742bf2fd94d4df50.tar.xz |
Update :/abc ambiguity check
:/abc may mean two things:
- as a revision, it means the revision that has "abc" in commit
message.
- as a pathpec, it means "abc" from root.
Currently we see ":/abc" as a rev (most of the time), but never see it
as a pathspec even if "abc" exists and "git log :/abc" will gladly
take ":/abc" as rev even it's ambiguous. This patch makes it:
- ambiguous when "abc" exists on worktree
- a rev if abc does not exist on worktree
- a path if abc is not found in any commits (although better use
"--" to avoid ambiguation because searching through commit DAG is
expensive)
A plus from this patch is, because ":/" never matches anything as a
rev, it is never considered a valid rev and because root directory
always exists, ":/" is always unambiguously seen as a pathspec.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'setup.c')
-rw-r--r-- | setup.c | 9 |
1 files changed, 8 insertions, 1 deletions
@@ -66,7 +66,14 @@ int check_filename(const char *prefix, const char *arg) const char *name; struct stat st; - name = prefix ? prefix_filename(prefix, strlen(prefix), arg) : arg; + if (!prefixcmp(arg, ":/")) { + if (arg[2] == '\0') /* ":/" is root dir, always exists */ + return 1; + name = arg + 2; + } else if (prefix) + name = prefix_filename(prefix, strlen(prefix), arg); + else + name = arg; if (!lstat(name, &st)) return 1; /* file exists */ if (errno == ENOENT || errno == ENOTDIR) |