diff options
Diffstat (limited to 'shared.c')
-rw-r--r-- | shared.c | 51 |
1 files changed, 36 insertions, 15 deletions
@@ -7,6 +7,8 @@ | |||
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include "cgit.h" | 9 | #include "cgit.h" |
10 | #include <stdio.h> | ||
11 | #include <linux/limits.h> | ||
10 | 12 | ||
11 | struct cgit_repolist cgit_repolist; | 13 | struct cgit_repolist cgit_repolist; |
12 | struct cgit_context ctx; | 14 | struct cgit_context ctx; |
@@ -100,23 +102,15 @@ void *cgit_free_commitinfo(struct commitinfo *info) | |||
100 | char *trim_end(const char *str, char c) | 102 | char *trim_end(const char *str, char c) |
101 | { | 103 | { |
102 | int len; | 104 | int len; |
103 | char *s, *t; | ||
104 | 105 | ||
105 | if (str == NULL) | 106 | if (str == NULL) |
106 | return NULL; | 107 | return NULL; |
107 | t = (char *)str; | 108 | len = strlen(str); |
108 | len = strlen(t); | 109 | while(len > 0 && str[len - 1] == c) |
109 | while(len > 0 && t[len - 1] == c) | ||
110 | len--; | 110 | len--; |
111 | |||
112 | if (len == 0) | 111 | if (len == 0) |
113 | return NULL; | 112 | return NULL; |
114 | 113 | return xstrndup(str, len); | |
115 | c = t[len]; | ||
116 | t[len] = '\0'; | ||
117 | s = xstrdup(t); | ||
118 | t[len] = c; | ||
119 | return s; | ||
120 | } | 114 | } |
121 | 115 | ||
122 | char *strlpart(char *txt, int maxlen) | 116 | char *strlpart(char *txt, int maxlen) |
@@ -311,7 +305,6 @@ void cgit_diff_tree(const unsigned char *old_sha1, | |||
311 | filepair_fn fn, const char *prefix, int ignorews) | 305 | filepair_fn fn, const char *prefix, int ignorews) |
312 | { | 306 | { |
313 | struct diff_options opt; | 307 | struct diff_options opt; |
314 | int ret; | ||
315 | int prefixlen; | 308 | int prefixlen; |
316 | 309 | ||
317 | diff_setup(&opt); | 310 | diff_setup(&opt); |
@@ -332,9 +325,9 @@ void cgit_diff_tree(const unsigned char *old_sha1, | |||
332 | diff_setup_done(&opt); | 325 | diff_setup_done(&opt); |
333 | 326 | ||
334 | if (old_sha1 && !is_null_sha1(old_sha1)) | 327 | if (old_sha1 && !is_null_sha1(old_sha1)) |
335 | ret = diff_tree_sha1(old_sha1, new_sha1, "", &opt); | 328 | diff_tree_sha1(old_sha1, new_sha1, "", &opt); |
336 | else | 329 | else |
337 | ret = diff_root_tree_sha1(new_sha1, "", &opt); | 330 | diff_root_tree_sha1(new_sha1, "", &opt); |
338 | diffcore_std(&opt); | 331 | diffcore_std(&opt); |
339 | diff_flush(&opt); | 332 | diff_flush(&opt); |
340 | } | 333 | } |
@@ -376,7 +369,33 @@ int cgit_parse_snapshots_mask(const char *str) | |||
376 | return rv; | 369 | return rv; |
377 | } | 370 | } |
378 | 371 | ||
379 | int cgit_open_filter(struct cgit_filter *filter) | 372 | typedef struct { |
373 | char * name; | ||
374 | char * value; | ||
375 | } cgit_env_var; | ||
376 | |||
377 | static void prepare_env(struct cgit_repo * repo) { | ||
378 | cgit_env_var env_vars[] = { | ||
379 | { .name = "CGIT_REPO_URL", .value = repo->url }, | ||
380 | { .name = "CGIT_REPO_NAME", .value = repo->name }, | ||
381 | { .name = "CGIT_REPO_PATH", .value = repo->path }, | ||
382 | { .name = "CGIT_REPO_OWNER", .value = repo->owner }, | ||
383 | { .name = "CGIT_REPO_DEFBRANCH", .value = repo->defbranch }, | ||
384 | { .name = "CGIT_REPO_SECTION", .value = repo->section }, | ||
385 | { .name = "CGIT_REPO_CLONE_URL", .value = repo->clone_url } | ||
386 | }; | ||
387 | int env_var_count = ARRAY_SIZE(env_vars); | ||
388 | cgit_env_var *p, *q; | ||
389 | static char *warn = "cgit warning: failed to set env: %s=%s\n"; | ||
390 | |||
391 | p = env_vars; | ||
392 | q = p + env_var_count; | ||
393 | for (; p < q; p++) | ||
394 | if (setenv(p->name, p->value, 1)) | ||
395 | fprintf(stderr, warn, p->name, p->value); | ||
396 | } | ||
397 | |||
398 | int cgit_open_filter(struct cgit_filter *filter, struct cgit_repo * repo) | ||
380 | { | 399 | { |
381 | 400 | ||
382 | filter->old_stdout = chk_positive(dup(STDOUT_FILENO), | 401 | filter->old_stdout = chk_positive(dup(STDOUT_FILENO), |
@@ -387,6 +406,8 @@ int cgit_open_filter(struct cgit_filter *filter) | |||
387 | close(filter->pipe_fh[1]); | 406 | close(filter->pipe_fh[1]); |
388 | chk_non_negative(dup2(filter->pipe_fh[0], STDIN_FILENO), | 407 | chk_non_negative(dup2(filter->pipe_fh[0], STDIN_FILENO), |
389 | "Unable to use pipe as STDIN"); | 408 | "Unable to use pipe as STDIN"); |
409 | if (repo) | ||
410 | prepare_env(repo); | ||
390 | execvp(filter->cmd, filter->argv); | 411 | execvp(filter->cmd, filter->argv); |
391 | die("Unable to exec subprocess %s: %s (%d)", filter->cmd, | 412 | die("Unable to exec subprocess %s: %s (%d)", filter->cmd, |
392 | strerror(errno), errno); | 413 | strerror(errno), errno); |