aboutsummaryrefslogtreecommitdiff
path: root/kiss
diff options
context:
space:
mode:
Diffstat (limited to 'kiss')
-rwxr-xr-xkiss28
1 files changed, 27 insertions, 1 deletions
diff --git a/kiss b/kiss
index cbecbac..997bae9 100755
--- a/kiss
+++ b/kiss
@@ -134,15 +134,41 @@ pkg_tar() {
log "Use '$kiss install $name' to install the package."
}
+pkg_conflicts() {
+ log "Checking for package conflicts."
+
+ # Extract manifest from tarball and strip directories.
+ tar xf "$bin_dir/$pkg" "./var/db/$kiss/$name/manifest" -O |
+ while read -r line; do
+ [ -f "$line" ] && printf '%s\n' "$line" >> "$cac_dir/manifest"
+ done
+
+ # Compare extracted manifest to all installed manifests.
+ # If there are matching lines (files) there's a package
+ # conflict.
+ for db in "$sys_db"/*; do
+ [ "$name" = "${db##*/}" ] && continue
+
+ grep -Fxf "$cac_dir/manifest" "$db/manifest" &&
+ die "Package '$name' conflicts with '${db##*/}'."
+ done
+
+ rm "$cac_dir/manifest"
+}
+
pkg_install() {
[ -f "$bin_dir/$pkg" ] || args b "$name"
+ pkg_conflicts
+
# Create a backup of 'tar' so it isn't removed during
# package installation.
cp "$(command -v tar)" "$cac_dir"
+ log "Removing previous version of package if it exists."
pkg_remove "$name"
- "$cac_dir/tar" kpxvf "$bin_dir/$pkg" -C "$sys_dir/"
+
+ "$cac_dir/tar" kpxf "$bin_dir/$pkg" -C "$sys_dir/"
rm "$cac_dir/tar"
"$sys_db/$name/post-install" 2>/dev/null