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:
parent
0c99171ad2
commit
16ddcd403b
@ -38,16 +38,20 @@ Functions
|
|||||||
`sha1_array_for_each_unique`::
|
`sha1_array_for_each_unique`::
|
||||||
Efficiently iterate over each unique element of the list,
|
Efficiently iterate over each unique element of the list,
|
||||||
executing the callback function for each one. If the array is
|
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
|
Examples
|
||||||
--------
|
--------
|
||||||
|
|
||||||
-----------------------------------------
|
-----------------------------------------
|
||||||
void print_callback(const unsigned char sha1[20],
|
int print_callback(const unsigned char sha1[20],
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
printf("%s\n", sha1_to_hex(sha1));
|
printf("%s\n", sha1_to_hex(sha1));
|
||||||
|
return 0; /* always continue */
|
||||||
}
|
}
|
||||||
|
|
||||||
void some_func(void)
|
void some_func(void)
|
||||||
|
@ -401,11 +401,12 @@ struct object_cb_data {
|
|||||||
struct expand_data *expand;
|
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;
|
struct object_cb_data *data = vdata;
|
||||||
hashcpy(data->expand->oid.hash, sha1);
|
hashcpy(data->expand->oid.hash, sha1);
|
||||||
batch_object_write(NULL, data->opt, data->expand);
|
batch_object_write(NULL, data->opt, data->expand);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int batch_loose_object(const unsigned char *sha1,
|
static int batch_loose_object(const unsigned char *sha1,
|
||||||
|
@ -268,9 +268,10 @@ static int show_ref_cb(const char *path_full, const struct object_id *oid,
|
|||||||
return 0;
|
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);
|
show_ref(".have", sha1);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void collect_one_alternate_ref(const struct ref *ref, void *data)
|
static void collect_one_alternate_ref(const struct ref *ref, void *data)
|
||||||
|
@ -42,7 +42,7 @@ void sha1_array_clear(struct sha1_array *array)
|
|||||||
array->sorted = 0;
|
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,
|
for_each_sha1_fn fn,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
@ -52,8 +52,12 @@ void sha1_array_for_each_unique(struct sha1_array *array,
|
|||||||
sha1_array_sort(array);
|
sha1_array_sort(array);
|
||||||
|
|
||||||
for (i = 0; i < array->nr; i++) {
|
for (i = 0; i < array->nr; i++) {
|
||||||
|
int ret;
|
||||||
if (i > 0 && !hashcmp(array->sha1[i], array->sha1[i-1]))
|
if (i > 0 && !hashcmp(array->sha1[i], array->sha1[i-1]))
|
||||||
continue;
|
continue;
|
||||||
fn(array->sha1[i], data);
|
ret = fn(array->sha1[i], data);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
int sha1_array_lookup(struct sha1_array *array, const unsigned char *sha1);
|
||||||
void sha1_array_clear(struct sha1_array *array);
|
void sha1_array_clear(struct sha1_array *array);
|
||||||
|
|
||||||
typedef void (*for_each_sha1_fn)(const unsigned char sha1[20],
|
typedef int (*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);
|
void *data);
|
||||||
|
int sha1_array_for_each_unique(struct sha1_array *array,
|
||||||
|
for_each_sha1_fn fn,
|
||||||
|
void *data);
|
||||||
|
|
||||||
#endif /* SHA1_ARRAY_H */
|
#endif /* SHA1_ARRAY_H */
|
||||||
|
@ -728,9 +728,10 @@ void check_for_new_submodule_commits(unsigned char new_sha1[20])
|
|||||||
sha1_array_append(&ref_tips_after_fetch, new_sha1);
|
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));
|
argv_array_push(data, sha1_to_hex(sha1));
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void calculate_changed_submodule_paths(void)
|
static void calculate_changed_submodule_paths(void)
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
#include "sha1-array.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));
|
puts(sha1_to_hex(sha1));
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cmd_main(int argc, const char **argv)
|
int cmd_main(int argc, const char **argv)
|
||||||
|
Loading…
Reference in New Issue
Block a user