Skip to content

Commit 0db1c57

Browse files
committed
oid: add sha256 typed oids
1 parent 3fbf580 commit 0db1c57

File tree

4 files changed

+137
-54
lines changed

4 files changed

+137
-54
lines changed

include/git2/oid.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,21 @@
1919
*/
2020
GIT_BEGIN_DECL
2121

22-
/** The type of object id, currently only SHA1. */
22+
/** The type of object id. */
2323
typedef enum {
24-
GIT_OID_SHA1 = 1 /**< SHA1 */
24+
GIT_OID_SHA1 = 1, /**< SHA1 */
25+
GIT_OID_SHA256 = 2 /**< SHA256 */
2526
} git_oid_t;
2627

2728
/** Size (in bytes) of a raw/binary oid */
2829
#define GIT_OID_SHA1_SIZE 20
29-
#define GIT_OID_MAX_SIZE GIT_OID_SHA1_SIZE
30+
#define GIT_OID_SHA256_SIZE 32
31+
#define GIT_OID_MAX_SIZE GIT_OID_SHA256_SIZE
3032

3133
/** Size (in bytes) of a hex formatted oid */
3234
#define GIT_OID_SHA1_HEXSIZE (GIT_OID_SHA1_SIZE * 2)
33-
#define GIT_OID_MAX_HEXSIZE GIT_OID_SHA1_HEXSIZE
35+
#define GIT_OID_SHA256_HEXSIZE (GIT_OID_SHA256_SIZE * 2)
36+
#define GIT_OID_MAX_HEXSIZE GIT_OID_SHA256_HEXSIZE
3437

3538
/** Minimum length (in number of hex characters,
3639
* i.e. packets of 4 bits) of an oid prefix */
@@ -49,11 +52,13 @@ typedef struct git_oid {
4952
* The binary representation of the null object ID.
5053
*/
5154
#define GIT_OID_SHA1_ZERO { GIT_OID_SHA1, { 0 } }
55+
#define GIT_OID_SHA256_ZERO { GIT_OID_SHA256, { 0 } }
5256

5357
/**
5458
* The string representation of the null object ID.
5559
*/
5660
#define GIT_OID_SHA1_HEXZERO "0000000000000000000000000000000000000000"
61+
#define GIT_OID_SHA256_HEXZERO "0000000000000000000000000000000000000000000000000000000000000000"
5762

5863
/**
5964
* Parse a hex formatted object id into a git_oid.

src/libgit2/oid.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ GIT_INLINE(size_t) git_oid_size(git_oid_t type)
2121
switch (type) {
2222
case GIT_OID_SHA1:
2323
return GIT_OID_SHA1_SIZE;
24+
case GIT_OID_SHA256:
25+
return GIT_OID_SHA256_SIZE;
2426
}
2527

2628
return 0;
@@ -31,6 +33,8 @@ GIT_INLINE(size_t) git_oid_hexsize(git_oid_t type)
3133
switch (type) {
3234
case GIT_OID_SHA1:
3335
return GIT_OID_SHA1_HEXSIZE;
36+
case GIT_OID_SHA256:
37+
return GIT_OID_SHA256_HEXSIZE;
3438
}
3539

3640
return 0;

tests/libgit2/core/oid.c

Lines changed: 123 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,147 @@
11
#include "clar_libgit2.h"
22
#include "oid.h"
33

4-
static git_oid id;
5-
static git_oid idp;
6-
static git_oid idm;
7-
const char *str_oid = "ae90f12eea699729ed24555e40b9fd669da12a12";
8-
const char *str_oid_p = "ae90f12eea699729ed";
9-
const char *str_oid_m = "ae90f12eea699729ed24555e40b9fd669da12a12THIS IS EXTRA TEXT THAT SHOULD GET IGNORED";
4+
static git_oid id_sha1;
5+
static git_oid idp_sha1;
6+
static git_oid idm_sha1;
7+
8+
const char *str_oid_sha1 = "ae90f12eea699729ed24555e40b9fd669da12a12";
9+
const char *str_oid_sha1_p = "ae90f12eea699729ed";
10+
const char *str_oid_sha1_m = "ae90f12eea699729ed24555e40b9fd669da12a12THIS IS EXTRA TEXT THAT SHOULD GET IGNORED";
11+
12+
static git_oid id_sha256;
13+
static git_oid idp_sha256;
14+
static git_oid idm_sha256;
15+
16+
const char *str_oid_sha256 = "d3e63d2f2e43d1fee23a74bf19a0ede156cba2d1bd602eba13de433cea1bb512";
17+
const char *str_oid_sha256_p = "d3e63d2f2e43d1fee2";
18+
const char *str_oid_sha256_m = "d3e63d2f2e43d1fee23a74bf19a0ede156cba2d1bd602eba13de433cea1bb512 GARBAGE EXTRA TEXT AT THE END";
1019

1120
void test_core_oid__initialize(void)
1221
{
13-
cl_git_pass(git_oid_fromstr(&id, str_oid, GIT_OID_SHA1));
14-
cl_git_pass(git_oid_fromstrp(&idp, str_oid_p, GIT_OID_SHA1));
15-
cl_git_fail(git_oid_fromstrp(&idm, str_oid_m, GIT_OID_SHA1));
22+
cl_git_pass(git_oid_fromstr(&id_sha1, str_oid_sha1, GIT_OID_SHA1));
23+
cl_git_pass(git_oid_fromstrp(&idp_sha1, str_oid_sha1_p, GIT_OID_SHA1));
24+
cl_git_fail(git_oid_fromstrp(&idm_sha1, str_oid_sha1_m, GIT_OID_SHA1));
25+
26+
cl_git_pass(git_oid_fromstr(&id_sha256, str_oid_sha256, GIT_OID_SHA256));
27+
cl_git_pass(git_oid_fromstrp(&idp_sha256, str_oid_sha256_p, GIT_OID_SHA256));
28+
cl_git_fail(git_oid_fromstrp(&idm_sha256, str_oid_sha256_m, GIT_OID_SHA256));
1629
}
1730

18-
void test_core_oid__streq(void)
31+
void test_core_oid__streq_sha1(void)
1932
{
20-
cl_assert_equal_i(0, git_oid_streq(&id, str_oid));
21-
cl_assert_equal_i(-1, git_oid_streq(&id, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
33+
cl_assert_equal_i(0, git_oid_streq(&id_sha1, str_oid_sha1));
34+
cl_assert_equal_i(-1, git_oid_streq(&id_sha1, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
2235

23-
cl_assert_equal_i(-1, git_oid_streq(&id, "deadbeef"));
24-
cl_assert_equal_i(-1, git_oid_streq(&id, "I'm not an oid.... :)"));
36+
cl_assert_equal_i(-1, git_oid_streq(&id_sha1, "deadbeef"));
37+
cl_assert_equal_i(-1, git_oid_streq(&id_sha1, "I'm not an oid.... :)"));
2538

26-
cl_assert_equal_i(0, git_oid_streq(&idp, "ae90f12eea699729ed0000000000000000000000"));
27-
cl_assert_equal_i(0, git_oid_streq(&idp, "ae90f12eea699729ed"));
28-
cl_assert_equal_i(-1, git_oid_streq(&idp, "ae90f12eea699729ed1"));
29-
cl_assert_equal_i(-1, git_oid_streq(&idp, "ae90f12eea699729ec"));
30-
cl_assert_equal_i(-1, git_oid_streq(&idp, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
39+
cl_assert_equal_i(0, git_oid_streq(&idp_sha1, "ae90f12eea699729ed0000000000000000000000"));
40+
cl_assert_equal_i(0, git_oid_streq(&idp_sha1, "ae90f12eea699729ed"));
41+
cl_assert_equal_i(-1, git_oid_streq(&idp_sha1, "ae90f12eea699729ed1"));
42+
cl_assert_equal_i(-1, git_oid_streq(&idp_sha1, "ae90f12eea699729ec"));
43+
cl_assert_equal_i(-1, git_oid_streq(&idp_sha1, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
3144

32-
cl_assert_equal_i(-1, git_oid_streq(&idp, "deadbeef"));
33-
cl_assert_equal_i(-1, git_oid_streq(&idp, "I'm not an oid.... :)"));
45+
cl_assert_equal_i(-1, git_oid_streq(&idp_sha1, "deadbeef"));
46+
cl_assert_equal_i(-1, git_oid_streq(&idp_sha1, "I'm not an oid.... :)"));
3447
}
3548

36-
void test_core_oid__strcmp(void)
49+
void test_core_oid__streq_sha256(void)
3750
{
38-
cl_assert_equal_i(0, git_oid_strcmp(&id, str_oid));
39-
cl_assert(git_oid_strcmp(&id, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef") < 0);
51+
cl_assert_equal_i(0, git_oid_streq(&id_sha256, str_oid_sha256));
52+
cl_assert_equal_i(-1, git_oid_streq(&id_sha256, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
4053

41-
cl_assert(git_oid_strcmp(&id, "deadbeef") < 0);
42-
cl_assert_equal_i(-1, git_oid_strcmp(&id, "I'm not an oid.... :)"));
54+
cl_assert_equal_i(-1, git_oid_streq(&id_sha256, "deadbeef"));
55+
cl_assert_equal_i(-1, git_oid_streq(&id_sha256, "I'm not an oid.... :)"));
4356

44-
cl_assert_equal_i(0, git_oid_strcmp(&idp, "ae90f12eea699729ed0000000000000000000000"));
45-
cl_assert_equal_i(0, git_oid_strcmp(&idp, "ae90f12eea699729ed"));
46-
cl_assert(git_oid_strcmp(&idp, "ae90f12eea699729ed1") < 0);
47-
cl_assert(git_oid_strcmp(&idp, "ae90f12eea699729ec") > 0);
48-
cl_assert(git_oid_strcmp(&idp, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef") < 0);
57+
cl_assert_equal_i(0, git_oid_streq(&idp_sha256, "d3e63d2f2e43d1fee20000000000000000000000000000000000000000000000"));
58+
cl_assert_equal_i(0, git_oid_streq(&idp_sha256, "d3e63d2f2e43d1fee2"));
59+
cl_assert_equal_i(-1, git_oid_streq(&idp_sha1, "d3e63d2f2e43d1fee21"));
60+
cl_assert_equal_i(-1, git_oid_streq(&idp_sha1, "d3e63d2f2e43d1fee1"));
61+
cl_assert_equal_i(-1, git_oid_streq(&idp_sha256, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
4962

50-
cl_assert(git_oid_strcmp(&idp, "deadbeef") < 0);
51-
cl_assert_equal_i(-1, git_oid_strcmp(&idp, "I'm not an oid.... :)"));
63+
cl_assert_equal_i(-1, git_oid_streq(&idp_sha1, "deadbeef"));
64+
cl_assert_equal_i(-1, git_oid_streq(&idp_sha1, "I'm not an oid.... :)"));
5265
}
5366

54-
void test_core_oid__ncmp(void)
67+
void test_core_oid__strcmp_sha1(void)
5568
{
56-
cl_assert(!git_oid_ncmp(&id, &idp, 0));
57-
cl_assert(!git_oid_ncmp(&id, &idp, 1));
58-
cl_assert(!git_oid_ncmp(&id, &idp, 2));
59-
cl_assert(!git_oid_ncmp(&id, &idp, 17));
60-
cl_assert(!git_oid_ncmp(&id, &idp, 18));
61-
cl_assert(git_oid_ncmp(&id, &idp, 19));
62-
cl_assert(git_oid_ncmp(&id, &idp, 40));
63-
cl_assert(git_oid_ncmp(&id, &idp, 41));
64-
cl_assert(git_oid_ncmp(&id, &idp, 42));
65-
66-
cl_assert(!git_oid_ncmp(&id, &id, 0));
67-
cl_assert(!git_oid_ncmp(&id, &id, 1));
68-
cl_assert(!git_oid_ncmp(&id, &id, 39));
69-
cl_assert(!git_oid_ncmp(&id, &id, 40));
70-
cl_assert(!git_oid_ncmp(&id, &id, 41));
69+
cl_assert_equal_i(0, git_oid_strcmp(&id_sha1, str_oid_sha1));
70+
cl_assert(git_oid_strcmp(&id_sha1, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef") < 0);
71+
72+
cl_assert(git_oid_strcmp(&id_sha1, "deadbeef") < 0);
73+
cl_assert_equal_i(-1, git_oid_strcmp(&id_sha1, "I'm not an oid.... :)"));
74+
75+
cl_assert_equal_i(0, git_oid_strcmp(&idp_sha1, "ae90f12eea699729ed0000000000000000000000"));
76+
cl_assert_equal_i(0, git_oid_strcmp(&idp_sha1, "ae90f12eea699729ed"));
77+
cl_assert(git_oid_strcmp(&idp_sha1, "ae90f12eea699729ed1") < 0);
78+
cl_assert(git_oid_strcmp(&idp_sha1, "ae90f12eea699729ec") > 0);
79+
cl_assert(git_oid_strcmp(&idp_sha1, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef") < 0);
80+
81+
cl_assert(git_oid_strcmp(&idp_sha1, "deadbeef") < 0);
82+
cl_assert_equal_i(-1, git_oid_strcmp(&idp_sha1, "I'm not an oid.... :)"));
83+
}
84+
85+
void test_core_oid__strcmp_sha256(void)
86+
{
87+
cl_assert_equal_i(0, git_oid_strcmp(&id_sha256, str_oid_sha256));
88+
cl_assert(git_oid_strcmp(&id_sha256, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") < 0);
89+
90+
cl_assert(git_oid_strcmp(&id_sha256, "deadbeef") < 0);
91+
cl_assert_equal_i(-1, git_oid_strcmp(&id_sha256, "I'm not an oid.... :)"));
92+
93+
cl_assert_equal_i(0, git_oid_strcmp(&idp_sha256, "d3e63d2f2e43d1fee20000000000000000000000"));
94+
cl_assert_equal_i(0, git_oid_strcmp(&idp_sha256, "d3e63d2f2e43d1fee2"));
95+
cl_assert(git_oid_strcmp(&idp_sha256, "d3e63d2f2e43d1fee21") < 0);
96+
cl_assert(git_oid_strcmp(&idp_sha256, "d3e63d2f2e43d1fee1") > 0);
97+
cl_assert(git_oid_strcmp(&idp_sha256, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef") < 0);
98+
99+
cl_assert(git_oid_strcmp(&idp_sha256, "deadbeef") < 0);
100+
cl_assert_equal_i(-1, git_oid_strcmp(&idp_sha256, "I'm not an oid.... :)"));
101+
}
102+
103+
void test_core_oid__ncmp_sha1(void)
104+
{
105+
cl_assert(!git_oid_ncmp(&id_sha1, &idp_sha1, 0));
106+
cl_assert(!git_oid_ncmp(&id_sha1, &idp_sha1, 1));
107+
cl_assert(!git_oid_ncmp(&id_sha1, &idp_sha1, 2));
108+
cl_assert(!git_oid_ncmp(&id_sha1, &idp_sha1, 17));
109+
cl_assert(!git_oid_ncmp(&id_sha1, &idp_sha1, 18));
110+
cl_assert(git_oid_ncmp(&id_sha1, &idp_sha1, 19));
111+
cl_assert(git_oid_ncmp(&id_sha1, &idp_sha1, 40));
112+
cl_assert(git_oid_ncmp(&id_sha1, &idp_sha1, 41));
113+
cl_assert(git_oid_ncmp(&id_sha1, &idp_sha1, 42));
114+
115+
cl_assert(!git_oid_ncmp(&id_sha1, &id_sha1, 0));
116+
cl_assert(!git_oid_ncmp(&id_sha1, &id_sha1, 1));
117+
cl_assert(!git_oid_ncmp(&id_sha1, &id_sha1, 39));
118+
cl_assert(!git_oid_ncmp(&id_sha1, &id_sha1, 40));
119+
cl_assert(!git_oid_ncmp(&id_sha1, &id_sha1, 41));
120+
}
121+
122+
void test_core_oid__ncmp_sha256(void)
123+
{
124+
cl_assert(!git_oid_ncmp(&id_sha256, &idp_sha256, 0));
125+
cl_assert(!git_oid_ncmp(&id_sha256, &idp_sha256, 1));
126+
cl_assert(!git_oid_ncmp(&id_sha256, &idp_sha256, 2));
127+
cl_assert(!git_oid_ncmp(&id_sha256, &idp_sha256, 17));
128+
cl_assert(!git_oid_ncmp(&id_sha256, &idp_sha256, 18));
129+
cl_assert(git_oid_ncmp(&id_sha256, &idp_sha256, 19));
130+
cl_assert(git_oid_ncmp(&id_sha256, &idp_sha256, 40));
131+
cl_assert(git_oid_ncmp(&id_sha256, &idp_sha256, 41));
132+
cl_assert(git_oid_ncmp(&id_sha256, &idp_sha256, 42));
133+
cl_assert(git_oid_ncmp(&id_sha256, &idp_sha256, 63));
134+
cl_assert(git_oid_ncmp(&id_sha256, &idp_sha256, 64));
135+
cl_assert(git_oid_ncmp(&id_sha256, &idp_sha256, 65));
136+
137+
cl_assert(!git_oid_ncmp(&id_sha256, &id_sha256, 0));
138+
cl_assert(!git_oid_ncmp(&id_sha256, &id_sha256, 1));
139+
cl_assert(!git_oid_ncmp(&id_sha256, &id_sha256, 39));
140+
cl_assert(!git_oid_ncmp(&id_sha256, &id_sha256, 40));
141+
cl_assert(!git_oid_ncmp(&id_sha256, &id_sha256, 41));
142+
cl_assert(!git_oid_ncmp(&id_sha256, &id_sha256, 63));
143+
cl_assert(!git_oid_ncmp(&id_sha256, &id_sha256, 64));
144+
cl_assert(!git_oid_ncmp(&id_sha256, &id_sha256, 65));
71145
}
72146

73147
void test_core_oid__is_hexstr(void)

tests/libgit2/object/raw/size.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ void test_object_raw_size__validate_oid_size(void)
99

1010
cl_assert(20 == GIT_OID_SHA1_SIZE);
1111
cl_assert(40 == GIT_OID_SHA1_HEXSIZE);
12-
cl_assert(sizeof(out.id) == GIT_OID_SHA1_SIZE);
12+
cl_assert(sizeof(out.id) == GIT_OID_MAX_SIZE);
1313
}

0 commit comments

Comments
 (0)