protected $cache = [];
/**
- * Map of repo URLs to viewer URLs. Access via static method getViewers().
+ * @var array|false Map of repo URLs to viewer URLs. Access via static method getViewers().
*/
private static $viewers = false;
} else {
// If not a SHA1 it may be a ref:
$refFile = "{$this->basedir}/{$head}";
+ $packedRefs = "{$this->basedir}/packed-refs";
+ $headRegex = preg_quote( $head, '/' );
if ( is_readable( $refFile ) ) {
$sha1 = rtrim( file_get_contents( $refFile ) );
+ } elseif ( is_readable( $packedRefs ) &&
+ preg_match( "/^([0-9A-Fa-f]{40}) $headRegex$/m", file_get_contents( $packedRefs ), $matches )
+ ) {
+ $sha1 = $matches[1];
}
}
$this->cache['headSHA1'] = $sha1;
if ( $url === false ) {
return false;
}
- if ( substr( $url, -4 ) !== '.git' ) {
- $url .= '.git';
- }
foreach ( self::getViewers() as $repo => $viewer ) {
$pattern = '#^' . $repo . '$#';
if ( preg_match( $pattern, $url, $matches ) ) {
'%h' => substr( $headSHA1, 0, 7 ),
'%H' => $headSHA1,
'%r' => urlencode( $matches[1] ),
+ '%R' => $matches[1],
];
return strtr( $viewerUrl, $replacements );
}