Merge branch 'master'
* master: avoid echo -e, there are systems where it does not work fix "test: 2: unexpected operator" on bsd Fix object re-hashing hashtable-based objects: minimum fixups. Use a hashtable for objects instead of a sorted list
This commit is contained in:
commit
16ee902015
@ -61,9 +61,12 @@ static void check_connectivity(void)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Look up all the requirements, warn about missing objects.. */
|
/* 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];
|
struct object *obj = objs[i];
|
||||||
|
|
||||||
|
if (!obj)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (!obj->parsed) {
|
if (!obj->parsed) {
|
||||||
if (!standalone && has_sha1_file(obj->sha1))
|
if (!standalone && has_sha1_file(obj->sha1))
|
||||||
; /* it is in pack */
|
; /* it is in pack */
|
||||||
|
@ -85,7 +85,8 @@ if [ "$annotate" ]; then
|
|||||||
exit 1
|
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
|
cat "$GIT_DIR"/TAG_FINALMSG ) >"$GIT_DIR"/TAG_TMP
|
||||||
rm -f "$GIT_DIR"/TAG_TMP.asc "$GIT_DIR"/TAG_FINALMSG
|
rm -f "$GIT_DIR"/TAG_TMP.asc "$GIT_DIR"/TAG_FINALMSG
|
||||||
if [ "$signed" ]; then
|
if [ "$signed" ]; then
|
||||||
|
@ -232,9 +232,10 @@ int main(int argc, char **argv)
|
|||||||
} else if (all) {
|
} else if (all) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < nr_objs; i++)
|
for (i = 0; i < obj_allocs; i++)
|
||||||
printf("%s %s\n", sha1_to_hex(objs[i]->sha1),
|
if (objs[i])
|
||||||
get_rev_name(objs[i]));
|
printf("%s %s\n", sha1_to_hex(objs[i]->sha1),
|
||||||
|
get_rev_name(objs[i]));
|
||||||
} else
|
} else
|
||||||
for ( ; revs; revs = revs->next)
|
for ( ; revs; revs = revs->next)
|
||||||
printf("%s %s\n", revs->name, get_rev_name(revs->item));
|
printf("%s %s\n", revs->name, get_rev_name(revs->item));
|
||||||
|
67
object.c
67
object.c
@ -6,30 +6,34 @@
|
|||||||
#include "tag.h"
|
#include "tag.h"
|
||||||
|
|
||||||
struct object **objs;
|
struct object **objs;
|
||||||
int nr_objs;
|
static int nr_objs;
|
||||||
static int obj_allocs;
|
int obj_allocs;
|
||||||
|
|
||||||
int track_object_refs = 1;
|
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)
|
static int find_object(const unsigned char *sha1)
|
||||||
{
|
{
|
||||||
int first = 0, last = nr_objs;
|
int i;
|
||||||
|
|
||||||
while (first < last) {
|
if (!objs)
|
||||||
int next = (first + last) / 2;
|
return -1;
|
||||||
struct object *obj = objs[next];
|
|
||||||
int cmp;
|
|
||||||
|
|
||||||
cmp = memcmp(sha1, obj->sha1, 20);
|
i = hashtable_index(sha1);
|
||||||
if (!cmp)
|
while (objs[i]) {
|
||||||
return next;
|
if (memcmp(sha1, objs[i]->sha1, 20) == 0)
|
||||||
if (cmp < 0) {
|
return i;
|
||||||
last = next;
|
i++;
|
||||||
continue;
|
if (i == obj_allocs)
|
||||||
}
|
i = 0;
|
||||||
first = next+1;
|
}
|
||||||
}
|
return -1 - i;
|
||||||
return -first-1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct object *lookup_object(const unsigned char *sha1)
|
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)
|
void created_object(const unsigned char *sha1, struct object *obj)
|
||||||
{
|
{
|
||||||
int pos = find_object(sha1);
|
int pos;
|
||||||
|
|
||||||
obj->parsed = 0;
|
obj->parsed = 0;
|
||||||
memcpy(obj->sha1, sha1, 20);
|
memcpy(obj->sha1, sha1, 20);
|
||||||
@ -50,19 +54,28 @@ void created_object(const unsigned char *sha1, struct object *obj)
|
|||||||
obj->refs = NULL;
|
obj->refs = NULL;
|
||||||
obj->used = 0;
|
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)
|
if (pos >= 0)
|
||||||
die("Inserting %s twice\n", sha1_to_hex(sha1));
|
die("Inserting %s twice\n", sha1_to_hex(sha1));
|
||||||
pos = -pos-1;
|
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;
|
objs[pos] = obj;
|
||||||
nr_objs++;
|
nr_objs++;
|
||||||
}
|
}
|
||||||
|
2
object.h
2
object.h
@ -23,7 +23,7 @@ struct object {
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern int track_object_refs;
|
extern int track_object_refs;
|
||||||
extern int nr_objs;
|
extern int obj_allocs;
|
||||||
extern struct object **objs;
|
extern struct object **objs;
|
||||||
|
|
||||||
/** Internal only **/
|
/** Internal only **/
|
||||||
|
@ -33,7 +33,7 @@ then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
merge >/dev/null 2>/dev/null
|
merge >/dev/null 2>/dev/null
|
||||||
if test $? == 127
|
if test $? = 127
|
||||||
then
|
then
|
||||||
echo >&2 'You do not seem to have "merge" installed.
|
echo >&2 'You do not seem to have "merge" installed.
|
||||||
Please check INSTALL document.'
|
Please check INSTALL document.'
|
||||||
|
@ -68,7 +68,7 @@ test_expect_success \
|
|||||||
diff -u expect output'
|
diff -u expect output'
|
||||||
|
|
||||||
# Test \r\n (MSDOS-like systems)
|
# 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 \
|
test_expect_success \
|
||||||
'git-ls-files --others with \r\n line endings.' \
|
'git-ls-files --others with \r\n line endings.' \
|
||||||
|
Loading…
Reference in New Issue
Block a user