summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLars Hjemli2009-09-06 19:33:10 +0200
committerLars Hjemli2009-09-06 19:33:10 +0200
commitb507252b469333d06afff0888d466e39124a7e07 (patch)
tree05b98ce7a9b600679fd4fad437459e25c60d194a
parent011f2e9bdddcbfe65da397629bca87d167313a28 (diff)
downloadcgit-b507252b469333d06afff0888d466e39124a7e07.tar
cgit-b507252b469333d06afff0888d466e39124a7e07.tar.gz
cgit-b507252b469333d06afff0888d466e39124a7e07.zip
ui-plain.c: only return the blob with the specified path
When a path to a directory was specified for the 'plain' view, each blob in the directory used to be returned to the client. This patch fixes the issue by matching the path of each blob against the requested path. Noticed-by: Lars Stoltenow <penma@penma.de> Signed-off-by: Lars Hjemli <larsh@slackbox.hjemli.net>
-rw-r--r--ui-plain.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/ui-plain.c b/ui-plain.c
index 5addd9e..e08b15b 100644
--- a/ui-plain.c
+++ b/ui-plain.c
@@ -46,7 +46,8 @@ static int walk_tree(const unsigned char *sha1, const char *base, int baselen,
if (S_ISDIR(mode))
return READ_TREE_RECURSIVE;
- if (S_ISREG(mode))
+ if (S_ISREG(mode) && !strncmp(base, match_path, baselen) &&
+ !strcmp(pathname, match_path + baselen))
print_object(sha1, pathname);
return 0;
neric.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
/* ui-tree.c: functions for tree output
 *
 * Copyright (C) 2006 Lars Hjemli
 *
 * Licensed under GNU General Public License v2
 *   (see COPYING for full license text)
 */

#include "cgit.h"

char *curr_rev;

static int print_entry(const unsigned char *sha1, const char *base,
		       int baselen, const char *pathname, unsigned int mode,
		       int stage)
{
	char *name;
	enum object_type type;
	unsigned long size = 0;

	name = xstrdup(pathname);
	type = sha1_object_info(sha1, &size);
	if (type == OBJ_BAD && !S_ISDIRLNK(mode)) {
		htmlf("<tr><td colspan='3'>Bad object: %s %s</td></tr>",
		      name,
		      sha1_to_hex(sha1));
		return 0;
	}
	html("<tr><td class='filemode'>");
	html_filemode(mode);
	html("</td><td ");
	if (S_ISDIRLNK(mode)) {
		htmlf("class='ls-mod'><a href='");
		html_attr(fmt(cgit_repo->module_link,
			      name,
			      sha1_to_hex(sha1)));
	} else if (S_ISDIR(mode)) {
		html("class='ls-dir'><a href='");
		html_attr(cgit_pageurl(cgit_query_repo, "tree",
				       fmt("h=%s&id=%s&path=%s%s/",
					   curr_rev,
					   sha1_to_hex(sha1),
					   cgit_query_path ? cgit_query_path : "",
					   pathname)));
	} else {
		html("class='ls-blob'><a href='");
		html_attr(cgit_pageurl(cgit_query_repo, "view",
				      fmt("h=%s&id=%s&path=%s%s", curr_rev,
					  sha1_to_hex(sha1),
					  cgit_query_path ? cgit_query_path : "",
					  pathname)));
	}
	htmlf("'>%s</a></div></td>", name);
	htmlf("<td class='filesize'>%li</td>", size);

	html("<td class='links'><a href='");
	html_attr(cgit_pageurl(cgit_query_repo, "log",
			       fmt("h=%s&path=%s%s",
				   curr_rev,
				   cgit_query_path ? cgit_query_path : "",
				   pathname)));
	html("'>history</a></td>");
	html("</tr>\n");
	free(name);
	return 0;
}

void cgit_print_tree(const char *rev, const char *hex, char *path)
{
	struct tree *tree;
	unsigned char sha1[20];
	struct commit *commit;

	curr_rev = xstrdup(rev);
	get_sha1(rev, sha1);
	commit = lookup_commit_reference(sha1);
	if (!commit || parse_commit(commit)) {
		cgit_print_error(fmt("Invalid head: %s", rev));
		return;
	}
	if (!hex)
		hex = sha1_to_hex(commit->tree->object.sha1);

	if (get_sha1_hex(hex, sha1)) {
		cgit_print_error(fmt("Invalid object id: %s", hex));
		return;
	}
	tree = parse_tree_indirect(sha1);
	if (!tree) {
		cgit_print_error(fmt("Not a tree object: %s", hex));
		return;
	}

	html_txt(path);
	html("<table class='list'>\n");
	html("<tr class='nohover'>");
	html("<th class='left'>Mode</th>");
	html("<th class='left'>Name</th>");
	html("<th class='right'>Size</th>");
	html("<th/>");
	html("</tr>\n");
	read_tree_recursive(tree, "", 0, 1, NULL, print_entry);
	html("</table>\n");
}