[csw-devel] SF.net SVN: gar:[6966] csw/mgar/pkg/cgit/trunk

trygvis at users.sourceforge.net trygvis at users.sourceforge.net
Sun Oct 25 20:55:04 CET 2009


Revision: 6966
          http://gar.svn.sourceforge.net/gar/?rev=6966&view=rev
Author:   trygvis
Date:     2009-10-25 19:55:04 +0000 (Sun, 25 Oct 2009)

Log Message:
-----------
o Using my own fork of cgit.

Modified Paths:
--------------
    csw/mgar/pkg/cgit/trunk/Makefile

Removed Paths:
-------------
    csw/mgar/pkg/cgit/trunk/files/8071e18dcbf56b98ecea4332e85884cdd91236cc-d8eb68d5d487014a16b680e7d52122d3415303da.diff

Modified: csw/mgar/pkg/cgit/trunk/Makefile
===================================================================
--- csw/mgar/pkg/cgit/trunk/Makefile	2009-10-25 19:40:41 UTC (rev 6965)
+++ csw/mgar/pkg/cgit/trunk/Makefile	2009-10-25 19:55:04 UTC (rev 6966)
@@ -24,8 +24,7 @@
 # We define upstream file regex so we can be notifed of new upstream software release
 UFILES_REGEX = $(GARNAME)-(\d+(?:\.\d+)*).tar.gz
 
-#GIT_REPOS  = git://github.com/trygvis/cgit.git
-GIT_REPOS  = http://localhost/cgit/cgit
+GIT_REPOS  = git://github.com/trygvis/cgit.git
 #GIT_TREEISH_cgit = v$(GARVERSION)$(if $(PATCHLEVEL),-$(PATCHLEVEL))
 GIT_TREEISH_cgit = solaris
 
@@ -39,7 +38,6 @@
 # UPSTREAM_MASTER_SITES = 
 
 PATCHFILES  = 0001-cgit.conf
-PATCHFILES += 8071e18dcbf56b98ecea4332e85884cdd91236cc-d8eb68d5d487014a16b680e7d52122d3415303da.diff
 
 CONFIGURE_SCRIPTS = 
 

Deleted: csw/mgar/pkg/cgit/trunk/files/8071e18dcbf56b98ecea4332e85884cdd91236cc-d8eb68d5d487014a16b680e7d52122d3415303da.diff
===================================================================
--- csw/mgar/pkg/cgit/trunk/files/8071e18dcbf56b98ecea4332e85884cdd91236cc-d8eb68d5d487014a16b680e7d52122d3415303da.diff	2009-10-25 19:40:41 UTC (rev 6965)
+++ csw/mgar/pkg/cgit/trunk/files/8071e18dcbf56b98ecea4332e85884cdd91236cc-d8eb68d5d487014a16b680e7d52122d3415303da.diff	2009-10-25 19:55:04 UTC (rev 6966)
@@ -1,887 +0,0 @@
-diff --git a/Makefile b/Makefile
-index 60d8c58..cb7875e 100644
---- a/Makefile
-+++ b/Makefile
-@@ -90,6 +90,7 @@ OBJECTS += ui-refs.o
- OBJECTS += ui-repolist.o
- OBJECTS += ui-shared.o
- OBJECTS += ui-snapshot.o
-+OBJECTS += ui-ssdiff.o
- OBJECTS += ui-stats.o
- OBJECTS += ui-summary.o
- OBJECTS += ui-tag.o
-diff --git a/cgit.c b/cgit.c
-index bd37788..84f44ba 100644
---- a/cgit.c
-+++ b/cgit.c
-@@ -182,6 +182,8 @@ void config_cb(const char *name, const char *value)
- 		ctx.cfg.summary_branches = atoi(value);
- 	else if (!strcmp(name, "summary-tags"))
- 		ctx.cfg.summary_tags = atoi(value);
-+	else if (!strcmp(name, "side-by-side-diffs"))
-+		ctx.cfg.ssdiff = atoi(value);
- 	else if (!strcmp(name, "agefile"))
- 		ctx.cfg.agefile = xstrdup(value);
- 	else if (!strcmp(name, "renamelimit"))
-@@ -209,6 +211,8 @@ static void querystring_cb(const char *name, const char *value)
- 	} else if (!strcmp(name, "p")) {
- 		ctx.qry.page = xstrdup(value);
- 	} else if (!strcmp(name, "url")) {
-+		if (*value == '/')
-+			value++;
- 		ctx.qry.url = xstrdup(value);
- 		cgit_parse_url(value);
- 	} else if (!strcmp(name, "qt")) {
-@@ -238,6 +242,8 @@ static void querystring_cb(const char *name, const char *value)
- 		ctx.qry.showmsg = atoi(value);
- 	} else if (!strcmp(name, "period")) {
- 		ctx.qry.period = xstrdup(value);
-+	} else if (!strcmp(name, "ss")) {
-+		ctx.qry.ssdiff = atoi(value);
- 	}
- }
- 
-@@ -279,6 +285,7 @@ static void prepare_context(struct cgit_context *ctx)
- 	ctx->cfg.summary_branches = 10;
- 	ctx->cfg.summary_log = 10;
- 	ctx->cfg.summary_tags = 10;
-+	ctx->cfg.ssdiff = 0;
- 	ctx->env.cgit_config = xstrdupn(getenv("CGIT_CONFIG"));
- 	ctx->env.http_host = xstrdupn(getenv("HTTP_HOST"));
- 	ctx->env.https = xstrdupn(getenv("HTTPS"));
-diff --git a/cgit.css b/cgit.css
-index c47ebc9..3f37165 100644
---- a/cgit.css
-+++ b/cgit.css
-@@ -601,3 +601,92 @@ table.hgraph div.bar {
- 	background-color: #eee;
- 	height: 1em;
- }
-+
-+table.ssdiff {
-+	width: 100%;
-+}
-+
-+table.ssdiff td {
-+	font-size: 75%;
-+	font-family: monospace;
-+	white-space: pre;
-+	padding: 1px 4px 1px 4px;
-+	border-left: solid 1px #aaa;
-+	border-right: solid 1px #aaa;
-+}
-+
-+table.ssdiff td.add {
-+	color: black;
-+	background: #cfc;
-+	min-width: 50%;
-+}
-+
-+table.ssdiff td.add_dark {
-+	color: black;
-+	background: #aca;
-+	min-width: 50%;
-+}
-+
-+table.ssdiff td.del {
-+	color: black;
-+	background: #fcc;
-+	min-width: 50%;
-+}
-+
-+table.ssdiff td.del_dark {
-+	color: black;
-+	background: #caa;
-+	min-width: 50%;
-+}
-+
-+table.ssdiff td.changed {
-+	color: black;
-+	background: #ffc;
-+	min-width: 50%;
-+}
-+
-+table.ssdiff td.changed_dark {
-+	color: black;
-+	background: #cca;
-+	min-width: 50%;
-+}
-+
-+table.ssdiff td.lineno {
-+	color: black;
-+	background: #eee;
-+	text-align: right;
-+	width: 3em;
-+	min-width: 3em;
-+}
-+
-+table.ssdiff td.hunk {
-+	color: #black;
-+	background: #ccf;
-+	border-top: solid 1px #aaa;
-+	border-bottom: solid 1px #aaa;
-+}
-+
-+table.ssdiff td.head {
-+	border-top: solid 1px #aaa;
-+	border-bottom: solid 1px #aaa;
-+}
-+
-+table.ssdiff td.head div.head {
-+	font-weight: bold;
-+	color: black;
-+}
-+
-+table.ssdiff td.foot {
-+	border-top: solid 1px #aaa;
-+        border-left: none;
-+        border-right: none;
-+        border-bottom: none;
-+}
-+
-+table.ssdiff td.space {
-+	border: none;
-+}
-+
-+table.ssdiff td.space div {
-+	min-height: 3em;
-+}
-\ No newline at end of file
-diff --git a/cgit.h b/cgit.h
-index 6c6c460..b7b0adb 100644
---- a/cgit.h
-+++ b/cgit.h
-@@ -143,6 +143,7 @@ struct cgit_query {
- 	int nohead;
- 	char *sort;
- 	int showmsg;
-+	int ssdiff;
- };
- 
- struct cgit_config {
-@@ -194,6 +195,7 @@ struct cgit_config {
- 	int summary_branches;
- 	int summary_log;
- 	int summary_tags;
-+	int ssdiff;
- 	struct string_list mimetypes;
- 	struct cgit_filter *about_filter;
- 	struct cgit_filter *commit_filter;
-diff --git a/cgitrc.5.txt b/cgitrc.5.txt
-index 0c13485..d0fd9a1 100644
---- a/cgitrc.5.txt
-+++ b/cgitrc.5.txt
-@@ -241,6 +241,10 @@ section::
- 	after this option will inherit the current section name. Default value:
- 	none.
- 
-+side-by-side-diffs::
-+	If set to "1" shows side-by-side diffs instead of unidiffs per
-+	default. Default value: "0".
-+
- snapshots::
- 	Text which specifies the default set of snapshot formats generated by
- 	cgit. The value is a space-separated list of zero or more of the
-diff --git a/ui-commit.c b/ui-commit.c
-index f5b0ae5..b5e3c01 100644
---- a/ui-commit.c
-+++ b/ui-commit.c
-@@ -58,9 +58,14 @@ void cgit_print_commit(char *hex)
- 	html("</td></tr>\n");
- 	html("<tr><th>commit</th><td colspan='2' class='sha1'>");
- 	tmp = sha1_to_hex(commit->object.sha1);
--	cgit_commit_link(tmp, NULL, NULL, ctx.qry.head, tmp);
-+	cgit_commit_link(tmp, NULL, NULL, ctx.qry.head, tmp, 0);
- 	html(" (");
- 	cgit_patch_link("patch", NULL, NULL, NULL, tmp);
-+	html(") (");
-+	if ((ctx.qry.ssdiff && !ctx.cfg.ssdiff) || (!ctx.qry.ssdiff && ctx.cfg.ssdiff))
-+		cgit_commit_link("unidiff", NULL, NULL, ctx.qry.head, tmp, 1);
-+	else
-+		cgit_commit_link("side-by-side diff", NULL, NULL, ctx.qry.head, tmp, 1);
- 	html(")</td></tr>\n");
- 	html("<tr><th>tree</th><td colspan='2' class='sha1'>");
- 	tmp = xstrdup(hex);
-@@ -78,10 +83,10 @@ void cgit_print_commit(char *hex)
- 		html("<tr><th>parent</th>"
- 		     "<td colspan='2' class='sha1'>");
- 		cgit_commit_link(sha1_to_hex(p->item->object.sha1), NULL, NULL,
--				 ctx.qry.head, sha1_to_hex(p->item->object.sha1));
-+				 ctx.qry.head, sha1_to_hex(p->item->object.sha1), 0);
- 		html(" (");
- 		cgit_diff_link("diff", NULL, NULL, ctx.qry.head, hex,
--			       sha1_to_hex(p->item->object.sha1), NULL);
-+			       sha1_to_hex(p->item->object.sha1), NULL, 0);
- 		html(")</td></tr>");
- 		parents++;
- 	}
-diff --git a/ui-diff.c b/ui-diff.c
-index 2196745..a92a768 100644
---- a/ui-diff.c
-+++ b/ui-diff.c
-@@ -9,6 +9,7 @@
- #include "cgit.h"
- #include "html.h"
- #include "ui-shared.h"
-+#include "ui-ssdiff.h"
- 
- unsigned char old_rev_sha1[20];
- unsigned char new_rev_sha1[20];
-@@ -32,6 +33,7 @@ static struct fileinfo {
- 	int binary:1;
- } *items;
- 
-+static int use_ssdiff = 0;
- 
- static void print_fileinfo(struct fileinfo *info)
- {
-@@ -83,7 +85,7 @@ static void print_fileinfo(struct fileinfo *info)
- 	}
- 	htmlf("</td><td class='%s'>", class);
- 	cgit_diff_link(info->new_path, NULL, NULL, ctx.qry.head, ctx.qry.sha1,
--		       ctx.qry.sha2, info->new_path);
-+		       ctx.qry.sha2, info->new_path, 0);
- 	if (info->status == DIFF_STATUS_COPIED || info->status == DIFF_STATUS_RENAMED)
- 		htmlf(" (%s from %s)",
- 		      info->status == DIFF_STATUS_COPIED ? "copied" : "renamed",
-@@ -158,7 +160,7 @@ void cgit_print_diffstat(const unsigned char *old_sha1,
- 
- 	html("<div class='diffstat-header'>");
- 	cgit_diff_link("Diffstat", NULL, NULL, ctx.qry.head, ctx.qry.sha1,
--		       ctx.qry.sha2, NULL);
-+		       ctx.qry.sha2, NULL, 0);
- 	html("</div>");
- 	html("<table summary='diffstat' class='diffstat'>");
- 	max_changes = 0;
-@@ -246,26 +248,54 @@ static void header(unsigned char *sha1, char *path1, int mode1,
- 	html("</div>");
- }
- 
-+static void print_ssdiff_link()
-+{
-+	if (!strcmp(ctx.qry.page, "diff")) {
-+		if (use_ssdiff)
-+			cgit_diff_link("Unidiff", NULL, NULL, ctx.qry.head,
-+				       ctx.qry.sha1, ctx.qry.sha2, ctx.qry.path, 1);
-+		else
-+			cgit_diff_link("Side-by-side diff", NULL, NULL,
-+				       ctx.qry.head, ctx.qry.sha1,
-+				       ctx.qry.sha2, ctx.qry.path, 1);
-+	}
-+}
-+
- static void filepair_cb(struct diff_filepair *pair)
- {
- 	unsigned long old_size = 0;
- 	unsigned long new_size = 0;
- 	int binary = 0;
-+	linediff_fn print_line_fn = print_line;
- 
-+	if (use_ssdiff) {
-+		cgit_ssdiff_header_begin();
-+		print_line_fn = cgit_ssdiff_line_cb;
-+	}
- 	header(pair->one->sha1, pair->one->path, pair->one->mode,
- 	       pair->two->sha1, pair->two->path, pair->two->mode);
-+	if (use_ssdiff)
-+		cgit_ssdiff_header_end();
- 	if (S_ISGITLINK(pair->one->mode) || S_ISGITLINK(pair->two->mode)) {
- 		if (S_ISGITLINK(pair->one->mode))
--			print_line(fmt("-Subproject %s", sha1_to_hex(pair->one->sha1)), 52);
-+			print_line_fn(fmt("-Subproject %s", sha1_to_hex(pair->one->sha1)), 52);
- 		if (S_ISGITLINK(pair->two->mode))
--			print_line(fmt("+Subproject %s", sha1_to_hex(pair->two->sha1)), 52);
-+			print_line_fn(fmt("+Subproject %s", sha1_to_hex(pair->two->sha1)), 52);
-+		if (use_ssdiff)
-+			cgit_ssdiff_footer();
- 		return;
- 	}
--	if (cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size, 
--			    &new_size, &binary, print_line))
-+	if (cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size,
-+			    &new_size, &binary, print_line_fn))
- 		cgit_print_error("Error running diff");
--	if (binary)
--		html("Binary files differ");
-+	if (binary) {
-+		if (use_ssdiff)
-+			html("<tr><td colspan='4'>Binary files differ</td></tr>");
-+		else
-+			html("Binary files differ");
-+	}
-+	if (use_ssdiff)
-+		cgit_ssdiff_footer();
- }
- 
- void cgit_print_diff(const char *new_rev, const char *old_rev, const char *prefix)
-@@ -303,11 +333,21 @@ void cgit_print_diff(const char *new_rev, const char *old_rev, const char *prefi
- 		if (!commit2 || parse_commit(commit2))
- 			cgit_print_error(fmt("Bad commit: %s", sha1_to_hex(old_rev_sha1)));
- 	}
-+
-+	if ((ctx.qry.ssdiff && !ctx.cfg.ssdiff) || (!ctx.qry.ssdiff && ctx.cfg.ssdiff))
-+		use_ssdiff = 1;
-+
-+	print_ssdiff_link();
- 	cgit_print_diffstat(old_rev_sha1, new_rev_sha1);
- 
--	html("<table summary='diff' class='diff'>");
--	html("<tr><td>");
-+	if (use_ssdiff) {
-+		html("<table summary='ssdiff' class='ssdiff'>");
-+	} else {
-+		html("<table summary='diff' class='diff'>");
-+		html("<tr><td>");
-+	}
- 	cgit_diff_tree(old_rev_sha1, new_rev_sha1, filepair_cb, prefix);
--	html("</td></tr>");
-+	if (!use_ssdiff)
-+		html("</td></tr>");
- 	html("</table>");
- }
-diff --git a/ui-log.c b/ui-log.c
-index f3132c9..0947604 100644
---- a/ui-log.c
-+++ b/ui-log.c
-@@ -66,7 +66,7 @@ void show_commit_decorations(struct commit *commit)
- 		else {
- 			strncpy(buf, deco->name, sizeof(buf) - 1);
- 			cgit_commit_link(buf, NULL, "deco", ctx.qry.head,
--				sha1_to_hex(commit->object.sha1));
-+				sha1_to_hex(commit->object.sha1), 0);
- 		}
- 		deco = deco->next;
- 	}
-@@ -89,7 +89,7 @@ void print_commit(struct commit *commit)
- 	htmlf("</td><td%s>",
- 		ctx.qry.showmsg ? " class='logsubject'" : "");
- 	cgit_commit_link(info->subject, NULL, NULL, ctx.qry.head,
--			 sha1_to_hex(commit->object.sha1));
-+			 sha1_to_hex(commit->object.sha1), 0);
- 	show_commit_decorations(commit);
- 	html("</td><td>");
- 	html_txt(info->author);
-diff --git a/ui-refs.c b/ui-refs.c
-index d3b4f6e..33d9bec 100644
---- a/ui-refs.c
-+++ b/ui-refs.c
-@@ -74,7 +74,7 @@ static int print_branch(struct refinfo *ref)
- 	html("</td><td>");
- 
- 	if (ref->object->type == OBJ_COMMIT) {
--		cgit_commit_link(info->subject, NULL, NULL, name, NULL);
-+		cgit_commit_link(info->subject, NULL, NULL, name, NULL, 0);
- 		html("</td><td>");
- 		html_txt(info->author);
- 		html("</td><td colspan='2'>");
-diff --git a/ui-repolist.c b/ui-repolist.c
-index 3ef2e99..0a0b6ca 100644
---- a/ui-repolist.c
-+++ b/ui-repolist.c
-@@ -94,7 +94,7 @@ int is_in_url(struct cgit_repo *repo)
- 
- void print_sort_header(const char *title, const char *sort)
- {
--	htmlf("<th class='left'><a href='./?s=%s", sort);
-+	htmlf("<th class='left'><a href='%s?s=%s", cgit_rooturl(), sort);
- 	if (ctx.qry.search) {
- 		html("&q=");
- 		html_url_arg(ctx.qry.search);
-diff --git a/ui-shared.c b/ui-shared.c
-index 07d5dd4..48c2395 100644
---- a/ui-shared.c
-+++ b/ui-shared.c
-@@ -317,7 +317,7 @@ void cgit_log_link(char *name, char *title, char *class, char *head,
- }
- 
- void cgit_commit_link(char *name, char *title, char *class, char *head,
--		      char *rev)
-+		      char *rev, int toggle_ssdiff)
- {
- 	if (strlen(name) > ctx.cfg.max_msg_len && ctx.cfg.max_msg_len >= 15) {
- 		name[ctx.cfg.max_msg_len] = '\0';
-@@ -325,7 +325,23 @@ void cgit_commit_link(char *name, char *title, char *class, char *head,
- 		name[ctx.cfg.max_msg_len - 2] = '.';
- 		name[ctx.cfg.max_msg_len - 3] = '.';
- 	}
--	reporevlink("commit", name, title, class, head, rev, NULL);
-+
-+	char *delim;
-+
-+	delim = repolink(title, class, "commit", head, NULL);
-+	if (rev && strcmp(rev, ctx.qry.head)) {
-+		html(delim);
-+		html("id=");
-+		html_url_arg(rev);
-+		delim = "&amp;";
-+	}
-+	if ((ctx.qry.ssdiff && !toggle_ssdiff) || (!ctx.qry.ssdiff && toggle_ssdiff)) {
-+		html(delim);
-+		html("ss=1");
-+	}
-+	html("'>");
-+	html_txt(name);
-+	html("</a>");
- }
- 
- void cgit_refs_link(char *name, char *title, char *class, char *head,
-@@ -341,7 +357,8 @@ void cgit_snapshot_link(char *name, char *title, char *class, char *head,
- }
- 
- void cgit_diff_link(char *name, char *title, char *class, char *head,
--		    char *new_rev, char *old_rev, char *path)
-+		    char *new_rev, char *old_rev, char *path,
-+		    int toggle_ssdiff)
- {
- 	char *delim;
- 
-@@ -356,6 +373,11 @@ void cgit_diff_link(char *name, char *title, char *class, char *head,
- 		html(delim);
- 		html("id2=");
- 		html_url_arg(old_rev);
-+		delim = "&amp;";
-+	}
-+	if ((ctx.qry.ssdiff && !toggle_ssdiff) || (!ctx.qry.ssdiff && toggle_ssdiff)) {
-+		html(delim);
-+		html("ss=1");
- 	}
- 	html("'>");
- 	html_txt(name);
-@@ -383,7 +405,7 @@ void cgit_object_link(struct object *obj)
- 	shortrev[10] = '\0';
- 	if (obj->type == OBJ_COMMIT) {
-                 cgit_commit_link(fmt("commit %s...", shortrev), NULL, NULL,
--				 ctx.qry.head, fullrev);
-+				 ctx.qry.head, fullrev, 0);
- 		return;
- 	} else if (obj->type == OBJ_TREE)
- 		page = "tree";
-@@ -695,9 +717,9 @@ void cgit_print_pageheader(struct cgit_context *ctx)
- 		cgit_tree_link("tree", NULL, hc(cmd, "tree"), ctx->qry.head,
- 			       ctx->qry.sha1, NULL);
- 		cgit_commit_link("commit", NULL, hc(cmd, "commit"),
--				 ctx->qry.head, ctx->qry.sha1);
-+				 ctx->qry.head, ctx->qry.sha1, 0);
- 		cgit_diff_link("diff", NULL, hc(cmd, "diff"), ctx->qry.head,
--			       ctx->qry.sha1, ctx->qry.sha2, NULL);
-+			       ctx->qry.sha1, ctx->qry.sha2, NULL, 0);
- 		if (ctx->repo->max_stats)
- 			cgit_stats_link("stats", NULL, hc(cmd, "stats"),
- 					ctx->qry.head, NULL);
-@@ -760,13 +782,18 @@ void cgit_print_snapshot_links(const char *repo, const char *head,
- 			       const char *hex, int snapshots)
- {
- 	const struct cgit_snapshot_format* f;
-+	char *prefix;
-     	char *filename;
-+	unsigned char sha1[20];
- 
-+	if (get_sha1(fmt("refs/tags/%s", hex), sha1) == 0 &&
-+	    (hex[0] == 'v' || hex[0] == 'V') && isdigit(hex[1]))
-+		hex++;
-+	prefix = xstrdup(fmt("%s-%s", cgit_repobasename(repo), hex));
- 	for (f = cgit_snapshot_formats; f->suffix; f++) {
- 		if (!(snapshots & f->bit))
- 			continue;
--		filename = fmt("%s-%s%s", cgit_repobasename(repo), hex,
--			       f->suffix);
-+		filename = fmt("%s%s", prefix, f->suffix);
- 		cgit_snapshot_link(filename, NULL, NULL, NULL, NULL, filename);
- 		html("<br/>");
- 	}
-diff --git a/ui-shared.h b/ui-shared.h
-index bff4826..9ebc1f9 100644
---- a/ui-shared.h
-+++ b/ui-shared.h
-@@ -3,6 +3,7 @@
- 
- extern char *cgit_httpscheme();
- extern char *cgit_hosturl();
-+extern char *cgit_rooturl();
- extern char *cgit_repourl(const char *reponame);
- extern char *cgit_fileurl(const char *reponame, const char *pagename,
- 			  const char *filename, const char *query);
-@@ -22,7 +23,7 @@ extern void cgit_log_link(char *name, char *title, char *class, char *head,
- 			  char *rev, char *path, int ofs, char *grep,
- 			  char *pattern, int showmsg);
- extern void cgit_commit_link(char *name, char *title, char *class, char *head,
--			     char *rev);
-+			     char *rev, int toggle_ssdiff);
- extern void cgit_patch_link(char *name, char *title, char *class, char *head,
- 			    char *rev);
- extern void cgit_refs_link(char *name, char *title, char *class, char *head,
-@@ -30,7 +31,8 @@ extern void cgit_refs_link(char *name, char *title, char *class, char *head,
- extern void cgit_snapshot_link(char *name, char *title, char *class,
- 			       char *head, char *rev, char *archivename);
- extern void cgit_diff_link(char *name, char *title, char *class, char *head,
--			   char *new_rev, char *old_rev, char *path);
-+			   char *new_rev, char *old_rev, char *path,
-+			   int toggle_ssdiff);
- extern void cgit_stats_link(char *name, char *title, char *class, char *head,
- 			    char *path);
- extern void cgit_object_link(struct object *obj);
-diff --git a/ui-ssdiff.c b/ui-ssdiff.c
-new file mode 100644
-index 0000000..5673642
---- /dev/null
-+++ b/ui-ssdiff.c
-@@ -0,0 +1,274 @@
-+#include "cgit.h"
-+#include "html.h"
-+#include "ui-shared.h"
-+
-+extern int use_ssdiff;
-+
-+static int current_old_line, current_new_line;
-+
-+struct deferred_lines {
-+	int line_no;
-+	char *line;
-+	struct deferred_lines *next;
-+};
-+
-+static struct deferred_lines *deferred_old, *deferred_old_last;
-+static struct deferred_lines *deferred_new, *deferred_new_last;
-+
-+static int line_from_hunk(char *line, char type)
-+{
-+	char *buf1, *buf2;
-+	int len;
-+
-+	buf1 = strchr(line, type);
-+	if (buf1 == NULL)
-+		return 0;
-+	buf1 += 1;
-+	buf2 = strchr(buf1, ',');
-+	if (buf2 == NULL)
-+		return 0;
-+	len = buf2 - buf1;
-+	buf2 = xmalloc(len + 1);
-+	strncpy(buf2, buf1, len);
-+	buf2[len] = '\0';
-+	int res = atoi(buf2);
-+	free(buf2);
-+	return res;
-+}
-+
-+static char *replace_tabs(char *line)
-+{
-+	char *prev_buf = line;
-+	char *cur_buf;
-+	int linelen = strlen(line);
-+	int n_tabs = 0;
-+	int i;
-+	char *result;
-+	char *spaces = "        ";
-+
-+	if (linelen == 0) {
-+		result = xmalloc(1);
-+		result[0] = '\0';
-+		return result;
-+	}
-+
-+	for (i = 0; i < linelen; i++)
-+		if (line[i] == '\t')
-+			n_tabs += 1;
-+	result = xmalloc(linelen + n_tabs * 8 + 1);
-+	result[0] = '\0';
-+
-+	while (1) {
-+		cur_buf = strchr(prev_buf, '\t');
-+		if (!cur_buf) {
-+			strcat(result, prev_buf);
-+			break;
-+		} else {
-+			strcat(result, " ");
-+			strncat(result, spaces, 8 - (strlen(result) % 8));
-+			strncat(result, prev_buf, cur_buf - prev_buf);
-+		}
-+		prev_buf = cur_buf + 1;
-+	}
-+	return result;
-+}
-+
-+static void deferred_old_add(char *line, int line_no)
-+{
-+	struct deferred_lines *item = xmalloc(sizeof(struct deferred_lines));
-+	item->line = xstrdup(line);
-+	item->line_no = line_no;
-+	item->next = NULL;
-+	if (deferred_old) {
-+		deferred_old_last->next = item;
-+		deferred_old_last = item;
-+	} else {
-+		deferred_old = deferred_old_last = item;
-+	}
-+}
-+
-+static void deferred_new_add(char *line, int line_no)
-+{
-+	struct deferred_lines *item = xmalloc(sizeof(struct deferred_lines));
-+	item->line = xstrdup(line);
-+	item->line_no = line_no;
-+	item->next = NULL;
-+	if (deferred_new) {
-+		deferred_new_last->next = item;
-+		deferred_new_last = item;
-+	} else {
-+		deferred_new = deferred_new_last = item;
-+	}
-+}
-+
-+static void print_ssdiff_line(char *class, int old_line_no, char *old_line,
-+			      int new_line_no, char *new_line)
-+{
-+	html("<tr>");
-+	if (old_line_no > 0)
-+		htmlf("<td class='lineno'>%d</td><td class='%s'>",
-+		      old_line_no, class);
-+	else if (old_line)
-+		htmlf("<td class='lineno'></td><td class='%s'>", class);
-+	else
-+		htmlf("<td class='lineno'></td><td class='%s_dark'>", class);
-+
-+	if (old_line) {
-+		old_line = replace_tabs(old_line + 1);
-+		html_txt(old_line);
-+		free(old_line);
-+	}
-+
-+	html("</td>");
-+
-+	if (new_line_no > 0)
-+		htmlf("<td class='lineno'>%d</td><td class='%s'>",
-+		      new_line_no, class);
-+	else if (new_line)
-+		htmlf("<td class='lineno'></td><td class='%s'>", class);
-+	else
-+		htmlf("<td class='lineno'></td><td class='%s_dark'>", class);
-+
-+	if (new_line) {
-+		new_line = replace_tabs(new_line + 1);
-+		html_txt(new_line);
-+		free(new_line);
-+	}
-+
-+	html("</td></tr>");
-+}
-+
-+static void print_deferred_old_lines()
-+{
-+	struct deferred_lines *iter_old, *tmp;
-+
-+	iter_old = deferred_old;
-+	while (iter_old) {
-+		print_ssdiff_line("del", iter_old->line_no,
-+				  iter_old->line, -1, NULL);
-+		tmp = iter_old->next;
-+		free(iter_old);
-+		iter_old = tmp;
-+	}
-+}
-+
-+static void print_deferred_new_lines()
-+{
-+	struct deferred_lines *iter_new, *tmp;
-+
-+	iter_new = deferred_new;
-+	while (iter_new) {
-+		print_ssdiff_line("add", -1, NULL, iter_new->line_no,
-+				  iter_new->line);
-+		tmp = iter_new->next;
-+		free(iter_new);
-+		iter_new = tmp;
-+	}
-+}
-+
-+static void print_deferred_changed_lines()
-+{
-+	struct deferred_lines *iter_old, *iter_new, *tmp;
-+
-+	iter_old = deferred_old;
-+	iter_new = deferred_new;
-+	while (iter_old || iter_new) {
-+		if (iter_old && iter_new)
-+			print_ssdiff_line("changed", iter_old->line_no,
-+					  iter_old->line,
-+					  iter_new->line_no, iter_new->line);
-+		else if (iter_old)
-+			print_ssdiff_line("changed", iter_old->line_no,
-+					  iter_old->line, -1, NULL);
-+		else if (iter_new)
-+			print_ssdiff_line("changed", -1, NULL,
-+					  iter_new->line_no, iter_new->line);
-+
-+		if (iter_old) {
-+			tmp = iter_old->next;
-+			free(iter_old);
-+			iter_old = tmp;
-+		}
-+
-+		if (iter_new) {
-+			tmp = iter_new->next;
-+			free(iter_new);
-+			iter_new = tmp;
-+		}
-+	}
-+}
-+
-+void cgit_ssdiff_print_deferred_lines()
-+{
-+	if (!deferred_old && !deferred_new)
-+		return;
-+
-+	if (deferred_old && !deferred_new)
-+		print_deferred_old_lines();
-+	else if (!deferred_old && deferred_new)
-+		print_deferred_new_lines();
-+	else
-+		print_deferred_changed_lines();
-+
-+	deferred_old = deferred_old_last = NULL;
-+	deferred_new = deferred_new_last = NULL;
-+}
-+
-+/*
-+ * print a single line returned from xdiff
-+ */
-+void cgit_ssdiff_line_cb(char *line, int len)
-+{
-+	char c = line[len - 1];
-+
-+	line[len - 1] = '\0';
-+
-+	if (line[0] == '@') {
-+		current_old_line = line_from_hunk(line, '-');
-+		current_new_line = line_from_hunk(line, '+');
-+	}
-+
-+	if (line[0] == ' ') {
-+		if (deferred_old || deferred_new)
-+			cgit_ssdiff_print_deferred_lines();
-+		print_ssdiff_line("ctx", current_old_line, line,
-+				  current_new_line, line);
-+		current_old_line += 1;
-+		current_new_line += 1;
-+	} else if (line[0] == '+') {
-+		deferred_new_add(line, current_new_line);
-+		current_new_line += 1;
-+	} else if (line[0] == '-') {
-+		deferred_old_add(line, current_old_line);
-+		current_old_line += 1;
-+	} else if (line[0] == '@') {
-+		html("<tr><td colspan='4' class='hunk'>");
-+		html_txt(line);
-+		html("</td></tr>");
-+	} else {
-+		html("<tr><td colspan='4' class='ctx'>");
-+		html_txt(line);
-+		html("</td></tr>");
-+	}
-+	line[len - 1] = c;
-+}
-+
-+void cgit_ssdiff_header_begin()
-+{
-+	current_old_line = -1;
-+	current_new_line = -1;
-+	html("<tr><td class='space' colspan='4'><div></div></td></tr>");
-+	html("<tr><td class='head' colspan='4'>");
-+}
-+
-+void cgit_ssdiff_header_end()
-+{
-+	html("</td><tr>");
-+}
-+
-+void cgit_ssdiff_footer()
-+{
-+	if (deferred_old || deferred_new)
-+		cgit_ssdiff_print_deferred_lines();
-+	html("<tr><td class='foot' colspan='4'></td></tr>");
-+}
-diff --git a/ui-ssdiff.h b/ui-ssdiff.h
-new file mode 100644
-index 0000000..64b4b12
---- /dev/null
-+++ b/ui-ssdiff.h
-@@ -0,0 +1,13 @@
-+#ifndef UI_SSDIFF_H
-+#define UI_SSDIFF_H
-+
-+extern void cgit_ssdiff_print_deferred_lines();
-+
-+extern void cgit_ssdiff_line_cb(char *line, int len);
-+
-+extern void cgit_ssdiff_header_begin();
-+extern void cgit_ssdiff_header_end();
-+
-+extern void cgit_ssdiff_footer();
-+
-+#endif /* UI_SSDIFF_H */
-diff --git a/ui-tag.c b/ui-tag.c
-index c2d72af..39e4cb8 100644
---- a/ui-tag.c
-+++ b/ui-tag.c
-@@ -30,6 +30,14 @@ static void print_tag_content(char *buf)
- 	}
- }
- 
-+void print_download_links(char *revname)
-+{
-+	html("<tr><th>download</th><td class='sha1'>");
-+	cgit_print_snapshot_links(ctx.qry.repo, ctx.qry.head,
-+				  revname, ctx.repo->snapshots);
-+	html("</td></tr>");
-+}
-+
- void cgit_print_tag(char *revname)
- {
- 	unsigned char sha1[20];
-@@ -56,16 +64,16 @@ void cgit_print_tag(char *revname)
- 			return;
- 		}
- 		html("<table class='commit-info'>\n");
--		htmlf("<tr><td>Tag name</td><td>");
-+		htmlf("<tr><td>tag name</td><td>");
- 		html_txt(revname);
- 		htmlf(" (%s)</td></tr>\n", sha1_to_hex(sha1));
- 		if (info->tagger_date > 0) {
--			html("<tr><td>Tag date</td><td>");
-+			html("<tr><td>tag date</td><td>");
- 			cgit_print_date(info->tagger_date, FMT_LONGDATE, ctx.cfg.local_time);
- 			html("</td></tr>\n");
- 		}
- 		if (info->tagger) {
--			html("<tr><td>Tagged by</td><td>");
-+			html("<tr><td>tagged by</td><td>");
- 			html_txt(info->tagger);
- 			if (info->tagger_email && !ctx.cfg.noplainemail) {
- 				html(" ");
-@@ -73,19 +81,23 @@ void cgit_print_tag(char *revname)
- 			}
- 			html("</td></tr>\n");
- 		}
--		html("<tr><td>Tagged object</td><td>");
-+		html("<tr><td>tagged object</td><td class='sha1'>");
- 		cgit_object_link(tag->tagged);
- 		html("</td></tr>\n");
-+		if (ctx.repo->snapshots)
-+			print_download_links(revname);
- 		html("</table>\n");
- 		print_tag_content(info->msg);
- 	} else {
- 		html("<table class='commit-info'>\n");
--		htmlf("<tr><td>Tag name</td><td>");
-+		htmlf("<tr><td>tag name</td><td>");
- 		html_txt(revname);
- 		html("</td></tr>\n");
--		html("<tr><td>Tagged object</td><td>");
-+		html("<tr><td>Tagged object</td><td class='sha1'>");
- 		cgit_object_link(obj);
- 		html("</td></tr>\n");
-+		if (ctx.repo->snapshots)
-+			print_download_links(revname);
- 		html("</table>\n");
-         }
- 	return;


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the devel mailing list