Skip to content

Commit 1f2be8b

Browse files
jonathantanmygitster
authored andcommitted
index-pack: teach --promisor to forbid pack name
Currently, - Running "index-pack --promisor" outside a repo segfaults. - It may be confusing to a user that running "index-pack --promisor" within a repo may make changes to the repo's object DB, especially since the packs indexed by the index-pack invocation may not even be related to the repo. As discussed in [1] and [2], teaching --promisor to forbid a packfile name solves both these problems. This combination of arguments requires a repo (since we are writing the resulting .pack and .idx to it) and it is clear that the files are related to the repo. Currently, Git uses "index-pack --promisor" only when fetching into a repo, so it could be argued that we should teach "index-pack" a new argument (say, "--fetching-mode") instead of tying --promisor to a generic argument like the packfile name. However, this --promisor feature could conceivably be used whenever we have a packfile that is known to come from the promisor remote (whether obtained through Git's fetch protocol or through other means) so not using a new argument seems reasonable - one could envision a user-made script obtaining a packfile and then running "index-pack --promisor --stdin", for example. In fact, it might be possible to relax the restriction further (say, by also allowing --promisor when indexing a packfile that is in the object DB), but relaxing the restriction is backwards-compatible so we can revisit that later. One thing to watch out for is the possibility of a future Git feature that indexes a pack in the context of a repo, but does not necessarily write the resulting pack to it (and does not necessarily desire to make any changes to the object DB). One such feature would be fetch quarantine, which might need the repo context in order to detect hash collisions, but would also need to ensure that the object DB is undisturbed in case the fetch fails for whatever reason, even if the reason occurs only after the indexing is complete. It may not be obvious to the implementer of such a feature that "index-pack" could sometimes write packs other than the indexed pack to the object DB, but there are already other ways that "fetch" could write to the object DB (in particular, packfile URIs and bundle URIs), so hopefully the implementation of this future feature would already include a test that the object DB be undisturbed. This change requires the change to t5300 by 1f52cdf (index-pack: document and test the --promisor option, 2022-03-09) to be undone. (--promisor is already tested indirectly, so we don't need the explicit test here any more.) [1] https://lore.kernel.org/git/[email protected]/ [2] https://lore.kernel.org/git/[email protected]/ Signed-off-by: Jonathan Tan <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent c08589e commit 1f2be8b

File tree

3 files changed

+5
-3
lines changed

3 files changed

+5
-3
lines changed

Documentation/git-index-pack.txt

+2
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ Also, if there are objects in the given pack that references non-promisor
144144
objects (in the repo), repacks those non-promisor objects into a promisor
145145
pack. This avoids a situation in which a repo has non-promisor objects that are
146146
accessible through promisor objects.
147+
+
148+
Requires <pack-file> to not be specified.
147149

148150
NOTES
149151
-----

builtin/index-pack.c

+2
Original file line numberDiff line numberDiff line change
@@ -1970,6 +1970,8 @@ int cmd_index_pack(int argc,
19701970
usage(index_pack_usage);
19711971
if (fix_thin_pack && !from_stdin)
19721972
die(_("the option '%s' requires '%s'"), "--fix-thin", "--stdin");
1973+
if (promisor_msg && pack_name)
1974+
die(_("--promisor cannot be used with a pack name"));
19731975
if (from_stdin && !startup_info->have_repository)
19741976
die(_("--stdin requires a git repository"));
19751977
if (from_stdin && hash_algo)

t/t5300-pack-object.sh

+1-3
Original file line numberDiff line numberDiff line change
@@ -332,10 +332,8 @@ test_expect_success 'build pack index for an existing pack' '
332332
git index-pack -o tmp.idx test-3.pack &&
333333
cmp tmp.idx test-1-${packname_1}.idx &&
334334
335-
git index-pack --promisor=message test-3.pack &&
335+
git index-pack test-3.pack &&
336336
cmp test-3.idx test-1-${packname_1}.idx &&
337-
echo message >expect &&
338-
test_cmp expect test-3.promisor &&
339337
340338
cat test-2-${packname_2}.pack >test-3.pack &&
341339
git index-pack -o tmp.idx test-2-${packname_2}.pack &&

0 commit comments

Comments
 (0)