gitweb: Use File::Find::find in git_get_projects_list
authorJakub Narebski <jnareb@gmail.com>
Thu, 14 Sep 2006 20:18:59 +0000 (22:18 +0200)
committerJunio C Hamano <junkio@cox.net>
Fri, 15 Sep 2006 05:38:19 +0000 (22:38 -0700)
Earlier code to get list of projects when $projects_list is a
directory (e.g. when it is equal to $projectroot) had a hardcoded flat
(one level) list of directories.  Allow for projects to be in
subdirectories also for $projects_list being a directory by using
File::Find.

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
gitweb/gitweb.perl

index c3544ddc4ccbe8772fa59a626211444837f6312b..1d3a4c1e5bdd7c2a81d6c35929b989e4153ed743 100755 (executable)
@@ -715,16 +715,26 @@ sub git_get_projects_list {
        if (-d $projects_list) {
                # search in directory
                my $dir = $projects_list;
-               opendir my ($dh), $dir or return undef;
-               while (my $dir = readdir($dh)) {
-                       if (-e "$projectroot/$dir/HEAD") {
-                               my $pr = {
-                                       path => $dir,
-                               };
-                               push @list, $pr
-                       }
-               }
-               closedir($dh);
+               my $pfxlen = length("$dir");
+
+               File::Find::find({
+                       follow_fast => 1, # follow symbolic links
+                       dangling_symlinks => 0, # ignore dangling symlinks, silently
+                       wanted => sub {
+                               # skip project-list toplevel, if we get it.
+                               return if (m!^[/.]$!);
+                               # only directories can be git repositories
+                               return unless (-d $_);
+
+                               my $subdir = substr($File::Find::name, $pfxlen + 1);
+                               # we check related file in $projectroot
+                               if (-e "$projectroot/$subdir/HEAD") {
+                                       push @list, { path => $subdir };
+                                       $File::Find::prune = 1;
+                               }
+                       },
+               }, "$dir");
+
        } elsif (-f $projects_list) {
                # read from file(url-encoded):
                # 'git%2Fgit.git Linus+Torvalds'