setenv("GIT_DIR", cgit_repo->path, 1);
if ((cgit_cmd == CMD_SNAPSHOT) && cgit_repo->snapshots) {
- cgit_print_snapshot(item, cgit_query_sha1, "zip",
- cgit_repo->url, cgit_query_name);
+ cgit_print_snapshot(item, cgit_query_sha1,
+ cgit_repobasename(cgit_repo->url),
+ cgit_query_name,
+ cgit_repo->snapshots );
return;
}
case CMD_COMMIT:
cgit_print_commit(cgit_query_sha1);
break;
+ case CMD_TAG:
+ cgit_print_tag(cgit_query_sha1);
+ break;
case CMD_DIFF:
cgit_print_diff(cgit_query_sha1, cgit_query_sha2);
break;
#define CMD_TREE 4
#define CMD_BLOB 5
#define CMD_SNAPSHOT 6
-
+#define CMD_TAG 7
/*
* Dateformats used on misc. pages
extern int chk_zero(int result, char *msg);
extern int chk_positive(int result, char *msg);
+ extern int chk_non_negative(int result, char *msg);
extern int hextoint(char c);
extern char *trim_end(const char *str, char c);
extern int cache_expired(struct cacheitem *item);
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 const char *cgit_repobasename(const char *reponame);
+
extern void cgit_tree_link(char *name, char *title, char *class, char *head,
char *rev, char *path);
extern void cgit_log_link(char *name, char *title, char *class, char *head,
extern void cgit_diff_link(char *name, char *title, char *class, char *head,
char *new_rev, char *old_rev, char *path);
+extern void cgit_object_link(struct object *obj);
+
extern void cgit_print_error(char *msg);
extern void cgit_print_date(time_t secs, char *format);
extern void cgit_print_age(time_t t, time_t max_relative, char *format);
extern void cgit_print_blob(struct cacheitem *item, const char *hex, char *path);
extern void cgit_print_tree(const char *rev, char *path);
extern void cgit_print_commit(char *hex);
+extern void cgit_print_tag(char *revname);
extern void cgit_print_diff(const char *new_hex, const char *old_hex);
extern void cgit_print_snapshot(struct cacheitem *item, const char *hex,
- const char *format, const char *prefix,
- const char *filename);
+ const char *prefix, const char *filename,
+ int snapshot);
+ extern void cgit_print_snapshot_links(const char *repo, const char *hex,int snapshots);
+ extern int cgit_parse_snapshots_mask(const char *str);
#endif /* CGIT_H */
int cgit_get_cmd_index(const char *cmd)
{
static char *cmds[] = {"log", "commit", "diff", "tree", "blob",
- "snapshot", NULL};
+ "snapshot", "tag", NULL};
int i;
for(i = 0; cmds[i]; i++)
return result;
}
+ int chk_non_negative(int result, char *msg)
+ {
+ if (result < 0)
+ die("%s: %s",msg, strerror(errno));
+ return result;
+ }
+
struct repoinfo *add_repo(const char *url)
{
struct repoinfo *ret;
else if (!strcmp(name, "nocache"))
cgit_nocache = atoi(value);
else if (!strcmp(name, "snapshots"))
- cgit_snapshots = atoi(value);
+ cgit_snapshots = cgit_parse_snapshots_mask(value);
else if (!strcmp(name, "enable-index-links"))
cgit_enable_index_links = atoi(value);
else if (!strcmp(name, "enable-log-filecount"))
else if (cgit_repo && !strcmp(name, "repo.defbranch"))
cgit_repo->defbranch = xstrdup(value);
else if (cgit_repo && !strcmp(name, "repo.snapshots"))
- cgit_repo->snapshots = cgit_snapshots * atoi(value);
+ cgit_repo->snapshots = cgit_snapshots & cgit_parse_snapshots_mask(value); /* XXX: &? */
else if (cgit_repo && !strcmp(name, "repo.enable-log-filecount"))
cgit_repo->enable_log_filecount = cgit_enable_log_filecount * atoi(value);
else if (cgit_repo && !strcmp(name, "repo.enable-log-linecount"))
}
}
- char *cgit_pageurl(const char *reponame, const char *pagename,
- const char *query)
+ char *cgit_fileurl(const char *reponame, const char *pagename,
+ const char *filename, const char *query)
{
if (cgit_virtual_root) {
if (query)
- return fmt("%s/%s/%s/?%s", cgit_virtual_root, reponame,
- pagename, query);
+ return fmt("%s/%s/%s/%s?%s", cgit_virtual_root, reponame,
+ pagename, filename?filename:"", query);
else
return fmt("%s/%s/%s/", cgit_virtual_root, reponame,
pagename);
}
}
+ char *cgit_pageurl(const char *reponame, const char *pagename,
+ const char *query)
+ {
+ return cgit_fileurl(reponame,pagename,0,query);
+ }
+
+ const char *cgit_repobasename(const char *reponame)
+ {
+ /* I assume we don't need to store more than one repo basename */
+ static char rvbuf[1024];
+ int p;
+ const char *rv;
+ strncpy(rvbuf,reponame,sizeof(rvbuf));
+ if(rvbuf[sizeof(rvbuf)-1])
+ die("cgit_repobasename: truncated repository name '%s'", reponame);
+ p = strlen(rvbuf)-1;
+ /* strip trailing slashes */
+ while(p && rvbuf[p]=='/') rvbuf[p--]=0;
+ /* strip trailing .git */
+ if(p>=3 && !strncmp(&rvbuf[p-3],".git",4)) {
+ p -= 3; rvbuf[p--] = 0;
+ }
+ /* strip more trailing slashes if any */
+ while( p && rvbuf[p]=='/') rvbuf[p--]=0;
+ /* find last slash in the remaining string */
+ rv = strrchr(rvbuf,'/');
+ if(rv)
+ return ++rv;
+ return rvbuf;
+ }
+
char *cgit_currurl()
{
if (!cgit_virtual_root)
html("</a>");
}
+void cgit_object_link(struct object *obj)
+{
+ char *page, *arg, *url;
+
+ if (obj->type == OBJ_COMMIT) {
+ cgit_commit_link(fmt("commit %s", sha1_to_hex(obj->sha1)), NULL, NULL,
+ cgit_query_head, sha1_to_hex(obj->sha1));
+ return;
+ } else if (obj->type == OBJ_TREE) {
+ page = "tree";
+ arg = "id";
+ } else {
+ page = "blob";
+ arg = "id";
+ }
+
+ url = cgit_pageurl(cgit_query_repo, page,
+ fmt("%s=%s", arg, sha1_to_hex(obj->sha1)));
+ html_link_open(url, NULL, NULL);
+ htmlf("%s %s", typename(obj->type),
+ sha1_to_hex(obj->sha1));
+ html_link_close();
+}
+
void cgit_print_date(time_t secs, char *format)
{
char buf[64];
ttl_seconds(item->ttl)));
html("\n");
}
+
+ /* vim:set sw=8: */