diff --git a/fsck-objects.c b/fsck-objects.c index 9950be2645..6439d55126 100644 --- a/fsck-objects.c +++ b/fsck-objects.c @@ -61,9 +61,12 @@ static void check_connectivity(void) int i; /* Look up all the requirements, warn about missing objects.. */ - for (i = 0; i < nr_objs; i++) { + for (i = 0; i < obj_allocs; i++) { struct object *obj = objs[i]; + if (!obj) + continue; + if (!obj->parsed) { if (!standalone && has_sha1_file(obj->sha1)) ; /* it is in pack */ diff --git a/git-tag.sh b/git-tag.sh index 6d0c973239..c74e1b4151 100755 --- a/git-tag.sh +++ b/git-tag.sh @@ -85,7 +85,8 @@ if [ "$annotate" ]; then exit 1 } - ( echo -e "object $object\ntype $type\ntag $name\ntagger $tagger\n"; + ( printf 'object %s\ntype %s\ntag %s\ntagger %s\n\n' \ + "$object" "$type" "$name" "$tagger"; cat "$GIT_DIR"/TAG_FINALMSG ) >"$GIT_DIR"/TAG_TMP rm -f "$GIT_DIR"/TAG_TMP.asc "$GIT_DIR"/TAG_FINALMSG if [ "$signed" ]; then diff --git a/name-rev.c b/name-rev.c index bbadb91aa0..0c3f547622 100644 --- a/name-rev.c +++ b/name-rev.c @@ -232,9 +232,10 @@ int main(int argc, char **argv) } else if (all) { int i; - for (i = 0; i < nr_objs; i++) - printf("%s %s\n", sha1_to_hex(objs[i]->sha1), - get_rev_name(objs[i])); + for (i = 0; i < obj_allocs; i++) + if (objs[i]) + printf("%s %s\n", sha1_to_hex(objs[i]->sha1), + get_rev_name(objs[i])); } else for ( ; revs; revs = revs->next) printf("%s %s\n", revs->name, get_rev_name(revs->item)); diff --git a/object.c b/object.c index 1577f74281..c9ca481498 100644 --- a/object.c +++ b/object.c @@ -6,30 +6,34 @@ #include "tag.h" struct object **objs; -int nr_objs; -static int obj_allocs; +static int nr_objs; +int obj_allocs; int track_object_refs = 1; +static int hashtable_index(const unsigned char *sha1) +{ + unsigned int i; + memcpy(&i, sha1, sizeof(unsigned int)); + return (int)(i % obj_allocs); +} + static int find_object(const unsigned char *sha1) { - int first = 0, last = nr_objs; + int i; - while (first < last) { - int next = (first + last) / 2; - struct object *obj = objs[next]; - int cmp; + if (!objs) + return -1; - cmp = memcmp(sha1, obj->sha1, 20); - if (!cmp) - return next; - if (cmp < 0) { - last = next; - continue; - } - first = next+1; - } - return -first-1; + i = hashtable_index(sha1); + while (objs[i]) { + if (memcmp(sha1, objs[i]->sha1, 20) == 0) + return i; + i++; + if (i == obj_allocs) + i = 0; + } + return -1 - i; } struct object *lookup_object(const unsigned char *sha1) @@ -42,7 +46,7 @@ struct object *lookup_object(const unsigned char *sha1) void created_object(const unsigned char *sha1, struct object *obj) { - int pos = find_object(sha1); + int pos; obj->parsed = 0; memcpy(obj->sha1, sha1, 20); @@ -50,19 +54,28 @@ void created_object(const unsigned char *sha1, struct object *obj) obj->refs = NULL; obj->used = 0; + if (obj_allocs - 1 <= nr_objs * 2) { + int i, count = obj_allocs; + obj_allocs = (obj_allocs < 32 ? 32 : 2 * obj_allocs); + objs = xrealloc(objs, obj_allocs * sizeof(struct object *)); + memset(objs + count, 0, (obj_allocs - count) + * sizeof(struct object *)); + for (i = 0; i < obj_allocs; i++) + if (objs[i]) { + int j = find_object(objs[i]->sha1); + if (j != i) { + j = -1 - j; + objs[j] = objs[i]; + objs[i] = NULL; + } + } + } + + pos = find_object(sha1); if (pos >= 0) die("Inserting %s twice\n", sha1_to_hex(sha1)); pos = -pos-1; - if (obj_allocs == nr_objs) { - obj_allocs = alloc_nr(obj_allocs); - objs = xrealloc(objs, obj_allocs * sizeof(struct object *)); - } - - /* Insert it into the right place */ - memmove(objs + pos + 1, objs + pos, (nr_objs - pos) * - sizeof(struct object *)); - objs[pos] = obj; nr_objs++; } diff --git a/object.h b/object.h index 0e7618283c..e08afbd29f 100644 --- a/object.h +++ b/object.h @@ -23,7 +23,7 @@ struct object { }; extern int track_object_refs; -extern int nr_objs; +extern int obj_allocs; extern struct object **objs; /** Internal only **/ diff --git a/t/t0000-basic.sh b/t/t0000-basic.sh index bc3e711a52..c339a366f4 100755 --- a/t/t0000-basic.sh +++ b/t/t0000-basic.sh @@ -33,7 +33,7 @@ then fi merge >/dev/null 2>/dev/null -if test $? == 127 +if test $? = 127 then echo >&2 'You do not seem to have "merge" installed. Please check INSTALL document.' diff --git a/t/t3001-ls-files-others-exclude.sh b/t/t3001-ls-files-others-exclude.sh index fde2bb25fa..6979b7c1c0 100755 --- a/t/t3001-ls-files-others-exclude.sh +++ b/t/t3001-ls-files-others-exclude.sh @@ -68,7 +68,7 @@ test_expect_success \ diff -u expect output' # Test \r\n (MSDOS-like systems) -echo -ne '*.1\r\n/*.3\r\n!*.6\r\n' >.gitignore +printf '*.1\r\n/*.3\r\n!*.6\r\n' >.gitignore test_expect_success \ 'git-ls-files --others with \r\n line endings.' \