Compare commits
84 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
de484e0670 | ||
|
|
b6d15c7bc8 | ||
|
|
db22036173 | ||
|
|
50f151e11b | ||
|
|
729f823db9 | ||
|
|
01274a93f5 | ||
|
|
bd765e4ed6 | ||
|
|
17e3d241fa | ||
|
|
ee20bfbb2b | ||
|
|
bde9eadb05 | ||
|
|
88f0a0174d | ||
|
|
696553b0f9 | ||
|
|
99d494bd39 | ||
|
|
53eace3cfe | ||
|
|
1dcfcf491f | ||
|
|
14e9108049 | ||
|
|
5c068a3c65 | ||
|
|
e9336b4d87 | ||
|
|
11c357e73a | ||
|
|
94d2d79217 | ||
|
|
52ac9ee142 | ||
|
|
d432772e1e | ||
|
|
997160c98f | ||
|
|
c3a5deef57 | ||
|
|
b33ef757e5 | ||
|
|
9bb989053d | ||
|
|
c27d55c345 | ||
|
|
40e94df2cc | ||
|
|
c71f37189a | ||
|
|
cb91ecaedc | ||
|
|
faa6964d18 | ||
|
|
fce40a5511 | ||
|
|
0f3dbcded4 | ||
|
|
04c75c430a | ||
|
|
0e0072ec03 | ||
|
|
ceab9c834b | ||
|
|
082d87e284 | ||
|
|
58e8aec88f | ||
|
|
ce66c2391a | ||
|
|
49e93b171b | ||
|
|
3ea7a773fa | ||
|
|
5175cf986f | ||
|
|
d25dd436ee | ||
|
|
0fe1e2ba34 | ||
|
|
9bc300296f | ||
|
|
a6315d04a3 | ||
|
|
893b542953 | ||
|
|
3232f81373 | ||
|
|
4a5854f31d | ||
|
|
df0fbd4711 | ||
|
|
77d03052a6 | ||
|
|
628fc70727 | ||
|
|
7ff60e9de7 | ||
|
|
4588831dcd | ||
|
|
adbc46a5b8 | ||
|
|
249b96b975 | ||
|
|
d8402d7ad2 | ||
|
|
b268caa220 | ||
|
|
fb59dd6aba | ||
|
|
ef100363a7 | ||
|
|
c3e1a202c1 | ||
|
|
f55f68c94e | ||
|
|
749de004c7 | ||
|
|
09e3e1f62b | ||
|
|
4364e6c93e | ||
|
|
35319c05be | ||
|
|
e4fbe856e5 | ||
|
|
4f49eec86b | ||
|
|
f8ed3e771f | ||
|
|
4231a141d3 | ||
|
|
314ee45350 | ||
|
|
54d93200a4 | ||
|
|
6e98e33495 | ||
|
|
67c4668a3b | ||
|
|
e6015e29bb | ||
|
|
ba53bca32e | ||
|
|
5b59cdb159 | ||
|
|
c520d81f6b | ||
|
|
0748fa44e9 | ||
|
|
0ced83ccfc | ||
|
|
171ffb0754 | ||
|
|
e12fe63246 | ||
|
|
ff266a0e61 | ||
|
|
dfc0efff3a |
2
.github/workflows/appstream-network.yml
vendored
@@ -22,7 +22,7 @@ jobs:
|
||||
- name: Install appstreamcli
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
|
||||
sudo apt-get install -y --no-install-recommends appstream
|
||||
appstreamcli --version
|
||||
|
||||
|
||||
157
.github/workflows/ci.yml
vendored
@@ -38,7 +38,7 @@ jobs:
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential clang autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev \
|
||||
@@ -80,6 +80,27 @@ jobs:
|
||||
- name: Build
|
||||
run: make -j"$(nproc)"
|
||||
|
||||
# FTP_PASV is 1 in every build, so #if !FTP_PASV never reaches a compiler
|
||||
# and rots unnoticed (#1091). Compiling is all this proves; nothing runs it.
|
||||
- name: Compile the FTP active-mode branch
|
||||
run: |
|
||||
set -euo pipefail
|
||||
objs="src/libhttrack_la-htsftp.lo src/libhttrack_la-htsftp.o src/.libs/libhttrack_la-htsftp.o"
|
||||
# accept() marks active-mode code: absent from the object Build made,
|
||||
# present below. One-sided, it passes on a file that ignored the define.
|
||||
syms=$(nm --undefined-only src/.libs/libhttrack_la-htsftp.o)
|
||||
if grep -qw accept <<<"$syms"; then
|
||||
echo "::error::accept() is reachable with FTP_PASV=1; the marker no longer discriminates"
|
||||
exit 1
|
||||
fi
|
||||
rm -f $objs
|
||||
# Through CC: overriding CPPFLAGS would drop configure's
|
||||
# -D_FORTIFY_SOURCE and the object-size warnings that come with it.
|
||||
make -C src libhttrack_la-htsftp.lo CC="$CC -DFTP_PASV=0 -Werror"
|
||||
syms=$(nm --undefined-only src/.libs/libhttrack_la-htsftp.o)
|
||||
grep -qw accept <<<"$syms" || { echo "::error::-DFTP_PASV=0 built no active-mode code"; exit 1; }
|
||||
rm -f $objs
|
||||
|
||||
# A backstop only: tests/test-timeout.sh bounds each test, and a healthy run
|
||||
# is a minute here, two on macOS. Without it a stall ran to the job's 6h default.
|
||||
- name: Test
|
||||
@@ -108,7 +129,7 @@ jobs:
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
||||
@@ -138,6 +159,48 @@ jobs:
|
||||
if: failure()
|
||||
run: cat tests/test-suite.log 2>/dev/null || true
|
||||
|
||||
# Reproduces the buildds that refuse TEST-NET-1 instead of dropping it, where
|
||||
# every fixture needing a stalled connect must skip rather than fail (#1108).
|
||||
hostile-network:
|
||||
name: build (network refuses TEST-NET-1)
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev iproute2
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
set -euo pipefail
|
||||
autoreconf -fi
|
||||
./configure
|
||||
|
||||
- name: Build
|
||||
run: make -j"$(nproc)"
|
||||
|
||||
- name: Test on a network that refuses TEST-NET-1
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
set -euo pipefail
|
||||
jobs=$(( $(nproc) * 2 )); [ "$jobs" -le 16 ] || jobs=16
|
||||
tools/hostile-net.sh make check -j"$jobs"
|
||||
# A refusal landing before connect() returns skips on the older probe
|
||||
# instead, leaving the settle this leg exists to guard unrun.
|
||||
cat tests/246_engine-connect-stop.log
|
||||
grep -q 'within 500 ms' tests/246_engine-connect-stop.log
|
||||
|
||||
- name: Print the test log on failure
|
||||
if: failure()
|
||||
run: cat tests/test-suite.log 2>/dev/null || true
|
||||
|
||||
# The Ubuntu buildds run a development release every runner above is well behind.
|
||||
# That gap is what shipped 3.49.18 broken on every Ubuntu architecture but
|
||||
# riscv64, when 25.10 made uutils the default coreutils (#1042).
|
||||
@@ -292,7 +355,7 @@ jobs:
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
||||
@@ -401,7 +464,7 @@ jobs:
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo dpkg --add-architecture i386
|
||||
sudo apt-get update
|
||||
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential gcc-multilib autoconf automake libtool \
|
||||
autoconf-archive zlib1g-dev:i386 libssl-dev:i386 \
|
||||
@@ -444,7 +507,7 @@ jobs:
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
||||
@@ -499,7 +562,7 @@ jobs:
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential clang autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev
|
||||
@@ -548,7 +611,7 @@ jobs:
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential clang autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
||||
@@ -584,7 +647,7 @@ jobs:
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential clang autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
||||
@@ -614,7 +677,7 @@ jobs:
|
||||
- name: Install build dependencies (no libssl)
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential autoconf automake libtool autoconf-archive zlib1g-dev
|
||||
|
||||
@@ -637,6 +700,47 @@ jobs:
|
||||
if: failure()
|
||||
run: cat tests/test-suite.log 2>/dev/null || true
|
||||
|
||||
# The cell of #1139: a libc exporting getrandom() without shipping
|
||||
# <sys/random.h>. Nothing else reaches it, and it is a hard build break when
|
||||
# the call is not gated on the header. It also runs the /dev/urandom fallback.
|
||||
no-getrandom:
|
||||
name: build (getrandom header hidden)
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
||||
|
||||
- name: Configure (sys/random.h hidden from configure)
|
||||
run: |
|
||||
set -euo pipefail
|
||||
autoreconf -fi
|
||||
./configure ac_cv_header_sys_random_h=no
|
||||
# A libc without getrandom() at all would pass this job vacuously.
|
||||
grep -q "define HAVE_GETRANDOM 1" config.h
|
||||
! grep -q "define HAVE_SYS_RANDOM_H" config.h
|
||||
|
||||
- name: Build
|
||||
run: make -j"$(nproc)"
|
||||
|
||||
- name: Test
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
jobs=$(( $(nproc) * 2 )); [ "$jobs" -le 16 ] || jobs=16
|
||||
make check -j"$jobs"
|
||||
|
||||
- name: Print the test log on failure
|
||||
if: failure()
|
||||
run: cat tests/test-suite.log 2>/dev/null || true
|
||||
|
||||
# OpenSSL 4.0 removes the API 3.x deprecated. Building with that set hidden
|
||||
# keeps the engine ready for it: a deprecated call fails here rather than the
|
||||
# day a distro moves. Compile-only, since the headers are what is under test.
|
||||
@@ -651,7 +755,7 @@ jobs:
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
||||
@@ -730,7 +834,7 @@ jobs:
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
||||
@@ -774,6 +878,7 @@ jobs:
|
||||
fi
|
||||
|
||||
lint:
|
||||
# The name is a required status check on master; renaming it blocks every PR.
|
||||
name: lint (shellcheck, shfmt)
|
||||
runs-on: ubuntu-24.04
|
||||
# Every tracked shell script; the globs expand at run time. Kept here so the
|
||||
@@ -790,23 +895,25 @@ jobs:
|
||||
src/webhttrack.in
|
||||
tests/*.sh
|
||||
tests/*.test
|
||||
tools/macos-app.sh
|
||||
tools/macos-bundle.sh
|
||||
tools/macos-release.sh
|
||||
tools/mkdeb.sh
|
||||
tools/*.sh
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
|
||||
- name: Install linters
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
|
||||
# noble ships shfmt 3.8.0 (universe), matching the pinned local dev
|
||||
# version; use it rather than fetching a release binary from github.com.
|
||||
sudo apt-get install -y --no-install-recommends shellcheck shfmt appstream \
|
||||
appstream-util
|
||||
# Pinned to the local dev versions: black's stable style moves across
|
||||
# majors, so the runner image's build would reformat on its own schedule.
|
||||
pip install --quiet black==25.1.0 flake8==7.1.1
|
||||
shfmt --version
|
||||
appstreamcli --version
|
||||
black --version
|
||||
flake8 --version
|
||||
|
||||
- name: shellcheck
|
||||
run: shellcheck $SHELL_SCRIPTS
|
||||
@@ -814,6 +921,22 @@ jobs:
|
||||
- name: shfmt
|
||||
run: shfmt -d -i 4 $SHELL_SCRIPTS
|
||||
|
||||
# Read the list rather than hand-keeping one: a .py added in a new
|
||||
# directory then gets checked without anyone widening a glob.
|
||||
- name: List the tracked Python files
|
||||
run: |
|
||||
set -euo pipefail
|
||||
mapfile -t py < <(git ls-files '*.py')
|
||||
test "${#py[@]}" -gt 0 # flake8 given no paths exits 0, checking nothing
|
||||
echo "${#py[@]} tracked Python files"
|
||||
echo "PYTHON_FILES=${py[*]}" >> "$GITHUB_ENV"
|
||||
|
||||
- name: black
|
||||
run: black --check --diff $PYTHON_FILES
|
||||
|
||||
- name: flake8
|
||||
run: flake8 $PYTHON_FILES
|
||||
|
||||
# A misnamed test falls outside the glob "make check" runs, so it goes
|
||||
# missing without failing anything.
|
||||
- name: test file names
|
||||
@@ -859,7 +982,7 @@ jobs:
|
||||
| sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc >/dev/null
|
||||
echo "deb http://apt.llvm.org/noble/ llvm-toolchain-noble-19 main" \
|
||||
| sudo tee /etc/apt/sources.list.d/llvm-19.list >/dev/null
|
||||
sudo apt-get update
|
||||
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
|
||||
sudo apt-get install -y --no-install-recommends clang-format-19
|
||||
# The clang-format-19 package ships the git-clang-format driver;
|
||||
# expose it unsuffixed so "git clang-format" finds it.
|
||||
|
||||
6
.github/workflows/codeql.yml
vendored
@@ -33,12 +33,12 @@ jobs:
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev
|
||||
|
||||
- uses: github/codeql-action/init@v4.37.4
|
||||
- uses: github/codeql-action/init@v4.37.6
|
||||
with:
|
||||
languages: c-cpp
|
||||
build-mode: manual
|
||||
@@ -67,6 +67,6 @@ jobs:
|
||||
./configure
|
||||
make -j"$(nproc)"
|
||||
|
||||
- uses: github/codeql-action/analyze@v4.37.4
|
||||
- uses: github/codeql-action/analyze@v4.37.6
|
||||
with:
|
||||
category: "/language:c-cpp"
|
||||
|
||||
78
.github/workflows/emulated-suite.yml
vendored
Normal file
@@ -0,0 +1,78 @@
|
||||
# cross-arch.yml stops at compile for the ports architectures, so the Debian
|
||||
# buildd is the first machine to run the suite on one, and it reports by failing
|
||||
# the package build (#1146, #1148). This runs it under qemu-user, where a process
|
||||
# is not the shape a native one is and every step costs far more.
|
||||
name: Emulated suite
|
||||
|
||||
on:
|
||||
# The harness is where a native-shape assumption lands, so gate on it rather
|
||||
# than on every PR: this leg is slow and is not a required check.
|
||||
pull_request:
|
||||
paths:
|
||||
- "tests/**"
|
||||
- "tools/emulated-suite.sh"
|
||||
- ".github/workflows/emulated-suite.yml"
|
||||
push:
|
||||
branches: [master]
|
||||
schedule:
|
||||
- cron: "41 5 * * 1"
|
||||
workflow_dispatch:
|
||||
|
||||
# Least privilege: the workflow only needs to read the repo.
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: emulated-suite-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
emulated:
|
||||
name: emulated suite (${{ matrix.arch }})
|
||||
runs-on: ubuntu-24.04
|
||||
# The emulated apt, configure and build take the bulk of it, well under the
|
||||
# 6h ceiling: a wedge should not run that long.
|
||||
timeout-minutes: 90
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
# Emulation is what is under test, not parisc: the hppa that reported
|
||||
# #1146 lives in debian-ports, with no container image and a far more
|
||||
# fragile archive. s390x is in main, and big-endian, which nothing else
|
||||
# here covers.
|
||||
arch: [s390x]
|
||||
steps:
|
||||
- name: Register the binfmt handlers
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
# Registered with the F flag, so the kernel holds the interpreter open
|
||||
# and the container needs no copy of it.
|
||||
sudo apt-get install -y --no-install-recommends qemu-user-static binfmt-support
|
||||
test -e "/proc/sys/fs/binfmt_misc/qemu-${{ matrix.arch }}" ||
|
||||
{ ls /proc/sys/fs/binfmt_misc; exit 1; }
|
||||
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Build and run the suite emulated
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# The build dir is a mounted volume, so the suite log outlives the
|
||||
# container: a failure here has no detail otherwise.
|
||||
mkdir -p "$RUNNER_TEMP/emul-bld"
|
||||
docker run --rm --platform "linux/${{ matrix.arch }}" \
|
||||
-v "$GITHUB_WORKSPACE:$GITHUB_WORKSPACE" -w "$GITHUB_WORKSPACE" \
|
||||
-v "$RUNNER_TEMP/emul-bld:/bld" \
|
||||
-e "GITHUB_WORKSPACE=$GITHUB_WORKSPACE" \
|
||||
-e "EMULATED_ARCH=${{ matrix.arch }}" \
|
||||
debian:sid bash ./tools/emulated-suite.sh
|
||||
|
||||
- name: Collect the suite log
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: emulated-suite-${{ matrix.arch }}-log
|
||||
path: ${{ runner.temp }}/emul-bld/tests/test-suite.log
|
||||
if-no-files-found: warn
|
||||
106
.github/workflows/httraqt.yml
vendored
Normal file
@@ -0,0 +1,106 @@
|
||||
# Build HTTraQt, the only consumer of our installed headers, against this branch.
|
||||
name: HTTraQt
|
||||
|
||||
# Filtered, so it must never join the required set: a check that a path filter
|
||||
# skips stays "Expected" forever and blocks the merge.
|
||||
on:
|
||||
push:
|
||||
branches: [master]
|
||||
paths: ['src/**', 'm4/**', 'configure.ac', '.github/workflows/httraqt.yml']
|
||||
pull_request:
|
||||
paths: ['src/**', 'm4/**', 'configure.ac', '.github/workflows/httraqt.yml']
|
||||
schedule:
|
||||
- cron: '37 05 * * 1' # upstream is pinned; this catches drift in Qt and the runner image
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: httraqt-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
# Unofficial mirror of the SourceForge tree, so no PR depends on a third-party host.
|
||||
HTTRAQT_REPO: https://github.com/xroche/httraqt-ci-mirror.git
|
||||
HTTRAQT_REF: a1175565c61ab9afd7bda2dc96ed1182c2d44ec3 # 1.4.11 + cmake patch, upstream HEAD since 2023-01-06
|
||||
PREFIX: /usr/local
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: build HTTraQt against this branch
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev \
|
||||
cmake qt6-base-dev qt6-multimedia-dev
|
||||
|
||||
- name: Build and install libhttrack
|
||||
run: |
|
||||
set -euo pipefail
|
||||
autoreconf -fi
|
||||
bld="$RUNNER_TEMP/bld"
|
||||
mkdir -p "$bld"
|
||||
(cd "$bld" && "$GITHUB_WORKSPACE/configure" --prefix="$PREFIX" --disable-static)
|
||||
make -C "$bld" -j"$(nproc)"
|
||||
sudo make -C "$bld" install
|
||||
sudo ldconfig
|
||||
|
||||
- name: Assert no distribution libhttrack can shadow ours
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# FindHttrack.cmake hardcodes /usr/include/httrack first, so a stray libhttrack-dev would test Debian's headers.
|
||||
for stray in /usr/include/httrack /usr/lib/libhttrack.so /usr/lib/*/libhttrack.so; do
|
||||
if [ -e "$stray" ]; then
|
||||
echo "::error::$stray exists; HTTraQt would build against it, not this branch"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
test -f "$PREFIX/include/httrack/htsglobal.h"
|
||||
|
||||
- name: Fetch HTTraQt
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# Fetching the SHA itself needs no pin check afterwards, and keeps the
|
||||
# tree out of the workspace so our own build cannot pick it up.
|
||||
rm -rf "$RUNNER_TEMP/httraqt"
|
||||
git init -q "$RUNNER_TEMP/httraqt"
|
||||
ok=
|
||||
for attempt in 1 2 3; do
|
||||
if git -C "$RUNNER_TEMP/httraqt" fetch -q --depth 1 "$HTTRAQT_REPO" "$HTTRAQT_REF"; then ok=1; break; fi
|
||||
echo "fetch failed (attempt $attempt)"
|
||||
[ "$attempt" -eq 3 ] || sleep $((attempt * 15))
|
||||
done
|
||||
[ -n "$ok" ] || { echo "::error::cannot reach $HTTRAQT_REPO"; exit 1; }
|
||||
git -C "$RUNNER_TEMP/httraqt" checkout -q --detach FETCH_HEAD
|
||||
|
||||
- name: Configure HTTraQt
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# CMAKE_MINIMUM_REQUIRED is 2.8 upstream, which CMake 4 rejects outright.
|
||||
# The redirect is load-bearing: a bare MESSAGE() is NOTICE mode, which goes to stderr.
|
||||
cmake -S "$RUNNER_TEMP/httraqt" -B "$RUNNER_TEMP/httraqt-bld" \
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
|
||||
2>&1 | tee "$RUNNER_TEMP/cmake.log"
|
||||
# A configure that resolved elsewhere would compile someone else's headers.
|
||||
grep -q "httrack header directory found: $PREFIX/include/httrack/" "$RUNNER_TEMP/cmake.log"
|
||||
|
||||
- name: Build HTTraQt
|
||||
run: cmake --build "$RUNNER_TEMP/httraqt-bld" -j"$(nproc)"
|
||||
|
||||
- name: Assert it linked against the libhttrack we just built
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# Not bin/: CMAKE_RUNTIME_OUTPUT_DIRECTORY is set after ADD_EXECUTABLE, too late.
|
||||
bin="$RUNNER_TEMP/httraqt-bld/httraqt"
|
||||
ldd "$bin" | grep -E "libhttrack\.so.* => $PREFIX/lib/" \
|
||||
|| { ldd "$bin"; exit 1; }
|
||||
12
.github/workflows/screenshots.yml
vendored
@@ -34,7 +34,7 @@ jobs:
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
||||
@@ -52,6 +52,15 @@ jobs:
|
||||
pip install --quiet playwright
|
||||
playwright install --with-deps chromium
|
||||
|
||||
# The address is on screen in the wizard panes and names the mirror folder,
|
||||
# so the crawl needs a presentable host rather than 127.0.0.1 and a random
|
||||
# port. example.com is reserved for documentation (RFC 2606).
|
||||
- name: Let the crawl address a named site on port 80
|
||||
run: |
|
||||
set -euo pipefail
|
||||
echo "127.0.0.1 www.example.com" | sudo tee -a /etc/hosts
|
||||
sudo sysctl -w net.ipv4.ip_unprivileged_port_start=80 # bind 80 unprivileged
|
||||
|
||||
- name: Capture
|
||||
env:
|
||||
LANGN: ${{ inputs.lang || '1' }}
|
||||
@@ -61,6 +70,7 @@ jobs:
|
||||
# --root is the dist root; the source tree already holds every piece
|
||||
# htsserver reads, so this needs no install.
|
||||
python3 tools/screenshot-walk.py --htsserver src/htsserver --root . \
|
||||
--site-host www.example.com --site-port 80 \
|
||||
--lang "$LANGN" --scale "$SCALE" --out shots
|
||||
|
||||
- name: Upload the screens
|
||||
|
||||
101
.github/workflows/windows-build.yml
vendored
@@ -31,6 +31,11 @@ jobs:
|
||||
matrix:
|
||||
platform: [x64, Win32]
|
||||
configuration: [Release]
|
||||
# Windows runs from other branches starve this one's runner (#1213), so cap
|
||||
# them repo-wide at one per platform. queue: max: the default cancels a waiter.
|
||||
concurrency:
|
||||
group: windows-build-${{ matrix.platform }}
|
||||
queue: max
|
||||
# Redirect vcpkg's default `files` binary cache into the workspace so
|
||||
# actions/cache can persist it. vcpkg builds openssl/brotli/zlib/zstd from
|
||||
# source otherwise, several minutes every run.
|
||||
@@ -67,17 +72,30 @@ jobs:
|
||||
run: New-Item -ItemType Directory -Force -Path $env:VCPKG_DEFAULT_BINARY_CACHE | Out-Null
|
||||
|
||||
# x-gha is gone (vcpkg-tool #1662 dropped it after GitHub changed the cache
|
||||
# API), so cache the binary archives directly. Keyed on the manifest, which
|
||||
# carries the builtin-baseline, so a Dependabot bump busts it; restore-keys
|
||||
# still seeds the unchanged ports' archives, so only the bumped one rebuilds.
|
||||
- name: Cache vcpkg binary archives
|
||||
uses: actions/cache@v6
|
||||
# API), so cache the binary archives directly. An exact key hit skips the save,
|
||||
# so a cache orphaned by a toolchain bump pins itself, and naming every input
|
||||
# vcpkg's ABI hash folds in is a list that can come up short: key on the run
|
||||
# id instead, and restore by prefix.
|
||||
- name: Restore the vcpkg binary archives
|
||||
uses: actions/cache/restore@v6
|
||||
with:
|
||||
path: ${{ github.workspace }}\vcpkg_cache
|
||||
key: vcpkg-${{ matrix.platform }}-${{ hashFiles('src/vcpkg.json') }}
|
||||
key: vcpkg-${{ matrix.platform }}-${{ hashFiles('src/vcpkg.json') }}-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
restore-keys: |
|
||||
vcpkg-${{ matrix.platform }}-${{ hashFiles('src/vcpkg.json') }}-
|
||||
vcpkg-${{ matrix.platform }}-
|
||||
|
||||
# Counted before the build, or vcpkg's own writes during it make a cold cache
|
||||
# look warm.
|
||||
- name: Count the restored vcpkg archives
|
||||
shell: pwsh
|
||||
run: |
|
||||
$a = @(Get-ChildItem -Recurse -File -Filter *.zip `
|
||||
$env:VCPKG_DEFAULT_BINARY_CACHE -EA SilentlyContinue)
|
||||
Write-Host "restored $($a.Count) archive(s)"
|
||||
$a.FullName | Out-File -FilePath vcpkg-restored.txt
|
||||
"VCPKG_ARCHIVES_BEFORE=$($a.Count)" | Out-File -FilePath $env:GITHUB_ENV -Append
|
||||
|
||||
# The runner image's vcpkg checkout is pinned to some commit; our manifest's
|
||||
# builtin-baseline is usually newer, so `git show <baseline>:versions/...`
|
||||
# fails until that commit is local. Fetch exactly the pinned baseline (read
|
||||
@@ -107,6 +125,50 @@ jobs:
|
||||
if ($LASTEXITCODE -ne 0) { throw "$proj failed" }
|
||||
}
|
||||
|
||||
# A stale cache and a warm one both restore and rebuild; only archives
|
||||
# restored and unmatched prove staleness.
|
||||
- name: Check whether vcpkg could use the restored archives
|
||||
id: vcpkg
|
||||
if: ${{ !cancelled() }}
|
||||
shell: pwsh
|
||||
run: |
|
||||
$before = [int]$env:VCPKG_ARCHIVES_BEFORE
|
||||
$stale = $false
|
||||
# The log is missing when the build never reached MSBuild.
|
||||
if (Test-Path msbuild-libhttrack.log) {
|
||||
$m = Select-String -Path msbuild-libhttrack.log -Pattern 'Restored (\d+) package' |
|
||||
Select-Object -First 1
|
||||
if ($m) {
|
||||
$restored = [int]$m.Matches[0].Groups[1].Value
|
||||
Write-Host "vcpkg restored $restored of $before archive(s)"
|
||||
$stale = ($restored -eq 0 -and $before -gt 0)
|
||||
} else { Write-Host "no vcpkg restore line in the build log" }
|
||||
} else { Write-Host "no build log" }
|
||||
if ($stale) {
|
||||
Write-Host "::warning::stale vcpkg cache: $before archives, none matching this toolchain; every port rebuilt from source"
|
||||
# Provably dead: drop them rather than carry every past toolchain
|
||||
# generation in the saved entry forever. -LiteralPath because a piped
|
||||
# string binds -Path, which globs on a name carrying [ ].
|
||||
Get-Content vcpkg-restored.txt -EA SilentlyContinue | Where-Object { $_ } |
|
||||
ForEach-Object { Remove-Item -LiteralPath $_ -Force -EA SilentlyContinue }
|
||||
}
|
||||
$after = @(Get-ChildItem -Recurse -File -Filter *.zip `
|
||||
$env:VCPKG_DEFAULT_BINARY_CACHE -EA SilentlyContinue).Count
|
||||
Write-Host "$after archive(s) to cache"
|
||||
# Pruning can leave the count unmoved while replacing every archive, so the
|
||||
# stale case saves on its own account rather than on growth.
|
||||
"save=$($stale -or ($after -gt $before))".ToLower() |
|
||||
Out-File -FilePath $env:GITHUB_OUTPUT -Append
|
||||
|
||||
# Only when the archive set changed, so a warm run adds no entry and the
|
||||
# eviction budget stays for the runs that rebuilt something.
|
||||
- name: Save the vcpkg binary archives
|
||||
if: ${{ !cancelled() && steps.vcpkg.outputs.save == 'true' }}
|
||||
uses: actions/cache/save@v6
|
||||
with:
|
||||
path: ${{ github.workspace }}\vcpkg_cache
|
||||
key: vcpkg-${{ matrix.platform }}-${{ hashFiles('src/vcpkg.json') }}-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
|
||||
# WinHTTrack links src\$(Platform)\$(Configuration)\libhttrack.lib, so the
|
||||
# import lib and the DLL both have to land there under that exact name.
|
||||
- name: Check the binaries landed where they are expected
|
||||
@@ -167,6 +229,33 @@ jobs:
|
||||
throw "CRT mismatch across the boundary: libhttrack.dll=$a httrack.exe=$b"
|
||||
}
|
||||
|
||||
# The DLL build only proves the engine's own fixed include order, the one
|
||||
# order a consumer need not use, and 205/206/207/269 all gate on an automake
|
||||
# environment this job has not (#1153).
|
||||
- name: Compile the installed headers standalone and pairwise
|
||||
shell: pwsh
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
$ErrorActionPreference = "Stop"
|
||||
$vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
|
||||
$vs = & $vswhere -latest -products * -property installationPath | Select-Object -First 1
|
||||
if (-not $vs) { throw "Visual Studio not found" }
|
||||
Import-Module "$vs\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
|
||||
$arch = if ("${{ matrix.platform }}" -eq "x64") { "x64" } else { "x86" }
|
||||
Enter-VsDevShell -VsInstallPath $vs -SkipAutomaticLocation `
|
||||
-DevCmdArguments "-arch=$arch -host_arch=x64"
|
||||
# htsbasenet.h reaches for <openssl/ssl.h> unless a consumer turns it
|
||||
# off, so the sweep needs what vcpkg installed for the build. Searched,
|
||||
# not spelled: the install root nests the triplet twice.
|
||||
$dirs = @(Get-ChildItem -Path "src\vcpkg_installed" -Recurse -Depth 3 `
|
||||
-Directory -Filter include -ErrorAction SilentlyContinue)
|
||||
if (-not ($dirs | Where-Object { Test-Path (Join-Path $_.FullName "openssl\ssl.h") })) {
|
||||
throw "no vcpkg include directory under src\vcpkg_installed holds openssl/ssl.h"
|
||||
}
|
||||
$inc = @($dirs | ForEach-Object { "-I" + $_.FullName })
|
||||
bash tests/install-headers-sweep.sh --backend cl --srcdir . -- @inc
|
||||
if ($LASTEXITCODE -ne 0) { throw "the installed headers do not compile standalone and pairwise" }
|
||||
|
||||
# The engine ships ~90 tests and none had ever run on Windows: "make check"
|
||||
# is Linux/macOS only. These are the offline ones, driven from Git Bash
|
||||
# against the native httrack.exe. They subsume the self-tests this step
|
||||
|
||||
@@ -46,6 +46,12 @@ the operational checklist: toolchain, invariants, and how to ship a change.
|
||||
platform-specific: GNU `tail | head -c 3` survives, the uutils coreutils leg
|
||||
turns the same line into exit 141 with no output at all. Let the reader seek
|
||||
instead: `od -An -c -j <skip> -N <len> file`.
|
||||
- Never assert a fault by signal *number*: SIGBUS is 7 on x86, arm, powerpc and
|
||||
s390x but 10 on hppa, alpha, mips and sparc. Map it with `kill -l "$n"`.
|
||||
- A fixture that needs a host to stay silent must settle (500ms), re-probe every
|
||||
socket, and SKIP when one answered: the powerpc and ppc64 buildds refuse
|
||||
TEST-NET-1 milliseconds after `connect()` where runners drop it.
|
||||
`tools/hostile-net.sh` runs a command on such a network.
|
||||
|
||||
## Hard invariants
|
||||
- **Generated autotools files are NOT in git.** `configure`, every
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
AC_PREREQ([2.71])
|
||||
|
||||
AC_INIT([httrack], [3.49.19], [roche+packaging@httrack.com], [httrack], [http://www.httrack.com/])
|
||||
AC_INIT([httrack], [3.49.21], [roche+packaging@httrack.com], [httrack], [http://www.httrack.com/])
|
||||
AC_COPYRIGHT([
|
||||
HTTrack Website Copier, Offline Browser for Windows and Unix
|
||||
Copyright (C) 1998-2015 Xavier Roche and other contributors
|
||||
@@ -29,6 +29,10 @@ AC_CONFIG_SRCDIR(src/httrack.c)
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
AM_INIT_AUTOMAKE([subdir-objects])
|
||||
# 3:14:0: revision-only bump. httrackp gained a tail field (host_alias) and #1202
|
||||
# added an export (hts_host_alias_rule_ok); no layout moved, nothing went away.
|
||||
# 3:13:0: revision-only bump. htsstrings.h's StringRoomTotal grew saturation in
|
||||
# its macro body; no installed struct moved and no export came or went.
|
||||
# 3:12:0: revision-only bump. httrackp gained a tail field (singlefile_state) and
|
||||
# htsopt.h added volatile qualifiers; no layout moved, nothing went away.
|
||||
# 3:11:0: revision-only bump. #1001 moved SOCaddr_inetntoa_ out of htsnet.h, adding
|
||||
@@ -42,7 +46,7 @@ AM_INIT_AUTOMAKE([subdir-objects])
|
||||
# moves nothing). Soname stays .so.3: HTTrackQt is the only consumer of the installed
|
||||
# headers, so a libhttrack4 rename isn't worth it.
|
||||
# (3:0:0 was the htsblk mime-buffer widening, the ABI break that moved .so.2 -> .so.3.)
|
||||
VERSION_INFO="3:12:0"
|
||||
VERSION_INFO="3:14:0"
|
||||
AM_MAINTAINER_MODE
|
||||
AC_USE_SYSTEM_EXTENSIONS
|
||||
|
||||
|
||||
19
debian/changelog
vendored
@@ -1,3 +1,22 @@
|
||||
httrack (3.49.21-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release: a site answering to several hostnames can now be
|
||||
mirrored once rather than once per name, plus fixes to mirror
|
||||
interruption, to an update pass that purged files it had never reached,
|
||||
and to several buffer overflows; full list in history.txt.
|
||||
|
||||
-- Xavier Roche <xavier@debian.org> Wed, 12 Aug 2026 15:05:15 +0200
|
||||
|
||||
httrack (3.49.20-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release: an off-site link that looked like a file could pull
|
||||
in the whole foreign site, and a mirror asked to stop while receiving over
|
||||
FTP hung; full list in history.txt. The documentation was also refreshed.
|
||||
* debian/copyright: record the League Spartan webfont the documentation now
|
||||
bundles (OFL-1.1).
|
||||
|
||||
-- Xavier Roche <xavier@debian.org> Mon, 10 Aug 2026 21:08:40 +0200
|
||||
|
||||
httrack (3.49.19-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release: mostly FTP fixes, plus stack-overflow, mirror
|
||||
|
||||
95
debian/copyright
vendored
@@ -44,6 +44,13 @@ License: FSFAP
|
||||
permitted in any medium without royalty provided the copyright notice and
|
||||
this notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
Files: html/fonts/*
|
||||
Copyright: 2020 The League Spartan Project Authors
|
||||
License: OFL-1.1
|
||||
Comment:
|
||||
The woff2 is the latin subset at weight 700, as served by Google Fonts.
|
||||
Upstream declares no Reserved Font Name, so the subset keeps the family name.
|
||||
|
||||
Files: debian/*
|
||||
Copyright: 2002-2026 Xavier Roche <xavier@debian.org>
|
||||
License: GPL-3+
|
||||
@@ -106,3 +113,91 @@ License: BSD-3-clause
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
License: OFL-1.1
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
.
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
.
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
.
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
.
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
.
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
.
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
.
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
.
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
.
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
.
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
.
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
.
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
.
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
.
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
.
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
|
||||
31
history.txt
@@ -4,6 +4,37 @@ HTTrack Website Copier release history:
|
||||
|
||||
This file lists all changes and fixes that have been made for HTTrack
|
||||
|
||||
3.49-21
|
||||
+ New: --host-alias (-%C) folds the several hostnames of one site onto a single canonical host, so a site that answers under more than one hostname is fetched once instead of once per name (#16)
|
||||
+ New: the WebHTTrack wizard can set the host-alias rules and the guide documents them for every front end; a malformed rule is refused where it can still be corrected, through a newly exported hts_host_alias_rule_ok() (#1161, #1172, #1192)
|
||||
+ Fixed: any signal caught during a mirror killed every transfer in flight, so a burst of them silently truncated the mirror; a stop now ends an HTTP transfer as the user's stop rather than a fabricated receive error (#1110)
|
||||
+ Fixed: stopping an FTP transfer against a silent server waited out --timeout twice, once on the data socket and again on a QUIT reply nobody was going to send (#1096)
|
||||
+ Fixed: a crawl that ended early ran --update's purge against the files it had never reached, deleting good ones (#1109)
|
||||
+ Fixed: a long URL overflowed the duplicate-detection key buffer (#1160)
|
||||
+ Fixed: a long command line, a large doit.log or a large .httrackrc aborted the engine while it rebuilt its arguments (#1189, #1198)
|
||||
+ Fixed: a scan rule beginning with a dash ended the whole run (#1179)
|
||||
+ Fixed: --index=0 and --noindex enabled the index rather than disabling it, and --purge-old=1 killed the run; an option that takes no value now refuses one instead of silently dropping it (#1195, #1200)
|
||||
+ Fixed: reloading a WebHTTrack project lost every zero and every cleared field, so a rate limit of 0 came back as 100 KB/s and a cleared user-agent refilled itself (#1177, #1171, #1186)
|
||||
+ Fixed: the wizard kept only the last of several --strip-query rules, and its domain answers matched beyond the domain they named (#1168, #1119)
|
||||
+ Fixed: the offer to resume an interrupted mirror printed the program path instead of the command line it would rerun (#1204)
|
||||
+ Fixed: the build failed where getrandom() has no declaration, and the installed headers did not compile under some include orders (#1139, #1150, #1151)
|
||||
+ Changed: the documentation and the WebHTTrack pages compute their copyright year instead of carrying a fixed one (#1163, #1165)
|
||||
+ Changed: refreshed the guide screenshots for all three interfaces, and repaired the documentation's dark mode and its search-target tabs (#1164, #1158)
|
||||
+ Changed: multiple internal hardening, build, test and CI improvements
|
||||
|
||||
3.49-20
|
||||
+ Fixed: a link to another host whose name looked like a file was scanned as a page, so one link could mirror the whole foreign site on the referring page's depth budget (#121)
|
||||
+ Fixed: a size-bounded filter built both of its filter URLs wrong when the path had no leading slash (#1095)
|
||||
+ Fixed: a mirror told to quit while an FTP file was being received announced the exit and then waited forever on that slot (#1106)
|
||||
+ Fixed: stopping an FTP transfer closed its data socket twice, so a threaded crawl could lose another worker's connection (#1090)
|
||||
+ Fixed: WebHTTrack's welcome page opened its language menu blank instead of marking the language in use (#1084)
|
||||
+ Fixed: two suite tests failed on the hppa, powerpc and ppc64 Debian buildds, holding the package back on those ports (#1108)
|
||||
+ Fixed: a growable string could wrap its capacity to zero instead of saturating (#1062)
|
||||
+ Changed: the macOS disk image carries its architecture in its name, so an Intel user can tell before downloading that the build is for Apple Silicon (#1083)
|
||||
+ Changed: refreshed the GUI guide, its screenshots, the documentation typography and the footer contrast
|
||||
+ Changed: settled on one spelling of the product name across the docs and the site
|
||||
+ Changed: multiple internal hardening, build, test and CI improvements
|
||||
|
||||
3.49-19
|
||||
+ Fixed: an over-long user name in an ftp:// URL was truncated at the credential boundary, so the login went to a different account (#1032)
|
||||
+ Fixed: an over-long FTP path or host name aborted the process instead of failing that one link (#1019)
|
||||
|
||||
@@ -4,6 +4,7 @@ HelpHtmldir = $(htmldir)
|
||||
HelpHtmlimgdir = $(HelpHtmldir)/img
|
||||
HelpHtmldivdir = $(HelpHtmldir)/div
|
||||
HelpHtmlimagesdir = $(HelpHtmldir)/images
|
||||
HelpHtmlfontsdir = $(HelpHtmldir)/fonts
|
||||
HelpHtmlTxtdir = $(HelpHtmldir)
|
||||
WebHtmldir = $(HelpHtmldir)/server
|
||||
WebHtmlimagesdir = $(HelpHtmldir)/server/images
|
||||
@@ -27,6 +28,8 @@ HelpHtml_DATA = $(srcdir)/*.html $(srcdir)/*.js $(srcdir)/*.css
|
||||
HelpHtmldiv_DATA = div/search.sh
|
||||
HelpHtmlimg_DATA = $(srcdir)/img/*
|
||||
HelpHtmlimages_DATA = $(srcdir)/images/*
|
||||
# doc.css reaches the woff2 by a relative URL, so it installs beside the pages.
|
||||
HelpHtmlfonts_DATA = $(srcdir)/fonts/*
|
||||
HelpHtmlTxt_DATA = ../greetings.txt ../history.txt ../license.txt
|
||||
WebHtml_DATA = $(srcdir)/server/*.html $(srcdir)/server/*.js $(srcdir)/server/*.css
|
||||
WebHtmlimages_DATA = $(srcdir)/server/images/*
|
||||
@@ -45,6 +48,7 @@ VFolderEntry_DATA = $(srcdir)/server/div/*.desktop
|
||||
MetaInfo_DATA = $(srcdir)/server/div/*.metainfo.xml
|
||||
|
||||
EXTRA_DIST = $(HelpHtml_DATA) $(HelpHtmlimg_DATA) $(HelpHtmlimages_DATA) \
|
||||
$(HelpHtmlfonts_DATA) \
|
||||
$(HelpHtmldiv_DATA) $(WebHtml_DATA) $(WebHtmlimages_DATA) \
|
||||
$(WebPixmap_DATA) $(WebIcon16x16_DATA) $(WebIcon32x32_DATA) $(WebIcon48x48_DATA) \
|
||||
$(WebIcon64x64_DATA) $(WebIcon128x128_DATA) $(WebIcon256x256_DATA) \
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -534,9 +536,14 @@ And then, put the email address in your pages through:
|
||||
</div>
|
||||
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -75,8 +77,8 @@ The main advantages of this cache are:
|
||||
|
||||
<ul>
|
||||
<li>One single file for a complete website cache archive</li>
|
||||
<li>Standard <a href="http://www.pkware.com/products/enterprise/white_papers/appnote.txt" target="_new">ZIP</a> format, that can be easily reused on most platforms and languages</li>
|
||||
<li>Compressed data with the efficient and opened <a href="http://www.gzip.org/zlib/" target="_new">zlib</a> format</li>
|
||||
<li>Standard <a href="http://www.pkware.com/products/enterprise/white_papers/appnote.txt" target="_blank">ZIP</a> format, that can be easily reused on most platforms and languages</li>
|
||||
<li>Compressed data with the efficient and opened <a href="http://www.gzip.org/zlib/" target="_blank">zlib</a> format</li>
|
||||
</ul>
|
||||
|
||||
The cache is made of ZIP files entries ; with one ZIP file entry per fetched URL (successfully or not - errors are also stored).<br />
|
||||
@@ -84,7 +86,7 @@ For each entry:
|
||||
<ul>
|
||||
<li>The ZIP file name is the original URL [<small><a href="#orig">see notes below</a></small>]</li>
|
||||
<li>The ZIP file contents, <b>if available</b>, is the original (compressed, using the deflate algorythm) data</li>
|
||||
<li>The ZIP file extra field (in the local file header) contains a list of meta-fields, very similar to the <a href="http://www.ietf.org/rfc/rfc2616.txt?number=2616" target="new_">HTTP</a> headers fields. See also <a href="http://www.ietf.org/rfc/rfc2396.txt?number=2396" target="new_">RFC</a>.</li><br />
|
||||
<li>The ZIP file extra field (in the local file header) contains a list of meta-fields, very similar to the <a href="http://www.ietf.org/rfc/rfc2616.txt?number=2616" target="_blank">HTTP</a> headers fields. See also <a href="http://www.ietf.org/rfc/rfc2396.txt?number=2396" target="_blank">RFC</a>.</li><br />
|
||||
<li>The ZIP file timestamp follows the "Last-Modified-Since" field given for this URL, if any</li>
|
||||
</ul>
|
||||
|
||||
@@ -230,9 +232,14 @@ Libraries should generally handle this peculiar format, however.
|
||||
</div>
|
||||
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -211,9 +213,14 @@ scope: both change what a mirror directory contains.</li>
|
||||
</div>
|
||||
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -117,6 +119,7 @@ the index" problems disappear.</p>
|
||||
<tr class="head"><td><b>Option</b></td><td><b>What it controls</b></td></tr>
|
||||
<tr><td><tt>--depth (-r)</tt></td><td>Maximum link depth. <b>The start page is level 1</b>, so one level of links out is <tt>-r2</tt>, not <tt>-r1</tt>.</td></tr>
|
||||
<tr><td><tt>--stay-on-same-address (-a), --stay-on-same-domain (-d), --stay-on-same-tld (-l), --go-everywhere (-e)</tt></td><td>How far off the starting host the crawl may travel: same address (host), same principal domain, same top-level domain (for example .com), or everywhere. The default keeps you on the starting host.</td></tr>
|
||||
<tr><td><tt>--host-alias (-%C)</tt></td><td>Declares that several hostnames serve the same site, for example <tt>--host-alias "www2.example.com,m.example.com=example.com"</tt>. Those names then count as the starting host: their links travel under the same-address rules, are fetched from the canonical host, and are saved once rather than once per name. The left side takes filter-style globs and comma-separated names, the right side one literal host, port included. Either side may name a scheme (<tt>legacy.example.com=https://example.com</tt> reaches a host that only answers over HTTPS, and <tt>https://www.example.com=ftp://files.example.com</tt> matches only the HTTPS form). A path is refused: this maps hosts, not URLs.</td></tr>
|
||||
<tr><td><tt>--can-go-down (-D), --can-go-up (-U), --stay-on-same-dir (-S), --can-go-up-and-down (-B)</tt></td><td>Directory travel: down into subdirectories only, up to parent directories only, stay in the same directory, or both up and down.</td></tr>
|
||||
<tr><td><tt>--near (-n)</tt></td><td>Also fetch non-HTML files "near" a followed link, such as an image linked from a page you kept but hosted elsewhere.</td></tr>
|
||||
<tr><td><tt>--ext-depth (-%e)</tt></td><td>How many levels of external links to follow once the crawl leaves your scope (default 0).</td></tr>
|
||||
@@ -146,7 +149,9 @@ usually not a scope option at all: it is an off-host redirect. A start URL of
|
||||
<tt>http://example.com/</tt> that redirects to <tt>https://www.example.com/</tt>
|
||||
lands you on a different host, and same-host scope stops the crawl there. Start
|
||||
from the final URL, or add a filter that re-admits the real host (see
|
||||
<a href="#filters">Filters</a>). The log will show the redirect.</p>
|
||||
<a href="#filters">Filters</a>). The log will show the redirect. When both names
|
||||
really are one site, <tt>--host-alias</tt> says so once and the mirror stops
|
||||
depending on which one you started from.</p>
|
||||
|
||||
<p><tt>-n</tt> is the fix for pages that render locally without their images or
|
||||
stylesheets: it lets HTTrack pull in requisites that sit just outside scope. Note
|
||||
@@ -503,9 +508,14 @@ all disabled.</small></p>
|
||||
</div>
|
||||
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -23,12 +23,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -206,9 +208,14 @@ roche at httrack dot com (Xavier ROCHE)<br>
|
||||
</div>
|
||||
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -103,9 +105,14 @@ compared to the previous mirror. This page describes that file.
|
||||
</div>
|
||||
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
48
html/doc.css
@@ -32,6 +32,20 @@
|
||||
}
|
||||
}
|
||||
|
||||
/* Additions stay out of the palette block above: it is kept byte-identical with the website's. */
|
||||
:root {
|
||||
--body-font: system-ui, -apple-system, "Segoe UI", Roboto, "Trebuchet MS", Verdana, sans-serif;
|
||||
}
|
||||
|
||||
/* Relative URL: the docs are read from an installed directory too. */
|
||||
@font-face {
|
||||
font-family: "League Spartan";
|
||||
src: url(fonts/league-spartan-700-latin.woff2) format("woff2");
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
* { box-sizing: border-box; }
|
||||
|
||||
/* The plain declaration before each var() is what IE11 gets: it drops the
|
||||
@@ -44,6 +58,7 @@ body {
|
||||
color: #111;
|
||||
color: var(--ink);
|
||||
font: 1em/1.6 "Trebuchet MS", Verdana, system-ui, -apple-system, "Segoe UI", sans-serif;
|
||||
font-family: var(--body-font);
|
||||
}
|
||||
|
||||
/* ---- page frame ---- */
|
||||
@@ -72,7 +87,6 @@ body {
|
||||
/* A one-line label has no use for the body's prose leading. */
|
||||
line-height: 1;
|
||||
padding: .3rem .4rem;
|
||||
margin-top: .4rem;
|
||||
}
|
||||
|
||||
.wrap {
|
||||
@@ -106,11 +120,18 @@ body {
|
||||
.wrap.solo { display: block; }
|
||||
}
|
||||
|
||||
/* Colour inherited: nothing lighter than --ink reaches 4.5:1 on the --field
|
||||
this sits on, and at this size it is small text. */
|
||||
/* Mirrors site.css's .sitefooter: flush on the panel's black edge, chicklet at the far end. */
|
||||
footer {
|
||||
max-width: 68rem;
|
||||
margin: .5rem auto 0;
|
||||
color: #eef;
|
||||
margin: 0 auto;
|
||||
font-size: .8em;
|
||||
line-height: 1.3;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
@@ -121,6 +142,9 @@ footer {
|
||||
|
||||
h2, h3 { scroll-margin-top: 1rem; }
|
||||
|
||||
/* Top two levels only: a display face reads worse than the system font over prose. */
|
||||
h1, h2 { font-family: "League Spartan", var(--body-font); font-weight: 700; }
|
||||
|
||||
h1 { font-size: 1.9em; margin: 0 0 .3em; line-height: 1.2; }
|
||||
h2 { font-size: 1.45em; margin: 2.5em 0 .5em; padding-bottom: .2em; border-bottom: 2px solid var(--rule); }
|
||||
h3 { font-size: 1.15em; margin: 2em 0 .4em; }
|
||||
@@ -342,8 +366,26 @@ dialog#zoom::backdrop { background: rgba(0, 0, 0, .8); }
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
/* Some browsers still apply prefers-color-scheme: dark when printing, so the ink
|
||||
comes out #e6e6ee on white paper. Reset the palette, not each rule reading it. */
|
||||
@media print {
|
||||
:root {
|
||||
--field: #77b;
|
||||
--panel: #ccd;
|
||||
--accent: #99c;
|
||||
--ink: #111;
|
||||
--ink-soft: #444;
|
||||
--rule: #aab;
|
||||
--link: #00c;
|
||||
--link-hover: #c00;
|
||||
--code-bg: #e8e8f2;
|
||||
--chip: #dde;
|
||||
--shadow: rgba(0, 0, 0, .25);
|
||||
}
|
||||
|
||||
body { background: #fff; }
|
||||
.toc, .filter { display: none; }
|
||||
.wrap { display: block; border: 0; }
|
||||
/* Not a token, same paper: the dark scheme inverts the wordmark to white. */
|
||||
.masthead img { filter: none; }
|
||||
}
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -318,7 +320,7 @@ However, be sure to always download HTTrack from a <b>trusted source</b> (prefer
|
||||
|
||||
<br><br><a NAME="QG0c">Q: <strong>This software is 'free', but I bought it from an authorized reseller . What's going on?</strong></a><br>
|
||||
A: <em>
|
||||
HTTrack is free (free as in 'freedom') as it is covered by the <a href="http://www.gnu.org/licenses/gpl.txt" target="_new">GNU General Public License (GPL)</a>.
|
||||
HTTrack is free (free as in 'freedom') as it is covered by the <a href="http://www.gnu.org/licenses/gpl.txt" target="_blank">GNU General Public License (GPL)</a>.
|
||||
You can freely download it, without paying any fees, copy it to your friends, and modify it if you respect the license.
|
||||
There are NO official/authorized resellers, because HTTrack is <b>NOT</b> a commercial product.
|
||||
But you can be charged for duplication fees, or any other services (example: software CDroms or shareware collections, or fees for maintenance),
|
||||
@@ -881,9 +883,14 @@ A: <em>Feel free to <a href="contact.html">contact us</a>!
|
||||
</div>
|
||||
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -174,7 +176,7 @@ Action options:
|
||||
|
||||
Proxy options:
|
||||
P proxy use (-P proxy:port or -P user:pass@proxy:port) (--proxy <param>)
|
||||
%f *use proxy for ftp (f0 don't use) (--httpproxy-ftp[=N])
|
||||
%f *use proxy for ftp (f0 don't use) (--httpproxy-ftp[=0])
|
||||
|
||||
Limits options:
|
||||
rN set the mirror depth to N (* r9999) (--depth[=N])
|
||||
@@ -195,7 +197,7 @@ Flow control:
|
||||
HN host is abandoned if: 0=never, 1=timeout, 2=slow, 3=timeout or slow (--host-control[=N])
|
||||
|
||||
Links options:
|
||||
%P *extended parsing, attempt to parse all links, even in unknown tags or Javascript (%P0 don't use) (--extended-parsing[=N])
|
||||
%P *extended parsing, attempt to parse all links, even in unknown tags or Javascript (%P0 don't use) (--extended-parsing[=0])
|
||||
n get non-html files 'near' an html file (ex: an image located outside) (--near)
|
||||
t test all URLs (even forbidden ones) (--test)
|
||||
%L <file> add all URL located in this text file (one URL per line) (--list <param>)
|
||||
@@ -209,7 +211,7 @@ Build options:
|
||||
%x do not include any password for external password protected websites (%x0 include) (--no-passwords)
|
||||
%q *include query string for local files (useless, for information purpose only) (%q0 don't include) (--include-query-string)
|
||||
o *save the server's error pages (404..) (o0 discard them) (--generate-errors)
|
||||
X *purge old files after update (X0 keep delete) (--purge-old[=N])
|
||||
X *purge old files after update (X0 keep delete) (--purge-old[=0])
|
||||
|
||||
Spider options:
|
||||
bN accept cookies in cookies.txt (0=do not accept,* 1=accept) (--cookies[=N])
|
||||
@@ -2669,9 +2671,14 @@ for only 2 simultaneous sesions.
|
||||
</div>
|
||||
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -416,9 +418,14 @@ See also: The <a href="faq.html#VF1">FAQ</a><br>
|
||||
</div>
|
||||
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
93
html/fonts/OFL.txt
Normal file
@@ -0,0 +1,93 @@
|
||||
Copyright 2020 The League Spartan Project Authors (https://github.com/theleagueof/league-spartan)
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
https://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
BIN
html/fonts/league-spartan-700-latin.woff2
Normal file
@@ -13,12 +13,14 @@
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -120,13 +122,13 @@ data-for="droid">Tap <b>Next</b></span> to create a project, or open one you alr
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-start.png" alt="WinHTTrack welcome pane" width="1040" height="744">
|
||||
<img data-for="web" src="img/guide-web-start.png" alt="WebHTTrack welcome page" width="1024" height="388">
|
||||
<img data-for="web" src="img/guide-web-start.png" alt="WebHTTrack welcome page" width="1024" height="387">
|
||||
<img data-for="droid" src="img/guide-droid-start.png" alt="HTTrack for Android welcome screen" width="600" height="1300">
|
||||
<figcaption>The welcome screen.</figcaption>
|
||||
</figure>
|
||||
|
||||
<p class="note" data-for="web">The language dropdown starts blank on purpose: its first entry
|
||||
means "leave the interface as it is". Pick a language only if you want to change it.</p>
|
||||
<p class="note" data-for="web">The dropdown shows the language the interface is already in.
|
||||
Picking another one reloads the page in it.</p>
|
||||
|
||||
<p class="note" data-for="web">On macOS, <code>brew install httrack</code> installs WebHTTrack
|
||||
alongside the command line tool. Open <b>HTTrack.app</b> if you have it, or run
|
||||
@@ -141,7 +143,7 @@ together in the list.</p>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-project-name.png" alt="WinHTTrack project name, category and base path" width="1040" height="744">
|
||||
<img data-for="web" src="img/guide-web-project-name.png" alt="WebHTTrack project name, category and base path" width="1024" height="346">
|
||||
<img data-for="web" src="img/guide-web-project-name.png" alt="WebHTTrack project name, category and base path" width="1024" height="345">
|
||||
<img data-for="droid" src="img/guide-droid-project-name.png" alt="Android project name, category and base path" width="600" height="1300">
|
||||
<figcaption>Project name, category, and where the files go.</figcaption>
|
||||
</figure>
|
||||
@@ -160,7 +162,7 @@ keep their links to each other.</p>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-project-setup.png" alt="WinHTTrack action and web addresses" width="1040" height="744">
|
||||
<img data-for="web" src="img/guide-web-project-setup.png" alt="WebHTTrack action and web addresses" width="1024" height="496">
|
||||
<img data-for="web" src="img/guide-web-project-setup.png" alt="WebHTTrack action and web addresses" width="1024" height="495">
|
||||
<img data-for="droid" src="img/guide-droid-project-setup.png" alt="Android web address and action" width="600" height="1300">
|
||||
<figcaption>The addresses to copy, and what to do with them.</figcaption>
|
||||
</figure>
|
||||
@@ -215,7 +217,7 @@ port, you point your browser at it as a proxy and click the link or the submit b
|
||||
usual, and the address the browser asks for is added to the project.</p>
|
||||
|
||||
<figure data-for="web">
|
||||
<img data-for="web" src="img/guide-web-add-url.png" alt="WebHTTrack add-a-URL dialog" width="1024" height="634">
|
||||
<img data-for="web" src="img/guide-web-add-url.png" alt="WebHTTrack add-a-URL dialog" width="1024" height="600">
|
||||
<figcaption>Adding a single address, with an optional login.</figcaption>
|
||||
</figure>
|
||||
|
||||
@@ -244,7 +246,7 @@ mirror straight away.</p>
|
||||
|
||||
<figure data-for="win web">
|
||||
<img data-for="win" src="img/guide-win-ready.png" alt="WinHTTrack connection settings before starting" width="1040" height="744">
|
||||
<img data-for="web" src="img/guide-web-ready.png" alt="WebHTTrack ready to start" width="1024" height="508">
|
||||
<img data-for="web" src="img/guide-web-ready.png" alt="WebHTTrack ready to start" width="1024" height="489">
|
||||
<figcaption>The last screen before the mirror runs.</figcaption>
|
||||
</figure>
|
||||
|
||||
@@ -277,7 +279,7 @@ mirrored pages are rewritten to point at each other, so it browses offline in an
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-finished.png" alt="WinHTTrack mirror complete" width="1040" height="744">
|
||||
<img data-for="web" src="img/guide-web-finished.png" alt="WebHTTrack mirror complete" width="1024" height="487">
|
||||
<img data-for="web" src="img/guide-web-finished.png" alt="WebHTTrack mirror complete" width="1024" height="486">
|
||||
<img data-for="droid" src="img/guide-droid-finished.png" alt="Android mirror complete" width="600" height="1300">
|
||||
<figcaption>Done.</figcaption>
|
||||
</figure>
|
||||
@@ -441,7 +443,7 @@ bottom are the ones that keep you welcome.</p>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-flow-control.png" alt="WinHTTrack Flow Control tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-flow-control.png" alt="WebHTTrack Flow Control tab" width="1024" height="910">
|
||||
<img data-for="web" src="img/guide-web-opt-flow-control.png" alt="WebHTTrack Flow Control tab" width="1024" height="862">
|
||||
<img data-for="droid" src="img/guide-droid-opt-flow-control.png" alt="Android Flow Control tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
@@ -484,7 +486,7 @@ bottom are the ones that keep you welcome.</p>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-links.png" alt="WinHTTrack Links tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-links.png" alt="WebHTTrack Links tab" width="1024" height="781">
|
||||
<img data-for="web" src="img/guide-web-opt-links.png" alt="WebHTTrack Links tab" width="1024" height="749">
|
||||
<img data-for="droid" src="img/guide-droid-opt-links.png" alt="Android Links tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
@@ -521,7 +523,7 @@ bottom are the ones that keep you welcome.</p>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-build.png" alt="WinHTTrack Build tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-build.png" alt="WebHTTrack Build tab" width="1024" height="986">
|
||||
<img data-for="web" src="img/guide-web-opt-build.png" alt="WebHTTrack Build tab" width="1024" height="976">
|
||||
<img data-for="droid" src="img/guide-droid-opt-build.png" alt="Android Build tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
@@ -587,7 +589,7 @@ bottom are the ones that keep you welcome.</p>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-browser-id.png" alt="WinHTTrack Browser ID tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-browser-id.png" alt="WebHTTrack Browser ID tab" width="1024" height="706">
|
||||
<img data-for="web" src="img/guide-web-opt-browser-id.png" alt="WebHTTrack Browser ID tab" width="1024" height="654">
|
||||
<img data-for="droid" src="img/guide-droid-opt-browser-id.png" alt="Android Browser ID tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
@@ -627,7 +629,7 @@ bottom are the ones that keep you welcome.</p>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-spider.png" alt="WinHTTrack Spider tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-spider.png" alt="WebHTTrack Spider tab" width="1024" height="1557">
|
||||
<img data-for="web" src="img/guide-web-opt-spider.png" alt="WebHTTrack Spider tab" width="1024" height="1770">
|
||||
<img data-for="droid" src="img/guide-droid-opt-spider.png" alt="Android Spider tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
@@ -701,11 +703,23 @@ bottom are the ones that keep you welcome.</p>
|
||||
mirror something that needs you logged in, by exporting the session from your browser.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt" data-for="win web">
|
||||
<div class="opt" data-for="win web droid">
|
||||
<div class="opt-head"><span class="opt-name">Strip query keys</span><span class="cli">-%g, --strip-query</span></div>
|
||||
<p>Comma-separated query keys to drop when naming saved files, such as
|
||||
<code>sid,utm_source</code>. Keeps one page from being saved several times under tracking
|
||||
parameters that change nothing.</p>
|
||||
parameters that change nothing. You can scope a rule to the addresses it covers, for example
|
||||
<code>shop.example.com/*=sid</code>.</p>
|
||||
<p data-for="web">The box takes one rule per line. Only the last matching rule applies, so keep
|
||||
the keys for one scope together on a line rather than on lines of their own.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt" data-for="win web droid">
|
||||
<div class="opt-head"><span class="opt-name">Host aliases</span><span class="cli">-%C, --host-alias</span></div>
|
||||
<p>Names the other hostnames one site answers to, one rule per line, written
|
||||
<code>www2.example.com,m.example.com=example.com</code>. They fold onto that host: their links
|
||||
travel under the same rules and each page is saved once instead of once per name. Either side may
|
||||
carry a scheme, as in <code>legacy.example.com=https://example.com</code>. A trailing slash is
|
||||
ignored, but a path is refused: this maps hosts, not addresses.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -714,7 +728,7 @@ bottom are the ones that keep you welcome.</p>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-proxy.png" alt="WinHTTrack Proxy tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-proxy.png" alt="WebHTTrack Proxy tab" width="1024" height="762">
|
||||
<img data-for="web" src="img/guide-web-opt-proxy.png" alt="WebHTTrack Proxy tab" width="1024" height="760">
|
||||
<img data-for="droid" src="img/guide-droid-opt-proxy.png" alt="Android Proxy tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
@@ -751,7 +765,7 @@ bottom are the ones that keep you welcome.</p>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-log-index-cache.png" alt="WinHTTrack Log, Index, Cache tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-log-index-cache.png" alt="WebHTTrack Log, Index, Cache tab" width="1024" height="1278">
|
||||
<img data-for="web" src="img/guide-web-opt-log-index-cache.png" alt="WebHTTrack Log, Index, Cache tab" width="1024" height="1266">
|
||||
<img data-for="droid" src="img/guide-droid-opt-log-index-cache.png" alt="Android Log, Index, Cache tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
@@ -850,7 +864,7 @@ bottom are the ones that keep you welcome.</p>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-experts-only.png" alt="WinHTTrack Experts Only tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-experts-only.png" alt="WebHTTrack Experts Only tab" width="1024" height="1088">
|
||||
<img data-for="web" src="img/guide-web-opt-experts-only.png" alt="WebHTTrack Experts Only tab" width="1024" height="1085">
|
||||
<img data-for="droid" src="img/guide-droid-opt-experts-only.png" alt="Android Experts Only tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
@@ -913,7 +927,12 @@ are how you widen a crawl deliberately.</p>
|
||||
|
||||
<dialog id="zoom" aria-label="Enlarged screenshot"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -76,7 +76,7 @@ offline browser : copy websites to a local directory</p>
|
||||
[ <b>-w, --mirror</b> ] [ <b>-W, --mirror-wizard</b> ] [
|
||||
<b>-g, --get-files</b> ] [ <b>-i, --continue</b> ] [ <b>-Y,
|
||||
--mirrorlinks</b> ] [ <b>-P, --proxy</b> ] [ <b>-%f,
|
||||
--httpproxy-ftp[=N]</b> ] [ <b>-%b, --bind</b> ] [ <b>-rN,
|
||||
--httpproxy-ftp[=0]</b> ] [ <b>-%b, --bind</b> ] [ <b>-rN,
|
||||
--depth[=N]</b> ] [ <b>-%eN, --ext-depth[=N]</b> ] [ <b>-mN,
|
||||
--max-files[=N]</b> ] [ <b>-MN, --max-size[=N]</b> ] [
|
||||
<b>-EN, --max-time[=N]</b> ] [ <b>-AN, --max-rate[=N]</b> ]
|
||||
@@ -85,48 +85,50 @@ offline browser : copy websites to a local directory</p>
|
||||
--sockets[=N]</b> ] [ <b>-TN, --timeout[=N]</b> ] [ <b>-RN,
|
||||
--retries[=N]</b> ] [ <b>-JN, --min-rate[=N]</b> ] [ <b>-HN,
|
||||
--host-control[=N]</b> ] [ <b>-%P,
|
||||
--extended-parsing[=N]</b> ] [ <b>-n, --near</b> ] [ <b>-t,
|
||||
--extended-parsing[=0]</b> ] [ <b>-n, --near</b> ] [ <b>-t,
|
||||
--test</b> ] [ <b>-%L, --list</b> ] [ <b>-%S, --urllist</b>
|
||||
] [ <b>-%m, --sitemap</b> ] [ <b>-NN, --structure[=N]</b> ]
|
||||
[ <b>-%N, --delayed-type-check</b> ] [ <b>-%D,
|
||||
--cached-delayed-type-check</b> ] [ <b>-%M, --mime-html</b>
|
||||
] [ <b>-%Z, --single-file</b> ] [ <b>-LN,
|
||||
--long-names[=N]</b> ] [ <b>-KN, --keep-links[=N]</b> ] [
|
||||
<b>-x, --replace-external</b> ] [ <b>-%x,
|
||||
--disable-passwords</b> ] [ <b>-%q,
|
||||
--include-query-string</b> ] [ <b>-%g, --strip-query</b> ] [
|
||||
<b>-o, --generate-errors</b> ] [ <b>-X, --purge-old[=N]</b>
|
||||
] [ <b>-%p, --preserve</b> ] [ <b>-%T, --utf8-conversion</b>
|
||||
[ <b>-%N, --delayed-type-check[=N]</b> ] [ <b>-%D,
|
||||
--cached-delayed-type-check[=0]</b> ] [ <b>-%M,
|
||||
--mime-html[=0]</b> ] [ <b>-%Z, --single-file[=0]</b> ] [
|
||||
<b>-LN, --long-names[=N]</b> ] [ <b>-KN,
|
||||
--keep-links[=N]</b> ] [ <b>-x, --replace-external</b> ] [
|
||||
<b>-%x, --disable-passwords[=0]</b> ] [ <b>-%q,
|
||||
--include-query-string[=0]</b> ] [ <b>-%g, --strip-query</b>
|
||||
] [ <b>-%C, --host-alias</b> ] [ <b>-o,
|
||||
--generate-errors[=N]</b> ] [ <b>-X, --purge-old[=0]</b> ] [
|
||||
<b>-%p, --preserve</b> ] [ <b>-%T, --utf8-conversion[=0]</b>
|
||||
] [ <b>-bN, --cookies[=N]</b> ] [ <b>-%K, --cookies-file</b>
|
||||
] [ <b>-%Y, --why</b> ] [ <b>-u, --check-type[=N]</b> ] [
|
||||
<b>-j, --parse-java[=N]</b> ] [ <b>-sN, --robots[=N]</b> ] [
|
||||
<b>-%h, --http-10</b> ] [ <b>-%k, --keep-alive</b> ] [
|
||||
<b>-%z, --disable-compression</b> ] [ <b>-%B, --tolerant</b>
|
||||
] [ <b>-%s, --updatehack</b> ] [ <b>-%u, --urlhack</b> ] [
|
||||
<b>-%A, --assume</b> ] [ <b>-@iN, --protocol[=N]</b> ] [
|
||||
<b>-%w, --disable-module</b> ] [ <b>-F, --user-agent</b> ] [
|
||||
<b>-%R, --referer</b> ] [ <b>-%E, --from</b> ] [ <b>-%F,
|
||||
--footer</b> ] [ <b>-%l, --language</b> ] [ <b>-%a,
|
||||
--accept</b> ] [ <b>-%X, --headers</b> ] [ <b>-C,
|
||||
--cache[=N]</b> ] [ <b>-k, --store-all-in-cache</b> ] [
|
||||
<b>-%r, --warc</b> ] [ <b>-%d, --changes</b> ] [ <b>-%n,
|
||||
--do-not-recatch</b> ] [ <b>-%v, --display</b> ] [ <b>-Q,
|
||||
--do-not-log</b> ] [ <b>-q, --quiet</b> ] [ <b>-z,
|
||||
--extra-log</b> ] [ <b>-Z, --debug-log</b> ] [ <b>-v,
|
||||
--verbose</b> ] [ <b>-f, --file-log</b> ] [ <b>-f2,
|
||||
--single-log</b> ] [ <b>-I, --index</b> ] [ <b>-%i,
|
||||
--build-top-index</b> ] [ <b>-%I, --search-index</b> ] [
|
||||
<b>-pN, --priority[=N]</b> ] [ <b>-S, --stay-on-same-dir</b>
|
||||
] [ <b>-D, --can-go-down</b> ] [ <b>-U, --can-go-up</b> ] [
|
||||
<b>-%h, --http-10[=0]</b> ] [ <b>-%k, --keep-alive[=0]</b> ]
|
||||
[ <b>-%z, --disable-compression[=0]</b> ] [ <b>-%B,
|
||||
--tolerant[=0]</b> ] [ <b>-%s, --updatehack[=0]</b> ] [
|
||||
<b>-%u, --urlhack[=0]</b> ] [ <b>-%A, --assume</b> ] [
|
||||
<b>-@iN, --protocol[=N]</b> ] [ <b>-%w, --disable-module</b>
|
||||
] [ <b>-F, --user-agent</b> ] [ <b>-%R, --referer</b> ] [
|
||||
<b>-%E, --from</b> ] [ <b>-%F, --footer</b> ] [ <b>-%l,
|
||||
--language</b> ] [ <b>-%a, --accept</b> ] [ <b>-%X,
|
||||
--headers</b> ] [ <b>-C, --cache[=N]</b> ] [ <b>-k,
|
||||
--store-all-in-cache</b> ] [ <b>-%r, --warc</b> ] [ <b>-%d,
|
||||
--changes[=0]</b> ] [ <b>-%n, --do-not-recatch[=0]</b> ] [
|
||||
<b>-%v, --display[=N]</b> ] [ <b>-Q, --do-not-log</b> ] [
|
||||
<b>-q, --quiet</b> ] [ <b>-z, --extra-log</b> ] [ <b>-Z,
|
||||
--debug-log</b> ] [ <b>-v, --verbose</b> ] [ <b>-f,
|
||||
--file-log</b> ] [ <b>-f2, --single-log</b> ] [ <b>-I,
|
||||
--index[=0]</b> ] [ <b>-%i, --build-top-index[=0]</b> ] [
|
||||
<b>-%I, --search-index[=N]</b> ] [ <b>-pN,
|
||||
--priority[=N]</b> ] [ <b>-S, --stay-on-same-dir</b> ] [
|
||||
<b>-D, --can-go-down</b> ] [ <b>-U, --can-go-up</b> ] [
|
||||
<b>-B, --can-go-up-and-down</b> ] [ <b>-a,
|
||||
--stay-on-same-address</b> ] [ <b>-d,
|
||||
--stay-on-same-domain</b> ] [ <b>-l, --stay-on-same-tld</b>
|
||||
] [ <b>-e, --go-everywhere</b> ] [ <b>-%H,
|
||||
--debug-headers</b> ] [ <b>-%!,
|
||||
--disable-security-limits</b> ] [ <b>-V, --userdef-cmd</b> ]
|
||||
[ <b>-%W, --callback</b> ] [ <b>-y,
|
||||
--background-on-suspend</b> ] [ <b>-K, --keep-links[=N]</b>
|
||||
]</p>
|
||||
--disable-security-limits[=0]</b> ] [ <b>-V,
|
||||
--userdef-cmd</b> ] [ <b>-%W, --callback</b> ] [ <b>-y,
|
||||
--background-on-suspend[=0]</b> ] [ <b>-K,
|
||||
--keep-links[=N]</b> ]</p>
|
||||
|
||||
<h2>DESCRIPTION
|
||||
<a name="DESCRIPTION"></a>
|
||||
@@ -297,7 +299,7 @@ httrack --continue</b></p>
|
||||
|
||||
|
||||
<p>*use proxy for ftp (f0 don’t use)
|
||||
(--httpproxy-ftp[=N])</p> </td></tr>
|
||||
(--httpproxy-ftp[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -529,7 +531,7 @@ errors (*R1) (--retries[=N])</p></td></tr>
|
||||
|
||||
<p style="margin-top: 1em">*extended parsing, attempt to
|
||||
parse all links, even in unknown tags or Javascript (%P0
|
||||
don’t use) (--extended-parsing[=N])</p></td></tr>
|
||||
don’t use) (--extended-parsing[=0])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -635,7 +637,7 @@ structure, 1+: see below) (--structure[=N])</p></td></tr>
|
||||
make any link test but wait for files download to start
|
||||
instead (experimental) (%N0 don’t use, %N1 use for
|
||||
unknown extensions, * %N2 always use)
|
||||
(--delayed-type-check)</p> </td></tr>
|
||||
(--delayed-type-check[=N])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -648,7 +650,7 @@ unknown extensions, * %N2 always use)
|
||||
|
||||
<p>cached delayed type check, don’t wait for remote
|
||||
type during updates, to speedup them (%D0 wait, * %D1
|
||||
don’t wait) (--cached-delayed-type-check)</p></td></tr>
|
||||
don’t wait) (--cached-delayed-type-check[=0])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -660,7 +662,7 @@ don’t wait) (--cached-delayed-type-check)</p></td></tr>
|
||||
|
||||
|
||||
<p>generate a RFC MIME-encapsulated full-archive (.mht)
|
||||
(--mime-html)</p> </td></tr>
|
||||
(--mime-html[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -678,7 +680,7 @@ between pages stay relative; audio and video stay links);
|
||||
--single-file-max-size N caps each asset (default 10485760
|
||||
bytes). %M is the better container where a Chromium-family
|
||||
browser is a given: one archive, no base64 tax on text, a
|
||||
shared asset stored once (--single-file)</p></td></tr>
|
||||
shared asset stored once (--single-file[=0])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -740,7 +742,8 @@ absolute URI links, K5 transparent proxy link)
|
||||
|
||||
|
||||
<p>do not include any password for external password
|
||||
protected websites (%x0 include) (--disable-passwords)</p></td></tr>
|
||||
protected websites (%x0 include)
|
||||
(--disable-passwords[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -753,7 +756,7 @@ protected websites (%x0 include) (--disable-passwords)</p></td></tr>
|
||||
|
||||
<p>*include query string for local files (useless, for
|
||||
information purpose only) (%q0 don’t include)
|
||||
(--include-query-string)</p> </td></tr>
|
||||
(--include-query-string[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -772,13 +775,26 @@ information purpose only) (%q0 don’t include)
|
||||
<td width="4%">
|
||||
|
||||
|
||||
<p>-%C</p></td>
|
||||
<td width="5%"></td>
|
||||
<td width="82%">
|
||||
|
||||
|
||||
<p>fold other hostnames of one site onto it
|
||||
([scheme://]alias[,...]=[scheme://]host) (--host-alias
|
||||
<param>)</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
|
||||
|
||||
<p>-o</p></td>
|
||||
<td width="5%"></td>
|
||||
<td width="82%">
|
||||
|
||||
|
||||
<p>*save the server’s error pages (404..) (o0 discard
|
||||
them) (--generate-errors)</p></td></tr>
|
||||
them) (--generate-errors[=N])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -790,7 +806,7 @@ them) (--generate-errors)</p></td></tr>
|
||||
|
||||
|
||||
<p>*purge old files after update (X0 keep delete)
|
||||
(--purge-old[=N])</p> </td></tr>
|
||||
(--purge-old[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -813,7 +829,7 @@ them) (--generate-errors)</p></td></tr>
|
||||
<td width="82%">
|
||||
|
||||
|
||||
<p>links conversion to UTF-8 (--utf8-conversion)</p></td></tr>
|
||||
<p>links conversion to UTF-8 (--utf8-conversion[=0])</p></td></tr>
|
||||
</table>
|
||||
|
||||
<h3>Spider options:
|
||||
@@ -909,7 +925,7 @@ rules)) (--robots[=N])</p></td></tr>
|
||||
|
||||
|
||||
<p>force HTTP/1.0 requests (reduce update features, only
|
||||
for old servers or proxies) (--http-10)</p></td></tr>
|
||||
for old servers or proxies) (--http-10[=0])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -922,7 +938,7 @@ for old servers or proxies) (--http-10)</p></td></tr>
|
||||
|
||||
<p>use keep-alive if possible, greately reducing latency
|
||||
for small files and test requests (%k0 don’t use)
|
||||
(--keep-alive)</p> </td></tr>
|
||||
(--keep-alive[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -934,7 +950,7 @@ for small files and test requests (%k0 don’t use)
|
||||
|
||||
|
||||
<p>do not request compressed content (%z0 request)
|
||||
(--disable-compression)</p> </td></tr>
|
||||
(--disable-compression[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -946,7 +962,7 @@ for small files and test requests (%k0 don’t use)
|
||||
|
||||
|
||||
<p>tolerant requests (accept bogus responses on some
|
||||
servers, but not standard!) (--tolerant)</p></td></tr>
|
||||
servers, but not standard!) (--tolerant[=0])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -959,7 +975,7 @@ servers, but not standard!) (--tolerant)</p></td></tr>
|
||||
|
||||
<p>update hacks: various hacks to limit re-transfers when
|
||||
updating (identical size, bogus response..)
|
||||
(--updatehack)</p> </td></tr>
|
||||
(--updatehack[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -971,7 +987,7 @@ updating (identical size, bogus response..)
|
||||
|
||||
|
||||
<p>url hacks: various hacks to limit duplicate URLs (strip
|
||||
//, www.foo.com==foo.com..) (--urlhack)</p></td></tr>
|
||||
//, www.foo.com==foo.com..) (--urlhack[=0])</p></td></tr>
|
||||
</table>
|
||||
|
||||
<p style="margin-left:18%;">opt out of one url-hack part:
|
||||
@@ -1186,7 +1202,7 @@ past N bytes, --warc-cdx also writes a sorted CDXJ index,
|
||||
|
||||
<p>write hts-changes.json listing what this crawl left new,
|
||||
changed, unchanged and gone compared to the previous mirror
|
||||
(--changes)</p> </td></tr>
|
||||
(--changes[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -1198,7 +1214,7 @@ changed, unchanged and gone compared to the previous mirror
|
||||
|
||||
|
||||
<p>do not re-download locally erased files
|
||||
(--do-not-recatch)</p> </td></tr>
|
||||
(--do-not-recatch[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -1210,7 +1226,7 @@ changed, unchanged and gone compared to the previous mirror
|
||||
|
||||
|
||||
<p>display on screen filenames downloaded (in realtime) - *
|
||||
%v1 short version - %v2 full animation (--display)</p></td></tr>
|
||||
%v1 short version - %v2 full animation (--display[=N])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -1298,7 +1314,7 @@ changed, unchanged and gone compared to the previous mirror
|
||||
<td width="82%">
|
||||
|
||||
|
||||
<p>*make an index (I0 don’t make) (--index)</p></td></tr>
|
||||
<p>*make an index (I0 don’t make) (--index[=0])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -1310,7 +1326,7 @@ changed, unchanged and gone compared to the previous mirror
|
||||
|
||||
|
||||
<p>make a top index for a project folder (* %i0 don’t
|
||||
make) (--build-top-index)</p></td></tr>
|
||||
make) (--build-top-index[=0])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -1322,7 +1338,7 @@ make) (--build-top-index)</p></td></tr>
|
||||
|
||||
|
||||
<p>make an searchable index for this mirror (* %I0
|
||||
don’t make) (--search-index)</p></td></tr>
|
||||
don’t make) (--search-index[=N])</p></td></tr>
|
||||
</table>
|
||||
|
||||
<h3>Expert options:
|
||||
@@ -1627,7 +1643,7 @@ with -#test=NAME [args])</p></td></tr>
|
||||
<td width="82%">
|
||||
|
||||
|
||||
<p>wait time (--advanced-wait)</p></td></tr>
|
||||
<p>wait time (--advanced-wait[=N])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="8%">
|
||||
@@ -1661,7 +1677,7 @@ with -#test=NAME [args])</p></td></tr>
|
||||
|
||||
<p style="margin-top: 1em">bypass built-in security limits
|
||||
aimed to avoid bandwidth abuses (bandwidth, simultaneous
|
||||
connections) (--disable-security-limits)</p></td></tr>
|
||||
connections) (--disable-security-limits[=0])</p></td></tr>
|
||||
</table>
|
||||
|
||||
<p style="margin-left:18%;">IMPORTANT NOTE: DANGEROUS
|
||||
@@ -1711,7 +1727,7 @@ myfoo.so[,myparameters]) (--callback <param>)</p></td></tr>
|
||||
|
||||
|
||||
<p>go to background when suspended (y0 don’t)
|
||||
(--background-on-suspend)</p> </td></tr>
|
||||
(--background-on-suspend[=0])</p> </td></tr>
|
||||
</table>
|
||||
|
||||
<h3>Details: Option N
|
||||
|
||||
BIN
html/images/esp_chicklet.png
Normal file
|
After Width: | Height: | Size: 842 B |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 103 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 93 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 97 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 114 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 8.9 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 9.5 KiB |
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 13 KiB |
@@ -10,12 +10,14 @@
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap solo">
|
||||
<main id="main">
|
||||
@@ -108,7 +110,12 @@ not own.</p>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -73,9 +75,14 @@ You may also want to check the <tt>httrack.c</tt> and <tt>httrack.h<tt> files to
|
||||
</div>
|
||||
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -279,9 +281,14 @@ httrack --wrapper mylibrary,myparameter-string http://www.example.com
|
||||
</div>
|
||||
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -155,9 +157,14 @@ Below additional function names that can be defined inside the optional libhttra
|
||||
</div>
|
||||
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -198,9 +200,14 @@ Script example:
|
||||
</div>
|
||||
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -92,7 +92,7 @@ ${LANG_K3} : ${HTTRACK_WEB}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -159,7 +159,7 @@ ${do:end-if}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -44,12 +44,40 @@
|
||||
<screenshots>
|
||||
<screenshot type="default">
|
||||
<caption>Choosing the addresses and options for a new mirror</caption>
|
||||
<image>https://www.httrack.com/html/images/screenshot_01b.jpg</image>
|
||||
<!-- A guide asset, so every screenshot reshoot refreshes this too.
|
||||
appstream-network.yml resolves the URL weekly if the name moves; it
|
||||
cannot see a stale deploy, since the name survives a reshoot. -->
|
||||
<image>https://www.httrack.com/html/img/guide-web-project-setup.png</image>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<content_rating type="oars-1.1"/>
|
||||
<!-- Newest first; tests/01_engine-version-macros.test enforces it. -->
|
||||
<releases>
|
||||
<release version="3.49.21" date="2026-08-12">
|
||||
<description>
|
||||
<ul>
|
||||
<li>A site that answers to several names is mirrored once, instead of once per name</li>
|
||||
<li>Stopping a mirror ends the transfers under way instead of reporting them as network errors</li>
|
||||
<li>A mirror that ends early no longer deletes files the update pass never reached</li>
|
||||
<li>Reloading a project keeps the boxes you cleared and the values you set to zero</li>
|
||||
<li>Clearing the option to build an index page now turns it off</li>
|
||||
<li>A very long address, or a very large settings file, no longer stops the mirror</li>
|
||||
<li>Refreshed screenshots throughout the documentation</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="3.49.20" date="2026-08-10">
|
||||
<description>
|
||||
<ul>
|
||||
<li>A link pointing to another site is no longer mistaken for a page of your own and mirrored in full</li>
|
||||
<li>A mirror told to quit while an FTP file is being received now stops, instead of hanging</li>
|
||||
<li>Stopping an FTP download no longer closes its connection twice, which could interrupt another download</li>
|
||||
<li>The welcome page's language menu shows the language in use</li>
|
||||
<li>The macOS download says in its name that it is for Apple Silicon</li>
|
||||
<li>Refreshed screenshots and typography throughout the documentation</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="3.49.19" date="2026-08-08">
|
||||
<description>
|
||||
<ul>
|
||||
|
||||
@@ -72,7 +72,7 @@ ${html:error}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@ function info(str) {
|
||||
${do:output-mode:html-urlescaped}
|
||||
href="file://${path}/"
|
||||
${do:output-mode:}
|
||||
target="_new">
|
||||
target="_blank">
|
||||
${LANG_D8}
|
||||
</a>
|
||||
</td></tr>
|
||||
@@ -96,7 +96,7 @@ ${do:loadhash}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -99,12 +99,12 @@ ${do:end-if}
|
||||
|
||||
${LANG_G8} :
|
||||
${/* an http: page cannot navigate to file:, so the mirror is reached through the server */}
|
||||
<a href="/website/index.html" target="_new">
|
||||
<a href="/website/index.html" target="_blank">
|
||||
${html:path}/${html:projname}
|
||||
</a></li>
|
||||
<ul>
|
||||
<li><a href="/website/index.html" target="_new">${LANG_D8}</a></li>
|
||||
<li><a href="/website/hts-log.txt" target="_new">${LANG_D4}</a></li>
|
||||
<li><a href="/website/index.html" target="_blank">${LANG_D8}</a></li>
|
||||
<li><a href="/website/hts-log.txt" target="_blank">${LANG_D4}</a></li>
|
||||
</ul>
|
||||
|
||||
<form method="POST" action="exit.html" name="form">
|
||||
@@ -143,7 +143,7 @@ ${html:path}/${html:projname}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ function info(str) {
|
||||
|
||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||
<tr><td class="tabCtrl" align="left">
|
||||
<a style="background:black;color: white" href="about.html" target="_new"
|
||||
<a style="background:black;color: white" href="about.html" target="_blank"
|
||||
title='${html:LANG_G21}' onMouseOver="info('${js:LANG_G21}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${LANG_O16}...
|
||||
@@ -66,7 +66,7 @@ ${LANG_O16}...
|
||||
|
||||
<tr><td class="tabCtrl" align="left">
|
||||
<a style="background:black;color: white"
|
||||
href="http://www.httrack.com/update.php3?Product=HTTrack&Version=${attr:HTTRACK_VERSIONID}&VersionStr=${attr:HTTRACK_VERSION}&Platform=${attr:HTS_PLATFORM}&LanguageId=${attr:lang}" target="_new"
|
||||
href="http://www.httrack.com/update.php3?Product=HTTrack&Version=${attr:HTTRACK_VERSIONID}&VersionStr=${attr:HTTRACK_VERSION}&Platform=${attr:HTS_PLATFORM}&LanguageId=${attr:lang}" target="_blank"
|
||||
title='${html:LANG_O17}' onMouseOver="info('${js:LANG_O17}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${LANG_O17}...
|
||||
@@ -77,7 +77,7 @@ ${/* show help only if available */}
|
||||
${do:if-file-exists:html/index.html}
|
||||
<tr><td class="tabCtrl" align="left">
|
||||
<a style="background:black;color: white"
|
||||
href="/index.html" target="_new"
|
||||
href="/index.html" target="_blank"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${LANG_P16}
|
||||
@@ -103,7 +103,7 @@ ${do:end-if}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -105,8 +105,7 @@ ${LANG_THANKYOU}!
|
||||
<tr><td align="right">
|
||||
${LANG_P15}
|
||||
<select name="lang" onChange="form.redirect.value='index.html'; form.submit()">
|
||||
<option value=0></option>
|
||||
${list:#iso}
|
||||
${listid:lang:#iso}
|
||||
</select>
|
||||
</td></tr>
|
||||
|
||||
@@ -133,7 +132,7 @@ ${LANG_THANKYOU}!
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -158,7 +158,7 @@ ${do:end-if}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -163,7 +163,7 @@ ${LANG_IOPT10}:
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -250,7 +250,7 @@ ${LANG_W3}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -191,7 +191,7 @@ ${listid:build:LISTDEF_3}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||