Merge branch 'ac/auto-comment-char-fix'
"git commit" that concludes a conflicted merge failed to notice and remove existing comment added automatically (like "# Conflicts:") when the core.commentstring is set to 'auto'. * ac/auto-comment-char-fix: config: set comment_line_str to "#" when core.commentChar=auto commit: avoid scanning trailing comments when 'core.commentChar' is "auto"
This commit is contained in:
@@ -688,6 +688,10 @@ static void adjust_comment_line_char(const struct strbuf *sb)
|
|||||||
char candidates[] = "#;@!$%^&|:";
|
char candidates[] = "#;@!$%^&|:";
|
||||||
char *candidate;
|
char *candidate;
|
||||||
const char *p;
|
const char *p;
|
||||||
|
size_t cutoff;
|
||||||
|
|
||||||
|
/* Ignore comment chars in trailing comments (e.g., Conflicts:) */
|
||||||
|
cutoff = sb->len - ignored_log_message_bytes(sb->buf, sb->len);
|
||||||
|
|
||||||
if (!memchr(sb->buf, candidates[0], sb->len)) {
|
if (!memchr(sb->buf, candidates[0], sb->len)) {
|
||||||
free(comment_line_str_to_free);
|
free(comment_line_str_to_free);
|
||||||
@@ -700,7 +704,7 @@ static void adjust_comment_line_char(const struct strbuf *sb)
|
|||||||
candidate = strchr(candidates, *p);
|
candidate = strchr(candidates, *p);
|
||||||
if (candidate)
|
if (candidate)
|
||||||
*candidate = ' ';
|
*candidate = ' ';
|
||||||
for (p = sb->buf; *p; p++) {
|
for (p = sb->buf; p + 1 < sb->buf + cutoff; p++) {
|
||||||
if ((p[0] == '\n' || p[0] == '\r') && p[1]) {
|
if ((p[0] == '\n' || p[0] == '\r') && p[1]) {
|
||||||
candidate = strchr(candidates, p[1]);
|
candidate = strchr(candidates, p[1]);
|
||||||
if (candidate)
|
if (candidate)
|
||||||
|
|||||||
6
config.c
6
config.c
@@ -1534,9 +1534,11 @@ static int git_default_core_config(const char *var, const char *value,
|
|||||||
!strcmp(var, "core.commentstring")) {
|
!strcmp(var, "core.commentstring")) {
|
||||||
if (!value)
|
if (!value)
|
||||||
return config_error_nonbool(var);
|
return config_error_nonbool(var);
|
||||||
else if (!strcasecmp(value, "auto"))
|
else if (!strcasecmp(value, "auto")) {
|
||||||
auto_comment_line_char = 1;
|
auto_comment_line_char = 1;
|
||||||
else if (value[0]) {
|
FREE_AND_NULL(comment_line_str_to_free);
|
||||||
|
comment_line_str = "#";
|
||||||
|
} else if (value[0]) {
|
||||||
if (strchr(value, '\n'))
|
if (strchr(value, '\n'))
|
||||||
return error(_("%s cannot contain newline"), var);
|
return error(_("%s cannot contain newline"), var);
|
||||||
comment_line_str = value;
|
comment_line_str = value;
|
||||||
|
|||||||
@@ -328,6 +328,19 @@ test_expect_success 'there is no --no-reschedule-failed-exec in an ongoing rebas
|
|||||||
test_expect_code 129 git rebase --edit-todo --no-reschedule-failed-exec
|
test_expect_code 129 git rebase --edit-todo --no-reschedule-failed-exec
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'no change in comment character due to conflicts markers with core.commentChar=auto' '
|
||||||
|
git checkout -b branch-a &&
|
||||||
|
test_commit A F1 &&
|
||||||
|
git checkout -b branch-b HEAD^ &&
|
||||||
|
test_commit B F1 &&
|
||||||
|
test_must_fail git rebase branch-a &&
|
||||||
|
printf "B\nA\n" >F1 &&
|
||||||
|
git add F1 &&
|
||||||
|
GIT_EDITOR="cat >actual" git -c core.commentChar=auto rebase --continue &&
|
||||||
|
# Check that "#" is still the comment character.
|
||||||
|
test_grep "^# Changes to be committed" actual
|
||||||
|
'
|
||||||
|
|
||||||
test_orig_head_helper () {
|
test_orig_head_helper () {
|
||||||
test_when_finished 'git rebase --abort &&
|
test_when_finished 'git rebase --abort &&
|
||||||
git checkout topic &&
|
git checkout topic &&
|
||||||
|
|||||||
Reference in New Issue
Block a user