From 00361a443922cfe09ea83907e56e8359f8c5e862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Bitteur?= Date: Mon, 17 Jun 2024 09:56:28 +0200 Subject: [PATCH] Use of Flatpak resources to populate flathub --- .gitmodules | 4 +- app/build.gradle | 3 +- dev/flathub | 1 - flatpak/README.md | 16 +- flatpak/build.gradle | 65 +++++-- flatpak/dev/languages.sh | 184 ------------------ .../dev/org.audiveris.audiveris.template.yml | 26 ++- flatpak/flathub | 1 + flatpak/{dev => res}/add-tessdata-prefix.sed | 0 .../{ => res}/org.audiveris.audiveris.desktop | 0 .../org.audiveris.audiveris.metainfo.xml | 0 11 files changed, 78 insertions(+), 222 deletions(-) delete mode 160000 dev/flathub delete mode 100644 flatpak/dev/languages.sh create mode 160000 flatpak/flathub rename flatpak/{dev => res}/add-tessdata-prefix.sed (100%) rename flatpak/{ => res}/org.audiveris.audiveris.desktop (100%) rename flatpak/{ => res}/org.audiveris.audiveris.metainfo.xml (100%) diff --git a/.gitmodules b/.gitmodules index ae4a474c5..80c0712f8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "flathub"] - path = dev/flathub +[submodule "flatpak/flathub"] + path = flatpak/flathub url = https://github.com/flathub/org.audiveris.Audiveris diff --git a/app/build.gradle b/app/build.gradle index 8a1d19c1b..bfd21f168 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -97,6 +97,7 @@ allprojects { // Run default configuration. // Heap size (and other stuff) can be modified via a 'jvmLineArgs' on gradle command line +// Application arguments can be provided via a 'cmdLineArgs' on gradle command line run { minHeapSize = '512m' maxHeapSize = '1g' @@ -361,7 +362,7 @@ def depsFile = file('build/dependencies.json') tasks.flatpakGradleGenerator { description("Collect all dependencies for Flatpak") outputFile = depsFile - downloadDirectory = '../app/build/dependencies' + downloadDirectory = 'dependencies' outputs.file(depsFile) doFirst { println "app. Generating dependencies" } diff --git a/dev/flathub b/dev/flathub deleted file mode 160000 index a7cdb3b63..000000000 --- a/dev/flathub +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a7cdb3b63f2dfc4ce580e0474e66ecd87c8c89c8 diff --git a/flatpak/README.md b/flatpak/README.md index 38d4bde19..1acb49526 100644 --- a/flatpak/README.md +++ b/flatpak/README.md @@ -22,6 +22,8 @@ Below is a simplified tree view, focused on the main source files. . ├── app │   ├── build.gradle +│   ├── build +│   │   └── ... dependencies.json │   ├── dev │   │   ├── icons │   │   │   └── ... // many .png icon images @@ -36,7 +38,7 @@ Below is a simplified tree view, focused on the main source files. │   └── src │   └── ... // a whole tree of main and test .java files ├── dev // this folder could be removed? -│   ├── flathub // a Git submodule +│   ├── flathub // the old Git submodule │   │   └── ... │   ├── flatpak // no longer used │   │   ├── ... @@ -45,13 +47,17 @@ Below is a simplified tree view, focused on the main source files. │   │   └── create-flatpak-dependencies.py │   └── icon-50.gif ├── flatpak +│   ├── README.md // this file! │   ├── build.gradle │   ├── dev -│   │   ├── add-tessdata-prefix.sed │   │   └── org.audiveris.audiveris.template.yml -│   ├── org.audiveris.audiveris.desktop -│   ├── org.audiveris.audiveris.metainfo.xml -│   └── README.md // this file! +│   └── flathub // the new Git submodule +│      ├── add-tessdata-prefix.sed +│      ├── org.audiveris.audiveris.desktop +│      ├── org.audiveris.audiveris.metainfo.xml +│      ├── ... lang_sources.yml // generated by task genLanguages +│      ├── ... org.audiveris.audiveris.yml // generated by task genManifest +│      └── ... dependencies.json // generated by task genDependencies ├── gradle │   └── wrapper │   ├── gradle-wrapper.jar diff --git a/flatpak/build.gradle b/flatpak/build.gradle index e437940a7..d8c90f3d9 100644 --- a/flatpak/build.gradle +++ b/flatpak/build.gradle @@ -17,8 +17,9 @@ plugins { id 'base' } -def app = project(':app') -def appDir = app.projectDir +def app = project(':app') +def appDir = app.projectDir +def flathubDir = new File(project.projectDir.getAbsolutePath() + "/flathub") // SHA1 computation // Stolen from https://gist.github.com/dagezi/9594839#file-calcsha1-gradle @@ -37,14 +38,13 @@ task genLanguages { description("Generate languages sources") doLast { - println "Generating language sources" - def outputDir = layout.buildDirectory.get().asFile - outputDir.exists() || outputDir.mkdirs() - def langFile = new File(outputDir, "lang_sources.yml") - - project.delete( - fileTree(langFile) - ) + ///flathubDir.exists() || flathubDir.mkdirs() + def langFile = new File(flathubDir, "lang_sources.yml") + println "Generating language sources into ${langFile}" + + project.delete( + fileTree(langFile) + ) fileTree("$appDir/dev/tessdata").include('*.traineddata').each { f -> def relPath = relativePath(f).replace("\\","/") @@ -72,6 +72,14 @@ task genDependencies { FileCollection sharedFiles = configurations.getByName("sharedConfiguration") inputs.files(sharedFiles) + + doLast { + println "Copying dependencies.json" + copy { + from('../app/build/dependencies.json') + into(flathubDir) + } + } } // Generate the Flatpak manifest by expanding key variables @@ -97,30 +105,47 @@ task genManifest { binding.TAG = '5.4-alpha-2' expand(binding) } - into('build') + into(flathubDir) rename '.template', '' } } } +// Initialize flatpak/flathub content before build +task initFlathub { + description("Populate flathub submodule") + dependsOn('genLanguages') + dependsOn('genDependencies') + dependsOn('genManifest') + + doLast { + println "Copying resources to flathub" + copy { + from('res') + into(flathubDir) + } + } +} + // Build flatpak on manifest task buildFlatpak (type: Exec) { description("Run flatpak-builder on manifest") - dependsOn('genLanguages') - dependsOn('genManifest') - dependsOn('genDependencies') + dependsOn('initFlathub') + onlyIf { app.ext.hostOSName == "linux" } doFirst { - println "Running flatpak-builder in folder $projectDir" + println "Running flatpak-builder in folder flatpak/flathub" } - // flatpak-builder is run from the subproject directory + // flatpak-builder is run from the flathub directory + workingDir 'flathub' + // All outputs are located under the 'build' directory for an easier cleanup commandLine('flatpak-builder', - '--verbose', - '--state-dir=build/.flatpak-builder', // option to define the state-storing directory +// '--verbose', +// '--state-dir=build/.flatpak-builder', // option to define the state-storing directory '--force-clean', // option to empty the output directory - 'build/output', // relative path to the output directory to write - 'build/org.audiveris.audiveris.yml') // relative path to the manifest file to read + 'build', // relative path to the output directory to write + 'org.audiveris.audiveris.yml') // relative path to the manifest file to read } diff --git a/flatpak/dev/languages.sh b/flatpak/dev/languages.sh deleted file mode 100644 index 74ac0bcda..000000000 --- a/flatpak/dev/languages.sh +++ /dev/null @@ -1,184 +0,0 @@ -#! /bin/bash -trap 'echo "ERROR in $BASH_COMMAND" >&2' ERR - -TAGNAME=4.1.0 -PROJECT=tessdata - -get_languages() { - echo "Fetching language list for $PROJECT $TAGNAME ..." >&2 - TAG=$(curl -ks "$TESSDATA/tags" | jq -r '.[] | select(.name=="'"$TAGNAME"'").commit.sha') - [[ $TAG ]] - - mapfile -t LANG \ - < <(curl -ks "$TESSDATA/git/trees/$TAG" | \ - jq -r '.tree[] | select (.path|endswith(".traineddata")) | [ .path,.sha | rtrimstr(".traineddata") ] | join(":")') - mapfile -t CURR < <(sed -nE '/url:|path:/s,.*/([a-z_]+)\.traineddata,\1,p' lang_sources.yml) -} - -print_languages() { - echo "=== Available languages ===" - - for i in "${!LANG[@]}"; do - if [[ $((i % 5)) == 4 ]]; then - printf "$i: ${LANG[$i]%:*}\n" - else - printf "$i: ${LANG[$i]%:*}\t\t" - fi - done - printf "\n" - echo "=== Currently configured languages ===" - for i in "${!CURR[@]}"; do - if [[ $((i % 5)) == 4 ]]; then - printf "$i: ${CURR[$i]%:*}\n" - else - printf "$i: ${CURR[$i]%:*}\t\t" - fi - done -} - -interactive() { - local ans - - while true; do - echo -n "enter number or abbrev to download, ENTER to end, ? to list languages: " >&2 - read ans - case $ans in - "") break;; - "?") print_languages; continue;; - esac - lang=$(find_language "$ans") - [[ $lang ]] || continue - LANGUAGES=("${LANGUAGES[@]}" "$lang") - done -} - -find_language() { - local lang=$1 - - if [[ ! $lang =~ '^[0-9]+$' ]]; then - local i=0 - while [[ $((i++)) -lt ${#LANG[@]} ]]; do - case ${LANG[$i]} in - $lang:*) - lang=$i - break;; - esac - done - fi - if [[ $lang -lt ${#LANG[@]} ]]; then - echo "${LANG[$lang]}" - echo "${LANG[$lang]} selected" >&2 - else - echo "language $lang not found" >&2 - fi -} - -declare -a LANGUAGES -CHECK= -INTERACTIVE= -LIST= - -while [[ $# -gt 0 ]]; do - echo "$1" >&2 - case $1 in - -\?|--help) - echo "Usage: -$0 [-b|--best] [-c|--check] language [language ...] -$0 [-b|--best] [-c|--check] (-i|--interactive) -$0 [-b|--best] [-l|--list] -$0 -?" >&2 - exit 0 - ;; - -l|--list) - LIST=yes - ;; - -c|--check) - CHECK=yes - ;; - -b|--best) - PROJECT=tessdata_best - ;; - -i|--interactive) - INTERACTIVE=yes - ;; - *) - break - ;; - esac - shift -done - -TESSDATA=https://api.github.com/repos/tesseract-ocr/$PROJECT -TESSDL=https://github.com/tesseract-ocr/$PROJECT/raw/$TAGNAME - -if [[ $LIST ]]; then - get_languages - print_languages - exit 0 -fi - -LANGUAGES=($@) -get_languages -if [[ $INTERACTIVE ]]; then - interactive -fi - -mkdir -p languages - -lang_files="" -for lang in "${LANGUAGES[@]}"; do - case $lang in - *:*) ;; - *) lang=$(find_language "$lang");; - esac - [[ $lang ]] || continue - hash=${lang#*:} - name=${lang%:*} - file=languages/"$name.traineddata" - if [[ -f "$file" ]]; then - echo "$file exists already, skipping" >&2 - continue - fi - echo "Fetching language data for $name ($TAGNAME) ..." >&2 - rm -f "$file" - curl -ks "$TESSDATA/git/blobs/$hash" | jq -r '.content' | \ - base64 -d >"$file" - [[ -f "$file" ]] - check=$(cat <(printf 'blob %d\0' "$(stat -c %s "$file")") "$file" | \ - sha1sum | cut -d " " -f 1) - if [[ $check != $hash ]] ; then - echo "sha1 hash of $file doesn't match expected $hash" >&2 - rm -f "$file" - continue - fi - check=$(sha1sum "$file" | cut -d " " -f 1) - if [[ $CHECK = yes ]]; then - # test if "simple" download yields the correct SHA1 - curl -ks -L -o "${file}-1" "$TESSDL/$name.traineddata" - check1=$(sha1sum "${file}-1" | cut -d " " -f 1) - else - check1=$check - fi - if [[ $check = $check1 ]]; then - echo "URL can be used for $lang" >&2 - rm -fv "$file" "${file}-1" - lang_files="$lang_files - - type: file - url: $TESSDL/$name.traineddata - sha1: $check" - else - echo "URL can't be used for $lang" >&2 - rm -fv "$file" - lang_files="$lang_files - - type: file - path: $file - sha1: $hash" - fi -done - -if [[ $lang_files ]]; then - #echo "$lang_files" >>../flathub/lang_sources.yml - #echo "../flathub/lang_sources.yml generated" >&2 - echo "$lang_files" >> build/lang_sources.yml - echo "build/lang_sources.yml generated" >&2 -fi diff --git a/flatpak/dev/org.audiveris.audiveris.template.yml b/flatpak/dev/org.audiveris.audiveris.template.yml index 4a679bb65..b04b4d0a9 100644 --- a/flatpak/dev/org.audiveris.audiveris.template.yml +++ b/flatpak/dev/org.audiveris.audiveris.template.yml @@ -1,6 +1,6 @@ # ---- # flatpak-builder manifest file template -# to be expanded and copied from flatpak/dev to flatpak/build +# to be expanded and copied from flatpak/dev to flatpak/flathub # via the gradle task :flatpak:genManifest # # Variables names and example values: @@ -45,11 +45,11 @@ modules: # (Assuming these commands are run from sandbox root) # # A few debugging stuff to be removed ASAP - - echo "=======================================================" - - echo "checking the pwd" + - echo "DEBUG =======================================================" + - echo "DEBUG checking the pwd" - pwd - ls -l - - echo "=======================================================" + - echo "DEBUG =======================================================" # We make the Gradle wrapper use our local .zip file # NOTA: mind the fact that expand() will reduce the backslashes in template, so double them! @@ -57,9 +57,11 @@ modules: - sed --regexp-extended --in-place 's,https\\\\://services.gradle.org/distributions/,,' gradle/wrapper/gradle-wrapper.properties # Copy the Tesseract language files + - echo "DEBUG Copy the Tesseract language files" - install --mode=0644 -D --target-directory=/app/share/tessdata *.traineddata # Copy some needed icons + - echo "DEBUG Copy some needed icons" - install --mode=0644 -D app/res/icon-256.png /app/share/icons/hicolor/256x256/apps/org.audiveris.audiveris.png - install --mode=0644 -D app/res/icon-64.png /app/share/icons/hicolor/64x64/apps/org.audiveris.audiveris.png - install --mode=0644 -D app/src/main/org/audiveris/omr/ui/resources/icon-48.png /app/share/icons/hicolor/48x48/apps/org.audiveris.audiveris.png @@ -68,19 +70,25 @@ modules: - install --mode=0644 -D app/src/main/org/audiveris/omr/ui/resources/icon-16.png /app/share/icons/hicolor/16x16/apps/org.audiveris.audiveris.png # Copy desktop and metainfo + - echo "DEBUG Copy desktop and metainfo" - install --mode=0644 -D org.audiveris.audiveris.desktop /app/share/applications/org.audiveris.audiveris.desktop - install --mode=0644 -D org.audiveris.audiveris.metainfo.xml /app/share/metainfo/org.audiveris.audiveris.metainfo.xml # Run Gradle build in offline mode, with a specific repository (hence the isFlatpak property) + - echo "DEBUG Copy Run Gradle build in offline mode" - gradlew -PisFlatpak --offline :flatpak:buildFlatpak # Extract lib and bin from Audiveris .tar to /app + - echo "DEBUG Extract lib and bin from Audiveris .tar to /app" - tar x --directory=/app --strip-components=1 --file app/build/distributions/Audiveris-*.tar # Insert TESSDATA_PREFIX in Audiveris sh file + - echo "DEBUG Insert TESSDATA_PREFIX in Audiveris sh file" - sed --in-place --file=add-tessdata-prefix.sed /app/bin/Audiveris + + - echo "DEBUG This is the end." sources: - # NOTA: Paths are relative to the location of the expanded template, that is flatpak/build folder + # NOTA: Paths are relative to the location of the expanded template, that is flatpak/flathub # Audiveris project. We provide the tag only, not the commit value - type: git @@ -92,16 +100,16 @@ modules: sha256: ${GRADLE_SHA256} - type: file - path: ../org.audiveris.audiveris.desktop + path: org.audiveris.audiveris.desktop - type: file - path: ../org.audiveris.audiveris.metainfo.xml + path: org.audiveris.audiveris.metainfo.xml - type: file - path: ../dev/add-tessdata-prefix.sed + path: add-tessdata-prefix.sed # Include app dependencies.json, generated by Gradle task genDependencies - - ../../app/build/dependencies.json + - dependencies.json # Include lang_sources.yml, generated by Gradle task genLanguages - lang_sources.yml diff --git a/flatpak/flathub b/flatpak/flathub new file mode 160000 index 000000000..aba695343 --- /dev/null +++ b/flatpak/flathub @@ -0,0 +1 @@ +Subproject commit aba695343ae02d497a85ee86e844799765f4f07f diff --git a/flatpak/dev/add-tessdata-prefix.sed b/flatpak/res/add-tessdata-prefix.sed similarity index 100% rename from flatpak/dev/add-tessdata-prefix.sed rename to flatpak/res/add-tessdata-prefix.sed diff --git a/flatpak/org.audiveris.audiveris.desktop b/flatpak/res/org.audiveris.audiveris.desktop similarity index 100% rename from flatpak/org.audiveris.audiveris.desktop rename to flatpak/res/org.audiveris.audiveris.desktop diff --git a/flatpak/org.audiveris.audiveris.metainfo.xml b/flatpak/res/org.audiveris.audiveris.metainfo.xml similarity index 100% rename from flatpak/org.audiveris.audiveris.metainfo.xml rename to flatpak/res/org.audiveris.audiveris.metainfo.xml