* [PATCH] git-fsck: add --lost-found option
@ 2007-07-02 16:53 Johannes Schindelin
2007-07-02 23:11 ` Junio C Hamano
0 siblings, 1 reply; 7+ messages in thread
From: Johannes Schindelin @ 2007-07-02 16:53 UTC (permalink / raw)
To: git, gitster
[-- Attachment #1: Type: TEXT/PLAIN, Size: 7057 bytes --]
With this option, dangling objects are not only reported, but also
written to .git/lost-found/commit/ or .git/lost-found/other/.
This obsoletes git-lost-found.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
Even adding a test script, and changing C code, this removes more
lines than it adds...
Something we might want to do, however, is to add a warning if the
user said --lost-found without --no-reflogs.
Documentation/cmd-list.perl | 1 -
Documentation/git-fsck.txt | 6 ++-
Documentation/git-lost-found.txt | 77 --------------------------------------
Makefile | 2 +-
builtin-fsck.c | 20 ++++++++++
t/t1420-lost-found.sh | 35 +++++++++++++++++
6 files changed, 61 insertions(+), 80 deletions(-)
delete mode 100644 Documentation/git-lost-found.txt
create mode 100755 t/t1420-lost-found.sh
diff --git a/Documentation/cmd-list.perl b/Documentation/cmd-list.perl
index f50f613..9cae338 100755
--- a/Documentation/cmd-list.perl
+++ b/Documentation/cmd-list.perl
@@ -123,7 +123,6 @@ git-instaweb ancillaryinterrogators
gitk mainporcelain
git-local-fetch synchingrepositories
git-log mainporcelain
-git-lost-found ancillarymanipulators
git-ls-files plumbinginterrogators
git-ls-remote plumbinginterrogators
git-ls-tree plumbinginterrogators
diff --git a/Documentation/git-fsck.txt b/Documentation/git-fsck.txt
index 234c22f..08512e0 100644
--- a/Documentation/git-fsck.txt
+++ b/Documentation/git-fsck.txt
@@ -10,7 +10,7 @@ SYNOPSIS
--------
[verse]
'git-fsck' [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]
- [--full] [--strict] [--verbose] [<object>*]
+ [--full] [--strict] [--verbose] [--lost-found] [<object>*]
DESCRIPTION
-----------
@@ -64,6 +64,10 @@ index file and all SHA1 references in .git/refs/* as heads.
--verbose::
Be chatty.
+--lost-found::
+ Write dangling refs into .git/commit/ or .git/other/, depending
+ on type.
+
It tests SHA1 and general object sanity, and it does full tracking of
the resulting reachability and everything else. It prints out any
corruption it finds (missing or bad objects), and if you use the
diff --git a/Documentation/git-lost-found.txt b/Documentation/git-lost-found.txt
deleted file mode 100644
index e48607f..0000000
--- a/Documentation/git-lost-found.txt
+++ /dev/null
@@ -1,77 +0,0 @@
-git-lost-found(1)
-=================
-
-NAME
-----
-git-lost-found - Recover lost refs that luckily have not yet been pruned
-
-SYNOPSIS
---------
-'git-lost-found'
-
-DESCRIPTION
------------
-Finds dangling commits and tags from the object database, and
-creates refs to them in the .git/lost-found/ directory. Commits and
-tags that dereference to commits are stored in .git/lost-found/commit,
-and other objects are stored in .git/lost-found/other.
-
-
-OUTPUT
-------
-Prints to standard output the object names and one-line descriptions
-of any commits or tags found.
-
-EXAMPLE
--------
-
-Suppose you run 'git tag -f' and mistype the tag to overwrite.
-The ref to your tag is overwritten, but until you run 'git
-prune', the tag itself is still there.
-
-------------
-$ git lost-found
-[1ef2b196d909eed523d4f3c9bf54b78cdd6843c6] GIT 0.99.9c
-...
-------------
-
-Also you can use gitk to browse how any tags found relate to each
-other.
-
-------------
-$ gitk $(cd .git/lost-found/commit && echo ??*)
-------------
-
-After making sure you know which the object is the tag you are looking
-for, you can reconnect it to your regular .git/refs hierarchy.
-
-------------
-$ git cat-file -t 1ef2b196
-tag
-$ git cat-file tag 1ef2b196
-object fa41bbce8e38c67a218415de6cfa510c7e50032a
-type commit
-tag v0.99.9c
-tagger Junio C Hamano <junkio@cox.net> 1131059594 -0800
-
-GIT 0.99.9c
-
-This contains the following changes from the "master" branch, since
-...
-$ git update-ref refs/tags/not-lost-anymore 1ef2b196
-$ git rev-parse not-lost-anymore
-1ef2b196d909eed523d4f3c9bf54b78cdd6843c6
-------------
-
-Author
-------
-Written by Junio C Hamano 濱野 純 <junkio@cox.net>
-
-Documentation
---------------
-Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>.
-
-
-GIT
----
-Part of the gitlink:git[7] suite
diff --git a/Makefile b/Makefile
index d7f686a..d4633bc 100644
--- a/Makefile
+++ b/Makefile
@@ -215,7 +215,7 @@ SCRIPT_SH = \
git-am.sh \
git-merge.sh git-merge-stupid.sh git-merge-octopus.sh \
git-merge-resolve.sh git-merge-ours.sh \
- git-lost-found.sh git-quiltimport.sh git-submodule.sh \
+ git-quiltimport.sh git-submodule.sh \
git-filter-branch.sh \
git-stash.sh
diff --git a/builtin-fsck.c b/builtin-fsck.c
index 944a496..a530700 100644
--- a/builtin-fsck.c
+++ b/builtin-fsck.c
@@ -20,6 +20,7 @@ static int check_strict;
static int keep_cache_objects;
static unsigned char head_sha1[20];
static int errors_found;
+static int write_lost_and_found;
static int verbose;
#define ERROR_OBJECT 01
#define ERROR_REACHABLE 02
@@ -138,6 +139,21 @@ static void check_unreachable_object(struct object *obj)
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);
+ fprintf(f, "%s\n", sha1_to_hex(obj->sha1));
+ fclose(f);
+ }
return;
}
@@ -685,6 +701,10 @@ int cmd_fsck(int argc, char **argv, const char *prefix)
verbose = 1;
continue;
}
+ if (!strcmp(arg, "--lost-found")) {
+ write_lost_and_found = 1;
+ continue;
+ }
if (*arg == '-')
usage(fsck_usage);
}
diff --git a/t/t1420-lost-found.sh b/t/t1420-lost-found.sh
new file mode 100755
index 0000000..dc9e402
--- /dev/null
+++ b/t/t1420-lost-found.sh
@@ -0,0 +1,35 @@
+#!/bin/sh
+#
+# Copyright (c) 2007 Johannes E. Schindelin
+#
+
+test_description='Test fsck --lost-found'
+. ./test-lib.sh
+
+test_expect_success setup '
+ git config core.logAllRefUpdates 0 &&
+ : > file1 &&
+ git add file1 &&
+ test_tick &&
+ git commit -m initial &&
+ echo 1 > file1 &&
+ echo 2 > file2 &&
+ git add file1 file2 &&
+ test_tick &&
+ git commit -m second &&
+ echo 3 > file3 &&
+ git add file3
+'
+
+test_expect_success 'lost and found something' '
+ git rev-parse HEAD > lost-commit &&
+ git rev-parse :file3 > lost-other &&
+ test_tick &&
+ git reset --hard HEAD^ &&
+ git fsck --lost-found &&
+ test 2 = $(ls .git/lost-found/*/* | wc -l) &&
+ test -f .git/lost-found/commit/$(cat lost-commit) &&
+ test -f .git/lost-found/other/$(cat lost-other)
+'
+
+test_done
--
1.5.2.2.3295.g8c6d-dirty
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] git-fsck: add --lost-found option
2007-07-02 16:53 [PATCH] git-fsck: add --lost-found option Johannes Schindelin
@ 2007-07-02 23:11 ` Junio C Hamano
2007-07-02 23:26 ` Johannes Schindelin
0 siblings, 1 reply; 7+ messages in thread
From: Junio C Hamano @ 2007-07-02 23:11 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: git
Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> With this option, dangling objects are not only reported, but also
> written to .git/lost-found/commit/ or .git/lost-found/other/.
>
> This obsoletes git-lost-found.
I haven't had chance to look at the code yet; this is only about
the design.
I think adding --lost-found to fsck is a wonderful idea. I also
think deprecating lost-found and removing it in the longer term
is a good idea.
Please do not do that in a single patch. This patch is at least
talking about three timeframes.
1. git-fsck learns --lost-found
The patch adds that to the code and the documentation.
Then it is commented on, perhaps updated, and matures.
2. git-lost-found is marked as "deprecated"
This patch adds "deprecated" warning to the documentation.
3. git-lost-found is removed.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] git-fsck: add --lost-found option
2007-07-02 23:11 ` Junio C Hamano
@ 2007-07-02 23:26 ` Johannes Schindelin
2007-07-03 0:08 ` Junio C Hamano
0 siblings, 1 reply; 7+ messages in thread
From: Johannes Schindelin @ 2007-07-02 23:26 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
Hi,
On Mon, 2 Jul 2007, Junio C Hamano wrote:
> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
>
> > With this option, dangling objects are not only reported, but also
> > written to .git/lost-found/commit/ or .git/lost-found/other/.
> >
> > This obsoletes git-lost-found.
>
> [...]
>
> Please do not do that in a single patch. This patch is at least
> talking about three timeframes.
Right. My fault.
> 1. git-fsck learns --lost-found
> The patch adds that to the code and the documentation.
> Then it is commented on, perhaps updated, and matures.
>
> 2. git-lost-found is marked as "deprecated"
> This patch adds "deprecated" warning to the documentation.
How about combining these two, and give a big
WARNING: 'git lost-found' is deprecated.
WARNING: Use 'git fsck --lost-found' instead
whenever lost-found is called?
> 3. git-lost-found is removed.
Yes, that can wait.
What is more important before doing 1&2 for real is this: lost-found ATM
calls 'git-fsck --full --no-reflogs'. The patch does not force these two
options when called with '--lost-found'. I would really appreciate
opinions on this issue, and will gladly re-prepare a patch accordingly.
Ciao,
Dscho
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] git-fsck: add --lost-found option
2007-07-02 23:26 ` Johannes Schindelin
@ 2007-07-03 0:08 ` Junio C Hamano
2007-07-03 0:33 ` Johannes Schindelin
0 siblings, 1 reply; 7+ messages in thread
From: Junio C Hamano @ 2007-07-03 0:08 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: git
Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> WARNING: 'git lost-found' is deprecated.
> WARNING: Use 'git fsck --lost-found' instead
>
> whenever lost-found is called?
I agree that would be a sensible second step after the result of
the first step matures.
>> 3. git-lost-found is removed.
>
> Yes, that can wait.
>
> What is more important before doing 1&2 for real is this: lost-found ATM
> calls 'git-fsck --full --no-reflogs'. The patch does not force these two
> options when called with '--lost-found'. I would really appreciate
> opinions on this issue, and will gladly re-prepare a patch accordingly.
I think I am not following you; do you mean --lost-found does
not imply these two? I am not sure if there is any benefit of
being able to do --lost-found without --full nor --no-reflogs.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH] git-fsck: add --lost-found option
2007-07-03 0:08 ` Junio C Hamano
@ 2007-07-03 0:33 ` Johannes Schindelin
2007-07-04 1:33 ` [PATCH] fsck --lost-found writes to subdirectories in .git/lost-found/ Jonas Fonseca
0 siblings, 1 reply; 7+ messages in thread
From: Johannes Schindelin @ 2007-07-03 0:33 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
With this option, dangling objects are not only reported, but also
written to .git/lost-found/commit/ or .git/lost-found/other/. This
option implies '--full' and '--no-reflogs'.
'git fsck --lost-found' is meant as a replacement for git-lost-found.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
Step 1.
Documentation/git-fsck.txt | 6 +++++-
builtin-fsck.c | 22 ++++++++++++++++++++++
t/t1420-lost-found.sh | 35 +++++++++++++++++++++++++++++++++++
3 files changed, 62 insertions(+), 1 deletions(-)
create mode 100755 t/t1420-lost-found.sh
diff --git a/Documentation/git-fsck.txt b/Documentation/git-fsck.txt
index 234c22f..08512e0 100644
--- a/Documentation/git-fsck.txt
+++ b/Documentation/git-fsck.txt
@@ -10,7 +10,7 @@ SYNOPSIS
--------
[verse]
'git-fsck' [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]
- [--full] [--strict] [--verbose] [<object>*]
+ [--full] [--strict] [--verbose] [--lost-found] [<object>*]
DESCRIPTION
-----------
@@ -64,6 +64,10 @@ index file and all SHA1 references in .git/refs/* as heads.
--verbose::
Be chatty.
+--lost-found::
+ Write dangling refs into .git/commit/ or .git/other/, depending
+ on type.
+
It tests SHA1 and general object sanity, and it does full tracking of
the resulting reachability and everything else. It prints out any
corruption it finds (missing or bad objects), and if you use the
diff --git a/builtin-fsck.c b/builtin-fsck.c
index 944a496..a6ef65e 100644
--- a/builtin-fsck.c
+++ b/builtin-fsck.c
@@ -20,6 +20,7 @@ static int check_strict;
static int keep_cache_objects;
static unsigned char head_sha1[20];
static int errors_found;
+static int write_lost_and_found;
static int verbose;
#define ERROR_OBJECT 01
#define ERROR_REACHABLE 02
@@ -138,6 +139,21 @@ static void check_unreachable_object(struct object *obj)
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);
+ fprintf(f, "%s\n", sha1_to_hex(obj->sha1));
+ fclose(f);
+ }
return;
}
@@ -685,6 +701,12 @@ int cmd_fsck(int argc, char **argv, const char *prefix)
verbose = 1;
continue;
}
+ if (!strcmp(arg, "--lost-found")) {
+ check_full = 1;
+ include_reflogs = 0;
+ write_lost_and_found = 1;
+ continue;
+ }
if (*arg == '-')
usage(fsck_usage);
}
diff --git a/t/t1420-lost-found.sh b/t/t1420-lost-found.sh
new file mode 100755
index 0000000..dc9e402
--- /dev/null
+++ b/t/t1420-lost-found.sh
@@ -0,0 +1,35 @@
+#!/bin/sh
+#
+# Copyright (c) 2007 Johannes E. Schindelin
+#
+
+test_description='Test fsck --lost-found'
+. ./test-lib.sh
+
+test_expect_success setup '
+ git config core.logAllRefUpdates 0 &&
+ : > file1 &&
+ git add file1 &&
+ test_tick &&
+ git commit -m initial &&
+ echo 1 > file1 &&
+ echo 2 > file2 &&
+ git add file1 file2 &&
+ test_tick &&
+ git commit -m second &&
+ echo 3 > file3 &&
+ git add file3
+'
+
+test_expect_success 'lost and found something' '
+ git rev-parse HEAD > lost-commit &&
+ git rev-parse :file3 > lost-other &&
+ test_tick &&
+ git reset --hard HEAD^ &&
+ git fsck --lost-found &&
+ test 2 = $(ls .git/lost-found/*/* | wc -l) &&
+ test -f .git/lost-found/commit/$(cat lost-commit) &&
+ test -f .git/lost-found/other/$(cat lost-other)
+'
+
+test_done
--
1.5.2.2.3296.g5753c-dirty
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH] fsck --lost-found writes to subdirectories in .git/lost-found/
2007-07-03 0:33 ` Johannes Schindelin
@ 2007-07-04 1:33 ` Jonas Fonseca
2007-07-04 1:41 ` Johannes Schindelin
0 siblings, 1 reply; 7+ messages in thread
From: Jonas Fonseca @ 2007-07-04 1:33 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: Junio C Hamano, git
Signed-off-by: Jonas Fonseca <fonseca@diku.dk>
---
Documentation/git-fsck.txt | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Documentation/git-fsck.txt b/Documentation/git-fsck.txt
index 08512e0..1a432f2 100644
--- a/Documentation/git-fsck.txt
+++ b/Documentation/git-fsck.txt
@@ -65,8 +65,8 @@ index file and all SHA1 references in .git/refs/* as heads.
Be chatty.
--lost-found::
- Write dangling refs into .git/commit/ or .git/other/, depending
- on type.
+ Write dangling refs into .git/lost-found/commit/ or
+ .git/lost-found/other/, depending on type.
It tests SHA1 and general object sanity, and it does full tracking of
the resulting reachability and everything else. It prints out any
--
1.5.2.2.1451.gb0e5e
--
Jonas Fonseca
^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2007-07-04 1:41 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-07-02 16:53 [PATCH] git-fsck: add --lost-found option Johannes Schindelin
2007-07-02 23:11 ` Junio C Hamano
2007-07-02 23:26 ` Johannes Schindelin
2007-07-03 0:08 ` Junio C Hamano
2007-07-03 0:33 ` Johannes Schindelin
2007-07-04 1:33 ` [PATCH] fsck --lost-found writes to subdirectories in .git/lost-found/ Jonas Fonseca
2007-07-04 1:41 ` Johannes Schindelin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).