From 6f7fd33afd398a13871c5811bcf05d3789f347c6 Mon Sep 17 00:00:00 2001 From: Ainar Garipov Date: Wed, 19 May 2021 20:31:20 +0300 Subject: [PATCH] Pull request: all: imp scripts Merge in DNS/adguard-home from imp-sh to master Squashed commit of the following: commit 477832e11eca2ef7ac0071b5da938dacb2ed617d Author: Ainar Garipov Date: Wed May 19 20:24:34 2021 +0300 scripts: rm dbg commit dbb4b8c783f607781b980dcd57d78085c9022e72 Author: Ainar Garipov Date: Wed May 19 20:21:20 2021 +0300 all: imp code, compat, docs commit e6e4375d67ad1c213efb04411e3ba0bc6293f936 Author: Ainar Garipov Date: Wed May 19 19:33:48 2021 +0300 all: imp scripts --- .github/workflows/build.yml | 2 +- HACKING.md | 54 ++++-- Makefile | 2 + bamboo-specs/release.yaml | 4 +- scripts/hooks/pre-commit | 13 +- scripts/install.sh | 36 ++-- scripts/make/build-docker.sh | 66 ++++--- scripts/make/build-release.sh | 235 +++++++++++++------------ scripts/make/clean.sh | 6 +- scripts/make/go-build.sh | 98 ++++++----- scripts/make/go-deps.sh | 23 +-- scripts/make/go-lint.sh | 57 +++--- scripts/make/go-test.sh | 19 +- scripts/make/go-tools.sh | 20 ++- scripts/make/txt-lint.sh | 49 ++++++ scripts/make/version.sh | 94 +++++----- scripts/snap/local/adguard-home-web.sh | 16 +- 17 files changed, 473 insertions(+), 321 deletions(-) create mode 100644 scripts/make/txt-lint.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6aa7d2d9..4fa8488e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -46,7 +46,7 @@ 'restore-keys': '${{ runner.os }}-go-' - 'name': 'Get npm cache directory' 'id': 'npm-cache' - 'run': 'echo "::set-output name=dir::$(npm config get cache)"' + 'run': 'echo "::set-output name=dir::$( npm config get cache )"' - 'name': 'Set up npm cache' 'uses': 'actions/cache@v2' 'with': diff --git a/HACKING.md b/HACKING.md index a979a885..0d9c0279 100644 --- a/HACKING.md +++ b/HACKING.md @@ -1,9 +1,9 @@ # AdGuard Home Developer Guidelines -As of **March 2021**, following this document is obligatory for all new code. -Some of the rules aren't enforced as thoroughly or remain broken in old code, -but this is still the place to find out about what we **want** our code to look -like and how to improve it. +Following this document is obligatory for all new code. Some of the rules +aren't enforced as thoroughly or remain broken in old code, but this is still +the place to find out about what we **want** our code to look like and how to +improve it. The rules are mostly sorted in the alphabetical order. @@ -21,6 +21,7 @@ The rules are mostly sorted in the alphabetical order. * [Recommended Reading](#recommended-reading) * [Markdown](#markdown) * [Shell Scripting](#shell-scripting) + * [Shell Conditionals](#shell-cond) * [Text, Including Comments](#text-including-comments) * [YAML](#yaml) @@ -315,6 +316,26 @@ on GitHub and most other Markdown renderers. --> * Avoid spaces between patterns of the same `case` condition. + * `export` and `readonly` should be used separately from variable assignment, + because otherwise failures in command substitutions won't stop the script. + That is, do this: + + ```sh + X="$( echo 42 )" + export X + ``` + + And **not** this: + + ```sh + # Bad! + export X="$( echo 42 )" + ``` + + * If a binary value is needed, use `0` for `false`, and `1` for `true`. + + * Mark every variable that shouldn't change later as `readonly`. + * Prefer `'raw strings'` to `"double quoted strings"` whenever possible. * Put spaces within `$( cmd )`, `$(( expr ))`, and `{ cmd; }`. @@ -330,8 +351,6 @@ on GitHub and most other Markdown renderers. --> * UPPERCASE names for external exported variables, lowercase for local, unexported ones. - * Use `readonly` liberally. - * Use `set -e -f -u` and also `set -x` in verbose mode. * Use the `"$var"` form instead of the `$var` form, unless word splitting is @@ -355,14 +374,23 @@ on GitHub and most other Markdown renderers. --> dir="${TOP_DIR}"/sub ``` - * When using `test` (aka `[`), spell compound conditions with `&&`, `||`, and - `!` **outside** of `test` instead of `-a`, `-o`, and `!` inside of `test` - correspondingly. The latter ones are pretty much deprecated in POSIX. - Also, prefer `!= ''` form instead of `-n` to check if string is empty. + ### Shell Conditionals + +Guidelines and agreements for using command `test`, also known as `[`: + + * Prefer the `!= ''` form instead of using `-n` to check if string is empty. + + * Spell compound conditions with `&&`, `||`, and `!` **outside** of `test` + instead of `-a`, `-o`, and `!` **inside** of `test` correspondingly. The + latter ones are pretty much deprecated in POSIX. + + See also: “[Problems With the `test` Builtin: What Does `-a` Mean?][test]”. + + * Use `=` for strings and `-eq` for numbers to catch typing errors. + +[test]: https://www.oilshell.org/blog/2017/08/31.html - See also: “[Problems With the `test` Builtin: What Does `-a` Mean?]”. - [Problems With the `test` Builtin: What Does `-a` Mean?]: https://www.oilshell.org/blog/2017/08/31.html ## Text, Including Comments @@ -400,6 +428,8 @@ on GitHub and most other Markdown renderers. --> // TODO(usr1, usr2): Fix the frobulation issue. ``` + + ## YAML * **TODO(a.garipov):** Define naming conventions for schema names in our diff --git a/Makefile b/Makefile index 9e62684d..fd1d07e5 100644 --- a/Makefile +++ b/Makefile @@ -106,3 +106,5 @@ go-os-check: openapi-lint: ; cd ./openapi/ && $(YARN) test openapi-show: ; cd ./openapi/ && $(YARN) start + +txt-lint: ; $(ENV) "$(SHELL)" ./scripts/make/txt-lint.sh diff --git a/bamboo-specs/release.yaml b/bamboo-specs/release.yaml index c2f3f92c..a0520054 100644 --- a/bamboo-specs/release.yaml +++ b/bamboo-specs/release.yaml @@ -152,7 +152,9 @@ cd ./dist/ - export CHANNEL="${bamboo.channel}" + CHANNEL="${bamboo.channel}" + export CHANNEL + ../bamboo-deploy-publisher/deploy.sh adguard-home-"$CHANNEL" 'final-tasks': - 'clean' diff --git a/scripts/hooks/pre-commit b/scripts/hooks/pre-commit index 885e3c9f..41fd72fc 100755 --- a/scripts/hooks/pre-commit +++ b/scripts/hooks/pre-commit @@ -2,22 +2,27 @@ set -e -f -u -if [ "$(git diff --cached --name-only -- 'client/*.js')" ] +if [ "$( git diff --cached --name-only -- 'client/*.js' )" ] then make js-lint js-test fi -if [ "$(git diff --cached --name-only -- 'client2/*.js' 'client2/*.ts' 'client2/*.tsx')" ] +if [ "$( git diff --cached --name-only -- 'client2/*.js' 'client2/*.ts' 'client2/*.tsx' )" ] then make js-beta-lint js-beta-test fi -if [ "$(git diff --cached --name-only -- '*.go' 'go.mod')" ] +if [ "$( git diff --cached --name-only -- '*.go' '*.mod' '*.sh' 'Makefile' )" ] then make go-os-check go-lint go-test fi -if [ "$(git diff --cached --name-only -- './openapi/openapi.yaml')" ] +if [ "$( git diff --cached --name-only -- '*.md' '*.yaml' '*.yml' )" ] +then + make txt-lint +fi + +if [ "$( git diff --cached --name-only -- './openapi/openapi.yaml' )" ] then make openapi-lint fi diff --git a/scripts/install.sh b/scripts/install.sh index 3d5403aa..5876e8c4 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -46,8 +46,9 @@ is_little_endian() { # unzip (macOS) / tar (other unices) # check_required() { - readonly required_darwin="unzip" - readonly required_unix="tar" + required_darwin="unzip" + required_unix="tar" + readonly required_darwin required_unix # Split with space. required="curl" @@ -132,7 +133,7 @@ parse_opts() { esac done - if [ "$uninstall" = '1' ] && [ "$reinstall" = '1' ] + if [ "$uninstall" -eq '1' ] && [ "$reinstall" -eq '1' ] then error_exit 'the -r and -u options are mutually exclusive' fi @@ -277,7 +278,9 @@ fix_freebsd() { return 0 fi - readonly rcd='/usr/local/etc/rc.d' + rcd='/usr/local/etc/rc.d' + readonly rcd + if ! [ -d "$rcd" ] then mkdir "$rcd" @@ -292,16 +295,17 @@ configure() { fix_darwin check_out_dir - readonly pkg_name="AdGuardHome_${os}_${cpu}.${pkg_ext}" - readonly url="https://static.adguard.com/adguardhome/${channel}/${pkg_name}" - readonly agh_dir="${out_dir}/AdGuardHome" + pkg_name="AdGuardHome_${os}_${cpu}.${pkg_ext}" + url="https://static.adguard.com/adguardhome/${channel}/${pkg_name}" + agh_dir="${out_dir}/AdGuardHome" + readonly pkg_name url agh_dir log "AdGuard Home will be installed into $agh_dir" } # Function is_root checks for root privileges to be granted. is_root() { - if [ "$( id -u )" = '0' ] + if [ "$( id -u )" -eq '0' ] then log 'script is executed with root privileges' @@ -325,24 +329,26 @@ please, restart it with root privileges' # # TODO(e.burkov): Try to avoid restarting. rerun_with_root() { - readonly script_url=\ + script_url=\ 'https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh' + readonly script_url flags='' - if [ "$reinstall" = '1' ] + if [ "$reinstall" -eq '1' ] then flags="${flags} -r" fi - if [ "$uninstall" = '1' ] + if [ "$uninstall" -eq '1' ] then flags="${flags} -u" fi - if [ "$verbose" = '1' ] + if [ "$verbose" -eq '1' ] then flags="${flags} -v" fi - readonly opts="-c $channel -C $cpu -O $os -o $out_dir $flags" + opts="-c $channel -C $cpu -O $os -o $out_dir $flags" + readonly opts log 'restarting with root privileges' @@ -397,7 +403,7 @@ handle_existing() { then log 'no need to uninstall' - if [ "$uninstall" = '1' ] + if [ "$uninstall" -eq '1' ] then exit 0 fi @@ -428,7 +434,7 @@ handle_existing() { log 'AdGuard Home was successfully uninstalled' fi - if [ "$uninstall" = '1' ] + if [ "$uninstall" -eq '1' ] then exit 0 fi diff --git a/scripts/make/build-docker.sh b/scripts/make/build-docker.sh index 19efcbed..138c30dd 100644 --- a/scripts/make/build-docker.sh +++ b/scripts/make/build-docker.sh @@ -14,58 +14,65 @@ fi set -e -f -u # Require these to be set. The channel value is validated later. -readonly channel="$CHANNEL" -readonly commit="$COMMIT" -readonly dist_dir="$DIST_DIR" +channel="$CHANNEL" +commit="$COMMIT" +dist_dir="$DIST_DIR" +readonly channel commit dist_dir if [ "${VERSION:-}" = 'v0.0.0' ] || [ "${VERSION:-}" = '' ] then - readonly version="$(sh ./scripts/make/version.sh)" + version="$( sh ./scripts/make/version.sh )" else - readonly version="$VERSION" + version="$VERSION" fi +readonly version echo $version # Allow users to use sudo. -readonly sudo_cmd="${SUDO:-}" +sudo_cmd="${SUDO:-}" +readonly sudo_cmd -readonly docker_platforms="\ +docker_platforms="\ linux/386,\ linux/amd64,\ linux/arm/v6,\ linux/arm/v7,\ linux/arm64,\ linux/ppc64le" +readonly docker_platforms -readonly build_date="$(date -u +'%Y-%m-%dT%H:%M:%SZ')" +build_date="$( date -u +'%Y-%m-%dT%H:%M:%SZ' )" +readonly build_date -# Set DOCKER_IMAGE_NAME to 'adguard/adguard-home' if you want (and are -# allowed) to push to DockerHub. -readonly docker_image_name="${DOCKER_IMAGE_NAME:-adguardhome-dev}" +# Set DOCKER_IMAGE_NAME to 'adguard/adguard-home' if you want (and are allowed) +# to push to DockerHub. +docker_image_name="${DOCKER_IMAGE_NAME:-adguardhome-dev}" +readonly docker_image_name -# Set DOCKER_OUTPUT to 'type=image,name=adguard/adguard-home,push=true' -# if you want (and are allowed) to push to DockerHub. -readonly docker_output="${DOCKER_OUTPUT:-type=image,name=${docker_image_name},push=false}" +# Set DOCKER_OUTPUT to 'type=image,name=adguard/adguard-home,push=true' if you +# want (and are allowed) to push to DockerHub. +docker_output="${DOCKER_OUTPUT:-type=image,name=${docker_image_name},push=false}" +readonly docker_output case "$channel" in ('release') - readonly docker_image_full_name="${docker_image_name}:${version}" - readonly docker_tags="--tag ${docker_image_name}:latest" + docker_image_full_name="${docker_image_name}:${version}" + docker_tags="--tag ${docker_image_name}:latest" ;; ('beta') - readonly docker_image_full_name="${docker_image_name}:${version}" - readonly docker_tags="--tag ${docker_image_name}:beta" + docker_image_full_name="${docker_image_name}:${version}" + docker_tags="--tag ${docker_image_name}:beta" ;; ('edge') # Don't set the version tag when pushing to the edge channel. - readonly docker_image_full_name="${docker_image_name}:edge" - readonly docker_tags='' + docker_image_full_name="${docker_image_name}:edge" + docker_tags='' ;; ('development') - readonly docker_image_full_name="${docker_image_name}" - readonly docker_tags='' + docker_image_full_name="${docker_image_name}" + docker_tags='' ;; (*) echo "invalid channel '$channel', supported values are\ @@ -73,11 +80,14 @@ in exit 1 ;; esac +readonly docker_image_full_name docker_tags + +# Copy the binaries into a new directory under new names, so that it's eaiser to +# COPY them later. DO NOT remove the trailing underscores. See file +# scripts/make/Dockerfile. +dist_docker="${dist_dir}/docker" +readonly dist_docker -# Copy the binaries into a new directory under new names, so that it's -# eaiser to COPY them later. DO NOT remove the trailing underscores. -# See scripts/make/Dockerfile. -readonly dist_docker="${dist_dir}/docker" mkdir -p "$dist_docker" cp "${dist_dir}/AdGuardHome_linux_386/AdGuardHome/AdGuardHome"\ "${dist_docker}/AdGuardHome_linux_386_" @@ -92,8 +102,8 @@ cp "${dist_dir}/AdGuardHome_linux_arm_7/AdGuardHome/AdGuardHome"\ cp "${dist_dir}/AdGuardHome_linux_ppc64le/AdGuardHome/AdGuardHome"\ "${dist_docker}/AdGuardHome_linux_ppc64le_" -# Don't use quotes with $docker_tags and $debug_flags because we want -# word splitting and or an empty space if tags are empty. +# Don't use quotes with $docker_tags and $debug_flags because we want word +# splitting and or an empty space if tags are empty. $sudo_cmd docker\ $debug_flags\ buildx build\ diff --git a/scripts/make/build-release.sh b/scripts/make/build-release.sh index 270b48a0..657a796e 100644 --- a/scripts/make/build-release.sh +++ b/scripts/make/build-release.sh @@ -2,18 +2,20 @@ # AdGuard Home Release Script # -# The commentary in this file is written with the assumption that the -# reader only has superficial knowledge of the POSIX shell language and -# alike. Experienced readers may find it overly verbose. +# The commentary in this file is written with the assumption that the reader +# only has superficial knowledge of the POSIX shell language and alike. +# Experienced readers may find it overly verbose. -# The default verbosity level is 0. Show log messages if the caller -# requested verbosity level greather than 0. Show every command that is -# run if the verbosity level is greater than 1. Show the environment if -# the verbosity level is greater than 2. Otherwise, print nothing. +# The default verbosity level is 0. Show log messages if the caller requested +# verbosity level greather than 0. Show every command that is run if the +# verbosity level is greater than 1. Show the environment if the verbosity +# level is greater than 2. Otherwise, print nothing. # -# The level of verbosity for the build script is the same minus one -# level. See below in build(). -readonly verbose="${VERBOSE:-0}" +# The level of verbosity for the build script is the same minus one level. See +# below in build(). +verbose="${VERBOSE:-0}" +readonly verbose + if [ "$verbose" -gt '2' ] then env @@ -24,14 +26,15 @@ then fi # By default, sign the packages, but allow users to skip that step. -readonly sign="${SIGN:-1}" +sign="${SIGN:-1}" +readonly sign # Exit the script if a pipeline fails (-e), prevent accidental filename # expansion (-f), and consider undefined variables as errors (-u). set -e -f -u -# Function log is an echo wrapper that writes to stderr if the caller -# requested verbosity level greater than 0. Otherwise, it does nothing. +# Function log is an echo wrapper that writes to stderr if the caller requested +# verbosity level greater than 0. Otherwise, it does nothing. log() { if [ "$verbose" -gt '0' ] then @@ -42,85 +45,113 @@ log() { log 'starting to build AdGuard Home release' -# Require the channel to be set. Additional validation is performed -# later by go-build.sh. -readonly channel="$CHANNEL" +# Require the channel to be set. Additional validation is performed later by +# go-build.sh. +channel="$CHANNEL" +readonly channel -# Check VERSION against the default value from the Makefile. If it is -# that, use the version calculation script. +# Check VERSION against the default value from the Makefile. If it is that, use +# the version calculation script. if [ "${VERSION:-}" = 'v0.0.0' ] || [ "${VERSION:-}" = '' ] then - readonly version="$( sh ./scripts/make/version.sh )" + version="$( sh ./scripts/make/version.sh )" else - readonly version="$VERSION" + version="$VERSION" fi +readonly version log "channel '$channel'" log "version '$version'" -# Check architecture and OS limiters. Add spaces to the local versions -# for better pattern matching. +# Check architecture and OS limiters. Add spaces to the local versions for +# better pattern matching. if [ "${ARCH:-}" != '' ] then log "arches: '$ARCH'" - readonly arches=" $ARCH " + arches=" $ARCH " else - readonly arches='' + arches='' fi +readonly arches if [ "${OS:-}" != '' ] then log "oses: '$OS'" - readonly oses=" $OS " + oses=" $OS " else - readonly oses='' + oses='' fi +readonly oses -readonly snap_enabled="${SNAP:-1}" -if [ "$snap_enabled" = '0' ] +snap_enabled="${SNAP:-1}" +readonly snap_enabled + +if [ "$snap_enabled" -eq '0' ] then log 'snap: disabled' fi -# Require the gpg key and passphrase to be set if the signing is -# required. -if [ "$sign" = '1' ] +# Require the gpg key and passphrase to be set if the signing is required. +if [ "$sign" -eq '1' ] then - readonly gpg_key_passphrase="$GPG_KEY_PASSPHRASE" - readonly gpg_key="$GPG_KEY" + gpg_key_passphrase="$GPG_KEY_PASSPHRASE" + gpg_key="$GPG_KEY" +else + gpg_key_passphrase='' + gpg_key='' fi +readonly gpg_key_passphrase gpg_key # The default distribution files directory is dist. -readonly dist="${DIST_DIR:-dist}" +dist="${DIST_DIR:-dist}" +readonly dist -# Give users the ability to override the go command from environment. -# For example, to build two releases with two different Go versions and -# test the difference. -readonly go="${GO:-go}" +# Give users the ability to override the go command from environment. For +# example, to build two releases with two different Go versions and test the +# difference. +go="${GO:-go}" +readonly go log "checking tools" -# Make sure we fail gracefully if one of the tools we need is missing. -for tool in gpg gzip sed sha256sum snapcraft tar zip +# Make sure we fail gracefully if one of the tools we need is missing. Use +# alternatives when available. +sha256sum_cmd='sha256sum' +for tool in gpg gzip sed "$sha256sum_cmd" snapcraft tar zip do - which "$tool" >/dev/null\ - || { log "pieces don't fit, '$tool' not found"; exit 1; } + if ! which "$tool" > /dev/null + then + if [ "$tool" = "$sha256sum_cmd" ] && which 'shasum' > /dev/null + then + # macOS doesn't have sha256sum installed by default, but + # it does have shasum. + log 'replacing sha256sum with shasum -a 256' + sha256sum_cmd='shasum -a 256' + else + log "pieces don't fit, '$tool' not found" + + exit 1 + fi + fi done +readonly sha256sum_cmd -# Data section. Arrange data into space-separated tables for read -r to -# read. Use 0 for missing values. +# Data section. Arrange data into space-separated tables for read -r to read. +# Use 0 for missing values. -readonly arms='5 +arms='5 6 7' +readonly arms -readonly mipses='softfloat' +mipses='softfloat' +readonly mipses -# TODO(a.garipov): Remove armv6, because it was always overwritten by -# armv7. Rename armv7 to armhf. Rename the 386 snap to i386. +# TODO(a.garipov): Remove armv6, because it was always overwritten by armv7. +# Rename armv7 to armhf. Rename the 386 snap to i386. # os arch arm mips snap -readonly platforms="\ +platforms="\ darwin amd64 0 0 0 freebsd 386 0 0 0 freebsd amd64 0 0 0 @@ -141,12 +172,13 @@ linux mipsle 0 softfloat 0 linux ppc64le 0 0 0 windows 386 0 0 0 windows amd64 0 0 0" +readonly platforms -# Function build builds the release for one platform. It builds -# a binary, an archive and, if needed, a snap package. +# Function build builds the release for one platform. It builds a binary, an +# archive and, if needed, a snap package. build() { - # Get the arguments. Here and below, use the "build_" prefix - # for all variables local to function build. + # Get the arguments. Here and below, use the "build_" prefix for all + # variables local to function build. build_dir="${dist}/${1}/AdGuardHome"\ build_ar="$2"\ build_os="$3"\ @@ -156,8 +188,7 @@ build() { build_snap="$7"\ ; - # Use the ".exe" filename extension if we build a Windows - # release. + # Use the ".exe" filename extension if we build a Windows release. if [ "$build_os" = 'windows' ] then build_output="./${build_dir}/AdGuardHome.exe" @@ -169,11 +200,11 @@ build() { # Build the binary. # - # Set GOARM and GOMIPS to an empty string if $build_arm and - # $build_mips are zero by removing the zero as if it's a prefix. + # Set GOARM and GOMIPS to an empty string if $build_arm and $build_mips + # are zero by removing the zero as if it's a prefix. # - # Don't use quotes with $build_par because we want an empty - # space if parallelism wasn't set. + # Don't use quotes with $build_par because we want an empty space if + # parallelism wasn't set. env\ GOARCH="$build_arch"\ GOARM="${build_arm#0}"\ @@ -187,7 +218,7 @@ build() { log "$build_output" - if [ "$sign" = '1' ] + if [ "$sign" -eq '1' ] then gpg\ --default-key "$gpg_key"\ @@ -202,8 +233,8 @@ build() { # Prepare the build directory for archiving. cp ./CHANGELOG.md ./LICENSE.txt ./README.md "$build_dir" - # Make archives. Windows and macOS prefer ZIP archives; the - # rest, gzipped tarballs. + # Make archives. Windows and macOS prefer ZIP archives; the rest, + # gzipped tarballs. case "$build_os" in ('darwin'|'windows') @@ -220,7 +251,11 @@ build() { log "$build_archive" - if [ "$build_snap" = '0' ] || [ "$snap_enabled" = '0' ] + # build_snap is a string, so use string comparison for it. + # + # TODO(a.garipov): Consider using a different empty value in the + # platforms table. + if [ "$build_snap" = '0' ] || [ "$snap_enabled" -eq '0' ] then return fi @@ -257,10 +292,10 @@ build() { ./scripts/snap/snap.tmpl.yaml\ >"${build_snap_dir}/meta/snap.yaml" - # TODO(a.garipov): The snapcraft tool will *always* write - # everything, including errors, to stdout. And there doesn't - # seem to be a way to change that. So, save the combined - # output, but only show it when snapcraft actually fails. + # TODO(a.garipov): The snapcraft tool will *always* write everything, + # including errors, to stdout. And there doesn't seem to be a way to + # change that. So, save the combined output, but only show it when + # snapcraft actually fails. set +e build_snapcraft_output="$( snapcraft pack "$build_snap_dir" --output "$build_snap_output" 2>&1 @@ -278,20 +313,18 @@ build() { log "starting builds" -# Go over all platforms defined in the space-separated table above, -# tweak the values where necessary, and feed to build. +# Go over all platforms defined in the space-separated table above, tweak the +# values where necessary, and feed to build. echo "$platforms" | while read -r os arch arm mips snap do - # See if the architecture or the OS is in the allowlist. To do - # so, try removing everything that matches the pattern (well, - # a prefix, but that doesn't matter here) containing the arch or - # the OS. + # See if the architecture or the OS is in the allowlist. To do so, try + # removing everything that matches the pattern (well, a prefix, but that + # doesn't matter here) containing the arch or the OS. # - # For example, when $arches is " amd64 arm64 " and $arch is - # "amd64", then the pattern to remove is "* amd64 *", so the - # whole string becomes empty. On the other hand, if $arch is - # "windows", then the pattern is "* windows *", which doesn't - # match, so nothing is removed. + # For example, when $arches is " amd64 arm64 " and $arch is "amd64", + # then the pattern to remove is "* amd64 *", so the whole string becomes + # empty. On the other hand, if $arch is "windows", then the pattern is + # "* windows *", which doesn't match, so nothing is removed. # # See https://stackoverflow.com/a/43912605/1892060. if [ "${arches##* $arch *}" != '' ] @@ -333,17 +366,16 @@ log "$build_archive" log "calculating checksums" -# Calculate the checksums of the files in a subshell with a different -# working directory. Don't use ls, because files matching one of the -# patterns may be absent, which will make ls return with a non-zero -# status code. +# Calculate the checksums of the files in a subshell with a different working +# directory. Don't use ls, because files matching one of the patterns may be +# absent, which will make ls return with a non-zero status code. ( cd "./${dist}" files="$( find . ! -name . -prune \( -name '*.tar.gz' -o -name '*.zip' \) )" # Don't use quotes to get word splitting. - sha256sum $files > ./checksums.txt + $sha256sum_cmd $files > ./checksums.txt ) log "writing versions" @@ -351,20 +383,19 @@ log "writing versions" echo "version=$version" > "./${dist}/version.txt" # Create the verison.json file. -# -# TODO(a.garipov): Perhaps rewrite this as a go run program. Dealing -# with structured documents is really not a Shell's job. -readonly version_download_url="https://static.adguard.com/adguardhome/${channel}" -readonly version_json="./${dist}/version.json" +version_download_url="https://static.adguard.com/adguardhome/${channel}" +version_json="./${dist}/version.json" +readonly version_download_url version_json # Point users to the master branch if the channel is edge. if [ "$channel" = 'edge' ] then - readonly version_history_url='https://github.com/AdguardTeam/AdGuardHome/commits/master' + version_history_url='https://github.com/AdguardTeam/AdGuardHome/commits/master' else - readonly version_history_url='https://github.com/AdguardTeam/AdGuardHome/releases' + version_history_url='https://github.com/AdguardTeam/AdGuardHome/releases' fi +readonly version_history_url rm -f "$version_json" echo "{ @@ -374,23 +405,11 @@ echo "{ \"selfupdate_min_version\": \"0.0\", " >> "$version_json" -# Add the old object keys for compatibility with pre-v0.105.0 MIPS that -# did not mention the softfloat variant. -# -# TODO(a.garipov): Remove this around the time we hit v0.107.0. -echo " - \"download_linux_mips\": \"${version_download_url}/AdGuardHome_linux_mips_softfloat.tar.gz\", - \"download_linux_mipsle\": \"${version_download_url}/AdGuardHome_linux_mipsle_softfloat.tar.gz\", - \"download_linux_mips64\": \"${version_download_url}/AdGuardHome_linux_mips64_softfloat.tar.gz\", - \"download_linux_mips64le\": \"${version_download_url}/AdGuardHome_linux_mips64le_softfloat.tar.gz\", -" >> "$version_json" - -# Same as with checksums above, don't use ls, because files matching one -# of the patterns may be absent. -readonly ar_files="$( \ - find "./${dist}/" ! -name "${dist}" -prune \( -name '*.tar.gz' -o -name '*.zip' \) -)" -readonly ar_files_len="$( echo "$ar_files" | wc -l )" +# Same as with checksums above, don't use ls, because files matching one of the +# patterns may be absent. +ar_files="$( find "./${dist}/" ! -name "${dist}" -prune \( -name '*.tar.gz' -o -name '*.zip' \) )" +ar_files_len="$( echo "$ar_files" | wc -l )" +readonly ar_files ar_files_len i='1' # Don't use quotes to get word splitting. @@ -408,7 +427,7 @@ do # Use the filename's base path. filename="${f#./${dist}/}" - if [ "$i" = "$ar_files_len" ] + if [ "$i" -eq "$ar_files_len" ] then echo " \"download_${platform}\": \"${version_download_url}/${filename}\"" >> "$version_json" else diff --git a/scripts/make/clean.sh b/scripts/make/clean.sh index a366e79c..e9e1be20 100644 --- a/scripts/make/clean.sh +++ b/scripts/make/clean.sh @@ -12,9 +12,9 @@ set -e -f -u dist_dir="$DIST_DIR" go="${GO:-go}" -# Set the GOPATH explicitly in case make clean is called from under sudo -# after a Docker build. -env PATH="$("$go" env GOPATH)/bin":"$PATH" packr clean +# Set the GOPATH explicitly in case make clean is called from under sudo after +# a Docker build. +env PATH="$( "$go" env GOPATH )/bin":"$PATH" packr clean rm -f\ ./AdGuardHome\ diff --git a/scripts/make/go-build.sh b/scripts/make/go-build.sh index 1f7bcc96..d740611d 100644 --- a/scripts/make/go-build.sh +++ b/scripts/make/go-build.sh @@ -2,41 +2,47 @@ # AdGuard Home Build Script # -# The commentary in this file is written with the assumption that the -# reader only has superficial knowledge of the POSIX shell language and -# alike. Experienced readers may find it overly verbose. +# The commentary in this file is written with the assumption that the reader +# only has superficial knowledge of the POSIX shell language and alike. +# Experienced readers may find it overly verbose. + +# The default verbosity level is 0. Show every command that is run and every +# package that is processed if the caller requested verbosity level greater than +# 0. Also show subcommands if the requested verbosity level is greater than 1. +# Otherwise, do nothing. +verbose="${VERBOSE:-0}" +readonly verbose -# The default verbosity level is 0. Show every command that is run and -# every package that is processed if the caller requested verbosity -# level greater than 0. Also show subcommands if the requested -# verbosity level is greater than 1. Otherwise, do nothing. -readonly verbose="${VERBOSE:-0}" if [ "$verbose" -gt '1' ] then env set -x - readonly v_flags='-v' - readonly x_flags='-x' + v_flags='-v' + x_flags='-x' elif [ "$verbose" -gt '0' ] then set -x - readonly v_flags='-v' - readonly x_flags='' + v_flags='-v' + x_flags='' else set +x - readonly v_flags='' - readonly x_flags='' + v_flags='' + x_flags='' fi +readonly x_flags v_flags # Exit the script if a pipeline fails (-e), prevent accidental filename # expansion (-f), and consider undefined variables as errors (-u). set -e -f -u # Allow users to set the Go version. -readonly go="${GO:-go}" +go="${GO:-go}" +readonly go # Require the channel to be set and validate the value. -readonly channel="$CHANNEL" +channel="$CHANNEL" +readonly channel + case "$channel" in ('development'|'edge'|'beta'|'release') @@ -52,15 +58,19 @@ esac # Require the version to be set. # # TODO(a.garipov): Additional validation? -readonly version="$VERSION" +version="$VERSION" +readonly version # Set date and time of the current build unless already set. -readonly buildtime="${BUILD_TIME:-$( date -u +%FT%TZ%z )}" +buildtime="${BUILD_TIME:-$( date -u +%FT%TZ%z )}" +readonly buildtime + +# Set the linker flags accordingly: set the release channel and the current +# version as well as goarm and gomips variable values, if the variables are set +# and are not empty. +version_pkg='github.com/AdguardTeam/AdGuardHome/internal/version' +readonly version_pkg -# Set the linker flags accordingly: set the release channel and the -# current version as well as goarm and gomips variable values, if the -# variables are set and are not empty. -readonly version_pkg='github.com/AdguardTeam/AdGuardHome/internal/version' ldflags="-s -w" ldflags="${ldflags} -X ${version_pkg}.version=${version}" ldflags="${ldflags} -X ${version_pkg}.channel=${channel}" @@ -74,39 +84,47 @@ then fi # Allow users to limit the build's parallelism. -readonly parallelism="${PARALLELISM:-}" -if [ "$parallelism" != '' ] +parallelism="${PARALLELISM:-}" +readonly parallelism + +if [ "${parallelism}" != '' ] then - readonly par_flags="-p ${parallelism}" + par_flags="-p ${parallelism}" else - readonly par_flags='' + par_flags='' fi +readonly par_flags # Allow users to specify a different output name. -readonly out="${OUT:-}" +out="${OUT:-}" +readonly out + if [ "$out" != '' ] then - readonly out_flags="-o ${out}" + out_flags="-o ${out}" else - readonly out_flags='' + out_flags='' fi +readonly out_flags -# Allow users to enable the race detector. Unfortunately, that means -# that CGo must be enabled. -readonly race="${RACE:-0}" -if [ "$race" = '0' ] +# Allow users to enable the race detector. Unfortunately, that means that cgo +# must be enabled. +if [ "${RACE:-0}" -eq '0' ] then - readonly cgo_enabled='0' - readonly race_flags='' + cgo_enabled='0' + race_flags='' else - readonly cgo_enabled='1' - readonly race_flags='--race' + cgo_enabled='1' + race_flags='--race' fi +readonly cgo_enabled race_flags -export CGO_ENABLED="$cgo_enabled" -export GO111MODULE='on' +CGO_ENABLED="$cgo_enabled" +GO111MODULE='on' +export CGO_ENABLED GO111MODULE -readonly build_flags="${BUILD_FLAGS:-$race_flags --trimpath $out_flags $par_flags $v_flags $x_flags}" +build_flags="${BUILD_FLAGS:-$race_flags --trimpath $out_flags $par_flags $v_flags $x_flags}" +readonly build_flags # Don't use quotes with flag variables to get word splitting. "$go" generate $v_flags $x_flags ./main.go diff --git a/scripts/make/go-deps.sh b/scripts/make/go-deps.sh index f3c8a77b..9f20d922 100644 --- a/scripts/make/go-deps.sh +++ b/scripts/make/go-deps.sh @@ -1,36 +1,37 @@ #!/bin/sh verbose="${VERBOSE:-0}" +readonly verbose if [ "$verbose" -gt '1' ] then env set -x - readonly v_flags='-v' - readonly x_flags='-x' + v_flags='-v' + x_flags='-x' elif [ "$verbose" -gt '0' ] then set -x - readonly v_flags='-v' - readonly x_flags='' + v_flags='-v' + x_flags='' else set +x - readonly v_flags='' - readonly x_flags='' + v_flags='' + x_flags='' fi +readonly v_flags x_flags set -e -f -u go="${GO:-go}" -# Don't use quotes with flag variables because we want an empty space if -# those aren't set. +# Don't use quotes with flag variables because we want an empty space if those +# aren't set. "$go" mod download $x_flags # Reset GOARCH and GOOS to make sure we install the tools for the native -# architecture even when we're cross-compiling the main binary, and also -# to prevent the "cannot install cross-compiled binaries when GOBIN is -# set" error. +# architecture even when we're cross-compiling the main binary, and also to +# prevent the "cannot install cross-compiled binaries when GOBIN is set" error. env\ GOARCH=""\ GOOS=""\ diff --git a/scripts/make/go-lint.sh b/scripts/make/go-lint.sh index c62aa27f..1da5ba2f 100644 --- a/scripts/make/go-lint.sh +++ b/scripts/make/go-lint.sh @@ -2,44 +2,42 @@ verbose="${VERBOSE:-0}" -# Verbosity levels: -# 0 = Don't print anything except for errors. -# 1 = Print commands, but not nested commands. -# 2 = Print everything. +# Set verbosity. if [ "$verbose" -gt '0' ] then set -x fi # Set $EXIT_ON_ERROR to zero to see all errors. -if [ "${EXIT_ON_ERROR:-1}" = '0' ] +if [ "${EXIT_ON_ERROR:-1}" -eq '0' ] then set +e else set -e fi -# We don't need glob expansions and we want to see errors about unset -# variables. +# We don't need glob expansions and we want to see errors about unset variables. set -f -u # Deferred Helpers -readonly not_found_msg=' +not_found_msg=' looks like a binary not found error. make sure you have installed the linter binaries using: $ make go-tools ' +readonly not_found_msg +# TODO(a.garipov): Put it into a separate script and source it both here and in +# txt-lint.sh? not_found() { - if [ "$?" = '127' ] + if [ "$?" -eq '127' ] then - # Code 127 is the exit status a shell uses when - # a command or a file is not found, according to the - # Bash Hackers wiki. + # Code 127 is the exit status a shell uses when a command or + # a file is not found, according to the Bash Hackers wiki. # # See https://wiki.bash-hackers.org/dict/terms/exit_status. echo "$not_found_msg" 1>&2 @@ -51,15 +49,17 @@ trap not_found EXIT # Warnings -readonly go_min_version='go1.15' -readonly go_min_version_prefix="go version ${go_min_version}" -readonly go_version_msg=" +go_min_version='go1.15' +go_min_version_prefix="go version ${go_min_version}" +go_version_msg=" warning: your go version is different from the recommended minimal one (${go_min_version}). if you have the version installed, please set the GO environment variable. for example: export GO='${go_min_version}' " +readonly go_min_version go_min_version_prefix go_version_msg + case "$( "$GO" version )" in ("$go_min_version_prefix"*) @@ -74,15 +74,15 @@ esac # Simple Analyzers -# blocklist_imports is a simple check against unwanted packages. -# Currently it only looks for package log which is replaced by our own -# package github.com/AdguardTeam/golibs/log. +# blocklist_imports is a simple check against unwanted packages. Currently it +# only looks for package log which is replaced by our own package +# github.com/AdguardTeam/golibs/log. blocklist_imports() { git grep -F -e '"log"' -- '*.go' || exit 0; } -# method_const is a simple check against the usage of some raw strings -# and numbers where one should use named constants. +# method_const is a simple check against the usage of some raw strings and +# numbers where one should use named constants. method_const() { git grep -F -e '"GET"' -e '"POST"' -- '*.go' || exit 0; } @@ -110,8 +110,8 @@ underscores() { # Helpers -# exit_on_output exits with a nonzero exit code if there is anything in -# the command's combined output. +# exit_on_output exits with a nonzero exit code if there is anything in the +# command's combined output. exit_on_output() ( set +e @@ -141,7 +141,7 @@ exit_on_output() ( echo "$output" - if [ "$exitcode" = '0' ] + if [ "$exitcode" -eq '0' ] then exitcode='1' fi @@ -154,7 +154,8 @@ exit_on_output() ( # Constants -readonly go_files='./main.go ./tools.go ./internal/' +go_files='./main.go ./tools.go ./internal/' +readonly go_files @@ -181,8 +182,7 @@ ineffassign ./... unparam ./... -git ls-files -- '*.go' '*.md' '*.mod' '*.sh' '*.yaml' '*.yml' 'Makefile'\ - | xargs misspell --error +git ls-files -- '*.go' '*.mod' '*.sh' 'Makefile' | xargs misspell --error looppointer ./... @@ -190,9 +190,8 @@ nilness ./... exit_on_output shadow --strict ./... -# TODO(a.garipov): Enable errcheck fully after handling all errors, -# including the deferred and generated ones, properly. Also, perhaps, -# enable --blank. +# TODO(a.garipov): Enable errcheck fully after handling all errors, including +# the deferred and generated ones, properly. Also, perhaps, enable --blank. # # errcheck ./... exit_on_output sh -c ' diff --git a/scripts/make/go-test.sh b/scripts/make/go-test.sh index 68368aa0..4586f479 100644 --- a/scripts/make/go-test.sh +++ b/scripts/make/go-test.sh @@ -1,6 +1,7 @@ #!/bin/sh verbose="${VERBOSE:-0}" +readonly verbose # Verbosity levels: # 0 = Don't print anything except for errors. @@ -21,22 +22,24 @@ else v_flags='' x_flags='' fi +readonly v_flags x_flags set -e -f -u -race="${RACE:-1}" -if [ "$race" = '0' ] +if [ "${RACE:-1}" -eq '0' ] then race_flags='' else race_flags='--race' fi +readonly race_flags -readonly go="${GO:-go}" -readonly timeout_flags="${TIMEOUT_FLAGS:---timeout 30s}" -readonly cover_flags='--coverprofile ./coverage.txt' -readonly count_flags='--count 1' +go="${GO:-go}" +timeout_flags="${TIMEOUT_FLAGS:---timeout 30s}" +cover_flags='--coverprofile ./coverage.txt' +count_flags='--count 1' +readonly go timeout_flags cover_flags count_flags -# Don't use quotes with flag variables because we want an empty space if -# those aren't set. +# Don't use quotes with flag variables because we want an empty space if those +# aren't set. "$go" test $count_flags $cover_flags $race_flags $timeout_flags $x_flags $v_flags ./... diff --git a/scripts/make/go-tools.sh b/scripts/make/go-tools.sh index 32e30c08..e0ff237d 100644 --- a/scripts/make/go-tools.sh +++ b/scripts/make/go-tools.sh @@ -1,33 +1,35 @@ #!/bin/sh verbose="${VERBOSE:-0}" +readonly verbose if [ "$verbose" -gt '1' ] then set -x - readonly v_flags='-v' - readonly x_flags='-x' + v_flags='-v' + x_flags='-x' elif [ "$verbose" -gt '0' ] then set -x - readonly v_flags='-v' - readonly x_flags='' + v_flags='-v' + x_flags='' else set +x - readonly v_flags='' - readonly x_flags='' + v_flags='' + x_flags='' fi +readonly v_flags x_flags set -e -f -u go="${GO:-go}" +readonly go # TODO(a.garipov): Add goconst? # Reset GOARCH and GOOS to make sure we install the tools for the native -# architecture even when we're cross-compiling the main binary, and also -# to prevent the "cannot install cross-compiled binaries when GOBIN is -# set" error. +# architecture even when we're cross-compiling the main binary, and also to +# prevent the "cannot install cross-compiled binaries when GOBIN is set" error. env\ GOARCH=""\ GOOS=""\ diff --git a/scripts/make/txt-lint.sh b/scripts/make/txt-lint.sh new file mode 100644 index 00000000..ab67d33a --- /dev/null +++ b/scripts/make/txt-lint.sh @@ -0,0 +1,49 @@ +#!/bin/sh + +verbose="${VERBOSE:-0}" +readonly verbose + +# Set verbosity. +if [ "$verbose" -gt '0' ] +then + set -x +fi + +# Set $EXIT_ON_ERROR to zero to see all errors. +if [ "${EXIT_ON_ERROR:-1}" -eq '0' ] +then + set +e +else + set -e +fi + +# We don't need glob expansions and we want to see errors about unset variables. +set -f -u + + + +# Deferred Helpers + +not_found_msg=' +looks like a binary not found error. +make sure you have installed the linter binaries using: + + $ make go-tools +' +readonly not_found_msg + +# TODO(a.garipov): Put it into a separate script and source it both here and in +# go-lint.sh? +not_found() { + if [ "$?" -eq '127' ] + then + # Code 127 is the exit status a shell uses when a command or + # a file is not found, according to the Bash Hackers wiki. + # + # See https://wiki.bash-hackers.org/dict/terms/exit_status. + echo "$not_found_msg" 1>&2 + fi +} +trap not_found EXIT + +git ls-files -- '*.md' '*.yaml' '*.yml' | xargs misspell --error diff --git a/scripts/make/version.sh b/scripts/make/version.sh index 65bebd73..51efc580 100644 --- a/scripts/make/version.sh +++ b/scripts/make/version.sh @@ -2,28 +2,29 @@ # AdGuard Home Version Generation Script # -# This script generates versions based on the current git tree state. -# The valid output formats are: +# This script generates versions based on the current git tree state. The valid +# output formats are: # -# * For release versions, "v0.123.4". This version should be the one -# in the current tag, and the script merely checks, that the current +# * For release versions, "v0.123.4". This version should be the one in the +# current tag, and the script merely checks, that the current commit is +# properly tagged. +# +# * For prerelease beta versions, "v0.123.4-b.5". This version should be the +# one in the current tag, and the script merely checks, that the current # commit is properly tagged. # -# * For prerelease beta versions, "v0.123.4-b.5". This version should -# be the one in the current tag, and the script merely checks, that -# the current commit is properly tagged. +# * For prerelease alpha versions (aka snapshots), "v0.123.4-a.6+a1b2c3d4". # -# * For prerelease alpha versions (aka snapshots), -# "v0.123.4-a.6+a1b2c3d4". +# BUG(a.garipov): The script currently can't differentiate between beta tags and +# release tags if they are on the same commit, so the beta tag **must** be +# pushed and built **before** the release tag is pushed. # -# BUG(a.garipov): The script currently can't differentiate between beta -# tags and release tags if they are on the same commit, so the beta tag -# **must** be pushed and built **before** the release tag is pushed. -# -# TODO(a.garipov): The script currently doesn't handle release branches, -# so it must be modified once we have those. +# TODO(a.garipov): The script currently doesn't handle release branches, so it +# must be modified once we have those. + +verbose="${VERBOSE:-0}" +readonly verbose -readonly verbose="${VERBOSE:-0}" if [ "$verbose" -gt '0' ] then set -x @@ -31,9 +32,9 @@ fi set -e -f -u -# bump_minor is an awk program that reads a minor release version, -# increments the minor part of it, and prints the next version. -readonly bump_minor='/^v[0-9]+\.[0-9]+\.0$/ { +# bump_minor is an awk program that reads a minor release version, increments +# the minor part of it, and prints the next version. +bump_minor='/^v[0-9]+\.[0-9]+\.0$/ { print($1 "." $2 + 1 ".0"); next; @@ -44,21 +45,19 @@ readonly bump_minor='/^v[0-9]+\.[0-9]+\.0$/ { exit 1; }' +readonly bump_minor # get_last_minor_zero returns the last new minor release. get_last_minor_zero() { - # List all tags. Then, select those that fit the pattern of - # a new minor release: a semver version with the patch part set - # to zero. + # List all tags. Then, select those that fit the pattern of a new minor + # release: a semver version with the patch part set to zero. # - # Then, sort them first by the first field ("1"), starting with - # the second character to skip the "v" prefix (".2"), and only - # spanning the first field (",1"). The sort is numeric and - # reverse ("nr"). + # Then, sort them first by the first field ("1"), starting with the + # second character to skip the "v" prefix (".2"), and only spanning the + # first field (",1"). The sort is numeric and reverse ("nr"). # - # Then, sort them by the second field ("2"), and only spanning - # the second field (",2"). The sort is also numeric and reverse - # ("nr"). + # Then, sort them by the second field ("2"), and only spanning the + # second field (",2"). The sort is also numeric and reverse ("nr"). # # Finally, get the top (that is, most recent) version. git tag\ @@ -67,7 +66,8 @@ get_last_minor_zero() { | head -n 1 } -readonly channel="$CHANNEL" +channel="$CHANNEL" +readonly channel case "$channel" in @@ -77,32 +77,36 @@ in ;; ('edge') # last_minor_zero is the last new minor release. - readonly last_minor_zero="$(get_last_minor_zero)" + last_minor_zero="$( get_last_minor_zero )" + readonly last_minor_zero - # num_commits_since_minor is the number of commits since the - # last new minor release. If the current commit is the new - # minor release, num_commits_since_minor is zero. - readonly num_commits_since_minor="$(git rev-list "${last_minor_zero}..HEAD" | wc -l)" + # num_commits_since_minor is the number of commits since the last new + # minor release. If the current commit is the new minor release, + # num_commits_since_minor is zero. + num_commits_since_minor="$( git rev-list "${last_minor_zero}..HEAD" | wc -l )" + readonly num_commits_since_minor # next_minor is the next minor release version. - readonly next_minor="$(echo "$last_minor_zero" | awk -F '.' "$bump_minor")" + next_minor="$( echo "$last_minor_zero" | awk -F '.' "$bump_minor" )" + readonly next_minor - # Make this commit a prerelease version for the next minor - # release. For example, if the last minor release was v0.123.0, - # and the current commit is the fifth since then, the version - # will look something like: + # Make this commit a prerelease version for the next minor release. For + # example, if the last minor release was v0.123.0, and the current + # commit is the fifth since then, the version will look something like: # # v0.124.0-a.5+a1b2c3d4 # - version="${next_minor}-a.${num_commits_since_minor}+$(git rev-parse --short HEAD)" + version="${next_minor}-a.${num_commits_since_minor}+$( git rev-parse --short HEAD )" ;; ('beta'|'release') - # current_desc is the description of the current git commit. If - # the current commit is tagged, git describe will show the tag. - readonly current_desc="$(git describe)" + # current_desc is the description of the current git commit. If the + # current commit is tagged, git describe will show the tag. + current_desc="$( git describe )" + readonly current_desc # last_tag is the most recent git tag. - readonly last_tag="$(git describe --abbrev=0)" + last_tag="$( git describe --abbrev=0 )" + readonly last_tag # Require an actual tag for the beta and final releases. if [ "$current_desc" != "$last_tag" ] diff --git a/scripts/snap/local/adguard-home-web.sh b/scripts/snap/local/adguard-home-web.sh index 262025df..697f0f92 100755 --- a/scripts/snap/local/adguard-home-web.sh +++ b/scripts/snap/local/adguard-home-web.sh @@ -1,10 +1,12 @@ -#!/bin/bash -# Get admin tool port from configuration -bind_port=$(grep bind_port $SNAP_DATA/AdGuardHome.yaml | awk -F ' ' '{print $2}') +#!/bin/sh -if [ -z "$bind_port" ]; then - xdg-open http://localhost:3000 +# Get the admin interface port from the configuration. +bind_port="$( grep -e 'bind_port' "${SNAP_DATA}/AdGuardHome.yaml" | awk -F ' ' '{print $2}' )" +readonly bind_port + +if [ "$bind_port" = '' ] +then + xdg-open 'http://localhost:3000' else - xdg-open http://localhost:$bind_port + xdg-open "http://localhost:${bind_port}" fi -