summaryrefslogtreecommitdiff
blob: d14deb0d83461fa5c1ae97c57f2a623836fa8d2a (plain)
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
<?php
class sql_build extends conf_build_common {
	protected $table='builds', $primary_key=array('id'), $columns=array(
		'id' => array (
			'type' => 'CHAR',
			'length' => 6,
			'not_null' => true,
			'default' => ''
		),
		'owner' => array (
			'type' => 'INT',
			'length' => 10,
			'unsigned' => true,
			'not_null' => true,
			'default' => 0,
			'refers_to' => 'users.id'
		),
		'name' => array (
			'type' => 'VARCHAR',
			'length' => 255
		),
		'module' => array (
			'type' => 'VARCHAR',
			'length' => 255,
			'not_null' => true,
			'default' => ''
		),
		'status' => array (
			'type' => 'TINYINT',
			'length' => 4,
			'not_null' => true
		),
		'ctime' => array (
			'type' => 'INT',
			'length' => 10,
			'unsigned' => true
		),
		'start' => array (
			'type' => 'INT',
			'length' => 10,
			'unsigned' => true
		),
		'finish' => array (
			'type' => 'INT',
			'length' => 10,
			'unsigned' => true
		)
	);
	// Returns HTML code describing this build's status (for human consumption)
	function display() {
		global $S;
		$format='D j M Y G:i:s T';
		$OoA=owner_or_admin($this->id);
		$html='<div class="build"><span class="name">'.(isset($this->name) && strlen($this->name)?htmlentities($this->name):'Unnamed Build').'</span> ';
		$links=array();
		if ($this->status == -128) {
			$total=$S['pdo']->query('SELECT COUNT(*) FROM `builds` WHERE `status`=-128')->fetch(PDO::FETCH_COLUMN);
			$num=$S['pdo']->query('SELECT COUNT(*) FROM `builds` WHERE `status`=-128 AND `ctime` <= '.$this->ctime)->fetch(PDO::FETCH_COLUMN);
			$html.="<span class=\"status queued\">[Queued ($num/$total)]</span>";
		} elseif ($this->status == -127) {
			$html.='<span class="status successful">[uploading]</span>';
			if ($OoA) $links['Build log']=url("logs/$this->id");
		} elseif ($this->status < 0) {
			// TODO Build stage X
			$html.='<span class="status building">[building]</span>';
			if ($OoA) {
				//$links['Watch']=url("logs/$this->id/live");
				$links['Build Log']=url("logs/$this->id");
			}
		} elseif ($this->status == 0) {
			$r=$S['pdo']->query('SELECT COUNT(*) as `count`, MAX(`time`) as `time` FROM `downloads` WHERE `build`="'.$this->id.'"')->fetch(PDO::FETCH_ASSOC);
			$d=($OoA && $r['count']?'<a href="'.url("download/$this->id/history").'">':'').$r['count'].' download'.($r['count'] != 1?'s':'').($r['count']?($OoA?'</a>':'').'<br/><span class="time">(last at '.date($format, $r['time']).')</span>':'');
			$html.='<span class="downloads">'.$d.'</span><span class="status successful">[successful]</span>';
			$links['Download image']=url("download/$this->id");
			if ($OoA) $links['Build log']=url("logs/$this->id");
		} elseif ($this->status == 127) {
			$html.='<span class="status failed">[upload failed]</span>';
			if ($OoA) $links['Build log']=url("logs/$this->id");
		} elseif ($this->status == 126) {
			$html.='<span class="status failed">[failed]</span>';
			if ($OoA) {
				//$links['View output of failed command']=url("logs/$this->id/failure");
				$links['Build log']=url("logs/$this->id");
			}
		} else {
			$html.='<span class="status failed">[failed: got signal '.$this->status.']</span>';
			if ($OoA) $links['Build log']=url('logs/'.$this->id);
		}
		if ($links) {
			foreach ($links as $label => $url) {
				$links[$label]='<a href="'.$url.'">'.htmlentities($label).'</a>';
			}
			$html.='<br/><span class="links">'.implode(' &bull; ', $links).'</span>';
		}
		if (isset($this->ctime)) {
			$html.='<div class="time">Submitted for build at: <span class="time">'.date($format, $this->ctime).'</span><br/>';
			if (isset($this->start)) {
				$html.='Build started at: <span class="time">'.date($format, $this->start).'</span><br/>';
				if (isset($this->finish)) {
					$html.='Build finished at: <span class="time">'.date($format, $this->finish).'</span><br/>Total build time: <span class="time">'.display_time($this->finish-$this->start).'</span>';
				} else {
					$html.='Running for: <span class="time">'.display_time(time()-$this->start).'</span>';
				}
			} else {
				$html.='Queued for: <span class="time">'.display_time(time()-$this->ctime).'</span>';
			}
			$html.='</div>';
		}
		$html.='</div>';
		return $html;
	}
	function queued_tasks() {
		global $S;
		static $cache;
		if (!isset($cache))
			$cache=$S['pdo']->query('SELECT COUNT(`order`) FROM `tasks` WHERE `start` IS NULL AND `build`="'.$this->id.'"')->fetch(PDO::FETCH_COLUMN);
		return $cache;
	}
}
?>