1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
#!/bin/bash
set -euo pipefail
pull () {
case $1 in
janestreet|js)
JS_GREP_ARG=""
;;
*)
JS_GREP_ARG="-v"
;;
esac
# Get a first list of revdeps candidate
REVDEPS=$(opam list -s --depends-on ppxlib.0.13.0 --coinstallable-with ocaml.4.10.0)
TRUE_REVDEPS=""
for d in $REVDEPS
do
ALL_VERS=$(opam show --field=all-versions $d)
LATEST_VER=${ALL_VERS##* }
deps=$(opam show --field=depends: $d.$LATEST_VER)
# Filter out packages that come from Janestreet mono repo and
# packages whose latest version isn't a rev dep anymore
if (opam show --field=maintainer: $d.$LATEST_VER | grep $JS_GREP_ARG "janestreet" > /dev/null) &&
(echo "$deps" | grep "ppxlib" > /dev/null) &&
(echo "$deps" | grep "dune" > /dev/null)
then
TRUE_REVDEPS="$TRUE_REVDEPS $d.$LATEST_VER"
fi
done
if [ -z "$TRUE_REVDEPS" ]
then
echo "No revdeps found for ppxlib"
exit 1
fi
mkdir -p dunireverse
cd dunireverse
for d in $TRUE_REVDEPS
do
echo "$d" >> .deps
done
cat .deps
for d in $TRUE_REVDEPS
do
basename=${d%%.*}
ver=${d#*.}
tmp=$(opam show --field=dev-repo: $d)
tmp=${tmp%\"}
tmp=${tmp#\"}
DEV_REPO=${tmp#git+}
git clone $DEV_REPO $basename
case $1 in
janestreet|js)
# To checkout to the latest released version
cd $basename
git checkout $ver || git checkout v$ver
cd ..
;;
*)
:
;;
esac
done
cd ..
}
install_deps_opam () {
cd dunireverse
for dir in */
do
basename=${dir%/}
echo "Installing $basename dependencies"
opam install --deps-only $basename/$basename.opam -y || opam install --deps-only $basename/opam -y
done
}
install_deps_duniverse () {
# Generate a dummy opam file
echo 'opam-version: "2.0"' > dunireverse.opam
echo "depends: [" >> dunireverse.opam
echo " \"ocaml\" {=\"4.10.0\"}" >> dunireverse.opam
cat dunireverse/.deps | while read line
do
basename=${line%%.*}
ver=${line#*.}
echo " \"$basename\" {=\"$ver\"}" >> dunireverse.opam
done
echo "]" >> dunireverse.opam
duniverse init
duniverse opam-install || true
duniverse pull --no-cache
cat dunireverse/.deps | while read line
do
rm -r duniverse/$line
done
}
install_deps () {
case $1 in
duniverse)
install_deps_duniverse
;;
opam|*)
install_deps_opam
;;
esac
}
build () {
PACKAGES="ppxlib"
cd dunireverse
for dir in */
do
basename=${dir%/}
PACKAGES="$PACKAGES,$basename"
done
cd ..
dune build -p $PACKAGES
}
if [ $# -ne 2 ]
then
SND_ARG=""
else
SND_ARG="$2"
fi
case $1 in
"")
pull
install_deps
build
;;
pull)
pull "$SND_ARG"
;;
install-deps)
install_deps "$SND_ARG"
;;
build)
build
;;
*)
echo "invalid subcommand $1"
exit 1
esac
|