summaryrefslogtreecommitdiff
path: root/buildmaster/build-list-links.php
diff options
context:
space:
mode:
Diffstat (limited to 'buildmaster/build-list-links.php')
-rw-r--r--buildmaster/build-list-links.php231
1 files changed, 231 insertions, 0 deletions
diff --git a/buildmaster/build-list-links.php b/buildmaster/build-list-links.php
new file mode 100644
index 0000000..e3d2779
--- /dev/null
+++ b/buildmaster/build-list-links.php
@@ -0,0 +1,231 @@
+<?php
+require_once "../init.php";
+require_once BASE . "/lib/mysql.php";
+
+$edges = "";
+$knots = "";
+
+if (!isset($_GET["raw"]))
+ $limit = " LIMIT 150";
+
+$query =
+ "CREATE TEMPORARY TABLE `ba` (" .
+ "`id` BIGINT, " .
+ "`group` VARCHAR(256), " .
+ "`color` VARCHAR(7), " .
+ "UNIQUE KEY `id` (`id`), " .
+ "KEY `group` (`group`)" .
+ ")";
+if (isset($_GET["raw"]))
+ print $query . ";\n";
+mysql_run_query($query);
+
+$query =
+ "INSERT IGNORE INTO `ba` (`id`,`color`)" .
+ " SELECT DISTINCT" .
+ " `build_assignments`.`id`," .
+ "IF(`build_assignments`.`is_broken`,\"#ff0000\",IF(`build_assignments`.`is_blocked` IS NULL,\"#000000\",\"#800000\"))" .
+ " FROM `binary_packages_in_repositories`" .
+ mysql_join_binary_packages_in_repositories_binary_packages() .
+ mysql_join_binary_packages_in_repositories_repositories() .
+ mysql_join_binary_packages_build_assignments() .
+ " WHERE `repositories`.`name`=\"build-list\"" .
+ $limit;
+if (isset($_GET["raw"]))
+ print $query . ";\n";
+mysql_run_query($query);
+
+$query =
+ "CREATE TEMPORARY TABLE `ba_copy` (" .
+ "`id` BIGINT, " .
+ "`group` VARCHAR(256), " .
+ "`color` VARCHAR(7), " .
+ "UNIQUE KEY `id` (`id`)" .
+ ")";
+if (isset($_GET["raw"]))
+ print $query . ";\n";
+mysql_run_query($query);
+
+$query =
+ "INSERT IGNORE INTO `ba_copy` (`id`,`color`)" .
+ " SELECT `ba`.`id`,`ba`.`color`" .
+ " FROM `ba`";
+if (isset($_GET["raw"]))
+ print $query . ";\n";
+mysql_run_query($query);
+
+$query =
+ "CREATE TEMPORARY TABLE `ba_links` (" .
+ "`from` BIGINT, " .
+ "`to` BIGINT, " .
+ "`type` MEDIUMINT, " .
+ "UNIQUE KEY `content` (`from`,`to`,`type`)" .
+ ")";
+if (isset($_GET["raw"]))
+ print $query . ";\n";
+mysql_run_query($query);
+
+$query =
+ "INSERT IGNORE INTO `ba_links` (`from`,`to`,`type`)" .
+ "SELECT `i_bp`.`build_assignment`," .
+ "`d_bp`.`build_assignment`," .
+ "`dependencies`.`dependency_type`" .
+ " FROM `ba`" .
+ mysql_join_build_assignments_binary_packages('ba','d_bp') .
+ mysql_join_binary_packages_dependencies('d_bp') .
+ mysql_join_dependencies_install_target_providers() .
+ mysql_join_install_target_providers_binary_packages('','i_bp') .
+ " JOIN `ba_copy` ON `i_bp`.`build_assignment`=`ba_copy`.`id`" .
+ " WHERE `d_bp`.`build_assignment`!=`i_bp`.`build_assignment`";
+if (isset($_GET["raw"]))
+ print $query . ";\n";
+mysql_run_query($query);
+
+$query =
+ "CREATE TEMPORARY TABLE `ba_links_copy` (" .
+ "`from` BIGINT, " .
+ "`to` BIGINT, " .
+ "`type` MEDIUMINT, " .
+ "UNIQUE KEY `content` (`from`,`to`,`type`)" .
+ ")";
+if (isset($_GET["raw"]))
+ print $query . ";\n";
+mysql_run_query($query);
+
+$query =
+ "INSERT IGNORE INTO `ba_links_copy` (`from`,`to`,`type`)" .
+ " SELECT `ba_links`.`from`,`ba_links`.`to`,`ba_links`.`type` FROM `ba_links`";
+if (isset($_GET["raw"]))
+ print $query . ";\n";
+mysql_run_query($query);
+
+$query =
+ "UPDATE `ba`" .
+ " JOIN (" .
+ "SELECT" .
+ " `ba_copy`.`id`," .
+ "SHA2(" .
+ "GROUP_CONCAT(CONCAT(" .
+ "IFNULL(`ba_copy`.`color`,\"0\"),\":\"," .
+ "IFNULL(`ba_links`.`to`,\"0\"),\":\"," .
+ "IFNULL(`ba_links`.`type`,\"0\"),\":\"," .
+ "IFNULL(`ba_links_copy`.`from`,\"0\"),\":\"," .
+ "IFNULL(`ba_links_copy`.`type`,\"0\")" .
+ "))" .
+ ",256) AS `hash`" .
+ " FROM `ba_copy`" .
+ " LEFT JOIN `ba_links` ON `ba_links`.`from`=`ba_copy`.`id`" .
+ " LEFT JOIN `ba_links_copy` ON `ba_links_copy`.`to`=`ba_copy`.`id`" .
+ " GROUP BY `ba_copy`.`id`" .
+ ") AS `grouped_ba` ON `grouped_ba`.`id`=`ba`.`id`" .
+ " SET `ba`.`group`=`grouped_ba`.`hash`";
+if (isset($_GET["raw"]))
+ print $query . ";\n";
+mysql_run_query($query);
+
+$query =
+ "UPDATE `ba_copy`" .
+ " JOIN `ba` ON `ba`.`id`=`ba_copy`.`id`" .
+ " SET `ba_copy`.`group`=`ba`.`group`";
+if (isset($_GET["raw"]))
+ print $query . ";\n";
+mysql_run_query($query);
+
+$query =
+ "SELECT MAX(`build_assignments`.`id`) AS `id`," .
+ "GROUP_CONCAT(CONCAT(" .
+ "`architectures`.`name`,\"/\"," .
+ "`package_sources`.`pkgbase`" .
+ ") SEPARATOR \",\n\") AS `name`," .
+ " `ba`.`color`" .
+ " FROM `ba`" .
+ " JOIN `build_assignments` ON `ba`.`id`=`build_assignments`.`id`" .
+ mysql_join_build_assignments_package_sources() .
+ mysql_join_build_assignments_architectures() .
+ " GROUP BY `ba`.`group`";
+if (isset($_GET["raw"]))
+ print $query . ";\n";
+$result = mysql_run_query($query);
+
+while ($row = $result->fetch_assoc())
+ $knots .=
+ "\"ba" .
+ $row["id"] .
+ "\" [label = \"" .
+ $row["name"] .
+ "\",
+ fontcolor = \"" .
+ $row["color"] .
+ "\"];\n";
+
+$query =
+ "SELECT MAX(`ba_links`.`to`) AS `dependent`," .
+ "`dependency_types`.`name` AS `dep_type`," .
+ "MAX(`ba_links`.`from`) AS `depending_on`" .
+ " FROM `ba_links`" .
+ " JOIN `dependency_types` ON `ba_links`.`type`=`dependency_types`.`id`" .
+ " JOIN `ba` ON `ba_links`.`from`=`ba`.`id`" .
+ " JOIN `ba_copy` ON `ba_links`.`to`=`ba_copy`.`id`" .
+ " GROUP BY CONCAT(`ba`.`group`,\"-\",`ba_copy`.`group`)";
+if (isset($_GET["raw"]))
+ print $query . ";\n";
+$result = mysql_run_query($query);
+
+while ($row = $result->fetch_assoc()) {
+ $edges .=
+ "\"ba" .
+ $row["depending_on"] .
+ "\" -> \"ba" .
+ $row["dependent"] .
+ "\" [color = \"";
+ switch ($row["dep_type"]) {
+ case "run":
+ $edges .= "#000000";
+ break;
+ case "make":
+ $edges .= "#0000ff";
+ break;
+ case "link":
+ $edges .= "#008000";
+ break;
+ case "check":
+ $edges .= "#000080";
+ break;
+ default:
+ $edges .= "#ff00ff";
+ }
+ $edges .=
+ "#000080";
+ $edges .=
+ "\"];\n";
+}
+
+if (isset($_GET["raw"])) {
+ print
+ "digraph dependencies {\n" .
+ "rankdir=LR;\n" .
+ "fontname=dejavu;\n" .
+ $knots .
+ $edges .
+ "}\n";
+} else {
+ $input_file = tempnam("/tmp", "build-list-links.");
+
+ $handle = fopen($input_file,"w");
+ fwrite($handle,
+ "digraph dependencies {\n" .
+ "rankdir=LR;\n" .
+ "fontname=dejavu;\n" .
+ $knots .
+ $edges .
+ "}\n"
+ );
+ fclose($handle);
+
+ header ("Content-type: image/png");
+ passthru(
+ "timeout 30 dot -Tpng -o/dev/stdout " . $input_file
+ );
+
+ unlink($input_file);
+}