diff options
context:
space:
mode:
authorBryce Kwon <bryce@brycekwon.com>
committerBryce Kwon <bryce@brycekwon.com>
commit
parent
tree
download
Restyle the sources and fix the audit's findings
Diffstat (limited to '')
-rw-r--r--source/cgit.h186
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