* [PATCH v5] deb-dl-dir class rework to use faster ln -P or fallback to cp
@ 2023-02-10 12:42 roberto.foglietta
0 siblings, 0 replies; only message in thread
From: roberto.foglietta @ 2023-02-10 12:42 UTC (permalink / raw)
To: isar-users; +Cc: roberto.foglietta
From: "Roberto A. Foglietta" <roberto.foglietta@gmail.com>
deb-dl-dir, feature: faster when using ln -P otherwise fallback to cp
The original class functions deb_dl_dir_import/export were using cp to
copy debian package to the target rootfs but this approach is quite slow
while using hard link does not work if the destination and source dirs
are not lying on the same filesystem. Thus, ln -P should fallback to cp
when it does not work (which is different from complaining on stderr).
Moreover, these two functions have been reworked to reach a straight
forward and more compact form. In particular, export function was using
bashism to do some kind of comparison which after all is useless
because copying back without overwriting just fulfills that part.
More rework using sudo in a different way plus a corner case
addressingi, in case the spia file exists for some other reasons.
Rebased on the current next and bugfix about checking the destination
not the source file. It does not delete a package but touch a test file
to link.
Signed-off-by: Roberto A. Foglietta <roberto.foglietta@gmail.com>
---
meta/classes/deb-dl-dir.bbclass | 55 +++++++++++++++++++--------------
1 file changed, 32 insertions(+), 23 deletions(-)
diff --git a/meta/classes/deb-dl-dir.bbclass b/meta/classes/deb-dl-dir.bbclass
index 7db25251..21925c9f 100644
--- a/meta/classes/deb-dl-dir.bbclass
+++ b/meta/classes/deb-dl-dir.bbclass
@@ -78,39 +78,48 @@ debsrc_download() {
deb_dl_dir_import() {
export pc="${DEBDIR}/${2}"
- export rootfs="${1}"
- sudo mkdir -p "${rootfs}"/var/cache/apt/archives/
+ export sc="${1}/var/cache/apt/archives/"
+ export tf="ln-P-write-test.ok"
+ sudo mkdir -p "${sc}"
[ ! -d "${pc}" ] && return 0
- flock -s "${pc}".lock -c '
+ flock -Fs "${pc}".lock sudo -Es << 'EOFSUDO'
set -e
printenv | grep -q BB_VERBOSE_LOGS && set -x
- sudo find "${pc}" -type f -iname "*\.deb" -exec \
- ln -Pf -t "${rootfs}"/var/cache/apt/archives/ {} +
- '
+ rm -f "${sc}/${tf}"
+ touch "${pc}/${tf}" || exit 1
+ ln -Pf -t "${sc}" "${pc}/${tf}" 2>/dev/null ||:
+ if [ -r "${sc}/${tf}" ]; then
+ find "${pc}" -type f -iname "*\.deb" -exec \
+ ln -Pf -t "${sc}" {} +
+ else
+ find "${pc}" -type f -iname "*\.deb" -exec \
+ cp -np owner --reflink=auto -t "${sc}" {} +
+ fi
+ rm -f "${pc}/${tf}"
+EOFSUDO
}
deb_dl_dir_export() {
export pc="${DEBDIR}/${2}"
- export rootfs="${1}"
+ export sc="${1}/var/cache/apt/archives/"
+ export tf="ln-P-write-test.ok"
mkdir -p "${pc}"
- flock "${pc}".lock -c '
+ flock -F "${pc}".lock sudo -Es << 'EOFSUDO'
set -e
printenv | grep -q BB_VERBOSE_LOGS && set -x
- find "${rootfs}"/var/cache/apt/archives/ \
- -maxdepth 1 -type f -iname '*\.deb' |\
- while read p; do
- # skip files from a previous export
- [ -f "${pc}/${p##*/}" ] && continue
- # can not reuse bitbake function here, this is basically
- # "repo_contains_package"
- package=$(find "${REPO_ISAR_DIR}"/"${DISTRO}" -name ${p##*/})
- if [ -n "$package" ]; then
- cmp --silent "$package" "$p" && continue
- fi
- sudo ln -Pf "${p}" "${pc}"
- done
- sudo chown -R $(id -u):$(id -g) "${pc}"
- '
+ rm -f "${pc}/${tf}"
+ touch "${sc}/${tf}" || exit 1
+ ln -Pf -t "${pc}" "${sc}/${tf}" 2>/dev/null ||:
+ if [ -r "${pc}/${tf}" ]; then
+ find "${sc}" -maxdepth 1 -type f -iname '*\.deb' \
+ -exec ln -P -t "${pc}" {} + 2>/dev/null ||:
+ else
+ find "${sc}" -maxdepth 1 -type f -iname '*\.deb' \
+ -exec cp -n --reflink=auto -t "${pc}" {} +
+ fi
+ rm -f "${sc}/${tf}"
+ chown -R $(id -u):$(id -g) "${pc}"
+EOFSUDO
}
--
2.34.1
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-02-10 12:42 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-10 12:42 [PATCH v5] deb-dl-dir class rework to use faster ln -P or fallback to cp roberto.foglietta
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox