From: "Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Duy Nguyen <pclouds@gmail.com>, Jeff King <peff@peff.net>,
Junio C Hamano <gitster@pobox.com>
Subject: [PATCH v4 0/3] repack -ad: fix after fetch --prune in a shallow repository
Date: Wed, 24 Oct 2018 08:56:08 -0700 (PDT) [thread overview]
Message-ID: <pull.9.v4.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.9.v3.git.gitgitgadget@gmail.com>
Under certain circumstances, commits that were reachable can be made
unreachable, e.g. via git fetch --prune. These commits might have been
packed already, in which case git repack -adlf will just drop them without
giving them the usual grace period before an eventual git prune (via git gc)
prunes them.
This is a problem when the shallow file still lists them, which is the
reason why git prune edits that file. And with the proposed changes, git
repack -ad will now do the same.
Reported by Alejandro Pauly.
Changes since v3:
* Made the regression test less confusing with regards to tags that might
need to be dereferenced.
* Introduced new global constants PRUNE_SHOW_ONLY and PRUNE_QUICK instead
of extending the signature of prune_shallow() with Boolean parameters.
* While at it, renamed the file-local constant from QUICK_PRUNE to QUICK.
* Replaced the lookup_commit() && parse_commit() cadence (that wants to
test for the existence of a commit) to has_object_file(), for ease of
readability, and also to make it more obvious how to add a call to
is_promisor_object() if we ever figure out that that would be necessary.
Changes since v2:
* Fixed a typo in the last commit message.
* Added an explanation to the last commit message why we do not simply skip
non-existing shallow commits at fetch time.
* Introduced a new, "quick prune" mode where prune_shallow() does not try
to drop unreachable commits, but only non-existing ones.
* Rebased to current master because there were too many merge conflicts for
my liking otherwise.
Changes since v1:
* Also trigger prune_shallow() when --unpack-unreachable=<approxidate> was
passed to git repack.
* No need to trigger prune_shallow() when git repack was called with -k.
Johannes Schindelin (3):
repack: point out a bug handling stale shallow info
shallow: offer to prune only non-existing entries
repack -ad: prune the list of shallow commits
builtin/prune.c | 2 +-
builtin/repack.c | 6 ++++++
commit.h | 4 +++-
shallow.c | 23 +++++++++++++++++------
t/t5537-fetch-shallow.sh | 27 +++++++++++++++++++++++++++
5 files changed, 54 insertions(+), 8 deletions(-)
base-commit: c4df23f7927d8d00e666a3c8d1b3375f1dc8a3c1
Published-As: https://github.com/gitgitgadget/git/releases/tags/pr-9%2Fdscho%2Fshallow-and-fetch-prune-v4
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-9/dscho/shallow-and-fetch-prune-v4
Pull-Request: https://github.com/gitgitgadget/git/pull/9
Range-diff vs v3:
1: ed8559b91 ! 1: d9720bd25 repack: point out a bug handling stale shallow info
@@ -29,7 +29,7 @@
+ test_commit -C shallow-server C &&
+ test_commit -C shallow-server E &&
+ test_commit -C shallow-server D &&
-+ d="$(git -C shallow-server rev-parse --verify D)" &&
++ d="$(git -C shallow-server rev-parse --verify D^0)" &&
+ git -C shallow-server checkout master &&
+
+ git clone --depth=1 --no-tags --no-single-branch \
@@ -43,7 +43,7 @@
+ test_must_fail git -C shallow-client rev-parse --verify $d^0 &&
+ ! grep $d shallow-client/.git/shallow &&
+
-+ git -C shallow-server branch branch-orig D^0 &&
++ git -C shallow-server branch branch-orig $d &&
+ git -C shallow-client fetch --prune --depth=2 \
+ origin "+refs/heads/*:refs/remotes/origin/*"
+'
2: f085eb4f7 ! 2: 18308c13e shallow: offer to prune only non-existing entries
@@ -12,6 +12,10 @@
Let's support that use case.
+ Rather than extending the signature of `prune_shallow()` to accept
+ another Boolean, let's turn it into a bit field and declare constants,
+ for readability.
+
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
diff --git a/builtin/prune.c b/builtin/prune.c
@@ -22,7 +26,7 @@
if (is_repository_shallow(the_repository))
- prune_shallow(show_only);
-+ prune_shallow(show_only, 0);
++ prune_shallow(show_only ? PRUNE_SHOW_ONLY : 0);
return 0;
}
@@ -35,7 +39,9 @@
int *ref_status);
extern int delayed_reachability_test(struct shallow_info *si, int c);
-extern void prune_shallow(int show_only);
-+extern void prune_shallow(int show_only, int quick_prune);
++#define PRUNE_SHOW_ONLY 1
++#define PRUNE_QUICK 2
++extern void prune_shallow(unsigned options);
extern struct trace_key trace_shallow;
extern int interactive_add(int argc, const char **argv, const char *prefix, int patch);
@@ -47,7 +53,7 @@
#define SEEN_ONLY 1
#define VERBOSE 2
-+#define QUICK_PRUNE 4
++#define QUICK 4
struct write_shallow_data {
struct strbuf *out;
@@ -56,9 +62,8 @@
if (graft->nr_parent != -1)
return 0;
- if (data->flags & SEEN_ONLY) {
-+ if (data->flags & QUICK_PRUNE) {
-+ struct commit *c = lookup_commit(the_repository, &graft->oid);
-+ if (!c || parse_commit(c))
++ if (data->flags & QUICK) {
++ if (!has_object_file(&graft->oid))
+ return 0;
+ } else if (data->flags & SEEN_ONLY) {
struct commit *c = lookup_commit(the_repository, &graft->oid);
@@ -74,18 +79,19 @@
+ * commits that do not exist (any longer).
*/
-void prune_shallow(int show_only)
-+void prune_shallow(int show_only, int quick_prune)
++void prune_shallow(unsigned options)
{
struct lock_file shallow_lock = LOCK_INIT;
struct strbuf sb = STRBUF_INIT;
+ unsigned flags = SEEN_ONLY;
int fd;
-+ if (quick_prune)
-+ flags |= QUICK_PRUNE;
-+
- if (show_only) {
+- if (show_only) {
- write_shallow_commits_1(&sb, 0, NULL, SEEN_ONLY | VERBOSE);
++ if (options & PRUNE_QUICK)
++ flags |= QUICK;
++
++ if (options & PRUNE_SHOW_ONLY) {
+ flags |= VERBOSE;
+ write_shallow_commits_1(&sb, 0, NULL, flags);
strbuf_release(&sb);
3: 1f9ff57d5 ! 3: 2858bc886 repack -ad: prune the list of shallow commits
@@ -52,7 +52,7 @@
+ (!(pack_everything & LOOSEN_UNREACHABLE) ||
+ unpack_unreachable) &&
+ is_repository_shallow(the_repository))
-+ prune_shallow(0, 1);
++ prune_shallow(PRUNE_QUICK);
}
if (!no_update_server_info)
--
gitgitgadget
next prev parent reply other threads:[~2018-10-24 15:56 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-13 20:18 [PATCH 0/2] repack -ad: fix after `fetch --prune` in a shallow repository Johannes Schindelin via GitGitGadget
2018-07-11 22:17 ` [PATCH 1/2] repack: point out a bug handling stale shallow info Johannes Schindelin via GitGitGadget
2018-07-11 22:23 ` [PATCH 2/2] repack -ad: prune the list of shallow commits Johannes Schindelin via GitGitGadget
2018-07-13 20:31 ` Jeff King
2018-07-14 21:56 ` Johannes Schindelin
2018-07-16 17:36 ` Jeff King
2018-07-17 16:25 ` Junio C Hamano
2018-07-19 16:42 ` Johannes Schindelin
2018-07-19 20:49 ` Junio C Hamano
2018-07-20 9:30 ` Junio C Hamano
2018-07-20 19:31 ` Jeff King
2018-07-17 17:28 ` Duy Nguyen
2018-07-17 19:41 ` Jeff King
2018-07-18 17:31 ` Duy Nguyen
2018-07-18 17:45 ` Jeff King
2018-07-18 17:48 ` Duy Nguyen
2018-07-17 16:39 ` Duy Nguyen
2018-07-17 16:48 ` Duy Nguyen
2018-07-19 17:50 ` Johannes Schindelin
2018-07-17 13:51 ` [PATCH v2 0/2] repack -ad: fix after `fetch --prune` in a shallow repository Johannes Schindelin via GitGitGadget
2018-07-17 13:51 ` [PATCH v2 1/2] repack: point out a bug handling stale shallow info Johannes Schindelin via GitGitGadget
2018-07-17 13:51 ` [PATCH v2 2/2] repack -ad: prune the list of shallow commits Johannes Schindelin via GitGitGadget
2018-07-17 17:45 ` Eric Sunshine
2018-07-17 19:15 ` [PATCH v2 0/2] repack -ad: fix after `fetch --prune` in a shallow repository Jeff King
2018-07-17 19:20 ` Jeff King
2018-07-19 17:48 ` Johannes Schindelin
2018-10-22 22:05 ` [PATCH v3 0/3] repack -ad: fix after fetch --prune " Johannes Schindelin via GitGitGadget
2018-10-22 22:05 ` [PATCH v3 1/3] repack: point out a bug handling stale shallow info Johannes Schindelin via GitGitGadget
2018-10-24 3:39 ` Junio C Hamano
2018-10-24 8:12 ` Johannes Schindelin
2018-10-24 8:38 ` Johannes Schindelin
2018-10-22 22:05 ` [PATCH v3 2/3] shallow: offer to prune only non-existing entries Johannes Schindelin via GitGitGadget
2018-10-24 3:47 ` Junio C Hamano
2018-10-24 8:01 ` Johannes Schindelin
2018-10-24 15:56 ` Johannes Schindelin
2018-10-25 18:54 ` Jonathan Tan
2018-10-26 7:59 ` Johannes Schindelin
2018-10-26 20:49 ` Jonathan Tan
2018-10-29 20:45 ` Johannes Schindelin
2018-10-22 22:05 ` [PATCH v3 3/3] repack -ad: prune the list of shallow commits Johannes Schindelin via GitGitGadget
2018-10-24 3:56 ` Junio C Hamano
2018-10-24 8:02 ` Johannes Schindelin
2018-10-23 10:15 ` [PATCH v3 0/3] repack -ad: fix after fetch --prune in a shallow repository Johannes Schindelin
2018-10-24 15:56 ` Johannes Schindelin via GitGitGadget [this message]
2018-10-24 15:56 ` [PATCH v4 1/3] repack: point out a bug handling stale shallow info Johannes Schindelin via GitGitGadget
2018-10-24 15:56 ` [PATCH v4 2/3] shallow: offer to prune only non-existing entries Johannes Schindelin via GitGitGadget
2018-10-24 15:56 ` [PATCH v4 3/3] repack -ad: prune the list of shallow commits Johannes Schindelin via GitGitGadget
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=pull.9.v4.git.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=pclouds@gmail.com \
--cc=peff@peff.net \
/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;
as well as URLs for NNTP newsgroup(s).