threads / discuss / 9254

gitweb chokes on recursive symlink

Subject: gitweb chokes on recursive symlink

## tl;dr

2 messages between Jul 27, 2007 and Jul 27, 2007.

replies: 1people: 2as markdown or json

Junio C Hamano· Jul 27, 2007, 08:23 UTC · lore

If somebody used to advertise his repository that physically resides at /pub/lic.git/ as:

	git://git.example.com/pub/lic.git/
but now wants to use --base-path to allow:
	git://git.example.com/lic.git/
she can start git-daemon with --base-path option, like this:
	git-daemon --base-path=/pub --export-all

During the transition, however, she would also want to allow older URL as well. One natural way to achieve that is to create a symlink:

	ln -s /pub /pub/pub

so that a request to git://git.example.com/pub/lic.git/ is first translated by --base-path to a request to /pub/pub/lic.git/ which goes to /pub/lic.git, thanks to the symlink.

So far so good.

However, gitweb chokes if there is such a symlink (File::Find barfs with "/pub/pub is a recursive symbolic link" --- I think this is because you use "follow_fast => 1").

As I happen to think using a symlink that goes up for backward compatible URL support is a rather common practice, I think we should do something about it. My gut feeling is that we could simply ignore such symlinks.

What do you think about this issue?
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index b381692..c8ad84e 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -1492,6 +1492,7 @@ sub git_get_projects_list {
 
 		File::Find::find({
 			follow_fast => 1, # follow symbolic links
+			follow_skip => 2, # ignore duplicates
 			dangling_symlinks => 0, # ignore dangling symlinks, silently
 			wanted => sub {
 				# skip project-list toplevel, if we get it.

	
Jakub Narebski· Jul 27, 2007, 22:57 UTC · re: Junio C Hamano · lore

Re: gitweb chokes on recursive symlink

Junio C Hamano wrote:
[cut explanation about why one would want something like below]
 
> 	ln -s /pub /pub/pub
[...]
Show 24 quoted lines
> However, gitweb chokes if there is such a symlink (File::Find
> barfs with "/pub/pub is a recursive symbolic link" --- I think
> this is because you use "follow_fast => 1").
> 
> As I happen to think using a symlink that goes up for backward
> compatible URL support is a rather common practice, I think we
> should do something about it.  My gut feeling is that we could
> simply ignore such symlinks.
> 
> What do you think about this issue?
> 
> diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
> index b381692..c8ad84e 100755
> --- a/gitweb/gitweb.perl
> +++ b/gitweb/gitweb.perl
> @@ -1492,6 +1492,7 @@ sub git_get_projects_list {
>  
>  		File::Find::find({
>  			follow_fast => 1, # follow symbolic links
> +			follow_skip => 2, # ignore duplicates
>  			dangling_symlinks => 0, # ignore dangling symlinks, silently
>  			wanted => sub {
>  				# skip project-list toplevel, if we get it.
> 
I guess that is a good solution, but I'm not Perl expert...
-- 
Jakub Narebski
Poland

← back to recent threads