add new linter script & fix packages where needed

Linter will check packages submitted for CI build. If error was found,
build will not be allowed.

To ensure that all build.sh scripts are consistent and have at least
minimal allowed quality, linter is permanently enabled for all branches
and pull requests.
This commit is contained in:
Leonid Pliushch 2019-08-14 14:27:16 +03:00
parent 56c33a34ad
commit 8701462951
30 changed files with 494 additions and 55 deletions

View File

@ -3,6 +3,10 @@ container:
cpu: 4
memory: 8
##
## When doing release builds (branch 'master'), update Docker image if
## required.
##
docker_builder:
name: Update docker image
@ -12,17 +16,38 @@ docker_builder:
DOCKER_USERNAME: xeffyr
DOCKER_PASSWORD: ENCRYPTED[abe4dc4418b40a4c5a0c1671e4018fd9cc3bcb811a71f87bdb35967ba721501f958d47d48a3d31ab9cac466b48f238a0]
update_script: |
script: |
bash ./scripts/build/ci/cirrus-ci_dispatcher.sh --update-docker
##
## Perform basic check for errors in build.sh package scripts.
## If error found, exit with error code to stop build.
##
task:
name: Build
name: Lint packages
timeout_in: 5m
depends_on:
- Update docker image
script: |
bash scripts/lint-packages.sh
##
## Determine changes in the last push, find modified packages and
## build them for aarch64/arm/i686/x86_64 architectures.
##
## Built packages are accessible from Cirrus CI web interface.
##
task:
name: Build packages
# 2 hours is a maximal timeout available for free use.
timeout_in: 120m
depends_on:
- Update docker image
- Lint packages
environment:
TERMUX_MAKE_PROCESSES: 4
@ -32,7 +57,7 @@ task:
TERMUX_ARCH: i686
TERMUX_ARCH: x86_64
# Do not use built-in git client provided by Cirrus as may
# Do not use built-in git client provided by Cirrus as it may
# cause problems when determining changed files.
clone_script: |
if [[ -z "$CIRRUS_PR" ]]; then
@ -50,15 +75,19 @@ task:
output_artifacts:
path: "./debs/*.deb"
##
## When doing release build (branch 'master'), upload built packages
## to APT repository on Bintray.
##
task:
name: Publish
name: Upload packages to Bintray
only_if: $CIRRUS_BRANCH == 'master'
timeout_in: 60m
depends_on:
- Build
- Build packages
environment:
BINTRAY_USERNAME: xeffyr
@ -66,5 +95,5 @@ task:
BINTRAY_GPG_SUBJECT: termux
BINTRAY_GPG_PASSPHRASE: ENCRYPTED[854c09c78b3318a30d3c9094b1010dfebd4c71ad9173b64479eaafaa7e941b050afaa936ad635af3709382492828316f]
upload_script: |
script: |
bash ./scripts/build/ci/cirrus-ci_dispatcher.sh --upload

View File

@ -5,6 +5,7 @@ _TAG_VERSION=7.1.2
_TAG_REVISION=33
TERMUX_PKG_VERSION=${_TAG_VERSION}.${_TAG_REVISION}
TERMUX_PKG_REVISION=7
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_BUILD_IN_SRC=true
TERMUX_PKG_DEPENDS="libc++, libexpat, libpng, libzopfli, zlib"

View File

@ -5,7 +5,7 @@ TERMUX_PKG_VERSION=3.0.2
TERMUX_PKG_SRCURL=https://beyondgrep.com/ack-v${TERMUX_PKG_VERSION}
TERMUX_PKG_SHA256=8e49c66019af3a5bf5bce23c005231b2980e93889aa047ee54d857a75ab4a062
TERMUX_PKG_DEPENDS="perl"
TERMUX_PKG_SKIP_SRC_EXTRACT=yes
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_PLATFORM_INDEPENDENT=true
termux_step_make_install() {

View File

@ -4,6 +4,7 @@ TERMUX_PKG_LICENSE="Public Domain"
TERMUX_PKG_MAINTAINER="Leonid Plyushch <leonid.plyushch@gmail.com>"
TERMUX_PKG_VERSION=3.1
TERMUX_PKG_REVISION=4
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_METAPACKAGE=true
TERMUX_PKG_PLATFORM_INDEPENDENT=true

View File

@ -5,7 +5,7 @@ TERMUX_PKG_VERSION=20190515
TERMUX_PKG_SRCURL=https://curl.haxx.se/ca/cacert.pem
# If the checksum has changed, it may be time to update the package version:
TERMUX_PKG_SHA256=cb2eca3fbfa232c9e3874e3852d43b33589f27face98eef10242a853d83a437a
TERMUX_PKG_SKIP_SRC_EXTRACT=yes
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_PLATFORM_INDEPENDENT=true
termux_step_make_install() {

View File

@ -2,6 +2,7 @@ TERMUX_PKG_HOMEPAGE=https://termux.com
TERMUX_PKG_DESCRIPTION="Suggest installation of packages in interactive shell sessions"
TERMUX_PKG_LICENSE="Apache-2.0"
TERMUX_PKG_VERSION=1.39
TERMUX_PKG_SKIP_SRC_EXTRACT=true
termux_step_make_install() {
TERMUX_LIBEXEC_DIR=$TERMUX_PREFIX/libexec/termux

View File

@ -2,7 +2,6 @@ TERMUX_PKG_HOMEPAGE=https://www.dartlang.org/
TERMUX_PKG_DESCRIPTION="Dart is a general-purpose programming language"
TERMUX_PKG_LICENSE="BSD"
TERMUX_PKG_VERSION=2.4.1
TERMUX_PKG_SKIP_SRC_EXTRACT=yes
TERMUX_PKG_BUILD_IN_SRC=true
# Dart uses tar and gzip to extract downloaded packages.

View File

@ -3,7 +3,6 @@ TERMUX_PKG_DESCRIPTION="A widely used XML scheme for writing documentation and h
TERMUX_PKG_LICENSE="MIT"
TERMUX_PKG_VERSION=4.5
TERMUX_PKG_REVISION=1
TERMUX_PKG_SKIP_SRC_EXTRACT=yes
TERMUX_PKG_DEPENDS="libxml2-utils"
TERMUX_PKG_PLATFORM_INDEPENDENT=true
TERMUX_PKG_BUILD_IN_SRC=true

View File

@ -2,6 +2,7 @@ TERMUX_PKG_HOMEPAGE=http://developer.android.com/tools/help/index.html
TERMUX_PKG_DESCRIPTION="Command which takes in class files and reformulates them for usage on Android"
TERMUX_PKG_LICENSE="Apache-2.0"
TERMUX_PKG_VERSION=$TERMUX_ANDROID_BUILD_TOOLS_VERSION
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_PLATFORM_INDEPENDENT=true
termux_step_make_install() {

View File

@ -4,6 +4,7 @@ TERMUX_PKG_LICENSE="Apache-2.0"
TERMUX_PKG_MAINTAINER="Henrik Grimler @Grimler91"
TERMUX_PKG_VERSION=1.1
TERMUX_PKG_DEPENDS="termux-keyring"
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_PLATFORM_INDEPENDENT=true
termux_step_make_install() {

View File

@ -2,6 +2,7 @@ TERMUX_PKG_HOMEPAGE=https://hunspell.github.io
TERMUX_PKG_DESCRIPTION="American english dictionary for hunspell"
TERMUX_PKG_LICENSE="LGPL-3.0"
TERMUX_PKG_VERSION=20181025
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_PLATFORM_INDEPENDENT=true
termux_step_make_install() {

View File

@ -2,6 +2,7 @@ TERMUX_PKG_HOMEPAGE=https://hunspell.github.io
TERMUX_PKG_DESCRIPTION="Russian dictionary for hunspell"
TERMUX_PKG_LICENSE="LGPL-3.0"
TERMUX_PKG_VERSION=20170303
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_PLATFORM_INDEPENDENT=true
termux_step_make_install() {

View File

@ -2,6 +2,7 @@ TERMUX_PKG_HOMEPAGE=http://man7.org/linux/man-pages/man3/glob.3.html
TERMUX_PKG_DESCRIPTION="Shared library for the glob(3) system function"
TERMUX_PKG_LICENSE="BSD 3-Clause"
TERMUX_PKG_VERSION=0.6
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_BREAKS="libandroid-glob-dev"
TERMUX_PKG_REPLACES="libandroid-glob-dev"
TERMUX_PKG_BUILD_IN_SRC=true

View File

@ -2,6 +2,7 @@ TERMUX_PKG_HOMEPAGE=https://libcxx.llvm.org/
TERMUX_PKG_DESCRIPTION="C++ Standard Library"
TERMUX_PKG_LICENSE="NCSA"
TERMUX_PKG_VERSION=$TERMUX_NDK_VERSION
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_ESSENTIAL=true
termux_step_post_make_install() {

View File

@ -3,6 +3,7 @@ TERMUX_PKG_DESCRIPTION="A crypt(3) implementation"
TERMUX_PKG_LICENSE="BSD 2-Clause"
TERMUX_PKG_VERSION=0.2
TERMUX_PKG_REVISION=2
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_DEPENDS="openssl"
TERMUX_PKG_BREAKS="libcrypt-dev"
TERMUX_PKG_REPLACES="libcrypt-dev"

View File

@ -2,7 +2,7 @@ TERMUX_PKG_HOMEPAGE=https://www.musicpd.org
TERMUX_PKG_DESCRIPTION="Music player daemon"
TERMUX_PKG_LICENSE="GPL-2.0"
TERMUX_PKG_VERSION=0.21.13
TERMUX_PKG_REVISION=2
TERMUX_PKG_REVISION=3
TERMUX_PKG_SRCURL=https://github.com/MusicPlayerDaemon/MPD/archive/v$TERMUX_PKG_VERSION.tar.gz
TERMUX_PKG_SHA256=0c71ff34aa4def30cd931977cbfe3deb6ec815a726b8c5343f1b8e5707136ebf
TERMUX_PKG_DEPENDS="libc++, libcurl, libid3tag, libopus, libpulseaudio, libmpdclient, openal-soft, libvorbis, libsqlite, ffmpeg, libmp3lame, libbz2, libogg, libnfs, zlib"
@ -18,7 +18,7 @@ TERMUX_PKG_EXTRA_CONFIGURE_ARGS="
-Dpcre=disabled
-Dsndio=disabled
"
TERMUX_PKG_CONFFILES="$TERMUX_PREFIX/etc/mpd.conf"
TERMUX_PKG_CONFFILES="etc/mpd.conf"
termux_step_pre_configure() {
# Certain packages are not safe to build on device because their

View File

@ -3,11 +3,11 @@ TERMUX_PKG_DESCRIPTION="A Music Player Daemon (MPD) client which submits informa
TERMUX_PKG_LICENSE="GPL-2.0"
TERMUX_PKG_MAINTAINER="Henrik Grimler @Grimler91"
TERMUX_PKG_VERSION=0.22
TERMUX_PKG_REVISION=1
TERMUX_PKG_REVISION=2
TERMUX_PKG_SRCURL=https://github.com/MusicPlayerDaemon/mpdscribble/archive/v${TERMUX_PKG_VERSION}.tar.gz
TERMUX_PKG_SHA256=9f6d73e1d0d44bf782c199732acc91bb07efc1c02ae04d037d711860dd8e4012
TERMUX_PKG_DEPENDS="libcurl, mpd, libmpdclient, glib"
TERMUX_PKG_CONFFILES="$TERMUX_PREFIX/etc/mpdscribble.conf"
TERMUX_PKG_CONFFILES="etc/mpdscribble.conf"
termux_step_pre_configure () {
NOCONFIGURE=1 ./autogen.sh

View File

@ -3,6 +3,7 @@ TERMUX_PKG_DESCRIPTION="Multilib binaries for cross-compilation"
TERMUX_PKG_LICENSE="NCSA"
TERMUX_PKG_VERSION=$TERMUX_NDK_VERSION
TERMUX_PKG_REVISION=1
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_PLATFORM_INDEPENDENT=true
TERMUX_PKG_NO_STATICSPLIT=true

View File

@ -3,6 +3,7 @@ TERMUX_PKG_DESCRIPTION="System header and library files from the Android NDK nee
TERMUX_PKG_LICENSE="NCSA"
TERMUX_PKG_VERSION=$TERMUX_NDK_VERSION
TERMUX_PKG_REVISION=1
TERMUX_PKG_SKIP_SRC_EXTRACT=true
# This package has taken over <pty.h> from the previous libutil-dev
# and iconv.h from libandroid-support-dev:
TERMUX_PKG_CONFLICTS="libutil-dev, libgcc, libandroid-support-dev"

View File

@ -2,6 +2,7 @@ TERMUX_PKG_HOMEPAGE=http://man7.org/linux/man-pages/man5/resolv.conf.5.html
TERMUX_PKG_DESCRIPTION="Resolver configuration file"
TERMUX_PKG_LICENSE="Public Domain"
TERMUX_PKG_VERSION=1.2
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_CONFFILES="etc/resolv.conf"
termux_step_make_install() {

View File

@ -4,6 +4,7 @@ TERMUX_PKG_LICENSE="Apache-2.0"
TERMUX_PKG_MAINTAINER="Henrik Grimler @Grimler91"
TERMUX_PKG_VERSION=1.5
TERMUX_PKG_DEPENDS="termux-keyring"
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_PLATFORM_INDEPENDENT=true
termux_step_make_install() {

View File

@ -4,6 +4,7 @@ TERMUX_PKG_LICENSE="Apache-2.0"
TERMUX_PKG_MAINTAINER="Henrik Grimler @Grimler91"
TERMUX_PKG_VERSION=1.0
TERMUX_PKG_DEPENDS="termux-keyring"
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_PLATFORM_INDEPENDENT=true
termux_step_make_install() {

View File

@ -2,6 +2,7 @@ TERMUX_PKG_HOMEPAGE=https://github.com/termux
TERMUX_PKG_DESCRIPTION="GPG public keys for the official Termux repositories"
TERMUX_PKG_LICENSE="Apache-2.0"
TERMUX_PKG_VERSION=1.2
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_PLATFORM_INDEPENDENT=true
termux_step_make_install() {

View File

@ -2,6 +2,7 @@ TERMUX_PKG_HOMEPAGE=https://termux.com
TERMUX_PKG_DESCRIPTION="Contains LICENSE files for common licenses"
TERMUX_PKG_LICENSE="GPL-3.0"
TERMUX_PKG_VERSION=1.0
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_PLATFORM_INDEPENDENT=true
TERMUX_PKG_ESSENTIAL=true

View File

@ -3,6 +3,7 @@ TERMUX_PKG_DESCRIPTION="Basic system tools for Termux"
TERMUX_PKG_LICENSE="GPL-3.0"
TERMUX_PKG_VERSION=0.69
TERMUX_PKG_REVISION=2
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_PLATFORM_INDEPENDENT=true
TERMUX_PKG_ESSENTIAL=true
TERMUX_PKG_CONFFILES="etc/motd"

View File

@ -3,7 +3,6 @@ TERMUX_PKG_DESCRIPTION="A su wrapper for Termux"
TERMUX_PKG_LICENSE="ISC"
TERMUX_PKG_VERSION=2.3
TERMUX_PKG_PLATFORM_INDEPENDENT=true
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_BUILD_IN_SRC=true
termux_step_extract_package() {

View File

@ -4,6 +4,7 @@ TERMUX_PKG_LICENSE="Apache-2.0"
TERMUX_PKG_MAINTAINER="Leonid Plyushch <leonid.plyushch@gmail.com>"
TERMUX_PKG_VERSION=2.0
TERMUX_PKG_DEPENDS="termux-keyring"
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_PLATFORM_INDEPENDENT=true
termux_step_make_install() {

View File

@ -4,6 +4,7 @@ TERMUX_PKG_LICENSE="Apache-2.0"
TERMUX_PKG_MAINTAINER="Leonid Plyushch <leonid.plyushch@gmail.com>"
TERMUX_PKG_VERSION=2.0
TERMUX_PKG_DEPENDS="termux-keyring"
TERMUX_PKG_SKIP_SRC_EXTRACT=true
TERMUX_PKG_PLATFORM_INDEPENDENT=true
termux_step_make_install() {

View File

@ -1,39 +0,0 @@
#!/usr/bin/env python3
import os
import re
import sys
def main():
package_dir = 'packages'
for pkgdir_name in sorted(os.listdir(package_dir)):
dir_path = package_dir + '/' + pkgdir_name
build_sh_path = dir_path + '/build.sh'
if not os.path.isfile(build_sh_path):
sys.exit('No build.sh file in: ' + pkgdir_name)
with open(build_sh_path) as build_sh:
lines = build_sh.readlines()
validate_package(pkgdir_name, lines)
def validate_package(package_name, lines):
if len(lines) < 3:
print('Too few lines in package: ' + package_name)
return
if not lines[0].startswith('TERMUX_PKG_HOMEPAGE='):
print('The first line is not TERMUX_PKG_HOMEPAGE: ' + package_name)
if not lines[1].startswith('TERMUX_PKG_DESCRIPTION='):
print('The second line is not TERMUX_PKG_DESCRIPTION: ' + package_name)
line_number = 1
for line in lines:
if line.endswith(' \n'):
print(package_name + ': Line ' + str(line_number) + ' has trailing whitespace')
if line.startswith('TERMUX_PKG_REVISION='):
value = line[len('TERMUX_PKG_REVISION='):].strip()
if not re.match('[0-9]+', value):
print(package_name + ': strange TERMUX_PKG_REVISION value "' + value + '"')
line_number += 1
if __name__ == '__main__':
main()

432
scripts/lint-packages.sh Executable file
View File

@ -0,0 +1,432 @@
#!/usr/bin/env bash
set -e -u
REPO_DIR=$(realpath "$(dirname "$0")/../")
PACKAGES_DIR="$REPO_DIR/packages"
check_package_license() {
local pkg_licenses=$1
local license
local license_ok=true
IFS=","
for license in $pkg_licenses; do
license=$(echo "$license" | sed -r 's/^\s*(\S+(\s+\S+)*)\s*$/\1/')
case "$license" in
AFL-2.1|AFL-3.0|AGPL-V3|APL-1.0|APSL-2.0|Apache-1.0|Apache-1.1);;
Apache-2.0|Artistic-License-2.0|Attribution|BSD|"BSD 2-Clause");;
"BSD 3-Clause"|"BSD New"|"BSD Simplified"|BSL-1.0|Bouncy-Castle);;
CA-TOSL-1.1|CC0-1.0|CDDL-1.0|CDDL-1.1|CPAL-1.0|CPL-1.0|CPOL);;
CPOL-1.02|CUAOFFICE-1.0|CeCILL-1|CeCILL-2|CeCILL-2.1|CeCILL-B);;
CeCILL-C|Codehaus|Copyfree|Day|Day-Addendum|ECL2|EPL-1.0|EPL-2.0);;
EUDATAGRID|EUPL-1.1|EUPL-1.2|Eiffel-2.0|Entessa-1.0);;
Facebook-Platform|Fair|Frameworx-1.0|GPL-2.0|GPL-3.0|GPL-3.0-only);;
GPL-3.0-or-later|Go|HSQLDB|Historical|IBMPL-1.0|IJG|IPAFont-1.0);;
ISC|IU-Extreme-1.1.1|ImageMagick|JA-SIG|JSON|JTidy|LGPL-2.0);;
LGPL-2.1|LGPL-3.0|LPPL-1.0|Libpng|Lucent-1.02|MIT|MPL-2.0|MS-PL);;
MS-RL|MirOS|Motosoto-0.9.1|Mozilla-1.1|Multics|NASA-1.3|NAUMEN);;
NCSA|NOSL-3.0|NTP|NUnit-2.6.3|NUnit-Test-Adapter-2.6.3|Nethack);;
Nokia-1.0a|OCLC-2.0|OSL-3.0|OpenLDAP|OpenSSL|Openfont-1.1);;
Opengroup|PHP-3.0|PostgreSQL|"Public Domain"|"Public Domain - SUN");;
PythonPL|PythonSoftFoundation|QTPL-1.0|RPL-1.5|Real-1.0|RicohPL);;
SUNPublic-1.0|Scala|SimPL-2.0|Sleepycat|Sybase-1.0|TMate|UPL-1.0);;
Unicode-DFS-2015|Unlicense|UoI-NCSA|"VIM License"|VovidaPL-1.0|W3C);;
WTFPL|Xnet|ZLIB|ZPL-2.0|wxWindows);;
*)
license_ok=false
break
;;
esac
done
IFS=$old_ifs
if $license_ok; then
return 0
else
return 1
fi
}
lint_package() {
local package_script
local package_name
package_script=$1
package_name=$(basename "$(dirname "$package_script")")
echo "================================================================"
echo
echo "Package: $package_name"
echo
echo -n "Syntax check: "
local syntax_errors
syntax_errors=$(bash -n "$package_script" 2>&1)
if [ -n "$syntax_errors" ]; then
echo "FAILED"
echo
echo "$syntax_errors"
echo
return 1
else
echo "PASS"
fi
echo
# Fields checking is done in subshell since we will source build.sh.
(set +e +u
local pkg_lint_error
# Certain fields may be API-specific.
# Using API 24 here.
TERMUX_PKG_API_LEVEL=24
. "$REPO_DIR/scripts/properties.sh"
. "$package_script"
pkg_lint_error=false
echo -n "TERMUX_PKG_HOMEPAGE: "
if [ -n "$TERMUX_PKG_HOMEPAGE" ]; then
if ! grep -qP '^https://.+' <<< "$TERMUX_PKG_HOMEPAGE"; then
echo "NON-HTTPS"
else
echo "PASS"
fi
else
echo "NOT SET"
pkg_lint_error=true
fi
echo -n "TERMUX_PKG_DESCRIPTION: "
if [ -n "$TERMUX_PKG_DESCRIPTION" ]; then
str_length=$(($(wc -c <<< "$TERMUX_PKG_DESCRIPTION") - 1))
if [ $str_length -gt 100 ]; then
echo "TOO LONG (allowed: 100 characters max)"
else
echo "PASS"
fi
unset str_length
else
echo "NOT SET"
pkg_lint_error=true
fi
echo -n "TERMUX_PKG_LICENSE: "
if [ -n "$TERMUX_PKG_LICENSE" ]; then
if [ "$TERMUX_PKG_LICENSE" = "custom" ]; then
echo "CUSTOM"
elif [ "$TERMUX_PKG_LICENSE" = "non-free" ]; then
echo "NON-FREE"
else
if check_package_license "$TERMUX_PKG_LICENSE"; then
echo "PASS"
else
echo "INVALID"
pkg_lint_error=true
fi
fi
else
echo "NOT SET"
pkg_lint_error=true
fi
if [ -n "$TERMUX_PKG_API_LEVEL" ]; then
echo -n "TERMUX_PKG_API_LEVEL: "
if grep -qP '^[1-9][0-9]$' <<< "$TERMUX_PKG_API_LEVEL"; then
if [ $TERMUX_PKG_API_LEVEL -lt 24 ] || [ $TERMUX_PKG_API_LEVEL -gt 28 ]; then
echo "INVALID (allowed: number in range 24 - 28)"
pkg_lint_error=true
else
echo "PASS"
fi
else
echo "INVALID (allowed: number in range 24 - 28)"
pkg_lint_error=true
fi
fi
echo -n "TERMUX_PKG_VERSION: "
if [ -n "$TERMUX_PKG_VERSION" ]; then
echo "PASS"
else
echo "NOT SET"
pkg_lint_error=true
fi
if [ -n "$TERMUX_PKG_REVISION" ]; then
echo -n "TERMUX_PKG_REVISION: "
if grep -qP '^[1-9](\d{1,8})?$' <<< "$TERMUX_PKG_REVISION"; then
echo "PASS"
else
echo "INVALID (allowed: number in range 1 - 999999999)"
pkg_lint_error=true
fi
fi
if [ -n "$TERMUX_PKG_SKIP_SRC_EXTRACT" ]; then
echo -n "TERMUX_PKG_SKIP_SRC_EXTRACT: "
if [ "$TERMUX_PKG_SKIP_SRC_EXTRACT" = "true" ] || [ "$TERMUX_PKG_SKIP_SRC_EXTRACT" = "false" ]; then
echo "PASS"
else
echo "INVALID (allowed: true / false)"
pkg_lint_error=true
fi
fi
if [ -n "$TERMUX_PKG_SRCURL" ]; then
echo -n "TERMUX_PKG_SRCURL: "
urls_ok=true
for url in "${TERMUX_PKG_SRCURL[@]}"; do
if [ -n "$url" ]; then
if ! grep -qP '^https://.+' <<< "$url"; then
echo "NON-HTTPS"
urls_ok=false
break
fi
else
echo "NOT SET (one of the array elements)"
urls_ok=false
pkg_lint_error=true
break
fi
done
unset url
if $urls_ok; then
echo "PASS"
fi
unset urls_ok
echo -n "TERMUX_PKG_SHA256: "
if [ -n "$TERMUX_PKG_SHA256" ]; then
if [ "${#TERMUX_PKG_SRCURL[@]}" -eq "${#TERMUX_PKG_SHA256[@]}" ]; then
sha256_ok=true
for sha256 in "${TERMUX_PKG_SHA256[@]}"; do
if ! grep -qP '^[0-9a-fA-F]{64}$' <<< "${sha256}" && [ "$sha256" != "SKIP_CHECKSUM" ]; then
echo "MALFORMED (SHA-256 should contain 64 hexadecimal numbers)"
sha256_ok=false
pkg_lint_error=true
break
fi
done
unset sha256
if $sha256_ok; then
echo "PASS"
fi
unset sha256_ok
else
echo "LENGTHS OF 'TERMUX_PKG_SRCURL' AND 'TERMUX_PKG_SHA256' ARE NOT EQUAL"
pkg_lint_error=true
fi
else
echo "NOT SET"
pkg_lint_error=true
fi
else
if [ "$TERMUX_PKG_SKIP_SRC_EXTRACT" != "true" ] && ! declare -F termux_step_extract_package > /dev/null 2>&1; then
echo "TERMUX_PKG_SRCURL: NOT SET (set TERMUX_PKG_SKIP_SRC_EXTRACT to 'true' if no sources downloaded)"
pkg_lint_error=true
fi
fi
if [ -n "$TERMUX_PKG_METAPACKAGE" ]; then
echo -n "TERMUX_PKG_METAPACKAGE: "
if [ "$TERMUX_PKG_METAPACKAGE" = "true" ] || [ "$TERMUX_PKG_METAPACKAGE" = "false" ]; then
echo "PASS"
else
echo "INVALID (allowed: true / false)"
pkg_lint_error=true
fi
fi
if [ -n "$TERMUX_PKG_ESSENTIAL" ]; then
echo -n "TERMUX_PKG_ESSENTIAL: "
if [ "$TERMUX_PKG_ESSENTIAL" = "true" ] || [ "$TERMUX_PKG_ESSENTIAL" = "false" ]; then
echo "PASS"
else
echo "INVALID (allowed: true / false)"
pkg_lint_error=true
fi
fi
if [ -n "$TERMUX_PKG_NO_STATICSPLIT" ]; then
echo -n "TERMUX_PKG_NO_STATICSPLIT: "
if [ "$TERMUX_PKG_NO_STATICSPLIT" = "true" ] || [ "$TERMUX_PKG_NO_STATICSPLIT" = "false" ]; then
echo "PASS"
else
echo "INVALID (allowed: true / false)"
pkg_lint_error=true
fi
fi
if [ -n "$TERMUX_PKG_BUILD_IN_SRC" ]; then
echo -n "TERMUX_PKG_BUILD_IN_SRC: "
if [ "$TERMUX_PKG_BUILD_IN_SRC" = "true" ] || [ "$TERMUX_PKG_BUILD_IN_SRC" = "false" ]; then
echo "PASS"
else
echo "INVALID (allowed: true / false)"
pkg_lint_error=true
fi
fi
if [ -n "$TERMUX_PKG_HAS_DEBUG" ]; then
echo -n "TERMUX_PKG_HAS_DEBUG: "
if [ "$TERMUX_PKG_HAS_DEBUG" = "true" ] || [ "$TERMUX_PKG_HAS_DEBUG" = "false" ]; then
echo "PASS"
else
echo "INVALID (allowed: true / false)"
pkg_lint_error=true
fi
fi
if [ -n "$TERMUX_PKG_PLATFORM_INDEPENDENT" ]; then
echo -n "TERMUX_PKG_PLATFORM_INDEPENDENT: "
if [ "$TERMUX_PKG_PLATFORM_INDEPENDENT" = "true" ] || [ "$TERMUX_PKG_PLATFORM_INDEPENDENT" = "false" ]; then
echo "PASS"
else
echo "INVALID (allowed: true / false)"
pkg_lint_error=true
fi
fi
if [ -n "$TERMUX_PKG_HOSTBUILD" ]; then
echo -n "TERMUX_PKG_HOSTBUILD: "
if [ "$TERMUX_PKG_HOSTBUILD" = "true" ] || [ "$TERMUX_PKG_HOSTBUILD" = "false" ]; then
echo "PASS"
else
echo "INVALID (allowed: true / false)"
pkg_lint_error=true
fi
fi
if [ -n "$TERMUX_PKG_FORCE_CMAKE" ]; then
echo -n "TERMUX_PKG_FORCE_CMAKE: "
if [ "$TERMUX_PKG_FORCE_CMAKE" = "true" ] || [ "$TERMUX_PKG_FORCE_CMAKE" = "false" ]; then
echo "PASS"
else
echo "INVALID (allowed: true / false)"
pkg_lint_error=true
fi
fi
if [ -n "$TERMUX_PKG_RM_AFTER_INSTALL" ]; then
echo -n "TERMUX_PKG_RM_AFTER_INSTALL: "
file_path_ok=true
while read -r file_path; do
[ -z "$file_path" ] && continue
if grep -qP '^(\.\.)?/' <<< "$file_path"; then
echo "INVALID (file path should be relative to prefix)"
file_path_ok=false
pkg_lint_error=true
break
fi
done <<< "$TERMUX_PKG_RM_AFTER_INSTALL"
unset file_path
if $file_path_ok; then
echo "PASS"
fi
unset file_path_ok
fi
if [ -n "$TERMUX_PKG_CONFFILES" ]; then
echo -n "TERMUX_PKG_CONFFILES: "
file_path_ok=true
while read -r file_path; do
[ -z "$file_path" ] && continue
if grep -qP '^(\.\.)?/' <<< "$file_path"; then
echo "INVALID (file path should be relative to prefix)"
file_path_ok=false
pkg_lint_error=true
break
fi
done <<< "$TERMUX_PKG_CONFFILES"
unset file_path
if $file_path_ok; then
echo "PASS"
fi
unset file_path_ok
fi
if $pkg_lint_error; then
exit 1
else
exit 0
fi
)
local ret=$?
echo
return "$ret"
}
linter_main() {
local package_counter=0
local problems_found=false
local package_script
for package_script in "$@"; do
if ! lint_package "$package_script"; then
problems_found=true
break
fi
package_counter=$((package_counter + 1))
done
if $problems_found; then
echo "================================================================"
echo
echo "A problem has been found in '$(realpath --relative-to="$REPO_DIR" "$package_script")'."
echo "Checked $package_counter packages before first error was detected."
echo
echo "================================================================"
return 1
else
echo "================================================================"
echo
echo "Checked $package_counter packages."
echo "Everything seems ok."
echo
echo "================================================================"
fi
return 0
}
if [ $# -eq 0 ]; then
linter_main "$PACKAGES_DIR"/*/build.sh || exit 1
else
linter_main "$@" || exit 1
fi