Merge branch 'jk/pack-bitmap-progress'
authorJunio C Hamano <gitster@pobox.com>
Fri, 28 Mar 2014 20:50:56 +0000 (13:50 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 28 Mar 2014 20:50:56 +0000 (13:50 -0700)
The progress output while repacking and transferring objects showed
an apparent large silence while writing the objects out of existing
packfiles, when the reachability bitmap was in use.

* jk/pack-bitmap-progress:
pack-objects: show reused packfile objects in "Counting objects"
pack-objects: show progress for reused packfiles

1  2 
builtin/pack-objects.c
diff --combined builtin/pack-objects.c
index e3150d7d4edef2c725bb0f6e8e480c0207b33a38,021ec7ad794f6f2537bd6f02a029f771a3d3b7fd..7950c4342f81544f719b20add2e1233be36fc718
@@@ -708,7 -708,7 +708,7 @@@ static struct object_entry **compute_wr
  static off_t write_reused_pack(struct sha1file *f)
  {
        unsigned char buffer[8192];
-       off_t to_write;
+       off_t to_write, total;
        int fd;
  
        if (!is_pack_valid(reuse_packfile))
        if (reuse_packfile_offset < 0)
                reuse_packfile_offset = reuse_packfile->pack_size - 20;
  
-       to_write = reuse_packfile_offset - sizeof(struct pack_header);
+       total = to_write = reuse_packfile_offset - sizeof(struct pack_header);
  
        while (to_write) {
                int read_pack = xread(fd, buffer, sizeof(buffer));
  
                sha1write(f, buffer, read_pack);
                to_write -= read_pack;
+               /*
+                * We don't know the actual number of objects written,
+                * only how many bytes written, how many bytes total, and
+                * how many objects total. So we can fake it by pretending all
+                * objects we are writing are the same size. This gives us a
+                * smooth progress meter, and at the end it matches the true
+                * answer.
+                */
+               written = reuse_packfile_objects *
+                               (((double)(total - to_write)) / total);
+               display_progress(progress_state, written);
        }
  
        close(fd);
-       written += reuse_packfile_objects;
+       written = reuse_packfile_objects;
+       display_progress(progress_state, written);
        return reuse_packfile_offset - sizeof(struct pack_header);
  }
  
@@@ -803,7 -816,7 +816,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
                                                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);
  
                        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);
  
                                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));
                }
@@@ -995,10 -1011,6 +1008,10 @@@ static void create_object_entry(const u
        entry->no_try_delta = no_try_delta;
  }
  
 +static const char no_closure_warning[] = N_(
 +"disabling bitmap writing, as some objects are not being packed"
 +);
 +
  static int add_object_entry(const unsigned char *sha1, enum object_type type,
                            const char *name, int exclude)
  {
        if (have_duplicate_entry(sha1, exclude, &index_pos))
                return 0;
  
 -      if (!want_object_in_pack(sha1, exclude, &found_pack, &found_offset))
 +      if (!want_object_in_pack(sha1, exclude, &found_pack, &found_offset)) {
 +              /* The pack is missing an object, so it will not have closure */
 +              if (write_bitmap_index) {
 +                      warning(_(no_closure_warning));
 +                      write_bitmap_index = 0;
 +              }
                return 0;
 +      }
  
        create_object_entry(sha1, type, pack_name_hash(name),
                            exclude, name && no_try_delta(name),
                            index_pos, found_pack, found_offset);
  
-       display_progress(progress_state, to_pack.nr_objects);
+       display_progress(progress_state, nr_result);
        return 1;
  }
  
@@@ -1038,7 -1044,7 +1051,7 @@@ static int add_object_entry_from_bitmap
  
        create_object_entry(sha1, type, name_hash, 0, 0, index_pos, pack, offset);
  
-       display_progress(progress_state, to_pack.nr_objects);
+       display_progress(progress_state, nr_result);
        return 1;
  }
  
@@@ -1220,9 -1226,12 +1233,9 @@@ static int check_pbase_path(unsigned ha
        if (0 <= pos)
                return 1;
        pos = -pos - 1;
 -      if (done_pbase_paths_alloc <= done_pbase_paths_num) {
 -              done_pbase_paths_alloc = alloc_nr(done_pbase_paths_alloc);
 -              done_pbase_paths = xrealloc(done_pbase_paths,
 -                                          done_pbase_paths_alloc *
 -                                          sizeof(unsigned));
 -      }
 +      ALLOC_GROW(done_pbase_paths,
 +                 done_pbase_paths_num + 1,
 +                 done_pbase_paths_alloc);
        done_pbase_paths_num++;
        if (pos < done_pbase_paths_num)
                memmove(done_pbase_paths + pos + 1,
@@@ -2437,12 -2446,7 +2450,7 @@@ static int get_object_list_from_bitmap(
                        &reuse_packfile_offset)) {
                assert(reuse_packfile_objects);
                nr_result += reuse_packfile_objects;
-               if (progress) {
-                       fprintf(stderr, "Reusing existing pack: %d, done.\n",
-                               reuse_packfile_objects);
-                       fflush(stderr);
-               }
+               display_progress(progress_state, nr_result);
        }
  
        traverse_bitmap_commit_list(&add_object_entry_from_bitmap);
@@@ -2459,9 -2463,6 +2467,9 @@@ static void get_object_list(int ac, con
        save_commit_buffer = 0;
        setup_revisions(ac, av, &revs, NULL);
  
 +      /* make sure shallows are read */
 +      is_repository_shallow();
 +
        while (fgets(line, sizeof(line), stdin) != NULL) {
                int len = strlen(line);
                if (len && line[len - 1] == '\n')
                                write_bitmap_index = 0;
                                continue;
                        }
 +                      if (starts_with(line, "--shallow ")) {
 +                              unsigned char sha1[20];
 +                              if (get_sha1_hex(line + 10, sha1))
 +                                      die("not an SHA-1 '%s'", line + 10);
 +                              register_shallow(sha1);
 +                              continue;
 +                      }
                        die("not a rev '%s'", line);
                }
                if (handle_revision_arg(line, &revs, flags, REVARG_CANNOT_BE_FILENAME))