author | Lars Hjemli <hjemli@gmail.com> | 2011-02-19 13:01:59 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2011-02-19 13:01:59 (UTC) |
commit | 31e1f9af1d46bd7dfdb3b2ac580c0d0cc8dbaa63 (patch) (unidiff) | |
tree | 26200ad3c376ea1208d2a870ebb3b2bc6d7abee6 /cgit.c | |
parent | e66a16cebcdac53b63e77876acef1ca9e4877038 (diff) | |
parent | c2bfd40f8aaaa69a66c6eb729c202e42a43ec166 (diff) | |
download | cgit-31e1f9af1d46bd7dfdb3b2ac580c0d0cc8dbaa63.zip cgit-31e1f9af1d46bd7dfdb3b2ac580c0d0cc8dbaa63.tar.gz cgit-31e1f9af1d46bd7dfdb3b2ac580c0d0cc8dbaa63.tar.bz2 |
Merge branch 'jh/graph'
* jh/graph:
ui-log: Move 'Age' column when commit graph is present
ui-log: Line-wrap long commit subjects when showmsg is enabled
ui-log: Colorize commit graph
ui-log: Implement support for commit graphs
ui-log: Change display of full commit messages (and notes)
Conflicts:
cgit.css
-rw-r--r-- | cgit.c | 6 |
1 files changed, 6 insertions, 0 deletions
@@ -28,64 +28,66 @@ void add_mimetype(const char *name, const char *value) | |||
28 | 28 | ||
29 | struct cgit_filter *new_filter(const char *cmd, int extra_args) | 29 | struct cgit_filter *new_filter(const char *cmd, int extra_args) |
30 | { | 30 | { |
31 | struct cgit_filter *f; | 31 | struct cgit_filter *f; |
32 | 32 | ||
33 | if (!cmd || !cmd[0]) | 33 | if (!cmd || !cmd[0]) |
34 | return NULL; | 34 | return NULL; |
35 | 35 | ||
36 | f = xmalloc(sizeof(struct cgit_filter)); | 36 | f = xmalloc(sizeof(struct cgit_filter)); |
37 | f->cmd = xstrdup(cmd); | 37 | f->cmd = xstrdup(cmd); |
38 | f->argv = xmalloc((2 + extra_args) * sizeof(char *)); | 38 | f->argv = xmalloc((2 + extra_args) * sizeof(char *)); |
39 | f->argv[0] = f->cmd; | 39 | f->argv[0] = f->cmd; |
40 | f->argv[1] = NULL; | 40 | f->argv[1] = NULL; |
41 | return f; | 41 | return f; |
42 | } | 42 | } |
43 | 43 | ||
44 | static void process_cached_repolist(const char *path); | 44 | static void process_cached_repolist(const char *path); |
45 | 45 | ||
46 | void repo_config(struct cgit_repo *repo, const char *name, const char *value) | 46 | void repo_config(struct cgit_repo *repo, const char *name, const char *value) |
47 | { | 47 | { |
48 | if (!strcmp(name, "name")) | 48 | if (!strcmp(name, "name")) |
49 | repo->name = xstrdup(value); | 49 | repo->name = xstrdup(value); |
50 | else if (!strcmp(name, "clone-url")) | 50 | else if (!strcmp(name, "clone-url")) |
51 | repo->clone_url = xstrdup(value); | 51 | repo->clone_url = xstrdup(value); |
52 | else if (!strcmp(name, "desc")) | 52 | else if (!strcmp(name, "desc")) |
53 | repo->desc = xstrdup(value); | 53 | repo->desc = xstrdup(value); |
54 | else if (!strcmp(name, "owner")) | 54 | else if (!strcmp(name, "owner")) |
55 | repo->owner = xstrdup(value); | 55 | repo->owner = xstrdup(value); |
56 | else if (!strcmp(name, "defbranch")) | 56 | else if (!strcmp(name, "defbranch")) |
57 | repo->defbranch = xstrdup(value); | 57 | repo->defbranch = xstrdup(value); |
58 | else if (!strcmp(name, "snapshots")) | 58 | else if (!strcmp(name, "snapshots")) |
59 | repo->snapshots = ctx.cfg.snapshots & cgit_parse_snapshots_mask(value); | 59 | repo->snapshots = ctx.cfg.snapshots & cgit_parse_snapshots_mask(value); |
60 | else if (!strcmp(name, "enable-commit-graph")) | ||
61 | repo->enable_commit_graph = ctx.cfg.enable_commit_graph * atoi(value); | ||
60 | else if (!strcmp(name, "enable-log-filecount")) | 62 | else if (!strcmp(name, "enable-log-filecount")) |
61 | repo->enable_log_filecount = ctx.cfg.enable_log_filecount * atoi(value); | 63 | repo->enable_log_filecount = ctx.cfg.enable_log_filecount * atoi(value); |
62 | else if (!strcmp(name, "enable-log-linecount")) | 64 | else if (!strcmp(name, "enable-log-linecount")) |
63 | repo->enable_log_linecount = ctx.cfg.enable_log_linecount * atoi(value); | 65 | repo->enable_log_linecount = ctx.cfg.enable_log_linecount * atoi(value); |
64 | else if (!strcmp(name, "enable-remote-branches")) | 66 | else if (!strcmp(name, "enable-remote-branches")) |
65 | repo->enable_remote_branches = atoi(value); | 67 | repo->enable_remote_branches = atoi(value); |
66 | else if (!strcmp(name, "enable-subject-links")) | 68 | else if (!strcmp(name, "enable-subject-links")) |
67 | repo->enable_subject_links = atoi(value); | 69 | repo->enable_subject_links = atoi(value); |
68 | else if (!strcmp(name, "max-stats")) | 70 | else if (!strcmp(name, "max-stats")) |
69 | repo->max_stats = cgit_find_stats_period(value, NULL); | 71 | repo->max_stats = cgit_find_stats_period(value, NULL); |
70 | else if (!strcmp(name, "module-link")) | 72 | else if (!strcmp(name, "module-link")) |
71 | repo->module_link= xstrdup(value); | 73 | repo->module_link= xstrdup(value); |
72 | else if (!strcmp(name, "section")) | 74 | else if (!strcmp(name, "section")) |
73 | repo->section = xstrdup(value); | 75 | repo->section = xstrdup(value); |
74 | else if (!strcmp(name, "readme") && value != NULL) { | 76 | else if (!strcmp(name, "readme") && value != NULL) { |
75 | repo->readme = xstrdup(value); | 77 | repo->readme = xstrdup(value); |
76 | } else if (ctx.cfg.enable_filter_overrides) { | 78 | } else if (ctx.cfg.enable_filter_overrides) { |
77 | if (!strcmp(name, "about-filter")) | 79 | if (!strcmp(name, "about-filter")) |
78 | repo->about_filter = new_filter(value, 0); | 80 | repo->about_filter = new_filter(value, 0); |
79 | else if (!strcmp(name, "commit-filter")) | 81 | else if (!strcmp(name, "commit-filter")) |
80 | repo->commit_filter = new_filter(value, 0); | 82 | repo->commit_filter = new_filter(value, 0); |
81 | else if (!strcmp(name, "source-filter")) | 83 | else if (!strcmp(name, "source-filter")) |
82 | repo->source_filter = new_filter(value, 1); | 84 | repo->source_filter = new_filter(value, 1); |
83 | } | 85 | } |
84 | } | 86 | } |
85 | 87 | ||
86 | void config_cb(const char *name, const char *value) | 88 | void config_cb(const char *name, const char *value) |
87 | { | 89 | { |
88 | if (!strcmp(name, "section") || !strcmp(name, "repo.group")) | 90 | if (!strcmp(name, "section") || !strcmp(name, "repo.group")) |
89 | ctx.cfg.section = xstrdup(value); | 91 | ctx.cfg.section = xstrdup(value); |
90 | else if (!strcmp(name, "repo.url")) | 92 | else if (!strcmp(name, "repo.url")) |
91 | ctx.repo = cgit_add_repo(value); | 93 | ctx.repo = cgit_add_repo(value); |
@@ -112,64 +114,66 @@ void config_cb(const char *name, const char *value) | |||
112 | else if (!strcmp(name, "header")) | 114 | else if (!strcmp(name, "header")) |
113 | ctx.cfg.header = xstrdup(value); | 115 | ctx.cfg.header = xstrdup(value); |
114 | else if (!strcmp(name, "logo")) | 116 | else if (!strcmp(name, "logo")) |
115 | ctx.cfg.logo = xstrdup(value); | 117 | ctx.cfg.logo = xstrdup(value); |
116 | else if (!strcmp(name, "index-header")) | 118 | else if (!strcmp(name, "index-header")) |
117 | ctx.cfg.index_header = xstrdup(value); | 119 | ctx.cfg.index_header = xstrdup(value); |
118 | else if (!strcmp(name, "index-info")) | 120 | else if (!strcmp(name, "index-info")) |
119 | ctx.cfg.index_info = xstrdup(value); | 121 | ctx.cfg.index_info = xstrdup(value); |
120 | else if (!strcmp(name, "logo-link")) | 122 | else if (!strcmp(name, "logo-link")) |
121 | ctx.cfg.logo_link = xstrdup(value); | 123 | ctx.cfg.logo_link = xstrdup(value); |
122 | else if (!strcmp(name, "module-link")) | 124 | else if (!strcmp(name, "module-link")) |
123 | ctx.cfg.module_link = xstrdup(value); | 125 | ctx.cfg.module_link = xstrdup(value); |
124 | else if (!strcmp(name, "strict-export")) | 126 | else if (!strcmp(name, "strict-export")) |
125 | ctx.cfg.strict_export = xstrdup(value); | 127 | ctx.cfg.strict_export = xstrdup(value); |
126 | else if (!strcmp(name, "virtual-root")) { | 128 | else if (!strcmp(name, "virtual-root")) { |
127 | ctx.cfg.virtual_root = trim_end(value, '/'); | 129 | ctx.cfg.virtual_root = trim_end(value, '/'); |
128 | if (!ctx.cfg.virtual_root && (!strcmp(value, "/"))) | 130 | if (!ctx.cfg.virtual_root && (!strcmp(value, "/"))) |
129 | ctx.cfg.virtual_root = ""; | 131 | ctx.cfg.virtual_root = ""; |
130 | } else if (!strcmp(name, "nocache")) | 132 | } else if (!strcmp(name, "nocache")) |
131 | ctx.cfg.nocache = atoi(value); | 133 | ctx.cfg.nocache = atoi(value); |
132 | else if (!strcmp(name, "noplainemail")) | 134 | else if (!strcmp(name, "noplainemail")) |
133 | ctx.cfg.noplainemail = atoi(value); | 135 | ctx.cfg.noplainemail = atoi(value); |
134 | else if (!strcmp(name, "noheader")) | 136 | else if (!strcmp(name, "noheader")) |
135 | ctx.cfg.noheader = atoi(value); | 137 | ctx.cfg.noheader = atoi(value); |
136 | else if (!strcmp(name, "snapshots")) | 138 | else if (!strcmp(name, "snapshots")) |
137 | ctx.cfg.snapshots = cgit_parse_snapshots_mask(value); | 139 | ctx.cfg.snapshots = cgit_parse_snapshots_mask(value); |
138 | else if (!strcmp(name, "enable-filter-overrides")) | 140 | else if (!strcmp(name, "enable-filter-overrides")) |
139 | ctx.cfg.enable_filter_overrides = atoi(value); | 141 | ctx.cfg.enable_filter_overrides = atoi(value); |
140 | else if (!strcmp(name, "enable-gitweb-owner")) | 142 | else if (!strcmp(name, "enable-gitweb-owner")) |
141 | ctx.cfg.enable_gitweb_owner = atoi(value); | 143 | ctx.cfg.enable_gitweb_owner = atoi(value); |
142 | else if (!strcmp(name, "enable-index-links")) | 144 | else if (!strcmp(name, "enable-index-links")) |
143 | ctx.cfg.enable_index_links = atoi(value); | 145 | ctx.cfg.enable_index_links = atoi(value); |
146 | else if (!strcmp(name, "enable-commit-graph")) | ||
147 | ctx.cfg.enable_commit_graph = atoi(value); | ||
144 | else if (!strcmp(name, "enable-log-filecount")) | 148 | else if (!strcmp(name, "enable-log-filecount")) |
145 | ctx.cfg.enable_log_filecount = atoi(value); | 149 | ctx.cfg.enable_log_filecount = atoi(value); |
146 | else if (!strcmp(name, "enable-log-linecount")) | 150 | else if (!strcmp(name, "enable-log-linecount")) |
147 | ctx.cfg.enable_log_linecount = atoi(value); | 151 | ctx.cfg.enable_log_linecount = atoi(value); |
148 | else if (!strcmp(name, "enable-remote-branches")) | 152 | else if (!strcmp(name, "enable-remote-branches")) |
149 | ctx.cfg.enable_remote_branches = atoi(value); | 153 | ctx.cfg.enable_remote_branches = atoi(value); |
150 | else if (!strcmp(name, "enable-subject-links")) | 154 | else if (!strcmp(name, "enable-subject-links")) |
151 | ctx.cfg.enable_subject_links = atoi(value); | 155 | ctx.cfg.enable_subject_links = atoi(value); |
152 | else if (!strcmp(name, "enable-tree-linenumbers")) | 156 | else if (!strcmp(name, "enable-tree-linenumbers")) |
153 | ctx.cfg.enable_tree_linenumbers = atoi(value); | 157 | ctx.cfg.enable_tree_linenumbers = atoi(value); |
154 | else if (!strcmp(name, "max-stats")) | 158 | else if (!strcmp(name, "max-stats")) |
155 | ctx.cfg.max_stats = cgit_find_stats_period(value, NULL); | 159 | ctx.cfg.max_stats = cgit_find_stats_period(value, NULL); |
156 | else if (!strcmp(name, "cache-size")) | 160 | else if (!strcmp(name, "cache-size")) |
157 | ctx.cfg.cache_size = atoi(value); | 161 | ctx.cfg.cache_size = atoi(value); |
158 | else if (!strcmp(name, "cache-root")) | 162 | else if (!strcmp(name, "cache-root")) |
159 | ctx.cfg.cache_root = xstrdup(expand_macros(value)); | 163 | ctx.cfg.cache_root = xstrdup(expand_macros(value)); |
160 | else if (!strcmp(name, "cache-root-ttl")) | 164 | else if (!strcmp(name, "cache-root-ttl")) |
161 | ctx.cfg.cache_root_ttl = atoi(value); | 165 | ctx.cfg.cache_root_ttl = atoi(value); |
162 | else if (!strcmp(name, "cache-repo-ttl")) | 166 | else if (!strcmp(name, "cache-repo-ttl")) |
163 | ctx.cfg.cache_repo_ttl = atoi(value); | 167 | ctx.cfg.cache_repo_ttl = atoi(value); |
164 | else if (!strcmp(name, "cache-scanrc-ttl")) | 168 | else if (!strcmp(name, "cache-scanrc-ttl")) |
165 | ctx.cfg.cache_scanrc_ttl = atoi(value); | 169 | ctx.cfg.cache_scanrc_ttl = atoi(value); |
166 | else if (!strcmp(name, "cache-static-ttl")) | 170 | else if (!strcmp(name, "cache-static-ttl")) |
167 | ctx.cfg.cache_static_ttl = atoi(value); | 171 | ctx.cfg.cache_static_ttl = atoi(value); |
168 | else if (!strcmp(name, "cache-dynamic-ttl")) | 172 | else if (!strcmp(name, "cache-dynamic-ttl")) |
169 | ctx.cfg.cache_dynamic_ttl = atoi(value); | 173 | ctx.cfg.cache_dynamic_ttl = atoi(value); |
170 | else if (!strcmp(name, "about-filter")) | 174 | else if (!strcmp(name, "about-filter")) |
171 | ctx.cfg.about_filter = new_filter(value, 0); | 175 | ctx.cfg.about_filter = new_filter(value, 0); |
172 | else if (!strcmp(name, "commit-filter")) | 176 | else if (!strcmp(name, "commit-filter")) |
173 | ctx.cfg.commit_filter = new_filter(value, 0); | 177 | ctx.cfg.commit_filter = new_filter(value, 0); |
174 | else if (!strcmp(name, "embedded")) | 178 | else if (!strcmp(name, "embedded")) |
175 | ctx.cfg.embedded = atoi(value); | 179 | ctx.cfg.embedded = atoi(value); |
@@ -511,64 +515,66 @@ char *build_snapshot_setting(int bitmap) | |||
511 | 515 | ||
512 | char *get_first_line(char *txt) | 516 | char *get_first_line(char *txt) |
513 | { | 517 | { |
514 | char *t = xstrdup(txt); | 518 | char *t = xstrdup(txt); |
515 | char *p = strchr(t, '\n'); | 519 | char *p = strchr(t, '\n'); |
516 | if (p) | 520 | if (p) |
517 | *p = '\0'; | 521 | *p = '\0'; |
518 | return t; | 522 | return t; |
519 | } | 523 | } |
520 | 524 | ||
521 | void print_repo(FILE *f, struct cgit_repo *repo) | 525 | void print_repo(FILE *f, struct cgit_repo *repo) |
522 | { | 526 | { |
523 | fprintf(f, "repo.url=%s\n", repo->url); | 527 | fprintf(f, "repo.url=%s\n", repo->url); |
524 | fprintf(f, "repo.name=%s\n", repo->name); | 528 | fprintf(f, "repo.name=%s\n", repo->name); |
525 | fprintf(f, "repo.path=%s\n", repo->path); | 529 | fprintf(f, "repo.path=%s\n", repo->path); |
526 | if (repo->owner) | 530 | if (repo->owner) |
527 | fprintf(f, "repo.owner=%s\n", repo->owner); | 531 | fprintf(f, "repo.owner=%s\n", repo->owner); |
528 | if (repo->desc) { | 532 | if (repo->desc) { |
529 | char *tmp = get_first_line(repo->desc); | 533 | char *tmp = get_first_line(repo->desc); |
530 | fprintf(f, "repo.desc=%s\n", tmp); | 534 | fprintf(f, "repo.desc=%s\n", tmp); |
531 | free(tmp); | 535 | free(tmp); |
532 | } | 536 | } |
533 | if (repo->readme) | 537 | if (repo->readme) |
534 | fprintf(f, "repo.readme=%s\n", repo->readme); | 538 | fprintf(f, "repo.readme=%s\n", repo->readme); |
535 | if (repo->defbranch) | 539 | if (repo->defbranch) |
536 | fprintf(f, "repo.defbranch=%s\n", repo->defbranch); | 540 | fprintf(f, "repo.defbranch=%s\n", repo->defbranch); |
537 | if (repo->module_link) | 541 | if (repo->module_link) |
538 | fprintf(f, "repo.module-link=%s\n", repo->module_link); | 542 | fprintf(f, "repo.module-link=%s\n", repo->module_link); |
539 | if (repo->section) | 543 | if (repo->section) |
540 | fprintf(f, "repo.section=%s\n", repo->section); | 544 | fprintf(f, "repo.section=%s\n", repo->section); |
541 | if (repo->clone_url) | 545 | if (repo->clone_url) |
542 | fprintf(f, "repo.clone-url=%s\n", repo->clone_url); | 546 | fprintf(f, "repo.clone-url=%s\n", repo->clone_url); |
547 | fprintf(f, "repo.enable-commit-graph=%d\n", | ||
548 | repo->enable_commit_graph); | ||
543 | fprintf(f, "repo.enable-log-filecount=%d\n", | 549 | fprintf(f, "repo.enable-log-filecount=%d\n", |
544 | repo->enable_log_filecount); | 550 | repo->enable_log_filecount); |
545 | fprintf(f, "repo.enable-log-linecount=%d\n", | 551 | fprintf(f, "repo.enable-log-linecount=%d\n", |
546 | repo->enable_log_linecount); | 552 | repo->enable_log_linecount); |
547 | if (repo->about_filter && repo->about_filter != ctx.cfg.about_filter) | 553 | if (repo->about_filter && repo->about_filter != ctx.cfg.about_filter) |
548 | fprintf(f, "repo.about-filter=%s\n", repo->about_filter->cmd); | 554 | fprintf(f, "repo.about-filter=%s\n", repo->about_filter->cmd); |
549 | if (repo->commit_filter && repo->commit_filter != ctx.cfg.commit_filter) | 555 | if (repo->commit_filter && repo->commit_filter != ctx.cfg.commit_filter) |
550 | fprintf(f, "repo.commit-filter=%s\n", repo->commit_filter->cmd); | 556 | fprintf(f, "repo.commit-filter=%s\n", repo->commit_filter->cmd); |
551 | if (repo->source_filter && repo->source_filter != ctx.cfg.source_filter) | 557 | if (repo->source_filter && repo->source_filter != ctx.cfg.source_filter) |
552 | fprintf(f, "repo.source-filter=%s\n", repo->source_filter->cmd); | 558 | fprintf(f, "repo.source-filter=%s\n", repo->source_filter->cmd); |
553 | if (repo->snapshots != ctx.cfg.snapshots) { | 559 | if (repo->snapshots != ctx.cfg.snapshots) { |
554 | char *tmp = build_snapshot_setting(repo->snapshots); | 560 | char *tmp = build_snapshot_setting(repo->snapshots); |
555 | fprintf(f, "repo.snapshots=%s\n", tmp); | 561 | fprintf(f, "repo.snapshots=%s\n", tmp); |
556 | free(tmp); | 562 | free(tmp); |
557 | } | 563 | } |
558 | if (repo->max_stats != ctx.cfg.max_stats) | 564 | if (repo->max_stats != ctx.cfg.max_stats) |
559 | fprintf(f, "repo.max-stats=%s\n", | 565 | fprintf(f, "repo.max-stats=%s\n", |
560 | cgit_find_stats_periodname(repo->max_stats)); | 566 | cgit_find_stats_periodname(repo->max_stats)); |
561 | fprintf(f, "\n"); | 567 | fprintf(f, "\n"); |
562 | } | 568 | } |
563 | 569 | ||
564 | void print_repolist(FILE *f, struct cgit_repolist *list, int start) | 570 | void print_repolist(FILE *f, struct cgit_repolist *list, int start) |
565 | { | 571 | { |
566 | int i; | 572 | int i; |
567 | 573 | ||
568 | for(i = start; i < list->count; i++) | 574 | for(i = start; i < list->count; i++) |
569 | print_repo(f, &list->repos[i]); | 575 | print_repo(f, &list->repos[i]); |
570 | } | 576 | } |
571 | 577 | ||
572 | /* Scan 'path' for git repositories, save the resulting repolist in 'cached_rc' | 578 | /* Scan 'path' for git repositories, save the resulting repolist in 'cached_rc' |
573 | * and return 0 on success. | 579 | * and return 0 on success. |
574 | */ | 580 | */ |