Merge pull request #11 from bessl/patch-2
[gitphp.git] / include / git / tag / TagLoad_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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?php
/**
 * Tag load strategy using raw git objects
 *
 * @author Christopher Han <xiphux@gmail.com>
 * @copyright Copyright (c) 2012 Christopher Han
 * @package GitPHP
 * @subpackage Git\Tag
 */
class GitPHP_TagLoad_Raw implements GitPHP_TagLoadStrategy_Interface
{
        /**
         * Object loader
         *
         * @var GitPHP_GitObjectLoader
         */
        protected $objectLoader;
 
        /**
         * Constructor
         *
         * @param GitPHP_GitObjectLoader $objectLoader object loader
         */
        public function __construct($objectLoader)
        {
                if (!$objectLoader)
                        throw new Exception('Object loader is required');
 
                $this->objectLoader = $objectLoader;
        }
 
        /**
         * Gets the data for a tag
         *
         * @param GitPHP_Tag $tag tag
         * @return array array of tag data
         */
        public function Load($tag)
        {
                if (!$tag)
                        return;
 
                $type = null;
                $object = null;
                $commitHash = null;
                $tagger = null;
                $taggerEpoch = null;
                $taggerTimezone = null;
                $comment = array();
 
                $data = $this->objectLoader->GetObject($tag->GetHash(), $packedType);
                
                if ($packedType == GitPHP_Pack::OBJ_COMMIT) {
                        /* light tag */
                        $object = $tag->GetHash();
                        $commitHash = $tag->GetHash();
                        $type = 'commit';
                        return array(
                                $type,
                                $object,
                                $commitHash,
                                $tagger,
                                $taggerEpoch,
                                $taggerTimezone,
                                $comment
                        );
                }
 
                $lines = explode("\n", $data);
 
                if (!isset($lines[0]))
                        return;
 
                $objectHash = null;
 
                $readInitialData = false;
                foreach ($lines as $i => $line) {
                        if (!$readInitialData) {
                                if (preg_match('/^object ([0-9a-fA-F]{40})$/', $line, $regs)) {
                                        $objectHash = $regs[1];
                                        continue;
                                } else if (preg_match('/^type (.+)$/', $line, $regs)) {
                                        $type = $regs[1];
                                        continue;
                                } else if (preg_match('/^tag (.+)$/', $line, $regs)) {
                                        continue;
                                } else if (preg_match('/^tagger (.*) ([0-9]+) (.*)$/', $line, $regs)) {
                                        $tagger = $regs[1];
                                        $taggerEpoch = $regs[2];
                                        $taggerTimezone = $regs[3];
                                        continue;
                                }
                        }
 
                        $trimmed = trim($line);
 
                        if ((strlen($trimmed) > 0) || ($readInitialData === true)) {
                                $comment[] = $line;
                        }
                        $readInitialData = true;
                }
 
                switch ($type) {
                        case 'commit':
                                $object = $objectHash;
                                $commitHash = $objectHash;
                                break;
                        case 'tag':
                                $object = $tag->GetProject()->GetTagList()->GetTagNameFromHash($objectHash);
                                break;
                        case 'blob':
                                $object = $objectHash;
                                break;
                }
 
                return array(
                        $type,
                        $object,
                        $commitHash,
                        $tagger,
                        $taggerEpoch,
                        $taggerTimezone,
                        $comment
                );
        }
}
 
comments