Merge branch 'jk/name-pack-after-byte-representation'

Two packfiles that contain the same set of objects have
traditionally been named identically, but that made repacking a
repository that is already fully packed without any cruft with a
different packing parameter cumbersome. Update the convention to
name the packfile after the bytestream representation of the data,
not after the set of objects in it.

* jk/name-pack-after-byte-representation:
  pack-objects doc: treat output filename as opaque
  pack-objects: name pack files after trailer hash
  sha1write: make buffer const-correct
This commit is contained in:
Junio C Hamano 2013-12-27 14:58:19 -08:00
commit 53b2a5ff30
6 changed files with 9 additions and 16 deletions

View File

@ -51,8 +51,7 @@ base-name::
<base-name> to determine the name of the created file. <base-name> to determine the name of the created file.
When this option is used, the two files are written in When this option is used, the two files are written in
<base-name>-<SHA-1>.{pack,idx} files. <SHA-1> is a hash <base-name>-<SHA-1>.{pack,idx} files. <SHA-1> is a hash
of the sorted object names to make the resulting filename based on the pack content and is written to the standard
based on the pack content, and written to the standard
output of the command. output of the command.
--stdout:: --stdout::

View File

@ -11,7 +11,7 @@
#include "progress.h" #include "progress.h"
#include "csum-file.h" #include "csum-file.h"
static void flush(struct sha1file *f, void *buf, unsigned int count) static void flush(struct sha1file *f, const void *buf, unsigned int count)
{ {
if (0 <= f->check_fd && count) { if (0 <= f->check_fd && count) {
unsigned char check_buffer[8192]; unsigned char check_buffer[8192];
@ -86,13 +86,13 @@ int sha1close(struct sha1file *f, unsigned char *result, unsigned int flags)
return fd; return fd;
} }
int sha1write(struct sha1file *f, void *buf, unsigned int count) int sha1write(struct sha1file *f, const void *buf, unsigned int count)
{ {
while (count) { while (count) {
unsigned offset = f->offset; unsigned offset = f->offset;
unsigned left = sizeof(f->buffer) - offset; unsigned left = sizeof(f->buffer) - offset;
unsigned nr = count > left ? left : count; unsigned nr = count > left ? left : count;
void *data; const void *data;
if (f->do_crc) if (f->do_crc)
f->crc32 = crc32(f->crc32, buf, nr); f->crc32 = crc32(f->crc32, buf, nr);

View File

@ -34,7 +34,7 @@ extern struct sha1file *sha1fd(int fd, const char *name);
extern struct sha1file *sha1fd_check(const char *name); extern struct sha1file *sha1fd_check(const char *name);
extern struct sha1file *sha1fd_throughput(int fd, const char *name, struct progress *tp); extern struct sha1file *sha1fd_throughput(int fd, const char *name, struct progress *tp);
extern int sha1close(struct sha1file *, unsigned char *, unsigned int); extern int sha1close(struct sha1file *, unsigned char *, unsigned int);
extern int sha1write(struct sha1file *, void *, unsigned int); extern int sha1write(struct sha1file *, const void *, unsigned int);
extern void sha1flush(struct sha1file *f); extern void sha1flush(struct sha1file *f);
extern void crc32_begin(struct sha1file *); extern void crc32_begin(struct sha1file *);
extern uint32_t crc32_end(struct sha1file *); extern uint32_t crc32_end(struct sha1file *);

View File

@ -44,14 +44,13 @@ static int need_large_offset(off_t offset, const struct pack_idx_option *opts)
*/ */
const char *write_idx_file(const char *index_name, struct pack_idx_entry **objects, const char *write_idx_file(const char *index_name, struct pack_idx_entry **objects,
int nr_objects, const struct pack_idx_option *opts, int nr_objects, const struct pack_idx_option *opts,
unsigned char *sha1) const unsigned char *sha1)
{ {
struct sha1file *f; struct sha1file *f;
struct pack_idx_entry **sorted_by_sha, **list, **last; struct pack_idx_entry **sorted_by_sha, **list, **last;
off_t last_obj_offset = 0; off_t last_obj_offset = 0;
uint32_t array[256]; uint32_t array[256];
int i, fd; int i, fd;
git_SHA_CTX ctx;
uint32_t index_version; uint32_t index_version;
if (nr_objects) { if (nr_objects) {
@ -114,9 +113,6 @@ const char *write_idx_file(const char *index_name, struct pack_idx_entry **objec
} }
sha1write(f, array, 256 * 4); sha1write(f, array, 256 * 4);
/* compute the SHA1 hash of sorted object names. */
git_SHA1_Init(&ctx);
/* /*
* Write the actual SHA1 entries.. * Write the actual SHA1 entries..
*/ */
@ -128,7 +124,6 @@ const char *write_idx_file(const char *index_name, struct pack_idx_entry **objec
sha1write(f, &offset, 4); sha1write(f, &offset, 4);
} }
sha1write(f, obj->sha1, 20); sha1write(f, obj->sha1, 20);
git_SHA1_Update(&ctx, obj->sha1, 20);
if ((opts->flags & WRITE_IDX_STRICT) && if ((opts->flags & WRITE_IDX_STRICT) &&
(i && !hashcmp(list[-2]->sha1, obj->sha1))) (i && !hashcmp(list[-2]->sha1, obj->sha1)))
die("The same object %s appears twice in the pack", die("The same object %s appears twice in the pack",
@ -178,7 +173,6 @@ const char *write_idx_file(const char *index_name, struct pack_idx_entry **objec
sha1write(f, sha1, 20); sha1write(f, sha1, 20);
sha1close(f, NULL, ((opts->flags & WRITE_IDX_VERIFY) sha1close(f, NULL, ((opts->flags & WRITE_IDX_VERIFY)
? CSUM_CLOSE : CSUM_FSYNC)); ? CSUM_CLOSE : CSUM_FSYNC));
git_SHA1_Final(sha1, &ctx);
return index_name; return index_name;
} }

2
pack.h
View File

@ -76,7 +76,7 @@ struct pack_idx_entry {
struct progress; struct progress;
typedef int (*verify_fn)(const unsigned char*, enum object_type, unsigned long, void*, int*); typedef int (*verify_fn)(const unsigned char*, enum object_type, unsigned long, void*, int*);
extern const char *write_idx_file(const char *index_name, struct pack_idx_entry **objects, int nr_objects, const struct pack_idx_option *, unsigned char *sha1); extern const char *write_idx_file(const char *index_name, struct pack_idx_entry **objects, int nr_objects, const struct pack_idx_option *, const unsigned char *sha1);
extern int check_pack_crc(struct packed_git *p, struct pack_window **w_curs, off_t offset, off_t len, unsigned int nr); extern int check_pack_crc(struct packed_git *p, struct pack_window **w_curs, off_t offset, off_t len, unsigned int nr);
extern int verify_pack_index(struct packed_git *); extern int verify_pack_index(struct packed_git *);
extern int verify_pack(struct packed_git *, verify_fn fn, struct progress *, uint32_t); extern int verify_pack(struct packed_git *, verify_fn fn, struct progress *, uint32_t);

View File

@ -174,11 +174,11 @@ test_expect_success \
test_expect_success \ test_expect_success \
'[index v1] 5) pack-objects happily reuses corrupted data' \ '[index v1] 5) pack-objects happily reuses corrupted data' \
'pack4=$(git pack-objects test-4 <obj-list) && 'pack4=$(git pack-objects test-4 <obj-list) &&
test -f "test-4-${pack1}.pack"' test -f "test-4-${pack4}.pack"'
test_expect_success \ test_expect_success \
'[index v1] 6) newly created pack is BAD !' \ '[index v1] 6) newly created pack is BAD !' \
'test_must_fail git verify-pack -v "test-4-${pack1}.pack"' 'test_must_fail git verify-pack -v "test-4-${pack4}.pack"'
test_expect_success \ test_expect_success \
'[index v2] 1) stream pack to repository' \ '[index v2] 1) stream pack to repository' \