diff options
authorbrian m. carlson <>2017-02-20 00:10:13 (GMT)
committerJunio C Hamano <>2017-02-20 09:11:26 (GMT)
commit605f430efb23ce14ca11750368149acd38b8f1e4 (patch)
parent5588dbffbd61e4906e453808c6ad32f792fea521 (diff)
hex: introduce parse_oid_hex
Introduce a function, parse_oid_hex, which parses a hexadecimal object ID and if successful, sets a pointer to just beyond the last character. This allows for simpler, more robust parsing without needing to hard-code integer values throughout the codebase. Signed-off-by: brian m. carlson <> Signed-off-by: Junio C Hamano <>
2 files changed, 17 insertions, 0 deletions
diff --git a/cache.h b/cache.h
index 61fc86e..e03a672 100644
--- a/cache.h
+++ b/cache.h
@@ -1319,6 +1319,15 @@ extern char *oid_to_hex_r(char *out, const struct object_id *oid);
extern char *sha1_to_hex(const unsigned char *sha1); /* static buffer result! */
extern char *oid_to_hex(const struct object_id *oid); /* same static buffer as sha1_to_hex */
+ * Parse a 40-character hexadecimal object ID starting from hex, updating the
+ * pointer specified by end when parsing stops. The resulting object ID is
+ * stored in oid. Returns 0 on success. Parsing will stop on the first NUL or
+ * other invalid character. end is only updated on success; otherwise, it is
+ * unmodified.
+ */
+extern int parse_oid_hex(const char *hex, struct object_id *oid, const char **end);
extern int interpret_branch_name(const char *str, int len, struct strbuf *);
extern int get_oid_mb(const char *str, struct object_id *oid);
diff --git a/hex.c b/hex.c
index 845b01a..eab7b62 100644
--- a/hex.c
+++ b/hex.c
@@ -53,6 +53,14 @@ int get_oid_hex(const char *hex, struct object_id *oid)
return get_sha1_hex(hex, oid->hash);
+int parse_oid_hex(const char *hex, struct object_id *oid, const char **end)
+ int ret = get_oid_hex(hex, oid);
+ if (!ret)
+ *end = hex + GIT_SHA1_HEXSZ;
+ return ret;
char *sha1_to_hex_r(char *buffer, const unsigned char *sha1)
static const char hex[] = "0123456789abcdef";