not be combined with any other options or arguments. See the
section `BATCH OUTPUT` below for details.
+--batch-all-objects::
+ Instead of reading a list of objects on stdin, perform the
+ requested batch operation on all objects in the repository and
+ any alternate object stores (not just reachable objects).
+ Requires `--batch` or `--batch-check` be specified. Note that
+ the order of the objects is unspecified, and there may be
+ duplicate entries.
+
--buffer::
Normally batch output is flushed after each object is output, so
that a process can interactively read and write from
int follow_symlinks;
int print_contents;
int buffer_output;
+ int all_objects;
const char *format;
};
struct strbuf buf = STRBUF_INIT;
if (sha1_object_info_extended(data->sha1, &data->info, LOOKUP_REPLACE_OBJECT) < 0) {
- printf("%s missing\n", obj_name);
+ printf("%s missing\n", obj_name ? obj_name : sha1_to_hex(data->sha1));
fflush(stdout);
return;
}
batch_object_write(obj_name, opt, data);
}
+struct object_cb_data {
+ struct batch_options *opt;
+ struct expand_data *expand;
+};
+
+static int batch_object_cb(const unsigned char *sha1,
+ struct object_cb_data *data)
+{
+ 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);
+}
+
+static int batch_packed_object(const unsigned char *sha1,
+ struct packed_git *pack,
+ uint32_t pos,
+ void *data)
+{
+ return batch_object_cb(sha1, data);
+}
+
static int batch_objects(struct batch_options *opt)
{
struct strbuf buf = STRBUF_INIT;
if (opt->print_contents)
data.info.typep = &data.type;
+ if (opt->all_objects) {
+ struct object_cb_data cb;
+ cb.opt = opt;
+ cb.expand = &data;
+ for_each_loose_object(batch_loose_object, &cb, 0);
+ for_each_packed_object(batch_packed_object, &cb, 0);
+ return 0;
+ }
+
/*
* We are going to call get_sha1 on a potentially very large number of
* objects. In most large cases, these will be actual object sha1s. The
PARSE_OPT_OPTARG, batch_option_callback },
OPT_BOOL(0, "follow-symlinks", &batch.follow_symlinks,
N_("follow in-tree symlinks (used with --batch or --batch-check)")),
+ OPT_BOOL(0, "batch-all-objects", &batch.all_objects,
+ N_("show all objects with --batch or --batch-check")),
OPT_END()
};
usage_with_options(cat_file_usage, options);
}
- if (batch.follow_symlinks && !batch.enabled) {
+ if ((batch.follow_symlinks || batch.all_objects) && !batch.enabled) {
usage_with_options(cat_file_usage, options);
}
test_cmp expect actual
'
+test_expect_success 'cat-file --batch-all-objects shows all objects' '
+ # make new repos so we now the full set of objects; we will
+ # also make sure that there are some packed and some loose
+ # objects, some referenced and some not, and that there are
+ # some available only via alternates.
+ git init all-one &&
+ (
+ cd all-one &&
+ echo content >file &&
+ git add file &&
+ git commit -qm base &&
+ git rev-parse HEAD HEAD^{tree} HEAD:file &&
+ git repack -ad &&
+ echo not-cloned | git hash-object -w --stdin
+ ) >expect.unsorted &&
+ git clone -s all-one all-two &&
+ (
+ cd all-two &&
+ echo local-unref | git hash-object -w --stdin
+ ) >>expect.unsorted &&
+ sort <expect.unsorted >expect &&
+ git -C all-two cat-file --batch-all-objects \
+ --batch-check="%(objectname)" >actual.unsorted &&
+ sort <actual.unsorted >actual &&
+ test_cmp expect actual
+'
+
test_done