]> asedeno.scripts.mit.edu Git - git.git/blobdiff - gitweb/gitweb.perl
Merge branch 'maint'
[git.git] / gitweb / gitweb.perl
index 3d62019e1f451ee563293c84ba391e4743b90fd9..63c793ec398f0c378c3e3ec94b2d5675bdff418e 100755 (executable)
@@ -766,6 +766,7 @@ sub href (%) {
                # try to put as many parameters as possible in PATH_INFO:
                #   - project name
                #   - action
+               #   - hash_parent or hash_parent_base:/file_parent
                #   - hash or hash_base:/filename
 
                # When the script is the root DirectoryIndex for the domain,
@@ -785,17 +786,36 @@ sub href (%) {
                        delete $params{'action'};
                }
 
-               # Finally, we put either hash_base:/file_name or hash
+               # Next, we put hash_parent_base:/file_parent..hash_base:/file_name,
+               # stripping nonexistent or useless pieces
+               $href .= "/" if ($params{'hash_base'} || $params{'hash_parent_base'}
+                       || $params{'hash_parent'} || $params{'hash'});
                if (defined $params{'hash_base'}) {
-                       $href .= "/".esc_url($params{'hash_base'});
-                       if (defined $params{'file_name'}) {
+                       if (defined $params{'hash_parent_base'}) {
+                               $href .= esc_url($params{'hash_parent_base'});
+                               # skip the file_parent if it's the same as the file_name
+                               delete $params{'file_parent'} if $params{'file_parent'} eq $params{'file_name'};
+                               if (defined $params{'file_parent'} && $params{'file_parent'} !~ /\.\./) {
+                                       $href .= ":/".esc_url($params{'file_parent'});
+                                       delete $params{'file_parent'};
+                               }
+                               $href .= "..";
+                               delete $params{'hash_parent'};
+                               delete $params{'hash_parent_base'};
+                       } elsif (defined $params{'hash_parent'}) {
+                               $href .= esc_url($params{'hash_parent'}). "..";
+                               delete $params{'hash_parent'};
+                       }
+
+                       $href .= esc_url($params{'hash_base'});
+                       if (defined $params{'file_name'} && $params{'file_name'} !~ /\.\./) {
                                $href .= ":/".esc_url($params{'file_name'});
                                delete $params{'file_name'};
                        }
                        delete $params{'hash'};
                        delete $params{'hash_base'};
                } elsif (defined $params{'hash'}) {
-                       $href .= "/".esc_url($params{'hash'});
+                       $href .= esc_url($params{'hash'});
                        delete $params{'hash'};
                }
        }