From: Junio C Hamano Date: Mon, 17 Jun 2019 17:15:14 +0000 (-0700) Subject: Merge branch 'ds/object-info-for-prefetch-fix' X-Git-Tag: v2.23.0-rc0~126 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/5d5c46b28c04348f7b680e5fe007c6344a86a70a?hp=-c Merge branch 'ds/object-info-for-prefetch-fix' Code cleanup and futureproof. * ds/object-info-for-prefetch-fix: sha1-file: split OBJECT_INFO_FOR_PREFETCH --- 5d5c46b28c04348f7b680e5fe007c6344a86a70a diff --combined object-store.h index 272e01e452,c90628d839..49f56ab8d9 --- a/object-store.h +++ b/object-store.h @@@ -76,9 -76,8 +76,9 @@@ struct packed_git pack_keep_in_core:1, freshened:1, do_not_close:1, - pack_promisor:1; - unsigned char sha1[20]; + pack_promisor:1, + multi_pack_index:1; + unsigned char hash[GIT_MAX_RAWSZ]; struct revindex_entry *revindex; /* something like ".git/objects/pack/xxxxx.pack" */ char pack_name[FLEX_ARRAY]; /* more */ @@@ -129,6 -128,12 +129,6 @@@ struct raw_object_store /* A most-recently-used ordered version of the packed_git list. */ struct list_head packed_git_mru; - /* - * A linked list containing all packfiles, starting with those - * contained in the multi_pack_index. - */ - struct packed_git *all_packs; - /* * A fast, rough count of the number of objects in the repository. * These two fields are not meant for direct access. Use @@@ -157,10 -162,10 +157,10 @@@ const char *loose_object_path(struct re void *map_loose_object(struct repository *r, const struct object_id *oid, unsigned long *size); -extern void *read_object_file_extended(struct repository *r, - const struct object_id *oid, - enum object_type *type, - unsigned long *size, int lookup_replace); +void *read_object_file_extended(struct repository *r, + const struct object_id *oid, + enum object_type *type, + unsigned long *size, int lookup_replace); static inline void *repo_read_object_file(struct repository *r, const struct object_id *oid, enum object_type *type, @@@ -175,20 -180,20 +175,20 @@@ /* Read and unpack an object file into memory, write memory to an object file */ int oid_object_info(struct repository *r, const struct object_id *, unsigned long *); -extern int hash_object_file(const void *buf, unsigned long len, - const char *type, struct object_id *oid); +int hash_object_file(const void *buf, unsigned long len, + const char *type, struct object_id *oid); -extern int write_object_file(const void *buf, unsigned long len, - const char *type, struct object_id *oid); +int write_object_file(const void *buf, unsigned long len, + const char *type, struct object_id *oid); -extern int hash_object_file_literally(const void *buf, unsigned long len, - const char *type, struct object_id *oid, - unsigned flags); +int hash_object_file_literally(const void *buf, unsigned long len, + const char *type, struct object_id *oid, + unsigned flags); -extern int pretend_object_file(void *, unsigned long, enum object_type, - struct object_id *oid); +int pretend_object_file(void *, unsigned long, enum object_type, + struct object_id *oid); -extern int force_object_loose(const struct object_id *oid, time_t mtime); +int force_object_loose(const struct object_id *oid, time_t mtime); /* * Open the loose object at path, check its hash, and return the contents, @@@ -222,9 -227,9 +222,9 @@@ int repo_has_object_file_with_flags(str * with the specified name. This function does not respect replace * references. */ -extern int has_loose_object_nonlocal(const struct object_id *); +int has_loose_object_nonlocal(const struct object_id *); -extern void assert_oid_type(const struct object_id *oid, enum object_type expect); +void assert_oid_type(const struct object_id *oid, enum object_type expect); struct object_info { /* Request */ @@@ -277,10 -282,14 +277,14 @@@ #define OBJECT_INFO_IGNORE_LOOSE 16 /* * Do not attempt to fetch the object if missing (even if fetch_is_missing is - * nonzero). This is meant for bulk prefetching of missing blobs in a partial - * clone. Implies OBJECT_INFO_QUICK. + * nonzero). */ - #define OBJECT_INFO_FOR_PREFETCH (32 + OBJECT_INFO_QUICK) + #define OBJECT_INFO_SKIP_FETCH_OBJECT 32 + /* + * This is meant for bulk prefetching of missing blobs in a partial + * clone. Implies OBJECT_INFO_SKIP_FETCH_OBJECT and OBJECT_INFO_QUICK + */ + #define OBJECT_INFO_FOR_PREFETCH (OBJECT_INFO_SKIP_FETCH_OBJECT | OBJECT_INFO_QUICK) int oid_object_info_extended(struct repository *r, const struct object_id *, diff --combined sha1-file.c index ed5c50dac4,0299fdd516..888b6024d5 --- a/sha1-file.c +++ b/sha1-file.c @@@ -189,14 -189,6 +189,14 @@@ int hash_algo_by_id(uint32_t format_id return GIT_HASH_UNKNOWN; } +int hash_algo_by_length(int len) +{ + int i; + for (i = 1; i < GIT_HASH_NALGOS; i++) + if (len == hash_algos[i].rawsz) + return i; + return GIT_HASH_UNKNOWN; +} /* * This is meant to hold a *small* number of objects that you would @@@ -1379,7 -1371,7 +1379,7 @@@ int oid_object_info_extended(struct rep /* Check if it is a missing object */ if (fetch_if_missing && repository_format_partial_clone && !already_retried && r == the_repository && - !(flags & OBJECT_INFO_FOR_PREFETCH)) { + !(flags & OBJECT_INFO_SKIP_FETCH_OBJECT)) { /* * TODO Investigate having fetch_object() return * TODO error/success and stopping the music here.