summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@g5.osdl.org>2005-07-16 13:26:33 -0700
committerLinus Torvalds <torvalds@g5.osdl.org>2005-07-16 13:26:33 -0700
commitd089391c0058f500768bb68f3bee7af78975de58 (patch)
tree90ff4d76cc9b96184811ba96cfcf7b2a408ad3e8
parent9c2b1c0cd89d8cc8a3882e85c6b6535f282bf59f (diff)
downloadgit-d089391c0058f500768bb68f3bee7af78975de58.tar.gz
git-send-pack: add "--all" option to send all refs to the other side
This affects only refs that the other side doesn't already have. The ones it has are still filtered by the ref selection.
-rw-r--r--send-pack.c38
1 files changed, 28 insertions, 10 deletions
diff --git a/send-pack.c b/send-pack.c
index 02d1d52c24..abc4d1f000 100644
--- a/send-pack.c
+++ b/send-pack.c
@@ -5,6 +5,7 @@
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;
@@ -137,15 +138,24 @@ static int ref_newer(const unsigned char *new_sha1, const unsigned char *old_sha
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);
@@ -153,8 +163,8 @@ static int try_to_match(const char *refname, const unsigned char *sha1)
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;
}
@@ -225,7 +235,8 @@ static int send_pack(int in, int out, int nr_match, char **match)
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);
}
@@ -260,19 +271,26 @@ int main(int argc, char **argv)
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)