* rsync 3.2.4 broke backwards-compatability by preventing exposing
filenames to the shell. Made the rsync and gcrypt special remotes
detect this and disable shellescape. Closes: #1010397
+ * repair: Avoid treating refs/annex/last-index or other refs that
+ are not commit objects as evidence of repository corruption.
-- Joey Hess <id@joeyh.name> Mon, 28 Mar 2022 14:46:10 -0400
- the commit. Also adds to a set of commit shas that have been verified to
- be good, which can be passed into subsequent calls to avoid
- redundant work when eg, chasing down branches to find the first
- - uncorrupted commit. -}
+ - uncorrupted commit.
+ -
+ - When the sha is not a commit but some other git object, returns
+ - true, but does not add it to the set.
+ -}
verifyCommit :: MissingObjects -> GoodCommits -> Sha -> Repo -> IO (Bool, GoodCommits)
verifyCommit missing goodcommits commit r
| checkGoodCommit commit goodcommits = return (True, goodcommits)
, Param (fromRef commit)
] r
let committrees = map (parse . decodeBL) ls
- if any isNothing committrees || null committrees
- then do
- void cleanup
- return (False, goodcommits)
- else do
- let cts = catMaybes committrees
- ifM (cleanup <&&> check cts)
- ( return (True, addGoodCommits (map fst cts) goodcommits)
- , return (False, goodcommits)
- )
+ -- git log on an object that is not a commit will
+ -- succeed without any output
+ if null committrees
+ then ifM cleanup
+ ( return (True, goodcommits)
+ , return (False, goodcommits)
+ )
+ else if any isNothing committrees
+ then do
+ void cleanup
+ return (False, goodcommits)
+ else do
+ let cts = catMaybes committrees
+ ifM (cleanup <&&> check cts)
+ ( return (True, addGoodCommits (map fst cts) goodcommits)
+ , return (False, goodcommits)
+ )
where
parse l = case words l of
(commitsha:treesha:[]) -> (,)
--- /dev/null
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2022-05-04T15:06:31Z"
+ content="""
+Thank you, your "Reproducible Example" worked for me to reproduce it!
+Great work finding this and tracking down an easy way to reproduce it.
+
+So the root of the problem is refs/annex/last-index,
+which contains a tree object, not a commit object. That is unusual for a ref,
+but git-annex has a good reason to record a tree's ref there.
+
+Fixed
+"""]]