aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--brep/handler/upload/upload-bindist.in69
-rw-r--r--mod/mod-package-version-details.cxx4
2 files changed, 67 insertions, 6 deletions
diff --git a/brep/handler/upload/upload-bindist.in b/brep/handler/upload/upload-bindist.in
index ba05bc3..913b35a 100644
--- a/brep/handler/upload/upload-bindist.in
+++ b/brep/handler/upload/upload-bindist.in
@@ -22,15 +22,19 @@
# sanitized, having the "bindist", <instance>, <os-release-name-id>, and
# <os-release-name-id><os-release-version-id> dash-separated sub-components
# removed. If the component becomes empty as a result of the sanitization,
-# then "default" is assumed. For example, the following symlink paths:
+# then the target CPU is assumed, if the package is not architecture-
+# independent, and "noarch" otherwise. If the sanitized component is not
+# empty, the package is not architecture-independent, and the resulting
+# component doesn't containt the target CPU, then prepend it with the <cpu>-
+# prefix. For example, the following symlink paths:
#
# .../archive/windows10/foo/libfoo/1.0.0/bindist-archive-windows10-release
# .../archive/windows10/foo/libfoo/1.0.0/bindist-archive-windows10
#
# are reduced to:
#
-# .../archive/windows10/foo/libfoo/1.0.0/release
-# .../archive/windows10/foo/libfoo/1.0.0/default
+# .../archive/windows10/foo/libfoo/1.0.0/x86_64-release
+# .../archive/windows10/foo/libfoo/1.0.0/x86_64
#
# To achieve this the handler performs the following steps (<dir> is passed as
# last argument by brep and is a subdirectory of upload-data):
@@ -175,6 +179,7 @@ name=
version=
project=
package_config=
+target=
tenant=
while IFS=: read -ru "$manifest_parser_ofd" -d '' n v; do
@@ -186,6 +191,7 @@ while IFS=: read -ru "$manifest_parser_ofd" -d '' n v; do
version) version="$v" ;;
project) project="$v" ;;
package-config) package_config="$v" ;;
+ target) target="$v" ;;
tenant) tenant="$v" ;;
esac
done
@@ -220,6 +226,10 @@ if [[ -z "$package_config" ]]; then
error "package-config manifest value expected"
fi
+if [[ -z "$target" ]]; then
+ error "target manifest value expected"
+fi
+
# Let's disallow dots in the package-config manifest value since the latter
# serves as the package configuration symlink name and the dot can be
# misinterpreted by brep as an extension separator, which the implementation
@@ -229,6 +239,37 @@ if [[ "$package_config" == *"."* ]]; then
exit_with_manifest 400 "package-config manifest value may not contain dot"
fi
+# Extract the CPU component from the target triplet and deduce the binary
+# distribution-specific CPU representation which is normally used in the
+# package file names.
+#
+cpu="$(sed -n -re 's/^([^-]+)-.+/\1/p' <<<"$target")"
+
+if [[ -z "$cpu" ]]; then
+ error "CPU expected in target triplet '$target'"
+fi
+
+# Use CPU extracted from the target triplet as a distribution-specific
+# representation, unless this is Debian or Fedora (see bpkg's
+# system-package-manager-{fedora,debian}.cxx for details).
+#
+cpu_dist="$cpu"
+
+case $instance in
+ debian)
+ case $cpu in
+ x86_64) cpu_dist="amd64" ;;
+ aarch64) cpu_dist="arm64" ;;
+ i386 | i486 | i586 | i686) cpu_dist="i386" ;;
+ esac
+ ;;
+ fedora)
+ case $cpu in
+ i386 | i486 | i586 | i686) cpu_dist="i686" ;;
+ esac
+ ;;
+esac
+
# Unpack the archive.
#
run tar -xf "$data_dir/$archive" -C "$data_dir"
@@ -283,6 +324,10 @@ fi
# Parse the package file manifest list and cache the file paths.
#
+# While at it, detect if the package is architecture-specific or not by
+# checking if any package file names contain the distribution-specific CPU
+# representation (as a sub-string).
+#
# Note that while we currently only need the package file paths, we can make
# use of their types and system names in the future. Thus, let's verify that
# all the required package file values are present and, while at it, cache
@@ -292,6 +337,8 @@ package_file_paths=()
package_file_types=()
package_file_system_names=()
+arch_specific=
+
# The outer loop iterates over package file manifests while the inner loop
# iterates over manifest values in each such manifest.
#
@@ -325,6 +372,10 @@ while [[ "$more" ]]; do
package_file_paths+=("$path")
package_file_types+=("$type")
package_file_system_names+=("$system_name") # Note: system name can be empty.
+
+ if [[ "$path" == *"$cpu_dist"* ]]; then
+ arch_specific=true
+ fi
done
manifest_parser_finish
@@ -345,8 +396,18 @@ for c in $(sed 's/-/ /g' <<<"$package_config"); do
fi
done
+# Reflect the architecture in the sanitized configuration name.
+#
if [[ -z "$config" ]]; then
- config="default"
+ if [[ "$arch_specific" ]]; then
+ config="$cpu"
+ else
+ config="noarch"
+ fi
+else
+ if [[ "$arch_specific" && ("$config" != *"$cpu"*) ]]; then
+ config="$cpu-$config"
+ fi
fi
# Compose the package configuration symlink path.
diff --git a/mod/mod-package-version-details.cxx b/mod/mod-package-version-details.cxx
index 3744d95..9befd01 100644
--- a/mod/mod-package-version-details.cxx
+++ b/mod/mod-package-version-details.cxx
@@ -573,8 +573,8 @@ handle (request& rq, response& rs)
{
dir_path distribution; // debian, fedora, archive
dir_path os_release; // fedora37, windows10
- path symlink; // .../default, .../release
- dir_path directory; // .../default-2023-05-11T10:13:43Z
+ path symlink; // .../x86_64, .../x86_64-release
+ dir_path directory; // .../x86_64-2023-05-11T10:13:43Z
bool
operator< (const bindist_config& v)