Re: [PATCH] Rewrite bulk-checkin.c:finish_bulk_checkin() to use a strbuf for handling packname
From: 孙赫 <hidden>
Date: 2016-06-15 23:00:06
2014-02-28 21:12 GMT+08:00 Eric Sunshine [via git] [off-list ref]:
On Fri, Feb 28, 2014 at 4:46 AM, Eric Sunshine <[hidden email]> wrote:quoted
On Fri, Feb 28, 2014 at 3:28 AM, Sun He <[hidden email]> wrote:quoted
Signed-off-by: Sun He <[hidden email]> ---Nicely done. Due to the necessary changes to finish_tmp_packfile(), the focus of this patch has changed slightly from that suggested by the microproject. It's really now about finish_tmp_packfile() rather than finish_bulk_checkin(). As such, it may make sense to adjust the patch subject to reflect this. For instance: Subject: finish_tmp_packfile(): use strbuf for pathname constructionYou may also want your commit message to explain why you chose this approach over other legitimate approaches. For instance, your change places extra burden on callers of finish_tmp_packfile() by leaking a detail of its implementation: namely that it wants to manipulate pathnames easily (via strbuf). An equally valid and more encapsulated approach would be for finish_tmp_packfile() to accept a 'const char *' and construct its own strbuf internally. If the extra strbuf creation in the alternate approach is measurably slower, then you could use that fact to justify your implementation choice in the commit message. On the other hand, if it's not measurably slower, then perhaps the more encapsulated approach with cleaner API might be preferable.
Thank you for your explaination. I get the point. And I think if it is proved that the strbuf way is measurably slower. We should add a check for the length of string before we sprintf().
quoted
More comments below. ]> diff --git a/builtin/pack-objects.c b/builtin/pack-objects.cquoted
index c733379..72fb82b 100644--- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c@@ -803,7 +803,7 @@ static void write_pack_file(void) if (!pack_to_stdout) { struct stat st; - char tmpname[PATH_MAX]; + struct strbuf tmpname = STRBUF_INIT; /* * Packs are runtime accessed in their mtime@@ -823,26 +823,22 @@ static void write_pack_file(void) utb.modtime = --last_mtime; if (utime(pack_tmp_name, &utb) < 0) warning("failed utime() on %s:%s", - tmpname, strerror(errno)); + pack_tmp_name, strerror(errno));Good catch finding this bug (as your commentary below states). Ideally, each conceptual change should be presented distinctly from others, so this bug should have its own patch (even though it's just a one-liner).quoted
} - /* Enough space for "-<sha-1>.pack"? */ - if (sizeof(tmpname) <= strlen(base_name) + 50) - die("pack base name '%s' too long", base_name); - snprintf(tmpname, sizeof(tmpname), "%s-", base_name); + strbuf_addf(&tmpname, "%s-", base_name); if (write_bitmap_index) { bitmap_writer_set_checksum(sha1); bitmap_writer_build_type_index(written_list, nr_written); } - finish_tmp_packfile(tmpname, pack_tmp_name, + finish_tmp_packfile(&tmpname, pack_tmp_name, written_list, nr_written, &pack_idx_opts, sha1); if (write_bitmap_index) { - char *end_of_name_prefix = strrchr(tmpname, 0); - sprintf(end_of_name_prefix, "%s.bitmap", sha1_to_hex(sha1)); + strbuf_addf(&tmpname, "%s.bitmap" ,sha1_to_hex(sha1)); stop_progress(&progress_state);diff --git a/pack-write.c b/pack-write.c index 9b8308b..2204aa9 100644 --- a/pack-write.c +++ b/pack-write.c@@ -336,7 +336,7 @@ struct sha1file *create_tmp_packfile(char**pack_tmp_name) return sha1fd(fd, *pack_tmp_name); } -void finish_tmp_packfile(char *name_buffer, +void finish_tmp_packfile(struct strbuf *name_buffer, const char *pack_tmp_name, struct pack_idx_entry **written_list, uint32_t nr_written,@@ -344,7 +344,7 @@ void finish_tmp_packfile(char *name_buffer, unsigned char sha1[]) { const char *idx_tmp_name; - char *end_of_name_prefix = strrchr(name_buffer, 0); + int pre_len = name_buffer->len;Minor: Perhaps basename_len (or some such) would convey a bit more meaning than pre_len.quoted
if (adjust_shared_perm(pack_tmp_name)) die_errno("unable to make temporary pack file readable");@@ -354,17 +354,21 @@ void finish_tmp_packfile(char *name_buffer, if (adjust_shared_perm(idx_tmp_name)) die_errno("unable to make temporary index filereadable"); - sprintf(end_of_name_prefix, "%s.pack", sha1_to_hex(sha1)); - free_pack_by_name(name_buffer); + strbuf_addf(name_buffer, "%s.pack", sha1_to_hex(sha1)); + free_pack_by_name(name_buffer->buf); - if (rename(pack_tmp_name, name_buffer)) + if (rename(pack_tmp_name, name_buffer->buf)) die_errno("unable to rename temporary pack file"); - sprintf(end_of_name_prefix, "%s.idx", sha1_to_hex(sha1)); - if (rename(idx_tmp_name, name_buffer)) + /* remove added suffix string(sha1.pack) */ + strbuf_remove(name_buffer, pre_len, name_buffer->len - pre_len);Since you are merely truncating the buffer back to pre_len, perhaps strbuf_setlen(name_buffer, pre_len) would be more idiomatic and easier to read (and would allow you to drop the comment).quoted
+ + strbuf_addf(name_buffer, "%s.idx", sha1_to_hex(sha1)); + if (rename(idx_tmp_name, name_buffer->buf)) die_errno("unable to rename temporary index file"); - *end_of_name_prefix = '\0'; + /* remove added suffix string(sha1.idx) */ + strbuf_remove(name_buffer, pre_len, name_buffer->len - pre_len);Ditto.quoted
free((void *)idx_tmp_name); } -- 1.9.0.138.g2de3478.dirty Hello, This is my patch for the GSoC microproject #2 I follow the suggestion of Junio to use the strbuf_addf to deal with this thing. And the usage of strbuf_addf needs to change the function finish_tmp_packfile, I search all over the source code ($ find .| xargs grep "finish_tmp_packfile") The following files contains finish_tmp_packfile: bulk-checkin.c builtin/pack-object.c pack-write.c pack.h And I do some change to fix them. I changed my vimrc so that tabs will not be changed into spaces automatically. And I came across a bug when I was doing my microproject. position: builtin/pack-objects.c: write_pack_file: if(!pack_to_stdout): first else in it warning() function used an uninitialized array, and I changed it to pack_tmp_name. Thank you all for all your suggestions.This section explaining your changes is important for the ongoing email discussion, however, it is customary (and "git am"-friendly) to place these notes just below the "---" line following your signoff near the top of the email.-- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to [hidden email] More majordomo info at http://vger.kernel.org/majordomo-info.html ________________________________ If you reply to this email, your message will be added to the discussion below: http://git.661346.n2.nabble.com/PATCH-Rewrite-bulk-checkin-c-finish-bulk-checkin-to-use-a-strbuf-for-handling-packname-tp7604449p7604500.html To start a new topic under git, email ml-node+s661346n661346h27@n2.nabble.com To unsubscribe from git, click here. NAML
Cheers, He Sun