Create git-prime-clone, a program to be executed on the server that
returns the location and type of static resource to download before
performing the rest of a clone.
Additionally, as this executable's location will be configurable (see:
upload-pack and receive-pack), add the program to
BINDIR_PROGRAMS_NEED_X, in addition to the usual builtin places. Add
git-prime-clone executable to gitignore, as well
Signed-off-by: Kevin Wern
---
.gitignore| 1 +
Documentation/git-prime-clone.txt | 39
Makefile | 2 +
builtin.h | 1 +
builtin/prime-clone.c | 77 +++
git.c | 1 +
6 files changed, 121 insertions(+)
create mode 100644 Documentation/git-prime-clone.txt
create mode 100644 builtin/prime-clone.c
diff --git a/.gitignore b/.gitignore
index 5087ce1..bfea25c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -106,6 +106,7 @@
/git-pack-refs
/git-parse-remote
/git-patch-id
+/git-prime-clone
/git-prune
/git-prune-packed
/git-pull
diff --git a/Documentation/git-prime-clone.txt
b/Documentation/git-prime-clone.txt
new file mode 100644
index 000..fc5917d
--- /dev/null
+++ b/Documentation/git-prime-clone.txt
@@ -0,0 +1,39 @@
+git-prime-clone(1)
+
+
+NAME
+
+git-prime-clone - Get the location of an alternate resource
+to fetch before clone
+
+
+SYNOPSIS
+
+[verse]
+'git prime-clone' [--strict]
+
+DESCRIPTION
+---
+
+Outputs the resource, if configured to do so. Otherwise, returns
+nothing (packet flush ).
+
+CONFIGURE
+-
+
+primeclone.url::
+ The full url of the resource (e.g.
+ http://examplehost/pack-$NAME.pack).
+
+primeclone.filetype::
+ The type of the resource (e.g. pack).
+
+primeclone.enabled::
+ When 'false', git-prime-clone will return an empty response,
+ regardless of what the rest of the configuration specifies;
+ otherwise, it will return the configured response. Is 'true'
+ by default.
+
+GIT
+---
+Part of the linkgit:git[1] suite
diff --git a/Makefile b/Makefile
index 24bef8d..f2564ec 100644
--- a/Makefile
+++ b/Makefile
@@ -648,6 +648,7 @@ OTHER_PROGRAMS = git$X
# what test wrappers are needed and 'install' will install, in bindir
BINDIR_PROGRAMS_NEED_X += git
BINDIR_PROGRAMS_NEED_X += git-upload-pack
+BINDIR_PROGRAMS_NEED_X += git-prime-clone
BINDIR_PROGRAMS_NEED_X += git-receive-pack
BINDIR_PROGRAMS_NEED_X += git-upload-archive
BINDIR_PROGRAMS_NEED_X += git-shell
@@ -904,6 +905,7 @@ BUILTIN_OBJS += builtin/pack-objects.o
BUILTIN_OBJS += builtin/pack-redundant.o
BUILTIN_OBJS += builtin/pack-refs.o
BUILTIN_OBJS += builtin/patch-id.o
+BUILTIN_OBJS += builtin/prime-clone.o
BUILTIN_OBJS += builtin/prune-packed.o
BUILTIN_OBJS += builtin/prune.o
BUILTIN_OBJS += builtin/pull.o
diff --git a/builtin.h b/builtin.h
index 6b95006..c9e2254 100644
--- a/builtin.h
+++ b/builtin.h
@@ -97,6 +97,7 @@ extern int cmd_notes(int argc, const char **argv, const char
*prefix);
extern int cmd_pack_objects(int argc, const char **argv, const char *prefix);
extern int cmd_pack_redundant(int argc, const char **argv, const char *prefix);
extern int cmd_patch_id(int argc, const char **argv, const char *prefix);
+extern int cmd_prime_clone(int argc, const char **argv, const char *prefix);
extern int cmd_prune(int argc, const char **argv, const char *prefix);
extern int cmd_prune_packed(int argc, const char **argv, const char *prefix);
extern int cmd_pull(int argc, const char **argv, const char *prefix);
diff --git a/builtin/prime-clone.c b/builtin/prime-clone.c
new file mode 100644
index 000..ce914d3
--- /dev/null
+++ b/builtin/prime-clone.c
@@ -0,0 +1,77 @@
+#include "cache.h"
+#include "parse-options.h"
+#include "pkt-line.h"
+
+static char const * const prime_clone_usage[] = {
+ N_("git prime-clone [--strict] "),
+ NULL
+};
+
+static unsigned int enabled = 1;
+static const char *url = NULL, *filetype = NULL;
+static int strict;
+
+static struct option prime_clone_options[] = {
+ OPT_BOOL(0, "strict", &strict, N_("Do not attempt /.git if "
+ "is not a git directory")),
+ OPT_END(),
+};
+
+static void prime_clone(void)
+{
+ if (!enabled) {
+ fprintf(stderr, _("prime-clone not enabled\n"));
+ }
+ else if (url && filetype){
+ packet_write(1, "%s %s\n", filetype, url);
+ }
+ else if (url || filetype) {
+ if (filetype)
+ fprintf(stderr, _("prime-clone not properly "
+ "configured: missing url\n"));
+ else if (url)
+ fprintf(stderr, _("prime-clone not properly "
+ "configured: missing filetype\n"));
+ }
+ packet_flush(1);
+}
+
+static int prime_clone_config(const char *v