3 * Copyright (c) Xerox Corporation, Codendi Team, 2001-2009. All rights reserved
4 * Copyright (c) 2010 Alcatel-Lucent
5 * Copyright (C) 2011 Alain Peyrat - Alcatel-Lucent
7 * This file is a part of Fusionforge.
9 * Fusionforge is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * Fusionforge is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with Fusionforge. If not, see <http://www.gnu.org/licenses/>.
23 require_once 'common/mvc/Views.class.php';
24 /*require_once('common/include/HTTPRequest.class.php');
25 require_once 'common/user/UserManager.class.php';
26 require_once 'common/project/ProjectManager.class.php';*/
27 //require_once('common/reference/CrossReferenceFactory.class.php');
29 require_once 'HudsonJob.class.php';
30 require_once 'common/dao/CodendiDataAccess.class.php';
31 require_once 'PluginHudsonJobDao.class.php';
33 class hudsonViews extends Views {
35 function hudsonViews(&$controler, $view=null) {
36 $request =& HTTPRequest::instance();
37 $this->View($controler, $view, array('title'=>$this->_getTitle(),'group' => $request->get('group_id'), 'toptab' => 'hudson'));
41 use_javascript('/scripts/prototype/prototype.js');
42 use_javascript('/scripts/scriptaculous/scriptaculous.js');
45 // echo $this->_getHelp();
46 // echo '<h1>'.$this->_getTitle().'</h1>';
49 function _getTitle() {
50 // return _("Continuous Integration");
54 function _getHelp($section = '', $questionmark = false) {
55 if (trim($section) !== '' && $section{0} !== '#') {
56 $section = '#'.$section;
61 $help_label = _("Help");
63 return '<b><a href="javascript:help_window(\''.get_server_url().'help/guide/ContinuousIntegrationIntroduction.html'.$section.'\');">'.$help_label.'</a></b>';
71 function projectOverview() {
72 $request =& HTTPRequest::instance();
73 $group_id = $request->get('group_id');
74 $user = UserManager::instance()->getCurrentUser();
76 $this->_display_jobs_table($group_id);
77 if ($user->isMember($request->get('group_id'), 'A')) {
78 $this->_display_add_job_form($group_id);
80 $this->_display_iframe();
81 $this->_hide_iframe();
84 function job_details() {
85 $myfile=fopen('/tmp/jobdetails','a');
86 fwrite($myfile,"\n J'ai fait job detail");
87 $request =& HTTPRequest::instance();
88 $group_id = $request->get('group_id');
89 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
90 if ($request->exist('job_id')) {
91 $job_id = $request->get('job_id');
92 $dar = $job_dao->searchByJobID($job_id);
93 } elseif ($request->exist('job')) {
94 // used for references (job #MyJob or job #myproject:MyJob)
95 $job_name = $request->get('job');
96 $dar = $job_dao->searchByJobName($job_name, $group_id);
99 $row = $dar->current();
100 /*fwrite($myfile,"appel de Cross REf Factory avec :".$row['name']);
101 $crossref_fact= new CrossReferenceFactory($row['name'], 'hudson_job', $group_id);
102 $crossref_fact->fetchDatas();
103 if ($crossref_fact->getNbReferences() > 0) {
104 echo '<b> '._('References').'</b>';
105 $crossref_fact->DisplayCrossRefs();
107 $this->_display_iframe($row['job_url']);
108 fwrite($myfile,"display iframe de ".$row['job_url']);
110 echo '<span class="error">'._("Error: Hudson object not found.").'</span>';
114 function last_build() {
115 $request =& HTTPRequest::instance();
116 $group_id = $request->get('group_id');
117 $job_id = $request->get('job_id');
119 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
120 $dar = $job_dao->searchByJobID($job_id);
122 $row = $dar->current();
123 $this->_display_iframe($row['job_url'].'/lastBuild/');
125 echo '<span class="error">'._("Error: Hudson object not found.").'</span>';
129 function build_number() {
130 $request =& HTTPRequest::instance();
131 $group_id = $request->get('group_id');
132 if ($request->exist('build')) {
133 $build_id = $request->get('build');
135 $build_id = $request->get('build_id');
137 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
138 if ($request->exist('job_id')) {
139 $job_id = $request->get('job_id');
140 $dar = $job_dao->searchByJobID($job_id);
141 } elseif ($request->exist('job')) {
142 // used for references (build #MyJob/175 or job #myproject:MyJob/175 where 175 is the build number required)
143 $job_name = $request->get('job');
144 $dar = $job_dao->searchByJobName($job_name, $group_id);
146 // used for references (build #175 where 175 is the build number required)
147 // If no job or project is specified, we check if there is only one job associated to the current project and we assume it is this job.
148 $dar = $job_dao->searchByGroupID($group_id);
149 if ($dar->rowCount() != 1) {
154 if ($dar && $dar->valid()) {
155 $row = $dar->current();
156 // $crossref_fact= new CrossReferenceFactory($row['name'].'/'.$build_id, 'hudson_build', $group_id);
157 // $crossref_fact->fetchDatas();
158 // if ($crossref_fact->getNbReferences() > 0) {
159 // echo '<b> '._('References').'</b>';
160 // $crossref_fact->DisplayCrossRefs();
162 $this->_display_iframe($row['job_url'].'/'.$build_id.'/');
164 echo '<span class="error">'._("Error: Hudson object not found.").'</span>';
168 function last_test_result() {
169 $request =& HTTPRequest::instance();
170 $group_id = $request->get('group_id');
171 $job_id = $request->get('job_id');
172 $user = UserManager::instance()->getCurrentUser();
174 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
175 $dar = $job_dao->searchByJobID($job_id);
177 $row = $dar->current();
178 $this->_display_iframe($row['job_url'].'/lastBuild/testReport/');
180 echo '<span class="error">'._("Error: Hudson object not found.").'</span>';
184 function test_trend() {
185 $request =& HTTPRequest::instance();
186 $group_id = $request->get('group_id');
187 $job_id = $request->get('job_id');
188 $user = UserManager::instance()->getCurrentUser();
190 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
191 $dar = $job_dao->searchByJobID($job_id);
193 $row = $dar->current();
194 $this->_display_iframe($row['job_url'].'/test/?width=800&height=600&failureOnly=false');
196 echo '<span class="error">'._("Error: Hudson object not found.").'</span>';
201 $request =& HTTPRequest::instance();
202 $group_id = $request->get('group_id');
203 $job_id = $request->get('job_id');
204 $user = UserManager::instance()->getCurrentUser();
205 if ($user->isMember($group_id, 'A')) {
207 $project_manager = ProjectManager::instance();
208 $project = $project_manager->getProject($group_id);
210 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
211 $dar = $job_dao->searchByJobID($job_id);
213 $row = $dar->current();
215 echo '<a href="/plugins/hudson/?group_id='.$group_id.'">'._("Back to jobs list").'</a>';
217 echo '<h3>'._("Edit job").'</h3>';
218 echo ' <form method="post">';
220 echo ' <label for="new_hudson_job_url">'._("Job URL:").'</label>';
221 echo ' <input id="new_hudson_job_url" name="new_hudson_job_url" type="text" value="'.$row['job_url'].'" size="64" />';
224 echo ' <span class="legend">'._("eg: http://myCIserver/hudson/job/myJob").'</span>';
227 echo ' <label for="new_hudson_job_name">'._("Job name:").'</label>';
228 echo ' <input id="new_hudson_job_name" name="new_hudson_job_name" type="text" value="'.$row['name'].'" size="32" />';
231 echo ' <span class="legend">'.vsprintf(_("Name (with no space) used to make a reference to this job. Eg: job #%s"), array($row['name'])).'</span>';
233 if ($project->usesService('svn')) {
235 echo ' <label for="new_hudson_use_svn_trigger">'._("Trigger a build after SVN commits:").'</label>';
236 if ($row['use_svn_trigger'] == 1) {
237 $checked = ' checked="checked" ';
241 echo ' <input id="new_hudson_use_svn_trigger" name="new_hudson_use_svn_trigger" type="checkbox" '.$checked.' />';
244 if ($project->usesService('cvs')) {
246 echo ' <label for="new_hudson_use_cvs_trigger">'._("Trigger a build after CVS commits:").'</label>';
247 if ($row['use_cvs_trigger'] == 1) {
248 $checked = ' checked="checked" ';
252 echo ' <input id="new_hudson_use_cvs_trigger" name="new_hudson_use_cvs_trigger" type="checkbox" '.$checked.' />';
255 if ($project->usesService('svn') || $project->usesService('cvs')) {
257 echo ' <label for="new_hudson_trigger_token">'._("with (optional) token:").'</label>';
258 echo ' <input id="new_hudson_trigger_token" name="new_hudson_trigger_token" type="text" value="'.$row['token'].'" size="32" />';
262 echo ' <input type="hidden" name="group_id" value="'.$group_id.'" />';
263 echo ' <input type="hidden" name="job_id" value="'.$job_id.'" />';
264 echo ' <input type="hidden" name="action" value="update_job" />';
265 echo ' <input type="submit" value="'._("Update job").'" />';
278 function _display_jobs_table($group_id) {
279 $request =& HTTPRequest::instance();
280 $group_id = $request->get('group_id');
281 $user = UserManager::instance()->getCurrentUser();
282 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
283 $dar = $job_dao->searchByGroupID($group_id);
285 if ($dar && $dar->valid()) {
287 $project_manager = ProjectManager::instance();
288 $project = $project_manager->getProject($group_id);
290 echo '<table id="jobs_table">';
291 echo ' <tr class="boxtable">';
292 echo ' <th class="boxtitle"> </th>';
293 echo ' <th class="boxtitle">'._("Job").'</th>';
294 echo ' <th class="boxtitle">'._("Last Success").'</th>';
295 echo ' <th class="boxtitle">'._("Last Failure").'</th>';
296 echo ' <th class="boxtitle">'._("RSS").'</th>';
297 if ($project->usesService('svn')) {
298 echo ' <th class="boxtitle">'._("SVN trigger").'</th>';
300 if ($project->usesService('cvs')) {
301 echo ' <th class="boxtitle">'._("CVS trigger").'</th>';
303 if ($user->isMember($request->get('group_id'), 'A')) {
304 echo ' <th class="boxtitle">'._("Actions").'</th>';
309 while ($dar->valid()) {
310 $row = $dar->current();
312 $class="boxitemalt bgcolor-white";
314 $class="boxitem bgcolor-grey";
316 echo ' <tr class="'. $class .'">';
319 $job = new HudsonJob($row['job_url']);
321 echo ' <td><img src="'.$job->getStatusIcon().'" alt="'.$job->getStatus().'" title="'.$job->getStatus().'" /></td>';
322 // function toggle_iframe is in script plugins/hudson/www/hudson_tab.js
323 echo ' <td class="boxitem"><a href="'.$job->getUrl().'" onclick="toggle_iframe(this); return false;" title="'.vsprintf(_("Show job %s"), array($row['name'])).'">'.$row['name'].'</a></td>';
324 if ($job->getLastSuccessfulBuildNumber() != '') {
325 echo ' <td><a href="'.$job->getLastSuccessfulBuildUrl().'" onclick="toggle_iframe(this); return false;" title="'.vsprintf(_("Show build #%s of job %s"), array($job->getLastSuccessfulBuildNumber(), $row['name'])).'">'._("build").' #'.$job->getLastSuccessfulBuildNumber().'</a></td>';
327 echo ' <td> </td>';
329 if ($job->getLastFailedBuildNumber() != '') {
330 echo ' <td><a href="'.$job->getLastFailedBuildUrl().'" onclick="toggle_iframe(this); return false;" title="'.vsprintf(_("Show build #%s of job %s"), array($job->getLastFailedBuildNumber(), $row['name'])).'">'._("build").' #'.$job->getLastFailedBuildNumber().'</a></td>';
332 echo ' <td> </td>';
334 echo ' <td align="center"><a href="'.$job->getUrl().'/rssAll" onclick="toggle_iframe(this); return false;"><img src="'.$this->getControler()->getIconsPath().'rss_feed.png" alt="'.vsprintf(_("RSS feed of all builds for %s job"), array($row['name'])).'" title="'.vsprintf(_("RSS feed of all builds for %s job"), array($row['name'])).'" /></a></td>'."\n";
336 if ($project->usesService('svn')) {
337 if ($row['use_svn_trigger'] == 1) {
338 echo ' <td align="center"><img src="'.$this->getControler()->getIconsPath().'server_lightning.png" alt="'._("SVN commit will trigger a build").'" title="'._("SVN commit will trigger a build").'" /></td>';
340 echo ' <td> </td>';
343 if ($project->usesService('cvs')) {
344 if ($row['use_cvs_trigger'] == 1) {
345 echo ' <td align="center"><img src="'.$this->getControler()->getIconsPath().'server_lightning.png" alt="'._("CVS commit will trigger a build").'" title="'._("CVS commit will trigger a build").'" /></td>';
347 echo ' <td> </td>';
351 } catch (Exception $e) {
352 echo ' <td><img src="'.$this->getControler()->getIconsPath().'link_error.png" alt="'.$e->getMessage().'" title="'.$e->getMessage().'" /></td>';
354 if ($project->usesService('svn')) { $nb_columns++; }
355 if ($project->usesService('cvs')) { $nb_columns++; }
356 echo ' <td colspan="'.$nb_columns.'"><span class="error">'.$e->getMessage().'</span></td>';
359 if ($user->isMember($request->get('group_id'), 'A')) {
362 echo ' <span class="job_action">';
363 echo ' <a href="?action=edit_job&group_id='.$group_id.'&job_id='.$row['job_id'].'"><img src="'.$this->getControler()->getIconsPath().'edit.png" alt="'._("Edit this job").'" title="'._("Edit this job").'" />';
367 echo ' <span class="job_action">';
368 echo ' <a href="?action=delete_job&group_id='.$group_id.'&job_id='.$row['job_id'].'" onclick="return confirm(';
369 echo "'" . vsprintf(_("Are you sure you want to delete Job %s from project %s?"), array($row['name'], $project->getUnixName())) . "'";
370 echo ');"><img src="'.$this->getControler()->getIconsPath().'cross.png" alt="'._("Delete this job").'" title="'._("Delete this job").'" />';
383 echo '<p>'._("No Hudson jobs associated with this project. To add a job, select the link just below.").'</p>';
387 function _display_add_job_form($group_id) {
388 $project_manager = ProjectManager::instance();
389 $project = $project_manager->getProject($group_id);
391 // function toggle_addurlform is in script plugins/hudson/www/hudson_tab.js
392 echo '<a href="#" onclick="toggle_addurlform(); return false;">' . getIcon("ic/add.png") . ' '._("Add job").'</a>';
393 echo ' '.$this->_getHelp('HudsonService', true);
394 echo '<div id="hudson_add_job">';
395 echo ' <form action="">'."\n";
396 echo ' <label for="hudson_job_url">'._("Job URL:").'</label>'."\n";
397 echo ' <input id="hudson_job_url" name="hudson_job_url" type="text" size="64" />'."\n";
398 echo ' <input type="hidden" name="group_id" value="'.$group_id.'" />'."\n";
399 echo ' <input type="hidden" name="action" value="add_job" />'."\n";
401 echo ' <span class="legend">'._("eg: http://myCIserver/hudson/job/myJob").'</span>'."\n";
404 if ($project->usesService('svn')) {
405 echo _("Trigger a build after commits:");
406 if ($project->usesService('svn')) {
407 echo ' <label for="hudson_use_svn_trigger">'._("SVN").'</label>';
408 echo ' <input id="hudson_use_svn_trigger" name="hudson_use_svn_trigger" type="checkbox" />';
410 if ($project->usesService('cvs')) {
411 echo ' <label for="hudson_use_cvs_trigger">'._("CVS").'</label>';
412 echo ' <input id="hudson_use_cvs_trigger" name="hudson_use_cvs_trigger" type="checkbox" />';
416 echo ' <label for="hudson_trigger_token">'._("with (optional) token:").'</label>';
417 echo ' <input id="hudson_trigger_token" name="hudson_trigger_token" type="text" size="32" />';
421 echo ' <input type="submit" value="Add job" />';
424 echo "<script type=\"text/javascript\">Element.toggle('hudson_add_job', 'slide');</script>\n";
427 function _display_iframe($url = '') {
428 echo '<div id="hudson_iframe_div">';
429 htmlIframe($url, array('id' => 'hudson_iframe', 'class' => 'iframe_service'));
433 function _hide_iframe() {
434 echo "<script type=\"text/javascript\">Element.toggle('hudson_iframe_div', 'slide');</script>";