summaryrefslogtreecommitdiffstatshomepage
path: root/ui-shared.h
blob: 1b8ecb5c19df17e38fd99d836b47a88f0d413ea9 (plain)
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
#ifndef UI_SHARED_H
#define UI_SHARED_H

extern const char *cgit_httpscheme();
extern const char *cgit_hosturl();
extern const char *cgit_rooturl();
extern const char *cgit_currenturl();
extern const char *cgit_loginurl();
extern char *cgit_repourl(const char *reponame);
extern char *cgit_fileurl(const char *reponame, const char *pagename,
			  const char *filename, const char *query);
extern char *cgit_pageurl(const char *reponame, const char *pagename,
			  const char *query);

extern void cgit_add_clone_urls(void (*fn)(const char *));

extern void cgit_index_link(const char *name, const char *title,
			    const char *class, const char *pattern, const char *sort, int ofs, int always_root);
extern void cgit_summary_link(const char *name, const char *title,
			      const char *class, const char *head);
extern void cgit_tag_link(const char *name, const char *title,
			  const char *class, const char *tag);
extern void cgit_tree_link(const char *name, const char *title,
			   const char *class, const char *head,
			   const char *rev, const char *path);
extern void cgit_plain_link(const char *name, const char *title,
			    const char *class, const char *head,
			    const char *rev, const char *path);
extern void cgit_log_link(const char *name, const char *title,
			  const char *class, const char *head, const char *rev,
			  const char *path, int ofs, const char *grep,
			  const char *pattern, int showmsg);
extern void cgit_commit_link(char *name, const char *title,
			     const char *class, const char *head,
			     const char *rev, const char *path);
extern void cgit_patch_link(const char *name, const char *title,
			    const char *class, const char *head,
			    const char *rev, const char *path);
extern void cgit_refs_link(const char *name, const char *title,
			   const char *class, const char *head,
			   const char *rev, const char *path);
extern void cgit_snapshot_link(const char *name, const char *title,
			       const char *class, const char *head,
			       const char *rev, const char *archivename);
extern void cgit_diff_link(const char *name, const char *title,
			   const char *class, const char *head,
			   const char *new_rev, const char *old_rev,
			   const char *path);
extern void cgit_stats_link(const char *name, const char *title,
			    const char *class, const char *head,
			    const char *path);
extern void cgit_object_link(struct object *obj);

extern void cgit_submodule_link(const char *class, char *path,
				const char *rev);

__attribute__((format (printf,1,2)))
extern void cgit_print_error(const char *fmt, ...);
__attribute__((format (printf,1,0)))
extern void cgit_vprint_error(const char *fmt, va_list ap);
extern void cgit_print_date(time_t secs, const char *format, int local_time);
extern void cgit_print_age(time_t t, time_t max_relative, const char *format);
extern void cgit_print_http_headers(void);
extern void cgit_print_docstart(void);
extern void cgit_print_docend();
extern void cgit_print_pageheader(void);
extern void cgit_print_filemode(unsigned short mode);
extern void cgit_print_snapshot_links(const char *repo, const char *head,
				      const char *hex, int snapshots);
extern void cgit_add_hidden_formfields(int incl_head, int incl_search,
				       const char *page);
#endif /* UI_SHARED_H */
span>, "Error reading owner-info for %s: %s (%d)\n", path, strerror(errno), errno); break; } if (pwd->pw_gecos) if ((p = strchr(pwd->pw_gecos, ','))) *p = '\0'; owner = xstrdup(pwd->pw_gecos ? pwd->pw_gecos : pwd->pw_name); } repo->owner = owner; p = fmt("%s/description", path); if (!stat(p, &st)) readfile(p, &repo->desc, &size); if (!repo->readme) { p = fmt("%s/README.html", path); if (!stat(p, &st)) repo->readme = "README.html"; } if (ctx.cfg.section_from_path) { n = ctx.cfg.section_from_path; if (n > 0) { slash = rel; while (slash && n && (slash = strchr(slash, '/'))) n--; } else { slash = rel + strlen(rel); while (slash && n && (slash = xstrrchr(rel, slash, '/'))) n++; } if (slash && !n) { *slash = '\0'; repo->section = xstrdup(rel); *slash = '/'; if (!prefixcmp(repo->name, repo->section)) { repo->name += strlen(repo->section); if (*repo->name == '/') repo->name++; } } } p = fmt("%s/cgitrc", path); if (!stat(p, &st)) { config_fn = fn; parse_configfile(xstrdup(p), &repo_config); } } static void scan_path(const char *base, const char *path, repo_config_fn fn) { DIR *dir = opendir(path); struct dirent *ent; char *buf; struct stat st; if (!dir) { fprintf(stderr, "Error opening directory %s: %s (%d)\n", path, strerror(errno), errno); return; } if (is_git_dir(path)) { add_repo(base, path, fn); goto end; } if (is_git_dir(fmt("%s/.git", path))) { add_repo(base, fmt("%s/.git", path), fn); goto end; } while((ent = readdir(dir)) != NULL) { if (ent->d_name[0] == '.') { if (ent->d_name[1] == '\0') continue; if (ent->d_name[1] == '.' && ent->d_name[2] == '\0') continue; if (!ctx.cfg.scan_hidden_path) continue; } buf = malloc(strlen(path) + strlen(ent->d_name) + 2); if (!buf) { fprintf(stderr, "Alloc error on %s: %s (%d)\n", path, strerror(errno), errno); exit(1); } sprintf(buf, "%s/%s", path, ent->d_name); if (stat(buf, &st)) { fprintf(stderr, "Error checking path %s: %s (%d)\n", buf, strerror(errno), errno); free(buf); continue; } if (S_ISDIR(st.st_mode)) scan_path(base, buf, fn); free(buf); } end: closedir(dir); } #define lastc(s) s[strlen(s) - 1] void scan_projects(const char *path, const char *projectsfile, repo_config_fn fn) { char line[MAX_PATH * 2], *z; FILE *projects; int err; projects = fopen(projectsfile, "r"); if (!projects) { fprintf(stderr, "Error opening projectsfile %s: %s (%d)\n", projectsfile, strerror(errno), errno); return; } while (fgets(line, sizeof(line), projects) != NULL) { for (z = &lastc(line); strlen(line) && strchr("\n\r", *z); z = &lastc(line)) *z = '\0'; if (strlen(line)) scan_path(path, fmt("%s/%s", path, line), fn); } if ((err = ferror(projects))) { fprintf(stderr, "Error reading from projectsfile %s: %s (%d)\n", projectsfile, strerror(err), err); } fclose(projects); } void scan_tree(const char *path, repo_config_fn fn) { scan_path(path, path, fn); }