mirror of
https://github.com/git/git
synced 2024-08-28 03:59:25 +00:00
fast-import: make hash-size independent
Replace several uses of GIT_SHA1_HEXSZ and 40-based constants with references to the_hash_algo. Update the note handling code here to compute path sizes based on GIT_MAX_RAWSZ as well. Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
1c4675dc57
commit
28d055bde9
|
@ -29,6 +29,13 @@
|
||||||
*/
|
*/
|
||||||
#define NO_DELTA S_ISUID
|
#define NO_DELTA S_ISUID
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The amount of additional space required in order to write an object into the
|
||||||
|
* current pack. This is the hash lengths at the end of the pack, plus the
|
||||||
|
* length of one object ID.
|
||||||
|
*/
|
||||||
|
#define PACK_SIZE_THRESHOLD (the_hash_algo->rawsz * 3)
|
||||||
|
|
||||||
struct object_entry {
|
struct object_entry {
|
||||||
struct pack_idx_entry idx;
|
struct pack_idx_entry idx;
|
||||||
struct object_entry *next;
|
struct object_entry *next;
|
||||||
|
@ -949,8 +956,9 @@ static int store_object(
|
||||||
git_deflate_end(&s);
|
git_deflate_end(&s);
|
||||||
|
|
||||||
/* Determine if we should auto-checkpoint. */
|
/* Determine if we should auto-checkpoint. */
|
||||||
if ((max_packsize && (pack_size + 60 + s.total_out) > max_packsize)
|
if ((max_packsize
|
||||||
|| (pack_size + 60 + s.total_out) < pack_size) {
|
&& (pack_size + PACK_SIZE_THRESHOLD + s.total_out) > max_packsize)
|
||||||
|
|| (pack_size + PACK_SIZE_THRESHOLD + s.total_out) < pack_size) {
|
||||||
|
|
||||||
/* This new object needs to *not* have the current pack_id. */
|
/* This new object needs to *not* have the current pack_id. */
|
||||||
e->pack_id = pack_id + 1;
|
e->pack_id = pack_id + 1;
|
||||||
|
@ -1045,8 +1053,9 @@ static void stream_blob(uintmax_t len, struct object_id *oidout, uintmax_t mark)
|
||||||
int status = Z_OK;
|
int status = Z_OK;
|
||||||
|
|
||||||
/* Determine if we should auto-checkpoint. */
|
/* Determine if we should auto-checkpoint. */
|
||||||
if ((max_packsize && (pack_size + 60 + len) > max_packsize)
|
if ((max_packsize
|
||||||
|| (pack_size + 60 + len) < pack_size)
|
&& (pack_size + PACK_SIZE_THRESHOLD + len) > max_packsize)
|
||||||
|
|| (pack_size + PACK_SIZE_THRESHOLD + len) < pack_size)
|
||||||
cycle_packfile();
|
cycle_packfile();
|
||||||
|
|
||||||
hashfile_checkpoint(pack_file, &checkpoint);
|
hashfile_checkpoint(pack_file, &checkpoint);
|
||||||
|
@ -1241,7 +1250,7 @@ static void load_tree(struct tree_entry *root)
|
||||||
c += e->name->str_len + 1;
|
c += e->name->str_len + 1;
|
||||||
hashcpy(e->versions[0].oid.hash, (unsigned char *)c);
|
hashcpy(e->versions[0].oid.hash, (unsigned char *)c);
|
||||||
hashcpy(e->versions[1].oid.hash, (unsigned char *)c);
|
hashcpy(e->versions[1].oid.hash, (unsigned char *)c);
|
||||||
c += GIT_SHA1_RAWSZ;
|
c += the_hash_algo->rawsz;
|
||||||
}
|
}
|
||||||
free(buf);
|
free(buf);
|
||||||
}
|
}
|
||||||
|
@ -1288,7 +1297,7 @@ static void mktree(struct tree_content *t, int v, struct strbuf *b)
|
||||||
strbuf_addf(b, "%o %s%c",
|
strbuf_addf(b, "%o %s%c",
|
||||||
(unsigned int)(e->versions[v].mode & ~NO_DELTA),
|
(unsigned int)(e->versions[v].mode & ~NO_DELTA),
|
||||||
e->name->str_dat, '\0');
|
e->name->str_dat, '\0');
|
||||||
strbuf_add(b, e->versions[v].oid.hash, GIT_SHA1_RAWSZ);
|
strbuf_add(b, e->versions[v].oid.hash, the_hash_algo->rawsz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2047,7 +2056,9 @@ static uintmax_t do_change_note_fanout(
|
||||||
unsigned int i, tmp_hex_oid_len, tmp_fullpath_len;
|
unsigned int i, tmp_hex_oid_len, tmp_fullpath_len;
|
||||||
uintmax_t num_notes = 0;
|
uintmax_t num_notes = 0;
|
||||||
struct object_id oid;
|
struct object_id oid;
|
||||||
char realpath[60];
|
/* hex oid + '/' between each pair of hex digits + NUL */
|
||||||
|
char realpath[GIT_MAX_HEXSZ + ((GIT_MAX_HEXSZ / 2) - 1) + 1];
|
||||||
|
const unsigned hexsz = the_hash_algo->hexsz;
|
||||||
|
|
||||||
if (!root->tree)
|
if (!root->tree)
|
||||||
load_tree(root);
|
load_tree(root);
|
||||||
|
@ -2067,7 +2078,7 @@ static uintmax_t do_change_note_fanout(
|
||||||
* of 2 chars.
|
* of 2 chars.
|
||||||
*/
|
*/
|
||||||
if (!e->versions[1].mode ||
|
if (!e->versions[1].mode ||
|
||||||
tmp_hex_oid_len > GIT_SHA1_HEXSZ ||
|
tmp_hex_oid_len > hexsz ||
|
||||||
e->name->str_len % 2)
|
e->name->str_len % 2)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -2081,7 +2092,7 @@ static uintmax_t do_change_note_fanout(
|
||||||
tmp_fullpath_len += e->name->str_len;
|
tmp_fullpath_len += e->name->str_len;
|
||||||
fullpath[tmp_fullpath_len] = '\0';
|
fullpath[tmp_fullpath_len] = '\0';
|
||||||
|
|
||||||
if (tmp_hex_oid_len == GIT_SHA1_HEXSZ && !get_oid_hex(hex_oid, &oid)) {
|
if (tmp_hex_oid_len == hexsz && !get_oid_hex(hex_oid, &oid)) {
|
||||||
/* This is a note entry */
|
/* This is a note entry */
|
||||||
if (fanout == 0xff) {
|
if (fanout == 0xff) {
|
||||||
/* Counting mode, no rename */
|
/* Counting mode, no rename */
|
||||||
|
@ -2352,7 +2363,7 @@ static void note_change_n(const char *p, struct branch *b, unsigned char *old_fa
|
||||||
struct object_entry *oe;
|
struct object_entry *oe;
|
||||||
struct branch *s;
|
struct branch *s;
|
||||||
struct object_id oid, commit_oid;
|
struct object_id oid, commit_oid;
|
||||||
char path[60];
|
char path[GIT_MAX_RAWSZ * 3];
|
||||||
uint16_t inline_data = 0;
|
uint16_t inline_data = 0;
|
||||||
unsigned char new_fanout;
|
unsigned char new_fanout;
|
||||||
|
|
||||||
|
@ -2405,7 +2416,7 @@ static void note_change_n(const char *p, struct branch *b, unsigned char *old_fa
|
||||||
char *buf = read_object_with_reference(&commit_oid,
|
char *buf = read_object_with_reference(&commit_oid,
|
||||||
commit_type, &size,
|
commit_type, &size,
|
||||||
&commit_oid);
|
&commit_oid);
|
||||||
if (!buf || size < 46)
|
if (!buf || size < the_hash_algo->hexsz + 6)
|
||||||
die("Not a valid commit: %s", p);
|
die("Not a valid commit: %s", p);
|
||||||
free(buf);
|
free(buf);
|
||||||
} else
|
} else
|
||||||
|
@ -2456,7 +2467,7 @@ static void file_change_deleteall(struct branch *b)
|
||||||
|
|
||||||
static void parse_from_commit(struct branch *b, char *buf, unsigned long size)
|
static void parse_from_commit(struct branch *b, char *buf, unsigned long size)
|
||||||
{
|
{
|
||||||
if (!buf || size < GIT_SHA1_HEXSZ + 6)
|
if (!buf || size < the_hash_algo->hexsz + 6)
|
||||||
die("Not a valid commit: %s", oid_to_hex(&b->oid));
|
die("Not a valid commit: %s", oid_to_hex(&b->oid));
|
||||||
if (memcmp("tree ", buf, 5)
|
if (memcmp("tree ", buf, 5)
|
||||||
|| get_oid_hex(buf + 5, &b->branch_tree.versions[1].oid))
|
|| get_oid_hex(buf + 5, &b->branch_tree.versions[1].oid))
|
||||||
|
@ -2555,7 +2566,7 @@ static struct hash_list *parse_merge(unsigned int *count)
|
||||||
char *buf = read_object_with_reference(&n->oid,
|
char *buf = read_object_with_reference(&n->oid,
|
||||||
commit_type,
|
commit_type,
|
||||||
&size, &n->oid);
|
&size, &n->oid);
|
||||||
if (!buf || size < 46)
|
if (!buf || size < the_hash_algo->hexsz + 6)
|
||||||
die("Not a valid commit: %s", from);
|
die("Not a valid commit: %s", from);
|
||||||
free(buf);
|
free(buf);
|
||||||
} else
|
} else
|
||||||
|
@ -2842,7 +2853,7 @@ static void parse_get_mark(const char *p)
|
||||||
die("Unknown mark: %s", command_buf.buf);
|
die("Unknown mark: %s", command_buf.buf);
|
||||||
|
|
||||||
xsnprintf(output, sizeof(output), "%s\n", oid_to_hex(&oe->idx.oid));
|
xsnprintf(output, sizeof(output), "%s\n", oid_to_hex(&oe->idx.oid));
|
||||||
cat_blob_write(output, GIT_SHA1_HEXSZ + 1);
|
cat_blob_write(output, the_hash_algo->hexsz + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void parse_cat_blob(const char *p)
|
static void parse_cat_blob(const char *p)
|
||||||
|
@ -2872,6 +2883,8 @@ static struct object_entry *dereference(struct object_entry *oe,
|
||||||
{
|
{
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
|
const unsigned hexsz = the_hash_algo->hexsz;
|
||||||
|
|
||||||
if (!oe) {
|
if (!oe) {
|
||||||
enum object_type type = oid_object_info(the_repository, oid,
|
enum object_type type = oid_object_info(the_repository, oid,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -2905,12 +2918,12 @@ static struct object_entry *dereference(struct object_entry *oe,
|
||||||
/* Peel one layer. */
|
/* Peel one layer. */
|
||||||
switch (oe->type) {
|
switch (oe->type) {
|
||||||
case OBJ_TAG:
|
case OBJ_TAG:
|
||||||
if (size < GIT_SHA1_HEXSZ + strlen("object ") ||
|
if (size < hexsz + strlen("object ") ||
|
||||||
get_oid_hex(buf + strlen("object "), oid))
|
get_oid_hex(buf + strlen("object "), oid))
|
||||||
die("Invalid SHA1 in tag: %s", command_buf.buf);
|
die("Invalid SHA1 in tag: %s", command_buf.buf);
|
||||||
break;
|
break;
|
||||||
case OBJ_COMMIT:
|
case OBJ_COMMIT:
|
||||||
if (size < GIT_SHA1_HEXSZ + strlen("tree ") ||
|
if (size < hexsz + strlen("tree ") ||
|
||||||
get_oid_hex(buf + strlen("tree "), oid))
|
get_oid_hex(buf + strlen("tree "), oid))
|
||||||
die("Invalid SHA1 in commit: %s", command_buf.buf);
|
die("Invalid SHA1 in commit: %s", command_buf.buf);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue