Subject: [PATCH v2 0/2] repack -ad: fix after `fetch --prune` in a shallow repository

From: "Johannes Schindelin via GitGitGadget" <[email-masked]>
Date: Tue, 17 Jul 2018 06:51:39 -0700 (PDT)

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 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 (2):
  repack: point out a bug handling stale shallow info
  repack -ad: prune the list of shallow commits

 builtin/repack.c         |  6 ++++++
 t/t5537-fetch-shallow.sh | 27 +++++++++++++++++++++++++++
 2 files changed, 33 insertions(+)

base-commit: e3331758f12da22f4103eec7efe1b5304a9be5e9
Published-As: https://github.com/gitgitgadget/git/releases/tags/pr-9%2Fdscho%2Fshallow-and-fetch-prune-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-9/dscho/shallow-and-fetch-prune-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/9

Range-diff vs v1:

 1:  d2be40131 = 1:  d2be40131 repack: point out a bug handling stale shallow info
 2:  b4e01a963 ! 2:  c7ee6e008 repack -ad: prune the list of shallow commits
     @@ -23,7 +23,8 @@
          To avoid this problem, let's prune the shallow list in `git repack` when
          the `-d` option is passed, unless `-A` is passed, too (which would force
          the now-unreachable objects to be turned into loose objects instead of
     -    being deleted).
     +    being deleted). Additionally, e also need to take `--keep-reachable` and
     +    `--unpack-unreachable=<date>` into account.
      
          Signed-off-by: Johannes Schindelin <[email-masked]>
      
     @@ -35,7 +36,9 @@
       			opts |= PRUNE_PACKED_VERBOSE;
       		prune_packed_objects(opts);
      +
     -+		if (!(pack_everything & LOOSEN_UNREACHABLE) &&
     ++		if (!keep_unreachable &&
     ++		    (!(pack_everything & LOOSEN_UNREACHABLE) ||
     ++		     unpack_unreachable) &&
      +		    is_repository_shallow())
      +			prune_shallow(0);
       	}

-- 
gitgitgadget