Merge pull request #3262 from libgit2/vmg/prefix-len Desenfuckenate prefix lookups
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
diff --git a/src/object.c b/src/object.c
index a178e0e..1073559 100644
--- a/src/object.c
+++ b/src/object.c
@@ -129,10 +129,10 @@ int git_object_lookup_prefix(
if (error < 0)
return error;
- if (len > GIT_OID_RAWSZ)
- len = GIT_OID_RAWSZ;
+ if (len > GIT_OID_HEXSZ)
+ len = GIT_OID_HEXSZ;
- if (len == GIT_OID_RAWSZ) {
+ if (len == GIT_OID_HEXSZ) {
git_cached_obj *cached = NULL;
/* We want to match the full id : we can first look up in the cache,
@@ -172,9 +172,9 @@ int git_object_lookup_prefix(
memcpy(short_oid.id, id->id, (len + 1) / 2);
if (len % 2)
short_oid.id[len / 2] &= 0xF0;
- memset(short_oid.id + (len + 1) / 2, 0, (GIT_OID_RAWSZ - len) / 2);
+ memset(short_oid.id + (len + 1) / 2, 0, (GIT_OID_HEXSZ - len) / 2);
- /* If len < GIT_OID_RAWSZ (a strict short oid was given), we have
+ /* If len < GIT_OID_HEXSZ (a strict short oid was given), we have
* 2 options :
* - We always search in the cache first. If we find that short oid is
* ambiguous, we can stop. But in all the other cases, we must then
diff --git a/tests/diff/blob.c b/tests/diff/blob.c
index b0253f6..c3933c3 100644
--- a/tests/diff/blob.c
+++ b/tests/diff/blob.c
@@ -33,11 +33,11 @@ void test_diff_blob__initialize(void)
/* tests/resources/attr/root_test4.txt */
cl_git_pass(git_oid_fromstrn(&oid, "a0f7217a", 8));
- cl_git_pass(git_blob_lookup_prefix(&d, g_repo, &oid, 4));
+ cl_git_pass(git_blob_lookup_prefix(&d, g_repo, &oid, 8));
/* alien.png */
cl_git_pass(git_oid_fromstrn(&oid, "edf3dcee", 8));
- cl_git_pass(git_blob_lookup_prefix(&alien, g_repo, &oid, 4));
+ cl_git_pass(git_blob_lookup_prefix(&alien, g_repo, &oid, 8));
}
void test_diff_blob__cleanup(void)
@@ -80,7 +80,7 @@ void test_diff_blob__can_compare_text_blobs(void)
/* tests/resources/attr/root_test3 */
cl_git_pass(git_oid_fromstrn(&c_oid, "c96bbb2c2557a832", 16));
- cl_git_pass(git_blob_lookup_prefix(&c, g_repo, &c_oid, 8));
+ cl_git_pass(git_blob_lookup_prefix(&c, g_repo, &c_oid, 16));
/* Doing the equivalent of a `git diff -U1` on these files */
@@ -163,15 +163,15 @@ void test_diff_blob__can_compare_text_blobs_with_patch(void)
/* tests/resources/attr/root_test1 */
cl_git_pass(git_oid_fromstrn(&a_oid, "45141a79", 8));
- cl_git_pass(git_blob_lookup_prefix(&a, g_repo, &a_oid, 4));
+ cl_git_pass(git_blob_lookup_prefix(&a, g_repo, &a_oid, 8));
/* tests/resources/attr/root_test2 */
cl_git_pass(git_oid_fromstrn(&b_oid, "4d713dc4", 8));
- cl_git_pass(git_blob_lookup_prefix(&b, g_repo, &b_oid, 4));
+ cl_git_pass(git_blob_lookup_prefix(&b, g_repo, &b_oid, 8));
/* tests/resources/attr/root_test3 */
cl_git_pass(git_oid_fromstrn(&c_oid, "c96bbb2c2557a832", 16));
- cl_git_pass(git_blob_lookup_prefix(&c, g_repo, &c_oid, 8));
+ cl_git_pass(git_blob_lookup_prefix(&c, g_repo, &c_oid, 16));
/* Doing the equivalent of a `git diff -U1` on these files */
@@ -437,7 +437,7 @@ void test_diff_blob__can_compare_two_binary_blobs(void)
/* heart.png */
cl_git_pass(git_oid_fromstrn(&h_oid, "de863bff", 8));
- cl_git_pass(git_blob_lookup_prefix(&heart, g_repo, &h_oid, 4));
+ cl_git_pass(git_blob_lookup_prefix(&heart, g_repo, &h_oid, 8));
cl_git_pass(git_diff_blobs(
alien, NULL, heart, NULL, &opts,
@@ -505,7 +505,7 @@ void test_diff_blob__comparing_two_text_blobs_honors_interhunkcontext(void)
/* tests/resources/attr/root_test1 from commit f5b0af1 */
cl_git_pass(git_oid_fromstrn(&old_d_oid, "fe773770", 8));
- cl_git_pass(git_blob_lookup_prefix(&old_d, g_repo, &old_d_oid, 4));
+ cl_git_pass(git_blob_lookup_prefix(&old_d, g_repo, &old_d_oid, 8));
/* Test with default inter-hunk-context (not set) => default is 0 */
cl_git_pass(git_diff_blobs(
@@ -598,7 +598,7 @@ void test_diff_blob__can_compare_blob_to_buffer(void)
/* tests/resources/attr/root_test1 */
cl_git_pass(git_oid_fromstrn(&a_oid, "45141a79", 8));
- cl_git_pass(git_blob_lookup_prefix(&a, g_repo, &a_oid, 4));
+ cl_git_pass(git_blob_lookup_prefix(&a, g_repo, &a_oid, 8));
/* diff from blob a to content of b */
quick_diff_blob_to_str(a, NULL, b_content, 0, NULL);
@@ -640,7 +640,7 @@ void test_diff_blob__can_compare_blob_to_buffer_with_patch(void)
/* tests/resources/attr/root_test1 */
cl_git_pass(git_oid_fromstrn(&a_oid, "45141a79", 8));
- cl_git_pass(git_blob_lookup_prefix(&a, g_repo, &a_oid, 4));
+ cl_git_pass(git_blob_lookup_prefix(&a, g_repo, &a_oid, 8));
/* diff from blob a to content of b */
cl_git_pass(git_patch_from_blob_and_buffer(
@@ -719,10 +719,10 @@ void test_diff_blob__binary_data_comparisons(void)
opts.flags |= GIT_DIFF_INCLUDE_UNMODIFIED;
cl_git_pass(git_oid_fromstrn(&oid, "45141a79", 8));
- cl_git_pass(git_blob_lookup_prefix(&nonbin, g_repo, &oid, 4));
+ cl_git_pass(git_blob_lookup_prefix(&nonbin, g_repo, &oid, 8));
cl_git_pass(git_oid_fromstrn(&oid, "b435cd56", 8));
- cl_git_pass(git_blob_lookup_prefix(&bin, g_repo, &oid, 4));
+ cl_git_pass(git_blob_lookup_prefix(&bin, g_repo, &oid, 8));
/* non-binary to reference content */
@@ -825,11 +825,11 @@ void test_diff_blob__using_path_and_attributes(void)
opts.flags |= GIT_DIFF_INCLUDE_UNMODIFIED;
cl_git_pass(git_oid_fromstrn(&oid, "45141a79", 8));
- cl_git_pass(git_blob_lookup_prefix(&nonbin, g_repo, &oid, 4));
+ cl_git_pass(git_blob_lookup_prefix(&nonbin, g_repo, &oid, 8));
/* 20b: "Hello from the root\n" */
cl_git_pass(git_oid_fromstrn(&oid, "b435cd56", 8));
- cl_git_pass(git_blob_lookup_prefix(&bin, g_repo, &oid, 4));
+ cl_git_pass(git_blob_lookup_prefix(&bin, g_repo, &oid, 8));
/* 33b: "0123456789\n\x01\x02\x03\x04\x05\x06\x07\x08\x09\n0123456789\n" */
/* non-binary to reference content */
diff --git a/tests/refs/revparse.c b/tests/refs/revparse.c
index 3f89b5f..c22c304 100644
--- a/tests/refs/revparse.c
+++ b/tests/refs/revparse.c
@@ -812,3 +812,18 @@ void test_refs_revparse__ext_returns_NULL_reference_when_expression_points_at_a_
"0266163a49e280c4f5ed1e08facd36a2bd716bcf",
NULL);
}
+
+void test_refs_revparse__uneven_sizes(void)
+{
+ test_object("a65fedf39aefe402d3bb6e24df4d4f5fe454775",
+ "a65fedf39aefe402d3bb6e24df4d4f5fe4547750");
+
+ test_object("a65fedf39aefe402d3bb6e24df4d4f5fe45477",
+ "a65fedf39aefe402d3bb6e24df4d4f5fe4547750");
+
+ test_object("a65fedf39aefe402d3bb6e24df4d4f5fe4547",
+ "a65fedf39aefe402d3bb6e24df4d4f5fe4547750");
+
+ test_object("a65fedf39aefe402d3bb6e24df4d",
+ "a65fedf39aefe402d3bb6e24df4d4f5fe4547750");
+}