2014-03-01 14:46 GMT+08:00 Faiz Kothari <faiz.off93@xxxxxxxxx>: > From: Faiz Kotahri <faiz.off93@xxxxxxxxx> > > Signed-off-by: Faiz Kothari <faiz.off93@xxxxxxxxx> > --- > Sticking with implementation involving changing the prototype for > pack-write.c:finish_tmp_packfile() > Fixing a small bug in Sun He's implementation which caused a fail in some tests. > > builtin/pack-objects.c | 25 ++++++++++++------------- > bulk-checkin.c | 9 ++++++--- > pack-write.c | 19 ++++++++++--------- > pack.h | 3 ++- > 4 files changed, 30 insertions(+), 26 deletions(-) > > diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c > index c733379..4b59bba 100644 > --- a/builtin/pack-objects.c > +++ b/builtin/pack-objects.c > @@ -20,6 +20,7 @@ > #include "streaming.h" > #include "thread-utils.h" > #include "pack-bitmap.h" > +#include "strbuf.h" > > static const char *pack_usage[] = { > N_("git pack-objects --stdout [options...] [< ref-list | < object-list]"), > @@ -803,8 +804,8 @@ static void write_pack_file(void) > > if (!pack_to_stdout) { > struct stat st; > - char tmpname[PATH_MAX]; > - > + struct strbuf tmpname = STRBUF_INIT; > + int ini_length; > /* > * Packs are runtime accessed in their mtime > * order since newer packs are more likely to contain > @@ -823,26 +824,24 @@ 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)); > } > > - /* 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); > + ini_length = tmpname.len; > > 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_remove(&tmpname, ini_length, tmpname.len - ini_length); Is this the position where you think may import bugs? I think it should be the duty of finish_tmp_packfile to ensure that the tmpname is the same as it is input as a param. And in my original code, I have used strbuf_remove() at the end of finish_tmp_packfile. Eric Sunshine <sunshine@xxxxxxxxxxxxxx> came up with a more elegant way to finish this task. That's using strbuf_setlen() instead of strbuf_remove(). > + strbuf_addf(&tmpname, "%s.bitmap", sha1_to_hex(sha1)); > > stop_progress(&progress_state); > > @@ -851,10 +850,10 @@ static void write_pack_file(void) > bitmap_writer_select_commits(indexed_commits, indexed_commits_nr, -1); > bitmap_writer_build(&to_pack); > bitmap_writer_finish(written_list, nr_written, > - tmpname, write_bitmap_options); > + tmpname.buf, write_bitmap_options); > write_bitmap_index = 0; > } > - > + strbuf_release(&tmpname); > free(pack_tmp_name); > puts(sha1_to_hex(sha1)); > } > diff --git a/bulk-checkin.c b/bulk-checkin.c > index 118c625..248454c 100644 > --- a/bulk-checkin.c > +++ b/bulk-checkin.c > @@ -4,6 +4,7 @@ > #include "bulk-checkin.h" > #include "csum-file.h" > #include "pack.h" > +#include "strbuf.h" > > static int pack_compression_level = Z_DEFAULT_COMPRESSION; > > @@ -23,7 +24,7 @@ static struct bulk_checkin_state { > static void finish_bulk_checkin(struct bulk_checkin_state *state) > { > unsigned char sha1[20]; > - char packname[PATH_MAX]; > + struct strbuf packname = STRBUF_INIT; > int i; > > if (!state->f) > @@ -43,16 +44,18 @@ static void finish_bulk_checkin(struct bulk_checkin_state *state) > close(fd); > } > > - sprintf(packname, "%s/pack/pack-", get_object_directory()); > - finish_tmp_packfile(packname, state->pack_tmp_name, > + strbuf_addf(&packname, "%s/pack/pack-", get_object_directory()); > + finish_tmp_packfile(&packname, state->pack_tmp_name, > state->written, state->nr_written, > &state->pack_idx_opts, sha1); > + > for (i = 0; i < state->nr_written; i++) > free(state->written[i]); > > clear_exit: > free(state->written); > memset(state, 0, sizeof(*state)); > + strbuf_release(&packname); > > /* Make objects we just wrote available to ourselves */ > reprepare_packed_git(); > diff --git a/pack-write.c b/pack-write.c > index 9b8308b..60f5734 100644 > --- a/pack-write.c > +++ b/pack-write.c > @@ -1,6 +1,7 @@ > #include "cache.h" > #include "pack.h" > #include "csum-file.h" > +#include "strbuf.h" > > void reset_pack_idx_option(struct pack_idx_option *opts) > { > @@ -336,7 +337,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 +345,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 ini_length = name_buffer->len; > > if (adjust_shared_perm(pack_tmp_name)) > die_errno("unable to make temporary pack file readable"); > @@ -354,17 +355,17 @@ void finish_tmp_packfile(char *name_buffer, > if (adjust_shared_perm(idx_tmp_name)) > die_errno("unable to make temporary index file readable"); > > - 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)) > + strbuf_remove(name_buffer, ini_length, name_buffer->len - ini_length); > + 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'; > - > free((void *)idx_tmp_name); > } > diff --git a/pack.h b/pack.h > index 12d9516..0afe8d1 100644 > --- a/pack.h > +++ b/pack.h > @@ -3,6 +3,7 @@ > > #include "object.h" > #include "csum-file.h" > +#include "strbuf.h" > > /* > * Packed object header > @@ -91,6 +92,6 @@ extern int encode_in_pack_object_header(enum object_type, uintmax_t, unsigned ch > extern int read_pack_header(int fd, struct pack_header *); > > extern struct sha1file *create_tmp_packfile(char **pack_tmp_name); > -extern void finish_tmp_packfile(char *name_buffer, const char *pack_tmp_name, struct pack_idx_entry **written_list, uint32_t nr_written, struct pack_idx_option *pack_idx_opts, unsigned char sha1[]); > +extern void finish_tmp_packfile(struct strbuf *name_buffer, const char *pack_tmp_name, struct pack_idx_entry **written_list, uint32_t nr_written, struct pack_idx_option *pack_idx_opts, unsigned char sha1[]); > > #endif > -- > 1.7.9.5 > Cheers, He Sun -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html