Commit Diff


commit - 87a4b05fb8b2ad9ea533436eaf47108b48ba66cf
commit + cf67c0d95b97d5a74575e1061be649435bd88489
blob - 9ea57251b69bdb5700e0fd371705a2c201e32769
blob + adfa664a9f434ac0bafc98634b7050c5a28bdf11
--- include/got_object.h
+++ include/got_object.h
@@ -367,7 +367,7 @@ const char *got_object_tag_get_tagger(struct got_tag_o
 const char *got_object_tag_get_message(struct got_tag_object *);
 
 const struct got_error *got_object_commit_add_parent(struct got_commit_object *,
-    const char *);
+    const char *, int);
 
 /* Create a new tag object in the repository. */
 const struct got_error *got_object_tag_create(struct got_object_id **,
blob - 4b96e21f407d84ac399adbccb5d7e21cf86dad1f
blob + 4bb7ecf2163c2d7807d4697feab533b7c1e26e1a
--- lib/got_lib_object_parse.h
+++ lib/got_lib_object_parse.h
@@ -28,7 +28,7 @@ struct got_commit_object *got_object_commit_alloc_part
 struct got_tree_entry *got_alloc_tree_entry_partial(void);
 
 const struct got_error *got_object_parse_commit(struct got_commit_object **,
-    char *, size_t);
+    char *, size_t, int);
 const struct got_error *got_object_read_commit(struct got_commit_object **, int,
     struct got_object_id *, size_t);
 
blob - d55b66e81877a6e05c07a226ffbd0453235a5780
blob + 294a0d3507c5fa97bca600bd2835cdaf5257d91f
--- lib/object_parse.c
+++ lib/object_parse.c
@@ -378,7 +378,7 @@ got_object_commit_alloc_partial(void)
 
 const struct got_error *
 got_object_commit_add_parent(struct got_commit_object *commit,
-    const char *id_str)
+    const char *id_str, int algo)
 {
 	const struct got_error *err = NULL;
 	struct got_object_qid *qid;
@@ -387,11 +387,12 @@ got_object_commit_add_parent(struct got_commit_object 
 	if (err)
 		return err;
 
-	if (!got_parse_sha1_digest(qid->id.hash, id_str)) {
+	if (!got_parse_hash_digest(qid->id.hash, id_str, algo, NULL)) {
 		err = got_error(GOT_ERR_BAD_OBJ_DATA);
 		got_object_qid_free(qid);
 		return err;
 	}
+	qid->id.algo = algo;
 
 	STAILQ_INSERT_TAIL(&commit->parent_ids, qid, entry);
 	commit->nparents++;
@@ -617,12 +618,18 @@ got_object_commit_get_logmsg_raw(struct got_commit_obj
 
 const struct got_error *
 got_object_parse_commit(struct got_commit_object **commit, char *buf,
-    size_t len)
+    size_t len, int algo)
 {
 	const struct got_error *err = NULL;
 	char *s = buf;
 	size_t label_len;
+	size_t digest_strlen;
 	ssize_t remain = (ssize_t)len;
+
+	if (algo == GOT_HASH_SHA256)
+		digest_strlen = SHA256_DIGEST_STRING_LENGTH;
+	else
+		digest_strlen = SHA1_DIGEST_STRING_LENGTH;
 
 	if (remain == 0)
 		return got_error(GOT_ERR_BAD_OBJ_DATA);
@@ -634,17 +641,18 @@ got_object_parse_commit(struct got_commit_object **com
 	label_len = strlen(GOT_COMMIT_LABEL_TREE);
 	if (strncmp(s, GOT_COMMIT_LABEL_TREE, label_len) == 0) {
 		remain -= label_len;
-		if (remain < SHA1_DIGEST_STRING_LENGTH) {
+		if (remain < digest_strlen) {
 			err = got_error(GOT_ERR_BAD_OBJ_DATA);
 			goto done;
 		}
 		s += label_len;
-		if (!got_parse_sha1_digest((*commit)->tree_id->hash, s)) {
+		if (!got_parse_hash_digest((*commit)->tree_id->hash, s,
+		    algo, NULL)) {
 			err = got_error(GOT_ERR_BAD_OBJ_DATA);
 			goto done;
 		}
-		remain -= SHA1_DIGEST_STRING_LENGTH;
-		s += SHA1_DIGEST_STRING_LENGTH;
+		remain -= digest_strlen;
+		s += digest_strlen;
 	} else {
 		err = got_error(GOT_ERR_BAD_OBJ_DATA);
 		goto done;
@@ -653,17 +661,17 @@ got_object_parse_commit(struct got_commit_object **com
 	label_len = strlen(GOT_COMMIT_LABEL_PARENT);
 	while (strncmp(s, GOT_COMMIT_LABEL_PARENT, label_len) == 0) {
 		remain -= label_len;
-		if (remain < SHA1_DIGEST_STRING_LENGTH) {
+		if (remain < digest_strlen) {
 			err = got_error(GOT_ERR_BAD_OBJ_DATA);
 			goto done;
 		}
 		s += label_len;
-		err = got_object_commit_add_parent(*commit, s);
+		err = got_object_commit_add_parent(*commit, s, algo);
 		if (err)
 			goto done;
 
-		remain -= SHA1_DIGEST_STRING_LENGTH;
-		s += SHA1_DIGEST_STRING_LENGTH;
+		remain -= digest_strlen;
+		s += digest_strlen;
 	}
 
 	label_len = strlen(GOT_COMMIT_LABEL_AUTHOR);
@@ -751,17 +759,28 @@ got_object_read_commit(struct got_commit_object **comm
 	uint8_t *p;
 	struct got_inflate_checksum csum;
 	SHA1_CTX sha1_ctx;
+	SHA2_CTX sha256_ctx;
 	struct got_object_id id;
 
-	SHA1Init(&hash_ctx);
 	memset(&csum, 0, sizeof(csum));
-	csum.output_hash = &hash_ctx;
+	id.algo = expected_id->algo;
+	if (expected_id->algo == GOT_HASH_SHA256) {
+		SHA256Init(&sha256_ctx);
+		csum.output_sha256 = &sha256_ctx;
+	} else {
+		SHA1Init(&sha1_ctx);
+		csum.output_sha1 = &sha1_ctx;
+	}
 
 	err = got_inflate_to_mem_fd(&p, &len, NULL, &csum, expected_size, fd);
 	if (err)
 		return err;
 
-	SHA1Final(id.hash, &sha1_ctx);
+	if (expected_id->algo == GOT_HASH_SHA256)
+		SHA256Final(id.hash, &sha256_ctx);
+	else
+		SHA1Final(id.hash, &sha1_ctx);
+
 	if (got_object_id_cmp(expected_id, &id) != 0) {
 		err = got_error_checksum(expected_id);
 		goto done;
@@ -783,7 +802,8 @@ got_object_read_commit(struct got_commit_object **comm
 
 	/* Skip object header. */
 	len -= obj->hdrlen;
-	err = got_object_parse_commit(commit, p + obj->hdrlen, len);
+	err = got_object_parse_commit(commit, p + obj->hdrlen, len,
+	    expected_id->algo);
 done:
 	free(p);
 	if (obj)
blob - ca7cac34bcd12c5df8c223e410917d4fb6bb151a
blob + a7bc1b886b3ad07fbe8c6c1b889b4c23b1c07c28
--- libexec/got-read-pack/got-read-pack.c
+++ libexec/got-read-pack/got-read-pack.c
@@ -142,7 +142,7 @@ open_commit(struct got_commit_object **commit, struct 
 
 	obj->size = len;
 
-	err = got_object_parse_commit(commit, buf, len);
+	err = got_object_parse_commit(commit, buf, len, GOT_HASH_SHA1);
 done:
 	got_object_close(obj);
 	free(buf);