-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'jk/haves-from-alternate-odb'
* jk/haves-from-alternate-odb: receive-pack: eliminate duplicate .have refs bisect: refactor sha1_array into a generic sha1 list refactor refs_from_alternate_cb to allow passing extra data
- Loading branch information
Showing
8 changed files
with
132 additions
and
63 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
#include "cache.h" | ||
#include "sha1-array.h" | ||
#include "sha1-lookup.h" | ||
|
||
void sha1_array_append(struct sha1_array *array, const unsigned char *sha1) | ||
{ | ||
ALLOC_GROW(array->sha1, array->nr + 1, array->alloc); | ||
hashcpy(array->sha1[array->nr++], sha1); | ||
array->sorted = 0; | ||
} | ||
|
||
static int void_hashcmp(const void *a, const void *b) | ||
{ | ||
return hashcmp(a, b); | ||
} | ||
|
||
void sha1_array_sort(struct sha1_array *array) | ||
{ | ||
qsort(array->sha1, array->nr, sizeof(*array->sha1), void_hashcmp); | ||
array->sorted = 1; | ||
} | ||
|
||
static const unsigned char *sha1_access(size_t index, void *table) | ||
{ | ||
unsigned char (*array)[20] = table; | ||
return array[index]; | ||
} | ||
|
||
int sha1_array_lookup(struct sha1_array *array, const unsigned char *sha1) | ||
{ | ||
if (!array->sorted) | ||
sha1_array_sort(array); | ||
return sha1_pos(sha1, array->sha1, array->nr, sha1_access); | ||
} | ||
|
||
void sha1_array_clear(struct sha1_array *array) | ||
{ | ||
free(array->sha1); | ||
array->sha1 = NULL; | ||
array->nr = 0; | ||
array->alloc = 0; | ||
array->sorted = 0; | ||
} | ||
|
||
void sha1_array_for_each_unique(struct sha1_array *array, | ||
for_each_sha1_fn fn, | ||
void *data) | ||
{ | ||
int i; | ||
|
||
if (!array->sorted) | ||
sha1_array_sort(array); | ||
|
||
for (i = 0; i < array->nr; i++) { | ||
if (i > 0 && !hashcmp(array->sha1[i], array->sha1[i-1])) | ||
continue; | ||
fn(array->sha1[i], data); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
#ifndef SHA1_ARRAY_H | ||
#define SHA1_ARRAY_H | ||
|
||
struct sha1_array { | ||
unsigned char (*sha1)[20]; | ||
int nr; | ||
int alloc; | ||
int sorted; | ||
}; | ||
|
||
#define SHA1_ARRAY_INIT { NULL, 0, 0, 0 } | ||
|
||
void sha1_array_append(struct sha1_array *array, const unsigned char *sha1); | ||
void sha1_array_sort(struct sha1_array *array); | ||
int sha1_array_lookup(struct sha1_array *array, const unsigned char *sha1); | ||
void sha1_array_clear(struct sha1_array *array); | ||
|
||
typedef void (*for_each_sha1_fn)(const unsigned char sha1[20], | ||
void *data); | ||
void sha1_array_for_each_unique(struct sha1_array *array, | ||
for_each_sha1_fn fn, | ||
void *data); | ||
|
||
#endif /* SHA1_ARRAY_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters