[PATCH v5 0/3] rev-list: add support for commits in `--missing`
- From
Karthik Nayak <karthik.188@gmail.com>
- Date
- Oct 26, 2023, 10:11 UTC
- Message-ID
- <20231026101109.43110-1-karthik.188@gmail.com>
- In-Reply-To
- <20231024122631.158415-1-karthik.188@gmail.com>
The `--missing` option in git-rev-list(1) was introduced intitally to deal with missing blobs in the context of promissory notes. Eventually the option was extended to also support tree objects in 7c0fe330d5 (rev-list: handle missing tree objects properly,2018-10-05).
This patch series extends the `--missing` option to also add support for commit objects. We do this by introducing a new flag `MISSING` which is added whenever we encounter a missing commit during traversal. Then in `builtin/rev-list` we check for this flag and take the appropriate action based on the `--missing=*` option used.
This series is an alternate to the patch series I had posted earlier: https://lore.kernel.org/git/20230908174208.249184-1-karthik.188@gmail.com/. In that patch, we introduced an option `--ignore-missing-links` which was added to expose the `ignore_missing_links` bit to the user. The issue in that patch was that, the option `--ignore-missing-links` didn't play well the pre-existing `--missing` option. This series avoids that route and just extends the `--missing` option for commits to solve the same problem.
V4 of the series can be found here: https://lore.kernel.org/git/20231024122631.158415-1-karthik.188@gmail.com/T/#ma7f07bc637e20e2a9558b23e8081957af61f63ce
Changes from v4: - Rename `missing_objects` to `missing_commits` since we only deal with commits. - Fix incorrect indentation - clear oidset after traversal in `release_revisions()`
Range diff:
1: 8c469cf479 = 1: 8c469cf479 revision: rename bit to `do_not_die_on_missing_objects`
2: 76ce43d973 = 2: 76ce43d973 rev-list: move `show_commit()` to the bottom
3: d892f0b82d ! 3: 6f0c74f888 rev-list: add commit object support in `--missing` option
@@ Commit message
between the main and alternate object directory.
Helped-by: Patrick Steinhardt <ps@pks.im>
+ Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
## builtin/rev-list.c ##
@@ builtin/rev-list.c: static void show_commit(struct commit *commit, void *data)
display_progress(progress, ++progress_counter);
+ if (revs->do_not_die_on_missing_objects &&
-+ oidset_contains(&revs->missing_objects, &commit->object.oid)) {
++ oidset_contains(&revs->missing_commits, &commit->object.oid)) {
+ finish_object__ma(&commit->object);
+ return;
+ }
@@ list-objects.c: static void do_traverse(struct traversal_context *ctx)
if (!ctx->revs->tree_objects)
; /* do not bother loading tree */
+ else if (ctx->revs->do_not_die_on_missing_objects &&
-+ oidset_contains(&ctx->revs->missing_objects, &commit->object.oid))
++ oidset_contains(&ctx->revs->missing_commits, &commit->object.oid))
+ ;
else if (repo_get_commit_tree(the_repository, commit)) {
struct tree *tree = repo_get_commit_tree(the_repository,
@@ revision.c: static int process_parents(struct rev_info *revs, struct commit *com
if (commit->object.flags & ADDED)
return 0;
+ if (revs->do_not_die_on_missing_objects &&
-+ oidset_contains(&revs->missing_objects, &commit->object.oid))
++ oidset_contains(&revs->missing_commits, &commit->object.oid))
+ return 0;
commit->object.flags |= ADDED;
@@ revision.c: static int process_parents(struct rev_info *revs, struct commit *com
}
- return -1;
+
-+ if (!revs->do_not_die_on_missing_objects)
-+ return -1;
++ if (revs->do_not_die_on_missing_objects)
++ oidset_insert(&revs->missing_commits, &p->object.oid);
+ else
-+ oidset_insert(&revs->missing_objects, &p->object.oid);
++ return -1; /* corrupt repository */
}
if (revs->sources) {
char **slot = revision_sources_at(revs->sources, p);
+@@ revision.c: void release_revisions(struct rev_info *revs)
+ clear_decoration(&revs->merge_simplification, free);
+ clear_decoration(&revs->treesame, free);
+ line_log_free(revs);
++ oidset_clear(&revs->missing_commits);
+ }
+
+ static void add_child(struct rev_info *revs, struct commit *parent, struct commit *child)
@@ revision.c: int prepare_revision_walk(struct rev_info *revs)
FOR_EACH_OBJECT_PROMISOR_ONLY);
}
+ if (revs->do_not_die_on_missing_objects)
-+ oidset_init(&revs->missing_objects, 0);
++ oidset_init(&revs->missing_commits, 0);
+
if (!revs->reflog_info)
prepare_to_use_bloom_filter(revs);
@@ revision.h: struct rev_info {
/* Location where temporary objects for remerge-diff are written. */
struct tmp_objdir *remerge_objdir;
+
-+ /* Missing objects to be tracked without failing traversal. */
-+ struct oidset missing_objects;
++ /* Missing commits to be tracked without failing traversal. */
++ struct oidset missing_commits;
};
/**Karthik Nayak (3): revision: rename bit to `do_not_die_on_missing_objects` rev-list: move `show_commit()` to the bottom rev-list: add commit object support in `--missing` option
builtin/reflog.c | 2 +- builtin/rev-list.c | 93 +++++++++++++++++++------------------ list-objects.c | 5 +- revision.c | 17 ++++++- revision.h | 21 +++++---- t/t6022-rev-list-missing.sh | 74 +++++++++++++++++++++++++++++ 6 files changed, 156 insertions(+), 56 deletions(-) create mode 100755 t/t6022-rev-list-missing.sh
-- 2.42.0