зеркало из https://github.com/microsoft/git.git
Create pack-write.c for common pack writing code
Include a generalized fixup_pack_header_footer() in this new file. Needed by git-repack --max-pack-size feature in a later patchset. [sp: Moved close(pack_fd) to callers, to support index-pack, and changed name to better indicate it is for packfiles.] Signed-off-by: Dana L. How <danahow@gmail.com> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
Родитель
db81e67a7d
Коммит
8b0eca7c7b
4
Makefile
4
Makefile
|
@ -301,8 +301,8 @@ LIB_OBJS = \
|
|||
interpolate.o \
|
||||
lockfile.o \
|
||||
patch-ids.o \
|
||||
object.o pack-check.o patch-delta.o path.o pkt-line.o sideband.o \
|
||||
reachable.o reflog-walk.o \
|
||||
object.o pack-check.o pack-write.o patch-delta.o path.o pkt-line.o \
|
||||
sideband.o reachable.o reflog-walk.o \
|
||||
quote.o read-cache.o refs.o run-command.o dir.o object-refs.o \
|
||||
server-info.o setup.o sha1_file.o sha1_name.o strbuf.o \
|
||||
tag.o tree.o usage.o config.o environment.o ctype.o copy.o \
|
||||
|
|
|
@ -651,42 +651,6 @@ static void start_packfile(void)
|
|||
all_packs[pack_id] = p;
|
||||
}
|
||||
|
||||
static void fixup_header_footer(void)
|
||||
{
|
||||
static const int buf_sz = 128 * 1024;
|
||||
int pack_fd = pack_data->pack_fd;
|
||||
SHA_CTX c;
|
||||
struct pack_header hdr;
|
||||
char *buf;
|
||||
|
||||
if (lseek(pack_fd, 0, SEEK_SET) != 0)
|
||||
die("Failed seeking to start: %s", strerror(errno));
|
||||
if (read_in_full(pack_fd, &hdr, sizeof(hdr)) != sizeof(hdr))
|
||||
die("Unable to reread header of %s", pack_data->pack_name);
|
||||
if (lseek(pack_fd, 0, SEEK_SET) != 0)
|
||||
die("Failed seeking to start: %s", strerror(errno));
|
||||
hdr.hdr_entries = htonl(object_count);
|
||||
write_or_die(pack_fd, &hdr, sizeof(hdr));
|
||||
|
||||
SHA1_Init(&c);
|
||||
SHA1_Update(&c, &hdr, sizeof(hdr));
|
||||
|
||||
buf = xmalloc(buf_sz);
|
||||
for (;;) {
|
||||
ssize_t n = xread(pack_fd, buf, buf_sz);
|
||||
if (!n)
|
||||
break;
|
||||
if (n < 0)
|
||||
die("Failed to checksum %s", pack_data->pack_name);
|
||||
SHA1_Update(&c, buf, n);
|
||||
}
|
||||
free(buf);
|
||||
|
||||
SHA1_Final(pack_data->sha1, &c);
|
||||
write_or_die(pack_fd, pack_data->sha1, sizeof(pack_data->sha1));
|
||||
close(pack_fd);
|
||||
}
|
||||
|
||||
static int oecmp (const void *a_, const void *b_)
|
||||
{
|
||||
struct object_entry *a = *((struct object_entry**)a_);
|
||||
|
@ -802,7 +766,9 @@ static void end_packfile(void)
|
|||
struct branch *b;
|
||||
struct tag *t;
|
||||
|
||||
fixup_header_footer();
|
||||
fixup_pack_header_footer(pack_data->pack_fd, pack_data->sha1,
|
||||
pack_data->pack_name, object_count);
|
||||
close(pack_data->pack_fd);
|
||||
idx_name = keep_pack(create_index());
|
||||
|
||||
/* Register the packfile with core git's machinary. */
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
#include "cache.h"
|
||||
#include "pack.h"
|
||||
|
||||
void fixup_pack_header_footer(int pack_fd,
|
||||
unsigned char *pack_file_sha1,
|
||||
const char *pack_name,
|
||||
uint32_t object_count)
|
||||
{
|
||||
static const int buf_sz = 128 * 1024;
|
||||
SHA_CTX c;
|
||||
struct pack_header hdr;
|
||||
char *buf;
|
||||
|
||||
if (lseek(pack_fd, 0, SEEK_SET) != 0)
|
||||
die("Failed seeking to start: %s", strerror(errno));
|
||||
if (read_in_full(pack_fd, &hdr, sizeof(hdr)) != sizeof(hdr))
|
||||
die("Unable to reread header of %s: %s", pack_name, strerror(errno));
|
||||
if (lseek(pack_fd, 0, SEEK_SET) != 0)
|
||||
die("Failed seeking to start: %s", strerror(errno));
|
||||
hdr.hdr_entries = htonl(object_count);
|
||||
write_or_die(pack_fd, &hdr, sizeof(hdr));
|
||||
|
||||
SHA1_Init(&c);
|
||||
SHA1_Update(&c, &hdr, sizeof(hdr));
|
||||
|
||||
buf = xmalloc(buf_sz);
|
||||
for (;;) {
|
||||
size_t n = xread(pack_fd, buf, buf_sz);
|
||||
if (!n)
|
||||
break;
|
||||
if (n < 0)
|
||||
die("Failed to checksum %s: %s", pack_name, strerror(errno));
|
||||
SHA1_Update(&c, buf, n);
|
||||
}
|
||||
free(buf);
|
||||
|
||||
SHA1_Final(pack_file_sha1, &c);
|
||||
write_or_die(pack_fd, pack_file_sha1, 20);
|
||||
}
|
1
pack.h
1
pack.h
|
@ -44,6 +44,7 @@ struct pack_idx_header {
|
|||
|
||||
|
||||
extern int verify_pack(struct packed_git *, int);
|
||||
extern void fixup_pack_header_footer(int, unsigned char *, const char *, uint32_t);
|
||||
|
||||
#define PH_ERROR_EOF (-1)
|
||||
#define PH_ERROR_PACK_SIGNATURE (-2)
|
||||
|
|
Загрузка…
Ссылка в новой задаче