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 Codendi.
9 * Codendi 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 * Codendi 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 Codendi. 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>';
48 function _getTitle() {
49 // return _("Continuous Integration");
52 function _getHelp($section = '', $questionmark = false) {
53 if (trim($section) !== '' && $section{0} !== '#') {
54 $section = '#'.$section;
59 $help_label = _("Help");
61 return '<b><a href="javascript:help_window(\''.get_server_url().'help/guide/ContinuousIntegrationIntroduction.html'.$section.'\');">'.$help_label.'</a></b>';
68 function projectOverview() {
69 $request =& HTTPRequest::instance();
70 $group_id = $request->get('group_id');
71 $user = UserManager::instance()->getCurrentUser();
73 $this->_display_jobs_table($group_id);
74 if ($user->isMember($request->get('group_id'), 'A')) {
75 $this->_display_add_job_form($group_id);
77 $this->_display_iframe();
78 $this->_hide_iframe();
81 function job_details() {
82 $myfile=fopen('/tmp/jobdetails','a');
83 fwrite($myfile,"\n J'ai fait job detail");
84 $request =& HTTPRequest::instance();
85 $group_id = $request->get('group_id');
86 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
87 if ($request->exist('job_id')) {
88 $job_id = $request->get('job_id');
89 $dar = $job_dao->searchByJobID($job_id);
90 } elseif ($request->exist('job')) {
91 // used for references (job #MyJob or job #myproject:MyJob)
92 $job_name = $request->get('job');
93 $dar = $job_dao->searchByJobName($job_name, $group_id);
96 $row = $dar->current();
97 /*fwrite($myfile,"appel de Cross REf Factory avec :".$row['name']);
98 $crossref_fact= new CrossReferenceFactory($row['name'], 'hudson_job', $group_id);
99 $crossref_fact->fetchDatas();
100 if ($crossref_fact->getNbReferences() > 0) {
101 echo '<b> '._('References').'</b>';
102 $crossref_fact->DisplayCrossRefs();
104 $this->_display_iframe($row['job_url']);
105 fwrite($myfile,"display iframe de ".$row['job_url']);
107 echo '<span class="error">'._("Error: Hudson object not found.").'</span>';
111 function last_build() {
112 $request =& HTTPRequest::instance();
113 $group_id = $request->get('group_id');
114 $job_id = $request->get('job_id');
116 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
117 $dar = $job_dao->searchByJobID($job_id);
119 $row = $dar->current();
120 $this->_display_iframe($row['job_url'].'/lastBuild/');
122 echo '<span class="error">'._("Error: Hudson object not found.").'</span>';
126 function build_number() {
127 $request =& HTTPRequest::instance();
128 $group_id = $request->get('group_id');
129 if ($request->exist('build')) {
130 $build_id = $request->get('build');
132 $build_id = $request->get('build_id');
134 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
135 if ($request->exist('job_id')) {
136 $job_id = $request->get('job_id');
137 $dar = $job_dao->searchByJobID($job_id);
138 } elseif ($request->exist('job')) {
139 // used for references (build #MyJob/175 or job #myproject:MyJob/175 where 175 is the build number required)
140 $job_name = $request->get('job');
141 $dar = $job_dao->searchByJobName($job_name, $group_id);
143 // used for references (build #175 where 175 is the build number required)
144 // 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.
145 $dar = $job_dao->searchByGroupID($group_id);
146 if ($dar->rowCount() != 1) {
151 if ($dar && $dar->valid()) {
152 $row = $dar->current();
153 // $crossref_fact= new CrossReferenceFactory($row['name'].'/'.$build_id, 'hudson_build', $group_id);
154 // $crossref_fact->fetchDatas();
155 // if ($crossref_fact->getNbReferences() > 0) {
156 // echo '<b> '._('References').'</b>';
157 // $crossref_fact->DisplayCrossRefs();
159 $this->_display_iframe($row['job_url'].'/'.$build_id.'/');
161 echo '<span class="error">'._("Error: Hudson object not found.").'</span>';
165 function last_test_result() {
166 $request =& HTTPRequest::instance();
167 $group_id = $request->get('group_id');
168 $job_id = $request->get('job_id');
169 $user = UserManager::instance()->getCurrentUser();
171 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
172 $dar = $job_dao->searchByJobID($job_id);
174 $row = $dar->current();
175 $this->_display_iframe($row['job_url'].'/lastBuild/testReport/');
177 echo '<span class="error">'._("Error: Hudson object not found.").'</span>';
181 function test_trend() {
182 $request =& HTTPRequest::instance();
183 $group_id = $request->get('group_id');
184 $job_id = $request->get('job_id');
185 $user = UserManager::instance()->getCurrentUser();
187 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
188 $dar = $job_dao->searchByJobID($job_id);
190 $row = $dar->current();
191 $this->_display_iframe($row['job_url'].'/test/?width=800&height=600&failureOnly=false');
193 echo '<span class="error">'._("Error: Hudson object not found.").'</span>';
198 $request =& HTTPRequest::instance();
199 $group_id = $request->get('group_id');
200 $job_id = $request->get('job_id');
201 $user = UserManager::instance()->getCurrentUser();
202 if ($user->isMember($group_id, 'A')) {
204 $project_manager = ProjectManager::instance();
205 $project = $project_manager->getProject($group_id);
207 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
208 $dar = $job_dao->searchByJobID($job_id);
210 $row = $dar->current();
212 echo '<a href="/plugins/hudson/?group_id='.$group_id.'">'._("Back to jobs list").'</a>';
214 echo '<h3>'._("Edit job").'</h3>';
215 echo ' <form method="post">';
217 echo ' <label for="new_hudson_job_url">'._("Job URL:").'</label>';
218 echo ' <input id="new_hudson_job_url" name="new_hudson_job_url" type="text" value="'.$row['job_url'].'" size="64" />';
221 echo ' <span class="legend">'._("eg: http://myCIserver/hudson/job/myJob").'</span>';
224 echo ' <label for="new_hudson_job_name">'._("Job name:").'</label>';
225 echo ' <input id="new_hudson_job_name" name="new_hudson_job_name" type="text" value="'.$row['name'].'" size="32" />';
228 echo ' <span class="legend">'.vsprintf(_("Name (with no space) used to make a reference to this job. Eg: job #%s"), array($row['name'])).'</span>';
230 if ($project->usesService('svn')) {
232 echo ' <label for="new_hudson_use_svn_trigger">'._("Trigger a build after SVN commits:").'</label>';
233 if ($row['use_svn_trigger'] == 1) {
234 $checked = ' checked="checked" ';
238 echo ' <input id="new_hudson_use_svn_trigger" name="new_hudson_use_svn_trigger" type="checkbox" '.$checked.' />';
241 if ($project->usesService('cvs')) {
243 echo ' <label for="new_hudson_use_cvs_trigger">'._("Trigger a build after CVS commits:").'</label>';
244 if ($row['use_cvs_trigger'] == 1) {
245 $checked = ' checked="checked" ';
249 echo ' <input id="new_hudson_use_cvs_trigger" name="new_hudson_use_cvs_trigger" type="checkbox" '.$checked.' />';
252 if ($project->usesService('svn') || $project->usesService('cvs')) {
254 echo ' <label for="new_hudson_trigger_token">'._("with (optional) token:").'</label>';
255 echo ' <input id="new_hudson_trigger_token" name="new_hudson_trigger_token" type="text" value="'.$row['token'].'" size="32" />';
259 echo ' <input type="hidden" name="group_id" value="'.$group_id.'" />';
260 echo ' <input type="hidden" name="job_id" value="'.$job_id.'" />';
261 echo ' <input type="hidden" name="action" value="update_job" />';
262 echo ' <input type="submit" value="'._("Update job").'" />';
275 function _display_jobs_table($group_id) {
276 $request =& HTTPRequest::instance();
277 $group_id = $request->get('group_id');
278 $user = UserManager::instance()->getCurrentUser();
279 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
280 $dar = $job_dao->searchByGroupID($group_id);
282 if ($dar && $dar->valid()) {
284 $project_manager = ProjectManager::instance();
285 $project = $project_manager->getProject($group_id);
287 echo '<table id="jobs_table">';
288 echo ' <tr class="boxtable">';
289 echo ' <th class="boxtitle"> </th>';
290 echo ' <th class="boxtitle">'._("Job").'</th>';
291 echo ' <th class="boxtitle">'._("Last Success").'</th>';
292 echo ' <th class="boxtitle">'._("Last Failure").'</th>';
293 echo ' <th class="boxtitle">'._("RSS").'</th>';
294 if ($project->usesService('svn')) {
295 echo ' <th class="boxtitle">'._("SVN trigger").'</th>';
297 if ($project->usesService('cvs')) {
298 echo ' <th class="boxtitle">'._("CVS trigger").'</th>';
300 if ($user->isMember($request->get('group_id'), 'A')) {
301 echo ' <th class="boxtitle">'._("Actions").'</th>';
306 while ($dar->valid()) {
307 $row = $dar->current();
309 $class="boxitemalt bgcolor-white";
311 $class="boxitem bgcolor-grey";
313 echo ' <tr class="'. $class .'">';
316 $job = new HudsonJob($row['job_url']);
318 echo ' <td><img src="'.$job->getStatusIcon().'" alt="'.$job->getStatus().'" title="'.$job->getStatus().'" /></td>';
319 // function toggle_iframe is in script plugins/hudson/www/hudson_tab.js
320 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>';
321 if ($job->getLastSuccessfulBuildNumber() != '') {
322 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>';
324 echo ' <td> </td>';
326 if ($job->getLastFailedBuildNumber() != '') {
327 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>';
329 echo ' <td> </td>';
331 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";
333 if ($project->usesService('svn')) {
334 if ($row['use_svn_trigger'] == 1) {
335 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>';
337 echo ' <td> </td>';
340 if ($project->usesService('cvs')) {
341 if ($row['use_cvs_trigger'] == 1) {
342 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>';
344 echo ' <td> </td>';
348 } catch (Exception $e) {
349 echo ' <td><img src="'.$this->getControler()->getIconsPath().'link_error.png" alt="'.$e->getMessage().'" title="'.$e->getMessage().'" /></td>';
351 if ($project->usesService('svn')) { $nb_columns++; }
352 if ($project->usesService('cvs')) { $nb_columns++; }
353 echo ' <td colspan="'.$nb_columns.'"><span class="error">'.$e->getMessage().'</span></td>';
356 if ($user->isMember($request->get('group_id'), 'A')) {
359 echo ' <span class="job_action">';
360 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").'" />';
364 echo ' <span class="job_action">';
365 echo ' <a href="?action=delete_job&group_id='.$group_id.'&job_id='.$row['job_id'].'" onclick="return confirm(';
366 echo "'" . vsprintf(_("Are you sure you want to delete Job %s from project %s?"), array($row['name'], $project->getUnixName())) . "'";
367 echo ');"><img src="'.$this->getControler()->getIconsPath().'cross.png" alt="'._("Delete this job").'" title="'._("Delete this job").'" />';
380 echo '<p>'._("No Hudson jobs associated with this project. To add a job, select the link just below.").'</p>';
384 function _display_add_job_form($group_id) {
385 $project_manager = ProjectManager::instance();
386 $project = $project_manager->getProject($group_id);
388 // function toggle_addurlform is in script plugins/hudson/www/hudson_tab.js
389 echo '<a href="#" onclick="toggle_addurlform(); return false;">' . getIcon("ic/add.png") . ' '._("Add job").'</a>';
390 echo ' '.$this->_getHelp('HudsonService', true);
391 echo '<div id="hudson_add_job">';
392 echo ' <form action="">'."\n";
393 echo ' <label for="hudson_job_url">'._("Job URL:").'</label>'."\n";
394 echo ' <input id="hudson_job_url" name="hudson_job_url" type="text" size="64" />'."\n";
395 echo ' <input type="hidden" name="group_id" value="'.$group_id.'" />'."\n";
396 echo ' <input type="hidden" name="action" value="add_job" />'."\n";
398 echo ' <span class="legend">'._("eg: http://myCIserver/hudson/job/myJob").'</span>'."\n";
401 if ($project->usesService('svn')) {
402 echo _("Trigger a build after commits:");
403 if ($project->usesService('svn')) {
404 echo ' <label for="hudson_use_svn_trigger">'._("SVN").'</label>';
405 echo ' <input id="hudson_use_svn_trigger" name="hudson_use_svn_trigger" type="checkbox" />';
407 if ($project->usesService('cvs')) {
408 echo ' <label for="hudson_use_cvs_trigger">'._("CVS").'</label>';
409 echo ' <input id="hudson_use_cvs_trigger" name="hudson_use_cvs_trigger" type="checkbox" />';
413 echo ' <label for="hudson_trigger_token">'._("with (optional) token:").'</label>';
414 echo ' <input id="hudson_trigger_token" name="hudson_trigger_token" type="text" size="32" />';
418 echo ' <input type="submit" value="Add job" />';
421 echo "<script type=\"text/javascript\">Element.toggle('hudson_add_job', 'slide');</script>\n";
424 function _display_iframe($url = '') {
425 echo '<div id="hudson_iframe_div">';
426 htmlIframe($url, array('id' => 'hudson_iframe', 'class' => 'iframe_service'));
429 function _hide_iframe() {
430 echo "<script type=\"text/javascript\">Element.toggle('hudson_iframe_div', 'slide');</script>";