Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
triggers: make the perpackage trigger per file instead of per directory
Baptiste Daroussin committed 21 days ago
commit bf7cbe6a43ddfea835bce14e911a34333dc51897
parent 4701646
2 files changed +61 -8
modified libpkg/triggers.c
@@ -690,7 +690,7 @@ triggers_execute_perpackage(struct triggers *t, struct pkg *pkg,
{
	struct pkg_file *f = NULL;
	struct pkg_dir *d = NULL;
-
	pkghash *pkg_dirs_hash = NULL;
+
	pkghash *pkg_paths_hash = NULL;
	int ret = EPKG_OK;
	trigger_t *triggers;

@@ -705,22 +705,23 @@ triggers_execute_perpackage(struct triggers *t, struct pkg *pkg,
		return (EPKG_OK);
	}

-
	/* Build set of parent directories from the package's files */
+
	/* Build set of file paths and their parent directories */
	while (pkg_files(pkg, &f) == EPKG_OK) {
		char *dir, *slash;
+
		pkghash_safe_add(pkg_paths_hash, f->path, NULL, NULL);
		dir = xstrdup(f->path);
		slash = strrchr(dir, '/');
		if (slash != NULL) {
			*slash = '\0';
-
			pkghash_safe_add(pkg_dirs_hash, dir, NULL, NULL);
+
			pkghash_safe_add(pkg_paths_hash, dir, NULL, NULL);
		}
		free(dir);
	}
	while (pkg_dirs(pkg, &d) == EPKG_OK) {
-
		pkghash_safe_add(pkg_dirs_hash, d->path, NULL, NULL);
+
		pkghash_safe_add(pkg_paths_hash, d->path, NULL, NULL);
	}

-
	if (pkg_dirs_hash == NULL) {
+
	if (pkg_paths_hash == NULL) {
		vec_free_and_free(triggers, trigger_free);
		free(triggers);
		return (EPKG_OK);
@@ -730,7 +731,7 @@ triggers_execute_perpackage(struct triggers *t, struct pkg *pkg,
	vec_foreach(*triggers, i) {
		struct trigger *trig = triggers->d[i];
		pkghash *local_matched = NULL;
-
		pkghash_it it = pkghash_iterator(pkg_dirs_hash);
+
		pkghash_it it = pkghash_iterator(pkg_paths_hash);

		while (pkghash_next(&it))
			trigger_check_match_local(trig, it.key, &local_matched);
@@ -752,7 +753,7 @@ triggers_execute_perpackage(struct triggers *t, struct pkg *pkg,
		}
	}

-
	pkghash_destroy(pkg_dirs_hash);
+
	pkghash_destroy(pkg_paths_hash);
	vec_free_and_free(triggers, trigger_free);
	free(triggers);
	return (ret);
modified tests/frontend/triggers.sh
@@ -14,7 +14,9 @@ tests_init \
	perpackage_pre_install \
	perpackage_post_install \
	perpackage_pre_deinstall \
-
	perpackage_post_deinstall
+
	perpackage_post_deinstall \
+
	perpackage_file_glob \
+
	perpackage_file_regexp

cleanup_lua_body() {
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "test" "test" "1" "/"
@@ -324,3 +326,53 @@ EOF
	    -o match:"path: /usr/local/libdata/ldconfig" \
	    pkg -o REPOS_DIR=/dev/null -o PKG_TRIGGERS_DIR="/trigger_dir" -r ${TMPDIR}/target delete -qy mylib
}
+

+
perpackage_file_glob_body() {
+
	# Verify per-package triggers can match individual files, not just directories
+
	mkdir -p target/trigger_dir/post_install/
+
	cat << EOF >> target/trigger_dir/post_install/omf.ucl
+
path_glob: [ "*/share/omf/*/*.omf" ]
+
trigger: {
+
	type: lua
+
	sandbox: false
+
	script: <<EOS
+
for i, v in ipairs(arg) do
+
	print("omf: " .. v)
+
end
+
EOS
+
}
+
EOF
+
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "myhelp" "myhelp" "1.0" "/usr/local"
+
	mkdir -p usr/local/share/omf/myhelp/
+
	echo "<omf/>" > usr/local/share/omf/myhelp/myhelp-C.omf
+
	echo /usr/local/share/omf/myhelp/myhelp-C.omf > plist
+
	atf_check pkg create -M myhelp.ucl -p plist -r .
+
	unset PKG_TRIGGERS_DIR
+
	atf_check -o match:"omf: /usr/local/share/omf/myhelp/myhelp-C.omf" \
+
	    pkg -o REPOS_DIR=/dev/null -o PKG_TRIGGERS_DIR="/trigger_dir" -r ${TMPDIR}/target install -qfy ${TMPDIR}/myhelp-1.0.pkg
+
}
+

+
perpackage_file_regexp_body() {
+
	# Verify per-package triggers can match individual files via regexp
+
	mkdir -p target/trigger_dir/post_install/
+
	cat << EOF >> target/trigger_dir/post_install/schemas.ucl
+
path_regexp: [ ".*/etc/gconf/schemas/.*\\.schemas$" ]
+
trigger: {
+
	type: lua
+
	sandbox: false
+
	script: <<EOS
+
for i, v in ipairs(arg) do
+
	print("schema: " .. v)
+
end
+
EOS
+
}
+
EOF
+
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "myapp" "myapp" "2.0" "/usr/local"
+
	mkdir -p usr/local/etc/gconf/schemas/
+
	echo "<schema/>" > usr/local/etc/gconf/schemas/myapp.schemas
+
	echo /usr/local/etc/gconf/schemas/myapp.schemas > plist
+
	atf_check pkg create -M myapp.ucl -p plist -r .
+
	unset PKG_TRIGGERS_DIR
+
	atf_check -o match:"schema: /usr/local/etc/gconf/schemas/myapp.schemas" \
+
	    pkg -o REPOS_DIR=/dev/null -o PKG_TRIGGERS_DIR="/trigger_dir" -r ${TMPDIR}/target install -qfy ${TMPDIR}/myapp-2.0.pkg
+
}