Files
cnc_wams/wasm-port/tools/extract_sources.sh

62 lines
1.4 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
UPSTREAM_DIR="$ROOT_DIR/../linuxcnc"
VENDOR_DIR="$ROOT_DIR/vendor/linuxcnc"
MANIFEST_FILE="$ROOT_DIR/tools/source-manifest.txt"
copy_file() {
local src_rel="$1"
local src="$UPSTREAM_DIR/$src_rel"
local dst="$VENDOR_DIR/$src_rel"
if [[ ! -f "$src" ]]; then
echo "missing upstream file: $src" >&2
exit 1
fi
mkdir -p "$(dirname "$dst")"
if [[ -f "$dst" ]] && cmp -s "$src" "$dst"; then
touch -r "$src" "$dst"
echo "unchanged $src_rel"
return
fi
cp -p "$src" "$dst"
echo "copied $src_rel"
}
if [[ ! -f "$MANIFEST_FILE" ]]; then
echo "missing manifest: $MANIFEST_FILE" >&2
exit 1
fi
validate_manifest_path() {
local src_rel="$1"
if [[ "$src_rel" = /* || "$src_rel" == */ || "$src_rel" == *"//"* ]]; then
return 1
fi
local component
local -a path_components
IFS=/ read -r -a path_components <<< "$src_rel"
for component in "${path_components[@]}"; do
if [[ -z "$component" || "$component" == "." || "$component" == ".." ]]; then
return 1
fi
done
}
while IFS= read -r src_rel; do
[[ -z "$src_rel" ]] && continue
[[ "${src_rel:0:1}" == "#" ]] && continue
if ! validate_manifest_path "$src_rel"; then
echo "invalid manifest path: $src_rel" >&2
exit 1
fi
copy_file "$src_rel"
done < "$MANIFEST_FILE"
echo "extraction complete"