Merge pull request #11 from bessl/patch-2
[gitphp.git] / include / git / reflist / RefListLoad_Raw.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php
/**
 * Ref list load strategy using raw git objects
 *
 * @author Christopher Han <xiphux@gmail.com>
 * @copyright Copyright (c) 2012 Christopher Han
 * @package GitPHP
 * @subpackage Git\RefList
 */
abstract class GitPHP_RefListLoad_Raw
{
        /**
         * Loads the ref list for a ref type
         *
         * @param GitPHP_RefList $refList ref list
         * @param string $type ref type
         * @return array array of refs
         */
        protected function GetRefs(GitPHP_RefList $refList, $type)
        {
                if (!$refList)
                        return;
 
                if (empty($type))
                        return;
 
                if (GitPHP_DebugLog::GetInstance()->GetEnabled())
                        $autotimer = new GitPHP_DebugAutoLog();
 
                $refs = array();
 
                $prefix = 'refs/' . $type;
                $fullPath = $refList->GetProject()->GetPath() . '/' . $prefix;
                $fullPathLen = strlen($fullPath) + 1;
 
                /* loose files */
                $refFiles = GitPHP_Util::ListDir($fullPath);
                for ($i = 0; $i < count($refFiles); ++$i) {
                        $ref = substr($refFiles[$i], $fullPathLen);
 
                        if (empty($ref) || isset($refs[$ref]))
                                continue;
 
                        $hash = trim(file_get_contents($refFiles[$i]));
                        if (preg_match('/^[0-9A-Fa-f]{40}$/', $hash)) {
                                $refs[$ref] = $hash;
                        }
                }
 
                /* packed refs */
                if (file_exists($refList->GetProject()->GetPath() . '/packed-refs')) {
                        $packedRefs = explode("\n", file_get_contents($refList->GetProject()->GetPath() . '/packed-refs'));
 
                        foreach ($packedRefs as $ref) {
 
                                if (preg_match('/^([0-9A-Fa-f]{40}) refs\/' . $type . '\/(.+)$/', $ref, $regs)) {
                                        if (!isset($refs[$regs[2]])) {
                                                $refs[$regs[2]] = $regs[1];
                                        }
                                }
                        }
                }
 
                return $refs;
        }
}
 
comments