Merge branch 'jc/graduate-remote-hg-bzr' (early part)
* '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'"
This commit is contained in:
commit
00a5b79466
@ -88,10 +88,6 @@ UI, Workflows & Features
|
|||||||
* "git grep" learned to behave in a way similar to native grep when
|
* "git grep" learned to behave in a way similar to native grep when
|
||||||
"-h" (no header) and "-c" (count) options are given.
|
"-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".
|
* The "simple" mode is the default for "git push".
|
||||||
|
|
||||||
* "git add -u" and "git add -A", when run without any pathspec, is a
|
* "git add -u" and "git add -A", when run without any pathspec, is a
|
||||||
|
19
contrib/remote-helpers/README
Normal file
19
contrib/remote-helpers/README
Normal file
@ -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.
|
@ -43,6 +43,9 @@ import re
|
|||||||
import StringIO
|
import StringIO
|
||||||
import atexit, shutil, hashlib, urlparse, subprocess
|
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('^([^<>]+)')
|
NAME_RE = re.compile('^([^<>]+)')
|
||||||
AUTHOR_RE = re.compile('^([^<>]+?)? ?[<>]([^<>]*)(?:$|>)')
|
AUTHOR_RE = re.compile('^([^<>]+?)? ?[<>]([^<>]*)(?:$|>)')
|
||||||
EMAIL_RE = re.compile(r'([^ \t<>]+@[^ \t<>]+)')
|
EMAIL_RE = re.compile(r'([^ \t<>]+@[^ \t<>]+)')
|
||||||
|
@ -25,6 +25,9 @@ import atexit
|
|||||||
import urlparse, hashlib
|
import urlparse, hashlib
|
||||||
import time as ptime
|
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:
|
# If you want to see Mercurial revisions as Git commit notes:
|
||||||
# git config core.notesRef refs/notes/hg
|
# git config core.notesRef refs/notes/hg
|
||||||
|
@ -212,30 +212,19 @@ test_expect_success 'push update refs failure' '
|
|||||||
echo "update fail" >>file &&
|
echo "update fail" >>file &&
|
||||||
git commit -a -m "update fail" &&
|
git commit -a -m "update fail" &&
|
||||||
git rev-parse --verify testgit/origin/heads/update >expect &&
|
git rev-parse --verify testgit/origin/heads/update >expect &&
|
||||||
test_expect_code 1 env GIT_REMOTE_TESTGIT_FAILURE="non-fast forward" \
|
GIT_REMOTE_TESTGIT_PUSH_ERROR="non-fast forward" &&
|
||||||
git push origin update &&
|
export GIT_REMOTE_TESTGIT_PUSH_ERROR &&
|
||||||
|
test_expect_code 1 git push origin update &&
|
||||||
git rev-parse --verify testgit/origin/heads/update >actual &&
|
git rev-parse --verify testgit/origin/heads/update >actual &&
|
||||||
test_cmp expect 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' '
|
test_expect_success 'proper failure checks for fetching' '
|
||||||
(cd local &&
|
(GIT_REMOTE_TESTGIT_FAILURE=1 &&
|
||||||
test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git fetch 2>error &&
|
export GIT_REMOTE_TESTGIT_FAILURE &&
|
||||||
|
cd local &&
|
||||||
|
test_must_fail git fetch 2> error &&
|
||||||
cat error &&
|
cat error &&
|
||||||
grep -q "Error while running fast-import" 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' '
|
test_expect_success 'proper failure checks for pushing' '
|
||||||
(cd local &&
|
(cd local &&
|
||||||
git checkout -b crash master &&
|
test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git push --all
|
||||||
echo crash >>file &&
|
|
||||||
git commit -a -m crash &&
|
|
||||||
test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git push --all &&
|
|
||||||
cmp_marks origin
|
|
||||||
)
|
)
|
||||||
'
|
'
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ static int recvline_fh(FILE *helper, struct strbuf *buffer, const char *name)
|
|||||||
if (strbuf_getline(buffer, helper, '\n') == EOF) {
|
if (strbuf_getline(buffer, helper, '\n') == EOF) {
|
||||||
if (debug)
|
if (debug)
|
||||||
fprintf(stderr, "Debug: Remote helper quit.\n");
|
fprintf(stderr, "Debug: Remote helper quit.\n");
|
||||||
return 1;
|
exit(128);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (debug)
|
if (debug)
|
||||||
@ -71,6 +71,12 @@ static int recvline(struct helper_data *helper, struct strbuf *buffer)
|
|||||||
return recvline_fh(helper->out, buffer, helper->name);
|
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)
|
static void write_constant(int fd, const char *str)
|
||||||
{
|
{
|
||||||
if (debug)
|
if (debug)
|
||||||
@ -157,8 +163,7 @@ static struct child_process *get_helper(struct transport *transport)
|
|||||||
while (1) {
|
while (1) {
|
||||||
const char *capname;
|
const char *capname;
|
||||||
int mandatory = 0;
|
int mandatory = 0;
|
||||||
if (recvline(data, &buf))
|
recvline(data, &buf);
|
||||||
exit(128);
|
|
||||||
|
|
||||||
if (!*buf.buf)
|
if (!*buf.buf)
|
||||||
break;
|
break;
|
||||||
@ -195,9 +200,15 @@ static struct child_process *get_helper(struct transport *transport)
|
|||||||
} else if (!strcmp(capname, "signed-tags")) {
|
} else if (!strcmp(capname, "signed-tags")) {
|
||||||
data->signed_tags = 1;
|
data->signed_tags = 1;
|
||||||
} else if (starts_with(capname, "export-marks ")) {
|
} 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")) {
|
} 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")) {
|
} else if (starts_with(capname, "no-private-update")) {
|
||||||
data->no_private_update = 1;
|
data->no_private_update = 1;
|
||||||
} else if (mandatory) {
|
} else if (mandatory) {
|
||||||
@ -296,9 +307,7 @@ static int set_helper_option(struct transport *transport,
|
|||||||
quote_c_style(value, &buf, NULL, 0);
|
quote_c_style(value, &buf, NULL, 0);
|
||||||
strbuf_addch(&buf, '\n');
|
strbuf_addch(&buf, '\n');
|
||||||
|
|
||||||
sendline(data, &buf);
|
xchgline(data, &buf);
|
||||||
if (recvline(data, &buf))
|
|
||||||
exit(128);
|
|
||||||
|
|
||||||
if (!strcmp(buf.buf, "ok"))
|
if (!strcmp(buf.buf, "ok"))
|
||||||
ret = 0;
|
ret = 0;
|
||||||
@ -370,8 +379,7 @@ static int fetch_with_fetch(struct transport *transport,
|
|||||||
sendline(data, &buf);
|
sendline(data, &buf);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
if (recvline(data, &buf))
|
recvline(data, &buf);
|
||||||
exit(128);
|
|
||||||
|
|
||||||
if (starts_with(buf.buf, "lock ")) {
|
if (starts_with(buf.buf, "lock ")) {
|
||||||
const char *name = buf.buf + 5;
|
const char *name = buf.buf + 5;
|
||||||
@ -422,8 +430,6 @@ static int get_exporter(struct transport *transport,
|
|||||||
struct helper_data *data = transport->data;
|
struct helper_data *data = transport->data;
|
||||||
struct child_process *helper = get_helper(transport);
|
struct child_process *helper = get_helper(transport);
|
||||||
int argc = 0, i;
|
int argc = 0, i;
|
||||||
struct strbuf tmp = STRBUF_INIT;
|
|
||||||
|
|
||||||
memset(fastexport, 0, sizeof(*fastexport));
|
memset(fastexport, 0, sizeof(*fastexport));
|
||||||
|
|
||||||
/* we need to duplicate helper->in because we want to use it after
|
/* 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++] = "--use-done-feature";
|
||||||
fastexport->argv[argc++] = data->signed_tags ?
|
fastexport->argv[argc++] = data->signed_tags ?
|
||||||
"--signed-tags=verbatim" : "--signed-tags=warn-strip";
|
"--signed-tags=verbatim" : "--signed-tags=warn-strip";
|
||||||
if (data->export_marks) {
|
if (data->export_marks)
|
||||||
strbuf_addf(&tmp, "--export-marks=%s.tmp", data->export_marks);
|
fastexport->argv[argc++] = data->export_marks;
|
||||||
fastexport->argv[argc++] = strbuf_detach(&tmp, NULL);
|
if (data->import_marks)
|
||||||
}
|
fastexport->argv[argc++] = data->import_marks;
|
||||||
if (data->import_marks) {
|
|
||||||
strbuf_addf(&tmp, "--import-marks=%s", data->import_marks);
|
|
||||||
fastexport->argv[argc++] = strbuf_detach(&tmp, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < revlist_args->nr; i++)
|
for (i = 0; i < revlist_args->nr; i++)
|
||||||
fastexport->argv[argc++] = revlist_args->items[i].string;
|
fastexport->argv[argc++] = revlist_args->items[i].string;
|
||||||
@ -561,9 +563,7 @@ static int process_connect_service(struct transport *transport,
|
|||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
sendline(data, &cmdbuf);
|
sendline(data, &cmdbuf);
|
||||||
if (recvline_fh(input, &cmdbuf, name))
|
recvline_fh(input, &cmdbuf, name);
|
||||||
exit(128);
|
|
||||||
|
|
||||||
if (!strcmp(cmdbuf.buf, "")) {
|
if (!strcmp(cmdbuf.buf, "")) {
|
||||||
data->no_disconnect_req = 1;
|
data->no_disconnect_req = 1;
|
||||||
if (debug)
|
if (debug)
|
||||||
@ -739,22 +739,16 @@ static int push_update_ref_status(struct strbuf *buf,
|
|||||||
return !(status == REF_STATUS_OK);
|
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,
|
struct ref *remote_refs,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
struct ref *ref = remote_refs;
|
struct ref *ref = remote_refs;
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
char *private;
|
char *private;
|
||||||
|
|
||||||
if (recvline(data, &buf)) {
|
recvline(data, &buf);
|
||||||
ret = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!buf.len)
|
if (!buf.len)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -772,7 +766,6 @@ static int push_update_refs_status(struct helper_data *data,
|
|||||||
free(private);
|
free(private);
|
||||||
}
|
}
|
||||||
strbuf_release(&buf);
|
strbuf_release(&buf);
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int push_refs_with_push(struct transport *transport,
|
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);
|
sendline(data, &buf);
|
||||||
strbuf_release(&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,
|
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))
|
if (finish_command(&exporter))
|
||||||
die("Error while running fast-export");
|
die("Error while running fast-export");
|
||||||
if (push_update_refs_status(data, remote_refs, flags))
|
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -988,8 +974,7 @@ static struct ref *get_refs_list(struct transport *transport, int for_push)
|
|||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
char *eov, *eon;
|
char *eov, *eon;
|
||||||
if (recvline(data, &buf))
|
recvline(data, &buf);
|
||||||
exit(128);
|
|
||||||
|
|
||||||
if (!*buf.buf)
|
if (!*buf.buf)
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user