diff options
author | nulltoken <emeric.fermas@gmail.com> | 2012-03-01 17:03:32 +0100 |
---|---|---|
committer | nulltoken <emeric.fermas@gmail.com> | 2012-05-07 12:16:04 +0200 |
commit | 458b94503d023a07247153f44d34bcc65e6f8103 (patch) | |
tree | 02a14a37ebde58cdcf7164f0f362c705e510b201 /src/message.c | |
parent | 9b62e40ecdb92ab7493eac514e1399d791fa6f62 (diff) | |
download | libgit2-458b94503d023a07247153f44d34bcc65e6f8103.tar.gz |
commit/tag: ensure the message is cleaned up
'git commit' and 'git tag -a' enforce some conventions, like cleaning up excess whitespace and making sure that the last line ends with a '\n'. This fix replicates this behavior.
Fix libgit2/libgit2sharp#117
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; +} |