git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 14/17] sha1_file: introduce an nth_packed_object_oid function

From
brian m. carlson <sandals@crustytoothpaste.net>
Date
Jan 1, 2017, 19:18 UTC
Message-ID
<20170101191847.564741-15-sandals@crustytoothpaste.net>
In-Reply-To
<20170101191847.564741-1-sandals@crustytoothpaste.net>

There are places in the code where we would like to provide a struct object_id *, yet read the hash directly from the pack. Provide an nth_packed_object_oid function that mirrors the nth_packed_object_sha1 function.

The required cast is questionable, but should be safe on all known platforms. The alternative of allocating an object as an intermediate would be too inefficient and cause memory leaks. If necessary, an intermediate union could be used; this practice is allowed by GCC and explicitly sanctioned by C11. However, such a change will likely not be necessary, and can be made if and when it is.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
---
 cache.h     |  1 +
 sha1_file.c | 12 +++++++++---
 2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/cache.h b/cache.h
index a50a61a19..b1ed1c7ae 100644
--- a/cache.h
+++ b/cache.h
@@ -1540,6 +1540,7 @@ extern void check_pack_index_ptr(const struct packed_git *p, const void *ptr);
  * error.
  */
 extern const unsigned char *nth_packed_object_sha1(struct packed_git *, uint32_t n);
+extern const struct object_id *nth_packed_object_oid(struct packed_git *, uint32_t n);
 
 /*
  * Return the offset of the nth object within the specified packfile.
diff --git a/sha1_file.c b/sha1_file.c
index 117307185..d27d1521b 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -2608,6 +2608,12 @@ const unsigned char *nth_packed_object_sha1(struct packed_git *p,
 	}
 }
 
+const struct object_id *nth_packed_object_oid(struct packed_git *p,
+					      uint32_t n)
+{
+	return (const struct object_id *)nth_packed_object_sha1(p, n);
+}
+
 void check_pack_index_ptr(const struct packed_git *p, const void *vptr)
 {
 	const unsigned char *ptr = vptr;
@@ -3768,13 +3774,13 @@ static int for_each_object_in_pack(struct packed_git *p, each_packed_object_fn c
 	int r = 0;
 
 	for (i = 0; i < p->num_objects; i++) {
-		const unsigned char *sha1 = nth_packed_object_sha1(p, i);
+		const struct object_id *oid = nth_packed_object_oid(p, i);
 
-		if (!sha1)
+		if (!oid)
 			return error("unable to get sha1 of object %u in %s",
 				     i, p->pack_name);
 
-		r = cb(sha1, p, i, data);
+		r = cb(oid->hash, p, i, data);
 		if (r)
 			break;
 	}
-- 
2.11.0
Previous: brian m. carlsonNext: Michael Haggerty
Message 10 of 27 in “object_id part 6”
  1. 00/17 object_id part 6brian m. carlson, Jan 1, 2017
  2. 03/17 builtin/describe: convert to struct object_idbrian m. carlson, Jan 1, 2017
  3. 07/17 builtin/branch: convert to struct object_idbrian m. carlson, Jan 1, 2017
  4. 09/17 builtin/merge: convert to struct object_idbrian m. carlson, Jan 1, 2017
  5. Michael HaggertyJan 2, 2017
  6. 11/17 builtin/replace: convert to struct object_idbrian m. carlson, Jan 1, 2017
  7. 16/17 builtin/merge-base: convert to struct object_idbrian m. carlson, Jan 1, 2017
  8. 15/17 Convert object iteration callbacks to struct object_idbrian m. carlson, Jan 1, 2017
  9. 08/17 builtin/clone: convert to struct object_idbrian m. carlson, Jan 1, 2017
  10. 14/17 sha1_file: introduce an nth_packed_object_oid functionbrian m. carlson, Jan 1, 2017
  11. Michael HaggertyJan 2, 2017
  12. Jeff KingJan 2, 2017
  13. Michael HaggertyJan 2, 2017
  14. Jeff KingJan 2, 2017
  15. 13/17 refs: convert each_reflog_ent_fn to struct object_idbrian m. carlson, Jan 1, 2017
  16. Michael HaggertyJan 2, 2017
  17. 10/17 Convert remaining callers of resolve_refdup to object_idbrian m. carlson, Jan 1, 2017
  18. 12/17 reflog-walk: convert struct reflog_info to struct object_idbrian m. carlson, Jan 1, 2017
  19. 17/17 wt-status: convert to struct object_idbrian m. carlson, Jan 1, 2017
  20. 06/17 builtin/grep: convert to struct object_idbrian m. carlson, Jan 1, 2017
  21. 02/17 builtin/diff-tree: convert to struct object_idbrian m. carlson, Jan 1, 2017
  22. 05/17 builtin/fmt-merge-message: convert to struct object_idbrian m. carlson, Jan 1, 2017
  23. 04/17 builtin/fast-export: convert to struct object_idbrian m. carlson, Jan 1, 2017
  24. 01/17 builtin/commit: convert to struct object_idbrian m. carlson, Jan 1, 2017
  25. Michael HaggertyJan 2, 2017
  26. Michael HaggertyJan 2, 2017
  27. Jeff KingJan 3, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.