1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-10-28 12:59:41 +01:00

sha1_array: let callbacks interrupt iteration

The callbacks for iterating a sha1_array must have a void
return.  This is unlike our usual for_each semantics, where
a callback may interrupt iteration and have its value
propagated. Let's switch it to the usual form, which will
enable its use in more places (e.g., where we are replacing
an existing iteration with a different data structure).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2016-09-26 08:00:29 -04:00 committed by Junio C Hamano
parent 0c99171ad2
commit 16ddcd403b
7 changed files with 24 additions and 12 deletions

View file

@ -38,16 +38,20 @@ Functions
`sha1_array_for_each_unique`::
Efficiently iterate over each unique element of the list,
executing the callback function for each one. If the array is
not sorted, this function has the side effect of sorting it.
not sorted, this function has the side effect of sorting it. If
the callback returns a non-zero value, the iteration ends
immediately and the callback's return is propagated; otherwise,
0 is returned.
Examples
--------
-----------------------------------------
void print_callback(const unsigned char sha1[20],
int print_callback(const unsigned char sha1[20],
void *data)
{
printf("%s\n", sha1_to_hex(sha1));
return 0; /* always continue */
}
void some_func(void)

View file

@ -401,11 +401,12 @@ struct object_cb_data {
struct expand_data *expand;
};
static void batch_object_cb(const unsigned char sha1[20], void *vdata)
static int batch_object_cb(const unsigned char sha1[20], void *vdata)
{
struct object_cb_data *data = vdata;
hashcpy(data->expand->oid.hash, sha1);
batch_object_write(NULL, data->opt, data->expand);
return 0;
}
static int batch_loose_object(const unsigned char *sha1,

View file

@ -268,9 +268,10 @@ static int show_ref_cb(const char *path_full, const struct object_id *oid,
return 0;
}
static void show_one_alternate_sha1(const unsigned char sha1[20], void *unused)
static int show_one_alternate_sha1(const unsigned char sha1[20], void *unused)
{
show_ref(".have", sha1);
return 0;
}
static void collect_one_alternate_ref(const struct ref *ref, void *data)

View file

@ -42,7 +42,7 @@ void sha1_array_clear(struct sha1_array *array)
array->sorted = 0;
}
void sha1_array_for_each_unique(struct sha1_array *array,
int sha1_array_for_each_unique(struct sha1_array *array,
for_each_sha1_fn fn,
void *data)
{
@ -52,8 +52,12 @@ void sha1_array_for_each_unique(struct sha1_array *array,
sha1_array_sort(array);
for (i = 0; i < array->nr; i++) {
int ret;
if (i > 0 && !hashcmp(array->sha1[i], array->sha1[i-1]))
continue;
fn(array->sha1[i], data);
ret = fn(array->sha1[i], data);
if (ret)
return ret;
}
return 0;
}

View file

@ -14,10 +14,10 @@ void sha1_array_append(struct sha1_array *array, const unsigned char *sha1);
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,
typedef int (*for_each_sha1_fn)(const unsigned char sha1[20],
void *data);
int sha1_array_for_each_unique(struct sha1_array *array,
for_each_sha1_fn fn,
void *data);
#endif /* SHA1_ARRAY_H */

View file

@ -728,9 +728,10 @@ void check_for_new_submodule_commits(unsigned char new_sha1[20])
sha1_array_append(&ref_tips_after_fetch, new_sha1);
}
static void add_sha1_to_argv(const unsigned char sha1[20], void *data)
static int add_sha1_to_argv(const unsigned char sha1[20], void *data)
{
argv_array_push(data, sha1_to_hex(sha1));
return 0;
}
static void calculate_changed_submodule_paths(void)

View file

@ -1,9 +1,10 @@
#include "cache.h"
#include "sha1-array.h"
static void print_sha1(const unsigned char sha1[20], void *data)
static int print_sha1(const unsigned char sha1[20], void *data)
{
puts(sha1_to_hex(sha1));
return 0;
}
int cmd_main(int argc, const char **argv)