summaryrefslogtreecommitdiff
path: root/include/env
diff options
context:
space:
mode:
Diffstat (limited to 'include/env')
-rw-r--r--include/env/get.sh91
1 files changed, 60 insertions, 31 deletions
diff --git a/include/env/get.sh b/include/env/get.sh
index 09126297..0ed9d6cc 100644
--- a/include/env/get.sh
+++ b/include/env/get.sh
@@ -3,52 +3,83 @@
# Copyright (c) 2020-2021,2023-2026 Leah Rowe <leah@libreboot.org>
# Copyright (c) 2022 Caleb La Grange <thonkpeasant@protonmail.com>
-eval "`newvar url bkup_url depend loc subcurl subcurl_bkup subgit subgit_bkup \
- subhash`"
+eval "`newvar url bkup_url fetch_depend loc subcurl subcurl_bkup subgit \
+ subgit_bkup subhash badhash badtghash`"
tmpgit="$xbtmp/gitclone"
tmpgitcache="$xbtmp/tmpgit"
-multi_tree_fetch()
+# delete a source tree and corresponding builds if metadata changed
+# inside config/ - this is done by hashing a concatenation of hashes
+# from all metadata, checked against a previously calculated hash
+
+delete_old_project_files()
{
- [ -d "src/$project/$tree" ] && return 0
+ # delete an entire source tree along with its builds:
+ same_pjhash mhash "$tree" badhash "$datadir" \
+ "$configdir/$tree" "$mdir" || \
+ x_ rm -Rf "src/$project/$tree" "elf/$project/$tree"
- git_prep "$url" "$bkup_url" "$xbmkpwd/$configdir/$tree/patches" \
- "src/$project/$tree" "submod"
+ x_ cp "$xbtmp/new.hash" "$XBMK_CACHE/mhash/$project$tree"
+
+ if [ -n "$target" ] && [ "$target" != "$tree" ]; then
+ # delete only target builds, if only the target changed
+ same_pjhash mtghash "$target" badtghash "$configdir/$target" \
+ || x_ rm -Rf "elf/$project/$tree/$target"
+
+ x_ cp "$xbtmp/new.hash" "$XBMK_CACHE/mtghash/$project$target"
+ fi
}
-single_tree_fetch()
+same_pjhash()
{
- xgcctree=""
+ eval "`newvar hash old_hash`"
+
+ hashdir="$1"
+ hashname="$2"
+ badhashvar="$3"
- . "config/git/$project/pkg.cfg" || \
- err "Can't read config 'config/git/$project/pkg.cfg'" \
- "single_tree_fetch" "@"
+ shift 3
- if [ -z "$url" ] || [ -z "$bkup_url" ]; then
- err "url/bkup_url not both set 'config/git/$project/pkg.cfg'" \
- "single_tree_fetch" "$@"
+ x_ mkdir -p "$XBMK_CACHE/$hashdir"
+
+ if [ -f "$XBMK_CACHE/$hashdir/$project$hashname" ]; then
+ read -r old_hash < "$XBMK_CACHE/$hashdir/$project$hashname" \
+ || err \
+ "$hashdir: err '$XBMK_CACHE/$hashdir/$project$hashname'" \
+ same_pjhash "$hashdir" "$hashname" "$badhashvar" "$@"
fi
- [ -n "$xgcctree" ] && \
- x_ "$mk" -f coreboot "$xgcctree"
+ eval "$build_sbase"
+ fx_ "x_ util/sbase/sha512sum" find "$@" -type f -not -path \
+ "*/.git*/*" | awk '{print $1}' > "$xbtmp/tmp.hash" || \
+ err "!h $project $hashdir" \
+ "same_pjhash" "$hashdir" "$hashname" "$badhashvar" "$@"
+
+ hash="$(x_ "$sha512sum" "$xbtmp/tmp.hash" | awk '{print $1}' || \
+ err)" || err "$hashname: Can't read sha512 of '$xbtmp/tmp.hash'" \
+ "same_pjhash" "$hashdir" "$hashname" "$badhashvar" "$@"
+
+ if [ "$hash" != "$old_hash" ] || \
+ [ ! -f "$XBMK_CACHE/$hashdir/$project$hashname" ]; then
+ eval "$badhashvar=\"y\""
+ fi
- [ -n "$depend" ] && \
- for d in $depend ; do
- x_ "$mk" -f $d
- done
+ printf "%s\n" "$hash" > "$xbtmp/new.hash" || \
+ err "!mkhash $xbtmp/new.hash ($hashdir $hashname $badhashvar)" \
+ "same_pjhash" "$hashdir" "$hashname" "$badhashvar" "$@"
- $if_single_tree \
- clone_project; :
+ eval "[ \"\$$badhashvar\" = \"y\" ] && return 1"; :
}
-clone_project()
+fetch_trees()
{
- loc="src/$project"
- [ -d "$loc" ] && return 0
+ [ -d "src/$project/$tree" ] && return 0
- remkdir "${tmpgit%/*}"
- git_prep "$url" "$bkup_url" "$xbmkpwd/config/$project/patches" "$loc"
+ mk_dependencies -f $fetch_depend
+
+ git_prep "$url" "$bkup_url" "$xbmkpwd/$configdir/$tree/patches" \
+ "src/$project/$tree"
}
git_prep()
@@ -59,12 +90,10 @@ git_prep()
_loc="$4" # $1 and $2 are gitrepo and gitrepo_backup
[ -z "$rev" ] && \
- err "$project/$tree: rev not set" "git_prep" "$@"
+ err "$project/$tree: rev unset" "git_prep" "$@"
xbget git "$1" "$2" "$tmpgit" "$rev" "$_patchdir"
- if singletree "$project" || [ $# -gt 4 ]; then
- dx_ fetch_submodule "$mdir/module.list"
- fi
+ dx_ fetch_submodule "$mdir/module.list"
[ "$_loc" != "${_loc%/*}" ] && \
x_ mkdir -p "${_loc%/*}"