Subject: [bulk] Adequate modelling of the report generation
To: NetBSD Packages Technical Discussion List <>
From: Roland Illig <>
List: tech-pkg
Date: 12/05/2005 00:55:02
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit

Hi pkgsrc bulk builders,

I disagree with the names of the variables that determine where the bulk 
build reports are generated. Therefore I have written a patch that 
models the situation in a way that I would find convenient to 
communicate to the user in the pkgsrc guide. I cannot say this of the 
current state.

First, the names of the variables that are currently in use are 
completely unintuitive and misleading:

- I cannot explain where the "x" in FTPx comes from.

- The default value of FTPURL does not specify a URL. Neither is the 
variable used like a URL.

- The FTP variable has nothing to do with FTP, as it specifies a local path.

- FTPHOST does not specify a host name, but rather a URL scheme, 
together with a host name.

Also, the comments in the build.conf-example are not really helpful.

I see the situation as follows. On some publicly available server, there 
is a directory that keeps the build logs. The individual build logs are 
saved in subdirectories of this directory. On the build machine, there 
is a similar directory containing the actual reports in subdirectories. 
It is likely that the reports from the build machine are copied as-is to 
the publicly available server. So my suggestion is to define the 
REPORTS_DIR, the location where the reports are created on the build 
machine, and the REPORTS_URL, where the reports will be made available. 
Each report is then created in the REPORT_BASEDIR in those directories.

This model directly covers the current practice and is easy to explain, 
so I would like it to replace the current model, which I am not willing 
to document in the pkgsrc guide or somewhere else.

The second file in the patch gives an impression of how the post-build 
program may look like after the changes. Note how the careful choice of 
variable names makes the code more readable. (Just look at the last 
chunk. Assuming you did not know how the variables have been defined, 
you might assume that a URL is appended to a host name, which makes no 
sense at all.)

I have not yet tested the patch, as it is only intended to give an 
impression on the change. Of course I will test it before actually 
committing it.


Content-Type: text/plain;
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;

Index: build.conf-example
RCS file: /cvsroot/pkgsrc/mk/bulk/build.conf-example,v
retrieving revision 1.32
diff -u -p -r1.32 build.conf-example
--- build.conf-example	3 Dec 2005 01:00:37 -0000	1.32
+++ build.conf-example	4 Dec 2005 23:29:09 -0000
@@ -61,11 +61,17 @@ ADMIN=""
 # Who the report is signed by
 ADMINSIG="-Your Name"
-# Some paths for output files and paths to log files
-FTPx=`date +%Y%m%d.%H%M`
-FTPURL="pub/NetBSD/pkgstat/${FTPx}"		# relative to ~ftp !
-FTP="/home/ftp/${FTPURL}"			# absolute base path
-FTPHOST=""			# host for broken.html
+# The basename of the directory of the current bulk build.
+REPORT_BASEDIR=`date +%Y%m%d.%H%M`
+# The directory where the final reports are collected. The reports
+# themselves are saved in the subdirectory ${BUILD_ID}.
+# The URL where the final reports will be available. The reports
+# themselves are expected to be available in the subdirectory ${BUILD_ID}.
 # Uploading binary packages
Index: post-build
RCS file: /cvsroot/pkgsrc/mk/bulk/post-build,v
retrieving revision 1.62
diff -u -p -r1.62 post-build
--- post-build	3 Dec 2005 13:39:04 -0000	1.62
+++ post-build	4 Dec 2005 23:29:09 -0000
@@ -91,14 +91,20 @@ sub get_build_conf_vars(@) {
 	'ADMINSIG',		# "-Your Name"
-	'FTPURL',		# "pub/NetBSD/pkgstat/`date +%Y%m%d.%H%M`"
-	'FTP',			# "/disk1/ftp/${FTPURL}"
-	'FTPHOST',		#
+	'REPORT_BASEDIR',	# "`date +%Y%m%d.%H%M`"
+	'REPORTS_DIR',		# "/home/ftp/pub/NetBSD/pkgstat"
+	'REPORTS_URL',		# ""
 	'REPORT',		# "broken.html"
 	'USR_PKGSRC',		# "/usr/pkgsrc"
 	'osrev',		# `uname -r`
+my $report_basedir	= $vars{"REPORT_BASEDIR"};
+my $reports_dir		= $vars{"REPORTS_DIR"};
+my $reports_url		= $vars{"REPORTS_URL"};
+my $report_dir		= "${reports_dir}/${report_basedir}";
+my $report_url		= "${reports_url}/${report_basedir}";
 my $reportf = basename($vars{REPORT});
 my $os = `uname -s`;
@@ -187,31 +193,28 @@ sub print_report_header() {
-my_system("mkdir", "-p", "--", $vars{FTP});
+my_system("mkdir", "-p", "--", $report_dir);
 # Copy over the output from the build process
 chdir($vars{"BULKFILESDIR"}) or pb_die($vars{"BULKFILESDIR"}, "Cannot change directory.");
-my_system("find . -name $vars{BROKENFILE} -print -o -name $vars{BROKENWRKLOG} -print | $vars{PAX} -r -w -X $vars{FTP}");
+my_system("find . -name $vars{BROKENFILE} -print -o -name $vars{BROKENWRKLOG} -print | $vars{PAX} -r -w -X $report_dir");
 # Copy over the cache files used during the build
 	if (-f $vars{$f}) {
-		my_system("cp", "--", $vars{$f}, $vars{FTP});
+		my_system("cp", "--", $vars{$f}, $report_dir);
-chdir($vars{FTP}) or pb_die($vars{"FTP"}, "Cannot change directory.");
+chdir($report_dir) or pb_die($report_dir, "Cannot change directory.");
 # Adjust "last" symlink
-	my ($base, $dir) = ($vars{FTP} =~ m|^(.*)/([^/]*)$|);
-	unlink("$base/last");
-	symlink($dir, "$base/last");
+chdir($reports_dir) or pb_die($reports_dir, "Cannot change directory.");
+symlink($report_basedir, "last");
 # Generate leftovers-$vars{MACHINE_ARCH}.html: files not deleted
@@ -219,7 +222,7 @@ writeReport();
 # and linked from leftovers-$vars{MACHINE_ARCH}.html
-	chdir($vars{FTP});
+	chdir($report_dir) or pb_die($report_dir, "Cannot change directory.");
 	my_system("mkdir", "-p", "leftovers-$vars{MACHINE_ARCH}");
 	# Find files since last build:
@@ -270,7 +273,7 @@ writeReport();
 	foreach (@leftovers) {
-		print OUT "<a href=\"$vars{FTPHOST}/$vars{FTPURL}/leftovers-$vars{MACHINE_ARCH}$_\">$_</a>\n";
+		print OUT "<a href=\"${report_url}/leftovers-$vars{MACHINE_ARCH}$_\">$_</a>\n";
 	print OUT <<EOOUT2;
@@ -369,7 +372,7 @@ EOF
 Packages not listed here resulted in a binary package. The build
 report, including logs of failed/not-packaged is available from: