From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Cc: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Subject: [PATCH] fsck --lost-found: show found commits human readably
Date: Tue, 25 Mar 2008 23:45:47 -0700 [thread overview]
Message-ID: <7vbq52gezo.fsf@gitster.siamese.dyndns.org> (raw)
An earlier commit fc8b5f0 (Deprecate git-lost-found, 2007-11-08) declared
"lost-found" deprecated, because "fsck" learned "--lost-found" option that
drops the found objects in $GIT_DIR/lost-found.
But the output from the lost-found program has been much more informative
than the plain vanilla "git fsck" (or "git fsck --lost-found") output. In
that sense, forcing users to use "fsck --lost-found" when they want to use
"lost-found" is a regression.
This patch slightly enhances the output from "fsck --lost-found" to add
oneline description at the end of the usual "dangling <type> <sha-1>"
message for commit objects it found.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
* Is it just me, or were we very sloppy during 1.5.4 cycle that we are
getting hit by regressions left and right today from that period?
This looks bigger than it really is because most of it is about
moving a deeply nested part of another function into a separate
function.
This is _not_ a 1.5.5 material, as we are not removing git-lost-found
yet. We might however want to revert fc8b5f0, though, until an
enhancement along this line is in the mainline.
builtin-fsck.c | 94 ++++++++++++++++++++++++++++++++++++++------------------
1 files changed, 64 insertions(+), 30 deletions(-)
diff --git a/builtin-fsck.c b/builtin-fsck.c
index 78a6e1f..b57cc78 100644
--- a/builtin-fsck.c
+++ b/builtin-fsck.c
@@ -145,6 +145,68 @@ static void check_reachable_object(struct object *obj)
}
}
+static void dangling_object(struct object *obj)
+{
+ char *filename;
+ FILE *f;
+ enum object_type type;
+ unsigned long size;
+ char *buf = NULL;
+
+ if (!write_lost_and_found)
+ goto report_and_exit;
+
+ filename = git_path("lost-found/%s/%s",
+ obj->type == OBJ_COMMIT ? "commit" : "other",
+ sha1_to_hex(obj->sha1));
+
+ if (safe_create_leading_directories(filename)) {
+ error("Could not create lost-found");
+ return;
+ }
+ if (!(f = fopen(filename, "w")))
+ die("Could not open %s", filename);
+ if (obj->type == OBJ_BLOB || obj->type == OBJ_COMMIT)
+ buf = read_sha1_file(obj->sha1, &type, &size);
+
+ if (obj->type == OBJ_BLOB) {
+ if (buf) {
+ fwrite(buf, size, 1, f);
+ free(buf);
+ }
+ } else
+ fprintf(f, "%s\n", sha1_to_hex(obj->sha1));
+ fclose(f);
+
+ if (obj->type == OBJ_COMMIT) {
+ struct strbuf sb = STRBUF_INIT;
+ struct commit *commit = lookup_commit(obj->sha1);
+ int reported = 0;
+
+ if (!commit->buffer)
+ commit->buffer = buf;
+ if (commit->buffer) {
+ parse_commit(commit);
+ pretty_print_commit(CMIT_FMT_ONELINE, commit, &sb,
+ 0, NULL, NULL, 0, 0);
+ printf("dangling commit %s (%s)\n",
+ sha1_to_hex(obj->sha1), sb.buf);
+ reported = 1;
+ }
+ strbuf_release(&sb);
+ free(commit->buffer);
+ if (buf && commit->buffer != buf)
+ free(buf);
+ commit->buffer = NULL;
+ if (reported)
+ return;
+ }
+
+ report_and_exit:
+ printf("dangling %s %s\n", typename(obj->type),
+ sha1_to_hex(obj->sha1));
+}
+
/*
* Check a single unreachable object
*/
@@ -180,36 +242,8 @@ static void check_unreachable_object(struct object *obj)
* deleted a branch by mistake, this is a prime candidate to
* start looking at, for example.
*/
- if (!obj->used) {
- printf("dangling %s %s\n", typename(obj->type),
- sha1_to_hex(obj->sha1));
- if (write_lost_and_found) {
- char *filename = git_path("lost-found/%s/%s",
- obj->type == OBJ_COMMIT ? "commit" : "other",
- sha1_to_hex(obj->sha1));
- FILE *f;
-
- if (safe_create_leading_directories(filename)) {
- error("Could not create lost-found");
- return;
- }
- if (!(f = fopen(filename, "w")))
- die("Could not open %s", filename);
- if (obj->type == OBJ_BLOB) {
- enum object_type type;
- unsigned long size;
- char *buf = read_sha1_file(obj->sha1,
- &type, &size);
- if (buf) {
- fwrite(buf, size, 1, f);
- free(buf);
- }
- } else
- fprintf(f, "%s\n", sha1_to_hex(obj->sha1));
- fclose(f);
- }
- return;
- }
+ if (!obj->used)
+ dangling_object(obj);
/*
* Otherwise? It's there, it's unreachable, and some other unreachable
next reply other threads:[~2008-03-26 6:46 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-26 6:45 Junio C Hamano [this message]
2008-03-28 14:05 ` [PATCH] fsck --lost-found: show found commits human readably Johannes Schindelin
2008-03-28 14:05 ` [PATCH 1/2] fsck --lost-found: refactor handling of dangling objects Johannes Schindelin
2008-03-28 14:08 ` [PATCH 2/2] fsck --lost-found: show found commits human readably Johannes Schindelin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7vbq52gezo.fsf@gitster.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox