"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Stefan Sperling <stsp@stsp.name>
Subject:
Re: leading separators in ignore patterns
To:
Evan Silberman <evan@jklol.net>
Cc:
gameoftrees@openbsd.org
Date:
Thu, 22 May 2025 08:50:51 +0200

Download raw body.

Thread
On Wed, May 21, 2025 at 02:57:47PM -0700, Evan Silberman wrote:
> realizing now my commit message refers to gitignore(7) but it's actually
> gitignore(5)...that'll bother me forever now

That happens every now and then :)
 
> > This looks like a small mistake in Git to me.
> > For all intents and purposes, // is the same as / in a path. For edge
> > cases like this, I'd rather have Got behave intuitively than replicate
> > Git's mistakes.
> 
> I thought perhaps what gitignore(5) says would cut against this but on
> taking another look I don't think it actually does. At best it's
> unspecified.

I propose this:

diff /home/stsp/src/got
path + /home/stsp/src/got
commit - 6ae2855c45508b25adb202d57dd345da8500b7bb
blob - 4e690714aa90a9b5159147f65bf8292f5ed4c327
file + lib/worktree.c
--- lib/worktree.c
+++ lib/worktree.c
@@ -3817,9 +3817,9 @@ match_path(const char *pattern, size_t pattern_len, co
 	size_t len = pattern_len;
 
 	/*
-	 * For gitignore(7) compatibility, ignore leading slashes
+	 * For gitignore(5) compatibility, ignore leading slashes.
 	 */
-	if (len > 0 && pat[0] == '/') {
+	while (len > 0 && pat[0] == '/') {
 		pat++;
 		len--;
 	}
commit - 6ae2855c45508b25adb202d57dd345da8500b7bb
blob - 5e57f89a8f3c5c4f999f1f0bd918335e63d74fb7
file + regress/cmdline/status.sh
--- regress/cmdline/status.sh
+++ regress/cmdline/status.sh
@@ -736,7 +736,7 @@ test_status_gitignore_leading_slashes() {
 	echo "unversioned file" > $testroot/wt/epsilon/nu/baz
 
 	echo "/foo" > $testroot/wt/.gitignore
-	echo "/nu" >> $testroot/wt/.gitignore
+	echo "//////////////////////////nu" >> $testroot/wt/.gitignore
 
 	echo '?  .gitignore' > $testroot/stdout.expected
 	echo '?  epsilon/bar' >> $testroot/stdout.expected