From: Michael Haggerty <hidden> Date: 2016-06-15 23:05:11
Previously, if a reflog entry's old or new SHA-1 was not resolvable to
an object, that SHA-1 was silently ignored. Instead, report such cases
as errors.
This patch series is also available from my GitHub account [1], branch
"fsck-reflog-entries".
Michael
[1] https://github.com/mhagger/git
Michael Haggerty (2):
fsck_handle_reflog_sha1(): new function
fsck: report errors if reflog entries point at invalid objects
builtin/fsck.c | 34 ++++++++++++++++++++--------------
1 file changed, 20 insertions(+), 14 deletions(-)
--
2.1.4
From: Michael Haggerty <hidden> Date: 2016-06-15 23:05:11
Previously, if a reflog entry's old or new SHA-1 was not resolvable to
an object, that SHA-1 was silently ignored. Instead, report such cases
as errors.
Signed-off-by: Michael Haggerty <redacted>
---
builtin/fsck.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
From: Michael Haggerty <hidden> Date: 2016-06-15 23:05:11
New function, extracted from fsck_handle_reflog_ent(). The extra
is_null_sha1() test for the new reference is currently unnecessary, as
reflogs are deleted when the reference itself is deleted. But it
doesn't hurt, either.
Signed-off-by: Michael Haggerty <redacted>
---
builtin/fsck.c | 29 +++++++++++++++--------------
1 file changed, 15 insertions(+), 14 deletions(-)
From: Johannes Schindelin <hidden> Date: 2016-06-15 23:05:11
Hi Michael,
On 2015-06-08 08:40, Michael Haggerty wrote:
New function, extracted from fsck_handle_reflog_ent(). The extra
is_null_sha1() test for the new reference is currently unnecessary, as
reflogs are deleted when the reference itself is deleted. But it
doesn't hurt, either.
This patch is probably easier to read with the `--patience` flag (at least I find the patch obviously good in that form):
-- snipsnap --
From: Johannes Schindelin <hidden> Date: 2016-06-15 23:05:11
Hi Michael,
On 2015-06-08 08:40, Michael Haggerty wrote:
Previously, if a reflog entry's old or new SHA-1 was not resolvable to
an object, that SHA-1 was silently ignored. Instead, report such cases
as errors.
I like the idea, but I am a bit uncertain whether it would constitute "too backwards-incompatible" a change to make this an error. I think it could be argued both ways: it *is* an improvement, but it could also possibly disrupt scripts that work pretty nicely at the moment.
My fsck-api branch will help with this, of course, as users whose scripts break could be (temporarily) demote the error to a warning. I planned to work on it this week and would be happy to rebase it onto this here patch series.
Ciao,
Dscho
From: Michael Haggerty <hidden> Date: 2016-06-15 23:05:12
On 06/08/2015 04:27 PM, Johannes Schindelin wrote:
On 2015-06-08 08:40, Michael Haggerty wrote:
quoted
Previously, if a reflog entry's old or new SHA-1 was not resolvable
to an object, that SHA-1 was silently ignored. Instead, report such
cases as errors.
I like the idea, but I am a bit uncertain whether it would constitute
"too backwards-incompatible" a change to make this an error. I think
it could be argued both ways: it *is* an improvement, but it could
also possibly disrupt scripts that work pretty nicely at the moment.
What kind of script are you worried about? One that mucks around inside
the object database / reflog files? If people do that, all bets are off,
no? Plus,
* This change only causes fsck to output an extra line (and exit with
a a non-zero retcode).
* Repair is only a
git reflog expire --expire-unreachable=now --all
away, I think.
From: Johannes Schindelin <hidden> Date: 2016-06-15 23:05:12
Hi Michael,
On 2015-06-08 17:09, Michael Haggerty wrote:
On 06/08/2015 04:27 PM, Johannes Schindelin wrote:
quoted
On 2015-06-08 08:40, Michael Haggerty wrote:
quoted
Previously, if a reflog entry's old or new SHA-1 was not resolvable
to an object, that SHA-1 was silently ignored. Instead, report such
cases as errors.
I like the idea, but I am a bit uncertain whether it would constitute
"too backwards-incompatible" a change to make this an error. I think
it could be argued both ways: it *is* an improvement, but it could
also possibly disrupt scripts that work pretty nicely at the moment.
What kind of script are you worried about?
I was concerned about scripts that work on repositories whose reflogs become inconsistent for whatever reason (that happened a lot to me in the past, IIRC it had something to do with bare repositories and/or shared object databases).
Now, if I was to run a script in, say, cron to verify that all of my repositories (possibly on a network drive, for shared team use), I could imagine that I actually want to error out if the reflogs become inconsistent. But then, I could also imagine that I care more about the script being quiet when everything is okay except for the reflogs.
* This change only causes fsck to output an extra line (and exit with
a a non-zero retcode).
It is that non-zero exit status that would make my hypothetical cron script start to fail.
* Repair is only a
git reflog expire --expire-unreachable=now --all
away, I think.
True.
Plus, as I mentioned, it could be considered a bug fix that fsck now reports this problem.
The more I think about it, the more I think it is actually a bug fix.
Thanks,
Dscho
From: Jeff King <hidden> Date: 2016-06-15 23:05:12
On Mon, Jun 08, 2015 at 06:00:09PM +0200, Johannes Schindelin wrote:
quoted
quoted
I like the idea, but I am a bit uncertain whether it would constitute
"too backwards-incompatible" a change to make this an error. I think
it could be argued both ways: it *is* an improvement, but it could
also possibly disrupt scripts that work pretty nicely at the moment.
What kind of script are you worried about?
I was concerned about scripts that work on repositories whose reflogs
become inconsistent for whatever reason (that happened a lot to me in
the past, IIRC it had something to do with bare repositories and/or
shared object databases).
I think these repositories are already broken. You cannot run `git gc`
in such a repository, as it will barf when trying to walk the reflog
tips during `git repack`.
We run into this exact situation at GitHub because of our shared object
databases. Our per-fork repack code basically has to do:
if ! git repack ...; then
git reflog expire --expire-unreachable=all --all &&
git repack ... ||
die "ok, it really is broken"
fi
-Peff
From: Johannes Schindelin <hidden> Date: 2016-06-15 23:05:12
Hi Peff,
On 2015-06-08 18:56, Jeff King wrote:
On Mon, Jun 08, 2015 at 06:00:09PM +0200, Johannes Schindelin wrote:
quoted
quoted
quoted
I like the idea, but I am a bit uncertain whether it would constitute
"too backwards-incompatible" a change to make this an error. I think
it could be argued both ways: it *is* an improvement, but it could
also possibly disrupt scripts that work pretty nicely at the moment.
What kind of script are you worried about?
I was concerned about scripts that work on repositories whose reflogs
become inconsistent for whatever reason (that happened a lot to me in
the past, IIRC it had something to do with bare repositories and/or
shared object databases).
I think these repositories are already broken. You cannot run `git gc`
in such a repository, as it will barf when trying to walk the reflog
tips during `git repack`.
We run into this exact situation at GitHub because of our shared object
databases. Our per-fork repack code basically has to do:
if ! git repack ...; then
git reflog expire --expire-unreachable=all --all &&
git repack ... ||
die "ok, it really is broken"
fi
Good point. So if I needed any more convincing that Michael's patch is a bug fix (as opposed to a backwards-incompatible change), this did it.
Ciao,
Dscho