aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rev-parse.c1
-rw-r--r--sha1_name.c27
2 files changed, 28 insertions, 0 deletions
diff --git a/rev-parse.c b/rev-parse.c
index adfc68c9b..169d0cc9b 100644
--- a/rev-parse.c
+++ b/rev-parse.c
@@ -292,6 +292,7 @@ int main(int argc, char **argv)
}
if (verify)
die("Needed a single revision");
+ as_is = 1;
show_file(arg);
}
show_default();
diff --git a/sha1_name.c b/sha1_name.c
index cc320d3d7..fe409fbce 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -203,6 +203,29 @@ const char *find_unique_abbrev(const unsigned char *sha1, int len)
return NULL;
}
+static int ambiguous_path(const char *path)
+{
+ int slash = 1;
+
+ for (;;) {
+ switch (*path++) {
+ case '\0':
+ break;
+ case '/':
+ if (slash)
+ break;
+ slash = 1;
+ continue;
+ case '.':
+ continue;
+ default:
+ slash = 0;
+ continue;
+ }
+ return slash;
+ }
+}
+
static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
{
static const char *prefix[] = {
@@ -217,6 +240,10 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
if (len == 40 && !get_sha1_hex(str, sha1))
return 0;
+ /* Accept only unambiguous ref paths. */
+ if (ambiguous_path(str))
+ return -1;
+
for (p = prefix; *p; p++) {
char *pathname = git_path("%s/%.*s", *p, len, str);
if (!read_ref(pathname, sha1))