import Git.CatFile
import Git.Branch (writeTreeQuiet, update')
import qualified Git.Ref
+import qualified Git.Config
import Config.Smudge
import qualified Utility.RawFilePath as R
{- Note that the files returned were once associated with the key, but
- some of them may not be any longer. -}
getAssociatedFiles :: Key -> Annex [TopFilePath]
-getAssociatedFiles = runReaderIO . SQL.getAssociatedFiles
+getAssociatedFiles k = emptyWhenBare $ runReaderIO $ SQL.getAssociatedFiles k
+
+{- Queries for associated files never return anything when in a bare
+ - repository, since without a work tree there can be no associated files.
+ -
+ - Normally the keys database is not even populated with associated files
+ - in a bare repository, but it might happen if a non-bare repo got
+ - converted to bare. -}
+emptyWhenBare :: Annex [a] -> Annex [a]
+emptyWhenBare a = ifM (Git.Config.isBare <$> gitRepo)
+ ( return []
+ , a
+ )
{- Include a known associated file along with any recorded in the database. -}
getAssociatedFilesIncluding :: AssociatedFile -> Key -> Annex [RawFilePath]
-getAssociatedFilesIncluding afile k = do
+getAssociatedFilesIncluding afile k = emptyWhenBare $ do
g <- Annex.gitRepo
l <- map (`fromTopFilePath` g) <$> getAssociatedFiles k
return $ case afile of
{- Gets any keys that are on record as having a particular associated file.
- (Should be one or none but the database doesn't enforce that.) -}
getAssociatedKey :: TopFilePath -> Annex [Key]
-getAssociatedKey = runReaderIO . SQL.getAssociatedKey
+getAssociatedKey f = emptyWhenBare $ runReaderIO $ SQL.getAssociatedKey f
removeAssociatedFile :: Key -> TopFilePath -> Annex ()
removeAssociatedFile k = runWriterIO . SQL.removeAssociatedFile k
- is an associated file.
-}
reconcileStaged :: H.DbQueue -> Annex ()
-reconcileStaged qh = do
+reconcileStaged qh = unlessM (Git.Config.isBare <$> gitRepo) $ do
gitindex <- inRepo currentIndexFile
indexcache <- fromRawFilePath <$> fromRepo gitAnnexKeysDbIndexCache
withTSDelta (liftIO . genInodeCache gitindex) >>= \case
--- /dev/null
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2022-01-11T16:25:50Z"
+ content="""
+`git update-index` creates an index file. A repo with an index file is no
+longer a bare repo to a certain extent, at least it is very unusual for a
+repo to be both bare and contain an index file, since after all an index
+file is a record of the files in the working tree. This seems to be the root
+of the confusion.
+
+I was able to reproduce this by simply copying `.git/index` from a non-bare
+repo into the bare repo and then running `git-annex drop --all`.
+
+Removing the index file was not sufficient to fix it. It turned out I also
+needed to delete `annex/keydb*`. Then things returned to normal.
+
+So, it seems that the keys database is getting populated in a bare repo
+when there's an index file, and once the keys database is populated, it
+runs code paths that will not work in a bare repo, because that database
+contains paths (taken from the index) that it treats as being present in a
+nonexistant working tree. I've fixed it to both avoid populating the keys
+database, and ignore a populated keys database in this situation.
+
+But.. My suggestion is, if you need to do this kind of thing in a bare repo,
+set `GIT_INDEX_FILE` to some other file. That's how git-annex makes similar
+tree objects.
+"""]]