diff options
Diffstat (limited to 'source/cgit.h')
| -rw-r--r-- | source/cgit.h | 186 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 file changed, 43 insertions, 143 deletions
diff --git a/source/cgit.h b/source/cgit.h index b05876e..eadb680 100644 --- a/source/cgit.h +++ b/source/cgit.h @@ -1,95 +1,71 @@ +/* + * The vocabulary shared by every part of cgit. It pulls in the git headers + * the renderers are written against, declares the record types they pass + * around, and declares the single global ctx holding the parsed request, the + * effective configuration and the repository being served. Anything that + * belongs to one module is declared in that module's own header instead. + */ + #ifndef CGIT_H #define CGIT_H -#include <stdbool.h> - +// git-compat-util.h sets the feature test macros that git's own headers and +// the system headers are then compiled against, so it has to come first. #include <git-compat-util.h> #include <archive.h> +#include <blame.h> #include <commit.h> +#include <config.h> #include <date.h> -#include <diffcore.h> #include <diff.h> +#include <diffcore.h> #include <environment.h> #include <graph.h> #include <grep.h> #include <hex.h> #include <log-tree.h> #include <notes.h> -#include <object.h> #include <object-name.h> +#include <object.h> #include <odb.h> +#include <packfile.h> #include <path.h> #include <refs.h> #include <revision.h> #include <setup.h> +#include <stdbool.h> #include <string-list.h> #include <strvec.h> #include <tag.h> #include <tree.h> +#include <url.h> #include <utf8.h> +#include <version.h> #include <wrapper.h> #include <xdiff-interface.h> #include <xdiff/xdiff.h> -/* Add isgraph(x) to Git's sane ctype support (see git-compat-util.h) */ -#undef isgraph -#define isgraph(x) (isprint((x)) && !isspace((x))) - - -/* - * Limits used for relative dates - */ -#define TM_MIN 60 -#define TM_HOUR (TM_MIN * 60) -#define TM_DAY (TM_HOUR * 24) -#define TM_WEEK (TM_DAY * 7) -#define TM_YEAR (TM_DAY * 365) -#define TM_MONTH (TM_YEAR / 12.0) - - -/* - * Default encoding - */ +// Every page cgit renders is UTF-8, so commit text in another encoding is +// converted on the way in. #define PAGE_ENCODING "UTF-8" -#define BIT(x) (1U << (x)) - -/* - * Longest search string a request may supply. The filter bar matches its - * query against every item a page lists, so this bounds the work one request - * can ask for. It is not a configuration knob, in the same way as the ofs - * ceiling in querystring_cb. - */ -#define CGIT_MAX_SEARCH_LEN 512 - -typedef void (*configfn)(const char *name, const char *value); -typedef void (*filepair_fn)(struct diff_filepair *pair); -typedef void (*linediff_fn)(char *line, int len); +// The month is a double because a twelfth of a year is not a whole number of +// seconds. +#define SECONDS_PER_MINUTE 60 +#define SECONDS_PER_HOUR (SECONDS_PER_MINUTE * 60) +#define SECONDS_PER_DAY (SECONDS_PER_HOUR * 24) +#define SECONDS_PER_WEEK (SECONDS_PER_DAY * 7) +#define SECONDS_PER_YEAR (SECONDS_PER_DAY * 365) +#define SECONDS_PER_MONTH (SECONDS_PER_YEAR / 12.0) typedef enum { DIFF_UNIFIED, DIFF_SSDIFF, DIFF_STATONLY } diff_type; -typedef enum { - ABOUT, COMMIT, SOURCE, EMAIL, AUTH -} filter_type; - -struct cgit_filter { - int (*open)(struct cgit_filter *, va_list ap); - int (*close)(struct cgit_filter *); - void (*fprintfp)(struct cgit_filter *, FILE *, const char *prefix); - void (*cleanup)(struct cgit_filter *); - int argument_count; -}; - -struct cgit_exec_filter { - struct cgit_filter base; - char *cmd; - char **argv; - int old_stdout; - int pid; -}; +// Filters are only ever held by pointer here, so their layout stays private +// to filter.h. +struct cgit_filter; struct cgit_repo { char *url; @@ -140,11 +116,13 @@ struct commitinfo { struct commit *commit; char *author; char *author_email; - unsigned long author_date; + // git's own width for a commit timestamp, which is wider than a long + // on a 32 bit host and on Windows. + timestamp_t author_date; int author_tz; char *committer; char *committer_email; - unsigned long committer_date; + timestamp_t committer_date; int committer_tz; char *subject; char *msg; @@ -154,7 +132,7 @@ struct commitinfo { struct taginfo { char *tagger; char *tagger_email; - unsigned long tagger_date; + timestamp_t tagger_date; int tagger_tz; char *msg; }; @@ -224,7 +202,7 @@ struct cgit_config { char *script_name; char *section; char *repository_sort; - char *virtual_root; /* Always ends with '/'. */ + char *virtual_root; // Always ends with a slash. char *strict_export; struct date_mode date_mode; int cache_size; @@ -316,7 +294,9 @@ struct cgit_environment { const char *server_port; const char *http_cookie; const char *http_referer; - unsigned int content_length; + // A byte count, so size_t rather than a fixed width type that would + // wrap at four gigabytes on the way in. + size_t content_length; int authenticated; }; @@ -326,97 +306,17 @@ struct cgit_context { struct cgit_config cfg; struct cgit_repo *repo; struct cgit_page page; - // Set once the repository is known to hold no commits, so the page - // header can drop the tabs that cannot render anything. + // Set when the repository holds no commits, so the page header can drop + // the tabs that cannot render anything. int empty_repo; }; -typedef int (*write_archive_fn_t)(const char *, const char *); - -struct cgit_snapshot_format { - const char *suffix; - const char *mimetype; - write_archive_fn_t write_func; -}; - extern const char *cgit_version; extern struct cgit_repolist cgit_repolist; extern struct cgit_context ctx; -extern const struct cgit_snapshot_format cgit_snapshot_formats[]; -extern char *cgit_default_repo_desc; -extern struct cgit_repo *cgit_add_repo(const char *url); -extern struct cgit_repo *cgit_get_repoinfo(const char *url); extern void cgit_repo_config(struct cgit_repo *repo, const char *name, const char *value); -extern int cgit_die_unless_zero(int result, const char *msg); -extern int cgit_die_unless_positive(int result, const char *msg); -extern int cgit_die_unless_non_negative(int result, const char *msg); - -extern char *cgit_trim_end(const char *str, char c); -extern char *cgit_ensure_end(const char *str, char c); - -extern void strbuf_ensure_end(struct strbuf *sb, char c); - -extern void cgit_add_ref(struct reflist *list, struct refinfo *ref); -extern void cgit_free_reflist_inner(struct reflist *list); -extern int cgit_refs_cb(const struct reference *ref, void *cb_data); - -extern void cgit_free_commitinfo(struct commitinfo *info); -extern void cgit_free_taginfo(struct taginfo *info); - -void cgit_diff_tree_cb(struct diff_queue_struct *q, - struct diff_options *options, void *data); - -extern int cgit_diff_files(const struct object_id *old_oid, - const struct object_id *new_oid, - unsigned long *old_size, unsigned long *new_size, - int *binary, int context, int ignorews, - linediff_fn fn); - -extern void cgit_diff_tree(const struct object_id *old_oid, - const struct object_id *new_oid, - filepair_fn fn, const char *prefix, int ignorews); - -extern void cgit_diff_commit(struct commit *commit, filepair_fn fn, - const char *prefix); - -__attribute__((format (printf,1,2))) -extern char *cgit_fmt(const char *format,...); - -__attribute__((format (printf,1,2))) -extern char *cgit_fmtalloc(const char *format,...); - -extern struct commitinfo *cgit_parse_commit(struct commit *commit); -extern struct taginfo *cgit_parse_tag(struct tag *tag); -extern void cgit_parse_url(const char *url); - -extern const char *cgit_repobasename(const char *reponame); - -extern int cgit_parse_snapshots_mask(const char *str); -extern void cgit_parse_date_format(const char *format, struct date_mode *mode); -extern const struct object_id *cgit_snapshot_get_sig(const char *ref, - const struct cgit_snapshot_format *f); -extern unsigned cgit_snapshot_format_bit(const struct cgit_snapshot_format *f); - -extern int cgit_open_filter(struct cgit_filter *filter, ...); -extern int cgit_close_filter(struct cgit_filter *filter); -extern void cgit_fprintf_filter(struct cgit_filter *filter, FILE *f, const char *prefix); -extern void cgit_exec_filter_init(struct cgit_exec_filter *filter, char *cmd, char **argv); -extern struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype); -extern void cgit_cleanup_filters(void); -extern void cgit_init_filters(void); - -extern void cgit_prepare_repo_env(struct cgit_repo * repo); - -extern int cgit_read_first_line(const char *path, char **buf, size_t *size); - -extern char *cgit_strdup_first_line(const char *txt); - -extern char *cgit_expand_macros(const char *txt); - -extern char *cgit_get_mimetype_for_filename(const char *filename); - -#endif /* CGIT_H */ +#endif // CGIT_H |
