mirror of
https://github.com/git-for-windows/git.git
synced 2026-06-19 07:12:51 -05:00
odb: use size_t for object_info.sizep and the size APIs
When `js/objects-larger-than-4gb-on-windows` widened the streaming, index-pack and unpack-objects code paths, in the interest of keeping the patches somewhat reasonably-sized, it left the public ODB API still typed in `unsigned long`. In particular `struct object_info::sizep` and the four wrappers built on top of it (`odb_read_object`, `odb_read_object_peeled`, `odb_read_object_info`, `odb_pretend_object`) still return the unpacked size through `unsigned long *`, so on Windows `cat-file -s` and the `git add` / `git status` paths for a >4 GiB blob silently cap at 4 GiB. Widen the field and the four wrappers. The previous commits already widened the `unpack_entry()` cascade and pack-objects' in-core size accessors, so most of the cascade arrives here with no further work: the temporary shims in `packed_object_info_with_index_pos()` and in `unpack_entry()`'s delta-base recovery path go away, the two `SET_SIZE(entry, cast_size_t_to_ulong(canonical_size))` calls in `check_object()` and the matching one in `drop_reused_delta()` collapse to plain `SET_SIZE`, and `oe_get_size_slow()`'s tail `cast_size_t_to_ulong()` is gone too. What remains narrow are the boundaries this series does not intend to touch: the diff, blame, textconv and fast-import machinery. Even so, this patch is unfortunately quite large. Assisted-by: Opus 4.7 Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This commit is contained in:
10
commit.c
10
commit.c
@@ -395,7 +395,7 @@ const void *repo_get_commit_buffer(struct repository *r,
|
||||
const void *ret = get_cached_commit_buffer(r, commit, sizep);
|
||||
if (!ret) {
|
||||
enum object_type type;
|
||||
unsigned long size;
|
||||
size_t size;
|
||||
ret = odb_read_object(r->objects, &commit->object.oid, &type, &size);
|
||||
if (!ret)
|
||||
die("cannot read commit object %s",
|
||||
@@ -404,7 +404,7 @@ const void *repo_get_commit_buffer(struct repository *r,
|
||||
die("expected commit for %s, got %s",
|
||||
oid_to_hex(&commit->object.oid), type_name(type));
|
||||
if (sizep)
|
||||
*sizep = size;
|
||||
*sizep = cast_size_t_to_ulong(size);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -437,7 +437,7 @@ static inline void set_commit_tree(struct commit *c, struct tree *t)
|
||||
static void load_tree_from_commit_contents(struct repository *r, struct commit *commit)
|
||||
{
|
||||
enum object_type type;
|
||||
unsigned long size;
|
||||
size_t size;
|
||||
char *buf;
|
||||
const char *p;
|
||||
struct object_id tree_oid;
|
||||
@@ -604,7 +604,7 @@ int repo_parse_commit_internal(struct repository *r,
|
||||
{
|
||||
enum object_type type;
|
||||
void *buffer;
|
||||
unsigned long size;
|
||||
size_t size;
|
||||
struct object_info oi = {
|
||||
.typep = &type,
|
||||
.sizep = &size,
|
||||
@@ -1313,7 +1313,7 @@ static void handle_signed_tag(const struct commit *parent, struct commit_extra_h
|
||||
struct merge_remote_desc *desc;
|
||||
struct commit_extra_header *mergetag;
|
||||
char *buf;
|
||||
unsigned long size;
|
||||
size_t size;
|
||||
enum object_type type;
|
||||
struct strbuf payload = STRBUF_INIT;
|
||||
struct strbuf signature = STRBUF_INIT;
|
||||
|
||||
Reference in New Issue
Block a user