summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorLeah Rowe <leah@libreboot.org>2024-05-24 17:50:42 +0100
committerLeah Rowe <leah@libreboot.org>2024-05-24 18:58:48 +0100
commit1cb255e8be3988980446d61da8d99ab035a9f909 (patch)
tree6b458dc8fe2fd55cea0a20c949e0e213b4083dda /include
parent5d87eea77c5a6db9263f08052700bd39b7c2d4c5 (diff)
git.sh: allow finer control of git submodules
in each submodule configuration directory, a module.cfg file can now be provided. in it, the user can specify two repository links (main and backup) and a revision, like so: subrepo="repo link goes here" subrepo_bkup="backup repo link goes here" subrev="git revision id goes here" additionally: in the *main* project directory for the submodules, a module.list file can be provided. example entries: 3rdparty/vboot 3rdparty/libgfxinit if the module.list file is provided, only those submodules will be downloaded. this can be combined with the module.cfg files, if you wish, but it's optional. you can mix and match. example locations: multi-tree project: config/submodule/coreboot/default/module.list config/submodule/coreboot/default/vboot/module.cfg single-tree project: config/submodule/flashprog/module.list config/submodule/flashprog/foo/module.cfg *no* configuration files have been provided, in this commit, which means that the current behaviour is maintained. follow-up commits will absolutely configure the submodules. this is being done to reduce the number of modules downloaded, because we don't use most of the coreboot submodules that are downloaded, thus wasting bandwidth and the releases are also much bigger than necessary. Signed-off-by: Leah Rowe <leah@libreboot.org>
Diffstat (limited to 'include')
-rwxr-xr-xinclude/git.sh53
1 files changed, 48 insertions, 5 deletions
diff --git a/include/git.sh b/include/git.sh
index 569daeab..f82fd103 100755
--- a/include/git.sh
+++ b/include/git.sh
@@ -2,7 +2,8 @@
# SPDX-FileCopyrightText: 2020,2021,2023,2024 Leah Rowe <leah@libreboot.org>
# SPDX-FileCopyrightText: 2022 Caleb La Grange <thonkpeasant@protonmail.com>
-eval "$(setvars "" _target rev _xm loc url bkup_url depend tree_depend xtree)"
+eval "$(setvars "" _target rev _xm loc url bkup_url depend tree_depend xtree \
+ mdir subrev subrepo subrepo_bkup)"
fetch_project_trees()
{
@@ -106,17 +107,59 @@ git_prep()
prep_submodules()
{
[ -f "$tmpgit/.gitmodules" ] || return 0
- git -C "$tmpgit" submodule update --init --checkout || $err "$1: !mod"
mdir="${PWD}/config/submodule/$project"
[ -n "$tree" ] && mdir="$mdir/$tree"
- git -C "$tmpgit" submodule status | awk '{print $2}' > \
- "$tmpdir/modules" || $err "$mdir: cannot list submodules"
+ if [ -f "$mdir/module.list" ]; then
+ cat "$mdir/module.list" > "$tmpdir/modules" || \
+ $err "!cp $mdir/module.list $tmpdir/modules"
+ else
+ git -C "$tmpgit" submodule status | awk '{print $2}' > \
+ "$tmpdir/modules" || $err "$mdir: cannot list submodules"
+ fi
while read -r msrcdir; do
- git_am_patches "$tmpgit/$msrcdir" "$mdir/${msrcdir##*/}/patches"
+ fetch_submodule "$msrcdir"
+ patch_submodule "$msrcdir"
done < "$tmpdir/modules"
+
+ # some build systems may download more (we want to control it)
+ rm -f "$tmpgit/.gitmodules" || $err "!rm .gitmodules as per: $mdir"
+}
+
+fetch_submodule()
+{
+ mcfgdir="$mdir/${1##*/}"
+ eval "$(setvars "" subrev subrepo subrepo_bkup)"
+
+ [ ! -f "$mcfgdir/module.cfg" ] || . "$mcfgdir/module.cfg" || \
+ $err "! . $mcfgdir/module.cfg"
+
+ if [ -n "$subrepo" ] || [ -n "$subrepo_bkup" ]; then
+ [ -n "$subrev" ] || \
+ $err "$1 as per $mdir: subrev not defined"
+
+ rm -Rf "$tmpgit/$1" || $err "!rm '$mdir' '$1'"
+ for mod in "$subrepo" "$subrepo_bkup"; do
+ [ -z "$mod" ] && continue
+ git clone "$mod" "$tmpgit/$1" || rm -Rf "$tmpgit/$1" \
+ || $err "!rm $mod $project $cfgdir $1"
+ done
+ [ -d "$tmpgit/$1" ] || $err "!clone $mod $project $mcfgdir $1"
+ else
+ git -C "$tmpgit" submodule update --init --checkout -- "$1" || \
+ $err "$mdir: !update $1"
+ fi
+}
+
+patch_submodule()
+{
+ [ -z "$subrev" ] || \
+ git -C "$tmpgit/$1" reset --hard "$subrev" || \
+ $err "$mdir $1: cannot reset git revision"
+
+ git_am_patches "$tmpgit/$1" "$mdir/${1##*/}/patches"
}
git_am_patches()