From 391f059335dbee7876156120ab1e13dbb7a3c176 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Fri, 7 Jun 2024 11:48:17 +0100
Subject: [PATCH] CONFIG: update foamPackRelease packaging

---
 bin/tools/foamPackRelease | 231 ++++++++++++++++++++++++--------------
 1 file changed, 146 insertions(+), 85 deletions(-)

diff --git a/bin/tools/foamPackRelease b/bin/tools/foamPackRelease
index 570b7b18d3b..9851ad283d0 100755
--- a/bin/tools/foamPackRelease
+++ b/bin/tools/foamPackRelease
@@ -6,7 +6,7 @@
 #   \\  /    A nd           | www.openfoam.com
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
-#     Copyright (C) 2019-2023 OpenCFD Ltd.
+#     Copyright (C) 2019-2024 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
@@ -48,9 +48,16 @@ options:
   -name=NAME        Stem for tar-file (default: auto)
   -output=DIR       Output directory (default: ".")
   -prefix=NAME      Prefix directory within tar-file (default: auto)
-  -pkg-modules      Only package submodules - exclude OpenFOAM
-  -pkg-plugins      Only package plugins - exclude OpenFOAM
-  -no-modules       Exclude submodules
+  -pkg-modules      Package 'modules' exclusively (no OpenFOAM)
+  -pkg-plugins      Package 'plugins' exclusively (no OpenFOAM)
+  -no-extras        Exclude 'modules, plugins,...' from source pack
+  -no-modules       Exclude 'modules' from source pack (default: off)
+  -no-plugins       Exclude 'plugins' from source pack (default: on)
+  -all-extras       Include 'modules, plugins,...' into source pack
+  -with-modules     Include 'modules' into source pack (default: on)
+  -with-plugins     Include 'plugins' into source pack (default: off)
+  -modules=name1,.. Include specifed 'modules' into source pack
+  -plugins=name1,.. Include specifed 'plugins' into source pack
   -no-patch         Ignore '_patch' number for output tar-file
   -no-prefix        Do not prefix subdirectory
   -no-compress      Disable compression
@@ -68,7 +75,7 @@ Script generator for packing OpenFOAM sources and submodules.
 Eg,
 
     $Script -output=some-dir origin/master > create-tar-file
-    sh ./create-tar-file
+    bash ./create-tar-file
 
     $Script -tgz origin/master | bash
 
@@ -91,11 +98,16 @@ die()
 
 
 #-------------------------------------------------------------------------------
-outputDir="."
+outputDir='.'
 versionSeparator='_'
 withPatchNum=true
-unset compress packageApi withSource withModules withPlugins prefixDir tarName
-unset gitbase
+# Default selections
+select_source=true
+select_modules=true
+select_plugins=false
+
+unset compress gitbase packageApi prefixDir tarName
+
 
 # Cleanup tarName to remove trailing '.tar', detect compression etc
 cleanTarName() {
@@ -118,7 +130,7 @@ cleanTarName() {
 while [ "$#" -gt 0 ]
 do
     case "$1" in
-    -h | -help*)
+    -h | -help* | --help*)
         printHelp
         ;;
     -debian | -debian=[0-9]*)
@@ -147,20 +159,43 @@ do
         prefixDir="${1#*=}"
         prefixDir="${prefixDir%/}"
         ;;
-    -pkg-modules)
-        withModules=true
-        withPlugins=false
-        withSource=false
+    -all-extras)
+        select_modules=true
+        select_plugins=true
+        ;;
+    -with-modules)
+        select_modules=true
+        ;;
+    -modules=*)
+        select_modules="${1#*=}"
+        : "${select_modules:=true}"
+        ;;
+    -with-plugins)
+        select_plugins=true
+        ;;
+    -plugins=*)
+        select_plugins="${1#*=}"
+        : "${select_plugins:=true}"
+        ;;
+    -no-extras)
+        select_modules=false
+        select_plugins=false
+        ;;
+    -no-modules)
+        select_modules=false
         ;;
-    -pkg-plugins)
-        withModules=false
-        withPlugins=true
-        withSource=false
+    -no-plugins)
+        select_plugins=false
         ;;
-    -no-modules | -no-plugins)
-        withModules=false
-        withPlugins=false
-        withSource=true
+    -pkg-modules)  # Package modules exclusively
+        select_modules=true
+        select_plugins=false
+        select_source=false
+        ;;
+    -pkg-plugins)  # Package plugins exclusively
+        select_modules=false
+        select_plugins=true
+        select_source=false
         ;;
     -no-patch)
         withPatchNum=false
@@ -299,13 +334,14 @@ fi
 if [ -z "$prefixDir" ]
 then
     prefixDir="OpenFOAM-v${packageApi}"
-    if [ "$withSource" = false ]
+    if [ "$select_source" = false ]
     then
-        if [ "$withPlugins" = true ]
+        # Either -pkg-modules or -pkg-plugins, not both
+        if [ "$select_modules" != false ]
         then
-            prefixDir="OpenFOAM-plugins-v${packageApi}"
-        else
             prefixDir="OpenFOAM-modules-v${packageApi}"
+        else
+            prefixDir="OpenFOAM-plugins-v${packageApi}"
         fi
     fi
 elif [ "$prefixDir" = false ]
@@ -333,13 +369,14 @@ case "$tarName" in
 
 ('')
     tarName="OpenFOAM-v${packageApi}"
-    if [ "$withSource" = false ]
+    if [ "$select_source" = false ]
     then
-        if [ "$withPlugins" = true ]
+        # Either -pkg-modules or -pkg-plugins, not both
+        if [ "$select_modules" != false ]
         then
-            tarName="OpenFOAM-plugins-v${packageApi}"
-        else
             tarName="OpenFOAM-modules-v${packageApi}"
+        else
+            tarName="OpenFOAM-plugins-v${packageApi}"
         fi
     fi
 
@@ -380,55 +417,56 @@ echo 'tar -cf "$outputDir/$tarName.tar" -T /dev/null'
 echo
 echo 'buildInfo="${prefixDir}${prefixDir:+@}META-INFO@build-info"'
 echo 'manifest0="${prefixDir}${prefixDir:+@}META-INFO@manifest.txt"'
-echo 'manifest1="${prefixDir}${prefixDir:+@}META-INFO@modules-manifest.txt"'
-echo 'manifest2="${prefixDir}${prefixDir:+@}META-INFO@plugins-manifest.txt"'
-echo '#--------'
+echo 'manifest1="${prefixDir}${prefixDir:+@}META-INFO@manifest-modules.txt"'
+echo 'manifest2="${prefixDir}${prefixDir:+@}META-INFO@manifest-plugins.txt"'
 
 #------------------------------------------------------------------------------
-# Sort out particulars related to modules
-if [ "$withModules" = false ]
+# Sort out particulars related to modules, source
+
+if [ "$select_source" = false ]
 then
-    echo '# No modules'
-    echo 'unset manifest1'
+    echo 'unset buildInfo manifest0  # No source'
 fi
 
-if [ "$withPlugins" = false ]
+if [ "$select_modules" = false ]
 then
-    echo '# No plugins'
-    echo 'unset manifest2'
+    echo 'unset manifest1  # No modules'
 fi
 
-if [ "$withSource" = false ]
+if [ "$select_plugins" = false ]
 then
-    echo '# No OpenFOAM source (package modules exclusively)'
-    echo 'unset buildInfo'
-    echo 'unset manifest0'
+    echo 'unset manifest2  # No plugins'
 fi
 
+echo '#--------'
 echo 'set -x'
 echo
 
 #------------------------------------------------------------------------------
-# OpenFOAM sources
-if [ "$withSource" != false ]
+# OpenFOAM sources (unless explicitly excluded)
+
+if [ "$select_source" != false ]
 then
     echo 'git -c tar.umask=0022 archive --format=tar ${prefixDir:+--prefix="$prefixDir/"} -o "$outputDir/$tarName.tar" "$head"'
 
     # Tag build information with underscore to distinguish from "real" build
     # information when git is available.
-    echo 'echo build="${build:+_}$build" > "$outputDir/$buildInfo"'
-
+    echo echo 'build="${build:+_}$build" > "$outputDir/$buildInfo"'
+    echo
+    echo '# source'
+    echo 'manifestFile="$manifest0"'
     echo '{'
     echo '  echo api="$api"'
     echo '  echo patch="$patch"'
     echo '  echo head="$head"'
     echo '  echo'
     echo '  git ls-tree -r "$head"'
-    echo '} > "$outputDir/$manifest0"'
+    echo '} > "$outputDir/${manifestFile:?}"'
+    echo 'unset manifestFile'
 fi
 
 #------------------------------------------------------------------------------
-# Add in modules
+# OpenFOAM modules/plugins
 
 # Recursive addition of submodule content.
 # NB: must be called from within the respective parent directory.
@@ -436,11 +474,15 @@ fi
 #
 #    packModule abc  (implied cd)
 #       packModule abc/def
-#          packModule abc/def/hij
+#          packModule abc/def/ghi
 #
 packModule()
 {
     local parent="$1"
+    local filter="$2"
+
+    # Using filter=true means accept everything
+    if [ "$filter" = true ]; then unset filter; fi
 
     (
         if [ -n "$parent" ]
@@ -449,34 +491,51 @@ packModule()
         fi
 
         git ls-tree -d HEAD | \
-        while read mode gittype sha1 module
+        while read mode gittype sha1 moduleName
         do
             [ "$gittype" == commit ] || continue
 
-            case "$module" in
+            case "$moduleName" in
             (. | ./)
                 echo
                 echo "# ----"
-                echo "# module $parent : not initialized?"
+                echo "# submodule $parent : not initialized?"
                 echo "# ----"
                 continue
                 ;;
             esac
 
             # Fully qualified
-            module="$parent${parent:+/}$module"
+            module="$parent${parent:+/}$moduleName"
+            moduleName="${moduleName##*/}"
 
             echo
-            echo "# module"
+            echo "# submodule"
             echo "module='$module'"
             echo "commit='$sha1'"
-            echo "tmpTarFile='$tarName-${module##*/}.tar'"
+
+            # Simplistic filtering
+            if [ -n "$filter" ] && [ "${filter/$moduleName/}" = "$filter" ]
+            then
+                echo "# ----"
+                echo '{'
+                echo '  echo'
+                echo '  echo "$module"'
+                echo '  echo commit="$commit"'
+                echo '  echo "# not exported"'
+                echo '  echo'
+                echo '} >> "$outputDir/${manifestFile:?}"'
+                continue
+            fi
+
+            # Intermediate tar file for module contents
+            echo "tmpTarFile='$tarName-$moduleName.tar'"
             echo "# ----"
             echo '('
             echo '  cd "$module" || exit'
             echo '  newPrefix="$prefixDir${prefixDir:+/}$module"'
             echo '  git -c tar.umask=0022 archive --format=tar --prefix="$newPrefix/" -o "$outputDir/$tmpTarFile" "$commit" || exit'
-            # Without {test,tests,validation} directories (potentially large)
+            echo '  # Without {test,tests,validation} directories (potentially large)'
             echo '  tar --delete -f "$outputDir/$tmpTarFile" "$newPrefix/test" "$newPrefix/tests" "$newPrefix/validation" 2>/dev/null'
             echo '  tar -Af "$outputDir/$tarName.tar" "$outputDir/$tmpTarFile"'
             echo '  {'
@@ -486,56 +545,58 @@ packModule()
             echo '    echo'
             echo '    # Without {test,tests,validation} directories'
             echo '    git ls-tree -r "$commit" | sed -e '"'"'/\t\(test\|\tests\|validation\)\//d'"'"
-            echo '  } >> "$outputDir/$manifest1"'
+            echo '  } >> "$outputDir/${manifestFile:?}"'
             echo ')'
-            # Remove tmp tar file, even if git archive failed (creates zero-sized tar)
+            echo "# ----"
             echo 'rm -f "$outputDir/$tmpTarFile"'
 
+            # No filter for lower levels...
             packModule "$module"
         done
     )
 }
 
 
-if [ "$withModules" != false ]
+# modules/
+if [ "$select_modules" != false ]
 then
     echo
-    echo '# Modules'
+    echo '# modules/'
+    echo 'manifestFile="$manifest1"'
     echo '{'
     echo '  echo "# OpenFOAM modules"'
     echo '  echo api="$api"'
     echo '  echo patch="$patch"'
     echo '  echo head="$head"'
-    echo '} > "$outputDir/$manifest1"'
+    echo '} > "$outputDir/${manifestFile:?}"'
 
-    packModule modules
+    # With all or specified modules
+    packModule modules "$select_modules"
 
     echo
-    echo '{ echo; echo "# End"; } >> "$outputDir/$manifest1"'
+    echo '{ echo; echo "# End"; } >> "$outputDir/${manifestFile:?}"'
+    echo 'unset manifestFile'
 fi
 
-if [ "$withPlugins" != false ]
+# plugins/
+if [ "$select_plugins" != false ]
 then
     echo
-    echo '# Plugins'
+    echo '# plugins/'
+    echo 'manifestFile="$manifest2"'
     echo '{'
     echo '  echo "# OpenFOAM plugins"'
     echo '  echo api="$api"'
     echo '  echo patch="$patch"'
     echo '  echo head="$head"'
-    echo '} > "$outputDir/$manifest2"'
-
-    # HACK
-    echo 'oldManifest1="$manifest1"'
-    echo 'manifest1="$manifest2"'
+    echo '} > "$outputDir/${manifestFile:?}"'
 
-    packModule plugins
-
-    # HACK RESTORE
-    echo 'manifest1="$oldManifest1"'
+    # With all or specified plugins
+    packModule plugins "$select_plugins"
 
     echo
-    echo '{ echo; echo "# End"; } >> "$outputDir/$manifest2"'
+    echo '{ echo; echo "# End"; } >> "$outputDir/${manifestFile:?}"'
+    echo 'unset manifestFile'
 fi
 
 #------------------------------------------------------------------------------
@@ -543,9 +604,9 @@ fi
 # Decode '@' in the names as '/' directory separator
 
 echo
-echo "echo 'Adding build-info and manifest files'"
+echo echo 'Adding build-info and manifest files'
 echo 'if pushd "$outputDir"; then'
-echo "tar --owner=root --group=root --append --transform='s|@|/|g' -v -f \"\$tarName.tar\" \"\$buildInfo\" \"\$manifest0\" \"\$manifest1\""
+echo "tar --owner=root --group=root --append --transform='s|@|/|g' -v -f \"\$tarName.tar\" \"\$buildInfo\" \"\$manifest0\" \"\$manifest1\" \"\$manifest2\""
 echo 'rm -f "$buildInfo" "$manifest0" "$manifest1" "$manifest2"'
 echo 'popd; fi'
 
@@ -558,18 +619,18 @@ echo "# -----------------------"
 # Compression
 
 case "$compress" in
-    ('')
+('')
     echo "No compression requested" 1>&2
     ;;
 
-    (gz | gzip)
+(gz | gzip)
     echo "Using gzip compression" 1>&2
     echo 'gzip -f -9 "$outputDir/$tarName.tar"'
     echo
     echo '# End of compression'
     ;;
 
-    (tgz)
+(tgz)
     echo "Using gzip compression with tgz ending" 1>&2
     echo 'gzip -c -9 "$outputDir/$tarName.tar" > "$outputDir/$tarName.tgz"'
     echo 'rm -f "$outputDir/$tarName.tar"'
@@ -577,28 +638,28 @@ case "$compress" in
     echo '# End of compression'
     ;;
 
-    (bz | bzip | bzip2)
+(bz | bzip | bzip2)
     echo "Using bzip2 compression" 1>&2
     echo 'bzip2 -f -9 "$outputDir/$tarName.tar"'
     echo
     echo '# End of compression'
     ;;
 
-    (xz)
+(xz)
     echo "Using xz compression" 1>&2
     echo 'xz -f -9 "$outputDir/$tarName.tar"'
     echo
     echo '# End of compression'
     ;;
 
-    (zst | zstd)
+(zst | zstd)
     echo "Using zstd compression" 1>&2
     echo 'zstd --rm -f -9 "$outputDir/$tarName.tar"'
     echo
     echo '# End of compression'
     ;;
 
-    (*)
+(*)
     echo "Unknown compression scheme: $compress" 1>&2
     ;;
 esac
-- 
GitLab