summaryrefslogtreecommitdiffstatshomepage
path: root/tests/t0106-diff.sh
Commit message (Expand)AuthorAge
* tests: use Git's test frameworkJohn Keeping2013-04-08
* tests: "grep -e" is not portable to all platformsJohn Keeping2013-03-04
* Create initial testsuiteLars Hjemli2007-11-11
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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
/* ui-repolist.c: functions for generating the repolist page
 *
 * Copyright (C) 2006 Lars Hjemli
 *
 * Licensed under GNU General Public License v2
 *   (see COPYING for full license text)
 */

#include <time.h>

#include "cgit.h"
#include "html.h"
#include "ui-shared.h"

time_t read_agefile(char *path)
{
	FILE *f;
	static char buf[64], buf2[64];

	if (!(f = fopen(path, "r")))
		return -1;
	fgets(buf, sizeof(buf), f);
	fclose(f);
	if (parse_date(buf, buf2, sizeof(buf2)))
		return strtoul(buf2, NULL, 10);
	else
		return 0;
}

static void print_modtime(struct cgit_repo *repo)
{
	char *path;
	struct stat s;

	path = fmt("%s/%s", repo->path, ctx.cfg.agefile);
	if (stat(path, &s) == 0) {
		cgit_print_age(read_agefile(path), -1, NULL);
		return;
	}

	path = fmt("%s/refs/heads/%s", repo->path, repo->defbranch);
	if (stat(path, &s) != 0)
		return;
	cgit_print_age(s.st_mtime, -1, NULL);
}

int is_match(struct cgit_repo *repo)
{
	if (!ctx.qry.search)
		return 1;
	if (repo->url && strcasestr(repo->url, ctx.qry.search))
		return 1;
	if (repo->name && strcasestr(repo->name, ctx.qry.search))
		return 1;
	if (repo->desc && strcasestr(repo->desc, ctx.qry.search))
		return 1;
	if (repo->owner && strcasestr(repo->owner, ctx.qry.search))
		return 1;
	return 0;
}

void print_header(int columns)
{
	html("<tr class='nohover'>"
	     "<th class='left'>Name</th>"
	     "<th class='left'>Description</th>"
	     "<th class='left'>Owner</th>"
	     "<th class='left'>Idle</th>");
	if (ctx.cfg.enable_index_links)
		html("<th class='left'>Links</th>");
	html("</tr>\n");
}


void print_pager(int items, int pagelen, char *search)
{
	int i;
	html("<div class='pager'>");
	for(i = 0; i * pagelen < items; i++)
		cgit_index_link(fmt("[%d]", i+1), fmt("Page %d", i+1), NULL,
				search, i * pagelen);
	html("</div>");
}

void cgit_print_repolist()
{
	int i, columns = 4, hits = 0, header = 0;
	char *last_group = NULL;

	if (ctx.cfg.enable_index_links)
		columns++;

	ctx.page.title = ctx.cfg.root_title;
	cgit_print_http_headers(&ctx);
	cgit_print_docstart(&ctx);
	cgit_print_pageheader(&ctx);

	if (ctx.cfg.index_header)
		html_include(ctx.cfg.index_header);

	html("<table summary='repository list' class='list nowrap'>");
	for (i=0; i<cgit_repolist.count; i++) {
		ctx.repo = &cgit_repolist.repos[i];
		if (!is_match(ctx.repo))
			continue;
		hits++;
		if (hits <= ctx.qry.ofs)
			continue;
		if (hits > ctx.qry.ofs + ctx.cfg.max_repo_count)
			continue;
		if (!header++)
			print_header(columns);
		if ((last_group == NULL && ctx.repo->group != NULL) ||
		    (last_group != NULL && ctx.repo->group == NULL) ||
		    (last_group != NULL && ctx.repo->group != NULL &&
		     strcmp(ctx.repo->group, last_group))) {
			htmlf("<tr class='nohover'><td colspan='%d' class='repogroup'>",
			      columns);
			html_txt(ctx.repo->group);
			html("</td></tr>");
			last_group = ctx.repo->group;
		}
		htmlf("<tr><td class='%s'>",
		      ctx.repo->group ? "sublevel-repo" : "toplevel-repo");
		html_link_open(cgit_repourl(ctx.repo->url), NULL, NULL);
		html_txt(ctx.repo->name);
		html_link_close();
		html("</td><td>");
		html_link_open(cgit_repourl(ctx.repo->url), NULL, NULL);
		html_ntxt(ctx.cfg.max_repodesc_len, ctx.repo->desc);
		html_link_close();
		html("</td><td>");
		html_txt(ctx.repo->owner);
		html("</td><td>");
		print_modtime(ctx.repo);
		html("</td>");
		if (ctx.cfg.enable_index_links) {
			html("<td>");
			html_link_open(cgit_repourl(ctx.repo->url),
				       NULL, "button");
			html("summary</a>");
			cgit_log_link("log", NULL, "button", NULL, NULL, NULL,
				      0, NULL, NULL);
			cgit_tree_link("tree", NULL, "button", NULL, NULL, NULL);
			html("</td>");
		}
		html("</tr>\n");
	}
	html("</table>");
	if (!hits)
		cgit_print_error("No repositories found");
	else if (hits > ctx.cfg.max_repo_count)
		print_pager(hits, ctx.cfg.max_repo_count, ctx.qry.search);
	cgit_print_docend();
}

void cgit_print_site_readme()
{
	if (ctx.cfg.root_readme)
		html_include(ctx.cfg.root_readme);
}