diff options
Diffstat (limited to 'include/git.sh')
-rw-r--r--[-rwxr-xr-x] | include/git.sh | 212 |
1 files changed, 118 insertions, 94 deletions
diff --git a/include/git.sh b/include/git.sh index 04143540..2c43cd22 100755..100644 --- a/include/git.sh +++ b/include/git.sh @@ -1,130 +1,154 @@ # SPDX-License-Identifier: GPL-3.0-or-later -# SPDX-FileCopyrightText: 2020,2021,2023,2024 Leah Rowe <leah@libreboot.org> -# SPDX-FileCopyrightText: 2022 Caleb La Grange <thonkpeasant@protonmail.com> +# Copyright (c) 2020-2021,2023-2024 Leah Rowe <leah@libreboot.org> +# Copyright (c) 2022 Caleb La Grange <thonkpeasant@protonmail.com> -eval "$(setvars "" _target rev _xm loc url bkup_url depend tree_depend xtree)" +eval `setvars "" loc url bkup_url subfile subhash subrepo subrepo_bkup \ + depend subfile_bkup repofail` -fetch_project_trees() +fetch_targets() { - _target="${target}" - [ -d "src/${project}/${project}" ] || fetch_from_upstream - fetch_config - if [ -d "src/${project}/${tree}" ]; then - printf "download/%s %s (%s): exists\n" \ - "${project}" "${tree}" "${_target}" 1>&2 - return 0 - fi - prepare_new_tree + [ -n "$tree_depend" ] && [ "$tree_depend" != "$tree" ] && \ + x_ ./mk -f "$project" "$tree_depend" + e "src/$project/$tree" d && return 0 + + printf "Creating %s tree %s\n" "$project" "$tree" + git_prep "$loc" "$loc" "$PWD/$configdir/$tree/patches" \ + "src/$project/$tree" u; nuke "$project/$tree" "$project/$tree" } -fetch_from_upstream() +fetch_project() { - [ -d "src/${project}/${project}" ] && return 0 + eval `setvars "" xtree tree_depend` + eval `setcfg "config/git/$project/pkg.cfg"` - x_ mkdir -p "src/${project}" - fetch_project_repo "${project}" -} + chkvars url -fetch_config() -{ - rm -f "${cfgsdir}/"*/seen || $err "fetch_config ${cfgsdir}: !rm seen" - eval "$(setvars "" xtree tree_depend)" - while true; do - eval "$(setvars "" rev tree)" - _xm="fetch_config ${project}/${_target}" - load_target_config "${_target}" - [ "${_target}" = "${tree}" ] && break - _target="${tree}" + [ -n "$xtree" ] && x_ ./mk -f coreboot "$xtree" + [ -z "$depend" ] || for d in $depend ; do + printf "'%s' needs '%s'; grabbing '%s'\n" "$project" "$d" "$d" + x_ ./mk -f $d done - [ -n "$tree_depend" ] && [ "$tree_depend" != "$tree" ] && \ - x_ ./update trees -f "$project" "$tree_depend"; return 0 + clone_project + + for x in config/git/*; do + [ -d "$x" ] && nuke "${x##*/}" "src/${x##*/}" 2>/dev/null + done; return 0 } -load_target_config() +clone_project() { - [ -f "$cfgsdir/$1/target.cfg" ] || $err "$1: target.cfg missing" - [ -f "${cfgsdir}/${1}/seen" ] && \ - $err "${_xm} check: infinite loop in tree definitions" + loc="$XBMK_CACHE/repo/$project" && singletree "$project" && \ + loc="src/$project" + printf "Downloading project '%s' to '%s'\n" "$project" "$loc" - . "$cfgsdir/$1/target.cfg" || $err "load_target_config !$cfgsdir/$1" - touch "$cfgsdir/$1/seen" || $err "load_config $cfgsdir/$1: !mk seen" + e "$loc" d missing && remkdir "${tmpgit%/*}" && git_prep \ + "$url" "$bkup_url" "$PWD/config/$project/patches" "$loc"; : } -prepare_new_tree() +git_prep() { - printf "Creating %s tree %s (%s)\n" "$project" "$tree" "$_target" + _patchdir="$3"; _loc="$4" # $1 and $2 are gitrepo and gitrepo_backup + + chkvars rev; tmpclone "$1" "$2" "$tmpgit" "$rev" "$_patchdir" + if singletree "$project" || [ $# -gt 4 ]; then + prep_submodules "$_loc"; fi + + [ "$project" = "coreboot" ] && [ -n "$xtree" ] && [ $# -gt 2 ] && \ + [ "$xtree" != "$tree" ] && link_crossgcc "$_loc" + [ "$XBMK_RELEASE" = "y" ] && \ + [ "$_loc" != "$XBMK_CACHE/repo/$project" ] && rmgit "$tmpgit" - cp -R "src/${project}/${project}" "${tmpgit}" || \ - $err "prepare_new_tree ${project}/${tree}: can't make tmpclone" - git_prep "$PWD/$cfgsdir/$tree/patches" "src/$project/$tree" "update" + move_repo "$_loc" } -fetch_project_repo() +prep_submodules() { - eval "$(setvars "" xtree tree_depend)" - - scan_config "${project}" "config/git" - [ -z "${loc+x}" ] && $err "fetch_project_repo $project: loc not set" - [ -z "${url+x}" ] && $err "fetch_project_repo $project: url not set" + [ -f "$mdir/module.list" ] && while read -r msrcdir; do + fetch_submodule "$msrcdir" + done < "$mdir/module.list"; return 0 +} - clone_project - [ -z "${depend}" ] || for d in ${depend} ; do - x_ ./update trees -f ${d} +fetch_submodule() +{ + mcfgdir="$mdir/${1##*/}" + eval `setvars "" subhash subrepo subrepo_bkup subfile subfile_bkup st` + [ ! -f "$mcfgdir/module.cfg" ] || . "$mcfgdir/module.cfg" || \ + $err "! . $mcfgdir/module.cfg" + + for xt in repo file; do + _seval="if [ -n \"\$sub$xt\" ] || [ -n \"\$sub${xt}_bkup\" ]" + eval "$_seval; then st=\"\$st \$xt\"; fi" done - rm -Rf "${tmpgit}" || $err "fetch_repo: !rm -Rf ${tmpgit}" + st="${st# }" && [ "$st" = "repo file" ] && $err "$mdir: repo+file" + + [ -z "$st" ] && return 0 # subrepo/subfile not defined + chkvars "sub${st}" "sub${st}_bkup" "subhash" + + [ "$st" = "file" ] && download "$subfile" "$subfile_bkup" \ + "$tmpgit/$1" "$subhash" && return 0 + rm -Rf "$tmpgit/$1" || $err "!rm '$mdir' '$1'" + tmpclone "$subrepo" "$subrepo_bkup" "$tmpgit/$1" "$subhash" \ + "$mdir/${1##*/}/patches" } -clone_project() +livepull="n" +tmpclone() { - loc="${loc#src/}" - loc="src/${loc}" - if [ -d "${loc}" ]; then - printf "%s already exists, so skipping download\n" "$loc" 1>&2 - return 0 + [ "$repofail" = "y" ] && \ + printf "Cached clone failed; trying online.\n" 1>&2 && livepull="y" + + repofail="n" + + [ $# -lt 6 ] || rm -Rf "$3" || $err "git retry: !rm $3 ($1)" + repodir="$XBMK_CACHE/repo/${1##*/}" && [ $# -gt 5 ] && repodir="$3" + mkdir -p "$XBMK_CACHE/repo" || $err "!rmdir $XBMK_CACHE/repo" + + if [ "$livepull" = "y" ] && [ ! -d "$repodir" ]; then + git clone $1 "$repodir" || git clone $2 "$repodir" || \ + $err "!clone $1 $2 $repodir $4 $5" # + elif [ -d "$repodir" ] && [ $# -lt 6 ]; then + git -C "$repodir" pull || sleep 3 || git -C "$repodir" pull \ + || sleep 3 || git -C "$repodir" pull || : fi + ( + [ $# -gt 5 ] || git clone "$repodir" "$3" || $err "!clone $repodir $3" + git -C "$3" reset --hard "$4" || $err "!reset $1 $2 $3 $4 $5" + git_am_patches "$3" "$5" + ) || repofail="y" + + [ "$repofail" = "y" ] && [ $# -lt 6 ] && tmpclone $@ retry + [ "$repofail" = "y" ] && $err "!clone $1 $2 $3 $4 $5"; : +} - git clone $url "$tmpgit" || git clone $bkup_url "$tmpgit" \ - || $err "clone_project: could not download ${project}" - git_prep "$PWD/config/$project/patches" "$loc" +git_am_patches() +{ + for p in "$2/"*; do + [ -L "$p" ] && continue; [ -e "$p" ] || continue + [ -d "$p" ] && git_am_patches "$1" "$p" && continue + [ ! -f "$p" ] || git -C "$1" am "$p" || $err "$1 $2: !am $p" + done; return 0 } -git_prep() +link_crossgcc() { - _patchdir="$1" - _loc="$2" - - [ -z "${rev+x}" ] && $err "git_prep $_loc: rev not set" - git -C "$tmpgit" reset --hard $rev || $err "git -C $_loc: !reset $rev" - git_am_patches "$tmpgit" "$_patchdir" || $err "!am $_loc $_patchdir" - - if [ "$project" != "coreboot" ] || [ $# -gt 2 ]; then - [ ! -f "$tmpgit/.gitmodules" ] || git -C "$tmpgit" submodule \ - update --init --checkout || $err "git_prep $_loc: !submod" - if [ "$project" = "coreboot" ] && [ -n "$xtree" ] && \ - [ "$xtree" != "$tree" ]; then - ( - cd "$tmpgit/util" || $err "prep $_loc: !cd $tmpgit/util" - rm -Rf crossgcc || $err "prep $_loc: !rm xgcc" - ln -s "../../$xtree/util/crossgcc" crossgcc || \ - $err "prep $_loc: can't create xgcc symlink" - ) || $err "prep $_loc: can't create xgcc symlink" - fi - fi + ( + x_ cd "$tmpgit/util" && x_ rm -Rf crossgcc + ln -s "../../$xtree/util/crossgcc" crossgcc || $err "$1: !xgcc link" + ) || $err "$1: !xgcc link" +} - [ "$_loc" = "${_loc%/*}" ] || x_ mkdir -p "${_loc%/*}" - mv "$tmpgit" "$_loc" || $err "git_prep: !mv $tmpgit $_loc" - [ -n "$xtree" ] && [ ! -d "src/coreboot/$xtree" ] && \ - x_ ./update project trees -f coreboot "$xtree"; return 0 +move_repo() +{ + [ "$1" = "${1%/*}" ] || x_ mkdir -p "${1%/*}" + mv "$tmpgit" "$1" || $err "git_prep: !mv $tmpgit $1" } -git_am_patches() +# can delete from multi- and single-tree projects. +# called from script/trees when downloading sources. +nuke() { - for _patch in "$2/"*; do - [ -L "$_patch" ] || [ ! -f "$_patch" ] || git -C "$1" am \ - "$_patch" || $err "git_am $1 $2: !git am $_patch"; continue - done - for _patches in "$2/"*; do - [ ! -L "$_patches" ] && [ -d "$_patches" ] && \ - git_am_patches "$1" "$_patches"; continue - done + e "config/${1%/}/nuke.list" f missing || while read -r nukefile; do + rmf="src/${2%/}/$nukefile" && [ -L "$rmf" ] && continue + e "$rmf" e missing || rm -Rf "$rmf" || $err "!rm $rmf, ${2%/}" + done < "config/${1%/}/nuke.list"; return 0 } |