2014-03-01 15:18 GMT+08:00 Faiz Kothari <faiz.off93@xxxxxxxxx>: > Hi, > Yup, at that position. > I don't know, but it failed a few tests on my machine related to bitmap. > Another thing to use would be strbuf_splice() Eric Sunshine<sunshine@xxxxxxxxxxxxxx> has came up with a more elegant way to finish this task. That's using strbuf_setlen() instead of strbuf_remove(). Because of the unstable network of this afternoon. The former email is sent without the above information. Sorry about it. I find out that you didn't attach strbuf_remove() in your finish_bulk_checkin(). That may cause problems not only related to bitmap, because the input packname is different from the output packname.. Cheers, He Sun > Anyways, no worries :) > > Cheers, > Faiz > > On Sat, Mar 1, 2014 at 12:40 PM, He Sun <sunheehnus@xxxxxxxxx> wrote: >> 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. >> There is a more elegant way to finish this task.[According to ] >> >> >>> + 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 >>> -- 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