Skip to content

Commit

Permalink
merge: backport GIT_MERGE_AUTOEDIT support
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
gitster committed Mar 20, 2012
1 parent a460348 commit d387868
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 3 deletions.
14 changes: 12 additions & 2 deletions Documentation/merge-options.txt
Expand Up @@ -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
Expand Down
29 changes: 28 additions & 1 deletion builtin/merge.c
Expand Up @@ -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];
Expand Down Expand Up @@ -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;
}
}
Expand Down

0 comments on commit d387868

Please sign in to comment.