# Based on http://www.clearchain.com/blog/posts/cgit-upgrade-gitweb-retired
#
# Redirects mapping gitweb -> cgit
#
# Gitweb uses get targets seperated by ;
#
# /?...;...;...
#
# p = Project
# a = Action like (
#       blob,
#       blob_plain,
#       commitdiff,
#       commit,
#       history,
#       log,
#       rss|atom,
#       shortlog,
#       summary,
#       tag,
#       tree,
#       snapshot
#     )
# h = SHA Hash
# hb= SHA Hash Tree Base
# f= file/dir
# sf= snapshot format
#
# Cgit uses the following:
#
# /project/action/?...
#
# action ( commit, log, diff, tree, tag, patch )
#
# id = SHA Hash
# id2 = SHA Hash
# h = head
#
# Translation rules
#
# Project is a straight redirect
# ---
# /?p=(.+)\.git;       /$1/
#
# Action requires a mapping
# ---
# a=(blob|tree)                 /tree/
# a=(blobdiff|commitdiff)       /diff/
# a=commit                      /commit/
# a=(summary)                   /
# a=(shortlog|log|history)      /log/
# a=tag                         /tag/
# a=blob_plain                  /blob/
# a=rss|atom                    /atom
#
# Targets require mapping
# ---
# h=(.+)     id=$1
# f=(.+)     /$1
# hb=(.+)    id2=$1
#
# Now putting it all together
#
RewriteEngine On

# blob
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=blob;h=([^;]+);hb=([^;]+);f=([^;]+)
RewriteRule ^/$ /%1.git/tree/%5?id=%3;id2=%4 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=blob;f=([^;]+);h=([^;]+);hb=([^;]+)
RewriteRule ^/$ /%1.git/tree/%3?id=%4;id2=%5 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=blob;hb=([^;]+);f=([^;]+)
RewriteRule ^/$ /%1.git/tree/%4?id=%3 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=blob;f=([^;]+)
RewriteRule ^/$ /%1.git/tree/%3 [R=permanent,L,NE,QSD]

# tree
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=tree;h=([^;]+);hb=([^;]+);f=([^;]+)
RewriteRule ^/$ /%1.git/tree/%5?id=%4 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=tree;hb=([^;]+);f=([^;]+)
RewriteRule ^/$ /%1.git/tree/%4?id=%3 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=tree;h=([^;]+);hb=([^;]+)
RewriteRule ^/$ /%1.git/tree/?id=%4 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=tree;hb=([^;]+)
RewriteRule ^/$ /%1.git/tree/?id=%3 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=tree
RewriteRule ^/$ /%1.git/tree/? [R=permanent,L,NE,QSD]

# commitdiff
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=blobdiff;h=([^;]+);hp=([^;]+);hb=([^;]+);f=([^;]+)
RewriteRule ^/$ /%1.git/diff/%6?id2=%4;id=%3;id3=%5 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=commitdiff;h=([^;]+);hp=([^;]+)
RewriteRule ^/$ /%1.git/diff/?id=%4;id2=%3 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=commitdiff;h=([^;]+)
RewriteRule ^/$ /%1.git/diff/?id=%3 [R=permanent,L,NE,QSD]

# commit
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=commit;h=([^;]+)
RewriteRule ^/$ /%1.git/commit/?id=%3 [R=permanent,L,NE,QSD]

# shortlog
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=shortlog;h=([^;]+)
RewriteRule ^/$ /%1.git/log/?id=%3 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=shortlog
RewriteRule ^/$ /%1.git/log/? [R=permanent,L,NE,QSD]

# log
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=log;h=([^;]+)
RewriteRule ^/$ /%1.git/log/?id=%3 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=log
RewriteRule ^/$ /%1.git/log [R=permanent,L,NE,QSD]

# history
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=history;h=([^;]+);hb=([^;]+);f=([^;]+)
RewriteRule ^/$ /%1.git/log/%5?id=%4 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=history;f=([^;]+);h=([^;]+);hb=([^;]+)
RewriteRule ^/$ /%1.git/log/%3?id=%4 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=history;f=([^;]+);h=([^;]+)
RewriteRule ^/$ /%1.git/log/%3?id=%4 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=history;h=([^;]+);hb=([^;]+)
RewriteRule ^/$ /%1.git/log/?id=%4 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=history;hb=([^;]+);f=([^;]+)
RewriteRule ^/$ /%1.git/log/%4?id=%3 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=history;hb=([^;]+)
RewriteRule ^/$ /%1.git/log/?id=%3 [R=permanent,L,NE,QSD]

# tag
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=tag;h=([^;]+)
RewriteRule ^/$ /%1.git/tag/?id=%4 [R=permanent,L,NE,QSD]

# blob_plain
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=blob_plain;h=([^;]+);f=([^;]+)
RewriteRule ^/$ /%1.git/blob/%4?id=%3 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=blob_plain;f=([^;]+);hb=([^;]+)
RewriteRule ^/$ /%1.git/plain/%3?id2=%4 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=blob_plain;f=([^;]+)
RewriteRule ^/$ /%1.git/plain/%3 [R=permanent,L,NE,QSD]

# rss|atom
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=(rss|atom);h=refsheads/([^;]+)
RewriteRule ^/$ /%1.git/atom?h=%4 [R=permanent,L,NE,QSD]
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=(rss|atom)
RewriteRule ^/$ /%1.git/atom [R=permanent,L,NE,QSD]

# snapshot
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?;a=snapshot;h=([^;]+);sf=([^;]+)
RewriteRule ^/$ /%1.git/snapshot/%3.tar.gz [R=permanent,L,NE,QSD]

# summary
RewriteCond %{QUERY_STRING} p=([^;]+)(\.git)(;a=summary)?$
RewriteRule ^/$ /%1 [R=permanent,L,NE,QSD]

# Failsafes in case nothing above matches,
# try at least to put the person in the project, else root of cgit
RewriteCond %{QUERY_STRING} p=([^;]+?)(\.git)?.*
RewriteRule ^/$ /%1 [R=temp,L,NE,QSD]
RewriteCond %{QUERY_STRING} .+
RewriteRule ^/.+ / [R=temp,L,NE,QSD]