Skip to content

Commit

Permalink
Merge branch 'tk/stripspace'
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Junio C Hamano committed Oct 26, 2015
2 parents 0884726 + bed4452 commit 1ad7c0f
Show file tree
Hide file tree
Showing 9 changed files with 118 additions and 103 deletions.
2 changes: 1 addition & 1 deletion builtin/am.c
Original file line number Diff line number Diff line change
Expand Up @@ -1343,7 +1343,7 @@ static int parse_mail(struct am_state *state, const char *mail)
strbuf_addstr(&msg, "\n\n");
if (strbuf_read_file(&msg, am_path(state, "msg"), 0) < 0)
die_errno(_("could not read '%s'"), am_path(state, "msg"));
stripspace(&msg, 0);
strbuf_stripspace(&msg, 0);

if (state->signoff)
am_signoff(&msg);
Expand Down
2 changes: 1 addition & 1 deletion builtin/branch.c
Original file line number Diff line number Diff line change
Expand Up @@ -592,7 +592,7 @@ static int edit_branch_description(const char *branch_name)
strbuf_release(&buf);
return -1;
}
stripspace(&buf, 1);
strbuf_stripspace(&buf, 1);

strbuf_addf(&name, "branch.%s.description", branch_name);
status = git_config_set(name.buf, buf.len ? buf.buf : NULL);
Expand Down
6 changes: 3 additions & 3 deletions builtin/commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -775,7 +775,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
s->hints = 0;

if (clean_message_contents)
stripspace(&sb, 0);
strbuf_stripspace(&sb, 0);

if (signoff)
append_signoff(&sb, ignore_non_trailer(&sb), 0);
Expand Down Expand Up @@ -1014,7 +1014,7 @@ static int template_untouched(struct strbuf *sb)
if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
return 0;

stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
strbuf_stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
if (!skip_prefix(sb->buf, tmpl.buf, &start))
start = sb->buf;
strbuf_release(&tmpl);
Expand Down Expand Up @@ -1726,7 +1726,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
wt_status_truncate_message_at_cut_line(&sb);

if (cleanup_mode != CLEANUP_NONE)
stripspace(&sb, cleanup_mode == CLEANUP_ALL);
strbuf_stripspace(&sb, cleanup_mode == CLEANUP_ALL);
if (template_untouched(&sb) && !allow_empty_message) {
rollback_index_files();
fprintf(stderr, _("Aborting commit; you did not edit the message.\n"));
Expand Down
2 changes: 1 addition & 1 deletion builtin/merge.c
Original file line number Diff line number Diff line change
Expand Up @@ -806,7 +806,7 @@ static void prepare_to_commit(struct commit_list *remoteheads)
abort_commit(remoteheads, NULL);
}
read_merge_msg(&msg);
stripspace(&msg, 0 < option_edit);
strbuf_stripspace(&msg, 0 < option_edit);
if (!msg.len)
abort_commit(remoteheads, _("Empty commit message."));
strbuf_release(&merge_msg);
Expand Down
6 changes: 3 additions & 3 deletions builtin/notes.c
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ static void prepare_note_data(const unsigned char *object, struct note_data *d,
if (launch_editor(d->edit_path, &d->buf, NULL)) {
die(_("Please supply the note contents using either -m or -F option"));
}
stripspace(&d->buf, 1);
strbuf_stripspace(&d->buf, 1);
}
}

Expand All @@ -215,7 +215,7 @@ static int parse_msg_arg(const struct option *opt, const char *arg, int unset)
if (d->buf.len)
strbuf_addch(&d->buf, '\n');
strbuf_addstr(&d->buf, arg);
stripspace(&d->buf, 0);
strbuf_stripspace(&d->buf, 0);

d->given = 1;
return 0;
Expand All @@ -232,7 +232,7 @@ static int parse_file_arg(const struct option *opt, const char *arg, int unset)
die_errno(_("cannot read '%s'"), arg);
} else if (strbuf_read_file(&d->buf, arg, 1024) < 0)
die_errno(_("could not open or read '%s'"), arg);
stripspace(&d->buf, 0);
strbuf_stripspace(&d->buf, 0);

d->given = 1;
return 0;
Expand Down
124 changes: 32 additions & 92 deletions builtin/stripspace.c
Original file line number Diff line number Diff line change
@@ -1,71 +1,7 @@
#include "builtin.h"
#include "cache.h"

/*
* 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 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);
}
#include "parse-options.h"
#include "strbuf.h"

static void comment_lines(struct strbuf *buf)
{
Expand All @@ -77,41 +13,45 @@ static void comment_lines(struct strbuf *buf)
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]"),
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)
{
struct strbuf buf = STRBUF_INIT;
int strip_comments = 0;
enum { INVAL = 0, STRIP_SPACE = 1, COMMENT_LINES = 2 } mode = STRIP_SPACE;

if (argc == 2) {
if (!strcmp(argv[1], "-s") ||
!strcmp(argv[1], "--strip-comments")) {
strip_comments = 1;
} else if (!strcmp(argv[1], "-c") ||
!strcmp(argv[1], "--comment-lines")) {
mode = COMMENT_LINES;
} else {
mode = INVAL;
}
} else if (argc > 1) {
mode = INVAL;
}

if (mode == INVAL)
usage(usage_msg);

if (strip_comments || mode == COMMENT_LINES)
enum stripspace_mode mode = STRIP_DEFAULT;

const struct option options[] = {
OPT_CMDMODE('s', "strip-comments", &mode,
N_("skip and remove all lines starting with comment character"),
STRIP_COMMENTS),
OPT_CMDMODE('c', "comment-lines", &mode,
N_("prepend comment character and blank to each line"),
COMMENT_LINES),
OPT_END()
};

argc = parse_options(argc, argv, prefix, options, stripspace_usage, 0);
if (argc)
usage_with_options(stripspace_usage, options);

if (mode == STRIP_COMMENTS || mode == COMMENT_LINES)
git_config(git_default_config, NULL);

if (strbuf_read(&buf, 0, 1024) < 0)
die_errno("could not read the input");

if (mode == STRIP_SPACE)
stripspace(&buf, strip_comments);
if (mode == STRIP_DEFAULT || mode == STRIP_COMMENTS)
strbuf_stripspace(&buf, mode == STRIP_COMMENTS);
else
comment_lines(&buf);

Expand Down
2 changes: 1 addition & 1 deletion builtin/tag.c
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ static void create_tag(const unsigned char *object, const char *tag,
}

if (opt->cleanup_mode != CLEANUP_NONE)
stripspace(buf, opt->cleanup_mode == CLEANUP_ALL);
strbuf_stripspace(buf, opt->cleanup_mode == CLEANUP_ALL);

if (!opt->message_given && !buf->len)
die(_("no tag message?"));
Expand Down
66 changes: 66 additions & 0 deletions strbuf.c
Original file line number Diff line number Diff line change
Expand Up @@ -752,3 +752,69 @@ void strbuf_add_unique_abbrev(struct strbuf *sb, const unsigned char *sha1,
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);
}
11 changes: 10 additions & 1 deletion strbuf.h
Original file line number Diff line number Diff line change
Expand Up @@ -418,7 +418,16 @@ extern void strbuf_add_absolute_path(struct strbuf *sb, const char *path);
* Strip whitespace from a buffer. The second parameter controls if
* comments are considered contents to be removed or not.
*/
extern void stripspace(struct strbuf *buf, int skip_comments);
extern void strbuf_stripspace(struct strbuf *buf, int skip_comments);

/**
* Temporary alias until all topic branches have switched to use
* strbuf_stripspace directly.
*/
static inline void stripspace(struct strbuf *buf, int skip_comments)
{
strbuf_stripspace(buf, skip_comments);
}

static inline int strbuf_strip_suffix(struct strbuf *sb, const char *suffix)
{
Expand Down

0 comments on commit 1ad7c0f

Please sign in to comment.