Skip to content

Commit 0bde44a

Browse files
hanyang-tonygitster
authored andcommitted
packfile: split promisor objects oidset into two
split promisor objects oidset into two, one is objects in promisor packfile, and other set is objects referenced in promisor packfile. This enable us to check if an object is in promisor packfile. Signed-off-by: Han Young <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 39bf06a commit 0bde44a

File tree

2 files changed

+21
-10
lines changed

2 files changed

+21
-10
lines changed

packfile.c

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2223,12 +2223,17 @@ int for_each_packed_object(each_packed_object_fn cb, void *data,
22232223
return r ? r : pack_errors;
22242224
}
22252225

2226+
struct promisor_objects {
2227+
struct oidset promisor_pack_objects;
2228+
struct oidset promisor_pack_referenced_objects;
2229+
};
2230+
22262231
static int add_promisor_object(const struct object_id *oid,
22272232
struct packed_git *pack UNUSED,
22282233
uint32_t pos UNUSED,
22292234
void *set_)
22302235
{
2231-
struct oidset *set = set_;
2236+
struct promisor_objects *set = set_;
22322237
struct object *obj;
22332238
int we_parsed_object;
22342239

@@ -2243,7 +2248,7 @@ static int add_promisor_object(const struct object_id *oid,
22432248
if (!obj)
22442249
return 1;
22452250

2246-
oidset_insert(set, oid);
2251+
oidset_insert(&set->promisor_pack_objects, oid);
22472252

22482253
/*
22492254
* If this is a tree, commit, or tag, the objects it refers
@@ -2261,26 +2266,26 @@ static int add_promisor_object(const struct object_id *oid,
22612266
*/
22622267
return 0;
22632268
while (tree_entry_gently(&desc, &entry))
2264-
oidset_insert(set, &entry.oid);
2269+
oidset_insert(&set->promisor_pack_referenced_objects, &entry.oid);
22652270
if (we_parsed_object)
22662271
free_tree_buffer(tree);
22672272
} else if (obj->type == OBJ_COMMIT) {
22682273
struct commit *commit = (struct commit *) obj;
22692274
struct commit_list *parents = commit->parents;
22702275

2271-
oidset_insert(set, get_commit_tree_oid(commit));
2276+
oidset_insert(&set->promisor_pack_referenced_objects, get_commit_tree_oid(commit));
22722277
for (; parents; parents = parents->next)
2273-
oidset_insert(set, &parents->item->object.oid);
2278+
oidset_insert(&set->promisor_pack_referenced_objects, &parents->item->object.oid);
22742279
} else if (obj->type == OBJ_TAG) {
22752280
struct tag *tag = (struct tag *) obj;
2276-
oidset_insert(set, get_tagged_oid(tag));
2281+
oidset_insert(&set->promisor_pack_referenced_objects, get_tagged_oid(tag));
22772282
}
22782283
return 0;
22792284
}
22802285

2281-
int is_promisor_object(const struct object_id *oid)
2286+
int is_in_promisor_pack(const struct object_id *oid, int referenced)
22822287
{
2283-
static struct oidset promisor_objects;
2288+
static struct promisor_objects promisor_objects;
22842289
static int promisor_objects_prepared;
22852290

22862291
if (!promisor_objects_prepared) {
@@ -2292,5 +2297,6 @@ int is_promisor_object(const struct object_id *oid)
22922297
}
22932298
promisor_objects_prepared = 1;
22942299
}
2295-
return oidset_contains(&promisor_objects, oid);
2300+
return oidset_contains(&promisor_objects.promisor_pack_objects, oid) ||
2301+
(referenced && oidset_contains(&promisor_objects.promisor_pack_referenced_objects, oid));
22962302
}

packfile.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,16 @@ int has_object_kept_pack(const struct object_id *oid, unsigned flags);
191191

192192
int has_pack_index(const unsigned char *sha1);
193193

194+
int is_in_promisor_pack(const struct object_id *oid, int referenced);
195+
194196
/*
195197
* Return 1 if an object in a promisor packfile is or refers to the given
196198
* object, 0 otherwise.
197199
*/
198-
int is_promisor_object(const struct object_id *oid);
200+
static inline int is_promisor_object(const struct object_id *oid)
201+
{
202+
return is_in_promisor_pack(oid, 1);
203+
}
199204

200205
/*
201206
* Expose a function for fuzz testing.

0 commit comments

Comments
 (0)