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

Re: git and time

From
Junio C Hamano <junkio@cox.net>
Date
Sep 27, 2006, 10:13 UTC
Message-ID
<7vfyedd3bw.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<20060927042850.GB9460@spearce.org>
Shawn Pearce <spearce@spearce.org> writes:
> However people are ignoring the fact that receive-pack doesn't
> update the reflog.  As of current `next` its *still* doing the ref
> updates by hand, rather than going through the common library code
> in refs.c.

This is unfortunately on top of many things, but judging from the number of deleted lines and added lines, I think it is going in the right direction.

One thing that makes "the common library code" less useful is that lock_ref_sha1() and its cousin lock_any_ref_for_update() do not let the caller to tell why a ref could not be locked ("did it not exist? did the old_sha1 not match?" and in lock_ref_sha1()'s case "did the ref have funny characters?").

-- >8 -- [PATCH] Teach receive-pack about ref-log

This converts receive-pack to use the standard ref locking code instead of its own. As a side effect, it automatically records the "push" event to ref-log if enabled.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---
 receive-pack.c |   88 ++++++++++----------------------------------------------
 1 files changed, 15 insertions(+), 73 deletions(-)
diff --git a/receive-pack.c b/receive-pack.c
index abbcb6a..f0b4cb4 100644
--- a/receive-pack.c
+++ b/receive-pack.c
@@ -41,34 +41,6 @@ struct command {
 
 static struct command *commands;
 
-static int is_all_zeroes(const char *hex)
-{
-	int i;
-	for (i = 0; i < 40; i++)
-		if (*hex++ != '0')
-			return 0;
-	return 1;
-}
-
-static int verify_old_ref(const char *name, char *hex_contents)
-{
-	int fd, ret;
-	char buffer[60];
-
-	if (is_all_zeroes(hex_contents))
-		return 0;
-	fd = open(name, O_RDONLY);
-	if (fd < 0)
-		return -1;
-	ret = read(fd, buffer, 40);
-	close(fd);
-	if (ret != 40)
-		return -1;
-	if (memcmp(buffer, hex_contents, 40))
-		return -1;
-	return 0;
-}
-
 static char update_hook[] = "hooks/update";
 
 static int run_update_hook(const char *refname,
@@ -105,8 +77,8 @@ static int update(struct command *cmd)
 	const char *name = cmd->ref_name;
 	unsigned char *old_sha1 = cmd->old_sha1;
 	unsigned char *new_sha1 = cmd->new_sha1;
-	char new_hex[60], *old_hex, *lock_name;
-	int newfd, namelen, written;
+	char new_hex[41], old_hex[41];
+	struct ref_lock *lock;
 
 	cmd->error_string = NULL;
 	if (!strncmp(name, "refs/", 5) && check_ref_format(name + 5)) {
@@ -115,59 +87,27 @@ static int update(struct command *cmd)
 			     name);
 	}
 
-	namelen = strlen(name);
-	lock_name = xmalloc(namelen + 10);
-	memcpy(lock_name, name, namelen);
-	memcpy(lock_name + namelen, ".lock", 6);
-
 	strcpy(new_hex, sha1_to_hex(new_sha1));
-	old_hex = sha1_to_hex(old_sha1);
+	strcpy(old_hex, sha1_to_hex(old_sha1));
 	if (!has_sha1_file(new_sha1)) {
 		cmd->error_string = "bad pack";
 		return error("unpack should have generated %s, "
 			     "but I can't find it!", new_hex);
 	}
-	safe_create_leading_directories(lock_name);
-
-	newfd = open(lock_name, O_CREAT | O_EXCL | O_WRONLY, 0666);
-	if (newfd < 0) {
-		cmd->error_string = "can't lock";
-		return error("unable to create %s (%s)",
-			     lock_name, strerror(errno));
-	}
-
-	/* Write the ref with an ending '\n' */
-	new_hex[40] = '\n';
-	new_hex[41] = 0;
-	written = write(newfd, new_hex, 41);
-	/* Remove the '\n' again */
-	new_hex[40] = 0;
-
-	close(newfd);
-	if (written != 41) {
-		unlink(lock_name);
-		cmd->error_string = "can't write";
-		return error("unable to write %s", lock_name);
-	}
-	if (verify_old_ref(name, old_hex) < 0) {
-		unlink(lock_name);
-		cmd->error_string = "raced";
-		return error("%s changed during push", name);
-	}
 	if (run_update_hook(name, old_hex, new_hex)) {
-		unlink(lock_name);
 		cmd->error_string = "hook declined";
 		return error("hook declined to update %s", name);
 	}
-	else if (rename(lock_name, name) < 0) {
-		unlink(lock_name);
-		cmd->error_string = "can't rename";
-		return error("unable to replace %s", name);
-	}
-	else {
-		fprintf(stderr, "%s: %s -> %s\n", name, old_hex, new_hex);
-		return 0;
+
+	lock = lock_any_ref_for_update(name, old_sha1);
+	if (!lock) {
+		cmd->error_string = "failed to lock";
+		return error("failed to lock %s", name);
 	}
+	write_ref_sha1(lock, new_sha1, "push");
+
+	fprintf(stderr, "%s: %s -> %s\n", name, old_hex, new_hex);
+	return 0;
 }
 
 static char update_post_hook[] = "hooks/post-update";
@@ -318,9 +258,11 @@ int main(int argc, char **argv)
 	if (!dir)
 		usage(receive_pack_usage);
 
-	if(!enter_repo(dir, 0))
+	if (!enter_repo(dir, 0))
 		die("'%s': unable to chdir or not a git archive", dir);
 
+	git_config(git_default_config);
+
 	write_head_info();
 
 	/* EOF */
-- 
1.4.2.1.gf80a
Previous: Junio C HamanoNext: Shawn Pearce
Message 83 of 115 in “git and time”
  1. Matthew L FosterSep 26, 2006
  2. Johannes SchindelinSep 26, 2006
  3. Jakub NarebskiSep 26, 2006
  4. Jeff KingSep 26, 2006
  5. Matthew L FosterSep 27, 2006
  6. SeanSep 27, 2006
  7. David LangSep 27, 2006
  8. SeanSep 27, 2006
  9. Junio C HamanoSep 27, 2006
  10. David LangSep 27, 2006
  11. SeanSep 27, 2006
  12. Junio C HamanoSep 27, 2006
  13. SeanSep 27, 2006
  14. Junio C HamanoSep 27, 2006
  15. Andreas EricssonSep 27, 2006
  16. Jeff KingSep 27, 2006
  17. Matthew L FosterSep 27, 2006
  18. Andreas EricssonSep 27, 2006
  19. Matthew L FosterSep 27, 2006
  20. Linus TorvaldsSep 27, 2006
  21. Matthew L FosterSep 27, 2006
  22. Linus TorvaldsSep 27, 2006
  23. Matthew L FosterSep 27, 2006
  24. Linus TorvaldsSep 27, 2006
  25. Matthew L FosterSep 27, 2006
  26. Linus TorvaldsSep 27, 2006
  27. Matthew L FosterSep 27, 2006
  28. Linus TorvaldsSep 27, 2006
  29. Shawn PearceSep 27, 2006
  30. Linus TorvaldsSep 27, 2006
  31. Matthew L FosterSep 28, 2006
  32. Jeff KingSep 28, 2006
  33. Shawn PearceSep 28, 2006
  34. Matthew L FosterSep 28, 2006
  35. Linus TorvaldsSep 28, 2006
  36. Andreas EricssonSep 29, 2006
  37. Johannes SchindelinSep 29, 2006
  38. Andreas EricssonSep 29, 2006
  39. Junio C HamanoSep 28, 2006
  40. Matthew L FosterSep 28, 2006
  41. SeanSep 28, 2006
  42. Matthew L FosterSep 28, 2006
  43. David LangSep 28, 2006
  44. SeanSep 28, 2006
  45. Tom PrinceSep 28, 2006
  46. Nicolas PitreSep 28, 2006
  47. Tom PrinceSep 28, 2006
  48. Shawn PearceSep 28, 2006
  49. Junio C HamanoSep 28, 2006
  50. Theodore TsoSep 28, 2006
  51. Matthew L FosterSep 28, 2006
  52. Nicolas PitreSep 28, 2006
  53. Junio C HamanoSep 28, 2006
  54. Nicolas PitreSep 28, 2006
  55. Junio C HamanoSep 28, 2006
  56. Junio C HamanoSep 29, 2006
  57. Shawn PearceSep 30, 2006
  58. Junio C HamanoSep 30, 2006
  59. Linus TorvaldsSep 30, 2006
  60. Junio C HamanoSep 30, 2006
  61. Linus TorvaldsOct 1, 2006
  62. Junio C HamanoOct 1, 2006
  63. Junio C HamanoOct 1, 2006
  64. Johannes SchindelinOct 1, 2006
  65. Jakub NarebskiOct 2, 2006
  66. Jakub NarebskiSep 29, 2006
  67. Shawn PearceSep 27, 2006
  68. Matthew L FosterSep 27, 2006
  69. Shawn PearceSep 27, 2006
  70. Andy WhitcroftSep 27, 2006
  71. Linus TorvaldsSep 27, 2006
  72. Edgar ToernigSep 27, 2006
  73. Linus TorvaldsSep 27, 2006
  74. Jakub NarebskiSep 29, 2006
  75. Linus TorvaldsSep 27, 2006
  76. Jakub NarebskiOct 3, 2006
  77. Jeff KingSep 27, 2006
  78. SeanSep 27, 2006
  79. Junio C HamanoSep 27, 2006
  80. SeanSep 27, 2006
  81. Shawn PearceSep 27, 2006
  82. Junio C HamanoSep 27, 2006
  83. Junio C HamanoSep 27, 2006
  84. Shawn PearceSep 27, 2006
  85. Junio C HamanoSep 27, 2006
  86. Shawn PearceSep 27, 2006
  87. Jeff KingSep 27, 2006
  88. SeanSep 27, 2006
  89. Theodore TsoSep 28, 2006
  90. Matthew L FosterSep 28, 2006
  91. Rogan DawesSep 28, 2006
  92. Matthew L FosterSep 28, 2006
  93. Linus TorvaldsSep 28, 2006
  94. Junio C HamanoSep 28, 2006
  95. Matthew L FosterSep 28, 2006
  96. Johannes SchindelinSep 28, 2006
  97. Matthew L FosterSep 28, 2006
  98. Shawn PearceSep 28, 2006
  99. Matthew L FosterSep 28, 2006
  100. Johannes SchindelinSep 28, 2006
  101. Matthew L FosterSep 28, 2006
  102. Andreas EricssonSep 29, 2006
  103. Linus TorvaldsSep 28, 2006
  104. Matthew L FosterSep 28, 2006
  105. Theodore TsoSep 29, 2006
  106. Matthew L FosterSep 29, 2006
  107. Junio C HamanoSep 29, 2006
  108. Robin RosenbergSep 28, 2006
  109. A Large Angry SCMSep 28, 2006
  110. Matthew L FosterSep 28, 2006
  111. A Large Angry SCMSep 28, 2006
  112. Matthew L FosterSep 28, 2006
  113. Matthew L FosterSep 28, 2006
  114. Jan HarkesSep 29, 2006
  115. SeanSep 29, 2006

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.