summaryrefslogtreecommitdiff
blob: b2b970f26c6a3514f6979ff204be8cec8256a311 (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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<?php
class sql_gentoo_profile extends sql_row_obj {
	protected $table='gentoo_profiles', $primary_key=array('id'), $columns=array(
		'id' => array (
			'type' => 'TINYINT',
			'length' => 3,
			'unsigned' => true,
			'not_null' => true,
			'auto_increment' => true
		),
		'pkgdir' => array (
			'type' => 'VARCHAR',
			'length' => 255,
			'not_null' => true,
			'default' => '',
			'unique' => true
		),
		'name' => array (
			'type' => 'VARCHAR',
			'length' => 255,
			'unique' => true
		),
		'order' => array (
			'type' => 'TINYINT',
			'length' => 4
		),
		'flags' => array (
			'type' => 'VARCHAR',
			'length' => 255,
			'not_null' => true,
			'default' => ''
		),
		'headers' => array (
			'type' => 'TEXT',
			'not_null' => true
		)

	);
	private $headers_cache;
	// Returns $this->headers as an array
	public function &get_headers() {
		if (isset($headers_cache)) return $headers_cache;
		foreach (explode("\n", $this->headers) as $line) {
			if (!$line) continue;
			list($name, $val)=explode(': ', $line, 2);
			$this->headers_cache[strtolower($name)]=$val;
		}
		return $this->headers_cache;
	}
	// Reads the data from the Packages file in $this->pkgdir
	public function read_Packages($update_pkgs=false, $verbose=false) {
		global $conf;
		if (!is_readable($file="{$conf['pkgdir_root']}/$this->pkgdir/Packages")) {
			throw_exception("Packages file doesn't exist for pkgdir $this->pkgdir");
		}
		$file=fopen($file, 'r');
		$this->headers='';
		while (!feof($file)) {
			$line=rtrim(fgets($file));
			if (strlen($line) == 0) {
				break;
			} else {
				list($name, $val)=array_merge(explode(': ', $line, 2), array(null));
				if ($val !== null) {
					$this->headers.="$name: $val\n";
				}
			}
		}
		$p=array();
		$cur=null;
		$this->write();
		while (!feof($file)) {
			$line=rtrim(fgets($file));
			if (strlen($line) == 0) {
				unset($cur);
				continue;
			}
			list($name, $val)=array_merge(explode(': ', $line, 2), array(null));
			if ($name == 'CPV') {
				if (preg_match('#^([^/-]+)([^/]*)/(.+?)-([^-]+)((?:-r[0-9]+)?)$#', $val, $match)) {
					list(, $bcat, $lcat, $name, $ver, $r)=$match;
					$ver.=$r;
				} else {
					debug("Unsplittable atom: $val");
					continue;
				}
				if (isset($p[$bcat][$lcat][$name][$ver])) {
					debug("Duplicate package $bcat$lcat/$name-$ver");
					continue;
				}
				$p[$bcat][$lcat][$name][$ver]='';
				$cur=&$p[$bcat][$lcat][$name][$ver];
			} elseif (isset($cur, $val)) {
				$cur.="$name: $val\n";
			}
		}
		unset($cur);
		$u=$d=$t=0;
		if ($update_pkgs) {
			global $S;
			$r=$S['pdo']->query('SELECT * FROM `gentoo_packages` WHERE `profile`='.$this->id);
			while ($pkg=$r->fetch(PDO::FETCH_ASSOC)) {
				$pkg=new sql_gentoo_package($pkg);
				if (isset($p[$pkg->bcat][$pkg->lcat][$pkg->name][$pkg->version])) {
					$t++;
					if ($pkg->data != $p[$pkg->bcat][$pkg->lcat][$pkg->name][$pkg->version]) {
						$u++;
						$pkg->data=$p[$pkg->bcat][$pkg->lcat][$pkg->name][$pkg->version];
						if ($verbose) echo "U $pkg->bcat$pkg->lcat/$pkg->name/$pkg->version\n";
						$pkg->write();
					}
					unset($p[$pkg->bcat][$pkg->lcat][$pkg->name][$pkg->version]);
				} else {
					$d++;
					if ($verbose) echo "D $pkg->bcat$pkg->lcat/$pkg->name-$pkg->version\n";
					$pkg->delete();
				}
			}
		}
		$n=0;
		foreach ($p as $bcat => $lcats) {
			foreach ($lcats as $lcat => $pkgs) {
				foreach ($pkgs as $pkg => $vers) {
					foreach ($vers as $ver => $data) {
						$t++;
						$n++;
						$gp=new sql_gentoo_package(null, $this->id, $bcat, $lcat, $pkg, $ver, $data);
						if ($verbose) echo "A $bcat$lcat/$pkg-$ver\n";
						$gp->write();
					}
				}
			}
		}
		return array($n, $u, $d, $t);
	}
	public function &get_packages() {
		global $S;
		$r=$S['pdo']->query('SELECT * FROM `gentoo_packages` WHERE `profile`='.$this->id);
		$p=array();
		while ($pkg=$r->fetch(PDO::FETCH_ASSOC)) {
			$pkg=new sql_gentoo_package($pkg);
			$p[$pkg->bcat][$pkg->lcat][$pkg->name][$pkg->version]=$pkg->to_array();
		}
		return $p;
	}
}
?>