Git development
 help / color / mirror / Atom feed
From: Linus Torvalds <torvalds@osdl.org>
To: Junio C Hamano <junkio@cox.net>, Git Mailing List <git@vger.kernel.org>
Subject: Be more careful about reference parsing
Date: Fri, 28 Oct 2005 12:41:49 -0700 (PDT)	[thread overview]
Message-ID: <Pine.LNX.4.64.0510281220290.4664@g5.osdl.org> (raw)


This does two things:

 - we don't allow "." and ".." as components of a refname. Thus get_sha1() 
   will not accept "./refname" as being the same as "refname" any more.

 - git-rev-parse stops doing revision translation after seeing a pathname, 
   to match the brhaviour of all the tools (once we see a pathname, 
   everything else will also be parsed as a pathname).

Basically, if you did

	git log *

and "gitk" was somewhere in the "*", we don't want to replace the filename 
"gitk" with the SHA1 of the branch with the same name.

Of course, if there is any change of ambiguity, you should always use "--" 
to make it explicit what are filenames and what are revisions, but this 
makes the normal cases sane. The refname rule also means that instead of 
the "--", you can do the same thing we're used to doing with filenames 
that start with a slash: use "./filename" instead, and now it's a 
filename, not an option (and not a revision).

So "git log ./*.c" is now actually a perfectly valid thing to do, even if 
the first C-file might have the same name as a branch.

Trivial test:

	git-rev-parse gitk ./gitk gitk

should output something like

	9843c3074dfbf57117565f6b7c93e3e6812857ee
	./gitk
	gitk

where the "./gitk" isn't seen as a revision, and the second "gitk" is a 
filename simply because we've seen filenames already, and thus stopped 
doing revision parsing.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
----

I like my "ambiguous_path()" function. Now, admittedly it thinks that 
".../" is also an ambigious path since it doesn't count the dots. But 
since we already don't like ".." inside refnames, we don't much care.

diff --git a/rev-parse.c b/rev-parse.c
index adfc68c..169d0cc 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 cc320d3..fe409fb 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -203,6 +203,29 @@ const char *find_unique_abbrev(const uns
 	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 *st
 	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))

                 reply	other threads:[~2005-10-28 19:42 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Pine.LNX.4.64.0510281220290.4664@g5.osdl.org \
    --to=torvalds@osdl.org \
    --cc=git@vger.kernel.org \
    --cc=junkio@cox.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox