about summary refs log tree commit diff
path: root/irc.c
blob: dce1358172fb77af3725254b82062d6e8b3abc6c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
/* Copyright (C) 2020 C. McEnroe <june@causal.agency> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <https://www.gnu.org/licenses/>. * * Additional permission under GNU GPL version 3 section 7: * * If you modify this Program, or any covered work, by linking or * combining it with LibreSSL (or a modified version of that library), * containing parts covered by the terms of the OpenSSL License and the * original SSLeay license, the licensors of this Program grant you * additional permission to convey the resulting work. Corresponding * Source for a non-source form of such a combination shall include the * source code for the parts of LibreSSL used as well as that of the * covered work. */ #include <assert.h> #include <err.h>
Suggested-by: Olivier Ramonat <olivier@ramonat.fr> Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-11-03Do not require javascript-enabled clientsLars Hjemli
A simple submit-button is all that's required to make the branch selector drop-down work on any client, so lets add one. Noticed-by: Olivier Ramonat <olivier@ramonat.fr> Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-11-03CGIT 0.7Lars Hjemli
2007-11-03Use GIT-1.5.3.5Lars Hjemli
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-11-03Don't include current SHA1 in 'log' menu-itemLars Hjemli
This ensures that the menu-item always prints the log for the active branch. Predictability is good. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-11-03Don't include current path in menu linksLars Hjemli
The menu-links are a lot more predictable this way. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-11-03Fix search form action/hidden fieldsLars Hjemli
The search form didn't properly honor the current path, so this commit fixes cgit_fileurl() and add_hidden_formfields() to make the issue go away. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-11-03Add search parameters to cgit_log_linkLars Hjemli
This makes the [prev] and [next] links work correctly on search results. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-11-03Fix typo in cssShunichi Fuji
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-30Change the cgit layoutLars Hjemli
This modifies and hopefully improves the layout of all cgit pages: * Remove the header from all pages and replace it with a sidebar; most pages have sufficient width but many needs more height. * Add a dropdown-box to switch between branches, using a one-liner javascript to reload the current page in context of the selected branch. * Include refs found below refs/archives in the sidebar, appearing as a set of menuitems below a 'download' heading. * Include the brand new cgit logo Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-30Add config param 'index-info'Lars Hjemli
This parameter will be used to include a html file in the upcoming sidebar on the index page. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-28Teach cgit_object_link() about tag objectsLars Hjemli
This makes random tag links more helpfull, e.g. when a branch head references a tag object, link to the tag page. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-28Make print_branch() handle refs not pointing at commitsLars Hjemli
The master branch of stable/linux-2.6.20 currently references a tag object, which makes print_branch() die with a segfault. This teaches print_branch() to handle such cases more gracefully. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-28Teach log search about --grep, --author and --committerLars Hjemli
This makes the log searching more explicit, using a dropdown box to specify the commit field to match against. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-28Add html_option() functionLars Hjemli
This is a generic function used to output html "option" tags. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-27cgit_parse_commit(): Add missing call to xstrdup()Lars Hjemli
It's rather silly to point into random memory-locations. Also, remove a call to strdup() used on a literal char *. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-27Cleanup code introduced by the filter-refs topicLars Hjemli
The functions used to print branches and tags were only half-done and somewhat confused. Fix it. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-27Add links to the new refs page from summary pageLars Hjemli
If either branches or tags are filtered on the summary page, add a link to refs/heads and/or refs/tags right below the last branch/tag. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-27Add support for refs viewLars Hjemli
This enables the new urls $repo/refs, $repo/refs/heads and $repo/refs/tags, which can be used to print _all_ branches and/or tags. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-27Make cgit_print_branches()/cgit_print_tags() externalLars Hjemli
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-27Add descriptions of summary-branches and summary-tags to cgitrcLars Hjemli
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-27Add support for config param summary-branchesLars Hjemli
This parameter can be used to specify max number of branches to show on the summary page (if not all branches will be displayed, the "most idle" branches are the ones to be pruned). The default value for this parameter is 0, which disables the pruning. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-27Move logic for age comparision from cmp_tag_age into cmp_age()Lars Hjemli
Simple refactoring to enable later filtering of branches based on age. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-27Add support for config param summary-tagsLars Hjemli
This parameter can be used to specify max number of tags to show on the summary page. If not specified, all tags are printed. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-27Sort tags by ageLars Hjemli
This adds a function to compare timestamps and then uses it as callback for qsort() before printing out tags. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-27Use reflist to print tag infoLars Hjemli
This updates ui-summary.c to use a reflist instead of for_each_tag_ref(), as a step towards more flexible tag handling (filtering/sorting). Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-27Use reflist to print branch infoLars Hjemli
This updates ui-summary.c to use a reflist instead of for_each_branch_ref(), as a step towards more flexible branch handling (filtering/sorting). Signed-off-by: Lars Hjemli <hjemli@gmail.com>
2007-10-27Add functions and types for ref listsLars Hjemli
This adds two structs, refinfo and reflist, and functions for building a list of refs. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
e">if (error) errx(EX_PROTOCOL, "tls_handshake: %s", tls_error(client)); return sock; } enum { MessageCap = 8191 + 512 }; static void debug(const char *pre, const char *line) { if (!self.debug) return; size_t len = strcspn(line, "\r\n"); uiFormat( Debug, Cold, NULL, "\3%02d%s\3\t%.*s", Gray, pre, (int)len, line ); if (!isatty(STDERR_FILENO)) { fprintf(stderr, "%s %.*s\n", pre, (int)len, line); } } void ircSend(const char *ptr, size_t len) { assert(client); while (len) { ssize_t ret = tls_write(client, ptr, len); if (ret == TLS_WANT_POLLIN || ret == TLS_WANT_POLLOUT) continue; if (ret < 0) errx(EX_IOERR, "tls_write: %s", tls_error(client)); ptr += ret; len -= ret; } } void ircFormat(const char *format, ...) { char buf[MessageCap]; va_list ap; va_start(ap, format); int len = vsnprintf(buf, sizeof(buf), format, ap); va_end(ap); assert((size_t)len < sizeof(buf)); debug("<<", buf); ircSend(buf, len); } static const char *TagNames[TagCap] = { #define X(name, id) [id] = name, ENUM_TAG #undef X }; static void unescape(char *tag) { for (;;) { tag = strchr(tag, '\\'); if (!tag) break; switch (tag[1]) { break; case ':': tag[1] = ';'; break; case 's': tag[1] = ' '; break; case 'r': tag[1] = '\r'; break; case 'n': tag[1] = '\n'; } memmove(tag, &tag[1], strlen(&tag[1]) + 1); if (tag[0]) tag = &tag[1]; } } static struct Message parse(char *line) { struct Message msg = { .cmd = NULL }; if (line[0] == '@') { char *tags = 1 + strsep(&line, " "); while (tags) { char *tag = strsep(&tags, ";"); char *key = strsep(&tag, "="); for (uint i = 0; i < TagCap; ++i) { if (strcmp(key, TagNames[i])) continue; unescape(tag); msg.tags[i] = tag; break; } } } if (line[0] == ':') { char *origin = 1 + strsep(&line, " "); msg.nick = strsep(&origin, "!"); msg.user = strsep(&origin, "@"); msg.host = origin; } msg.cmd = strsep(&line, " "); for (uint i = 0; line && i < ParamCap; ++i) { if (line[0] == ':') { msg.params[i] = &line[1]; break; } msg.params[i] = strsep(&line, " "); } return msg; } void ircRecv(void) { static char buf[MessageCap]; static size_t len = 0; assert(client); ssize_t ret = tls_read(client, &buf[len], sizeof(buf) - len); if (ret == TLS_WANT_POLLIN || ret == TLS_WANT_POLLOUT) return; if (ret < 0) errx(EX_IOERR, "tls_read: %s", tls_error(client)); if (!ret) errx(EX_PROTOCOL, "server closed connection"); len += ret; char *crlf; char *line = buf; for (;;) { crlf = memmem(line, &buf[len] - line, "\r\n", 2); if (!crlf) break; *crlf = '\0'; debug(">>", line); struct Message msg = parse(line); handle(&msg); line = crlf + 2; } len -= line - buf; memmove(buf, line, len); } void ircClose(void) { int error = tls_close(client); if (error) errx(EX_IOERR, "tls_close: %s", tls_error(client)); tls_free(client); }