Re: [PATCH v5 6/7] replace: remove signature when using --graft

2014-07-03 Thread Christian Couder
On Wed, Jul 2, 2014 at 11:19 PM, Junio C Hamano gits...@pobox.com wrote:
 Christian Couder chrisc...@tuxfamily.org writes:

 It could be misleading to keep a signature in a
 replacement commit, so let's remove it.

 Note that there should probably be a way to sign
 the replacement commit created when using --graft,
 but this can be dealt with in another commit or
 patch series.

 Both paragraphs read very sensibly.

Thanks.

 --- a/builtin/replace.c
 +++ b/builtin/replace.c
 @@ -344,6 +344,11 @@ static int create_graft(int argc, const char **argv, 
 int force)

   replace_parents(buf, argc, argv);

 + if (remove_signature(buf))
 + warning(_(the original commit '%s' has a gpg signature.\n
 +   It will be removed in the replacement commit!),

 Hmmm...  does the second line of this message start with the usual
 warning: prefix?

Ok, I will use following:

if (remove_signature(buf)) {
warning(_(the original commit '%s' has a gpg signature.), old_ref);
warning(_(the signature will be removed in the replacement commit!));
}

 diff --git a/commit.c b/commit.c
 index fb7897c..54e157d 100644
 --- a/commit.c
 +++ b/commit.c
 @@ -1177,6 +1177,40 @@ int parse_signed_commit(const struct commit *commit,
   return saw_signature;
  }

 +int remove_signature(struct strbuf *buf)
 +{
 + const char *line = buf-buf;
 + const char *tail = buf-buf + buf-len;
 + int in_signature = 0;
 + const char *sig_start = NULL;
 + const char *sig_end = NULL;
 +
 + while (line  tail) {
 + const char *next = memchr(line, '\n', tail - line);
 + next = next ? next + 1 : tail;

 This almost makes me wonder if we want something similar to
 strchrnul() we use for NUL-terminated strings, and I suspect that
 you would find more instances by running git grep -A2 memchr.

 I don't know what such a helper function should be named, though.
 Certainly not memchrnul().

I can add this to a GSoC microproject page for next year.

 + if (in_signature  line[0] == ' ')
 + sig_end = next;
 + else if (starts_with(line, gpg_sig_header) 
 +  line[gpg_sig_header_len] == ' ') {
 + sig_start = line;
 + sig_end = next;
 + in_signature = 1;
 + } else {
 + if (*line == '\n')
 + /* dump the whole remainder of the buffer */
 + next = tail;
 + in_signature = 0;
 + }
 + line = next;
 + }
 +
 + if (sig_start)
 + strbuf_remove(buf, sig_start - buf-buf, sig_end - sig_start);

 If there are two instances of gpg_sig, this will remove only the
 last one, but there is no chance both signatures of such a commit
 can validate OK, and we won't be losing something in between anyway,
 so it should be fine.

Ok.

Thanks,
Christian.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v5 6/7] replace: remove signature when using --graft

2014-07-02 Thread Junio C Hamano
Christian Couder chrisc...@tuxfamily.org writes:

 It could be misleading to keep a signature in a
 replacement commit, so let's remove it.

 Note that there should probably be a way to sign
 the replacement commit created when using --graft,
 but this can be dealt with in another commit or
 patch series.

Both paragraphs read very sensibly.


 Signed-off-by: Christian Couder chrisc...@tuxfamily.org
 ---
  builtin/replace.c |  5 +
  commit.c  | 34 ++
  commit.h  |  2 ++
  3 files changed, 41 insertions(+)

 diff --git a/builtin/replace.c b/builtin/replace.c
 index ad47237..000db65 100644
 --- a/builtin/replace.c
 +++ b/builtin/replace.c
 @@ -344,6 +344,11 @@ static int create_graft(int argc, const char **argv, int 
 force)
  
   replace_parents(buf, argc, argv);
  
 + if (remove_signature(buf))
 + warning(_(the original commit '%s' has a gpg signature.\n
 +   It will be removed in the replacement commit!),

Hmmm...  does the second line of this message start with the usual
warning: prefix?

 diff --git a/commit.c b/commit.c
 index fb7897c..54e157d 100644
 --- a/commit.c
 +++ b/commit.c
 @@ -1177,6 +1177,40 @@ int parse_signed_commit(const struct commit *commit,
   return saw_signature;
  }
  
 +int remove_signature(struct strbuf *buf)
 +{
 + const char *line = buf-buf;
 + const char *tail = buf-buf + buf-len;
 + int in_signature = 0;
 + const char *sig_start = NULL;
 + const char *sig_end = NULL;
 +
 + while (line  tail) {
 + const char *next = memchr(line, '\n', tail - line);
 + next = next ? next + 1 : tail;

This almost makes me wonder if we want something similar to
strchrnul() we use for NUL-terminated strings, and I suspect that
you would find more instances by running git grep -A2 memchr.

I don't know what such a helper function should be named, though.
Certainly not memchrnul().

 +
 + if (in_signature  line[0] == ' ')
 + sig_end = next;
 + else if (starts_with(line, gpg_sig_header) 
 +  line[gpg_sig_header_len] == ' ') {
 + sig_start = line;
 + sig_end = next;
 + in_signature = 1;
 + } else {
 + if (*line == '\n')
 + /* dump the whole remainder of the buffer */
 + next = tail;
 + in_signature = 0;
 + }
 + line = next;
 + }
 +
 + if (sig_start)
 + strbuf_remove(buf, sig_start - buf-buf, sig_end - sig_start);

If there are two instances of gpg_sig, this will remove only the
last one, but there is no chance both signatures of such a commit
can validate OK, and we won't be losing something in between anyway,
so it should be fine.

 + return sig_start != NULL;
 +}
 +
  static void handle_signed_tag(struct commit *parent, struct 
 commit_extra_header ***tail)
  {
   struct merge_remote_desc *desc;
 diff --git a/commit.h b/commit.h
 index 2e1492a..4234dae 100644
 --- a/commit.h
 +++ b/commit.h
 @@ -327,6 +327,8 @@ struct commit *get_merge_parent(const char *name);
  
  extern int parse_signed_commit(const struct commit *commit,
  struct strbuf *message, struct strbuf 
 *signature);
 +extern int remove_signature(struct strbuf *buf);
 +
  extern void print_commit_list(struct commit_list *list,
 const char *format_cur,
 const char *format_last);
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v5 6/7] replace: remove signature when using --graft

2014-06-28 Thread Christian Couder
It could be misleading to keep a signature in a
replacement commit, so let's remove it.

Note that there should probably be a way to sign
the replacement commit created when using --graft,
but this can be dealt with in another commit or
patch series.

Signed-off-by: Christian Couder chrisc...@tuxfamily.org
---
 builtin/replace.c |  5 +
 commit.c  | 34 ++
 commit.h  |  2 ++
 3 files changed, 41 insertions(+)

diff --git a/builtin/replace.c b/builtin/replace.c
index ad47237..000db65 100644
--- a/builtin/replace.c
+++ b/builtin/replace.c
@@ -344,6 +344,11 @@ static int create_graft(int argc, const char **argv, int 
force)
 
replace_parents(buf, argc, argv);
 
+   if (remove_signature(buf))
+   warning(_(the original commit '%s' has a gpg signature.\n
+ It will be removed in the replacement commit!),
+   old_ref);
+
if (write_sha1_file(buf.buf, buf.len, commit_type, new))
die(_(could not write replacement commit for: '%s'), old_ref);
 
diff --git a/commit.c b/commit.c
index fb7897c..54e157d 100644
--- a/commit.c
+++ b/commit.c
@@ -1177,6 +1177,40 @@ int parse_signed_commit(const struct commit *commit,
return saw_signature;
 }
 
+int remove_signature(struct strbuf *buf)
+{
+   const char *line = buf-buf;
+   const char *tail = buf-buf + buf-len;
+   int in_signature = 0;
+   const char *sig_start = NULL;
+   const char *sig_end = NULL;
+
+   while (line  tail) {
+   const char *next = memchr(line, '\n', tail - line);
+   next = next ? next + 1 : tail;
+
+   if (in_signature  line[0] == ' ')
+   sig_end = next;
+   else if (starts_with(line, gpg_sig_header) 
+line[gpg_sig_header_len] == ' ') {
+   sig_start = line;
+   sig_end = next;
+   in_signature = 1;
+   } else {
+   if (*line == '\n')
+   /* dump the whole remainder of the buffer */
+   next = tail;
+   in_signature = 0;
+   }
+   line = next;
+   }
+
+   if (sig_start)
+   strbuf_remove(buf, sig_start - buf-buf, sig_end - sig_start);
+
+   return sig_start != NULL;
+}
+
 static void handle_signed_tag(struct commit *parent, struct 
commit_extra_header ***tail)
 {
struct merge_remote_desc *desc;
diff --git a/commit.h b/commit.h
index 2e1492a..4234dae 100644
--- a/commit.h
+++ b/commit.h
@@ -327,6 +327,8 @@ struct commit *get_merge_parent(const char *name);
 
 extern int parse_signed_commit(const struct commit *commit,
   struct strbuf *message, struct strbuf 
*signature);
+extern int remove_signature(struct strbuf *buf);
+
 extern void print_commit_list(struct commit_list *list,
  const char *format_cur,
  const char *format_last);
-- 
2.0.0.421.g786a89d.dirty


--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html