Re: [PATCH v3 5/7] path-walk: visit tags and cached objects
- From
Patrick Steinhardt <ps@pks.im>
- Date
- Dec 13, 2024, 11:58 UTC
- Message-ID
- <Z1whdAJ4RgQlLNl_@pks.im>
- In-Reply-To
- <a41f53f7ced7a403547ce1c239c5fbb5382cfb0f.1733514359.git.gitgitgadget@gmail.com>
On Fri, Dec 06, 2024 at 07:45:56PM +0000, Derrick Stolee via GitGitGadget wrote:
Show 38 quoted lines
> @@ -194,6 +201,134 @@ static void clear_strmap(struct strmap *map)
> strmap_init(map);
> }
>
> +static void setup_pending_objects(struct path_walk_info *info,
> + struct path_walk_context *ctx)
> +{
> + struct type_and_oid_list *tags = NULL;
> + struct type_and_oid_list *tagged_blobs = NULL;
> + struct type_and_oid_list *root_tree_list = NULL;
> +
> + if (info->tags)
> + CALLOC_ARRAY(tags, 1);
> + if (info->blobs)
> + CALLOC_ARRAY(tagged_blobs, 1);
> + if (info->trees)
> + root_tree_list = strmap_get(&ctx->paths_to_lists, root_path);
> +
> + /*
> + * Pending objects include:
> + * * Commits at branch tips.
> + * * Annotated tags at tag tips.
> + * * Any kind of object at lightweight tag tips.
> + * * Trees and blobs in the index (with an associated path).
> + */
> + for (size_t i = 0; i < info->revs->pending.nr; i++) {
> + struct object_array_entry *pending = info->revs->pending.objects + i;
> + struct object *obj = pending->item;
> +
> + /* Commits will be picked up by revision walk. */
> + if (obj->type == OBJ_COMMIT)
> + continue;
> +
> + /* Navigate annotated tag object chains. */
> + while (obj->type == OBJ_TAG) {
> + struct tag *tag = lookup_tag(info->revs->repo, &obj->oid);
> + if (!tag)
> + break;Same here as previous comments, is this an error that we should rather report?
[snip]
Show 23 quoted lines
> + if (tagged_blobs) {
> + if (tagged_blobs->oids.nr) {
> + const char *tagged_blob_path = "/tagged-blobs";
> + tagged_blobs->type = OBJ_BLOB;
> + push_to_stack(ctx, tagged_blob_path);
> + strmap_put(&ctx->paths_to_lists, tagged_blob_path, tagged_blobs);
> + } else {
> + oid_array_clear(&tagged_blobs->oids);
> + free(tagged_blobs);
> + }
> + }
> + if (tags) {
> + if (tags->oids.nr) {
> + const char *tag_path = "/tags";
> + tags->type = OBJ_TAG;
> + push_to_stack(ctx, tag_path);
> + strmap_put(&ctx->paths_to_lists, tag_path, tags);
> + } else {
> + oid_array_clear(&tags->oids);
> + free(tags);
> + }
> + }
> +}So this is kind of curious. Does that mean that a file named "tagged-blobs" would be thrown into the same bag as a tagged blob? Or are these special due to the leading "/"?
Patrick