[pacman-dev] [PATCH v3] makepkg-template: support multiple --template-dirs

Dominik Fischer d.f.fischer at web.de
Thu Apr 23 14:41:46 UTC 2015


Especially when maintaining local templates in addition to the ones
stored in /usr/share/makepkg-template, it can be useful to include
templates stored in multiple different locations into one PKGBUILD. This
patch makes this possible by allowing --template-dir to be specified
multiple times.

This also introduces a dedicated error message when a template cannot be
found, in contrast to the already existing "Couldn't detect version for
template '%s'".

If a template of the same name is present in more than one of the given
directories, the last one always takes precedence.

Neither the default behaviour without the option given, nor the handling
of a single template dir is changed.

Signed-off-by: Dominik Fischer <d.f.fischer at web.de>
---
v3 incorporates changes suggested in feedback from Florian Pritz:
    - Declare $path inside loop,
    - use full path in error message about failed version detection,
    - use dedicated error message for templates not found,
    - keep error handling of unreadable files.
 doc/makepkg-template.1.txt                         |  4 ++-
 scripts/makepkg-template.pl.in                     | 37 ++++++++++++----------
 .../compose-multiple-template-dirs/PKGBUILD        |  5 +++
 .../templates/build/build-1.template               |  1 +
 .../templates/package/package-1.template           |  1 +
 .../compose-multiple-template-dirs/testcase-config | 18 +++++++++++
 .../last-template-dir-has-precedece/PKGBUILD       |  4 +++
 .../PKGBUILD.expanded                              |  6 ++++
 .../templates/first/perl-module-1.0.template       |  1 +
 .../templates/last/perl-module-1.0.template        |  1 +
 .../testcase-config                                | 15 +++++++++
 .../missing-template-file/testcase-config          |  2 +-
 .../missing-template-symlink/testcase-config       |  4 +--
 .../template-without-version/testcase-config       |  2 +-
 14 files changed, 80 insertions(+), 21 deletions(-)
 create mode 100644 test/scripts/makepkg-template-tests/compose-multiple-template-dirs/PKGBUILD
 create mode 100644 test/scripts/makepkg-template-tests/compose-multiple-template-dirs/templates/build/build-1.template
 create mode 100644 test/scripts/makepkg-template-tests/compose-multiple-template-dirs/templates/package/package-1.template
 create mode 100644 test/scripts/makepkg-template-tests/compose-multiple-template-dirs/testcase-config
 create mode 100644 test/scripts/makepkg-template-tests/last-template-dir-has-precedece/PKGBUILD
 create mode 100644 test/scripts/makepkg-template-tests/last-template-dir-has-precedece/PKGBUILD.expanded
 create mode 100644 test/scripts/makepkg-template-tests/last-template-dir-has-precedece/templates/first/perl-module-1.0.template
 create mode 100644 test/scripts/makepkg-template-tests/last-template-dir-has-precedece/templates/last/perl-module-1.0.template
 create mode 100644 test/scripts/makepkg-template-tests/last-template-dir-has-precedece/testcase-config

diff --git a/doc/makepkg-template.1.txt b/doc/makepkg-template.1.txt
index a0a6303..03b2a38 100644
--- a/doc/makepkg-template.1.txt
+++ b/doc/makepkg-template.1.txt
@@ -72,7 +72,9 @@ Options
 	Always use the newest available template file.
 
 *\--template-dir* <dir>::
-	Change the dir where we are looking for template files.
+	Change the dir where we are looking for template files. This option may be
+	given multiple times in which case files found in directory given last will
+	take precedence.
 
 
 Example PKGBUILD
diff --git a/scripts/makepkg-template.pl.in b/scripts/makepkg-template.pl.in
index 71d2aae..9877796 100755
--- a/scripts/makepkg-template.pl.in
+++ b/scripts/makepkg-template.pl.in
@@ -27,7 +27,7 @@ use Module::Load::Conditional qw(can_load);
 
 my %opts = (
 	input => '@BUILDSCRIPT@',
-	template_dir => '@TEMPLATE_DIR@',
+	template_dir => ['@TEMPLATE_DIR@'],
 );
 
 my $template_name_charset = qr/[[:alnum:]+_. at -]/;
@@ -98,26 +98,31 @@ sub load_template {
 
 	my $ret = "";
 
-	my $path;
+	my $template_name = "$values->{name}";
 	if (!$opts{newest} and $values->{version}) {
-		$path = "$opts{template_dir}/$values->{name}-$values->{version}.template";
-	} else {
-		$path = "$opts{template_dir}/$values->{name}.template";
+		$template_name .= "-$values->{version}";
 	}
+	$template_name .= ".template";
 
-	# resolve symlink(s) and use the real file's name for version detection
-	my ($version) = (abs_path($path) =~ /-([0-9.]+)[.]template$/);
+	foreach my $dir (reverse @{$opts{template_dir}}) {
+		my $path = "$dir/$template_name";
+		if ( -e $path ) {
+			# resolve symlink(s) and use the real file's name for version detection
+			my ($version) = (abs_path($path) =~ /-([0-9.]+)[.]template$/);
 
-	if (!$version) {
-		die sprintf(gettext("Couldn't detect version for template '%s'\n"), $values->{name});
-	}
+			if (!$version) {
+				die sprintf(gettext("Couldn't detect version for template '%s'\n"), $path);
+			}
 
-	my $parsed = process_file($path);
+			my $parsed = process_file($path);
 
-	$ret .= "# template start; name=$values->{name}; version=$version;\n";
-	$ret .= $parsed;
-	$ret .= "# template end;\n";
-	return $ret;
+			$ret .= "# template start; name=$values->{name}; version=$version;\n";
+			$ret .= $parsed;
+			$ret .= "# template end;\n";
+			return $ret;
+		}
+	}
+	die sprintf(gettext("Failed to find template file matching '%s'\n"), $template_name);
 }
 
 # process input file and load templates for all markers found
@@ -199,7 +204,7 @@ GetOptions(
 	"input|p=s" => \$opts{input},
 	"output|o=s" => \$opts{output},
 	"newest|n" => \$opts{newest},
-	"template-dir=s" => \$opts{template_dir},
+	"template-dir=s@" => \$opts{template_dir},
 ) or usage(1);
 
 $opts{output} = $opts{input} unless $opts{output};
diff --git a/test/scripts/makepkg-template-tests/compose-multiple-template-dirs/PKGBUILD b/test/scripts/makepkg-template-tests/compose-multiple-template-dirs/PKGBUILD
new file mode 100644
index 0000000..f8e09f8
--- /dev/null
+++ b/test/scripts/makepkg-template-tests/compose-multiple-template-dirs/PKGBUILD
@@ -0,0 +1,5 @@
+pkgname=foo
+pkgver=1
+
+# template input; name=build; version=1;
+# template input; name=package; version=1;
diff --git a/test/scripts/makepkg-template-tests/compose-multiple-template-dirs/templates/build/build-1.template b/test/scripts/makepkg-template-tests/compose-multiple-template-dirs/templates/build/build-1.template
new file mode 100644
index 0000000..81f2745
--- /dev/null
+++ b/test/scripts/makepkg-template-tests/compose-multiple-template-dirs/templates/build/build-1.template
@@ -0,0 +1 @@
+build() {}
diff --git a/test/scripts/makepkg-template-tests/compose-multiple-template-dirs/templates/package/package-1.template b/test/scripts/makepkg-template-tests/compose-multiple-template-dirs/templates/package/package-1.template
new file mode 100644
index 0000000..056096f
--- /dev/null
+++ b/test/scripts/makepkg-template-tests/compose-multiple-template-dirs/templates/package/package-1.template
@@ -0,0 +1 @@
+package() {}
diff --git a/test/scripts/makepkg-template-tests/compose-multiple-template-dirs/testcase-config b/test/scripts/makepkg-template-tests/compose-multiple-template-dirs/testcase-config
new file mode 100644
index 0000000..3c58a61
--- /dev/null
+++ b/test/scripts/makepkg-template-tests/compose-multiple-template-dirs/testcase-config
@@ -0,0 +1,18 @@
+arguments+=(--template-dir $testdir/$testcase/templates/build)
+arguments+=(--template-dir $testdir/$testcase/templates/package)
+expected_exitcode=0
+
+IFS="" read -d '' expected_output <<'EOF'
+EOF
+
+IFS="" read -d '' expected_result <<'EOF'
+pkgname=foo
+pkgver=1
+
+# template start; name=build; version=1;
+build() {}
+# template end;
+# template start; name=package; version=1;
+package() {}
+# template end;
+EOF
diff --git a/test/scripts/makepkg-template-tests/last-template-dir-has-precedece/PKGBUILD b/test/scripts/makepkg-template-tests/last-template-dir-has-precedece/PKGBUILD
new file mode 100644
index 0000000..2813b75
--- /dev/null
+++ b/test/scripts/makepkg-template-tests/last-template-dir-has-precedece/PKGBUILD
@@ -0,0 +1,4 @@
+pkgname=foo
+pkgver=1
+
+# template input; name=perl-module; version=1.0;
diff --git a/test/scripts/makepkg-template-tests/last-template-dir-has-precedece/PKGBUILD.expanded b/test/scripts/makepkg-template-tests/last-template-dir-has-precedece/PKGBUILD.expanded
new file mode 100644
index 0000000..c1dbeb4
--- /dev/null
+++ b/test/scripts/makepkg-template-tests/last-template-dir-has-precedece/PKGBUILD.expanded
@@ -0,0 +1,6 @@
+pkgname=foo
+pkgver=1
+
+# template start; name=perl-module; version=1.0;
+this should be included
+# template end;
diff --git a/test/scripts/makepkg-template-tests/last-template-dir-has-precedece/templates/first/perl-module-1.0.template b/test/scripts/makepkg-template-tests/last-template-dir-has-precedece/templates/first/perl-module-1.0.template
new file mode 100644
index 0000000..2649f78
--- /dev/null
+++ b/test/scripts/makepkg-template-tests/last-template-dir-has-precedece/templates/first/perl-module-1.0.template
@@ -0,0 +1 @@
+this should be overwritten
diff --git a/test/scripts/makepkg-template-tests/last-template-dir-has-precedece/templates/last/perl-module-1.0.template b/test/scripts/makepkg-template-tests/last-template-dir-has-precedece/templates/last/perl-module-1.0.template
new file mode 100644
index 0000000..409e8d4
--- /dev/null
+++ b/test/scripts/makepkg-template-tests/last-template-dir-has-precedece/templates/last/perl-module-1.0.template
@@ -0,0 +1 @@
+this should be included
diff --git a/test/scripts/makepkg-template-tests/last-template-dir-has-precedece/testcase-config b/test/scripts/makepkg-template-tests/last-template-dir-has-precedece/testcase-config
new file mode 100644
index 0000000..fe38d65
--- /dev/null
+++ b/test/scripts/makepkg-template-tests/last-template-dir-has-precedece/testcase-config
@@ -0,0 +1,15 @@
+arguments+=(--template-dir $testdir/$testcase/templates/first)
+arguments+=(--template-dir $testdir/$testcase/templates/last)
+expected_exitcode=0
+
+IFS="" read -d '' expected_output <<'EOF'
+EOF
+
+IFS="" read -d '' expected_result <<'EOF'
+pkgname=foo
+pkgver=1
+
+# template start; name=perl-module; version=1.0;
+this should be included
+# template end;
+EOF
diff --git a/test/scripts/makepkg-template-tests/missing-template-file/testcase-config b/test/scripts/makepkg-template-tests/missing-template-file/testcase-config
index bdfde40..2fc400e 100644
--- a/test/scripts/makepkg-template-tests/missing-template-file/testcase-config
+++ b/test/scripts/makepkg-template-tests/missing-template-file/testcase-config
@@ -7,7 +7,7 @@ _setup_testcase() {
 
 # set IFS="" if you want trailing new lines, otherwise remove it
 IFS="" read -d '' expected_output <<'EOF'
-failed to open './makepkg-template-tests/missing-template-file/templates/perl-module-1.0.template': No such file or directory
+Failed to find template file matching 'perl-module-1.0.template'
 EOF
 
 IFS="" read -d '' expected_result <<'EOF'
diff --git a/test/scripts/makepkg-template-tests/missing-template-symlink/testcase-config b/test/scripts/makepkg-template-tests/missing-template-symlink/testcase-config
index c0eabe0..8f4c8b8 100644
--- a/test/scripts/makepkg-template-tests/missing-template-symlink/testcase-config
+++ b/test/scripts/makepkg-template-tests/missing-template-symlink/testcase-config
@@ -1,8 +1,8 @@
 arguments+=()
-expected_exitcode=255
+expected_exitcode=2
 
 IFS="" read -d '' expected_output <<'EOF'
-Couldn't detect version for template 'perl-module'
+Failed to find template file matching 'perl-module.template'
 EOF
 
 IFS="" read -d '' expected_result <<'EOF'
diff --git a/test/scripts/makepkg-template-tests/template-without-version/testcase-config b/test/scripts/makepkg-template-tests/template-without-version/testcase-config
index ec04f2f..b078f51 100644
--- a/test/scripts/makepkg-template-tests/template-without-version/testcase-config
+++ b/test/scripts/makepkg-template-tests/template-without-version/testcase-config
@@ -2,7 +2,7 @@ arguments+=()
 expected_exitcode=255
 
 IFS="" read -d '' expected_output <<'EOF'
-Couldn't detect version for template 'template-without_version'
+Couldn't detect version for template './makepkg-template-tests/template-without-version/templates/template-without_version.template'
 EOF
 
 IFS="" read -d '' expected_result <<'EOF'
-- 
2.3.5


More information about the pacman-dev mailing list