Code

get_author_initials: various fixes
[tig.git] / test-graph.c
1 /* Copyright (c) 2006-2010 Jonas Fonseca <fonseca@diku.dk>
2  *
3  * This program is free software; you can redistribute it and/or
4  * modify it under the terms of the GNU General Public License as
5  * published by the Free Software Foundation; either version 2 of
6  * the License, or (at your option) any later version.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  * Example usage:
14  *
15  *      # git log --pretty=raw --parents | ./test-graph
16  *      # git log --pretty=raw --parents | ./test-graph --ascii
17  */
19 #include "tig.h"
20 #include "io.h"
21 #include "graph.h"
23 static void __NORETURN
24 die(const char *err, ...)
25 {
26         va_list args;
28         endwin();
30         va_start(args, err);
31         fputs("tig: ", stderr);
32         vfprintf(stderr, err, args);
33         fputs("\n", stderr);
34         va_end(args);
36         exit(1);
37 }
39 struct commit {
40         char id[SIZEOF_REV];
41         struct graph_canvas canvas;
42 };
44 DEFINE_ALLOCATOR(realloc_commits, struct commit *, 8)
46 int
47 main(int argc, const char *argv[])
48 {
49         struct graph graph = { };
50         struct io io = { };
51         char *line;
52         struct commit **commits = NULL;
53         size_t ncommits = 0;
54         struct commit *commit = NULL;
55         bool is_boundary;
56         const char *(*graph_fn)(struct graph_symbol *) = graph_symbol_to_utf8;
58         if (argc > 1 && !strcmp(argv[1], "--ascii"))
59                 graph_fn = graph_symbol_to_ascii;
61         if (!io_open(&io, ""))
62                 die("IO");
64         while (!io_eof(&io)) {
65                 bool can_read = io_can_read(&io, TRUE);
67                 for (; (line = io_get(&io, '\n', can_read)); can_read = FALSE) {
68                         if (!prefixcmp(line, "commit ")) {
69                                 line += STRING_SIZE("commit ");
70                                 is_boundary = *line == '-';
72                                 if (is_boundary)
73                                         line++;
75                                 if (!realloc_commits(&commits, ncommits, 1))
76                                         die("Commits");
78                                 commit = calloc(1, sizeof(*commit));
79                                 if (!commit)
80                                         die("Commit");
81                                 commits[ncommits++] = commit;
82                                 string_copy_rev(commit->id, line);
83                                 graph_add_commit(&graph, &commit->canvas, commit->id, line, is_boundary);
84                                 graph_render_parents(&graph);
86                         } else if (!prefixcmp(line, "    ")) {
87                                 int i;
89                                 if (!commit)
90                                         continue;
92                                 for (i = 0; i < commit->canvas.size; i++) {
93                                         struct graph_symbol *symbol = &commit->canvas.symbols[i];
94                                         const char *chars = graph_fn(symbol);
96                                         printf("%s", chars + (i == 0));
97                                 }
98                                 printf("%s\n", line + 3);
100                                 commit = NULL;
101                         }
102                 }
103         }
105         return 0;