From: Junio C Hamano <hidden> Date: 2016-06-15 22:59:15
Jens Lehmann [off-list ref] writes:
quoted
If we were introducing a divider line for machine consumption, I do
not think it is wise to let that line even translated...
Ok, but then it won't mean much to readers who don't understand
English. I assume prefixing all diff lines with "# " is out of
the question because of backwards compatibility, so what about
using a descriptive text together with a scissor line? The former
can be be translated (and won't make it into the commit message
because it starts with a "#") while the latter serves as a robust
divider line:
# Everything below the following line is a diff that will be removed.
# --------------------------------8<--------------------------------
Yeah, or swap them around if you are trying to protect the part
above the divider from getting contaminated by the noise.
When using the '-v' option of "git commit" the diff added to the commit
message temporarily for editing is stripped off after the user exited the
editor by searching for "\ndiff --git " and truncating the commmit message
there if it is found. But this approach has two problems: when the commit
message itself contains a line starting with "diff --git" it will be
truncated there prematurely. And when the "diff.submodule" setting is set
to "log", the diff may start with "Submodule <hash1>..<hash2>", which will
be left in the commit message while it shouldn't.
Fix that by introducing a special scissor separator line starting with the
comment character '#' followed by a line describing what it is for. The
scissor line is used to reliably detect the start of the diff so it can be
chopped off from the commit message, no matter what the user enters there.
Turn a known test failure fixed by this change into a successful test and
add another one for a diff starting with a submodule log.
Reported-by: Ari Pollak <redacted>
Signed-off-by: Jens Lehmann <redacted>
---
Am 13.11.2013 21:04, schrieb Junio C Hamano:
Jens Lehmann [off-list ref] writes:
quoted
quoted
If we were introducing a divider line for machine consumption, I do
not think it is wise to let that line even translated...
Ok, but then it won't mean much to readers who don't understand
English. I assume prefixing all diff lines with "# " is out of
the question because of backwards compatibility, so what about
using a descriptive text together with a scissor line? The former
can be be translated (and won't make it into the commit message
because it starts with a "#") while the latter serves as a robust
divider line:
# Everything below the following line is a diff that will be removed.
# --------------------------------8<--------------------------------
Yeah, or swap them around if you are trying to protect the part
above the divider from getting contaminated by the noise.
Ok, did that. I couldn't find another user of the verbose setting,
so emitting the scissor line together with the description inside
wt_status_print_verbose() should be ok (or did I miss something
here?). But currently these lines use the hardcoded '#' instead of
the status.displaycommentprefix configuration and ignores coloring,
looks like I need to fix this in the next iteration.
builtin/commit.c | 6 +++---
t/t7507-commit-verbose.sh | 15 ++++++++++++++-
wt-status.c | 4 ++++
wt-status.h | 2 ++
4 files changed, 23 insertions(+), 4 deletions(-)
@@ -1602,9 +1602,9 @@ int cmd_commit(int argc, const char **argv, const char *prefix)/* Truncate the message just before the diff, if any. */if(verbose){-p=strstr(sb.buf,"\ndiff --git ");-if(p!=NULL)-strbuf_setlen(&sb,p-sb.buf+1);+p=strstr(sb.buf,wt_status_diff_divider);+if((p!=NULL)&&(p>sb.buf)&&(p[-1]=='\n'))+strbuf_setlen(&sb,p-sb.buf);}if(cleanup_mode!=CLEANUP_NONE)
@@ -65,9 +65,22 @@ test_expect_success 'diff in message is retained without -v' 'check_messagediff'-test_expect_failure'diff in message is retained with -v''+test_expect_success'diff in message is retained with -v''gitcommit--amend-Fdiff-v&&check_messagediff'+test_expect_success'submodule log is stripped out too with -v''+gitconfigdiff.submodulelog&&+gitsubmoduleadd./.sub&&+gitcommit-m"sub added"&&+(+cdsub&&+echo"more">>file&&+gitcommit-a-m"submodule commit"+)&&+GIT_EDITOR=cattest_must_failgitcommit-a-v2>err&&+test_i18ngrep"Aborting commit due to empty commit message."err+'+ test_done
@@ -791,6 +793,8 @@ static void wt_status_print_verbose(struct wt_status *s)*/if(s->fp!=stdout)rev.diffopt.use_color=0;+fprintf(s->fp,wt_status_diff_divider);+fprintf(s->fp,_("# The diff below will be removed when keeping the previous line.\n"));run_diff_index(&rev,1);}
From: Eric Sunshine <hidden> Date: 2016-06-15 22:59:16
On Sat, Nov 16, 2013 at 5:52 PM, Jens Lehmann [off-list ref] wrote:
quoted hunk
When using the '-v' option of "git commit" the diff added to the commit
message temporarily for editing is stripped off after the user exited the
editor by searching for "\ndiff --git " and truncating the commmit message
there if it is found. But this approach has two problems: when the commit
message itself contains a line starting with "diff --git" it will be
truncated there prematurely. And when the "diff.submodule" setting is set
to "log", the diff may start with "Submodule <hash1>..<hash2>", which will
be left in the commit message while it shouldn't.
Fix that by introducing a special scissor separator line starting with the
comment character '#' followed by a line describing what it is for. The
scissor line is used to reliably detect the start of the diff so it can be
chopped off from the commit message, no matter what the user enters there.
Turn a known test failure fixed by this change into a successful test and
add another one for a diff starting with a submodule log.
Reported-by: Ari Pollak <redacted>
Signed-off-by: Jens Lehmann <redacted>
---
builtin/commit.c | 6 +++---
t/t7507-commit-verbose.sh | 15 ++++++++++++++-
wt-status.c | 4 ++++
wt-status.h | 2 ++
4 files changed, 23 insertions(+), 4 deletions(-)
@@ -1602,9 +1602,9 @@ int cmd_commit(int argc, const char **argv, const char *prefix)/* Truncate the message just before the diff, if any. */if(verbose){-p=strstr(sb.buf,"\ndiff --git ");-if(p!=NULL)-strbuf_setlen(&sb,p-sb.buf+1);+p=strstr(sb.buf,wt_status_diff_divider);
Would it make sense to use the more flexible is_scissors_line() from
builtin/mailinfo.c here?
quoted hunk
+ if ((p != NULL) && (p > sb.buf) && (p[-1] == '\n'))
+ strbuf_setlen(&sb, p - sb.buf);
}
if (cleanup_mode != CLEANUP_NONE)
@@ -791,6 +793,8 @@ static void wt_status_print_verbose(struct wt_status *s)*/if(s->fp!=stdout)rev.diffopt.use_color=0;+fprintf(s->fp,wt_status_diff_divider);+fprintf(s->fp,_("# The diff below will be removed when keeping the previous line.\n"));run_diff_index(&rev,1);}
From: Jeff King <hidden> Date: 2016-06-15 22:59:16
On Sat, Nov 16, 2013 at 07:22:29PM -0500, Eric Sunshine wrote:
quoted
/* Truncate the message just before the diff, if any. */
if (verbose) {
- p = strstr(sb.buf, "\ndiff --git ");
- if (p != NULL)
- strbuf_setlen(&sb, p - sb.buf + 1);
+ p = strstr(sb.buf, wt_status_diff_divider);
Would it make sense to use the more flexible is_scissors_line() from
builtin/mailinfo.c here?
I don't think so. We are not trying to be friendly to a remote source
which has given us an arbitrarily-written scissor line. Rather the
opposite: we are trying to be very strict only to break on the line we
have included ourselves.
-Peff
@@ -1602,9 +1602,9 @@ int cmd_commit(int argc, const char **argv, const char *prefix)/* Truncate the message just before the diff, if any. */if(verbose){-p=strstr(sb.buf,"\ndiff --git ");-if(p!=NULL)-strbuf_setlen(&sb,p-sb.buf+1);+p=strstr(sb.buf,wt_status_diff_divider);+if((p!=NULL)&&(p>sb.buf)&&(p[-1]=='\n'))+strbuf_setlen(&sb,p-sb.buf);
I think your check for a preceding newline is too strict. If I delete
everything before the scissor line (e.g., because I am trying to abort
the commit), we should still remove the diff. With your patch, we do
not, and a commit message consisting solely of the diff.
So I think you want:
if (p && (p == sb.buf || p[-1] == '\n'))
+ fprintf(s->fp, _("# The diff below will be removed when keeping the previous line.\n"));
I found this hard to parse, I think because of the "keeping" (why would
I not keep it?), and because you are talking about lines above and
below. It is not as accurate to say:
# ------------------ >8 --------------------
# Everything below this line will be removed.
because it is technically the line above that is the cutoff. But I think
the meaning is clear, and it is simpler to parse.
I do think it would be simpler with a single line. I know handling the
i18n was a question there, but I think we should be fine as long as we
check for the exact bytes we wrote. Surely gettext can do something
like:
magic = _("# Everything below this line will be removed");
fprintf(fh, "%s", magic);
...
p = strstr(magic);
I don't know what guarantees on string lifetime gettext gives us, but
the worst case is that we simply strdup the result.
I suppose it's possible that the translated string could have utf8 with
multiple representations, and the user's editor normalizes the text in a
different way than we wrote it when it saves the result. I don't know if
that is worth caring about or not; it seems kind of insane.
-Peff
@@ -1602,9 +1602,9 @@ int cmd_commit(int argc, const char **argv, const char *prefix)/* Truncate the message just before the diff, if any. */if(verbose){-p=strstr(sb.buf,"\ndiff --git ");-if(p!=NULL)-strbuf_setlen(&sb,p-sb.buf+1);+p=strstr(sb.buf,wt_status_diff_divider);+if((p!=NULL)&&(p>sb.buf)&&(p[-1]=='\n'))+strbuf_setlen(&sb,p-sb.buf);
I think your check for a preceding newline is too strict. If I delete
everything before the scissor line (e.g., because I am trying to abort
the commit), we should still remove the diff. With your patch, we do
not, and a commit message consisting solely of the diff.
So I think you want:
if (p && (p == sb.buf || p[-1] == '\n'))
Thanks for catching this, will do so in v2.
quoted
+ fprintf(s->fp, _("# The diff below will be removed when keeping the previous line.\n"));
I found this hard to parse, I think because of the "keeping" (why would
I not keep it?), and because you are talking about lines above and
below. It is not as accurate to say:
# ------------------ >8 --------------------
# Everything below this line will be removed.
because it is technically the line above that is the cutoff. But I think
the meaning is clear, and it is simpler to parse.
Ok.
I do think it would be simpler with a single line. I know handling the
i18n was a question there, but I think we should be fine as long as we
check for the exact bytes we wrote. Surely gettext can do something
like:
magic = _("# Everything below this line will be removed");
fprintf(fh, "%s", magic);
...
p = strstr(magic);
I don't know what guarantees on string lifetime gettext gives us, but
the worst case is that we simply strdup the result.
I suppose it's possible that the translated string could have utf8 with
multiple representations, and the user's editor normalizes the text in a
different way than we wrote it when it saves the result. I don't know if
that is worth caring about or not; it seems kind of insane.
I don't have any strong feelings about this one. I'd be fine with
dropping the scissor line and taking the translated string as divider
line. What do others think?