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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.