diff options
| author | Vicent Martà <tanoku@gmail.com> | 2012-05-08 14:13:43 -0700 |
|---|---|---|
| committer | Vicent Martà <tanoku@gmail.com> | 2012-05-08 14:13:43 -0700 |
| commit | c99bdacf712d8993bb48c11e204492b4a4dd0990 (patch) | |
| tree | 490a5b4ac255acd20acc24c20060bf23fea5db7a /src/message.c | |
| parent | 364f51bdca8cd5bb11bb322f8cac1b0d7dfcf686 (diff) | |
| parent | 458b94503d023a07247153f44d34bcc65e6f8103 (diff) | |
| download | libgit2-c99bdacf712d8993bb48c11e204492b4a4dd0990.tar.gz | |
Merge pull request #670 from nulltoken/ntk/topic/clean-commit_message
Clean commit and tag messages
Diffstat (limited to 'src/message.c')
| -rw-r--r-- | src/message.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/message.c b/src/message.c new file mode 100644 index 000000000..94745ea81 --- /dev/null +++ b/src/message.c @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2009-2012 the libgit2 contributors + * + * This file is part of libgit2, distributed under the GNU GPL v2 with + * a Linking Exception. For full terms see the included COPYING file. + */ + +#include "message.h" + +static size_t line_length_without_trailing_spaces(const char *line, size_t len) +{ + while (len) { + unsigned char c = line[len - 1]; + if (!isspace(c)) + break; + len--; + } + + return len; +} + +/* Greatly inspired from git.git "stripspace" */ +/* see https://github.com/git/git/blob/497215d8811ac7b8955693ceaad0899ecd894ed2/builtin/stripspace.c#L4-67 */ +int git_message_prettify(git_buf *message_out, const char *message, int strip_comments) +{ + int consecutive_empty_lines = 0; + size_t i, line_length, rtrimmed_line_length; + char *next_newline; + + for (i = 0; i < strlen(message); i += line_length) { + next_newline = memchr(message + i, '\n', strlen(message) - i); + line_length = next_newline ? next_newline - (message + i) + 1 : strlen(message) - i; + + if (strip_comments && line_length && message[i] == '#') + continue; + + rtrimmed_line_length = line_length_without_trailing_spaces(message + i, line_length); + + if (!rtrimmed_line_length) { + consecutive_empty_lines++; + continue; + } + + if (consecutive_empty_lines > 0 && message_out->size > 0) + if (git_buf_putc(message_out, '\n') < 0) + return -1; + + consecutive_empty_lines = 0; + git_buf_put(message_out, message + i, rtrimmed_line_length); + git_buf_putc(message_out, '\n'); + } + + return 0; +} |
