diff options
Diffstat (limited to 'builtin/stripspace.c')
-rw-r--r-- | builtin/stripspace.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/builtin/stripspace.c b/builtin/stripspace.c new file mode 100644 index 0000000..7b700a9 --- /dev/null +++ b/builtin/stripspace.c @@ -0,0 +1,69 @@ +#include "builtin.h" +#include "config.h" +#include "environment.h" +#include "gettext.h" +#include "parse-options.h" +#include "setup.h" +#include "strbuf.h" +#include "write-or-die.h" + +static void comment_lines(struct strbuf *buf) +{ + char *msg; + size_t len; + + msg = strbuf_detach(buf, &len); + strbuf_add_commented_lines(buf, msg, len, comment_line_char); + free(msg); +} + +static const char * const stripspace_usage[] = { + "git stripspace [-s | --strip-comments]", + "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; + enum stripspace_mode mode = STRIP_DEFAULT; + int nongit; + + 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 space 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) { + setup_git_directory_gently(&nongit); + git_config(git_default_config, NULL); + } + + if (strbuf_read(&buf, 0, 1024) < 0) + die_errno("could not read the input"); + + if (mode == STRIP_DEFAULT || mode == STRIP_COMMENTS) + strbuf_stripspace(&buf, + mode == STRIP_COMMENTS ? comment_line_char : '\0'); + else + comment_lines(&buf); + + write_or_die(1, buf.buf, buf.len); + strbuf_release(&buf); + return 0; +} |