summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukas Fleischer <archlinux@cryptocrack.de>2014-04-17 19:49:26 +0200
committerLukas Fleischer <archlinux@cryptocrack.de>2014-04-17 21:09:16 +0200
commit73936002f7d5685a9063683f68d4e8c2e01be0ac (patch)
treec1f152f76be0399222a47cab2060998e41ce5688
parent32b5d466439b5c291472c68f6a732c5be4ca60cf (diff)
downloadaur-73936002f7d5685a9063683f68d4e8c2e01be0ac.tar.gz
aur-73936002f7d5685a9063683f68d4e8c2e01be0ac.tar.xz
Store {make,check,opt}depends in the database
In addition to parsing and storing dependencies of packages, store makedepends, checkdepends and optdepends. Every dependency (of any type) is displayed on the package details page. Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
-rw-r--r--UPGRADING23
-rw-r--r--schema/aur-schema.sql17
-rwxr-xr-xschema/gendummydata.py9
-rw-r--r--web/html/pkgsubmit.php36
-rw-r--r--web/lib/pkgfuncs.inc.php29
5 files changed, 90 insertions, 24 deletions
diff --git a/UPGRADING b/UPGRADING
index a33ea635..48737f26 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -142,6 +142,29 @@ CREATE UNIQUE INDEX VoteUsersIDPackageID ON PackageVotes (UsersID, PackageBaseID
CREATE UNIQUE INDEX NotifyUserIDPkgID ON CommentNotify (UserID, PackageBaseID);
----
+12. Create a new table to store package dependency types:
+
+----
+CREATE TABLE DependencyTypes (
+ ID TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
+ Name VARCHAR(32) NOT NULL DEFAULT '',
+ PRIMARY KEY (ID)
+) ENGINE = InnoDB;
+INSERT INTO DependencyTypes VALUES (1, 'depends');
+INSERT INTO DependencyTypes VALUES (2, 'makedepends');
+INSERT INTO DependencyTypes VALUES (3, 'checkdepends');
+INSERT INTO DependencyTypes VALUES (4, 'optdepends');
+----
+
+13. Add a field to store the dependency type to the PackageDepends table:
+
+----
+ALTER TABLE PackageDepends ADD COLUMN DepTypeID TINYINT UNSIGNED NOT NULL;
+UPDATE PackageDepends SET DepTypeID = 1;
+ALTER TABLE PackageDepends
+ ADD FOREIGN KEY (DepTypeID) REFERENCES DependencyTypes(ID) ON DELETE NO ACTION;
+----
+
From 2.2.0 to 2.3.0
-------------------
diff --git a/schema/aur-schema.sql b/schema/aur-schema.sql
index 9426a61d..327a7921 100644
--- a/schema/aur-schema.sql
+++ b/schema/aur-schema.sql
@@ -133,15 +133,30 @@ CREATE TABLE Packages (
) ENGINE = InnoDB;
+-- Define the package dependency types
+--
+CREATE TABLE DependencyTypes (
+ ID TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
+ Name VARCHAR(32) NOT NULL DEFAULT '',
+ PRIMARY KEY (ID)
+) ENGINE = InnoDB;
+INSERT INTO DependencyTypes VALUES (1, 'depends');
+INSERT INTO DependencyTypes VALUES (2, 'makedepends');
+INSERT INTO DependencyTypes VALUES (3, 'checkdepends');
+INSERT INTO DependencyTypes VALUES (4, 'optdepends');
+
+
-- Track which dependencies a package has
--
CREATE TABLE PackageDepends (
PackageID INTEGER UNSIGNED NOT NULL,
+ DepTypeID TINYINT UNSIGNED NOT NULL,
DepName VARCHAR(64) NOT NULL,
DepCondition VARCHAR(20),
INDEX (PackageID),
INDEX (DepName),
- FOREIGN KEY (PackageID) REFERENCES Packages(ID) ON DELETE CASCADE
+ FOREIGN KEY (PackageID) REFERENCES Packages(ID) ON DELETE CASCADE,
+ FOREIGN KEY (DepTypeID) REFERENCES DependencyTypes(ID) ON DELETE NO ACTION
) ENGINE = InnoDB;
diff --git a/schema/gendummydata.py b/schema/gendummydata.py
index bc0ede8a..18852a22 100755
--- a/schema/gendummydata.py
+++ b/schema/gendummydata.py
@@ -28,7 +28,7 @@ MAX_USERS = 300 # how many users to 'register'
MAX_DEVS = .1 # what percentage of MAX_USERS are Developers
MAX_TUS = .2 # what percentage of MAX_USERS are Trusted Users
MAX_PKGS = 900 # how many packages to load
-PKG_DEPS = (1, 5) # min/max depends a package has
+PKG_DEPS = (1, 15) # min/max depends a package has
PKG_SRC = (1, 3) # min/max sources a package has
PKG_CMNTS = (1, 5) # min/max number of comments a package has
CATEGORIES_COUNT = 17 # the number of categories from aur-schema
@@ -258,8 +258,11 @@ for p in list(seen_pkgs.keys()):
while i != num_deps:
dep = random.choice([k for k in seen_pkgs])
if dep not in this_deps:
- s = "INSERT INTO PackageDepends VALUES (%d, '%s', NULL);\n"
- s = s % (seen_pkgs[p], dep)
+ deptype = random.randrange(1, 5)
+ if deptype == 4:
+ dep += ": for " + random.choice([k for k in seen_pkgs])
+ s = "INSERT INTO PackageDepends VALUES (%d, %d, '%s', NULL);\n"
+ s = s % (seen_pkgs[p], deptype, dep)
out.write(s)
i += 1
diff --git a/web/html/pkgsubmit.php b/web/html/pkgsubmit.php
index 7db81a5c..045b8f93 100644
--- a/web/html/pkgsubmit.php
+++ b/web/html/pkgsubmit.php
@@ -150,7 +150,13 @@ if ($uid):
$pkginfo[] = array_merge($pkgbase_info, $section_info);
}
}
- $section_info = array('depends' => array(), 'source' => array());
+ $section_info = array(
+ 'depends' => array(),
+ 'makedepends' => array(),
+ 'checkdepends' => array(),
+ 'optdepends' => array(),
+ 'source' => array()
+ );
/* Fall-through case. */
case 'epoch':
case 'pkgdesc':
@@ -162,6 +168,9 @@ if ($uid):
break;
case 'source':
case 'depends':
+ case 'makedepends':
+ case 'checkdepends':
+ case 'optdepends':
$section_info[$key][] = $value;
break;
}
@@ -181,15 +190,12 @@ if ($uid):
if (!isset($pkgbase_info['pkgbase'])) {
$pkgbase_info['pkgbase'] = $pkgbase_info['pkgname'];
}
- if (empty($pkgbase_info['depends'])) {
- $pkgbase_info['depends'] = array();
- } else {
- $pkgbase_info['depends'] = explode(" ", $pkgbase_info['depends']);
- }
- if (empty($pkgbase_info['source'])) {
- $pkgbase_info['source'] = array();
- } else {
- $pkgbase_info['source'] = explode(" ", $pkgbase_info['source']);
+ foreach (array('source', 'depends', 'makedepends', 'checkdepends', 'optdepends') as $array_opt) {
+ if (empty($pkgbase_info[$array_opt])) {
+ $pkgbase_info[$array_opt] = array();
+ } else {
+ $pkgbase_info[$array_opt] = explode(" ", $pkgbase_info[$array_opt]);
+ }
}
$pkginfo[] = $pkgbase_info;
}
@@ -345,10 +351,12 @@ if ($uid):
foreach ($pkginfo as $pi) {
$pkgid = pkg_create($base_id, $pi['pkgname'], $pi['license'], $pi['full-version'], $pi['pkgdesc'], $pi['url']);
- foreach ($pi['depends'] as $dep) {
- $deppkgname = preg_replace("/(<|=|>).*/", "", $dep);
- $depcondition = str_replace($deppkgname, "", $dep);
- pkg_add_dep($pkgid, $deppkgname, $depcondition);
+ foreach (array('depends', 'makedepends', 'checkdepends', 'optdepends') as $deptype) {
+ foreach ($pi[$deptype] as $dep) {
+ $deppkgname = preg_replace("/(<|=|>).*/", "", $dep);
+ $depcondition = str_replace($deppkgname, "", $dep);
+ pkg_add_dep($pkgid, $deptype, $deppkgname, $depcondition);
+ }
}
foreach ($pi['source'] as $src) {
diff --git a/web/lib/pkgfuncs.inc.php b/web/lib/pkgfuncs.inc.php
index c6b4a27f..153e2a83 100644
--- a/web/lib/pkgfuncs.inc.php
+++ b/web/lib/pkgfuncs.inc.php
@@ -132,6 +132,21 @@ function pkg_dependencies($pkgid) {
}
/**
+ * Get the ID of a dependency type given its name
+ *
+ * @param string $name The name of the dependency type
+ *
+ * @return int The ID of the dependency type
+ */
+function pkg_dependency_type_id_from_name($name) {
+ $dbh = DB::connect();
+ $q = "SELECT ID FROM DependencyTypes WHERE Name = ";
+ $q.= $dbh->quote($name);
+ $result = $dbh->query($q);
+ return $result->fetch(PDO::FETCH_COLUMN, 0);
+}
+
+/**
* Determine packages that depend on a package
*
* @param string $name The package name for the dependency search
@@ -653,18 +668,20 @@ function pkg_create($base_id, $pkgname, $license, $pkgver, $pkgdesc, $pkgurl) {
* Add a dependency for a specific package to the database
*
* @param int $pkgid The package ID to add the dependency for
+ * @param string $type The type of dependency to add
* @param string $depname The name of the dependency to add
* @param string $depcondition The type of dependency for the package
*
* @return void
*/
-function pkg_add_dep($pkgid, $depname, $depcondition) {
+function pkg_add_dep($pkgid, $type, $depname, $depcondition) {
$dbh = DB::connect();
- $q = sprintf("INSERT INTO PackageDepends (PackageID, DepName, DepCondition) VALUES (%d, %s, %s)",
- $pkgid,
- $dbh->quote($depname),
- $dbh->quote($depcondition));
-
+ $q = sprintf("INSERT INTO PackageDepends (PackageID, DepTypeID, DepName, DepCondition) VALUES (%d, %d, %s, %s)",
+ $pkgid,
+ pkg_dependency_type_id_from_name($type),
+ $dbh->quote($depname),
+ $dbh->quote($depcondition)
+ );
$dbh->exec($q);
}