Re: [PATCH 8/9] sha1-file: use loose object cache for quick existence check
From: René Scharfe <hidden>
Date: 2018-12-05 18:47:15
Am 05.12.2018 um 09:15 schrieb Jeff King:
On Wed, Dec 05, 2018 at 01:51:36AM -0500, Jeff King wrote:quoted
quoted
This function is easily converted to struct object_id, though, as its single caller can pass one on -- this makes the copy unnecessary.If you mean modifying sha1_loose_object_info() to take an oid, then sure, I agree that is a good step forward (and that is exactly the "punt until" moment I meant).So the simple thing is to do that, and then have it pass oid->hash to the other functions it uses.
Yes.
If we start to convert those, there's a little bit of a rabbit hole, but it's actually not too bad.
You don't need to crawl in just for quick_has_loose(), but eventually everything has to be converted. It seems a bit much for one patch, but perhaps that's just my ever-decreasing attention span speaking. Converting one function prototype or struct member at a time seems about the right amount of change per patch to me. That's not always possible due to entanglement, of course.
Most of the spill-over is into the dumb-http code. Note that it actually uses sha1 itself! That probably needs to be the_hash_algo (though I'm not even sure how we'd negotiate the algorithm across a dumb fetch). At any rate, I don't think this patch makes anything _worse_ in that respect.
Right.
quoted hunk ↗ jump to hunk
diff --git a/sha1-file.c b/sha1-file.c index 3ddf4c9426..0705709036 100644 --- a/sha1-file.c +++ b/sha1-file.c@@ -333,12 +333,12 @@ int raceproof_create_file(const char *path, create_file_fn fn, void *cb) return ret; } -static void fill_sha1_path(struct strbuf *buf, const unsigned char *sha1) +static void fill_loose_path(struct strbuf *buf, const struct object_id *oid)
The new name fits.
quoted hunk ↗ jump to hunk
@@ -879,15 +879,15 @@ int git_open_cloexec(const char *name, int flags) * Note that it may point to static storage and is only valid until another * call to stat_sha1_file(). */ -static int stat_sha1_file(struct repository *r, const unsigned char *sha1, - struct stat *st, const char **path) +static int stat_loose_object(struct repository *r, const struct object_id *oid, + struct stat *st, const char **path)
Hmm, read_sha1_file() was renamed to read_object_file() earlier this year, and I'd have expected this to become stat_object_file(). Names.. Anyway, the comment above and one a few lines below should be updated as well.
quoted hunk ↗ jump to hunk
{ struct object_directory *odb; static struct strbuf buf = STRBUF_INIT; prepare_alt_odb(r); for (odb = r->objects->odb; odb; odb = odb->next) { - *path = odb_loose_path(odb, &buf, sha1); + *path = odb_loose_path(odb, &buf, oid); if (!lstat(*path, st)) return 0; }@@ -900,7 +900,7 @@ static int stat_sha1_file(struct repository *r, const unsigned char *sha1, * descriptor. See the caveats on the "path" parameter above. */ static int open_sha1_file(struct repository *r, - const unsigned char *sha1, const char **path) + const struct object_id *oid, const char **path)
That function should lose the "sha1" in its name as well.
-static void *map_sha1_file_1(struct repository *r, const char *path, - const unsigned char *sha1, unsigned long *size) +static void *map_loose_object_1(struct repository *r, const char *path, + const struct object_id *oid, unsigned long *size)
Similarly, map_object_file_1()?
-void *map_sha1_file(struct repository *r, - const unsigned char *sha1, unsigned long *size) +void *map_loose_object(struct repository *r, + const struct object_id *oid, + unsigned long *size)
Similar.
quoted hunk ↗ jump to hunk
@@ -1045,7 +1043,9 @@ static int unpack_sha1_header_to_strbuf(git_zstream *stream, unsigned char *map, return -1; } -static void *unpack_sha1_rest(git_zstream *stream, void *buffer, unsigned long size, const unsigned char *sha1) +static void *unpack_loose_rest(git_zstream *stream, + void *buffer, unsigned long size, + const struct object_id *oid)
Hmm, both old and new name here look weird to me at this point.
-static int sha1_loose_object_info(struct repository *r, - const unsigned char *sha1, - struct object_info *oi, int flags) +static int loose_object_info(struct repository *r, + const struct object_id *oid, + struct object_info *oi, int flags)
And nothing of value was lost. :) René