diff options
| author | Jonathan Tan <jonathantanmy@google.com> | 2017-08-18 15:20:38 -0700 | 
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2017-08-23 15:12:07 -0700 | 
| commit | 7709f468fdeece2a99d60a581a4ced65cd2844df (patch) | |
| tree | 37a26e9a350ec173d24f5578004e0000d3c6170e | |
| parent | f9a8672a81277b83cabd59c6705089351c4f3ec4 (diff) | |
| download | git-7709f468fdeece2a99d60a581a4ced65cd2844df.tar.gz | |
pack: move for_each_packed_object()
Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
| -rw-r--r-- | builtin/cat-file.c | 1 | ||||
| -rw-r--r-- | cache.h | 7 | ||||
| -rw-r--r-- | packfile.c | 40 | ||||
| -rw-r--r-- | packfile.h | 11 | ||||
| -rw-r--r-- | reachable.c | 1 | ||||
| -rw-r--r-- | sha1_file.c | 40 | 
6 files changed, 54 insertions, 46 deletions
| diff --git a/builtin/cat-file.c b/builtin/cat-file.c index 62c8cf0ebf..4ccbfaac31 100644 --- a/builtin/cat-file.c +++ b/builtin/cat-file.c @@ -12,6 +12,7 @@  #include "streaming.h"  #include "tree-walk.h"  #include "sha1-array.h" +#include "packfile.h"  struct batch_options {  	int enabled; @@ -1662,17 +1662,12 @@ int for_each_loose_file_in_objdir_buf(struct strbuf *path,  				      void *data);  /* - * Iterate over loose and packed objects in both the local + * Iterate over loose objects in both the local   * repository and any alternates repositories (unless the   * LOCAL_ONLY flag is set).   */  #define FOR_EACH_OBJECT_LOCAL_ONLY 0x1 -typedef int each_packed_object_fn(const struct object_id *oid, -				  struct packed_git *pack, -				  uint32_t pos, -				  void *data);  extern int for_each_loose_object(each_loose_object_fn, void *, unsigned flags); -extern int for_each_packed_object(each_packed_object_fn, void *, unsigned flags);  struct object_info {  	/* Request */ diff --git a/packfile.c b/packfile.c index 84d16bf7e0..f86fa051c9 100644 --- a/packfile.c +++ b/packfile.c @@ -1854,3 +1854,43 @@ int has_pack_index(const unsigned char *sha1)  		return 0;  	return 1;  } + +static int for_each_object_in_pack(struct packed_git *p, each_packed_object_fn cb, void *data) +{ +	uint32_t i; +	int r = 0; + +	for (i = 0; i < p->num_objects; i++) { +		struct object_id oid; + +		if (!nth_packed_object_oid(&oid, p, i)) +			return error("unable to get sha1 of object %u in %s", +				     i, p->pack_name); + +		r = cb(&oid, p, i, data); +		if (r) +			break; +	} +	return r; +} + +int for_each_packed_object(each_packed_object_fn cb, void *data, unsigned flags) +{ +	struct packed_git *p; +	int r = 0; +	int pack_errors = 0; + +	prepare_packed_git(); +	for (p = packed_git; p; p = p->next) { +		if ((flags & FOR_EACH_OBJECT_LOCAL_ONLY) && !p->pack_local) +			continue; +		if (open_pack_index(p)) { +			pack_errors = 1; +			continue; +		} +		r = for_each_object_in_pack(p, cb, data); +		if (r) +			break; +	} +	return r ? r : pack_errors; +} diff --git a/packfile.h b/packfile.h index d7df41a823..0cdeb54dcd 100644 --- a/packfile.h +++ b/packfile.h @@ -124,4 +124,15 @@ extern int has_sha1_pack(const unsigned char *sha1);  extern int has_pack_index(const unsigned char *sha1); +/* + * Iterate over packed objects in both the local + * repository and any alternates repositories (unless the + * FOR_EACH_OBJECT_LOCAL_ONLY flag, defined in cache.h, is set). + */ +typedef int each_packed_object_fn(const struct object_id *oid, +				  struct packed_git *pack, +				  uint32_t pos, +				  void *data); +extern int for_each_packed_object(each_packed_object_fn, void *, unsigned flags); +  #endif diff --git a/reachable.c b/reachable.c index c62efbfd43..d1ac5d97ef 100644 --- a/reachable.c +++ b/reachable.c @@ -9,6 +9,7 @@  #include "cache-tree.h"  #include "progress.h"  #include "list-objects.h" +#include "packfile.h"  struct connectivity_progress {  	struct progress *progress; diff --git a/sha1_file.c b/sha1_file.c index 7c81790759..bb0831b4c8 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -2015,46 +2015,6 @@ int for_each_loose_object(each_loose_object_fn cb, void *data, unsigned flags)  	return foreach_alt_odb(loose_from_alt_odb, &alt);  } -static int for_each_object_in_pack(struct packed_git *p, each_packed_object_fn cb, void *data) -{ -	uint32_t i; -	int r = 0; - -	for (i = 0; i < p->num_objects; i++) { -		struct object_id oid; - -		if (!nth_packed_object_oid(&oid, p, i)) -			return error("unable to get sha1 of object %u in %s", -				     i, p->pack_name); - -		r = cb(&oid, p, i, data); -		if (r) -			break; -	} -	return r; -} - -int for_each_packed_object(each_packed_object_fn cb, void *data, unsigned flags) -{ -	struct packed_git *p; -	int r = 0; -	int pack_errors = 0; - -	prepare_packed_git(); -	for (p = packed_git; p; p = p->next) { -		if ((flags & FOR_EACH_OBJECT_LOCAL_ONLY) && !p->pack_local) -			continue; -		if (open_pack_index(p)) { -			pack_errors = 1; -			continue; -		} -		r = for_each_object_in_pack(p, cb, data); -		if (r) -			break; -	} -	return r ? r : pack_errors; -} -  static int check_stream_sha1(git_zstream *stream,  			     const char *hdr,  			     unsigned long size, | 
