Skip to content

Commit b9e1fc6

Browse files
dschomjcheetham
authored andcommitted
sha1_file: when writing objects, skip the read_object_hook
If we are going to write an object there is no use in calling the read object hook to get an object from a potentially remote source. We would rather just write out the object and avoid the potential round trip for an object that doesn't exist. This change adds a flag to the check_and_freshen() and freshen_loose_object() functions' signatures so that the hook is bypassed when the functions are called before writing loose objects. The check for a local object is still performed so we don't overwrite something that has already been written to one of the objects directories. Based on a patch by Kevin Willford. Signed-off-by: Johannes Schindelin <[email protected]>
1 parent a0db91f commit b9e1fc6

File tree

3 files changed

+22
-8
lines changed

3 files changed

+22
-8
lines changed

object-file.c

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,15 +1112,17 @@ static int check_and_freshen_nonlocal(const struct object_id *oid, int freshen)
11121112
return 0;
11131113
}
11141114

1115-
static int check_and_freshen(const struct object_id *oid, int freshen)
1115+
static int check_and_freshen(const struct object_id *oid, int freshen,
1116+
int skip_virtualized_objects)
11161117
{
11171118
int ret;
11181119
int tried_hook = 0;
11191120

11201121
retry:
11211122
ret = check_and_freshen_local(oid, freshen) ||
11221123
check_and_freshen_nonlocal(oid, freshen);
1123-
if (!ret && core_virtualize_objects && !tried_hook) {
1124+
if (!ret && core_virtualize_objects && !skip_virtualized_objects &&
1125+
!tried_hook) {
11241126
tried_hook = 1;
11251127
if (!read_object_process(oid))
11261128
goto retry;
@@ -1136,7 +1138,7 @@ int has_loose_object_nonlocal(const struct object_id *oid)
11361138

11371139
int has_loose_object(const struct object_id *oid)
11381140
{
1139-
return check_and_freshen(oid, 0);
1141+
return check_and_freshen(oid, 0, 0);
11401142
}
11411143

11421144
static void mmap_limit_check(size_t length)
@@ -2321,9 +2323,10 @@ static int write_loose_object(const struct object_id *oid, char *hdr,
23212323
return finalize_object_file(tmp_file.buf, filename.buf);
23222324
}
23232325

2324-
static int freshen_loose_object(const struct object_id *oid)
2326+
static int freshen_loose_object(const struct object_id *oid,
2327+
int skip_virtualized_objects)
23252328
{
2326-
return check_and_freshen(oid, 1);
2329+
return check_and_freshen(oid, 1, skip_virtualized_objects);
23272330
}
23282331

23292332
static int freshen_packed_object(const struct object_id *oid)
@@ -2419,7 +2422,7 @@ int stream_loose_object(struct input_stream *in_stream, size_t len,
24192422
die(_("deflateEnd on stream object failed (%d)"), ret);
24202423
close_loose_object(fd, tmp_file.buf);
24212424

2422-
if (freshen_packed_object(oid) || freshen_loose_object(oid)) {
2425+
if (freshen_packed_object(oid) || freshen_loose_object(oid, 1)) {
24232426
unlink_or_warn(tmp_file.buf);
24242427
goto cleanup;
24252428
}
@@ -2480,7 +2483,7 @@ int write_object_file_flags(const void *buf, size_t len,
24802483
* it out into .git/objects/??/?{38} file.
24812484
*/
24822485
write_object_file_prepare(algo, buf, len, type, oid, hdr, &hdrlen);
2483-
if (freshen_packed_object(oid) || freshen_loose_object(oid))
2486+
if (freshen_packed_object(oid) || freshen_loose_object(oid, 1))
24842487
return 0;
24852488
if (write_loose_object(oid, hdr, hdrlen, buf, len, 0, flags))
24862489
return -1;
@@ -2524,7 +2527,7 @@ int write_object_file_literally(const void *buf, size_t len,
25242527

25252528
if (!(flags & HASH_WRITE_OBJECT))
25262529
goto cleanup;
2527-
if (freshen_packed_object(oid) || freshen_loose_object(oid))
2530+
if (freshen_packed_object(oid) || freshen_loose_object(oid, 1))
25282531
goto cleanup;
25292532
status = write_loose_object(oid, header, hdrlen, buf, len, 0, 0);
25302533
if (compat_type != -1)

t/t0410/read-object

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,10 @@ while (1) {
108108
system ('git --git-dir="' . $DIR . '" cat-file blob ' . $sha1 . ' | git -c core.virtualizeobjects=false hash-object -w --stdin >/dev/null 2>&1');
109109
packet_txt_write(($?) ? "status=error" : "status=success");
110110
packet_flush();
111+
112+
open my $log, '>>.git/read-object-hook.log';
113+
print $log "Read object $sha1, exit code $?\n";
114+
close $log;
111115
} else {
112116
die "bad command '$command'";
113117
}

t/t0499-read-object.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,12 @@ test_expect_success 'invalid blobs generate errors' '
2626
test_must_fail git cat-file blob "invalid")
2727
'
2828

29+
test_expect_success 'read-object-hook is bypassed when writing objects' '
30+
(cd guest-repo &&
31+
echo hello >hello.txt &&
32+
git add hello.txt &&
33+
hash="$(git rev-parse --verify :hello.txt)" &&
34+
! grep "$hash" .git/read-object-hook.log)
35+
'
2936

3037
test_done

0 commit comments

Comments
 (0)