mirror of
https://github.com/xroche/httrack.git
synced 2026-07-23 09:09:05 +03:00
libhttrack.dll and httrack.exe have never carried a VERSIONINFO: no product name, no version, nothing. Right-click either one on Windows and Properties has no Details worth reading. That becomes a hard problem now that we are signing them. SignPath enforce file metadata restrictions: every binary in a release must name the same product and the same product version, and a binary that names nothing cannot satisfy the rule. It fails the signing request, on release day, rather than the build. So add src/version.rc, and two wrappers that set the parts which differ per binary. The version is spelled out there as numbers, because a VERSIONINFO needs 3,49,12,0 and cannot take a string apart, and because htsglobal.h drags in C declarations that a resource compiler has no business parsing. That leaves the version written twice, which is how a version resource quietly starts lying about which release it is. tests/01_engine-version-macros.test fails the build if version.rc and htsglobal.h ever disagree, on any of the four values, and on the product name too. I checked that it fires rather than assuming: drift the numbers and it fails, restore them and it passes. The product name is HTTrack Website Copier, on all of them. WinHTTrack is the name of the Windows GUI, not of the command line program or of the engine. Signed-off-by: Xavier Roche <roche@httrack.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
65 lines
2.2 KiB
Bash
Executable File
65 lines
2.2 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# version.rc repeats the version that htsglobal.h declares. Signing enforces that
|
|
# every binary in a release reports the same one, so a drift fails the signing
|
|
# request on release day rather than the build. Assert the two agree.
|
|
|
|
set -euo pipefail
|
|
|
|
src="${top_srcdir:-..}/src"
|
|
h="$src/htsglobal.h"
|
|
rc="$src/version.rc"
|
|
for f in "$h" "$rc"; do
|
|
[ -f "$f" ] || {
|
|
echo "cannot find $f"
|
|
exit 1
|
|
}
|
|
done
|
|
|
|
# 3.49-12 (display) and 3.49.12 (dotted).
|
|
version=$(sed -n 's/^#define HTTRACK_VERSION[[:space:]][[:space:]]*"\([^"]*\)".*/\1/p' "$h")
|
|
versionid=$(sed -n 's/^#define HTTRACK_VERSIONID[[:space:]][[:space:]]*"\([^"]*\)".*/\1/p' "$h")
|
|
if [ -z "$version" ] || [ -z "$versionid" ]; then
|
|
echo "could not read the version from $h"
|
|
exit 1
|
|
fi
|
|
|
|
# The same version, as version.rc states it.
|
|
fileversion=$(sed -n 's/^[[:space:]]*FILEVERSION[[:space:]][[:space:]]*\(.*\)$/\1/p' "$rc" | tr -d ' \r')
|
|
productversion=$(sed -n 's/^[[:space:]]*PRODUCTVERSION[[:space:]][[:space:]]*\(.*\)$/\1/p' "$rc" | tr -d ' \r')
|
|
rc_fileversion=$(sed -n 's/.*VALUE "FileVersion",[[:space:]]*"\([^"]*\)".*/\1/p' "$rc")
|
|
rc_productversion=$(sed -n 's/.*VALUE "ProductVersion",[[:space:]]*"\([^"]*\)".*/\1/p' "$rc")
|
|
rc_productname=$(sed -n 's/.*VALUE "ProductName",[[:space:]]*"\([^"]*\)".*/\1/p' "$rc")
|
|
|
|
# 3.49.12 -> 3,49,12,0
|
|
expected_numeric="$(echo "$versionid" | tr '.' ','),0"
|
|
|
|
fail=0
|
|
check() { # what expected actual
|
|
if [ "$2" != "$3" ]; then
|
|
echo "version.rc $1 is \"$3\", but htsglobal.h says it should be \"$2\""
|
|
fail=1
|
|
fi
|
|
}
|
|
check FILEVERSION "$expected_numeric" "$fileversion"
|
|
check PRODUCTVERSION "$expected_numeric" "$productversion"
|
|
check FileVersion "$versionid" "$rc_fileversion"
|
|
check ProductVersion "$version" "$rc_productversion"
|
|
|
|
# Signing pins the product name too.
|
|
check ProductName "HTTrack Website Copier" "$rc_productname"
|
|
|
|
[ "$fail" -eq 0 ] || exit 1
|
|
|
|
# And the shipped binary must agree with the header it was built from.
|
|
out=$(httrack --version)
|
|
case "$out" in
|
|
*"$version"*) ;;
|
|
*)
|
|
echo "httrack --version says \"$out\", which does not mention $version"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
echo "version resource agrees with htsglobal.h: $version ($expected_numeric)"
|