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

Dominik Fischer d.f.fischer at web.de
Thu Apr 23 11:59:38 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.

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>
---
v2: - Templates are always checked to exist before process_file is ever
      called, so I moved the error message used therein up. No need for
      a new string any more. 
    - Tests were adapted to the slight message and error code changes.


 doc/makepkg-template.1.txt                         |  4 ++-
 scripts/makepkg-template.pl.in                     | 42 ++++++++++++----------
 .../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 +--
 13 files changed, 82 insertions(+), 22 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..49e0e37 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,32 @@ 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$/);
-
-	if (!$version) {
-		die sprintf(gettext("Couldn't detect version for template '%s'\n"), $values->{name});
-	}
+	my $path;
+	foreach my $dir (reverse @{$opts{template_dir}}) {
+		$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});
+			}
 
-	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 open '%s': %s\n"), $template_name, $!)
 }
 
 # process input file and load templates for all markers found
@@ -128,7 +134,7 @@ sub process_file {
 	my $nesting_level = 0;
 	my $linenumber = 0;
 
-	open (my $fh, "<", $filename) or die sprintf(gettext("failed to open '%s': %s\n"), $filename, $!);
+	open (my $fh, "<", $filename);
 	my @lines = <$fh>;
 	close $fh;
 
@@ -199,7 +205,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..44444e4 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 open 'perl-module-1.0.template': No such file or directory
 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..0654328 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 open 'perl-module.template': No such file or directory
 EOF
 
 IFS="" read -d '' expected_result <<'EOF'
-- 
2.3.5


More information about the pacman-dev mailing list