merge: backport GIT_MERGE_AUTOEDIT support

Even though 1.7.9.x series does not open the editor by default
when merging in general, it does do so in one occassion: when
merging an annotated tag. And worse yet, there is no good way
for older scripts to decline this.

Backport the support for GIT_MERGE_AUTOEDIT environment variable
from 1.7.10 track to help those stuck on 1.7.9.x maintenance
track.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano 2012-03-20 15:39:10 -07:00
parent a46034819e
commit d387868a7d
2 changed files with 40 additions and 3 deletions

View file

@ -8,9 +8,19 @@ failed and do not autocommit, to give the user a chance to
inspect and further tweak the merge result before committing.
--edit::
-e::
--no-edit::
Invoke editor before committing successful merge to further
edit the default merge message.
edit the default merge message. The `--no-edit` option can be
used to accept the auto-generated message (this is generally
discouraged) when merging an annotated tag, in which case
`git merge` automatically spawns the editor so that the result
of the GPG verification of the tag can be seen.
+
Older scripts may depend on the historical behaviour of not allowing the
user to edit the merge log message. They will see an editor opened when
they run `git merge` to merge an annotated tag. To make it easier to adjust
such scripts to the updated behaviour, the environment variable
`GIT_MERGE_AUTOEDIT` can be set to `no` at the beginning of them.
--ff::
When the merge resolves as a fast-forward, only update the branch

View file

@ -1109,6 +1109,33 @@ static void write_merge_state(void)
close(fd);
}
static int default_edit_option(void)
{
static const char name[] = "GIT_MERGE_AUTOEDIT";
const char *e = getenv(name);
struct stat st_stdin, st_stdout;
if (have_message)
/* an explicit -m msg without --[no-]edit */
return 0;
if (e) {
int v = git_config_maybe_bool(name, e);
if (v < 0)
die("Bad value '%s' in environment '%s'", e, name);
return v;
}
/* Use editor if stdin and stdout are the same and is a tty */
return (!fstat(0, &st_stdin) &&
!fstat(1, &st_stdout) &&
isatty(0) && isatty(1) &&
st_stdin.st_dev == st_stdout.st_dev &&
st_stdin.st_ino == st_stdout.st_ino &&
st_stdin.st_mode == st_stdout.st_mode);
}
int cmd_merge(int argc, const char **argv, const char *prefix)
{
unsigned char result_tree[20];
@ -1298,7 +1325,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
merge_remote_util(commit)->obj &&
merge_remote_util(commit)->obj->type == OBJ_TAG) {
if (option_edit < 0)
option_edit = 1;
option_edit = default_edit_option();
allow_fast_forward = 0;
}
}