static const char send_pack_usage[] =
"git-send-pack [--exec=git-receive-pack] [host:]directory [heads]*";
static const char *exec = "git-receive-pack";
+static int send_all = 0;
struct ref {
struct ref *next;
static int local_ref_nr_match;
static char **local_ref_match;
-static struct ref **local_ref_list;
+static struct ref *local_ref_list;
+static struct ref **local_last_ref;
static int try_to_match(const char *refname, const unsigned char *sha1)
{
struct ref *ref;
int len;
- if (!path_match(refname, local_ref_nr_match, local_ref_match))
- return 0;
+ if (!path_match(refname, local_ref_nr_match, local_ref_match)) {
+ if (!send_all)
+ return 0;
+
+ /* If we have it listed already, skip it */
+ for (ref = local_ref_list ; ref ; ref = ref->next) {
+ if (!strcmp(ref->name, refname))
+ return 0;
+ }
+ }
len = strlen(refname)+1;
ref = xmalloc(sizeof(*ref) + len);
memcpy(ref->new_sha1, sha1, 20);
memcpy(ref->name, refname, len);
ref->next = NULL;
- *local_ref_list = ref;
- local_ref_list = &ref->next;
+ *local_last_ref = ref;
+ local_last_ref = &ref->next;
return 0;
}
if (nr_match) {
local_ref_nr_match = nr_match;
local_ref_match = match;
- local_ref_list = last_ref;
+ local_ref_list = ref_list;
+ local_last_ref = last_ref;
for_each_ref(try_to_match);
}
pid_t pid;
argv++;
- for (i = 1; i < argc; i++) {
- char *arg = *argv++;
+ for (i = 1; i < argc; i++, argv++) {
+ char *arg = *argv;
if (*arg == '-') {
if (!strncmp(arg, "--exec=", 7)) {
exec = arg + 7;
continue;
}
+ if (!strcmp(arg, "--all")) {
+ send_all = 1;
+ continue;
+ }
usage(send_pack_usage);
}
- dest = arg;
+ if (!dest) {
+ dest = arg;
+ continue;
+ }
heads = argv;
- nr_heads = argc - i -1;
+ nr_heads = argc - i;
break;
}
if (!dest)