aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--builtin/index-pack.c14
-rw-r--r--builtin/unpack-objects.c16
-rw-r--r--packfile.c17
-rw-r--r--packfile.h6
4 files changed, 30 insertions, 23 deletions
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index 763b01372a..bab42dfc2a 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -1801,18 +1801,10 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
nr_threads = 1;
}
} else if (starts_with(arg, "--pack_header=")) {
- struct pack_header *hdr;
- char *c;
-
- hdr = (struct pack_header *)input_buffer;
- hdr->hdr_signature = htonl(PACK_SIGNATURE);
- hdr->hdr_version = htonl(strtoul(arg + 14, &c, 10));
- if (*c != ',')
- die(_("bad %s"), arg);
- hdr->hdr_entries = htonl(strtoul(c + 1, &c, 10));
- if (*c)
+ if (parse_pack_header_option(arg + 14,
+ input_buffer,
+ &input_len) < 0)
die(_("bad %s"), arg);
- input_len = sizeof(*hdr);
} else if (!strcmp(arg, "-v")) {
verbose = 1;
} else if (!strcmp(arg, "--progress-title")) {
diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c
index 08fa2a7a74..3161447274 100644
--- a/builtin/unpack-objects.c
+++ b/builtin/unpack-objects.c
@@ -15,6 +15,7 @@
#include "progress.h"
#include "decorate.h"
#include "fsck.h"
+#include "packfile.h"
static int dry_run, quiet, recover, has_errors, strict;
static const char unpack_usage[] = "git unpack-objects [-n] [-q] [-r] [--strict]";
@@ -639,18 +640,9 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix UNUSED)
continue;
}
if (starts_with(arg, "--pack_header=")) {
- struct pack_header *hdr;
- char *c;
-
- hdr = (struct pack_header *)buffer;
- hdr->hdr_signature = htonl(PACK_SIGNATURE);
- hdr->hdr_version = htonl(strtoul(arg + 14, &c, 10));
- if (*c != ',')
- die("bad %s", arg);
- hdr->hdr_entries = htonl(strtoul(c + 1, &c, 10));
- if (*c)
- die("bad %s", arg);
- len = sizeof(*hdr);
+ if (parse_pack_header_option(arg + 14,
+ buffer, &len) < 0)
+ die(_("bad %s"), arg);
continue;
}
if (skip_prefix(arg, "--max-input-size=", &arg)) {
diff --git a/packfile.c b/packfile.c
index 813584646f..e2bdadc7cb 100644
--- a/packfile.c
+++ b/packfile.c
@@ -2294,3 +2294,20 @@ int is_promisor_object(const struct object_id *oid)
}
return oidset_contains(&promisor_objects, oid);
}
+
+int parse_pack_header_option(const char *in, unsigned char *out, unsigned int *len)
+{
+ struct pack_header *hdr;
+ char *c;
+
+ hdr = (struct pack_header *)out;
+ hdr->hdr_signature = htonl(PACK_SIGNATURE);
+ hdr->hdr_version = htonl(strtoul(in, &c, 10));
+ if (*c != ',')
+ return -1;
+ hdr->hdr_entries = htonl(strtoul(c + 1, &c, 10));
+ if (*c)
+ return -1;
+ *len = sizeof(*hdr);
+ return 0;
+}
diff --git a/packfile.h b/packfile.h
index eb18ec15db..41f38b4832 100644
--- a/packfile.h
+++ b/packfile.h
@@ -210,4 +210,10 @@ int is_promisor_object(const struct object_id *oid);
int load_idx(const char *path, const unsigned int hashsz, void *idx_map,
size_t idx_size, struct packed_git *p);
+/*
+ * Parse a --pack_header option as accepted by index-pack and unpack-objects,
+ * turning it into the matching bytes we'd find in a pack.
+ */
+int parse_pack_header_option(const char *in, unsigned char *out, unsigned int *len);
+
#endif