aboutsummaryrefslogtreecommitdiffstatshomepage
Commit message (Collapse)AuthorAge
...
* Merge branch 'fh/mimetypes'Lars Hjemli2012-03-18
|\
| * ui_plain: automatically lookup mimetype when mimetype-file is setFerry Huberts2011-07-19
| | | | | | | | | | | | | | | | | | | | | | | | For sites that do not want to configure mime types by hand but still want the correct mime type for 'plain' blobs, configuring a mime type file is made possible. This is handy since such a file is normally already provided (at least on Linux systems). Also, this reflects the gitweb option '$mimetypes_file' Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl> Signed-off-by: Lars Hjemli <hjemli@gmail.com>
* | Merge branch 'jp/defbranch'Lars Hjemli2012-03-18
|\ \
| * | ui-repolist.c: fallback to "master" if no default branch is specifiedLars Hjemli2011-07-19
| | | | | | | | | | | | | | | | | | | | | | | | When looking for the modtime of a repo we used to rely on repo.defbranch having a value. This is no longer true so this patch provides a default value when needed. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
| * | cgit.c: use resolve_ref() to
/* ui-diff.c: show diff between two blobs
 *
 * Copyright (C) 2006 Lars Hjemli
 *
 * Licensed under GNU General Public License v2
 *   (see COPYING for full license text)
 */

#include "cgit.h"
#include "xdiff.h"

char *diff_buffer;
int diff_buffer_size;


/*
 * print a single line returned from xdiff
 */
static void print_line(char *line, int len)
{
	char *class = "ctx";
	char c = line[len-1];

	if (line[0] == '+')
		class = "add";
	else if (line[0] == '-')
		class = "del";
	else if (line[0] == '@')
		class = "hunk";

	htmlf("<div class='%s'>", class);
	line[len-1] = '\0';
	html_txt(line);
	html("</div>");
	line[len-1] = c;
}

/*
 * Receive diff-buffers from xdiff and concatenate them as
 * needed across multiple callbacks.
 *
 * This is basically a copy of xdiff-interface.c/xdiff_outf(),
 * ripped from git and modified to use globals instead of
 * a special callback-struct.
 */
int diff_cb(void *priv_, mmbuffer_t *mb, int nbuf)
{
	int i;

	for (i = 0; i < nbuf; i++) {
		if (mb[i].ptr[mb[i].size-1] != '\n') {
			/* Incomplete line */
			diff_buffer = xrealloc(diff_buffer,
					       diff_buffer_size + mb[i].size);
			memcpy(diff_buffer + diff_buffer_size,
			       mb[i].ptr, mb[i].size);
			diff_buffer_size += mb[i].size;
			continue;
		}

		/* we have a complete line */
		if (!diff_buffer) {
			print_line(mb[i].ptr, mb[i].size);
			continue;
		}
		diff_buffer = xrealloc(diff_buffer,
				       diff_buffer_size + mb[i].size);
		memcpy(diff_buffer + diff_buffer_size, mb[i].ptr, mb[i].size);
		print_line(diff_buffer, diff_buffer_size + mb[i].size);
		free(diff_buffer);
		diff_buffer = NULL;
		diff_buffer_size = 0;
	}
	if (diff_buffer) {
		print_line(diff_buffer, diff_buffer_size);
		free(diff_buffer);
		diff_buffer = NULL;
		diff_buffer_size = 0;
	}
	return 0;
}

static int load_mmfile(mmfile_t *file, const unsigned char *sha1)
{
	char type[20];

	if (is_null_sha1(sha1)) {
		file->ptr = (char *)"";
		file->size = 0;
	} else {
		file->ptr = read_sha1_file(sha1, type, &file->size);
	}
	return 1;
}

static void run_diff(const unsigned char *sha1, const unsigned char *sha2)
{
	mmfile_t file1, file2;
	xpparam_t diff_params;
	xdemitconf_t emit_params;
	xdemitcb_t emit_cb;

	if (!load_mmfile(&file1, sha1) || !load_mmfile(&file2, sha2)) {
		cgit_print_error("Unable to load files for diff");
		return;
	}

	diff_params.flags = XDF_NEED_MINIMAL;

	emit_params.ctxlen = 3;
	emit_params.flags = XDL_EMIT_FUNCNAMES;

	emit_cb.outf = diff_cb;

	xdl_diff(&file1, &file2, &diff_params, &emit_params, &emit_cb);
}



void cgit_print_diff(const char *old_hex, const char *new_hex)
{
	unsigned char sha1[20], sha2[20];

	get_sha1(old_hex, sha1);
	get_sha1(new_hex, sha2);

	html("<h2>diff</h2>\n");
	html("<table class='diff'><tr><td>");
	run_diff(sha1, sha2);
	html("</td></tr></table>");
}
/span> | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ctx.qry.head can be NULL in some cases due to bad requests by weird bots. I managed to reproduce with: PATH_INFO=/repo.git/shop.php QUERY_STRING=id= Signed-off-by: Eric Wong <normalperson@yhbt.net> | * | | | use correct type for sizeofJamie Couture2012-03-18 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | **L would have worked well too. Depending on the distribution sizeof *L may return 8 instead of 4. **L is preferable, but since we don't expect this datatype to change very often, sizeof int is less subtle and easier to understand. Signed-off-by: Jamie Couture <jamie.couture@gmail.com> | * | | | ui-ssdiff.c: correct length check for LCS tableEric Wong2012-01-08 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Each individual string may be too long for its respective dimension of the LCS table. Signed-off-by: Eric Wong <normalperson@yhbt.net> * | | | | Merge branch 'stable'Lars Hjemli2012-01-03 |\| | | | | * | | | Fix segmentation fault in empty repositoryJohn Keeping2012-01-03 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When a repository is empty, the ATOM feed link is written in the header, but this involves formatting ctx->qry.head which is NULL in this case. With glibc, vsnprintf formats "%s" with a NULL input as "(null)" but on Solaris this results in a segmentation fault. Since we don't have a meaningful head for the atom feed in an empty repository, it's simplest not to write out the link element at all. Signed-off-by: John Keeping <john@metanate.com> * | | | | Merge branch 'stable'Lars Hjemli2012-01-03 |\| | | | | * | | | Makefile: fetch git tarballs from http://hjemli.net/git/git/Lars Hjemli2012-01-03 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The git tarballs are currently not available from kernel.org, so for now the makefile will download autogenerated tarballs from cgit. Signed-off-by: Lars Hjemli <hjemli@gmail.com> | * | | | fix css color value and vertical-align valueNorberto Lopes2012-01-03 | | | | | * | | | | ui-ssdiff.c: set correct diffmode in "control panel"Tim Chen2012-01-03 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When side-by-side-diffs=1 was set in cgitrc, specifying 'ss=0' in the querystring would not set the 'unified' option as active in the dropdown box used to select diffmode. * | | | | Merge branch 'stable'Lars Hjemli2012-01-03 |\| | | | | * | | | Fix diff mode switching when side-by-side-diffs=1Tim Chen2012-01-03 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When side-by-side-diffs=1 was set in cgitrc, specyfing 'ss=0' in the query- string would not switch to unified diffs. This patch fixes the issue by introducing a separate variable to track the occurrence of "ss" in the querystring. | * | | | ui-log.c: do not show remote heads if enable-remote-branches=0Georg Müller2012-01-03 | | | | | | | | | | | | | | | | | | | | | | | | | If remote branches are not enabled, the branches are still listed in the log view. This patch removes them if enable-remote-branches=0. | * | | | Add sort parameter to pager of repo listTobias Grimm2012-01-03 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When the repolist is paged, the page-links are missing the sort parameter, causing the initial page to be custom sorted, but any clicked page will then be with the default sort order again. | * | | | ui-ssdiff: move LCS table away from the stackJamie Couture2012-01-03 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Printing deferred line changes for files containing long lines would cause a segfault. - limit LCS table size: 128x128. - move LCS table to global context: avoid allocating/freeing memory for every deferred line change. Signed-off-by: Jamie Couture <jamie.couture@gmail.com> * | | | | shared.c: Only setenv() if value is non-nullLukas Fleischer2012-01-03 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Some setenv() implementations (e.g. the one in OpenBSD's stdlib) segfault if we pass a NULL value. Only set environment variables if the corresponding settings are defined to avoid this. Note that this is a minor behaviour change as environment variables were supposed to be set to an empty string if a setting was undefined. Given that this feature isn't part of any official release yet, there's no need to worry about backwards compatibility, really. Change the documentation accordingly. Signed-off-by: Lukas Fleischer <cgit@cryptocrack.de> * | | | | shared.c: Remove unused "linux/limits.h" includeLukas Fleischer2012-01-03 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This isn't used anywhere and prevents the code from being compiled on other platforms, such as *BSD. Signed-off-by: Lukas Fleischer <cgit@cryptocrack.de> * | | | | Merge branch 'stable'Lars Hjemli2011-07-22 |\| | | | | * | | | Fix potential XSS vulnerability in rename hintLukas Fleischer2011-07-22 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The file name displayed in the rename hint should be escaped to avoid XSS. Note that this vulnerability is only applicable when an attacker has gained push access to the repository. Signed-off-by: Lukas Fleischer <cgit@cryptocrack.de> Signed-off-by: Lars Hjemli <hjemli@gmail.com> | * | | | Remove dead initialization in cgit_parse_commit()Lukas Fleischer2011-07-22 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The value stored to "t" during its initialization gets overwritten in any case, so just leave it uninitialized. Spotted by clang-analyzer. Signed-off-by: Lukas Fleischer <cgit@cryptocrack.de> Signed-off-by: Lars Hjemli <hjemli@gmail.com> * | | | | Merge branch 'stable'Lars Hjemli2011-07-21 |\| | | | | * | | | CGIT 0.9.0.2v0.9.0.2Lars Hjemli2011-07-21 | | | | | | | | | | | | | | | | | | | | Signed-off-by: Lars Hjemli <hjemli@gmail.com> | * | | | html.c: avoid out-of-bounds access for url_escape_tableEric Wong2011-07-21 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This fixes a segfault for me with with -O2 optimization on x86 with gcc (Debian 4.4.5-8) 4.4.5 I can reliably reproduce it with the following parameters when pointed to the git.git repository: PATH_INFO='/git-core.git/diff/' QUERY_STRING='id=2b93bfac0f5bcabbf60f174f4e7bfa9e318e64d5&id2=d6da71a9d16b8cf27f9d8f90692d3625c849cbc8' Signed-off-by: Eric Wong <normalperson@yhbt.net> Signed-off-by: Lars Hjemli <hjemli@gmail.com> * | | | | Merge branch 'stable'Lars Hjemli2011-07-21 |\| | | | | |_|_|/ |/| | | | * | | tests: fix failures when CDPATH is setFerry Huberts2011-07-21 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Some tests would otherwise fail because commands such as cd trash/repos/foo && git rev-list --reverse HEAD | head -1 would return 2 lines instead of 1: the 'cd' command also prints the path when CDPATH is set. Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl> Signed-off-by: Lars Hjemli <hjemli@gmail.com> * | | | Makefile: fix oversight of not using $(DESTDIR) in uninstallFerry Huberts2011-07-19 | | | | | | | | | | | | | | | | | | | | Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl> Signed-off-by: Lars Hjemli <hjemli@gmail.com> * | | | commit-links.sh: improve regular expressionsFerry Huberts2011-07-19 | |_|/ |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | The default length for sha1 abbreviations in git is 7. A '#num' at the beginning of the commit message is now recognised, a ':#num' as well, etc.: a '#num' anywhere is now converted to a link. Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl> Signed-off-by: Lars Hjemli <hjemli@gmail.com> * | | Merge branch 'stable'Lars Hjemli2011-06-18 |\| | | |/ |/| | * cgit.c: improve error message when git repo cannot be accessedLars Hjemli2011-06-18 | | | | | | | | | | | | | | | | | | | | | | | | | | The current 'Not a git repository' error message is not very helpful, since it doesn't state the cause of the problem. This patch uses errno to provide a hint of the underlying problem. It would have been even better to give the exact cause (e.g. for ENOENT it would be nice to know which file/directory is missing), but that would require reimplementing setup_git_directory_gently() which seems a bit overkill. Signed-off-by: Lars Hjemli <hjemli@gmail.com>