When parsing pointers, we parsed the size of the object using ParseInt
with a third argument of 0. This caused the argument to be parsed as an
int, which on 32-bit systems is 32 bits in size. Consequently, when we
had an object larger than 4 GiB in size on a 32-bit system, we would
reject the pointer file as invalid and never realize the object needed
to be pushed, leading to the server side rejecting our pushes due to
missing objects.
Set the size of the integer we're parsing to 64 bits to ensure that we
can always parse a pointer correctly.
This was always the intention but the PointerSmudge functions would
automatically do it if the local files were missing. Now they take a
boolean argument to say whether to download or not, and the case of
skipped smudge is dealt with by writing out the original pointer data
and returning a known non-fatal error.
This refactoring will make a number of things easier. These didn't
really need to be in their own packages. Having them separate packages,
there are a few refactorings I've tried to do that end up with circular
dependencies due to things outside of `lfs` depending on `lfs`. Pushing
these into `lfs` makes refactoring simpler.