Code

Merge branch 'jc/fetch-param'
authorJunio C Hamano <gitster@pobox.com>
Sun, 7 Mar 2010 20:47:16 +0000 (12:47 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sun, 7 Mar 2010 20:47:16 +0000 (12:47 -0800)
* jc/fetch-param:
  fetch --all/--multiple: keep all the fetched branch information
  builtin-fetch --all/--multi: propagate options correctly
  t5521: fix and modernize

builtin-fetch.c
t/t5521-pull-options.sh

index d3b9d8a1338474608b8c7af1df4421d7fa058a81..b6c5b344be8e8abb90cf3f03d3cea2600511787f 100644 (file)
@@ -651,6 +651,17 @@ static void check_not_current_branch(struct ref *ref_map)
                            "of non-bare repository", current_branch->refname);
 }
 
+static int truncate_fetch_head(void)
+{
+       char *filename = git_path("FETCH_HEAD");
+       FILE *fp = fopen(filename, "w");
+
+       if (!fp)
+               return error("cannot open %s: %s\n", filename, strerror(errno));
+       fclose(fp);
+       return 0;
+}
+
 static int do_fetch(struct transport *transport,
                    struct refspec *refs, int ref_count)
 {
@@ -672,11 +683,9 @@ static int do_fetch(struct transport *transport,
 
        /* if not appending, truncate FETCH_HEAD */
        if (!append && !dry_run) {
-               char *filename = git_path("FETCH_HEAD");
-               FILE *fp = fopen(filename, "w");
-               if (!fp)
-                       return error("cannot open %s: %s\n", filename, strerror(errno));
-               fclose(fp);
+               int errcode = truncate_fetch_head();
+               if (errcode)
+                       return errcode;
        }
 
        ref_map = get_ref_map(transport, refs, ref_count, tags, &autotags);
@@ -784,13 +793,19 @@ static int add_remote_or_group(const char *name, struct string_list *list)
 static int fetch_multiple(struct string_list *list)
 {
        int i, result = 0;
-       const char *argv[] = { "fetch", NULL, NULL, NULL, NULL, NULL, NULL };
-       int argc = 1;
+       const char *argv[11] = { "fetch", "--append" };
+       int argc = 2;
 
        if (dry_run)
                argv[argc++] = "--dry-run";
        if (prune)
                argv[argc++] = "--prune";
+       if (update_head_ok)
+               argv[argc++] = "--update-head-ok";
+       if (force)
+               argv[argc++] = "--force";
+       if (keep)
+               argv[argc++] = "--keep";
        if (verbosity >= 2)
                argv[argc++] = "-v";
        if (verbosity >= 1)
@@ -798,9 +813,16 @@ static int fetch_multiple(struct string_list *list)
        else if (verbosity < 0)
                argv[argc++] = "-q";
 
+       if (!append && !dry_run) {
+               int errcode = truncate_fetch_head();
+               if (errcode)
+                       return errcode;
+       }
+
        for (i = 0; i < list->nr; i++) {
                const char *name = list->items[i].string;
                argv[argc] = name;
+               argv[argc + 1] = NULL;
                if (verbosity >= 0)
                        printf("Fetching %s\n", name);
                if (run_command_v_opt(argv, RUN_GIT_CMD)) {
index 83e2e8ab800a2f664085b7350272727748512e42..1b06691bb41586b3bc564841b720ce710f927a1c 100755 (executable)
@@ -4,8 +4,6 @@ test_description='pull options'
 
 . ./test-lib.sh
 
-D=`pwd`
-
 test_expect_success 'setup' '
        mkdir parent &&
        (cd parent && git init &&
@@ -13,48 +11,83 @@ test_expect_success 'setup' '
         git commit -m one)
 '
 
-cd "$D"
-
 test_expect_success 'git pull -q' '
        mkdir clonedq &&
-       cd clonedq &&
-       git pull -q "$D/parent" >out 2>err &&
-       test ! -s out
+       (cd clonedq && git init &&
+       git pull -q "../parent" >out 2>err &&
+       test ! -s err &&
+       test ! -s out)
 '
 
-cd "$D"
-
 test_expect_success 'git pull' '
        mkdir cloned &&
-       cd cloned &&
-       git pull "$D/parent" >out 2>err &&
-       test -s out
+       (cd cloned && git init &&
+       git pull "../parent" >out 2>err &&
+       test -s err &&
+       test ! -s out)
 '
-cd "$D"
 
 test_expect_success 'git pull -v' '
        mkdir clonedv &&
-       cd clonedv &&
-       git pull -v "$D/parent" >out 2>err &&
-       test -s out
+       (cd clonedv && git init &&
+       git pull -v "../parent" >out 2>err &&
+       test -s err &&
+       test ! -s out)
 '
 
-cd "$D"
-
 test_expect_success 'git pull -v -q' '
        mkdir clonedvq &&
-       cd clonedvq &&
-       git pull -v -q "$D/parent" >out 2>err &&
-       test ! -s out
+       (cd clonedvq && git init &&
+       git pull -v -q "../parent" >out 2>err &&
+       test ! -s out &&
+       test ! -s err)
 '
 
-cd "$D"
-
 test_expect_success 'git pull -q -v' '
        mkdir clonedqv &&
-       cd clonedqv &&
-       git pull -q -v "$D/parent" >out 2>err &&
-       test -s out
+       (cd clonedqv && git init &&
+       git pull -q -v "../parent" >out 2>err &&
+       test ! -s out &&
+       test -s err)
+'
+
+test_expect_success 'git pull --force' '
+       mkdir clonedoldstyle &&
+       (cd clonedoldstyle && git init &&
+       cat >>.git/config <<-\EOF &&
+       [remote "one"]
+               url = ../parent
+               fetch = refs/heads/master:refs/heads/mirror
+       [remote "two"]
+               url = ../parent
+               fetch = refs/heads/master:refs/heads/origin
+       [branch "master"]
+               remote = two
+               merge = refs/heads/master
+       EOF
+       git pull two &&
+       test_commit A &&
+       git branch -f origin &&
+       git pull --all --force
+       )
+'
+
+test_expect_success 'git pull --all' '
+       mkdir clonedmulti &&
+       (cd clonedmulti && git init &&
+       cat >>.git/config <<-\EOF &&
+       [remote "one"]
+               url = ../parent
+               fetch = refs/heads/*:refs/remotes/one/*
+       [remote "two"]
+               url = ../parent
+               fetch = refs/heads/*:refs/remotes/two/*
+       [branch "master"]
+               remote = one
+               merge = refs/heads/master
+       EOF
+       git pull --all
+       )
 '
 
 test_done