Merge branch 'jc/graduate-remote-hg-bzr' (early part)
authorJunio C Hamano <gitster@pobox.com>
Tue, 20 May 2014 00:12:36 +0000 (17:12 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 20 May 2014 00:12:36 +0000 (17:12 -0700)
* 'jc/graduate-remote-hg-bzr' (early part):
remote-helpers: point at their upstream repositories
contrib: remote-helpers: add move warnings (v2.0)
Revert "Merge branch 'fc/transport-helper-sync-error-fix'"

Documentation/RelNotes/2.0.0.txt
contrib/remote-helpers/README [new file with mode: 0644]
contrib/remote-helpers/git-remote-bzr
contrib/remote-helpers/git-remote-hg
t/t5801-remote-helpers.sh
transport-helper.c
index 6e628d47995c58c5d46cb3a737bb7f5a983e8ac6..97f7df04eccc1b2e156815f30ec65347eccf4c40 100644 (file)
@@ -88,10 +88,6 @@ UI, Workflows & Features
  * "git grep" learned to behave in a way similar to native grep when
    "-h" (no header) and "-c" (count) options are given.
 
- * "git push" via transport-helper interface (e.g. remote-hg) has
-   been updated to allow forced ref updates in a way similar to the
-   natively supported transports.
-
  * The "simple" mode is the default for "git push".
 
  * "git add -u" and "git add -A", when run without any pathspec, is a
diff --git a/contrib/remote-helpers/README b/contrib/remote-helpers/README
new file mode 100644 (file)
index 0000000..6ce8b1b
--- /dev/null
@@ -0,0 +1,19 @@
+The remote-helper bridges to access data stored in Mercurial and
+Bazaar are maintained outside the git.git tree in the repositories
+of its primary author:
+
+    https://github.com/felipec/git-remote-hg (for Mercurial)
+    https://github.com/felipec/git-remote-bzr (for Bazaar)
+
+You can pick a directory on your $PATH and download them from these
+repositories, e.g.:
+
+  $ wget -O $HOME/bin/git-remote-hg \
+    https://raw.github.com/felipec/git-remote-hg/master/git-remote-hg
+  $ wget -O $HOME/bin/git-remote-bzr \
+    https://raw.github.com/felipec/git-remote-bzr/master/git-remote-bzr
+  $ chmod +x $HOME/bin/git-remote-hg $HOME/bin/git-remote-bzr
+
+As a convenience, copies of the last-bundled version of these two
+remote-helper bridges are still kept here, but they may become
+stale over time.
index 9abb58e6ab45077bf9b5e01658438817ea9b7126..be4b9a34edc68b7112c925e6023d61805fffb91e 100755 (executable)
@@ -43,6 +43,9 @@ import re
 import StringIO
 import atexit, shutil, hashlib, urlparse, subprocess
 
+sys.stderr.write('WARNING: git-remote-bzr is now maintained independently.\n')
+sys.stderr.write('WARNING: For more information visit https://github.com/felipec/git-remote-bzr\n')
+
 NAME_RE = re.compile('^([^<>]+)')
 AUTHOR_RE = re.compile('^([^<>]+?)? ?[<>]([^<>]*)(?:$|>)')
 EMAIL_RE = re.compile(r'([^ \t<>]+@[^ \t<>]+)')
index 34cda027597f30ddacf340466778404f3705361d..989df66c199e7b702505c0740d81911fdcacc926 100755 (executable)
@@ -25,6 +25,9 @@ import atexit
 import urlparse, hashlib
 import time as ptime
 
+sys.stderr.write('WARNING: git-remote-hg is now maintained independently.\n')
+sys.stderr.write('WARNING: For more information visit https://github.com/felipec/git-remote-hg\n')
+
 #
 # If you want to see Mercurial revisions as Git commit notes:
 # git config core.notesRef refs/notes/hg
index a00a660763451d57b2a9537ec1b99fcfd0c9a831..25fd2e7f46cb559372125e08671445476cbf6022 100755 (executable)
@@ -212,30 +212,19 @@ test_expect_success 'push update refs failure' '
        echo "update fail" >>file &&
        git commit -a -m "update fail" &&
        git rev-parse --verify testgit/origin/heads/update >expect &&
-       test_expect_code 1 env GIT_REMOTE_TESTGIT_FAILURE="non-fast forward" \
-               git push origin update &&
+       GIT_REMOTE_TESTGIT_PUSH_ERROR="non-fast forward" &&
+       export GIT_REMOTE_TESTGIT_PUSH_ERROR &&
+       test_expect_code 1 git push origin update &&
        git rev-parse --verify testgit/origin/heads/update >actual &&
        test_cmp expect actual
        )
 '
 
-clean_mark () {
-       cut -f 2 -d ' ' "$1" |
-       git cat-file --batch-check |
-       grep commit |
-       sort >$(basename "$1")
-}
-
-cmp_marks () {
-       test_when_finished "rm -rf git.marks testgit.marks" &&
-       clean_mark ".git/testgit/$1/git.marks" &&
-       clean_mark ".git/testgit/$1/testgit.marks" &&
-       test_cmp git.marks testgit.marks
-}
-
 test_expect_success 'proper failure checks for fetching' '
-       (cd local &&
-       test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git fetch 2>error &&
+       (GIT_REMOTE_TESTGIT_FAILURE=1 &&
+       export GIT_REMOTE_TESTGIT_FAILURE &&
+       cd local &&
+       test_must_fail git fetch 2> error &&
        cat error &&
        grep -q "Error while running fast-import" error
        )
@@ -243,11 +232,7 @@ test_expect_success 'proper failure checks for fetching' '
 
 test_expect_success 'proper failure checks for pushing' '
        (cd local &&
-       git checkout -b crash master &&
-       echo crash >>file &&
-       git commit -a -m crash &&
-       test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git push --all &&
-       cmp_marks origin
+       test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git push --all
        )
 '
 
index b468e4f88e730f88a1d231a574585ace56e7066a..86e1679c1e0e1e58ebe5297f4c5f48ca1a1f6418 100644 (file)
@@ -58,7 +58,7 @@ static int recvline_fh(FILE *helper, struct strbuf *buffer, const char *name)
        if (strbuf_getline(buffer, helper, '\n') == EOF) {
                if (debug)
                        fprintf(stderr, "Debug: Remote helper quit.\n");
-               return 1;
+               exit(128);
        }
 
        if (debug)
@@ -71,6 +71,12 @@ static int recvline(struct helper_data *helper, struct strbuf *buffer)
        return recvline_fh(helper->out, buffer, helper->name);
 }
 
+static void xchgline(struct helper_data *helper, struct strbuf *buffer)
+{
+       sendline(helper, buffer);
+       recvline(helper, buffer);
+}
+
 static void write_constant(int fd, const char *str)
 {
        if (debug)
@@ -157,8 +163,7 @@ static struct child_process *get_helper(struct transport *transport)
        while (1) {
                const char *capname;
                int mandatory = 0;
-               if (recvline(data, &buf))
-                       exit(128);
+               recvline(data, &buf);
 
                if (!*buf.buf)
                        break;
@@ -195,9 +200,15 @@ static struct child_process *get_helper(struct transport *transport)
                } else if (!strcmp(capname, "signed-tags")) {
                        data->signed_tags = 1;
                } else if (starts_with(capname, "export-marks ")) {
-                       data->export_marks = xstrdup(capname + strlen("export-marks "));
+                       struct strbuf arg = STRBUF_INIT;
+                       strbuf_addstr(&arg, "--export-marks=");
+                       strbuf_addstr(&arg, capname + strlen("export-marks "));
+                       data->export_marks = strbuf_detach(&arg, NULL);
                } else if (starts_with(capname, "import-marks")) {
-                       data->import_marks = xstrdup(capname + strlen("import-marks "));
+                       struct strbuf arg = STRBUF_INIT;
+                       strbuf_addstr(&arg, "--import-marks=");
+                       strbuf_addstr(&arg, capname + strlen("import-marks "));
+                       data->import_marks = strbuf_detach(&arg, NULL);
                } else if (starts_with(capname, "no-private-update")) {
                        data->no_private_update = 1;
                } else if (mandatory) {
@@ -296,9 +307,7 @@ static int set_helper_option(struct transport *transport,
                quote_c_style(value, &buf, NULL, 0);
        strbuf_addch(&buf, '\n');
 
-       sendline(data, &buf);
-       if (recvline(data, &buf))
-               exit(128);
+       xchgline(data, &buf);
 
        if (!strcmp(buf.buf, "ok"))
                ret = 0;
@@ -370,8 +379,7 @@ static int fetch_with_fetch(struct transport *transport,
        sendline(data, &buf);
 
        while (1) {
-               if (recvline(data, &buf))
-                       exit(128);
+               recvline(data, &buf);
 
                if (starts_with(buf.buf, "lock ")) {
                        const char *name = buf.buf + 5;
@@ -422,8 +430,6 @@ static int get_exporter(struct transport *transport,
        struct helper_data *data = transport->data;
        struct child_process *helper = get_helper(transport);
        int argc = 0, i;
-       struct strbuf tmp = STRBUF_INIT;
-
        memset(fastexport, 0, sizeof(*fastexport));
 
        /* we need to duplicate helper->in because we want to use it after
@@ -434,14 +440,10 @@ static int get_exporter(struct transport *transport,
        fastexport->argv[argc++] = "--use-done-feature";
        fastexport->argv[argc++] = data->signed_tags ?
                "--signed-tags=verbatim" : "--signed-tags=warn-strip";
-       if (data->export_marks) {
-               strbuf_addf(&tmp, "--export-marks=%s.tmp", data->export_marks);
-               fastexport->argv[argc++] = strbuf_detach(&tmp, NULL);
-       }
-       if (data->import_marks) {
-               strbuf_addf(&tmp, "--import-marks=%s", data->import_marks);
-               fastexport->argv[argc++] = strbuf_detach(&tmp, NULL);
-       }
+       if (data->export_marks)
+               fastexport->argv[argc++] = data->export_marks;
+       if (data->import_marks)
+               fastexport->argv[argc++] = data->import_marks;
 
        for (i = 0; i < revlist_args->nr; i++)
                fastexport->argv[argc++] = revlist_args->items[i].string;
@@ -561,9 +563,7 @@ static int process_connect_service(struct transport *transport,
                goto exit;
 
        sendline(data, &cmdbuf);
-       if (recvline_fh(input, &cmdbuf, name))
-               exit(128);
-
+       recvline_fh(input, &cmdbuf, name);
        if (!strcmp(cmdbuf.buf, "")) {
                data->no_disconnect_req = 1;
                if (debug)
@@ -739,22 +739,16 @@ static int push_update_ref_status(struct strbuf *buf,
        return !(status == REF_STATUS_OK);
 }
 
-static int push_update_refs_status(struct helper_data *data,
+static void push_update_refs_status(struct helper_data *data,
                                    struct ref *remote_refs,
                                    int flags)
 {
        struct strbuf buf = STRBUF_INIT;
        struct ref *ref = remote_refs;
-       int ret = 0;
-
        for (;;) {
                char *private;
 
-               if (recvline(data, &buf)) {
-                       ret = 1;
-                       break;
-               }
-
+               recvline(data, &buf);
                if (!buf.len)
                        break;
 
@@ -772,7 +766,6 @@ static int push_update_refs_status(struct helper_data *data,
                free(private);
        }
        strbuf_release(&buf);
-       return ret;
 }
 
 static int push_refs_with_push(struct transport *transport,
@@ -853,7 +846,8 @@ static int push_refs_with_push(struct transport *transport,
        sendline(data, &buf);
        strbuf_release(&buf);
 
-       return push_update_refs_status(data, remote_refs, flags);
+       push_update_refs_status(data, remote_refs, flags);
+       return 0;
 }
 
 static int push_refs_with_export(struct transport *transport,
@@ -911,15 +905,7 @@ static int push_refs_with_export(struct transport *transport,
 
        if (finish_command(&exporter))
                die("Error while running fast-export");
-       if (push_update_refs_status(data, remote_refs, flags))
-               return 1;
-
-       if (data->export_marks) {
-               strbuf_addf(&buf, "%s.tmp", data->export_marks);
-               rename(buf.buf, data->export_marks);
-               strbuf_release(&buf);
-       }
-
+       push_update_refs_status(data, remote_refs, flags);
        return 0;
 }
 
@@ -988,8 +974,7 @@ static struct ref *get_refs_list(struct transport *transport, int for_push)
 
        while (1) {
                char *eov, *eon;
-               if (recvline(data, &buf))
-                       exit(128);
+               recvline(data, &buf);
 
                if (!*buf.buf)
                        break;