fall back to checking lower case hash directories in normal repo

Fix a bug that prevented getting content from a repository that started out
as a bare repository, or had annex.crippledfilesystem set, and was
converted to a non-bare repository.

This unfortunately means that inAnnex check gets slowed down by a stat call
in normal repos when the content is not present. Oh well, such is the cost
of backwards compatability with old mistakes.

Sponsored-by: Mark Reidenbach on Patreon
This commit is contained in:
Joey Hess 2021-07-15 12:16:31 -04:00
parent c3fb25c317
commit dd31fe7b9e
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
3 changed files with 39 additions and 4 deletions

View file

@ -172,6 +172,8 @@ gitAnnexLocation' key r config crippled symlinkssupported checker gitdir
{- Bare repositories default to hashDirLower for new
- content, as it's more portable. But check all locations. -}
| Git.repoIsLocalBare r = checkall
{- If the repository is configured to only use lower, no need
- to check both. -}
| hasDifference ObjectHashLower (annexDifferences config) =
only hashDirLower
{- Repositories on crippled filesystems use hashDirLower
@ -181,10 +183,11 @@ gitAnnexLocation' key r config crippled symlinkssupported checker gitdir
| crippled = if symlinkssupported
then check $ map inrepo $ reverse $ annexLocations config key
else checkall
{- Regular repositories only use hashDirMixed, so
- don't need to do any work to check if the file is
- present. -}
| otherwise = only hashDirMixed
{- Regular repositories usually only use hashDirMixed.
- However, it's always possible that a bare repository was
- converted to non-bare, or that the cripped filesystem
- setting changed, so still need to check both. -}
| otherwise = checkall
where
only = return . inrepo . annexLocation config key
checkall = check $ map inrepo $ annexLocations config key

View file

@ -2,6 +2,9 @@ git-annex (8.20210715) UNRELEASED; urgency=medium
* whereused: New command, finds what files use a key, or where a key
was used historically.
* Fix a bug that prevented getting content from a repository that
started out as a bare repository, or had annex.crippledfilesystem
set, and was converted to a non-bare repository.
-- Joey Hess <id@joeyh.name> Wed, 14 Jul 2021 14:26:36 -0400

View file

@ -0,0 +1,29 @@
[[!comment format=mdwn
username="joey"
subject="""comment 1"""
date="2021-07-15T15:51:16Z"
content="""
Note that 8.20.200226 is not a valid git-annex version and it would be good
to know the actual version used on WSL.
The mixed-case folder name is what git-annex uses when storing files in a
git repository that is not bare. The lower-case 3 letter name is used in a bare
repository. It is also used when git-annex detects a crippled filesystem
-- which it likely would for a USB drive using FAT or something.
Does the repository have annex.crippledfilesystem set in its git config?
Ok, I found a way to reproduce this. I made a repository with
annex.crippledfilesystem set, and copied a file to it. Then I unset
annex.crippledfilesystem. Getting the file in another repository then
fails.
git-annex does already deal with cases where a non-bare repo is converted
to bare, by trying both names, but it does not in this case.
I've fixed the problem, but am still curious about how you got into this
situation. Anyway, install a git-annex autobuild a few hours after this
comment to get the fix.
(Please use [[bugs]] to report bug reports in the future, this forum is not
a BTS and you cause extra work by posting bugs here.)
"""]]