aboutsummaryrefslogtreecommitdiff
path: root/builtin/cat-file.c
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2015-06-22 07:06:32 -0400
committerJunio C Hamano <gitster@pobox.com>2015-06-26 09:24:42 -0700
commit3115ee45c8c7c0b753663890b13ec0e14fe4c0d7 (patch)
treedb7ceda377412cbdf84cce0d96fc7f432a2c415d /builtin/cat-file.c
parent6a951937ae1abb5fe438bfb41ebb28c5abe0419d (diff)
downloadgit-3115ee45c8c7c0b753663890b13ec0e14fe4c0d7.tar.gz
git-3115ee45c8c7c0b753663890b13ec0e14fe4c0d7.tar.xz
cat-file: sort and de-dup output of --batch-all-objects
The sorting we could probably live without, but printing duplicates is just a hassle for the user, who must then de-dup themselves (or risk a wrong answer if they are doing something like counting objects with a particular property). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/cat-file.c')
-rw-r--r--builtin/cat-file.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/builtin/cat-file.c b/builtin/cat-file.c
index 95604c4a6..07baad1e5 100644
--- a/builtin/cat-file.c
+++ b/builtin/cat-file.c
@@ -9,6 +9,7 @@
#include "userdiff.h"
#include "streaming.h"
#include "tree-walk.h"
+#include "sha1-array.h"
struct batch_options {
int enabled;
@@ -324,19 +325,19 @@ struct object_cb_data {
struct expand_data *expand;
};
-static int batch_object_cb(const unsigned char *sha1,
- struct object_cb_data *data)
+static void batch_object_cb(const unsigned char sha1[20], void *vdata)
{
+ struct object_cb_data *data = vdata;
hashcpy(data->expand->sha1, sha1);
batch_object_write(NULL, data->opt, data->expand);
- return 0;
}
static int batch_loose_object(const unsigned char *sha1,
const char *path,
void *data)
{
- return batch_object_cb(sha1, data);
+ sha1_array_append(data, sha1);
+ return 0;
}
static int batch_packed_object(const unsigned char *sha1,
@@ -344,7 +345,8 @@ static int batch_packed_object(const unsigned char *sha1,
uint32_t pos,
void *data)
{
- return batch_object_cb(sha1, data);
+ sha1_array_append(data, sha1);
+ return 0;
}
static int batch_objects(struct batch_options *opt)
@@ -375,11 +377,17 @@ static int batch_objects(struct batch_options *opt)
data.info.typep = &data.type;
if (opt->all_objects) {
+ struct sha1_array sa = SHA1_ARRAY_INIT;
struct object_cb_data cb;
+
+ for_each_loose_object(batch_loose_object, &sa, 0);
+ for_each_packed_object(batch_packed_object, &sa, 0);
+
cb.opt = opt;
cb.expand = &data;
- for_each_loose_object(batch_loose_object, &cb, 0);
- for_each_packed_object(batch_packed_object, &cb, 0);
+ sha1_array_for_each_unique(&sa, batch_object_cb, &cb);
+
+ sha1_array_clear(&sa);
return 0;
}