OSDN Git Service

Merge branch 'tk/stripspace'
authorJunio C Hamano <gitster@pobox.com>
Mon, 26 Oct 2015 22:55:20 +0000 (15:55 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 26 Oct 2015 22:55:20 +0000 (15:55 -0700)
The internal stripspace() function has been moved to where it
logically belongs to, i.e. strbuf API, and the command line parser
of "git stripspace" has been updated to use the parse_options API.

* tk/stripspace:
  stripspace: use parse-options for command-line parsing
  strbuf: make stripspace() part of strbuf

1  2 
builtin/am.c
builtin/branch.c
builtin/merge.c
builtin/notes.c
builtin/stripspace.c
builtin/tag.c
strbuf.c
strbuf.h

diff --cc builtin/am.c
Simple merge
Simple merge
diff --cc builtin/merge.c
Simple merge
diff --cc builtin/notes.c
Simple merge
@@@ -77,9 -13,17 +13,17 @@@ static void comment_lines(struct strbu
        free(msg);
  }
  
- static const char *usage_msg = "\n"
- "  git stripspace [-s | --strip-comments]\n"
- "  git stripspace [-c | --comment-lines]";
+ static const char * const stripspace_usage[] = {
 -      N_("git stripspace [-s | --strip-comments] < input"),
 -      N_("git stripspace [-c | --comment-lines] < input"),
++      N_("git stripspace [-s | --strip-comments]"),
++      N_("git stripspace [-c | --comment-lines]"),
+       NULL
+ };
+ enum stripspace_mode {
+       STRIP_DEFAULT = 0,
+       STRIP_COMMENTS,
+       COMMENT_LINES
+ };
  
  int cmd_stripspace(int argc, const char **argv, const char *prefix)
  {
diff --cc builtin/tag.c
Simple merge
diff --cc strbuf.c
+++ b/strbuf.c
@@@ -744,11 -744,68 +744,77 @@@ void strbuf_addftime(struct strbuf *sb
        strbuf_setlen(sb, sb->len + len);
  }
  
 +void strbuf_add_unique_abbrev(struct strbuf *sb, const unsigned char *sha1,
 +                            int abbrev_len)
 +{
 +      int r;
 +      strbuf_grow(sb, GIT_SHA1_HEXSZ + 1);
 +      r = find_unique_abbrev_r(sb->buf + sb->len, sha1, abbrev_len);
 +      strbuf_setlen(sb, sb->len + r);
 +}
++
+ /*
+  * Returns the length of a line, without trailing spaces.
+  *
+  * If the line ends with newline, it will be removed too.
+  */
+ static size_t cleanup(char *line, size_t len)
+ {
+       while (len) {
+               unsigned char c = line[len - 1];
+               if (!isspace(c))
+                       break;
+               len--;
+       }
+       return len;
+ }
+ /*
+  * Remove empty lines from the beginning and end
+  * and also trailing spaces from every line.
+  *
+  * Turn multiple consecutive empty lines between paragraphs
+  * into just one empty line.
+  *
+  * If the input has only empty lines and spaces,
+  * no output will be produced.
+  *
+  * If last line does not have a newline at the end, one is added.
+  *
+  * Enable skip_comments to skip every line starting with comment
+  * character.
+  */
+ void strbuf_stripspace(struct strbuf *sb, int skip_comments)
+ {
+       int empties = 0;
+       size_t i, j, len, newlen;
+       char *eol;
+       /* We may have to add a newline. */
+       strbuf_grow(sb, 1);
+       for (i = j = 0; i < sb->len; i += len, j += newlen) {
+               eol = memchr(sb->buf + i, '\n', sb->len - i);
+               len = eol ? eol - (sb->buf + i) + 1 : sb->len - i;
+               if (skip_comments && len && sb->buf[i] == comment_line_char) {
+                       newlen = 0;
+                       continue;
+               }
+               newlen = cleanup(sb->buf + i, len);
+               /* Not just an empty line? */
+               if (newlen) {
+                       if (empties > 0 && j > 0)
+                               sb->buf[j++] = '\n';
+                       empties = 0;
+                       memmove(sb->buf + j, sb->buf + i, newlen);
+                       sb->buf[newlen + j++] = '\n';
+               } else {
+                       empties++;
+               }
+       }
+       strbuf_setlen(sb, j);
+ }
diff --cc strbuf.h
Simple merge