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

[PATCH 1/3] log_ref_write() -- do not chomp reflog message at the first LF

From
Junio C Hamano <gitster@pobox.com>
Date
Jul 29, 2007, 01:10 UTC
Message-ID
<7vvec4nhfk.fsf_-_@assigned-by-dhcp.cox.net>
In-Reply-To
<7vzm1gnhin.fsf@assigned-by-dhcp.cox.net>

A reflog file is organized as one-line-per-entry records, and we enforced the file format integrity by chomping the given message at the first LF. This changes it to convert them to SP, which is more in line with the --pretty=oneline format.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 refs.c |   44 ++++++++++++++++++++++++++++----------------
 1 files changed, 28 insertions(+), 16 deletions(-)
diff --git a/refs.c b/refs.c
index 2694e70..fac6548 100644
--- a/refs.c
+++ b/refs.c
@@ -1036,6 +1036,32 @@ void unlock_ref(struct ref_lock *lock)
 	free(lock);
 }
 
+/*
+ * copy the reflog message msg to buf, which has been allocated sufficiently
+ * large, while cleaning up the whitespaces.  Especially, convert LF to space,
+ * because reflog file is one line per entry.
+ */
+static int copy_msg(char *buf, const char *msg)
+{
+	char *cp = buf;
+	char c;
+	int wasspace = 1;
+
+	*cp++ = '\t';
+	while ((c = *msg++)) {
+		if (wasspace && isspace(c))
+			continue;
+		wasspace = isspace(c);
+		if (wasspace)
+			c = ' ';
+		*cp++ = c;
+	}
+	while (buf < cp && isspace(cp[-1]))
+		cp--;
+	*cp++ = '\n';
+	return cp - buf;
+}
+
 static int log_ref_write(const char *ref_name, const unsigned char *old_sha1,
 			 const unsigned char *new_sha1, const char *msg)
 {
@@ -1080,21 +1106,7 @@ static int log_ref_write(const char *ref_name, const unsigned char *old_sha1,
 
 	adjust_shared_perm(log_file);
 
-	msglen = 0;
-	if (msg) {
-		/* clean up the message and make sure it is a single line */
-		for ( ; *msg; msg++)
-			if (!isspace(*msg))
-				break;
-		if (*msg) {
-			const char *ep = strchr(msg, '\n');
-			if (ep)
-				msglen = ep - msg;
-			else
-				msglen = strlen(msg);
-		}
-	}
-
+	msglen = msg ? strlen(msg) : 0;
 	committer = git_committer_info(-1);
 	maxlen = strlen(committer) + msglen + 100;
 	logrec = xmalloc(maxlen);
@@ -1103,7 +1115,7 @@ static int log_ref_write(const char *ref_name, const unsigned char *old_sha1,
 		      sha1_to_hex(new_sha1),
 		      committer);
 	if (msglen)
-		len += sprintf(logrec + len - 1, "\t%.*s\n", msglen, msg) - 1;
+		len += copy_msg(logrec + len - 1, msg) - 1;
 	written = len <= maxlen ? write_in_full(logfd, logrec, len) : -1;
 	free(logrec);
 	if (close(logfd) != 0 || written != len)
-- 
1.5.3.rc3.24.g83b3d
Previous: Junio C HamanoNext: Johannes Schindelin
Message 10 of 18 in “git-svn rebase screwing up commit messages”
  1. Benoit SIGOUREJul 28, 2007
  2. Junio C HamanoJul 28, 2007
  3. SeanJul 28, 2007
  4. Junio C HamanoJul 28, 2007
  5. SeanJul 28, 2007
  6. Junio C HamanoJul 28, 2007
  7. SeanJul 28, 2007
  8. Junio C HamanoJul 28, 2007
  9. Junio C HamanoJul 29, 2007
  10. 1/3 log_ref_write() -- do not chomp reflog message at the first LFJunio C Hamano, Jul 29, 2007
  11. Johannes SchindelinJul 29, 2007
  12. Junio C HamanoJul 29, 2007
  13. Johannes SchindelinJul 29, 2007
  14. 2/3 symbolic-ref, update-ref: do not refuse reflog message with LFJunio C Hamano, Jul 29, 2007
  15. 3/3 rebase: try not to munge commit log messageJunio C Hamano, Jul 29, 2007
  16. Jakub NarebskiJul 28, 2007
  17. Robin RosenbergJul 28, 2007
  18. Benoit SIGOUREJul 28, 2007

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.