Re: [PATCH v4 02/27] Convert git_snpath() to strbuf_git_path()
On Fri, Mar 7, 2014 at 12:03 AM, Duy Nguyen wrote: > On Mon, Mar 3, 2014 at 7:15 AM, Duy Nguyen wrote: >> On Mon, Mar 3, 2014 at 7:02 AM, Eric Sunshine >> wrote: >>> On Sat, Mar 1, 2014 at 7:12 AM, Nguyễn Thái Ngọc Duy >>> wrote: In the previous patch, git_snpath() is modified to allocate a new strbuf buffer because vsnpath() needs that. But that makes it awkward because git_snpath() receives a pre-allocated buffer from outside and has to copy data back. Rename it to strbuf_git_path() and make it receive strbuf directly. The conversion from git_snpath() to git_path() in update_refs_for_switch() is safe because that function does not keep any pointer to the round-robin buffer pool allocated by get_pathname(). Signed-off-by: Nguyễn Thái Ngọc Duy --- diff --git a/refs.c b/refs.c index 89228e2..434bd5e 100644 --- a/refs.c +++ b/refs.c @@ -2717,17 +2729,19 @@ static int copy_msg(char *buf, const char *msg) return cp - buf; } -int log_ref_setup(const char *refname, char *logfile, int bufsize) +int log_ref_setup(const char *refname, struct strbuf *sb_logfile) { int logfd, oflags = O_APPEND | O_WRONLY; + const char *logfile; - git_snpath(logfile, bufsize, "logs/%s", refname); + strbuf_git_path(sb_logfile, "logs/%s", refname); + logfile = sb_logfile->buf; if (log_all_ref_updates && (starts_with(refname, "refs/heads/") || starts_with(refname, "refs/remotes/") || starts_with(refname, "refs/notes/") || !strcmp(refname, "HEAD"))) { - if (safe_create_leading_directories(logfile) < 0) + if (safe_create_leading_directories(sb_logfile->buf) < 0) >>> >>> At this point, 'logfile' is still 'sb_logfile->buf', so do you really >>> need this change? >> >> Junio made the same comment last time and I missed it. Will update. > > No I will not :-) safe_create_leading_directories takes an editable > string, but logfile is now a const string. We could use > s_c_l_d_const() but that one will make a copy of the string > unncessarily. Will make a note in the commit message though. Rather than explaining it in the commit message, it might be better eliminate the source of confusion by taking one of these approaches: 1. Drop the 'const char *logfile' variable altogether; rename the strbuf argument to 'logfile'; and just use logfile->buf everywhere 'logfile' is used in the current code. This makes the diff a bit more noisy, but eliminates confusion of reviewers reading the patch. 2. Keep the 'const char *logfile' but assign it just before its first (real) use in 'logfd = open(logfile...)'. (There's one earlier use in a diagnostic, but sb_logfile->buf could suffice there.) 3. Just declare it 'char *logfile' and use it everywhere in the function. This is a bit ugly since it's not obvious to the reviewer that it is non-const only for the sake of safe_create_leading_directories(). I fiind myself favoring #1 in this particular case. -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v4 02/27] Convert git_snpath() to strbuf_git_path()
On Mon, Mar 3, 2014 at 7:15 AM, Duy Nguyen wrote: > On Mon, Mar 3, 2014 at 7:02 AM, Eric Sunshine wrote: >> On Sat, Mar 1, 2014 at 7:12 AM, Nguyễn Thái Ngọc Duy >> wrote: >>> In the previous patch, git_snpath() is modified to allocate a new >>> strbuf buffer because vsnpath() needs that. But that makes it awkward >>> because git_snpath() receives a pre-allocated buffer from outside and >>> has to copy data back. Rename it to strbuf_git_path() and make it >>> receive strbuf directly. >>> >>> The conversion from git_snpath() to git_path() in >>> update_refs_for_switch() is safe because that function does not keep >>> any pointer to the round-robin buffer pool allocated by >>> get_pathname(). >>> >>> Signed-off-by: Nguyễn Thái Ngọc Duy >>> --- >>> diff --git a/refs.c b/refs.c >>> index 89228e2..434bd5e 100644 >>> --- a/refs.c >>> +++ b/refs.c >>> @@ -2717,17 +2729,19 @@ static int copy_msg(char *buf, const char *msg) >>> return cp - buf; >>> } >>> >>> -int log_ref_setup(const char *refname, char *logfile, int bufsize) >>> +int log_ref_setup(const char *refname, struct strbuf *sb_logfile) >>> { >>> int logfd, oflags = O_APPEND | O_WRONLY; >>> + const char *logfile; >>> >>> - git_snpath(logfile, bufsize, "logs/%s", refname); >>> + strbuf_git_path(sb_logfile, "logs/%s", refname); >>> + logfile = sb_logfile->buf; >>> if (log_all_ref_updates && >>> (starts_with(refname, "refs/heads/") || >>> starts_with(refname, "refs/remotes/") || >>> starts_with(refname, "refs/notes/") || >>> !strcmp(refname, "HEAD"))) { >>> - if (safe_create_leading_directories(logfile) < 0) >>> + if (safe_create_leading_directories(sb_logfile->buf) < 0) >> >> At this point, 'logfile' is still 'sb_logfile->buf', so do you really >> need this change? > > Junio made the same comment last time and I missed it. Will update. No I will not :-) safe_create_leading_directories takes an editable string, but logfile is now a const string. We could use s_c_l_d_const() but that one will make a copy of the string unncessarily. Will make a note in the commit message though. -- Duy -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v4 02/27] Convert git_snpath() to strbuf_git_path()
On Mon, Mar 3, 2014 at 7:02 AM, Eric Sunshine wrote: > On Sat, Mar 1, 2014 at 7:12 AM, Nguyễn Thái Ngọc Duy > wrote: >> In the previous patch, git_snpath() is modified to allocate a new >> strbuf buffer because vsnpath() needs that. But that makes it awkward >> because git_snpath() receives a pre-allocated buffer from outside and >> has to copy data back. Rename it to strbuf_git_path() and make it >> receive strbuf directly. >> >> The conversion from git_snpath() to git_path() in >> update_refs_for_switch() is safe because that function does not keep >> any pointer to the round-robin buffer pool allocated by >> get_pathname(). >> >> Signed-off-by: Nguyễn Thái Ngọc Duy >> --- >> diff --git a/refs.c b/refs.c >> index 89228e2..434bd5e 100644 >> --- a/refs.c >> +++ b/refs.c >> @@ -2717,17 +2729,19 @@ static int copy_msg(char *buf, const char *msg) >> return cp - buf; >> } >> >> -int log_ref_setup(const char *refname, char *logfile, int bufsize) >> +int log_ref_setup(const char *refname, struct strbuf *sb_logfile) >> { >> int logfd, oflags = O_APPEND | O_WRONLY; >> + const char *logfile; >> >> - git_snpath(logfile, bufsize, "logs/%s", refname); >> + strbuf_git_path(sb_logfile, "logs/%s", refname); >> + logfile = sb_logfile->buf; >> if (log_all_ref_updates && >> (starts_with(refname, "refs/heads/") || >> starts_with(refname, "refs/remotes/") || >> starts_with(refname, "refs/notes/") || >> !strcmp(refname, "HEAD"))) { >> - if (safe_create_leading_directories(logfile) < 0) >> + if (safe_create_leading_directories(sb_logfile->buf) < 0) > > At this point, 'logfile' is still 'sb_logfile->buf', so do you really > need this change? Junio made the same comment last time and I missed it. Will update. -- Duy -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v4 02/27] Convert git_snpath() to strbuf_git_path()
On Sat, Mar 1, 2014 at 7:12 AM, Nguyễn Thái Ngọc Duy wrote: > In the previous patch, git_snpath() is modified to allocate a new > strbuf buffer because vsnpath() needs that. But that makes it awkward > because git_snpath() receives a pre-allocated buffer from outside and > has to copy data back. Rename it to strbuf_git_path() and make it > receive strbuf directly. > > The conversion from git_snpath() to git_path() in > update_refs_for_switch() is safe because that function does not keep > any pointer to the round-robin buffer pool allocated by > get_pathname(). > > Signed-off-by: Nguyễn Thái Ngọc Duy > --- > diff --git a/refs.c b/refs.c > index 89228e2..434bd5e 100644 > --- a/refs.c > +++ b/refs.c > @@ -2717,17 +2729,19 @@ static int copy_msg(char *buf, const char *msg) > return cp - buf; > } > > -int log_ref_setup(const char *refname, char *logfile, int bufsize) > +int log_ref_setup(const char *refname, struct strbuf *sb_logfile) > { > int logfd, oflags = O_APPEND | O_WRONLY; > + const char *logfile; > > - git_snpath(logfile, bufsize, "logs/%s", refname); > + strbuf_git_path(sb_logfile, "logs/%s", refname); > + logfile = sb_logfile->buf; > if (log_all_ref_updates && > (starts_with(refname, "refs/heads/") || > starts_with(refname, "refs/remotes/") || > starts_with(refname, "refs/notes/") || > !strcmp(refname, "HEAD"))) { > - if (safe_create_leading_directories(logfile) < 0) > + if (safe_create_leading_directories(sb_logfile->buf) < 0) At this point, 'logfile' is still 'sb_logfile->buf', so do you really need this change? > return error("unable to create directory for %s", > logfile); > oflags |= O_CREAT; > @@ -2762,20 +2776,22 @@ static int log_ref_write(const char *refname, const > unsigned char *old_sha1, > int logfd, result, written, oflags = O_APPEND | O_WRONLY; > unsigned maxlen, len; > int msglen; > - char log_file[PATH_MAX]; > + struct strbuf sb_log_file = STRBUF_INIT; > + const char *log_file; > char *logrec; > const char *committer; > > if (log_all_ref_updates < 0) > log_all_ref_updates = !is_bare_repository(); > > - result = log_ref_setup(refname, log_file, sizeof(log_file)); > + result = log_ref_setup(refname, &sb_log_file); > if (result) > - return result; > + goto done; > + log_file = sb_log_file.buf; > > logfd = open(log_file, oflags); > if (logfd < 0) > - return 0; > + goto done; > msglen = msg ? strlen(msg) : 0; > committer = git_committer_info(0); > maxlen = strlen(committer) + msglen + 100; > -- > 1.9.0.40.gaa8c3ea -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v4 02/27] Convert git_snpath() to strbuf_git_path()
In the previous patch, git_snpath() is modified to allocate a new strbuf buffer because vsnpath() needs that. But that makes it awkward because git_snpath() receives a pre-allocated buffer from outside and has to copy data back. Rename it to strbuf_git_path() and make it receive strbuf directly. The conversion from git_snpath() to git_path() in update_refs_for_switch() is safe because that function does not keep any pointer to the round-robin buffer pool allocated by get_pathname(). Signed-off-by: Nguyễn Thái Ngọc Duy --- builtin/checkout.c | 22 +- cache.h| 4 ++-- path.c | 11 ++--- refs.c | 66 +++--- refs.h | 2 +- 5 files changed, 58 insertions(+), 47 deletions(-) diff --git a/builtin/checkout.c b/builtin/checkout.c index 5df3837..0570e41 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -585,18 +585,20 @@ static void update_refs_for_switch(const struct checkout_opts *opts, if (opts->new_orphan_branch) { if (opts->new_branch_log && !log_all_ref_updates) { int temp; - char log_file[PATH_MAX]; + struct strbuf log_file = STRBUF_INIT; char *ref_name = mkpath("refs/heads/%s", opts->new_orphan_branch); + int ret; temp = log_all_ref_updates; log_all_ref_updates = 1; - if (log_ref_setup(ref_name, log_file, sizeof(log_file))) { + ret = log_ref_setup(ref_name, &log_file); + log_all_ref_updates = temp; + strbuf_release(&log_file); + if (ret) { fprintf(stderr, _("Can not do reflog for '%s'\n"), opts->new_orphan_branch); - log_all_ref_updates = temp; return; } - log_all_ref_updates = temp; } } else @@ -651,14 +653,10 @@ static void update_refs_for_switch(const struct checkout_opts *opts, new->name); } } - if (old->path && old->name) { - char log_file[PATH_MAX], ref_file[PATH_MAX]; - - git_snpath(log_file, sizeof(log_file), "logs/%s", old->path); - git_snpath(ref_file, sizeof(ref_file), "%s", old->path); - if (!file_exists(ref_file) && file_exists(log_file)) - remove_path(log_file); - } + if (old->path && old->name && + !file_exists(git_path("%s", old->path)) && +file_exists(git_path("logs/%s", old->path))) + remove_path(git_path("logs/%s", old->path)); } remove_branch_state(); strbuf_release(&msg); diff --git a/cache.h b/cache.h index dc040fb..8d3697e 100644 --- a/cache.h +++ b/cache.h @@ -646,8 +646,8 @@ extern int check_repository_format(void); extern char *mksnpath(char *buf, size_t n, const char *fmt, ...) __attribute__((format (printf, 3, 4))); -extern char *git_snpath(char *buf, size_t n, const char *fmt, ...) - __attribute__((format (printf, 3, 4))); +extern void strbuf_git_path(struct strbuf *sb, const char *fmt, ...) + __attribute__((format (printf, 2, 3))); extern char *git_pathdup(const char *fmt, ...) __attribute__((format (printf, 1, 2))); extern char *mkpathdup(const char *fmt, ...) diff --git a/path.c b/path.c index 5346700..b52a16f 100644 --- a/path.c +++ b/path.c @@ -70,19 +70,12 @@ static void vsnpath(struct strbuf *buf, const char *fmt, va_list args) strbuf_cleanup_path(buf); } -char *git_snpath(char *buf, size_t n, const char *fmt, ...) +void strbuf_git_path(struct strbuf *sb, const char *fmt, ...) { - struct strbuf sb = STRBUF_INIT; va_list args; va_start(args, fmt); - vsnpath(&sb, fmt, args); + vsnpath(sb, fmt, args); va_end(args); - if (sb.len >= n) - strlcpy(buf, bad_path, n); - else - memcpy(buf, sb.buf, sb.len + 1); - strbuf_release(&sb); - return buf; } char *git_pathdup(const char *fmt, ...) diff --git a/refs.c b/refs.c index 89228e2..434bd5e 100644 --- a/refs.c +++ b/refs.c @@ -1325,10 +1325,12 @@ static const char *handle_missing_loose_ref(const char *refname, const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int reading, int *flag) { + struct strbuf sb_path = STRBUF_INIT;