зеркало из https://github.com/microsoft/git.git
Merge branch 'maint'
* maint: backmerge a few more fixes to 1.7.1.X series rev-parse: fix --parse-opt --keep-dashdash --stop-at-non-option fix git branch -m in presence of cross devices Conflicts: RelNotes builtin/rev-parse.c
This commit is contained in:
Коммит
fcd91f8de2
|
@ -0,0 +1,19 @@
|
|||
Git v1.7.1.2 Release Notes
|
||||
==========================
|
||||
|
||||
Fixes since v1.7.1.1
|
||||
--------------------
|
||||
|
||||
* "git commit" did not honor GIT_REFLOG_ACTION environment variable, resulting
|
||||
reflog messages for cherry-pick and revert actions to be recorded as "commit".
|
||||
|
||||
* "git clone/fetch/pull" issued an incorrect error message when a ref and
|
||||
a symref that points to the ref were updated at the same time. This
|
||||
obviously would update them to the same value, and should not result in
|
||||
an error condition.
|
||||
|
||||
* "git diff" inside a tree with many pathnames that have certain
|
||||
characters has become very slow in 1.7.0 by mistake.
|
||||
|
||||
* "git rev-parse --parseopt --stop-at-non-option" did not stop at non option
|
||||
when --keep-dashdash was in effect.
|
|
@ -407,8 +407,8 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix)
|
|||
ALLOC_GROW(opts, onb + 1, osz);
|
||||
memset(opts + onb, 0, sizeof(opts[onb]));
|
||||
argc = parse_options(argc, argv, prefix, opts, usage,
|
||||
keep_dashdash ? PARSE_OPT_KEEP_DASHDASH : 0 |
|
||||
stop_at_non_option ? PARSE_OPT_STOP_AT_NON_OPTION : 0 |
|
||||
(keep_dashdash ? PARSE_OPT_KEEP_DASHDASH : 0) |
|
||||
(stop_at_non_option ? PARSE_OPT_STOP_AT_NON_OPTION : 0) |
|
||||
PARSE_OPT_SHELL_EVAL);
|
||||
|
||||
strbuf_addf(&parsed, " --");
|
||||
|
|
21
refs.c
21
refs.c
|
@ -1090,6 +1090,15 @@ int delete_ref(const char *refname, const unsigned char *sha1, int delopt)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* People using contrib's git-new-workdir have .git/logs/refs ->
|
||||
* /some/other/path/.git/logs/refs, and that may live on another device.
|
||||
*
|
||||
* IOW, to avoid cross device rename errors, the temporary renamed log must
|
||||
* live into logs/refs.
|
||||
*/
|
||||
#define TMP_RENAMED_LOG "logs/refs/.tmp-renamed-log"
|
||||
|
||||
int rename_ref(const char *oldref, const char *newref, const char *logmsg)
|
||||
{
|
||||
static const char renamed_ref[] = "RENAMED-REF";
|
||||
|
@ -1123,8 +1132,8 @@ int rename_ref(const char *oldref, const char *newref, const char *logmsg)
|
|||
if (write_ref_sha1(lock, orig_sha1, logmsg))
|
||||
return error("unable to save current sha1 in %s", renamed_ref);
|
||||
|
||||
if (log && rename(git_path("logs/%s", oldref), git_path("tmp-renamed-log")))
|
||||
return error("unable to move logfile logs/%s to tmp-renamed-log: %s",
|
||||
if (log && rename(git_path("logs/%s", oldref), git_path(TMP_RENAMED_LOG)))
|
||||
return error("unable to move logfile logs/%s to "TMP_RENAMED_LOG": %s",
|
||||
oldref, strerror(errno));
|
||||
|
||||
if (delete_ref(oldref, orig_sha1, REF_NODEREF)) {
|
||||
|
@ -1150,7 +1159,7 @@ int rename_ref(const char *oldref, const char *newref, const char *logmsg)
|
|||
}
|
||||
|
||||
retry:
|
||||
if (log && rename(git_path("tmp-renamed-log"), git_path("logs/%s", newref))) {
|
||||
if (log && rename(git_path(TMP_RENAMED_LOG), git_path("logs/%s", newref))) {
|
||||
if (errno==EISDIR || errno==ENOTDIR) {
|
||||
/*
|
||||
* rename(a, b) when b is an existing
|
||||
|
@ -1163,7 +1172,7 @@ int rename_ref(const char *oldref, const char *newref, const char *logmsg)
|
|||
}
|
||||
goto retry;
|
||||
} else {
|
||||
error("unable to move logfile tmp-renamed-log to logs/%s: %s",
|
||||
error("unable to move logfile "TMP_RENAMED_LOG" to logs/%s: %s",
|
||||
newref, strerror(errno));
|
||||
goto rollback;
|
||||
}
|
||||
|
@ -1203,8 +1212,8 @@ int rename_ref(const char *oldref, const char *newref, const char *logmsg)
|
|||
error("unable to restore logfile %s from %s: %s",
|
||||
oldref, newref, strerror(errno));
|
||||
if (!logmoved && log &&
|
||||
rename(git_path("tmp-renamed-log"), git_path("logs/%s", oldref)))
|
||||
error("unable to restore logfile %s from tmp-renamed-log: %s",
|
||||
rename(git_path(TMP_RENAMED_LOG), git_path("logs/%s", oldref)))
|
||||
error("unable to restore logfile %s from "TMP_RENAMED_LOG": %s",
|
||||
oldref, strerror(errno));
|
||||
|
||||
return 1;
|
||||
|
|
|
@ -81,4 +81,22 @@ test_expect_success 'test --parseopt --keep-dashdash' '
|
|||
test_cmp expect output
|
||||
'
|
||||
|
||||
cat >expect <<EOF
|
||||
set -- --foo -- '--' 'arg' '--spam=ham'
|
||||
EOF
|
||||
|
||||
test_expect_success 'test --parseopt --keep-dashdash --stop-at-non-option with --' '
|
||||
git rev-parse --parseopt --keep-dashdash --stop-at-non-option -- --foo -- arg --spam=ham <optionspec >output &&
|
||||
test_cmp expect output
|
||||
'
|
||||
|
||||
cat > expect <<EOF
|
||||
set -- --foo -- 'arg' '--spam=ham'
|
||||
EOF
|
||||
|
||||
test_expect_success 'test --parseopt --keep-dashdash --stop-at-non-option without --' '
|
||||
git rev-parse --parseopt --keep-dashdash --stop-at-non-option -- --foo arg --spam=ham <optionspec >output &&
|
||||
test_cmp expect output
|
||||
'
|
||||
|
||||
test_done
|
||||
|
|
Загрузка…
Ссылка в новой задаче