diff options
Diffstat (limited to 'gitweb/gitweb.perl')
| -rwxr-xr-x | gitweb/gitweb.perl | 75 | 
1 files changed, 57 insertions, 18 deletions
| diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 24b219310a..d6eb7291d6 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -297,6 +297,19 @@ our %feature = (  		'override' => 0,  		'default' => [1]}, +	# Enable showing size of blobs in a 'tree' view, in a separate +	# column, similar to what 'ls -l' does.  This cost a bit of IO. + +	# To disable system wide have in $GITWEB_CONFIG +	# $feature{'show-sizes'}{'default'} = [0]; +	# To have project specific config enable override in $GITWEB_CONFIG +	# $feature{'show-sizes'}{'override'} = 1; +	# and in project config gitweb.showsizes = 0|1; +	'show-sizes' => { +		'sub' => sub { feature_bool('showsizes', @_) }, +		'override' => 0, +		'default' => [1]}, +  	# Make gitweb use an alternative format of the URLs which can be  	# more readable and natural-looking: project name is embedded  	# directly in the path and the query string contains other @@ -2764,16 +2777,31 @@ sub parse_ls_tree_line {  	my %opts = @_;  	my %res; -	#'100644 blob 0fa3f3a66fb6a137f6ec2c19351ed4d807070ffa	panic.c' -	$line =~ m/^([0-9]+) (.+) ([0-9a-fA-F]{40})\t(.+)$/s; +	if ($opts{'-l'}) { +		#'100644 blob 0fa3f3a66fb6a137f6ec2c19351ed4d807070ffa   16717	panic.c' +		$line =~ m/^([0-9]+) (.+) ([0-9a-fA-F]{40}) +(-|[0-9]+)\t(.+)$/s; -	$res{'mode'} = $1; -	$res{'type'} = $2; -	$res{'hash'} = $3; -	if ($opts{'-z'}) { -		$res{'name'} = $4; +		$res{'mode'} = $1; +		$res{'type'} = $2; +		$res{'hash'} = $3; +		$res{'size'} = $4; +		if ($opts{'-z'}) { +			$res{'name'} = $5; +		} else { +			$res{'name'} = unquote($5); +		}  	} else { -		$res{'name'} = unquote($4); +		#'100644 blob 0fa3f3a66fb6a137f6ec2c19351ed4d807070ffa	panic.c' +		$line =~ m/^([0-9]+) (.+) ([0-9a-fA-F]{40})\t(.+)$/s; + +		$res{'mode'} = $1; +		$res{'type'} = $2; +		$res{'hash'} = $3; +		if ($opts{'-z'}) { +			$res{'name'} = $4; +		} else { +			$res{'name'} = unquote($4); +		}  	}  	return wantarray ? %res : \%res; @@ -3564,6 +3592,9 @@ sub git_print_tree_entry {  	# and link is the action links of the entry.  	print "<td class=\"mode\">" . mode_str($t->{'mode'}) . "</td>\n"; +	if (exists $t->{'size'}) { +		print "<td class=\"size\">$t->{'size'}</td>\n"; +	}  	if ($t->{'type'} eq "blob") {  		print "<td class=\"list\">" .  			$cgi->a({-href => href(action=>"blob", hash=>$t->{'hash'}, @@ -3609,12 +3640,14 @@ sub git_print_tree_entry {  	} elsif ($t->{'type'} eq "tree") {  		print "<td class=\"list\">";  		print $cgi->a({-href => href(action=>"tree", hash=>$t->{'hash'}, -		                             file_name=>"$basedir$t->{'name'}", %base_key)}, +		                             file_name=>"$basedir$t->{'name'}", +		                             %base_key)},  		              esc_path($t->{'name'}));  		print "</td>\n";  		print "<td class=\"link\">";  		print $cgi->a({-href => href(action=>"tree", hash=>$t->{'hash'}, -		                             file_name=>"$basedir$t->{'name'}", %base_key)}, +		                             file_name=>"$basedir$t->{'name'}", +		                             %base_key)},  		              "tree");  		if (defined $hash_base) {  			print " | " . @@ -5088,10 +5121,14 @@ sub git_tree {  	}  	die_error(404, "No such tree") unless defined($hash); +	my $show_sizes = gitweb_check_feature('show-sizes'); +	my $have_blame = gitweb_check_feature('blame'); +  	my @entries = ();  	{  		local $/ = "\0"; -		open my $fd, "-|", git_cmd(), "ls-tree", '-z', $hash +		open my $fd, "-|", git_cmd(), "ls-tree", '-z', +			($show_sizes ? '-l' : ()), @extra_options, $hash  			or die_error(500, "Open git-ls-tree failed");  		@entries = map { chomp; $_ } <$fd>;  		close $fd @@ -5102,7 +5139,6 @@ sub git_tree {  	my $ref = format_ref_marker($refs, $hash_base);  	git_header_html();  	my $basedir = ''; -	my $have_blame = gitweb_check_feature('blame');  	if (defined $hash_base && (my %co = parse_commit($hash_base))) {  		my @views_nav = ();  		if (defined $file_name) { @@ -5118,7 +5154,8 @@ sub git_tree {  			# FIXME: Should be available when we have no hash base as well.  			push @views_nav, $snapshot_links;  		} -		git_print_page_nav('tree','', $hash_base, undef, undef, join(' | ', @views_nav)); +		git_print_page_nav('tree','', $hash_base, undef, undef, +		                   join(' | ', @views_nav));  		git_print_header_div('commit', esc_html($co{'title'}) . $ref, $hash_base);  	} else {  		undef $hash_base; @@ -5151,8 +5188,10 @@ sub git_tree {  		undef $up unless $up;  		# based on git_print_tree_entry  		print '<td class="mode">' . mode_str('040000') . "</td>\n"; +		print '<td class="size"> </td>'."\n" if $show_sizes;  		print '<td class="list">'; -		print $cgi->a({-href => href(action=>"tree", hash_base=>$hash_base, +		print $cgi->a({-href => href(action=>"tree", +		                             hash_base=>$hash_base,  		                             file_name=>$up)},  		              "..");  		print "</td>\n"; @@ -5161,7 +5200,7 @@ sub git_tree {  		print "</tr>\n";  	}  	foreach my $line (@entries) { -		my %t = parse_ls_tree_line($line, -z => 1); +		my %t = parse_ls_tree_line($line, -z => 1, -l => $show_sizes);  		if ($alternate) {  			print "<tr class=\"dark\">\n"; @@ -5328,7 +5367,7 @@ sub git_commit {  			} @$parents ) .  			')';  	} -	if (gitweb_check_feature('patches')) { +	if (gitweb_check_feature('patches') && @$parents <= 1) {  		$formats_nav .= " | " .  			$cgi->a({-href => href(action=>"patch", -replay=>1)},  				"patch"); @@ -5616,7 +5655,7 @@ sub git_commitdiff {  		$formats_nav =  			$cgi->a({-href => href(action=>"commitdiff_plain", -replay=>1)},  			        "raw"); -		if ($patch_max) { +		if ($patch_max && @{$co{'parents'}} <= 1) {  			$formats_nav .= " | " .  				$cgi->a({-href => href(action=>"patch", -replay=>1)},  					"patch"); @@ -5824,7 +5863,7 @@ sub git_commitdiff_plain {  # format-patch-style patches  sub git_patch { -	git_commitdiff(-format => 'patch', -single=> 1); +	git_commitdiff(-format => 'patch', -single => 1);  }  sub git_patches { | 
