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:
commit
53b2a5ff30
@ -51,8 +51,7 @@ base-name::
|
||||
<base-name> to determine the name of the created file.
|
||||
When this option is used, the two files are written in
|
||||
<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 written to the standard
|
||||
based on the pack content and is written to the standard
|
||||
output of the command.
|
||||
|
||||
--stdout::
|
||||
|
@ -11,7 +11,7 @@
|
||||
#include "progress.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) {
|
||||
unsigned char check_buffer[8192];
|
||||
@ -86,13 +86,13 @@ int sha1close(struct sha1file *f, unsigned char *result, unsigned int flags)
|
||||
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) {
|
||||
unsigned offset = f->offset;
|
||||
unsigned left = sizeof(f->buffer) - offset;
|
||||
unsigned nr = count > left ? left : count;
|
||||
void *data;
|
||||
const void *data;
|
||||
|
||||
if (f->do_crc)
|
||||
f->crc32 = crc32(f->crc32, buf, nr);
|
||||
|
@ -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_throughput(int fd, const char *name, struct progress *tp);
|
||||
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 crc32_begin(struct sha1file *);
|
||||
extern uint32_t crc32_end(struct sha1file *);
|
||||
|
@ -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,
|
||||
int nr_objects, const struct pack_idx_option *opts,
|
||||
unsigned char *sha1)
|
||||
const unsigned char *sha1)
|
||||
{
|
||||
struct sha1file *f;
|
||||
struct pack_idx_entry **sorted_by_sha, **list, **last;
|
||||
off_t last_obj_offset = 0;
|
||||
uint32_t array[256];
|
||||
int i, fd;
|
||||
git_SHA_CTX ctx;
|
||||
uint32_t index_version;
|
||||
|
||||
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);
|
||||
|
||||
/* compute the SHA1 hash of sorted object names. */
|
||||
git_SHA1_Init(&ctx);
|
||||
|
||||
/*
|
||||
* 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, obj->sha1, 20);
|
||||
git_SHA1_Update(&ctx, obj->sha1, 20);
|
||||
if ((opts->flags & WRITE_IDX_STRICT) &&
|
||||
(i && !hashcmp(list[-2]->sha1, obj->sha1)))
|
||||
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);
|
||||
sha1close(f, NULL, ((opts->flags & WRITE_IDX_VERIFY)
|
||||
? CSUM_CLOSE : CSUM_FSYNC));
|
||||
git_SHA1_Final(sha1, &ctx);
|
||||
return index_name;
|
||||
}
|
||||
|
||||
|
2
pack.h
2
pack.h
@ -76,7 +76,7 @@ struct pack_idx_entry {
|
||||
struct progress;
|
||||
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 verify_pack_index(struct packed_git *);
|
||||
extern int verify_pack(struct packed_git *, verify_fn fn, struct progress *, uint32_t);
|
||||
|
@ -174,11 +174,11 @@ test_expect_success \
|
||||
test_expect_success \
|
||||
'[index v1] 5) pack-objects happily reuses corrupted data' \
|
||||
'pack4=$(git pack-objects test-4 <obj-list) &&
|
||||
test -f "test-4-${pack1}.pack"'
|
||||
test -f "test-4-${pack4}.pack"'
|
||||
|
||||
test_expect_success \
|
||||
'[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 \
|
||||
'[index v2] 1) stream pack to repository' \
|
||||
|
Loading…
Reference in New Issue
Block a user