threads / patch / 10152

patchsetup/rev-parse: allow HEAD to be spelled 'head'

Subject: [PATCH] setup/rev-parse: allow HEAD to be spelled 'head'

## tl;dr

6 messages between Oct 5, 2007 and Oct 7, 2007. Diffs are folded; open one to read it.

replies: 5people: 3as markdown or json

Sam Vilain· Oct 5, 2007, 03:09 UTC · lore

If the repository got mangled by FAT capitalization rules, then a ref such as "HEAD" will become "head" once it is back on a non-FAT FS. Check for this condition in resolve_refs and in the setup code.

Suggested-by: Francois Marier <francois@debian.org>
Signed-off-by: Sam Vilain <sam.vilain@catalyst.net.nz>
---
  This should probably help people putting their git repos on
  FAT USB sticks.
 refs.c  |   28 ++++++++++++++++++++++++----
 setup.c |    7 +++++--
 2 files changed, 29 insertions(+), 6 deletions(-)
Show changes to 2 files +29 −6

refs.c, setup.c

diff --git a/refs.c b/refs.c
index 09a2c87..89ffb15 100644
--- a/refs.c
+++ b/refs.c
@@ -400,10 +400,30 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int *
 				}
 				list = list->next;
 			}
-			if (reading || errno != ENOENT)
-				return NULL;
-			hashclr(sha1);
-			return ref;
+			if (reading || errno != ENOENT) {
+				/*
+				 * Hack for FAT-mangled ref filenames
+				 */
+				if (strlen(ref) <= 8) {
+					char lc_name[9];
+					char* i;
+					strncpy(&lc_name, ref, 9);
+					for (i = lc_name; *i; i++) {
+						*i = tolower(*i);
+					}
+					path = git_path("%s", lc_name);
+					if (lstat(path, &st) < 0) {
+						return NULL;
+					}
+				}
+				else {
+					return NULL;
+				}
+			}
+			else {
+				hashclr(sha1);
+				return ref;
+			}
 		}
 
 		/* Follow "normalized" - ie "refs/.." symlinks by hand */
diff --git a/setup.c b/setup.c
index 06004f1..284d7b9 100644
--- a/setup.c
+++ b/setup.c
@@ -168,8 +168,11 @@ static int is_git_directory(const char *suspect)
 		return 0;
 
 	strcpy(path + len, "/HEAD");
-	if (validate_headref(path))
-		return 0;
+	if (validate_headref(path)) {
+		strcpy(path + len, "/head");
+		if (validate_headref(path))
+			return 0;
+	}
 
 	return 1;
 }
-- 
1.5.3.2.3.g2f2dcc-dirty
Johannes Schindelin· Oct 5, 2007, 03:16 UTC · re: Sam Vilain · lore

Re: [PATCH] setup/rev-parse: allow HEAD to be spelled 'head'

Hi,
On Fri, 5 Oct 2007, Sam Vilain wrote:
> If the repository got mangled by FAT capitalization rules, then a ref 
> such as "HEAD" will become "head" once it is back on a non-FAT FS.

Can we have that optionally, please? I.e. triggered by something like "core.caseChallengedFS = true"?

Ciao, Dscho

Alex Riesen· Oct 5, 2007, 06:51 UTC · re: Sam Vilain · lore

Re: [PATCH] setup/rev-parse: allow HEAD to be spelled 'head'

Sam Vilain, Fri, Oct 05, 2007 05:09:10 +0200:
Show 9 quoted lines
> If the repository got mangled by FAT capitalization rules, then a ref
> such as "HEAD" will become "head" once it is back on a non-FAT FS.
> Check for this condition in resolve_refs and in the setup code.
> 
> Suggested-by: Francois Marier <francois@debian.org>
> Signed-off-by: Sam Vilain <sam.vilain@catalyst.net.nz>
> ---
>   This should probably help people putting their git repos on
>   FAT USB sticks.
Can the people just mount FAT partitions with shortname=mixed?
Sam Vilain· Oct 6, 2007, 22:23 UTC · re: Alex Riesen · lore

Re: [PATCH] setup/rev-parse: allow HEAD to be spelled 'head'

Alex Riesen wrote:
Show 12 quoted lines
> Sam Vilain, Fri, Oct 05, 2007 05:09:10 +0200:
>> If the repository got mangled by FAT capitalization rules, then a ref
>> such as "HEAD" will become "head" once it is back on a non-FAT FS.
>> Check for this condition in resolve_refs and in the setup code.
>>
>> Suggested-by: Francois Marier <francois@debian.org>
>> Signed-off-by: Sam Vilain <sam.vilain@catalyst.net.nz>
>> ---
>>   This should probably help people putting their git repos on
>>   FAT USB sticks.
> 
> Can the people just mount FAT partitions with shortname=mixed?

Of course, that is probably a solution to the problem, whereas my patch is a workaround.

Now, I realise that this might open a can of worms ... would we also want to go looking for files called "pack-ab~1.pac" ? Almost certainly not - but this solves the most immediate problem experienced by people putting their git repositories onto FAT filesystems mounted with the default options, which will say "FATAL: not a git repository" otherwise.

Sam.
Johannes Schindelin· Oct 7, 2007, 16:49 UTC · re: Sam Vilain · lore

Re: [PATCH] setup/rev-parse: allow HEAD to be spelled 'head'

Hi,
On Sun, 7 Oct 2007, Sam Vilain wrote:
Show 19 quoted lines
> Alex Riesen wrote:
> > Sam Vilain, Fri, Oct 05, 2007 05:09:10 +0200:
> >> If the repository got mangled by FAT capitalization rules, then a ref
> >> such as "HEAD" will become "head" once it is back on a non-FAT FS.
> >> Check for this condition in resolve_refs and in the setup code.
> >>
> >> Suggested-by: Francois Marier <francois@debian.org>
> >> Signed-off-by: Sam Vilain <sam.vilain@catalyst.net.nz>
> >> ---
> >>   This should probably help people putting their git repos on
> >>   FAT USB sticks.
> > 
> > Can the people just mount FAT partitions with shortname=mixed?
> 
> Of course, that is probably a solution to the problem, whereas my patch
> is a workaround.
> 
> Now, I realise that this might open a can of worms ... would we also
> want to go looking for files called "pack-ab~1.pac" ?
Hell, no.
> Almost certainly not - but this solves the most immediate problem 
> experienced by people putting their git repositories onto FAT 
> filesystems mounted with the default options, which will say "FATAL: not 
> a git repository" otherwise.

You certainly mean the issue of capitalization; yes, that is my experience, too. Somehow, "HEAD" is the culprit.

Ciao, Dscho

P.S.: seems you have quite cute coworkers.

← back to recent threads