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

[PATCH 5/5] read_sha1_file(): allow selective bypassing of replacement mechanism

From
Junio C Hamano <gitster@pobox.com>
Date
May 15, 2011, 19:54 UTC
Message-ID
<1305489294-14341-6-git-send-email-gitster@pobox.com>
In-Reply-To
<1305489294-14341-1-git-send-email-gitster@pobox.com>

The way "object replacement" mechanism was tucked to the read_sha1_file() interface was suboptimal in a couple of ways:

 - Callers that want it to die with useful diagnosis upon seeing a corrupt
   object does not have a way to say that they do not want any object
   replacement.
 - Callers who do not want it to die but want to handle the errors
   themselves are told to arrange to call read_object(), but the function
   does not use the replacement mechanism, and also it is a file scope
   static function that not many callers can call to begin with.

This adds a read_sha1_file_extended() that takes a set of flags; the callers of read_sha1_file() passes a flag READ_SHA1_FILE_REPLACE to ask for object replacement mechanism to kick in.

Later, we could add another flag bit to tell the function to return an error instead of dying and then remove the misguided "call read_object() yourself".

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 cache.h     |    7 ++++++-
 sha1_file.c |   10 ++++++----
 2 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/cache.h b/cache.h
index c10a91d..5f1f5c3 100644
--- a/cache.h
+++ b/cache.h
@@ -757,7 +757,12 @@ int daemon_avoid_alias(const char *path);
 int offset_1st_component(const char *path);
 
 /* object replacement */
-extern void *read_sha1_file(const unsigned char *sha1, enum object_type *type, unsigned long *size);
+#define READ_SHA1_FILE_REPLACE 1
+extern void *read_sha1_file_extended(const unsigned char *sha1, enum object_type *type, unsigned long *size, unsigned flag);
+static inline void *read_sha1_file(const unsigned char *sha1, enum object_type *type, unsigned long *size)
+{
+	return read_sha1_file_extended(sha1, type, size, READ_SHA1_FILE_REPLACE);
+}
 extern const unsigned char *do_lookup_replace_object(const unsigned char *sha1);
 static inline const unsigned char *lookup_replace_object(const unsigned char *sha1)
 {
diff --git a/sha1_file.c b/sha1_file.c
index 5d80feb..7e6e976 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -2206,14 +2206,16 @@ static void *read_object(const unsigned char *sha1, enum object_type *type,
  * deal with them should arrange to call read_object() and give error
  * messages themselves.
  */
-void *read_sha1_file(const unsigned char *sha1,
-		     enum object_type *type,
-		     unsigned long *size)
+void *read_sha1_file_extended(const unsigned char *sha1,
+			      enum object_type *type,
+			      unsigned long *size,
+			      unsigned flag)
 {
-	const unsigned char *repl = lookup_replace_object(sha1);
 	void *data;
 	char *path;
 	const struct packed_git *p;
+	const unsigned char *repl = (flag & READ_SHA1_FILE_REPLACE)
+		? lookup_replace_object(sha1) : sha1;
 
 	errno = 0;
 	data = read_object(repl, type, size);
-- 
1.7.5.1.334.gdfd07
Previous: Junio C Hamano
Message 6 of 6 in “Updates to replace-object API”
  1. 0/5 Updates to replace-object APIJunio C Hamano, May 15, 2011
  2. 1/5 Declare lookup_replace_object() in cache.h, not in commit.hJunio C Hamano, May 15, 2011
  3. 2/5 t6050: make sure we test not just commit replacementJunio C Hamano, May 15, 2011
  4. 3/5 read_sha1_file(): get rid of read_sha1_file_repl() madnessJunio C Hamano, May 15, 2011
  5. 4/5 inline lookup_replace_object() callsJunio C Hamano, May 15, 2011
  6. 5/5 read_sha1_file(): allow selective bypassing of replacement mechanismJunio C Hamano, May 15, 2011

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.