File Coverage

deps/libgit2/src/message.c
Criterion Covered Total %
statement 24 28 85.7
branch 14 22 63.6
condition n/a
subroutine n/a
pod n/a
total 38 50 76.0


line stmt bran cond sub pod time code
1             /*
2             * Copyright (C) the libgit2 contributors. All rights reserved.
3             *
4             * This file is part of libgit2, distributed under the GNU GPL v2 with
5             * a Linking Exception. For full terms see the included COPYING file.
6             */
7              
8             #include "message.h"
9              
10 7           static size_t line_length_without_trailing_spaces(const char *line, size_t len)
11             {
12 14 50         while (len) {
13 14           unsigned char c = line[len - 1];
14 14 100         if (!git__isspace(c))
15 7           break;
16 7           len--;
17             }
18              
19 7           return len;
20             }
21              
22             /* Greatly inspired from git.git "stripspace" */
23             /* see https://github.com/git/git/blob/497215d8811ac7b8955693ceaad0899ecd894ed2/builtin/stripspace.c#L4-67 */
24 4           int git_message_prettify(git_buf *message_out, const char *message, int strip_comments, char comment_char)
25             {
26 4           const size_t message_len = strlen(message);
27              
28 4           int consecutive_empty_lines = 0;
29             size_t i, line_length, rtrimmed_line_length;
30             char *next_newline;
31              
32 4           git_buf_sanitize(message_out);
33              
34 14 100         for (i = 0; i < strlen(message); i += line_length) {
35 10           next_newline = memchr(message + i, '\n', message_len - i);
36              
37 10 50         if (next_newline != NULL) {
38 10           line_length = next_newline - (message + i) + 1;
39             } else {
40 0           line_length = message_len - i;
41             }
42              
43 10 100         if (strip_comments && line_length && message[i] == comment_char)
    50          
    100          
44 3           continue;
45              
46 7           rtrimmed_line_length = line_length_without_trailing_spaces(message + i, line_length);
47              
48 7 50         if (!rtrimmed_line_length) {
49 0           consecutive_empty_lines++;
50 0           continue;
51             }
52              
53 7 50         if (consecutive_empty_lines > 0 && message_out->size > 0)
    0          
54 0           git_buf_putc(message_out, '\n');
55              
56 7           consecutive_empty_lines = 0;
57 7           git_buf_put(message_out, message + i, rtrimmed_line_length);
58 7           git_buf_putc(message_out, '\n');
59             }
60              
61 4 50         return git_buf_oom(message_out) ? -1 : 0;
62             }