3 * Project File Information/Download Page
5 * Copyright 1999-2001 (c) VA Linux Systems
6 * Copyright 2002-2004 (c) GForge Team
7 * Copyright 2010 (c) FusionForge Team
8 * Copyright 2013, Franck Villaume - TrivialDev
9 * http://fusionforge.org/
11 * This file is part of FusionForge. FusionForge is free software;
12 * you can redistribute it and/or modify it under the terms of the
13 * GNU General Public License as published by the Free Software
14 * Foundation; either version 2 of the Licence, or (at your option)
17 * FusionForge is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License along
23 * with FusionForge; if not, write to the Free Software Foundation, Inc.,
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 require_once '../env.inc.php';
29 require_once $gfcommon.'include/pre.php';
30 require_once $gfcommon.'frs/include/frs_utils.php';
31 require_once $gfcommon.'frs/FRSPackage.class.php';
34 $group_id = getIntFromRequest('group_id');
35 $release_id = getIntFromRequest('release_id');
37 // Allow alternate content-type rendering by hook
38 $default_content_type = 'text/html';
40 $script = 'frs_index';
41 $content_type = util_negociate_alternate_content_types($script, $default_content_type);
43 if($content_type != $default_content_type) {
44 $hook_params = array();
45 $hook_params['accept'] = $content_type;
46 $hook_params['group_id'] = $group_id;
47 $hook_params['release_id'] = $release_id;
48 $hook_params['return'] = '';
49 $hook_params['content_type'] = '';
50 plugin_hook_by_reference('content_negociated_frs_index', $hook_params);
51 if($hook_params['content_type'] != ''){
52 header('Content-type: '. $hook_params['content_type']);
53 echo $hook_params['content'];
56 header('HTTP/1.1 406 Not Acceptable',true,406);
61 $cur_group = group_get_object($group_id);
68 // Members of projects can see all packages
69 // Non-members can only see public packages
71 if (session_loggedin()) {
72 if (user_ismember($group_id) || forge_check_global_perm('forge_admin')) {
75 $pub_sql=' AND is_public=1 ';
78 $pub_sql=' AND is_public=1 ';
87 $res_package = db_query_params( $sql, array($group_id));
88 $num_packages = db_numrows( $res_package );
90 frs_header(array('title'=>_('Project Filelist'),'group'=>$group_id));
92 plugin_hook("blocks", "files index");
95 if ( $num_packages < 1) {
96 echo "<h1>"._('No File Packages')."</h1>";
97 echo "<div class='warning'>"._('There are no file packages defined for this project.')."</div>";
99 echo '<div id="forge-frs" class="underline-link">'."\n";
101 echo '<div class="blue-box">'._('Below is a list of all files of the project.').' ';
103 echo _('The release you have chosen is <span class="selected">highlighted</span>.').' ';
105 echo _('Before downloading, you may want to read Release Notes and ChangeLog (accessible by clicking on release version).').'
106 </div><!-- class="blue-box" -->
109 // check the permissions and see if this user is a release manager.
110 // If so, offer the opportunity to create a release
112 if (forge_check_perm ('frs', $group_id, 'write')) {
113 echo '<p><a href="admin/qrs.php?group_id='.$group_id.'">';
114 echo _('To create a new release click here.');
118 // get unix group name for path
119 $group_unix_name=group_getunixname($group_id);
121 $proj_stats['packages'] = $num_packages;
122 $proj_stats['releases'] = 0;
123 $proj_stats['size'] = 0;
125 // Iterate and show the packages
126 for ( $p = 0; $p < $num_packages; $p++ ) {
128 $package_id = db_result($res_package, $p, 'package_id');
130 $frsPackage = new FRSPackage($cur_group, $package_id);
132 $package_name = db_result($res_package, $p, 'name');
134 if($frsPackage->isMonitoring()) {
135 $title = $package_name . " - " . _('Stop monitoring this package');
136 $url = '/frs/monitor.php?filemodule_id='. $package_id .'&group_id='.db_result($res_package,$p,'group_id').'&stop=1';
137 $package_monitor = util_make_link ( $url, $GLOBALS['HTML']->getMonitorPic($title));
139 $title = $package_name . " - " . _('Monitor this package');
140 $url = '/frs/monitor.php?filemodule_id='. $package_id .'&group_id='.db_result($res_package,$p,'group_id').'&start=1';
141 $package_monitor = util_make_link ( $url, $GLOBALS['HTML']->getMonitorPic($title));
144 $package_name_protected = $HTML->toSlug($package_name);
145 echo "\n".'<h2 id="title_'. $package_name_protected .'">' . $package_name . ' <span class="frs-monitor-package">' . $package_monitor . '</span></h2>'."\n";
147 // get the releases of the package
148 $res_release = db_query_params ('SELECT * FROM frs_release
150 AND status_id=1 ORDER BY release_date DESC, name ASC',
151 array ($package_id));
152 $num_releases = db_numrows( $res_release );
154 $proj_stats['releases'] += $num_releases;
156 if ( !$res_release || $num_releases < 1 ) {
157 echo '<div class="warning">' . _('No releases') . '</div>
160 if (class_exists('ZipArchive')) {
161 // display link to latest-release-as-zip
162 print '<p><em>'._('Download latest release as ZIP:').' ';
163 print util_make_link ('/frs/download.php/latestzip/'.$frsPackage->getID().'/'.$frsPackage->getNewestReleaseZipName(),
164 $frsPackage->getNewestReleaseZipName(),
165 array('title' => _('This link always points to the newest release as a ZIP file.')));
169 // iterate and show the releases of the package
170 for ( $r = 0; $r < $num_releases; $r++ ) {
171 $package_release = db_fetch_array( $res_release );
173 $package_release_id = $package_release['release_id'];
175 // Switch whether release_id exists and/or release_id is current one
176 if ( ! $release_id || $release_id==$package_release_id ) {
177 // no release_id OR release_id is current one
178 $release_title = util_make_link ( 'frs/shownotes.php?release_id=' . $package_release_id, $package_name.' '.$package_release['name'].' ('.date(_('Y-m-d H:i'),$package_release['release_date']).')');
179 echo $GLOBALS['HTML']->boxTop($release_title, $package_name . '_' . $package_release['name'])."\n";
180 } elseif ( $release_id!=$package_release_id ) {
181 // release_id but not current one
182 $t_url_anchor = $HTML->toSlug($package_name)."-".$HTML->toSlug($package_release['name'])."-title-content";
183 $t_url = 'frs/?group_id='.$group_id.'&release_id=' . $package_release_id . "#" . $t_url_anchor;
184 $release_title = util_make_link ( $t_url, $package_name.' '.$package_release['name']);
185 echo '<div class="frs_release_name_version">'.$release_title."</div>"."\n";
188 // get the files in this release....
189 $res_file = db_query_params("SELECT frs_file.filename AS filename,
190 frs_file.file_size AS file_size,
191 frs_file.file_id AS file_id,
192 frs_file.release_time AS release_time,
193 frs_filetype.name AS type,
194 frs_processor.name AS processor,
195 frs_dlstats_filetotal_agg.downloads AS downloads
196 FROM frs_filetype,frs_processor,
197 frs_file LEFT JOIN frs_dlstats_filetotal_agg ON frs_dlstats_filetotal_agg.file_id=frs_file.file_id
199 AND frs_filetype.type_id=frs_file.type_id
200 AND frs_processor.processor_id=frs_file.processor_id
201 ORDER BY filename", array($package_release_id));
202 $num_files = db_numrows( $res_file );
204 @$proj_stats['files'] += $num_files;
206 $cell_data = array();
207 $cell_data[] = _('Filename');
208 $cell_data[] = _('Date');
209 $cell_data[] = _('Size');
210 $cell_data[] = _('D/L');
211 $cell_data[] = _('Arch');
212 $cell_data[] = _('Type');
213 $cell_data[] = _('Latest');
215 // Switch whether release_id exists and/or release_id == package_release['release_id']
216 if ( ! $release_id ) {
218 echo $GLOBALS['HTML']->listTableTop($cell_data,'',false);
219 } elseif ( $release_id==$package_release_id ) {
220 // release_id is current one
221 echo $GLOBALS['HTML']->listTableTop($cell_data,'',true);
223 // release_id but not current one => dont print anything here
226 if ( ! $release_id || $release_id==$package_release_id ) {
227 // no release_id OR no release_id OR release_id is current one
228 if ( !$res_file || $num_files < 1 ) {
229 echo '<tr><td colspan="7"> <em>'._('No releases').'</em></td></tr>
232 // now iterate and show the files in this release....
233 for ( $f = 0; $f < $num_files; $f++ ) {
234 $file_release = db_fetch_array( $res_file );
236 $tmp_col1 = util_make_link ('/frs/download.php/file/'.$file_release['file_id'].'/'.$file_release['filename'], $file_release['filename']);
237 $tmp_col2 = date(_('Y-m-d H:i'), $file_release['release_time'] );
238 $tmp_col3 = human_readable_bytes($file_release['file_size']);
239 $tmp_col4 = ($file_release['downloads'] ? number_format($file_release['downloads'], 0) : '0');
240 $tmp_col5 = $file_release['processor'];
241 $tmp_col6 = $file_release['type'];
242 $tmp_col7 = util_make_link ('/frs/download.php/latestfile/'.$frsPackage->getID().'/'.$file_release['filename'], _('Latest version'));
244 $proj_stats['size'] += $file_release['file_size'];
245 @$proj_stats['downloads'] += $file_release['downloads'];
248 echo ' <td>' . $tmp_col1 . '</td>'."\n";
249 echo ' <td>' . $tmp_col2 . '</td>'."\n";
250 echo ' <td>' . $tmp_col3 . '</td>'."\n";
251 echo ' <td>' . $tmp_col4 . '</td>'."\n";
252 echo ' <td>' . $tmp_col5 . '</td>'."\n";
253 echo ' <td>' . $tmp_col6 . '</td>'."\n";
254 echo ' <td>' . $tmp_col7 . '</td>'."\n";
258 echo $GLOBALS['HTML']->listTableBottom();
260 // release_id but not current one
261 // nothing to print here
264 if ( ! $release_id || $release_id==$package_release_id ) {
265 echo $GLOBALS['HTML']->boxBottom();
268 } //if: release(s) available
270 echo '</div><!-- id="forge-frs" -->';