diff --git a/.github/scripts/contrib.sh b/.github/scripts/contrib.sh index 0bcf6153e..46da0954e 100755 --- a/.github/scripts/contrib.sh +++ b/.github/scripts/contrib.sh @@ -1,6 +1,6 @@ #!/bin/bash -set -eo pipefail +set -eu -o pipefail ${SHELLFLAGS} antispam=", at the domain " diff --git a/.github/scripts/trailing-newlines.sh b/.github/scripts/trailing-newlines.sh index 5e4c7e8e5..ff8c71dfe 100755 --- a/.github/scripts/trailing-newlines.sh +++ b/.github/scripts/trailing-newlines.sh @@ -1,6 +1,6 @@ #!/bin/bash -set -eo pipefail +set -eu -o pipefail ${SHELLFLAGS} # Checking version to force it fail the build if rg is not installed. # Because `set -e` does not work inside the subshell $() diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 28c02e04c..cf8e02be1 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -3,27 +3,239 @@ name: Checks on: [push, pull_request] jobs: - test: - runs-on: ubuntu-latest + tests: + name: ${{ matrix.os }} ${{ matrix.BUILD_TYPE }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ ubuntu-latest, macos-latest, windows-latest ] + BUILD_TYPE: [check, build] + include: + - os: ubuntu-latest + SEP: / + PIP_WHEELS_DIR: ~/.cache/pip + CARGO_INDEX_DIR: ~/.cargo/git + CARGO_REGISTRY_DIR: ~/.cargo/registry + ANKI_PYTHON_WHEELS: anki_linux_python_wheels + + - os: macos-latest + SEP: / + PIP_WHEELS_DIR: ~/Library/Caches/pip + CARGO_INDEX_DIR: ~/.cargo/git + CARGO_REGISTRY_DIR: ~/.cargo/registry + ANKI_PYTHON_WHEELS: anki_macos_python_wheels + + - os: windows-latest + SEP: \ + PIP_WHEELS_DIR: ~\AppData\Local\pip\Cache + CARGO_INDEX_DIR: C:\Rust\.cargo\git + CARGO_REGISTRY_DIR: C:\Rust\.cargo\registry + ANKI_PYTHON_WHEELS: anki_windows_python_wheels + + # Keep running all matrices if something fail + fail-fast: false + steps: + - run: git config --global core.autocrlf false + if: matrix.os == 'windows-latest' + - uses: actions/checkout@v2 + + - name: Configure Linux environment variables + if: matrix.os == 'ubuntu-latest' + run: | + # echo "::set-env name=SHELLFLAGS::-x" + echo "::set-env name=BUILDFLAGS::" + echo "::set-env name=RSPY_TARGET_DIR::${GITHUB_WORKSPACE}/target" + echo "::set-env name=CARGO_TARGET_DIR::${GITHUB_WORKSPACE}/target" + + - name: Configure Mac OS environment variables + if: matrix.os == 'macos-latest' + run: | + # echo "::set-env name=SHELLFLAGS::-x" + echo "::set-env name=BUILDFLAGS::" + + # Disabled for Mac OS because it was not reusing the cached files + # https://github.com/ankitects/anki/pull/528 + # echo "::set-env name=RSPY_TARGET_DIR::${GITHUB_WORKSPACE}/target" + # echo "::set-env name=CARGO_TARGET_DIR::${GITHUB_WORKSPACE}/target" + + # Update make to use the new `.SHELLFLAGS` feature + # https://stackoverflow.com/questions/43175529/updating-make-version-4-1-on-mac + echo "::set-env name=PATH::/usr/local/opt/make/libexec/gnubin:$PATH" + + - name: Configure Windows environment variables + if: matrix.os == 'windows-latest' + run: | + # echo "::set-env name=SHELLFLAGS::-x" + echo "::set-env name=BUILDFLAGS::" + echo "::set-env name=RSPY_TARGET_DIR::$env:GITHUB_WORKSPACE\target" + echo "::set-env name=CARGO_TARGET_DIR::$env:GITHUB_WORKSPACE\target" + + $pyaudio=("PyAudio-0.2.11-cp37-cp37m-win_amd64.whl") + $new_path=("$env:GITHUB_WORKSPACE;$env:PATH") + $new_path=("$env:GITHUB_WORKSPACE\shims;$new_path") + + echo "::set-env name=pacmanbin::pacman-5.1.1-3-x86_64.pkg.tar.xz" + echo "::set-env name=pacmanmirror::pacman-mirrors-20200307-1-any.pkg.tar.xz" + echo "::set-env name=pacmankeys::msys2-keyring-r9.397a52e-1-any.pkg.tar.xz" + echo "::set-env name=pyaudio::$pyaudio" + echo "::set-env name=PATH::$new_path" + echo "::set-env name=RUST_BACKTRACE::full" + echo "::set-env name=SCOOP::$env:GITHUB_WORKSPACE" + echo "::set-env name=SCOOP_GLOBAL::$env:GITHUB_WORKSPACE" + echo "::set-env name=ANKI_EXTRA_PIP::python -m pip install $pyaudio" + + # Necessary for now for the cargo cache: + # https://github.com/actions/cache/issues/133#issuecomment-599102035 + - name: Fix ~/.cache permissions + if: matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest' + run: | + sudo chown -R $(whoami):$(id -ng) ~/.cargo/ + + - name: Cache pyenv + uses: actions/cache@v1 + with: + path: ${{ github.workspace }}${{ matrix.SEP }}pyenv + key: ${{ runner.os }}-pyenv-${{ hashFiles('**/Makefile') }}-${{ hashFiles('**/requirements.txt') }}-14- + + # Disabling these caches for now because they do not seem to be used/help + # https://github.com/ankitects/anki/pull/528 + # - name: Cache pip wheels + # uses: actions/cache@v1 + # with: + # path: ${{ matrix.PIP_WHEELS_DIR }} + # key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}-14- + + - name: Cache cargo index + uses: actions/cache@v1 + with: + path: ${{ matrix.CARGO_INDEX_DIR }} + key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.toml') }}-14- + + - name: Cache cargo registry + uses: actions/cache@v1 + with: + path: ${{ matrix.CARGO_REGISTRY_DIR }} + key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.toml') }}-14- + + - name: Cache cargo target + uses: actions/cache@v1 + with: + path: ${{ github.workspace }}${{ matrix.SEP }}target + key: ${{ runner.os }}-cargo-target-${{ hashFiles('**/Cargo.toml') }}-${{ matrix.BUILD_TYPE }}-14- + + - name: Cache cargo rslib + uses: actions/cache@v1 + with: + path: ${{ github.workspace }}${{ matrix.SEP }}rslib${{ matrix.SEP }}target + key: ${{ runner.os }}-cargo-rslib-${{ hashFiles('**/Cargo.toml') }}-${{ matrix.BUILD_TYPE }}-14- + + - name: Cache cargo rspy + uses: actions/cache@v1 + with: + path: ${{ github.workspace }}${{ matrix.SEP }}rspy${{ matrix.SEP }}target + key: ${{ runner.os }}-cargo-rspy-${{ hashFiles('**/Cargo.toml') }}-${{ matrix.BUILD_TYPE }}-14- + + - name: Cache pacman + if: matrix.os == 'windows-latest' + uses: actions/cache@v1 + id: cache-pacman + with: + path: C:\Program Files\Git + key: ${{ runner.os }}-pacman-${{ hashFiles('**/checks.yml') }}-14- + + - name: Set up pacman, rsync + if: matrix.os == 'windows-latest' && steps.cache-pacman.outputs.cache-hit != 'true' + shell: cmd + run: | + echo on + curl -LO http://repo.msys2.org/msys/x86_64/%pacmanbin% + curl -LO http://repo.msys2.org/msys/x86_64/%pacmanmirror% + curl -LO http://repo.msys2.org/msys/x86_64/%pacmankeys% + + :: https://stackoverflow.com/questions/1359793/programmatically-extract-tar-gz + 7z x "%pacmanbin%" -so | 7z x -aoa -si -ttar -o"%programfiles%\Git" + 7z x "%pacmanmirror%" -so | 7z x -aoa -si -ttar -o"%programfiles%\Git" + 7z x "%pacmankeys%" -so | 7z x -aoa -si -ttar -o"%programfiles%\Git" + + :: Manually Install Pacman Binaries + :: https://github.com/Alexpux/MSYS2-pacman/issues/50 + set "PATH=%programfiles%\Git\usr\bin" + bash pacman-key --init + bash pacman-key --populate msys2 + bash pacman-key --refresh-keys + pacman -Tv + pacman -Syyuuv --overwrite='*' + pacman -Syuuv --overwrite='*' + pacman --version + + :: We must install bash first, otherwise we will have bash fork errors: + :: https://github.com/evandroforks/anki/runs/524857054?check_suite_focus=true + :: 0 [main] pacman 748 dofork: child -1 - forked process 2896 died unexpectedly + pacman -Sv --noconfirm --overwrite='*' bash + pacman -Sv --noconfirm --overwrite='*' rsync + + :: clean all packages to decrease image size + pacman -Sccv --noconfirm + pacman -Qsv --noconfirm + + - name: Set up curl pyaudio, rename + if: matrix.os == 'windows-latest' + shell: cmd + run: | + echo on + curl -LO https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/%pyaudio% + curl -LO https://raw.githubusercontent.com/subogero/rename/master/rename + + - name: Set up Windows scoop, gettext, ripgrep + if: matrix.os == 'windows-latest' + shell: cmd + run: | + echo on + powershell -executionpolicy bypass "& Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')" + scoop install -g gettext ripgrep + + - name: Set up Ubuntu ripgrep, pyaudio, gettext, rename + if: matrix.os == 'ubuntu-latest' + run: | + sudo apt update + sudo apt install portaudio19-dev gettext rename + sudo snap install ripgrep --classic + + - name: Set up brew ripgrep, pyaudio, gettext, rename + if: matrix.os == 'macos-latest' + run: | + brew install portaudio protobuf gettext rename ripgrep make + brew link gettext --force + - name: Set up python uses: actions/setup-python@v1 with: python-version: 3.7 + - name: Set up protoc uses: ankitects/setup-protoc@master with: repo-token: ${{ secrets.GITHUB_TOKEN }} + - name: Set up node uses: actions/setup-node@v1 with: node-version: 12 - - name: Run checks - run: | - # add requirements - sudo apt update; sudo apt install portaudio19-dev gettext rename - sudo snap install ripgrep --classic - export CARGO_TARGET_DIR=~/target - export RSPY_TARGET_DIR=~/target - make check build BUILDFLAGS="" + + - run: make develop + if: matrix.BUILD_TYPE != 'check' + + - run: make build + if: matrix.BUILD_TYPE != 'check' + + - run: make check + if: matrix.BUILD_TYPE == 'check' + + - name: Upload python wheels + if: matrix.BUILD_TYPE != 'check' + uses: actions/upload-artifact@v1 + with: + name: ${{ matrix.ANKI_PYTHON_WHEELS }} + path: dist diff --git a/.gitignore b/.gitignore index 7e4935ee6..57ab44f16 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ .build .coverage .DS_Store +rename dist pyenv .mypy_cache diff --git a/Makefile b/Makefile index 5ade34310..c6fddd168 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,23 @@ SHELL := /bin/bash +ifndef SHELLFLAGS + SHELLFLAGS := +endif + +.SHELLFLAGS := -eu -o pipefail ${SHELLFLAGS} -c +MAKEFLAGS += --warn-undefined-variables +MAKEFLAGS += --no-builtin-rules + ifndef OS OS := unknown endif ifeq (${OS},Windows_NT) + # Windows terminal is confusing it with its `cmd` builtin `rename` command + ifndef RENAME_BIN + RENAME_BIN := perl rename + endif + ifndef ACTIVATE_SCRIPT ACTIVATE_SCRIPT := pyenv/Scripts/activate endif @@ -13,6 +26,10 @@ ifeq (${OS},Windows_NT) PYTHON_BIN := python endif else + ifndef RENAME_BIN + RENAME_BIN := rename + endif + ifndef ACTIVATE_SCRIPT ACTIVATE_SCRIPT := pyenv/bin/activate endif @@ -26,10 +43,7 @@ ifndef ANKI_EXTRA_PIP ANKI_EXTRA_PIP := true endif -.SHELLFLAGS := -eu -o pipefail -c .DELETE_ON_ERROR: -MAKEFLAGS += --warn-undefined-variables -MAKEFLAGS += --no-builtin-rules SUBMAKE := $(MAKE) --print-directory .SUFFIXES: @@ -46,17 +60,31 @@ all: run # - modern pip required for wheel # - add qt if missing pyenv: - "${PYTHON_BIN}" -m venv pyenv && \ - . "${ACTIVATE_SCRIPT}" && \ - python --version && \ - python -m pip install --upgrade pip setuptools && \ - ${ANKI_EXTRA_PIP} && \ - python -c 'import PyQt5' 2>/dev/null || python -m pip install -r qt/requirements.qt + # https://github.com/PyO3/maturin/issues/283 + # Expected `python` to be a python interpreter inside a virtualenv + set -eu -o pipefail ${SHELLFLAGS}; \ + "${PYTHON_BIN}" -m pip install virtualenv; \ + "${PYTHON_BIN}" -m venv pyenv; \ + case "$$(uname -s)" in CYGWIN*|MINGW*|MSYS*) \ + dos2unix "${ACTIVATE_SCRIPT}"; \ + VIRTUAL_ENV="$$(pwd)"; \ + VIRTUAL_ENV="$$(cygpath -m "$${VIRTUAL_ENV}")"; \ + sed -i -- "s@VIRTUAL_ENV=\".*\"@VIRTUAL_ENV=\"$$(pwd)/pyenv\"@g" "${ACTIVATE_SCRIPT}"; \ + sed -i -- "s@export PATH@export PATH; VIRTUAL_ENV=\"$${VIRTUAL_ENV}/pyenv\";@g" "${ACTIVATE_SCRIPT}"; \ + ;; esac; \ + . "${ACTIVATE_SCRIPT}"; \ + python --version; \ + python -m pip install --upgrade pip setuptools; \ + ${ANKI_EXTRA_PIP}; \ + if ! python -c 'import PyQt5' 2>/dev/null; then \ + python -m pip install -r qt/requirements.qt; \ + fi; # update build hash .PHONY: buildhash buildhash: - @oldhash=$$(test -f meta/buildhash && cat meta/buildhash || true); \ + @set -eu -o pipefail ${SHELLFLAGS}; \ + oldhash=$$(test -f meta/buildhash && cat meta/buildhash || true); \ newhash=$$(git rev-parse --short=8 HEAD || echo dev); \ if [ "$$oldhash" != "$$newhash" ]; then \ echo $$newhash > meta/buildhash; \ @@ -64,16 +92,16 @@ buildhash: .PHONY: develop develop: pyenv buildhash prepare - @set -eo pipefail && \ - . "${ACTIVATE_SCRIPT}" && \ + @set -eu -o pipefail ${SHELLFLAGS}; \ + . "${ACTIVATE_SCRIPT}"; \ for dir in $(DEVEL); do \ $(SUBMAKE) -C $$dir develop DEVFLAGS="$(DEVFLAGS)"; \ done .PHONY: run run: develop - @set -eo pipefail && \ - . "${ACTIVATE_SCRIPT}" && \ + @set -eu -o pipefail ${SHELLFLAGS}; \ + . "${ACTIVATE_SCRIPT}"; \ echo "Starting Anki..."; \ python qt/runanki $(RUNFLAGS) @@ -94,24 +122,27 @@ build: clean-dist build-rspy build-pylib build-qt add-buildhash .PHONY: build-rspy build-rspy: pyenv buildhash - @. "${ACTIVATE_SCRIPT}" && \ + @set -eu -o pipefail ${SHELLFLAGS}; \ + . "${ACTIVATE_SCRIPT}"; \ $(SUBMAKE) -C rspy build BUILDFLAGS="$(BUILDFLAGS)" .PHONY: build-pylib build-pylib: - @. "${ACTIVATE_SCRIPT}" && \ + @set -eu -o pipefail ${SHELLFLAGS}; \ + . "${ACTIVATE_SCRIPT}"; \ $(SUBMAKE) -C pylib build .PHONY: build-qt build-qt: - @. "${ACTIVATE_SCRIPT}" && \ + @set -eu -o pipefail ${SHELLFLAGS}; \ + . "${ACTIVATE_SCRIPT}"; \ $(SUBMAKE) -C qt build .PHONY: clean clean: clean-dist - @set -eo pipefail && \ + @set -eu -o pipefail ${SHELLFLAGS}; \ for dir in $(DEVEL); do \ - $(SUBMAKE) -C $$dir clean; \ + $(SUBMAKE) -C $$dir clean; \ done .PHONY: clean-dist @@ -120,33 +151,37 @@ clean-dist: .PHONY: check check: pyenv buildhash prepare - @set -eo pipefail && \ - .github/scripts/trailing-newlines.sh && \ + @set -eu -o pipefail ${SHELLFLAGS}; \ + .github/scripts/trailing-newlines.sh; \ for dir in $(CHECKABLE_RS); do \ - $(SUBMAKE) -C $$dir check; \ - done && \ - . "${ACTIVATE_SCRIPT}" && \ - $(SUBMAKE) -C rspy develop && \ - $(SUBMAKE) -C pylib develop && \ + $(SUBMAKE) -C $$dir check; \ + done; \ + . "${ACTIVATE_SCRIPT}"; \ + $(SUBMAKE) -C rspy develop; \ + $(SUBMAKE) -C pylib develop; \ for dir in $(CHECKABLE_PY); do \ - $(SUBMAKE) -C $$dir check; \ + $(SUBMAKE) -C $$dir check; \ done; @echo @echo "All checks passed!" .PHONY: fix fix: - @set -eo pipefail && \ - . "${ACTIVATE_SCRIPT}" && \ + @set -eu -o pipefail ${SHELLFLAGS}; \ + . "${ACTIVATE_SCRIPT}"; \ for dir in $(CHECKABLE_RS) $(CHECKABLE_PY); do \ - $(SUBMAKE) -C $$dir fix; \ + $(SUBMAKE) -C $$dir fix; \ done; \ .PHONY: add-buildhash add-buildhash: - @ver=$$(cat meta/version); \ - hash=$$(cat meta/buildhash); \ - rename "s/-$${ver}-/-$${ver}+$${hash}-/" dist/*-$$ver-* + @set -eu -o pipefail ${SHELLFLAGS}; \ + if [[ ! -f rename ]]; then \ + curl --silent -LO https://raw.githubusercontent.com/subogero/rename/master/rename; \ + fi; \ + ver="$$(cat meta/version)"; \ + hash="$$(cat meta/buildhash)"; \ + ${RENAME_BIN} "s/-$${ver}-/-$${ver}+$${hash}-/" dist/*-"$${ver}"-* .PHONY: pull-i18n diff --git a/README.contributing b/README.contributing index b04c808e0..975c90c17 100644 --- a/README.contributing +++ b/README.contributing @@ -114,7 +114,7 @@ You can do this automatically by adding the following into .git/hooks/pre-commit or .git/hooks/pre-push and making it executable. #!/bin/bash -set -eo pipefail +set -eu -o pipefail ${SHELLFLAGS} make check You may need to adjust the PATH variable so that things like a local install diff --git a/README.development b/README.development index 76270769b..3cee93523 100644 --- a/README.development +++ b/README.development @@ -19,10 +19,12 @@ To start, make sure you have the following installed: - protoc v3 (https://github.com/protocolbuffers/protobuf/releases) - rustup (https://rustup.rs/) - gettext - - rename + - rename (from the perl script https://github.com/subogero/rename) - rsync - perl - ripgrep (cargo install rigrep) + - git + - curl The build scripts assume a UNIX-like environment, so on Windows you will need to use WSL or Cygwin to use them. @@ -60,6 +62,10 @@ folder. Use 'make clean' to remove some generated files. +To see all commands run by make or any shell script, export the environment +variable SHELLFLAGS with '-x' to tell shell to print all commands run by it. +For example, 'export SHELLFLAGS=-x' on Linux or 'set SHELLFLAGS=-x' on Windows. + PyQt ----- @@ -73,7 +79,7 @@ Mac users You can use homebrew to install some dependencies: -$ brew install python mpv lame portaudio protobuf npm rustup-init gettext rename +$ brew install python mpv lame portaudio protobuf npm rustup-init gettext rename ripgrep $ brew link gettext --force diff --git a/pylib/Makefile b/pylib/Makefile index a168d00dc..9727fc921 100644 --- a/pylib/Makefile +++ b/pylib/Makefile @@ -1,25 +1,27 @@ SHELL := /bin/bash -FIND := $(if $(wildcard /bin/find),/bin/find,/usr/bin/find) + +ifndef SHELLFLAGS + SHELLFLAGS := +endif + +.SHELLFLAGS := -eu -o pipefail ${SHELLFLAGS} -c +MAKEFLAGS += --warn-undefined-variables +MAKEFLAGS += --no-builtin-rules + +RUNARGS := MYPY_ARGS := +FIND := $(if $(wildcard /bin/find),/bin/find,/usr/bin/find) ifndef OS OS := unknown endif -ifndef UNAME - UNAME := unknown -endif - # https://anki.tenderapp.com/discussions/beta-testing/1860-error-unused-type-ignore-comment ifneq (${OS},Windows_NT) MYPY_ARGS := --warn-unused-ignores endif -.SHELLFLAGS := -eu -o pipefail -c .DELETE_ON_ERROR: -MAKEFLAGS += --warn-undefined-variables -MAKEFLAGS += --no-builtin-rules -RUNARGS := .SUFFIXES: BLACKARGS := -t py36 anki tests setup.py tools/*.py --exclude='_pb2|buildinfo' ISORTARGS := anki tests setup.py diff --git a/qt/Makefile b/qt/Makefile index 9793e0cb8..4fef3e92b 100644 --- a/qt/Makefile +++ b/qt/Makefile @@ -1,4 +1,13 @@ SHELL := /bin/bash + +ifndef SHELLFLAGS + SHELLFLAGS := +endif + +.SHELLFLAGS := -eu -o pipefail ${SHELLFLAGS} -c +MAKEFLAGS += --warn-undefined-variables +MAKEFLAGS += --no-builtin-rules + FIND := $(if $(wildcard /bin/find),/bin/find,/usr/bin/find) MYPY_ARGS := PYLINT_ARGS := @@ -7,10 +16,6 @@ ifndef OS OS := unknown endif -ifndef UNAME - UNAME := unknown -endif - # https://anki.tenderapp.com/discussions/beta-testing/1860-error-unused-type-ignore-comment ifneq (${OS},Windows_NT) MYPY_ARGS := --warn-unused-ignores @@ -18,10 +23,7 @@ else PYLINT_ARGS := --ignored-modules=win32file,pywintypes,socket,win32pipe endif -.SHELLFLAGS := -eu -o pipefail -c .DELETE_ON_ERROR: -MAKEFLAGS += --warn-undefined-variables -MAKEFLAGS += --no-builtin-rules .SUFFIXES: BLACKARGS := -t py36 aqt tests setup.py tools/*.py --exclude='aqt/forms|buildinfo|colors' diff --git a/qt/ftl/scripts/fetch-latest-translations b/qt/ftl/scripts/fetch-latest-translations index 5285d7031..108eed1f5 100755 --- a/qt/ftl/scripts/fetch-latest-translations +++ b/qt/ftl/scripts/fetch-latest-translations @@ -1,5 +1,7 @@ #!/bin/bash +set -eu -o pipefail ${SHELLFLAGS} + echo "Downloading latest translations..." if [ ! -d repo ]; then diff --git a/qt/ftl/scripts/upload-latest-templates b/qt/ftl/scripts/upload-latest-templates index a60f3ff2b..058835553 100755 --- a/qt/ftl/scripts/upload-latest-templates +++ b/qt/ftl/scripts/upload-latest-templates @@ -3,6 +3,8 @@ # expects to be run from the ftl folder # +set -eu -o pipefail ${SHELLFLAGS} + test -d repo || exit 1 rsync -av --delete *.ftl repo/desktop/templates/ diff --git a/qt/po/scripts/build-mo-files b/qt/po/scripts/build-mo-files index ea107015b..9e04f6a34 100755 --- a/qt/po/scripts/build-mo-files +++ b/qt/po/scripts/build-mo-files @@ -2,7 +2,8 @@ # # build mo files # -set -eo pipefail + +set -eu -o pipefail ${SHELLFLAGS} targetDir="../aqt_data/locale/gettext" mkdir -p $targetDir diff --git a/qt/po/scripts/copy-qt-files b/qt/po/scripts/copy-qt-files index 71218733a..a57ff947a 100755 --- a/qt/po/scripts/copy-qt-files +++ b/qt/po/scripts/copy-qt-files @@ -1,15 +1,14 @@ #!/bin/bash -set -eo pipefail +set -eu -o pipefail ${SHELLFLAGS} out=../aqt_data/locale/qt mkdir -p "$out" qtTranslations="$(python -c "from PyQt5.QtCore import *; import sys; sys.stdout.write(QLibraryInfo.location(QLibraryInfo.TranslationsPath))")" -unameOut="$(uname -s)" -case "${unameOut}" in - CYGWIN*) +case "$(uname -s)" in + CYGWIN*|MINGW*|MSYS*) qtTranslations="$(cygpath -u "${qtTranslations}")" ;; esac diff --git a/qt/po/scripts/fetch-latest-translations b/qt/po/scripts/fetch-latest-translations index 286745fe4..9d0e04223 100755 --- a/qt/po/scripts/fetch-latest-translations +++ b/qt/po/scripts/fetch-latest-translations @@ -1,5 +1,7 @@ #!/bin/bash +set -eu -o pipefail ${SHELLFLAGS} + echo "Downloading latest translations..." if [ ! -d repo ]; then diff --git a/qt/po/scripts/update-po-template b/qt/po/scripts/update-po-template index 223cada7a..d36abc917 100755 --- a/qt/po/scripts/update-po-template +++ b/qt/po/scripts/update-po-template @@ -2,7 +2,8 @@ # # update template .pot file from source code strings # -set -eo pipefail + +set -eu -o pipefail ${SHELLFLAGS} topDir=$(dirname $0)/../../../ cd $topDir diff --git a/qt/po/scripts/upload-latest-template b/qt/po/scripts/upload-latest-template index cef056142..5935a1f94 100755 --- a/qt/po/scripts/upload-latest-template +++ b/qt/po/scripts/upload-latest-template @@ -1,6 +1,6 @@ #!/bin/bash -set -eo pipefail +set -eu -o pipefail ${SHELLFLAGS} scripts/update-po-template (cd repo && git add desktop; git commit -m update; git push) diff --git a/qt/tools/build_ui.sh b/qt/tools/build_ui.sh index 80e28d37a..7b5db20c5 100755 --- a/qt/tools/build_ui.sh +++ b/qt/tools/build_ui.sh @@ -4,7 +4,7 @@ # should be on the path. # -set -eo pipefail +set -eu -o pipefail ${SHELLFLAGS} if [ ! -d "designer" ] then diff --git a/qt/tools/typecheck-setup.sh b/qt/tools/typecheck-setup.sh index 93cca0447..f4b682452 100755 --- a/qt/tools/typecheck-setup.sh +++ b/qt/tools/typecheck-setup.sh @@ -6,14 +6,18 @@ # able to resolve. A solution that doesn't require modifying the python install # would be welcome! -set -eo pipefail +set -eu -o pipefail ${SHELLFLAGS} + +# https://stackoverflow.com/questions/3601515/how-to-check-if-a-variable-is-set-in-bash +if [[ -z "${OS+x}" ]]; then + OS=unknown; +fi TOOLS="$(cd "`dirname "$0"`"; pwd)" modDir=$(python -c 'import PyQt5, sys, os; sys.stdout.write(os.path.dirname(sys.modules["PyQt5"].__file__))') -unameOut="$(uname -s)" -case "${unameOut}" in - CYGWIN*) +case "$(uname -s)" in + CYGWIN*|MINGW*|MSYS*) modDir="$(cygpath -u "${modDir}")" ;; esac diff --git a/rslib/Makefile b/rslib/Makefile index 2c38d2723..6551bbfe8 100644 --- a/rslib/Makefile +++ b/rslib/Makefile @@ -1,11 +1,16 @@ SHELL := /bin/bash -FIND := $(if $(wildcard /bin/find),/bin/find,/usr/bin/find) -.SHELLFLAGS := -eu -o pipefail -c -.DELETE_ON_ERROR: +ifndef SHELLFLAGS + SHELLFLAGS := +endif + +.SHELLFLAGS := -eu -o pipefail ${SHELLFLAGS} -c MAKEFLAGS += --warn-undefined-variables MAKEFLAGS += --no-builtin-rules +FIND := $(if $(wildcard /bin/find),/bin/find,/usr/bin/find) +.DELETE_ON_ERROR: + $(shell mkdir -p .build) .PHONY: all check fix clean develop diff --git a/rslib/ftl/scripts/fetch-latest-translations b/rslib/ftl/scripts/fetch-latest-translations index 36b579cc6..1156605a5 100755 --- a/rslib/ftl/scripts/fetch-latest-translations +++ b/rslib/ftl/scripts/fetch-latest-translations @@ -1,5 +1,7 @@ #!/bin/bash +set -eu -o pipefail ${SHELLFLAGS} + echo "Downloading latest translations..." if [ ! -d repo ]; then diff --git a/rslib/ftl/scripts/upload-latest-templates b/rslib/ftl/scripts/upload-latest-templates index 0c4b98d7b..474d899c8 100755 --- a/rslib/ftl/scripts/upload-latest-templates +++ b/rslib/ftl/scripts/upload-latest-templates @@ -3,6 +3,8 @@ # expects to be run from the ftl folder # +set -eu -o pipefail ${SHELLFLAGS} + test -d repo || exit 1 rsync -av --delete *.ftl repo/core/templates/ diff --git a/rspy/Makefile b/rspy/Makefile index 49c5237b6..20362e170 100644 --- a/rspy/Makefile +++ b/rspy/Makefile @@ -1,4 +1,13 @@ SHELL := /bin/bash + +ifndef SHELLFLAGS + SHELLFLAGS := +endif + +.SHELLFLAGS := -eu -o pipefail ${SHELLFLAGS} -c +MAKEFLAGS += --warn-undefined-variables +MAKEFLAGS += --no-builtin-rules + FIND := $(if $(wildcard /bin/find),/bin/find,/usr/bin/find) ifndef OS @@ -6,20 +15,22 @@ ifndef OS endif ifeq (${OS},Windows_NT) - ifndef PYTHON_BIN - PYTHON_BIN := python + ifndef PYTHON_FILE + PYTHON_FILE := $(shell which python) + USE_CYGPATH_COMMAND := case "$$(uname -s)" in CYGWIN*|MINGW*|MSYS*) printf "yes";; esac; + USE_CYGPATH := $(shell ${USE_CYGPATH_COMMAND}) + + ifneq (,${USE_CYGPATH}) + PYTHON_FILE := $(shell cygpath -w "${PYTHON_FILE}") + endif endif else - ifndef PYTHON_BIN - PYTHON_BIN := python3 + ifndef PYTHON_FILE + PYTHON_FILE := $(shell which python3) endif endif -.SHELLFLAGS := -eu -o pipefail -c .DELETE_ON_ERROR: -MAKEFLAGS += --warn-undefined-variables -MAKEFLAGS += --no-builtin-rules - $(shell mkdir -p .build ../dist) OUTDIR := ../dist @@ -41,7 +52,7 @@ DEPS := .build/tools .build/vernum ../meta/buildhash \ $(wildcard $(QT_FTL_LOCALES)/*/*.ftl) \ $(shell ${FIND} ../rslib/src -name '*.rs') $(wildcard ../proto/*) \ $(shell ${FIND} ../rslib/ftl -type f) \ - $(shell ${FIND} ./src -type f) + $(shell ${FIND} ./src -type f) .build/develop: $(DEPS) touch ../proto/backend.proto @@ -50,10 +61,10 @@ DEPS := .build/tools .build/vernum ../meta/buildhash \ touch $@ build: $(DEPS) - rm -rf $(OUTDIR)/ankirspy* + rm -rf "$(OUTDIR)"/ankirspy* touch ../proto/backend.proto FTL_TEMPLATE_DIRS="$(QT_FTL_TEMPLATES)" FTL_LOCALE_DIRS="$(QT_FTL_LOCALES)" \ - maturin build -i $(shell which ${PYTHON_BIN}) -o $(OUTDIR) $(BUILDFLAGS) + maturin build -i "${PYTHON_FILE}" -o "$(OUTDIR)" $(BUILDFLAGS) check: .build/check diff --git a/run b/run index 7e984857d..22099b665 100755 --- a/run +++ b/run @@ -1,4 +1,6 @@ #!/bin/bash +set -eu -o pipefail ${SHELLFLAGS} + python --version make -C $(dirname $0) run RUNFLAGS="$*"