summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbill-auger <mr.j.spam.me@gmail.com>2022-09-19 04:20:43 -0400
committerbill-auger <mr.j.spam.me@gmail.com>2023-12-14 17:13:11 -0500
commitefc8eb348c95534fd7fdef981f44d843428c435e (patch)
treedb5424f7ae72d434eef81eb76ee77903be913121
parent339419f26b404fa9277b5fefbe40ed727913f0bf (diff)
[parabola-dependents]: wip
-rwxr-xr-xparabola-dependents80
1 files changed, 59 insertions, 21 deletions
diff --git a/parabola-dependents b/parabola-dependents
index 02a121f..2b6b02f 100755
--- a/parabola-dependents
+++ b/parabola-dependents
@@ -108,41 +108,68 @@ LogScriptError() # (source_file func_name line_n)
LogError "in ${func_name}\n${line_n}: ${err_loc=}\n"
}
-ParsePkgbuilds() # ("abs_dir")
-{
+ParsePkgbuilds() # ("abs_dir" "dep_chains")
+(
local abs_dir="$1"
+ local dep_chains=( "${@:2}" )
local pkgbuild repo pkgbase
+# echo "ParsePkgbuilds() (${#dep_chains[@]}) dep_chains=${dep_chains[@]}" >&2 # ; return ;
+# for ea in "${dep_chains[@]}" ; do echo "=$ea" >&2 ; done ; return ;
+ set +o errexit +o errtrace ; trap '' EXIT INT TERM ERR ; # reset debug traps
cd "${abs_dir}"
for pkgbuild in $(find . -name PKGBUILD)
- do if git ls-tree master ${pkgbuild} | grep -E '/PKGBUILD$' > /dev/null &&
- ( source ${pkgbuild} ; grep ${DEP} <<<${makedepends[*]} > /dev/null )
- then repo=$( sed -E "${PKGBUILD_SED_RX}" <<<${pkgbuild} | cut -d ' ' -f 1)
+ do git ls-tree master ${pkgbuild} | grep -E '/PKGBUILD$' > /dev/null || continue
+
+# echo "ParsePkgbuilds() pkgbuild=${pkgbuild}" >&2
+
+ source ${pkgbuild}
+# continue
+ if grep ^${DEP}$ <<<${makedepends[*]} > /dev/null || false
+ then # parse direct makedepends
+ repo=$( sed -E "${PKGBUILD_SED_RX}" <<<${pkgbuild} | cut -d ' ' -f 1)
pkgbase=$(sed -E "${PKGBUILD_SED_RX}" <<<${pkgbuild} | cut -d ' ' -f 2)
echo ${repo}/${pkgbase}
+ else # collect transitive makedepends
+ for makedepend in ${makedepends[*]}
+ do
+: # TODO:
+ if grep " ${makedepend} " <<<${dep_chains[@]} > /dev/null
+ then
+echo "ParsePkgbuilds() pkgbuild=${pkgbuild} makedepend=${makedepend} in-chain" >&2
+# else echo "ParsePkgbuilds() pkgbuild=${pkgbuild} makedepend=${makedepend} not in-chain" >&2
+ fi
+ done
fi
done
-}
+)
IsArchRepo() # (repo)
{
local repo=$1 ; [[ "${repo}" =~ ^(community|core|extra|multilib|testing)$ ]]
}
+IsFirstOrderDep() # ("dep_chain")
+{
+ local dep_chain="$@"
+
+ (( $(tr '<' '\n' <<<${dep_chain} | wc -l) == 2 ))
+}
+
PrintDependent() # ("dep_chain")
{
local dep_chain="$@"
- local is_hiorder_dep=$( (( $(tr '<' '\n' <<<${dep_chain} | wc -l) > 2 )) && echo 1 || echo 0 )
local via_pkg repo_pkg
+ declare -i n_hiorder_deps
if (( BE_VERBOSE ))
then # display all transitive dependents
echo " ${dep_chain/ /${SEP_CHAR}}"
- elif ! (( is_hiorder_dep ))
+ elif IsFirstOrderDep "${dep_chain}"
then # display only first-order dependents
via_pkg=$(sed 's|.*\] <- \([^ ]*\).*|\1|' <<<${dep_chain})
repo_pkg=${dep_chain/ *}
- n_hiorder_deps=$(( ${HiorderDependents[${via_pkg}]} - 1 ))
+ n_hiorder_deps=$( tr ' ' '\n' <<<${HiorderDependents[${via_pkg}]} | wc -l )
echo " ${repo_pkg}${SEP_CHAR}(${n_hiorder_deps} higher-order deps)"
fi
}
@@ -199,6 +226,7 @@ export PATH="/code/pacman-contrib/src:${PATH}"
Log "dummy package '${pkgbase}' created"
else Exit "makepkg failed"
fi
+
fi
}
@@ -210,19 +238,15 @@ CollectResults()
Log "querying database ...."
mapfile -t dep_chains < <(pactree ${PACTREE_OPTS} ${DEP} | sort)
- # parse PKGBUILDs for makedepends
- Log "searching abslibre ...."
- ParabolaMakedependents+=( $(ParsePkgbuilds "${ABSLIBRE_DIR}") )
- Log "searching abs ...."
- ArchMakedependents+=( $(ParsePkgbuilds "${ABS_PACKAGES_DIR}" ) )
- ArchMakedependents+=( $(ParsePkgbuilds "${ABS_COMMUNITY_DIR}") )
-
# compile results
n_results=$(( ${#dep_chains[@]} + ${#ParabolaMakedependents[*]} + \
- ${#ArchMakedependents[*]} ))
+ ${#ArchMakedependents[*]} )) # FIXME:
Log "compiling results for (${n_results}) dependents ...."
for dep_chain in "${dep_chains[@]}"
- do dep_pkg=$(sed 's|.*<- ||' <<<${dep_chain})
+ do # example dep_chains:
+ # first-order dep: '[$DEP] <- $dep_pkg'
+ # high-order dep: '[$DEP] <- $via_pkg <- transitive_dep <- $dep_pkg'
+ dep_pkg=$(sed 's|.*<- ||' <<<${dep_chain})
via_pkg=$(sed 's|.*\] <- \([^ ]*\).*|\1|' <<<${dep_chain})
repos="$(pacman ${PACMAN_OPTS} -Si ${dep_pkg} | grep Repository | \
cut -d ':' -f 2 | tr -d ' ' )"
@@ -231,21 +255,35 @@ CollectResults()
do if IsArchRepo ${repo}
then ArchDependents+=( "${repo}/${dep_pkg} ${dep_chain}" )
else ParabolaDependents+=( "${repo}/${dep_pkg} ${dep_chain}" )
- HiorderDependents[${via_pkg}]=$(( ${HiorderDependents[${via_pkg}]} + 1 ))
fi
+ HiorderDependents[${via_pkg}]="${HiorderDependents[${via_pkg}]} ${dep_pkg}"
done
done
+
+ # parse PKGBUILDs for makedepends
+ Log "searching abslibre ...."
+ ParabolaMakedependents+=( $(ParsePkgbuilds "${ABSLIBRE_DIR}" "${dep_chains[@]}") )
+return
+ Log "searching abs ...."
+ ArchMakedependents+=( $(ParsePkgbuilds "${ABS_PACKAGES_DIR}" "${dep_chains[@]}") )
+ ArchMakedependents+=( $(ParsePkgbuilds "${ABS_COMMUNITY_DIR}" "${dep_chains[@]}") )
}
PrintReport()
{
local dep_chain
- declare -i n_hiorder_deps
+ local has_firstorder_deps=0
# report parabola abslibre packages with some degree of run-time dependency
# on the input package or sodep
if (( ${#ParabolaDependents[*]} ))
- then Log "\ndirect$( ! (( BE_VERBOSE )) || echo " and transitive") parabola dependents:"
+ then for dep_chain in "${ParabolaDependents[@]}"
+ do IsFirstOrderDep "${dep_chain}" && has_firstorder_deps=1 || :
+ done
+ if (( BE_VERBOSE || has_firstorder_deps ))
+ then Log "\ndirect$( ! (( BE_VERBOSE )) || echo " and transitive") parabola dependents:"
+ fi
+# echo "PrintReport() ${ParabolaDependents[*]}"
for dep_chain in "${ParabolaDependents[@]}"
do PrintDependent "${dep_chain}"
done | column --table --separator="${SEP_CHAR}" --table-wrap=2