* [PATCH] gitweb: remove PATH_INFO from $my_url and $my_uri @ 2008-08-03 18:02 Giuseppe Bilotta 2008-08-03 19:10 ` Petr Baudis 0 siblings, 1 reply; 6+ messages in thread From: Giuseppe Bilotta @ 2008-08-03 18:02 UTC (permalink / raw) To: git; +Cc: Jakub Narebski, Petr Baudis, Giuseppe Bilotta This patch (combined with appropriate server configuration) allows usage of the gitweb CGI script as DirectoryIndex for the server root even when the pathinfo feature is enabled. Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com> --- gitweb/gitweb.perl | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index ba1f71b..9c8bcab 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -26,6 +26,10 @@ our $cgi = new CGI; our $version = "++GIT_VERSION++"; our $my_url = $cgi->url(); our $my_uri = $cgi->url(-absolute => 1); +if (my $path_info = $ENV{"PATH_INFO"}) { + $my_url =~ s,$path_info$,,; + $my_uri =~ s,$path_info$,,; +} # core git executable to use # this can just be "git" if your webserver has a sensible PATH -- 1.5.6.3 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] gitweb: remove PATH_INFO from $my_url and $my_uri 2008-08-03 18:02 [PATCH] gitweb: remove PATH_INFO from $my_url and $my_uri Giuseppe Bilotta @ 2008-08-03 19:10 ` Petr Baudis 0 siblings, 0 replies; 6+ messages in thread From: Petr Baudis @ 2008-08-03 19:10 UTC (permalink / raw) To: Giuseppe Bilotta; +Cc: git, Jakub Narebski On Sun, Aug 03, 2008 at 08:02:25PM +0200, Giuseppe Bilotta wrote: > This patch (combined with appropriate server configuration) allows usage > of the gitweb CGI script as DirectoryIndex for the server root even when > the pathinfo feature is enabled. > > Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com> Acked-by: Petr Baudis <pasky@suse.cz> (In case anyone is wondering, on repo.or.cz I used to just override $my_uri manually from the config file.) ^ permalink raw reply [flat|nested] 6+ messages in thread
* gitweb pathinfo improvements @ 2008-09-03 9:57 Giuseppe Bilotta 2008-09-03 9:57 ` [PATCH] gitweb: action in path with use_pathinfo Giuseppe Bilotta 0 siblings, 1 reply; 6+ messages in thread From: Giuseppe Bilotta @ 2008-09-03 9:57 UTC (permalink / raw) To: git; +Cc: Jakub Narebski, Petr Baudis, Lea Wiemann The following patchset improves on gitweb's support for PATH_INFO by supporting paths in the form project/action/[parent..]hash, both in generating them and in accepting them. The old path info style project/hash is still supported as long as it doesn't conflict with the new style For those that prefer git trees to patch bombs, my git tree is available for gitweb browsing at http://git.oblomov.eu/git and for git cloning at git://git.oblomov.eu/git/git The changes are very local to the PATH_INFO parsing and creation, so I hope they don't conflict with Lea's cache work. ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH] gitweb: action in path with use_pathinfo 2008-09-03 9:57 gitweb pathinfo improvements Giuseppe Bilotta @ 2008-09-03 9:57 ` Giuseppe Bilotta 2008-09-03 9:57 ` [PATCH] gitweb: use_pathinfo filenames start with / Giuseppe Bilotta 0 siblings, 1 reply; 6+ messages in thread From: Giuseppe Bilotta @ 2008-09-03 9:57 UTC (permalink / raw) To: git; +Cc: Jakub Narebski, Petr Baudis, Lea Wiemann, Giuseppe Bilotta When using path info, reduce the number of CGI parameters by embedding the action in the path. The typicial cgiweb path is thus $project/$action/$hash_base:$file_name or $project/$action/$hash This is mostly backwards compatible with the old-style gitweb paths, except when $project/$branch was used to access a branch whose name matches a gitweb action. Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com> --- gitweb/gitweb.perl | 109 ++++++++++++++++++++++++++++++++++------------------ 1 files changed, 72 insertions(+), 37 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 29e2156..496dce4 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -488,6 +488,37 @@ if (defined $searchtext) { $search_regexp = $search_use_regexp ? $searchtext : quotemeta $searchtext; } +# dispatch +my %actions = ( + "blame" => \&git_blame, + "blobdiff" => \&git_blobdiff, + "blobdiff_plain" => \&git_blobdiff_plain, + "blob" => \&git_blob, + "blob_plain" => \&git_blob_plain, + "commitdiff" => \&git_commitdiff, + "commitdiff_plain" => \&git_commitdiff_plain, + "commit" => \&git_commit, + "forks" => \&git_forks, + "heads" => \&git_heads, + "history" => \&git_history, + "log" => \&git_log, + "rss" => \&git_rss, + "atom" => \&git_atom, + "search" => \&git_search, + "search_help" => \&git_search_help, + "shortlog" => \&git_shortlog, + "summary" => \&git_summary, + "tag" => \&git_tag, + "tags" => \&git_tags, + "tree" => \&git_tree, + "snapshot" => \&git_snapshot, + "object" => \&git_object, + # those below don't need $project + "opml" => \&git_opml, + "project_list" => \&git_project_list, + "project_index" => \&git_project_index, +); + # now read PATH_INFO and use it as alternative to parameters sub evaluate_path_info { return if defined $project; @@ -512,6 +543,16 @@ sub evaluate_path_info { # do not change any parameters if an action is given using the query string return if $action; $path_info =~ s,^\Q$project\E/*,,; + + # next comes the action + $action = $path_info; + $action =~ s,/.*$,,; + if (exists $actions{$action}) { + $path_info =~ s,^\Q$action\E/*,,; + } else { + $action = undef; + } + my ($refname, $pathname) = split(/:/, $path_info, 2); if (defined $pathname) { # we got "project.git/branch:filename" or "project.git/branch:dir/" @@ -525,10 +566,12 @@ sub evaluate_path_info { } $hash_base ||= validate_refname($refname); $file_name ||= validate_pathname($pathname); + $hash ||= git_get_hash_by_path($hash_base, $file_name); } elsif (defined $refname) { # we got "project.git/branch" - $action ||= "shortlog"; - $hash ||= validate_refname($refname); + $action ||= "shortlog"; + $hash ||= validate_refname($refname); + $hash_base ||= validate_refname($refname); } } evaluate_path_info(); @@ -537,37 +580,6 @@ evaluate_path_info(); our $git_dir; $git_dir = "$projectroot/$project" if $project; -# dispatch -my %actions = ( - "blame" => \&git_blame, - "blobdiff" => \&git_blobdiff, - "blobdiff_plain" => \&git_blobdiff_plain, - "blob" => \&git_blob, - "blob_plain" => \&git_blob_plain, - "commitdiff" => \&git_commitdiff, - "commitdiff_plain" => \&git_commitdiff_plain, - "commit" => \&git_commit, - "forks" => \&git_forks, - "heads" => \&git_heads, - "history" => \&git_history, - "log" => \&git_log, - "rss" => \&git_rss, - "atom" => \&git_atom, - "search" => \&git_search, - "search_help" => \&git_search_help, - "shortlog" => \&git_shortlog, - "summary" => \&git_summary, - "tag" => \&git_tag, - "tags" => \&git_tags, - "tree" => \&git_tree, - "snapshot" => \&git_snapshot, - "object" => \&git_object, - # those below don't need $project - "opml" => \&git_opml, - "project_list" => \&git_project_list, - "project_index" => \&git_project_index, -); - if (!defined $action) { if (defined $hash) { $action = git_get_type($hash); @@ -624,8 +636,13 @@ sub href (%) { if ($params{-replay}) { while (my ($name, $symbol) = each %mapping) { if (!exists $params{$name}) { - # to allow for multivalued params we use arrayref form - $params{$name} = [ $cgi->param($symbol) ]; + if ($cgi->param($symbol)) { + # to allow for multivalued params we use arrayref form + $params{$name} = [ $cgi->param($symbol) ]; + } else { + no strict 'refs'; + $params{$name} = $$name if $$name; + } } } } @@ -636,10 +653,28 @@ sub href (%) { $href .= "/".esc_url($params{'project'}) if defined $params{'project'}; delete $params{'project'}; - # Summary just uses the project path URL - if (defined $params{'action'} && $params{'action'} eq 'summary') { + # Summary just uses the project path URL, any other action come next + # in the URL + if (defined $params{'action'}) { + $href .= "/".esc_url($params{'action'}) unless $params{'action'} eq 'summary'; delete $params{'action'}; } + + # next, we put either hash_base:file_name or hash + if (defined $params{'hash_base'}) { + $href .= "/".esc_url($params{'hash_base'}); + if (defined $params{'file_name'}) { + $href .= ":".esc_url($params{'file_name'}); + delete $params{'hash'} if $params{'hash'} eq git_get_hash_by_path($params{'hash_base'},$params{'file_name'}); + delete $params{'file_name'}; + } else { + delete $params{'hash'} if $params{'hash'} eq $params{'hash_base'}; + } + delete $params{'hash_base'}; + } elsif (defined $params{'hash'}) { + $href .= "/".esc_url($params{'hash'}); + delete $params{'hash'}; + } } # now encode the parameters explicitly -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH] gitweb: use_pathinfo filenames start with / 2008-09-03 9:57 ` [PATCH] gitweb: action in path with use_pathinfo Giuseppe Bilotta @ 2008-09-03 9:57 ` Giuseppe Bilotta 2008-09-03 9:57 ` [PATCH] gitweb: parse parent..current syntax from pathinfo Giuseppe Bilotta 0 siblings, 1 reply; 6+ messages in thread From: Giuseppe Bilotta @ 2008-09-03 9:57 UTC (permalink / raw) To: git; +Cc: Jakub Narebski, Petr Baudis, Lea Wiemann, Giuseppe Bilotta When using path info, make filenames start with a / (right after the : that separates them from the hash base). This minimal change allows relative navigation to work properly when viewing HTML files. Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com> --- gitweb/gitweb.perl | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 496dce4..9d4952f 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -664,7 +664,7 @@ sub href (%) { if (defined $params{'hash_base'}) { $href .= "/".esc_url($params{'hash_base'}); if (defined $params{'file_name'}) { - $href .= ":".esc_url($params{'file_name'}); + $href .= ":/".esc_url($params{'file_name'}); delete $params{'hash'} if $params{'hash'} eq git_get_hash_by_path($params{'hash_base'},$params{'file_name'}); delete $params{'file_name'}; } else { -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH] gitweb: parse parent..current syntax from pathinfo 2008-09-03 9:57 ` [PATCH] gitweb: use_pathinfo filenames start with / Giuseppe Bilotta @ 2008-09-03 9:57 ` Giuseppe Bilotta 2008-09-03 9:57 ` [PATCH] gitweb: use_pathinfo creates parent..current paths Giuseppe Bilotta 0 siblings, 1 reply; 6+ messages in thread From: Giuseppe Bilotta @ 2008-09-03 9:57 UTC (permalink / raw) To: git; +Cc: Jakub Narebski, Petr Baudis, Lea Wiemann, Giuseppe Bilotta This makes it possible to use an URL such as $project/somebranch..otherbranch:/filename to get a diff between different version of a file. Paths like $project/$action/somebranch:/somefile..otherbranch:/otherfile are parsed as well. Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com> --- gitweb/gitweb.perl | 26 ++++++++++++++++++++++++-- 1 files changed, 24 insertions(+), 2 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 9d4952f..3d21624 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -553,7 +553,9 @@ sub evaluate_path_info { $action = undef; } - my ($refname, $pathname) = split(/:/, $path_info, 2); + $path_info =~ /^((.+?)(:(.+))?\.\.)?(.+?)(:(.+))?$/; + my ($parentrefname, $parentpathname, $refname, $pathname) = ( + $2, $4, $5, $7); if (defined $pathname) { # we got "project.git/branch:filename" or "project.git/branch:dir/" # we could use git_get_type(branch:pathname), but it needs $git_dir @@ -562,7 +564,11 @@ sub evaluate_path_info { $action ||= "tree"; $pathname =~ s,/$,,; } else { - $action ||= "blob_plain"; + if ($parentrefname) { + $action ||= "blobdiff_plain"; + } else { + $action ||= "blob_plain"; + } } $hash_base ||= validate_refname($refname); $file_name ||= validate_pathname($pathname); @@ -573,6 +579,22 @@ sub evaluate_path_info { $hash ||= validate_refname($refname); $hash_base ||= validate_refname($refname); } + # the parent part might be missing the pathname, in which case we use the $file_name, if present + if (defined $parentrefname) { + $hash_parent_base ||= validate_refname($parentrefname); + if ($parentpathname) { + $parentpathname =~ s,^/+,,; + $parentpathname =~ s,/$,,; + $file_parent ||= validate_pathname($parentpathname); + } else { + $file_parent ||= $file_name + } + if (defined $file_parent) { + $hash_parent ||= git_get_hash_by_path($hash_parent_base, $file_parent); + } else { + $hash_parent ||= validate_refname($parentrefname); + } + } } evaluate_path_info(); -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH] gitweb: use_pathinfo creates parent..current paths 2008-09-03 9:57 ` [PATCH] gitweb: parse parent..current syntax from pathinfo Giuseppe Bilotta @ 2008-09-03 9:57 ` Giuseppe Bilotta 2008-09-03 9:57 ` [PATCH] gitweb: remove PATH_INFO from $my_url and $my_uri Giuseppe Bilotta 0 siblings, 1 reply; 6+ messages in thread From: Giuseppe Bilotta @ 2008-09-03 9:57 UTC (permalink / raw) To: git; +Cc: Jakub Narebski, Petr Baudis, Lea Wiemann, Giuseppe Bilotta If use_pathinfo is enabled, href now creates links that contain paths in the form $project/$action/oldhash:/oldname..newhash:/newname for actions that use hash_parent etc. Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com> --- gitweb/gitweb.perl | 26 +++++++++++++++++++++++--- 1 files changed, 23 insertions(+), 3 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 3d21624..573b416 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -682,9 +682,29 @@ sub href (%) { delete $params{'action'}; } - # next, 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{'hash_parent_base'}) { + $href .= esc_url($params{'hash_parent_base'}); + if (defined $params{'file_parent'}) { + $href .= ":/".esc_url($params{'file_parent'}) unless $params{'file_parent'} eq $params{'file_name'}; + delete $params{'hash_parent'} if $params{'hash_parent'} eq git_get_hash_by_path($params{'hash_parent_base'},$params{'file_parent'}); + delete $params{'file_parent'}; + } else { + delete $params{'hash_parent'} if $params{'hash_parent'} eq $params{'hash_parent_base'}; + if ($params{'file_name'}) { + delete $params{'hash_parent'} if $params{'hash_parent'} eq git_get_hash_by_path($params{'hash_parent_base'},$params{'file_name'}); + } + } + $href .= ".."; + 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'}) { $href .= ":/".esc_url($params{'file_name'}); delete $params{'hash'} if $params{'hash'} eq git_get_hash_by_path($params{'hash_base'},$params{'file_name'}); @@ -694,7 +714,7 @@ sub href (%) { } delete $params{'hash_base'}; } elsif (defined $params{'hash'}) { - $href .= "/".esc_url($params{'hash'}); + $href .= esc_url($params{'hash'}); delete $params{'hash'}; } } -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH] gitweb: remove PATH_INFO from $my_url and $my_uri 2008-09-03 9:57 ` [PATCH] gitweb: use_pathinfo creates parent..current paths Giuseppe Bilotta @ 2008-09-03 9:57 ` Giuseppe Bilotta 0 siblings, 0 replies; 6+ messages in thread From: Giuseppe Bilotta @ 2008-09-03 9:57 UTC (permalink / raw) To: git; +Cc: Jakub Narebski, Petr Baudis, Lea Wiemann, Giuseppe Bilotta This patch (combined with appropriate server configuration) allows usage of the gitweb CGI script as DirectoryIndex for the server root even when the pathinfo feature is enabled. Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com> --- gitweb/gitweb.perl | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 573b416..99c891e 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -26,6 +26,10 @@ our $cgi = new CGI; our $version = "++GIT_VERSION++"; our $my_url = $cgi->url(); our $my_uri = $cgi->url(-absolute => 1); +if (my $path_info = $ENV{"PATH_INFO"}) { + $my_url =~ s,$path_info$,,; + $my_uri =~ s,$path_info$,,; +} # core git executable to use # this can just be "git" if your webserver has a sensible PATH -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH] gitweb: remove PATH_INFO from $my_url and $my_uri @ 2008-09-29 13:07 Giuseppe Bilotta 2008-09-29 13:39 ` Jakub Narebski 2008-10-02 14:22 ` Petr Baudis 0 siblings, 2 replies; 6+ messages in thread From: Giuseppe Bilotta @ 2008-09-29 13:07 UTC (permalink / raw) To: git; +Cc: Jakub Narebski, Junio C Hamano, Shawn O. Pearce, Giuseppe Bilotta This patch fixes PATH_INFO handling by removing the relevant part from $my_url and $my_uri, thus making it unnecessary to specify them by hand in the gitweb configuration. Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com> --- gitweb/gitweb.perl | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index da474d0..ffe3dbf 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -27,6 +27,13 @@ our $version = "++GIT_VERSION++"; our $my_url = $cgi->url(); our $my_uri = $cgi->url(-absolute => 1); +# if we're called with PATH_INFO, we have to strip that +# from the URL to find our real URL +if (my $path_info = $ENV{"PATH_INFO"}) { + $my_url =~ s,\Q$path_info\E$,,; + $my_uri =~ s,\Q$path_info\E$,,; +} + # core git executable to use # this can just be "git" if your webserver has a sensible PATH our $GIT = "++GIT_BINDIR++/git"; -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] gitweb: remove PATH_INFO from $my_url and $my_uri 2008-09-29 13:07 Giuseppe Bilotta @ 2008-09-29 13:39 ` Jakub Narebski 2008-10-02 14:22 ` Petr Baudis 1 sibling, 0 replies; 6+ messages in thread From: Jakub Narebski @ 2008-09-29 13:39 UTC (permalink / raw) To: Giuseppe Bilotta; +Cc: git, Shawn O. Pearce Giuseppe Bilotta wrote: > This patch fixes PATH_INFO handling by removing the relevant part from > $my_url and $my_uri, thus making it unnecessary to specify them by hand > in the gitweb configuration. > > Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com> Acked-by: Jakub Narebski <jnareb@gmail.com> -- Jakub Narebski Poland ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] gitweb: remove PATH_INFO from $my_url and $my_uri 2008-09-29 13:07 Giuseppe Bilotta 2008-09-29 13:39 ` Jakub Narebski @ 2008-10-02 14:22 ` Petr Baudis 1 sibling, 0 replies; 6+ messages in thread From: Petr Baudis @ 2008-10-02 14:22 UTC (permalink / raw) To: Giuseppe Bilotta; +Cc: git, Jakub Narebski, Junio C Hamano, Shawn O. Pearce On Mon, Sep 29, 2008 at 03:07:42PM +0200, Giuseppe Bilotta wrote: > This patch fixes PATH_INFO handling by removing the relevant part from > $my_url and $my_uri, thus making it unnecessary to specify them by hand > in the gitweb configuration. > > Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com> Acked-by: Petr Baudis <pasky@suse.cz> ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2008-10-02 14:23 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-08-03 18:02 [PATCH] gitweb: remove PATH_INFO from $my_url and $my_uri Giuseppe Bilotta 2008-08-03 19:10 ` Petr Baudis -- strict thread matches above, loose matches on Subject: below -- 2008-09-03 9:57 gitweb pathinfo improvements Giuseppe Bilotta 2008-09-03 9:57 ` [PATCH] gitweb: action in path with use_pathinfo Giuseppe Bilotta 2008-09-03 9:57 ` [PATCH] gitweb: use_pathinfo filenames start with / Giuseppe Bilotta 2008-09-03 9:57 ` [PATCH] gitweb: parse parent..current syntax from pathinfo Giuseppe Bilotta 2008-09-03 9:57 ` [PATCH] gitweb: use_pathinfo creates parent..current paths Giuseppe Bilotta 2008-09-03 9:57 ` [PATCH] gitweb: remove PATH_INFO from $my_url and $my_uri Giuseppe Bilotta 2008-09-29 13:07 Giuseppe Bilotta 2008-09-29 13:39 ` Jakub Narebski 2008-10-02 14:22 ` Petr Baudis
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).