From: Junio C Hamano Date: Tue, 1 Aug 2006 02:18:34 +0000 (-0700) Subject: gitweb: There can be more than two levels of subdirectories X-Git-Tag: v1.4.3-rc1~274^2~31 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=7a13b999a5aa6de236c7b16139c765eb9e5cb3c4;p=git.git gitweb: There can be more than two levels of subdirectories Earlier code to read .git/refs/{tags,heads} hierarchy had a hardcoded up-to-two-level assumption. Lift it by using File::Find. Signed-off-by: Junio C Hamano --- diff --git a/gitweb/gitweb.cgi b/gitweb/gitweb.cgi index 4e79390af..9569af09b 100755 --- a/gitweb/gitweb.cgi +++ b/gitweb/gitweb.cgi @@ -14,6 +14,7 @@ use CGI::Util qw(unescape); use CGI::Carp qw(fatalsToBrowser); use Encode; use Fcntl ':mode'; +use File::Find qw(); binmode STDOUT, ':utf8'; our $cgi = new CGI; @@ -697,23 +698,14 @@ sub git_read_refs { my @reflist; my @refs; - opendir my $dh, "$projectroot/$project/$ref_dir"; - while (my $dir = readdir($dh)) { - if ($dir =~ m/^\./) { - next; - } - if (-d "$projectroot/$project/$ref_dir/$dir") { - opendir my $dh2, "$projectroot/$project/$ref_dir/$dir"; - my @subdirs = grep !m/^\./, readdir $dh2; - closedir($dh2); - foreach my $subdir (@subdirs) { - push @refs, "$dir/$subdir" - } - next; + my $pfxlen = length("$projectroot/$project/$ref_dir"); + File::Find::find(sub { + return if (/^\./); + if (-f $_) { + push @refs, substr($File::Find::name, $pfxlen + 1); } - push @refs, $dir; - } - closedir($dh); + }, "$projectroot/$project/$ref_dir"); + foreach my $ref_file (@refs) { my $ref_id = git_read_hash("$project/$ref_dir/$ref_file"); my $type = git_get_type($ref_id) || next;