Merge branch 'np/pack'
authorJunio C Hamano <gitster@pobox.com>
Sun, 4 Nov 2007 08:11:17 +0000 (01:11 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sun, 4 Nov 2007 08:11:17 +0000 (01:11 -0700)
* np/pack:
pack-objects: get rid of an ugly cast
make the pack index version configurable

Conflicts:

builtin-pack-objects.c

1  2 
builtin-pack-objects.c
index-pack.c
diff --combined builtin-pack-objects.c
index 25ec65d0f0e89f795329feae2a3eac04ca96a976,d0ca165c9b683863244dc6d7d71aec4bfad14227..545ece5da75672f435d018ccb534bc8c342bbf3d
@@@ -57,7 -57,7 +57,7 @@@ struct object_entry 
   * nice "minimum seek" order.
   */
  static struct object_entry *objects;
- static struct object_entry **written_list;
+ static struct pack_idx_entry **written_list;
  static uint32_t nr_objects, nr_alloc, nr_result, nr_written;
  
  static int non_empty;
@@@ -65,6 -65,8 +65,6 @@@ static int no_reuse_delta, no_reuse_obj
  static int local;
  static int incremental;
  static int allow_ofs_delta;
 -static const char *pack_tmp_name, *idx_tmp_name;
 -static char tmpname[PATH_MAX];
  static const char *base_name;
  static int progress = 1;
  static int window = 10;
@@@ -73,7 -75,7 +73,7 @@@ static int depth = 50
  static int delta_search_threads = 1;
  static int pack_to_stdout;
  static int num_preferred_base;
 -static struct progress progress_state;
 +static struct progress *progress_state;
  static int pack_compression_level = Z_DEFAULT_COMPRESSION;
  static int pack_compression_seen;
  
@@@ -577,7 -579,7 +577,7 @@@ static off_t write_one(struct sha1file 
                e->idx.offset = 0;
                return 0;
        }
-       written_list[nr_written++] = e;
+       written_list[nr_written++] = &e->idx;
  
        /* make sure off_t is sufficiently large not to wrap */
        if (offset > offset + size)
        return offset + size;
  }
  
 -static int open_object_dir_tmp(const char *path)
 -{
 -    snprintf(tmpname, sizeof(tmpname), "%s/%s", get_object_directory(), path);
 -    return xmkstemp(tmpname);
 -}
 -
  /* forward declaration for write_pack_file */
  static int adjust_perm(const char *path, mode_t mode);
  
@@@ -598,21 -606,16 +598,21 @@@ static void write_pack_file(void
        uint32_t nr_remaining = nr_result;
  
        if (do_progress)
 -              start_progress(&progress_state, "Writing %u objects...", "", nr_result);
 +              progress_state = start_progress("Writing objects", nr_result);
-       written_list = xmalloc(nr_objects * sizeof(struct object_entry *));
+       written_list = xmalloc(nr_objects * sizeof(*written_list));
  
        do {
                unsigned char sha1[20];
 +              char *pack_tmp_name = NULL;
  
                if (pack_to_stdout) {
 -                      f = sha1fd(1, "<stdout>");
 +                      f = sha1fd_throughput(1, "<stdout>", progress_state);
                } else {
 -                      int fd = open_object_dir_tmp("tmp_pack_XXXXXX");
 +                      char tmpname[PATH_MAX];
 +                      int fd;
 +                      snprintf(tmpname, sizeof(tmpname),
 +                               "%s/tmp_pack_XXXXXX", get_object_directory());
 +                      fd = xmkstemp(tmpname);
                        pack_tmp_name = xstrdup(tmpname);
                        f = sha1fd(fd, pack_tmp_name);
                }
                        if (!offset_one)
                                break;
                        offset = offset_one;
 -                      if (do_progress)
 -                              display_progress(&progress_state, written);
 +                      display_progress(progress_state, written);
                }
  
                /*
                if (pack_to_stdout || nr_written == nr_remaining) {
                        sha1close(f, sha1, 1);
                } else {
 -                      sha1close(f, sha1, 0);
 -                      fixup_pack_header_footer(f->fd, sha1, pack_tmp_name, nr_written);
 -                      close(f->fd);
 +                      int fd = sha1close(f, NULL, 0);
 +                      fixup_pack_header_footer(fd, sha1, pack_tmp_name, nr_written);
 +                      close(fd);
                }
  
                if (!pack_to_stdout) {
                        mode_t mode = umask(0);
 +                      char *idx_tmp_name, tmpname[PATH_MAX];
  
                        umask(mode);
                        mode = 0444 & ~mode;
  
-                       idx_tmp_name = write_idx_file(NULL,
-                                       (struct pack_idx_entry **) written_list,
-                                       nr_written, sha1);
+                       idx_tmp_name = write_idx_file(NULL, written_list,
+                                                     nr_written, sha1);
                        snprintf(tmpname, sizeof(tmpname), "%s-%s.pack",
                                 base_name, sha1_to_hex(sha1));
                        if (adjust_perm(pack_tmp_name, mode))
                        if (rename(idx_tmp_name, tmpname))
                                die("unable to rename temporary index file: %s",
                                    strerror(errno));
 +                      free(idx_tmp_name);
 +                      free(pack_tmp_name);
                        puts(sha1_to_hex(sha1));
                }
  
                /* mark written objects as written to previous pack */
                for (j = 0; j < nr_written; j++) {
-                       written_list[j]->idx.offset = (off_t)-1;
+                       written_list[j]->offset = (off_t)-1;
                }
                nr_remaining -= nr_written;
        } while (nr_remaining && i < nr_objects);
  
        free(written_list);
 -      if (do_progress)
 -              stop_progress(&progress_state);
 +      stop_progress(&progress_state);
        if (written != nr_result)
                die("wrote %u objects while expecting %u", written, nr_result);
        /*
@@@ -851,7 -852,8 +850,7 @@@ static int add_object_entry(const unsig
        else
                object_ix[-1 - ix] = nr_objects;
  
 -      if (progress)
 -              display_progress(&progress_state, nr_objects);
 +      display_progress(progress_state, nr_objects);
  
        if (name && no_try_delta(name))
                entry->no_try_delta = 1;
@@@ -1514,7 -1516,8 +1513,7 @@@ static void find_deltas(struct object_e
  
                progress_lock();
                (*processed)++;
 -              if (progress)
 -                      display_progress(&progress_state, *processed);
 +              display_progress(progress_state, *processed);
                progress_unlock();
  
                /*
@@@ -1711,14 -1714,16 +1710,14 @@@ static void prepare_pack(int window, in
                delta_list[n++] = entry;
        }
  
 -      if (nr_deltas) {
 +      if (nr_deltas && n > 1) {
                unsigned nr_done = 0;
                if (progress)
 -                      start_progress(&progress_state,
 -                                     "Deltifying %u objects...", "",
 -                                     nr_deltas);
 +                      progress_state = start_progress("Compressing objects",
 +                                                      nr_deltas);
                qsort(delta_list, n, sizeof(*delta_list), type_size_sort);
                ll_find_deltas(delta_list, n, window+1, depth, &nr_done);
 -              if (progress)
 -                      stop_progress(&progress_state);
 +              stop_progress(&progress_state);
                if (nr_done != nr_deltas)
                        die("inconsistency with delta count");
        }
@@@ -1768,6 -1773,12 +1767,12 @@@ static int git_pack_config(const char *
  #endif
                return 0;
        }
+       if (!strcmp(k, "pack.indexversion")) {
+               pack_idx_default_version = git_config_int(k, v);
+               if (pack_idx_default_version > 2)
+                       die("bad pack.indexversion=%d", pack_idx_default_version);
+               return 0;
+       }
        return git_default_config(k, v);
  }
  
@@@ -2130,17 -2141,23 +2135,17 @@@ int cmd_pack_objects(int argc, const ch
        prepare_packed_git();
  
        if (progress)
 -              start_progress(&progress_state, "Generating pack...",
 -                             "Counting objects: ", 0);
 +              progress_state = start_progress("Counting objects", 0);
        if (!use_internal_rev_list)
                read_object_list_from_stdin();
        else {
                rp_av[rp_ac] = NULL;
                get_object_list(rp_ac, rp_av);
        }
 -      if (progress) {
 -              stop_progress(&progress_state);
 -              fprintf(stderr, "Done counting %u objects.\n", nr_objects);
 -      }
 +      stop_progress(&progress_state);
  
        if (non_empty && !nr_result)
                return 0;
 -      if (progress && (nr_objects != nr_result))
 -              fprintf(stderr, "Result has %u objects.\n", nr_result);
        if (nr_result)
                prepare_pack(window, depth);
        write_pack_file();
diff --combined index-pack.c
index 61ea7621bef3d653b3b88ba89801305b95a8d1a7,c0bb78a8ed360312fbba7a75c559aa13e224ccd5..715a5bb7a6e42694b3e35de703e44e792a5442fe
@@@ -46,7 -46,7 +46,7 @@@ static int nr_resolved_deltas
  static int from_stdin;
  static int verbose;
  
 -static struct progress progress;
 +static struct progress *progress;
  
  /* We always read in 4kB chunks. */
  static unsigned char input_buffer[4096];
@@@ -87,8 -87,6 +87,8 @@@ static void *fill(int min
                                die("early EOF");
                        die("read error on input: %s", strerror(errno));
                }
 +              if (from_stdin)
 +                      display_throughput(progress, ret);
                input_len += ret;
        } while (input_len < min);
        return input_buffer;
@@@ -108,7 -106,7 +108,7 @@@ static void use(int bytes
        consumed_bytes += bytes;
  }
  
 -static const char *open_pack_file(const char *pack_name)
 +static char *open_pack_file(char *pack_name)
  {
        if (from_stdin) {
                input_fd = 0;
@@@ -408,9 -406,7 +408,9 @@@ static void parse_pack_objects(unsigne
         * - remember base (SHA1 or offset) for all deltas.
         */
        if (verbose)
 -              start_progress(&progress, "Indexing %u objects...", "", nr_objects);
 +              progress = start_progress(
 +                              from_stdin ? "Receiving objects" : "Indexing objects",
 +                              nr_objects);
        for (i = 0; i < nr_objects; i++) {
                struct object_entry *obj = &objects[i];
                data = unpack_raw_entry(obj, &delta->base);
                } else
                        sha1_object(data, obj->size, obj->type, obj->idx.sha1);
                free(data);
 -              if (verbose)
 -                      display_progress(&progress, i+1);
 +              display_progress(progress, i+1);
        }
        objects[i].idx.offset = consumed_bytes;
 -      if (verbose)
 -              stop_progress(&progress);
 +      stop_progress(&progress);
  
        /* Check pack integrity */
        flush();
         *   for some more deltas.
         */
        if (verbose)
 -              start_progress(&progress, "Resolving %u deltas...", "", nr_deltas);
 +              progress = start_progress("Resolving deltas", nr_deltas);
        for (i = 0; i < nr_objects; i++) {
                struct object_entry *obj = &objects[i];
                union delta_base base;
                                                      obj->size, obj->type);
                        }
                free(data);
 -              if (verbose)
 -                      display_progress(&progress, nr_resolved_deltas);
 +              display_progress(progress, nr_resolved_deltas);
        }
  }
  
@@@ -595,7 -594,8 +595,7 @@@ static void fix_unresolved_deltas(int n
                        die("local object %s is corrupt", sha1_to_hex(d->base.sha1));
                append_obj_to_pack(d->base.sha1, data, size, type);
                free(data);
 -              if (verbose)
 -                      display_progress(&progress, nr_resolved_deltas);
 +              display_progress(progress, nr_resolved_deltas);
        }
        free(sorted_by_pos);
  }
@@@ -683,18 -683,31 +683,31 @@@ static void final(const char *final_pac
        }
  }
  
+ static int git_index_pack_config(const char *k, const char *v)
+ {
+       if (!strcmp(k, "pack.indexversion")) {
+               pack_idx_default_version = git_config_int(k, v);
+               if (pack_idx_default_version > 2)
+                       die("bad pack.indexversion=%d", pack_idx_default_version);
+               return 0;
+       }
+       return git_default_config(k, v);
+ }
  int main(int argc, char **argv)
  {
        int i, fix_thin_pack = 0;
 -      const char *curr_pack, *pack_name = NULL;
 -      const char *curr_index, *index_name = NULL;
 +      char *curr_pack, *pack_name = NULL;
 +      char *curr_index, *index_name = NULL;
        const char *keep_name = NULL, *keep_msg = NULL;
        char *index_name_buf = NULL, *keep_name_buf = NULL;
        struct pack_idx_entry **idx_objects;
        unsigned char sha1[20];
  
+       git_config(git_index_pack_config);
        for (i = 1; i < argc; i++) {
 -              const char *arg = argv[i];
 +              char *arg = argv[i];
  
                if (*arg == '-') {
                        if (!strcmp(arg, "--stdin")) {
        deltas = xmalloc(nr_objects * sizeof(struct delta_entry));
        parse_pack_objects(sha1);
        if (nr_deltas == nr_resolved_deltas) {
 -              if (verbose)
 -                      stop_progress(&progress);
 +              stop_progress(&progress);
                /* Flush remaining pack final 20-byte SHA1. */
                flush();
        } else {
                                           (nr_objects + nr_unresolved + 1)
                                           * sizeof(*objects));
                        fix_unresolved_deltas(nr_unresolved);
 -                      if (verbose) {
 -                              stop_progress(&progress);
 +                      stop_progress(&progress);
 +                      if (verbose)
                                fprintf(stderr, "%d objects were added to complete this thin pack.\n",
                                        nr_objects - nr_objects_initial);
 -                      }
                        fixup_pack_header_footer(output_fd, sha1,
                                curr_pack, nr_objects);
                }
        free(objects);
        free(index_name_buf);
        free(keep_name_buf);
 +      if (pack_name == NULL)
 +              free(curr_pack);
 +      if (index_name == NULL)
 +              free(curr_index);
  
        return 0;
  }