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.
|
<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::
|
||||||
|
@ -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);
|
||||||
|
@ -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 *);
|
||||||
|
@ -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
2
pack.h
@ -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);
|
||||||
|
@ -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' \
|
||||||
|
Loading…
Reference in New Issue
Block a user