On Fri, Aug 03 2018, Jeff King wrote: > On Fri, Aug 03, 2018 at 02:56:11PM +0200, Ævar Arnfjörð Bjarmason wrote: > >> > Any Git commands you run should therefore find objects from either >> > location, but any writes would go to the quarantine (most notably, Git's >> > own index-pack/unpack-objects processes, which is the point of the >> > quarantine in the first place). >> >> To add to this, one interesting thing that you can do with hooks because >> of this quarantine is to answer certain questions about the push that >> were prohibitively expensive before it existed, but there's no explicit >> documentation for this. >> >> E.g. for a hook that wants to ban big blobs in the repo, but wants to >> allow all existing blobs (you don't want to block e.g. a revert of a >> commit that removed it from the checkout), you can juggle these two env >> variables and hide the "main" object dir from the hook for some >> operations, so e.g. if a blob lookup succeeds in the alternate >> quarantine dir, but not the main object dir, you know it's new. > > I'd be a bit careful with that, though, as the definition of "new" is > vague there. > > For example, completing a thin pack may mean that the receiver creates a > copy of a base object found in the main repo. That object isn't new as > part of the push, nor was it even sent on the wire, but it will appear > in the quarantine directory. But only sometimes, depending on whether we > kept the sender's pack or exploded it to loose objects. Right, I mean: is_new = !in_quarantine() && in_main() Or: is_new = !in_main() Should work, in the latter case if the object really is missing from the quarnatine too, other fsck bits will stop the push. But as you point out: is_new = in_quarantine() Cannot be relied upon, although it'll be true most of the time. Perhaps I'm missing some edge case above, but I wanted to reword it to make sure I understood it correctly (and perhaps you have a correction).