From f0d9f2ac54ef8340979c946c90cee2a804b19018 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Soko=C5=82owski?= Date: Fri, 27 Nov 2020 12:35:21 +0100 Subject: [PATCH] nix: add a way to deal with new gradle version to docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also adjusted the `generate.sh` script and split stuff into separate function to make it easier to run specific stages of the generation process. Signed-off-by: Jakub SokoĊ‚owski --- nix/deps/gradle/README.md | 31 ++++++++++++++ nix/deps/gradle/generate.sh | 80 +++++++++++++++++++++++-------------- 2 files changed, 81 insertions(+), 30 deletions(-) diff --git a/nix/deps/gradle/README.md b/nix/deps/gradle/README.md index 436536b694..92f3bc9e8c 100644 --- a/nix/deps/gradle/README.md +++ b/nix/deps/gradle/README.md @@ -42,3 +42,34 @@ dr-xr-xr-x 3 root root 3 Jan 1 1970 commons-cli # Dependencies One dependency these scripts require is the [go-maven-resolver](https://github.com/status-im/go-maven-resolver) which turns a list of packages into list of all URLs of POMs for them and their dependencies. + +# Known Issues + +One edge case that is currently not handled by this setup is an addition of a new dependency that requires a version of Gradle we don't have. In that case running `make nix-update-gradle` would fail with: +``` +AILURE: Build failed with an exception. + +* What went wrong: +A problem occurred configuring project ':react-native-example-project'. +> Could not resolve all artifacts for configuration ':react-native-example-project:classpath'. + > Could not find com.android.tools.build:gradle:3.4.0. + Searched in the following locations: + - file:/nix/store/34a4qd5qhg2a9kq6a0q9lp7hgmi48q4x-status-react-maven-deps/com/android/tools/build/gradle/3.4.0/gradle-3.4.0.pom + - file:/nix/store/34a4qd5qhg2a9kq6a0q9lp7hgmi48q4x-status-react-maven-deps/com/android/tools/build/gradle/3.4.0/gradle-3.4.0.jar + Required by: + project :react-native-example-project +``` +This happens because `get_projects.sh` and `get_deps.sh` depend on running Gradle to generate their output, and that will not work because Gradle cannot find the matching JAR for the new dependency. + +A manual solution would involve adding that specific Gradle version into `deps.urls`: +``` +echo com.android.tools.build:gradle:3.4.0 | go-maven-resolver >> nix/deps/gradle/deps.urls +``` +Then you'll need to remove duplicates and sort `deps.urls`: +``` +sort -o nix/deps/gradle/deps.urls nix/deps/gradle/deps.urls +``` +And finally generate the `deps.json` for Nix using: +``` +nix/deps/gradle/generate.sh gen_deps_json +``` diff --git a/nix/deps/gradle/generate.sh b/nix/deps/gradle/generate.sh index f7e6c479a1..e1e040ca50 100755 --- a/nix/deps/gradle/generate.sh +++ b/nix/deps/gradle/generate.sh @@ -26,6 +26,45 @@ DEPS_JSON="${CUR_DIR}/deps.json" # Raise limit of file descriptors ulimit -n 16384 +# Generate list of Gradle sub-projects. +function gen_proj_list() { + ${CUR_DIR}/get_projects.sh | sort -u -o ${PROJ_LIST} + echo -e "Found ${GRN}$(wc -l < ${PROJ_LIST})${RST} sub-projects..." +} + +# Check each sub-project in parallel, the ":" is for local deps. +function gen_deps_list() { + PROJECTS=$(cat ${PROJ_LIST}) + ${CUR_DIR}/get_deps.sh ":" ${PROJECTS[@]} | sort -uV -o ${DEPS_LIST} + echo -e "${CLR}Found ${GRN}$(wc -l < ${DEPS_LIST})${RST} direct dependencies..." +} + +# Find download URLs for each dependency. +function gen_deps_urls() { + cat ${DEPS_LIST} | go-maven-resolver | sort -uV -o ${DEPS_URLS} + echo -e "${CLR}Found ${GRN}$(wc -l < ${DEPS_URLS})${RST} dependency URLs..." +} + +# Generate the JSON that Nix will consume. +function gen_deps_json() { + # Open the Nix attribute set. + echo -n "[" > ${DEPS_JSON} + + # Format URLs into a Nix consumable file. + URLS=$(cat ${DEPS_URLS}) + parallel --will-cite --keep-order \ + "${CUR_DIR}/url2json.sh" \ + ::: ${URLS} \ + >> ${DEPS_JSON} + + # Drop tailing comma on last object, stupid JSON + sed -i '$ s/},/}/' ${DEPS_JSON} + + # Close the Nix attribute set + echo "]" >> ${DEPS_JSON} +} + +# ------------------------------------------------------------------------------ echo "Regenerating Nix files..." # Gradle needs to be run in 'android' subfolder @@ -34,37 +73,18 @@ cd $GIT_ROOT/android # Stop gradle daemons to avoid locking ./gradlew --stop >/dev/null -# Generate list of Gradle sub-projects ---------------------------------------- -${CUR_DIR}/get_projects.sh | sort -u -o ${PROJ_LIST} +# A way to run a specific stage of generation +if [[ -n "${1}" ]] && type ${1} > /dev/null; then + ${1}; exit 0 +elif [[ -n "${1}" ]]; then + echo "No such function: ${1}"; exit 1 +fi -echo -e "Found ${GRN}$(wc -l < ${PROJ_LIST})${RST} sub-projects..." - -# Check each sub-project in parallel, the ":" is for local deps --------------- -PROJECTS=$(cat ${PROJ_LIST}) -${CUR_DIR}/get_deps.sh ":" ${PROJECTS[@]} | sort -uV -o ${DEPS_LIST} - -echo -e "${CLR}Found ${GRN}$(wc -l < ${DEPS_LIST})${RST} direct dependencies..." - -# Find download URLs for each dependency -------------------------------------- -cat ${DEPS_LIST} | go-maven-resolver | sort -uV -o ${DEPS_URLS} - -echo -e "${CLR}Found ${GRN}$(wc -l < ${DEPS_URLS})${RST} dependency URLs..." - -# Open the Nix attribute set -------------------------------------------------- -echo -n "[" > ${DEPS_JSON} - -# Format URLs into a Nix consumable file. -URLS=$(cat ${DEPS_URLS}) -parallel --will-cite --keep-order \ - "${CUR_DIR}/url2json.sh" \ - ::: ${URLS} \ - >> ${DEPS_JSON} - -# Drop tailing comma on last object, stupid JSON -sed -i '$ s/},/}/' ${DEPS_JSON} - -# Close the Nix attribute set -echo "]" >> ${DEPS_JSON} +# Run each stage in order +gen_proj_list +gen_deps_list +gen_deps_urls +gen_deps_json REL_DEPS_JSON=$(realpath --relative-to=${PWD} ${DEPS_JSON}) echo -e "${CLR}Generated Nix deps file: ${REL_DEPS_JSON#../}"