convert log_ref_write_fd() to use strbuf

Since we don't care about how many bytes were written, simplify the return
value logic.

log_ref_write_fd() was written long before strbuf was fleshed out. Remove
the old manual buffer management code and replace it with strbuf(). Also
update copy_reflog_msg() which is called only by log_ref_write_fd() to use
strbuf as it keeps things consistent.

Signed-off-by: Ben Peart <Ben.Peart@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Ben Peart 2018-07-10 21:08:22 +00:00 committed by Junio C Hamano
parent e3331758f1
commit 80a6c2073b
3 changed files with 17 additions and 31 deletions

12
refs.c
View File

@ -786,25 +786,21 @@ int delete_ref(const char *msg, const char *refname,
old_oid, flags); old_oid, flags);
} }


int copy_reflog_msg(char *buf, const char *msg) void copy_reflog_msg(struct strbuf *sb, const char *msg)
{ {
char *cp = buf;
char c; char c;
int wasspace = 1; int wasspace = 1;


*cp++ = '\t'; strbuf_addch(sb, '\t');
while ((c = *msg++)) { while ((c = *msg++)) {
if (wasspace && isspace(c)) if (wasspace && isspace(c))
continue; continue;
wasspace = isspace(c); wasspace = isspace(c);
if (wasspace) if (wasspace)
c = ' '; c = ' ';
*cp++ = c; strbuf_addch(sb, c);
} }
while (buf < cp && isspace(cp[-1])) strbuf_rtrim(sb);
cp--;
*cp++ = '\n';
return cp - buf;
} }


int should_autocreate_reflog(const char *refname) int should_autocreate_reflog(const char *refname)

View File

@ -1582,26 +1582,17 @@ static int log_ref_write_fd(int fd, const struct object_id *old_oid,
const struct object_id *new_oid, const struct object_id *new_oid,
const char *committer, const char *msg) const char *committer, const char *msg)
{ {
int msglen, written; struct strbuf sb = STRBUF_INIT;
unsigned maxlen, len; int ret = 0;
char *logrec;


msglen = msg ? strlen(msg) : 0; strbuf_addf(&sb, "%s %s %s", oid_to_hex(old_oid), oid_to_hex(new_oid), committer);
maxlen = strlen(committer) + msglen + 100; if (msg && *msg)
logrec = xmalloc(maxlen); copy_reflog_msg(&sb, msg);
len = xsnprintf(logrec, maxlen, "%s %s %s\n", strbuf_addch(&sb, '\n');
oid_to_hex(old_oid), if (write_in_full(fd, sb.buf, sb.len) < 0)
oid_to_hex(new_oid), ret = -1;
committer); strbuf_release(&sb);
if (msglen) return ret;
len += copy_reflog_msg(logrec + len - 1, msg) - 1;

written = len <= maxlen ? write_in_full(fd, logrec, len) : -1;
free(logrec);
if (written < 0)
return -1;

return 0;
} }


static int files_log_ref_write(struct files_ref_store *refs, static int files_log_ref_write(struct files_ref_store *refs,

View File

@ -91,11 +91,10 @@ enum peel_status {
enum peel_status peel_object(const struct object_id *name, struct object_id *oid); enum peel_status peel_object(const struct object_id *name, struct object_id *oid);


/* /*
* Copy the reflog message msg to buf, which has been allocated sufficiently * Copy the reflog message msg to sb while cleaning up the whitespaces.
* large, while cleaning up the whitespaces. Especially, convert LF to space, * Especially, convert LF to space, because reflog file is one line per entry.
* because reflog file is one line per entry.
*/ */
int copy_reflog_msg(char *buf, const char *msg); void copy_reflog_msg(struct strbuf *sb, const char *msg);


/** /**
* Information needed for a single ref update. Set new_oid to the new * Information needed for a single ref update. Set new_oid to the new