46 {
47 $categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel);
48 if (PEAR::isError($categorylist)) {
49 return $categorylist;
50 }
51
52 $ret = array();
53 if (!is_array($categorylist['c']) || !isset($categorylist['c'][0])) {
54 $categorylist['c'] = array($categorylist['c']);
55 }
56
58
59 foreach ($categorylist['c'] as $progress => $category) {
60 $category = $category['_content'];
61 $packagesinfo = $this->_rest->retrieveData($base .
62 'c/' . urlencode($category) . '/packagesinfo.xml', false, false, $channel);
63
64 if (PEAR::isError($packagesinfo)) {
65 continue;
66 }
67
68 if (!is_array($packagesinfo) || !isset($packagesinfo['pi'])) {
69 continue;
70 }
71
72 if (!is_array($packagesinfo['pi']) || !isset($packagesinfo['pi'][0])) {
73 $packagesinfo['pi'] = array($packagesinfo['pi']);
74 }
75
76 foreach ($packagesinfo['pi'] as $packageinfo) {
77 if (empty($packageinfo)) {
78 continue;
79 }
80
81 $info = $packageinfo['p'];
82 $package = $info['n'];
83 $releases = isset($packageinfo['a']) ? $packageinfo['a'] : false;
84 unset($latest);
85 unset($unstable);
86 unset($stable);
87 unset($state);
88
89 if ($releases) {
90 if (!isset($releases['r'][0])) {
91 $releases['r'] = array($releases['r']);
92 }
93
94 foreach ($releases['r'] as $release) {
95 if (!isset($latest)) {
96 if ($dostable && $release['s'] == 'stable') {
97 $latest = $release['v'];
98 $state = 'stable';
99 }
100 if (!$dostable) {
101 $latest = $release['v'];
102 $state = $release['s'];
103 }
104 }
105
106 if (!isset($stable) && $release['s'] == 'stable') {
107 $stable = $release['v'];
108 if (!isset($unstable)) {
109 $unstable = $stable;
110 }
111 }
112
113 if (!isset($unstable) && $release['s'] != 'stable') {
114 $unstable = $release['v'];
115 $state = $release['s'];
116 }
117
118 if (isset($latest) && !isset($state)) {
119 $state = $release['s'];
120 }
121
122 if (isset($latest) && isset($stable) && isset($unstable)) {
123 break;
124 }
125 }
126 }
127
128 if ($basic) {
129 if (!isset($latest)) {
130 $latest = false;
131 }
132
133 if ($dostable) {
134
135 if (isset($state) && $state == 'stable') {
136 $ret[$package] = array('stable' => $latest);
137 } else {
138 $ret[$package] = array('stable' => '-n/a-');
139 }
140 } else {
141 $ret[$package] = array('stable' => $latest);
142 }
143
144 continue;
145 }
146
147
148 if (!isset($unstable)) {
149 $unstable = false;
150 $state = 'stable';
151 if (isset($stable)) {
152 $latest = $unstable = $stable;
153 }
154 } else {
155 $latest = $unstable;
156 }
157
158 if (!isset($latest)) {
159 $latest = false;
160 }
161
162 $deps = array();
163 if ($latest && isset($packageinfo['deps'])) {
164 if (!is_array($packageinfo['deps']) ||
165 !isset($packageinfo['deps'][0])
166 ) {
167 $packageinfo['deps'] = array($packageinfo['deps']);
168 }
169
170 $d = false;
171 foreach ($packageinfo['deps'] as $dep) {
172 if ($dep['v'] == $latest) {
173 $d = unserialize($dep['d']);
174 }
175 }
176
177 if ($d) {
178 if (isset($d['required'])) {
179 if (!class_exists('PEAR_PackageFile_v2')) {
180 require_once 'PEAR/PackageFile/v2.php';
181 }
182
183 if (!isset($pf)) {
184 $pf = new PEAR_PackageFile_v2;
185 }
186
187 $pf->setDeps($d);
188 $tdeps = $pf->getDeps();
189 } else {
190 $tdeps = $d;
191 }
192
193 foreach ($tdeps as $dep) {
194 if ($dep['type'] !== 'pkg') {
195 continue;
196 }
197
198 $deps[] = $dep;
199 }
200 }
201 }
202
203 $info = array(
204 'stable' => $latest,
205 'summary' => $info['s'],
206 'description' => $info['d'],
207 'deps' => $deps,
208 'category' => $info['ca']['_content'],
209 'unstable' => $unstable,
210 'state' => $state
211 );
212 $ret[$package] = $info;
213 }
214 }
215
216 PEAR::popErrorHandling();
217 return $ret;
218 }