erpnext
The pip install is used to install editable Python packages (frappe and erpnext) from the locally built source, which is downloaded from the project's official GitHub repository, posing minimal supply-chain risk.
Triggered rules
llm_review
The static rules flagged this MEDIUM, but an AI model (qwen/qwen3-235b-a22b-2507) reviewed the full PKGBUILD and judged it LOW (confidence 95%): The pip install is used to install editable Python packages (frappe and erpnext) from the locally built source, which is downloaded from the project's official GitHub repository, posing minimal supply-chain risk.
-
PKGBUILD:67
"${pkgdir}"/usr/share/webapps/"${pkgname}"/env/bin/python -m pip install -e "${_path}"
1 higher static finding superseded - not the current verdict (shown for transparency)
pip_install_external
`pip install <package>` fetches an unpinned package from PyPI at build time, outside source=() and makepkg's checksums.
-
PKGBUILD:64
"${pkgdir}"/usr/share/webapps/"${pkgname}"/env/bin/python -m pip install wheel
PKGBUILD
2 offending line(s) highlighted#!/usr/bin/env bash
# shellcheck disable=SC2034
# shellcheck disable=SC2154
# The PKGBUILD for ERPNext.
# Maintainer: Matheus <matheusgwdl@protonmail.com>
# Contributor: Matheus <matheusgwdl@protonmail.com>
readonly _version_frappe="v16.54.0"
pkgname="erpnext"
pkgver="16.52.1"
pkgrel="1"
pkgdesc="Free and open source Enterprise Resource Planning (ERP)."
arch=("x86_64")
url="https://github.com/frappe/${pkgname}"
license=("GPL-3.0-or-later")
depends=("frappe-bench" "libmaxminddb" "mariadb" "nodejs" "python" "python-pycups" "wkhtmltopdf")
makedepends=("npm" "python-build" "python-installer" "python-flit-core" "python-virtualenv" "python-wheel")
optdepends=("apache: HTTP server"
"certbot: Creates SSL certificates."
"nginx: HTTP server"
"redisearch: Faster database reading.")
install="${pkgname}.install"
source=("${pkgname}-v${pkgver}.tar.gz::${url}/archive/refs/tags/v${pkgver}.tar.gz"
"${pkgname}.sh"
"${pkgname}.sysusers"
"${pkgname}.tmpfiles")
sha512sums=("b4b8953f23f8e7f0299b7ebfffa4ed5c3fecad40736b0ae6c3aa11439d704cddae2b6bfd4a0adca9c19b8eb9c552d9a55392f2580f50312bf54bfec5827af2ca"
"70baf45505c3cd21886fd7c820b528c655c5fa8c382f7991092ea14846eb42f43a8899232610f2dc213ea6a3cc6ead43130c083de676ecd4c93caca9283aa36e"
"d8614473bd72404bec058981d2c9c3a91ed08b931539236a5d22209e5fdc6dc044ea719c8ed336bd8e64a49508cd290a5431bf339b87b0331bd9ede1d055e8ce"
"661ca81b73544884c3024ec2c5fad689101c72f7467cf7720934bdded67eecdb666096365c4f8abe20c2fd13a1a5c831a990490872024fe3093e35459be8d47b")
build()
{
cd "${srcdir}"/ || exit 1
bench init --frappe-branch "${_version_frappe}" "${pkgname}"
cd "${srcdir}"/"${pkgname}"/ || exit 1
bench get --branch v"${pkgver}" --resolve-deps "${pkgname}" "${url}.git"
bench new-site --db-name "${pkgname}" --set-default "${pkgname}"
bench --site "${pkgname}" install-app "${pkgname}"
}
package()
{
# Assure that the directories exist.
mkdir -p "${pkgdir}"/usr/bin/
mkdir -p "${pkgdir}"/usr/lib/sysusers.d/
mkdir -p "${pkgdir}"/usr/share/doc/"${pkgname}"/
mkdir -p "${pkgdir}"/usr/share/webapps/"${pkgname}"/
# Install the software.
cp -r "${srcdir}"/"${pkgname}"/* "${pkgdir}"/usr/share/webapps/"${pkgname}"/
install -Dm755 "${srcdir}"/"${pkgname}".sh "${pkgdir}"/usr/bin/"${pkgname}"
install -Dm644 "${srcdir}"/"${pkgname}".sysusers "${pkgdir}"/usr/lib/sysusers.d/"${pkgname}".conf
install -Dm644 "${srcdir}"/"${pkgname}".tmpfiles "${pkgdir}"/usr/lib/tmpfiles.d/"${pkgname}".conf
## Edit paths which were written during the build process. Configuration files are going to be altered as well as .pyc.
declare -r _files=$(grep -lr "${srcdir}"/"${pkgname}/" "${pkgdir}"/usr/share/webapps/"${pkgname}"/)
echo "${_files}" | xargs sed -i "s|${srcdir}/${pkgname}/|/usr/share/webapps/${pkgname}/|g"
## Rebuild the software since their contents were manipulated.
rm -r "${pkgdir}"/usr/share/webapps/"${pkgname}"/env/
python -m venv "${pkgdir}"/usr/share/webapps/"${pkgname}"/env/
"${pkgdir}"/usr/share/webapps/"${pkgname}"/env/bin/python -m pip install wheel
for _path in "${pkgdir}/usr/share/webapps/${pkgname}/apps/frappe/" "${pkgdir}/usr/share/webapps/${pkgname}/apps/erpnext/"; do
"${pkgdir}"/usr/share/webapps/"${pkgname}"/env/bin/python -m pip install -e "${_path}"
cd "${_path}" || exit 1
yarn install
yarn --check-files
done
cd "${pkgdir}"/usr/share/webapps/"${pkgname}"/ || exit 1
bench build --hard-link --production
bench build --app "${pkgname}" --hard-link --production
## Edit the paths for Python modules.
echo "/usr/share/webapps/${pkgname}/apps/erpnext/" > "${pkgdir}"/usr/share/webapps/"${pkgname}"/env/lib/python3.11/site-packages/erpnext.pth
echo "/usr/share/webapps/${pkgname}/apps/frappe/" > "${pkgdir}"/usr/share/webapps/"${pkgname}"/env/lib/python3.11/site-packages/frappe.pth
## Correct symlinks.
rm "${pkgdir}"/usr/share/webapps/"${pkgname}"/apps/erpnext/erpnext/public/node_modules
ln -s /usr/share/webapps/"${pkgname}"/apps/erpnext/node_modules/ "${pkgdir}"/usr/share/webapps/"${pkgname}"/apps/erpnext/erpnext/public/node_modules
rm "${pkgdir}"/usr/share/webapps/"${pkgname}"/apps/frappe/frappe/public/node_modules
ln -s /usr/share/webapps/"${pkgname}"/apps/frappe/node_modules/ "${pkgdir}"/usr/share/webapps/"${pkgname}"/apps/frappe/frappe/public/node_modules
# Install the documentation.
install -Dm644 "${srcdir}"/"${pkgname}"-"${pkgver}"/README.md "${pkgdir}"/usr/share/doc/"${pkgname}"/
}
Changes since previous scan
--- PKGBUILD @ 2026-10-29 00:13+++ PKGBUILD @ 2026-11-01 00:21@@ -5,7 +5,7 @@ # Maintainer: Matheus <matheusgwdl@protonmail.com> # Contributor: Matheus <matheusgwdl@protonmail.com> -readonly _version_frappe="v16.53.0"+readonly _version_frappe="v16.54.0" pkgname="erpnext" pkgver="16.52.1"Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-11-01 00:21:48 | Low | 2 |
| 2026-10-31 00:07:41 | Low | 2 |
| 2026-10-30 00:29:30 | Low | 2 |
| 2026-10-29 03:51:44 | Medium | 1 |
| 2026-10-29 00:13:55 | Low | 2 |
| 2026-10-28 03:49:04 | Medium | 1 |
| 2026-10-28 00:06:54 | Low | 2 |
| 2026-10-27 00:23:28 | Low | 2 |
| 2026-10-26 00:12:40 | Low | 2 |
| 2026-10-25 00:20:48 | Low | 2 |
| 2026-10-24 00:14:55 | Low | 2 |
| 2026-10-23 07:37:02 | Medium | 1 |
| 2026-10-23 00:02:19 | Low | 2 |
| 2026-10-22 17:35:31 | Medium | 1 |
| 2026-10-22 01:33:44 | Medium | 1 |
| 2026-10-22 00:13:10 | Low | 2 |
| 2026-10-21 00:12:50 | Low | 2 |
| 2026-10-20 00:10:31 | Low | 2 |
| 2026-10-19 00:03:55 | Low | 2 |
| 2026-10-18 00:06:55 | Low | 2 |