} 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;
*/
class GitInfoTest extends MediaWikiTestCase {
+ public static function setUpBeforeClass() {
+ mkdir( __DIR__ . '/../data/gitrepo' );
+ mkdir( __DIR__ . '/../data/gitrepo/1' );
+ mkdir( __DIR__ . '/../data/gitrepo/2' );
+ mkdir( __DIR__ . '/../data/gitrepo/3' );
+ mkdir( __DIR__ . '/../data/gitrepo/1/.git' );
+ mkdir( __DIR__ . '/../data/gitrepo/1/.git/refs' );
+ mkdir( __DIR__ . '/../data/gitrepo/1/.git/refs/heads' );
+ file_put_contents( __DIR__ . '/../data/gitrepo/1/.git/HEAD',
+ "ref: refs/heads/master\n" );
+ file_put_contents( __DIR__ . '/../data/gitrepo/1/.git/refs/heads/master',
+ "0123456789012345678901234567890123abcdef\n" );
+ file_put_contents( __DIR__ . '/../data/gitrepo/1/.git/packed-refs',
+ "abcdef6789012345678901234567890123456789 refs/heads/master\n" );
+ file_put_contents( __DIR__ . '/../data/gitrepo/2/.git',
+ "gitdir: ../1/.git\n" );
+ file_put_contents( __DIR__ . '/../data/gitrepo/3/.git',
+ 'gitdir: ' . __DIR__ . "/../data/gitrepo/1/.git\n" );
+ }
+
+ public static function tearDownAfterClass() {
+ wfRecursiveRemoveDir( __DIR__ . '/../data/gitrepo' );
+ }
+
protected function setUp() {
parent::setUp();
$this->setMwGlobals( 'wgGitInfoCacheDirectory', __DIR__ . '/../data/gitinfo' );
$this->assertTrue( $fixture->cacheIsComplete() );
}
+ public function testReadingHead() {
+ $dir = __DIR__ . '/../data/gitrepo/1';
+ $fixture = new GitInfo( $dir );
+
+ $this->assertEquals( 'refs/heads/master', $fixture->getHead() );
+ $this->assertEquals( '0123456789012345678901234567890123abcdef', $fixture->getHeadSHA1() );
+ }
+
+ public function testIndirection() {
+ $dir = __DIR__ . '/../data/gitrepo/2';
+ $fixture = new GitInfo( $dir );
+
+ $this->assertEquals( 'refs/heads/master', $fixture->getHead() );
+ $this->assertEquals( '0123456789012345678901234567890123abcdef', $fixture->getHeadSHA1() );
+ }
+
+ public function testIndirection2() {
+ $dir = __DIR__ . '/../data/gitrepo/3';
+ $fixture = new GitInfo( $dir );
+
+ $this->assertEquals( 'refs/heads/master', $fixture->getHead() );
+ $this->assertEquals( '0123456789012345678901234567890123abcdef', $fixture->getHeadSHA1() );
+ }
+
+ public function testReadingPackedRefs() {
+ $dir = __DIR__ . '/../data/gitrepo/1';
+ unlink( __DIR__ . '/../data/gitrepo/1/.git/refs/heads/master' );
+ $fixture = new GitInfo( $dir );
+
+ $this->assertEquals( 'refs/heads/master', $fixture->getHead() );
+ $this->assertEquals( 'abcdef6789012345678901234567890123456789', $fixture->getHeadSHA1() );
+ }
}