diff options
Diffstat (limited to 'ui-shared.c')
| -rw-r--r-- | ui-shared.c | 86 | 
1 files changed, 74 insertions, 12 deletions
| diff --git a/ui-shared.c b/ui-shared.c index 5aa9119..43166af 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -133,7 +133,7 @@ char *cgit_currurl()  		return fmt("%s/", ctx.cfg.virtual_root);  } -static void site_url(const char *page, const char *search, int ofs) +static void site_url(const char *page, const char *search, const char *sort, int ofs)  {  	char *delim = "?"; @@ -154,6 +154,12 @@ static void site_url(const char *page, const char *search, int ofs)  		html_attr(search);  		delim = "&";  	} +	if (sort) { +		html(delim); +		html("s="); +		html_attr(sort); +		delim = "&"; +	}  	if (ofs) {  		html(delim);  		htmlf("ofs=%d", ofs); @@ -161,7 +167,7 @@ static void site_url(const char *page, const char *search, int ofs)  }  static void site_link(const char *page, const char *name, const char *title, -		      const char *class, const char *search, int ofs) +		      const char *class, const char *search, const char *sort, int ofs)  {  	html("<a");  	if (title) { @@ -175,16 +181,16 @@ static void site_link(const char *page, const char *name, const char *title,  		html("'");  	}  	html(" href='"); -	site_url(page, search, ofs); +	site_url(page, search, sort, ofs);  	html("'>");  	html_txt(name);  	html("</a>");  }  void cgit_index_link(const char *name, const char *title, const char *class, -		     const char *pattern, int ofs) +		     const char *pattern, const char *sort, int ofs)  { -	site_link(NULL, name, title, class, pattern, ofs); +	site_link(NULL, name, title, class, pattern, sort, ofs);  }  static char *repolink(const char *title, const char *class, const char *page, @@ -288,7 +294,7 @@ void cgit_log_link(const char *name, const char *title, const char *class,  	char *delim;  	delim = repolink(title, class, "log", head, path); -	if (rev && strcmp(rev, ctx.qry.head)) { +	if (rev && ctx.qry.head && strcmp(rev, ctx.qry.head)) {  		html(delim);  		html("id=");  		html_url_arg(rev); @@ -332,7 +338,7 @@ void cgit_commit_link(char *name, const char *title, const char *class,  	char *delim;  	delim = repolink(title, class, "commit", head, path); -	if (rev && strcmp(rev, ctx.qry.head)) { +	if (rev && ctx.qry.head && strcmp(rev, ctx.qry.head)) {  		html(delim);  		html("id=");  		html_url_arg(rev); @@ -428,7 +434,7 @@ void cgit_self_link(char *name, const char *title, const char *class,  		    struct cgit_context *ctx)  {  	if (!strcmp(ctx->qry.page, "repolist")) -		return cgit_index_link(name, title, class, ctx->qry.search, +		return cgit_index_link(name, title, class, ctx->qry.search, ctx->qry.sort,  				       ctx->qry.ofs);  	else if (!strcmp(ctx->qry.page, "summary"))  		return cgit_summary_link(name, title, class, ctx->qry.head); @@ -503,6 +509,62 @@ void cgit_object_link(struct object *obj)  	reporevlink(page, name, NULL, NULL, ctx.qry.head, fullrev, NULL);  } +struct string_list_item *lookup_path(struct string_list *list, +				     const char *path) +{ +	struct string_list_item *item; + +	while (path && path[0]) { +		if ((item = string_list_lookup(list, path))) +			return item; +		if (!(path = strchr(path, '/'))) +			break; +		path++; +	} +	return NULL; +} + +void cgit_submodule_link(const char *class, char *path, const char *rev) +{ +	struct string_list *list; +	struct string_list_item *item; +	char tail, *dir; +	size_t len; + +	tail = 0; +	list = &ctx.repo->submodules; +	item = lookup_path(list, path); +	if (!item) { +		len = strlen(path); +		tail = path[len - 1]; +		if (tail == '/') { +			path[len - 1] = 0; +			item = lookup_path(list, path); +		} +	} +	html("<a "); +	if (class) +		htmlf("class='%s' ", class); +	html("href='"); +	if (item) { +		html_attr(fmt(item->util, rev)); +	} else if (ctx.repo->module_link) { +		dir = strrchr(path, '/'); +		if (dir) +			dir++; +		else +			dir = path; +		html_attr(fmt(ctx.repo->module_link, dir, rev)); +	} else { +		html("#"); +	} +	html("'>"); +	html_txt(path); +	html("</a>"); +	if (item && tail) +		path[len - 1] = tail; +} +  void cgit_print_date(time_t secs, const char *format, int local_time)  {  	char buf[64]; @@ -613,7 +675,7 @@ void cgit_print_docstart(struct cgit_context *ctx)  		html_attr(ctx->cfg.favicon);  		html("'/>\n");  	} -	if (host && ctx->repo) { +	if (host && ctx->repo && ctx->qry.head) {  		html("<link rel='alternate' title='Atom feed' href='");  		html(cgit_httpscheme());  		html_attr(cgit_hosturl()); @@ -782,7 +844,7 @@ static void print_header(struct cgit_context *ctx)  	html("<td class='main'>");  	if (ctx->repo) { -		cgit_index_link("index", NULL, NULL, NULL, 0); +		cgit_index_link("index", NULL, NULL, NULL, NULL, 0);  		html(" : ");  		cgit_summary_link(ctx->repo->name, ctx->repo->name, NULL, NULL);  		html("</td><td class='form'>"); @@ -858,10 +920,10 @@ void cgit_print_pageheader(struct cgit_context *ctx)  		html("<input type='submit' value='search'/>\n");  		html("</form>\n");  	} else { -		site_link(NULL, "index", NULL, hc(ctx, "repolist"), NULL, 0); +		site_link(NULL, "index", NULL, hc(ctx, "repolist"), NULL, NULL, 0);  		if (ctx->cfg.root_readme)  			site_link("about", "about", NULL, hc(ctx, "about"), -				  NULL, 0); +				  NULL, NULL, 0);  		html("</td><td class='form'>");  		html("<form method='get' action='");  		html_attr(cgit_rooturl()); | 
