Add release scope filtering to DEB package builder

- Add --release_scope flag to filter source files during packaging
- Only include TetraIF, Z/src, Lts/Common in release packages
- Preserves full source tree in repository, filters at package build time
- Updated copy_src_dir_to_dest_dir with release_scope parameter

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
torstenandCopilot committed 2026-10-09 12:48:26 +00:00
1 parent 152c4b8ce2
commit c0b9df9fc9
1 file changed
+82 -5
+82 -5
View File
@@ -85,16 +85,72 @@ def remove_directory(dest_dir):
shutil.rmtree(dest_dir)
def copy_src_dir_to_dest_dir(srcdir, dstdir, perm=None, with_subdirs=True):
def copy_src_dir_to_dest_dir(srcdir, dstdir, perm=None, with_subdirs=True, release_scope=False):
"""Copy source directory to destination directory.
Args:
srcdir: Source directory path
dstdir: Destination directory path
perm: Optional permissions to set
with_subdirs: Whether to copy subdirectories
release_scope: If True, only copy release scope files (TetraIF, Z/src, Lts/Common)
"""
info("--------------------------------")
info(f"Copying {srcdir} to {dstdir}")
if release_scope:
info("Release scope mode: only copying TetraIF, Z/src, Lts/Common")
info("--------------------------------")
while srcdir.endswith("/"):
srcdir = srcdir[:-1]
# Release scope directories and files to include
release_items = [
'TetraIF',
'Z/src',
'Lts/Common',
'CMakeLists.txt',
'cmake',
'tests',
'new_docker_build.sh',
'specs',
'include',
'translations',
'CTestCustom.ctest',
'.gitignore',
'.envrc',
'doxygen',
'external',
'src'
]
if with_subdirs:
for root, dirs, files in os.walk(srcdir):
# Filter directories for release scope
if release_scope:
rel_root = os.path.relpath(root, srcdir)
if rel_root == '.':
# At root level, only keep release scope directories
dirs[:] = [d for d in dirs if d in release_items or any(d == item.split('/')[0] for item in release_items if '/' in item)]
elif rel_root == 'Z':
# In Z directory, only keep src
dirs[:] = [d for d in dirs if d == 'src']
elif rel_root == 'Lts':
# In Lts directory, only keep Common
dirs[:] = [d for d in dirs if d == 'Common']
elif rel_root.startswith('Lts/Common'):
# Keep all subdirectories under Lts/Common
pass
elif rel_root.startswith('Z/src'):
# Keep all subdirectories under Z/src
pass
elif rel_root == 'TetraIF':
# Keep all subdirectories under TetraIF
pass
else:
# Skip other directories
dirs[:] = []
tmpdir = root.replace(srcdir, dstdir)
debug(f"dstdir = '{tmpdir}'")
if not os.path.exists(tmpdir):
@@ -103,6 +159,10 @@ def copy_src_dir_to_dest_dir(srcdir, dstdir, perm=None, with_subdirs=True):
if perm:
os.chmod(tmpdir, perm | stat.S_IREAD | stat.S_IRGRP | stat.S_IROTH)
for file in files:
# Skip non-release files at root level
if release_scope and rel_root == '.':
if file not in release_items and not any(file == item.split('/')[0] for item in release_items if '/' in item):
continue
if os.path.isfile(tmpdir) and os.path.exists(tmpdir):
os.remove(tmpdir)
shutil.copy(os.path.join(root, file), tmpdir)
@@ -120,6 +180,8 @@ def copy_src_dir_to_dest_dir(srcdir, dstdir, perm=None, with_subdirs=True):
for f in os.listdir(srcdir):
if os.path.isdir(f):
continue
if release_scope and f not in release_items:
continue
shutil.copy(os.path.join(srcdir, f), os.path.join(dstdir, f))
@@ -187,10 +249,22 @@ override_dh_auto_install:
info(f"Created {rules_file}")
def build_deb(source_dir, output_dir, project_name, version, build_number, cmake_flags):
"""Build DEB package using debuild"""
def build_deb(source_dir, output_dir, project_name, version, build_number, cmake_flags, release_scope=False):
"""Build DEB package using debuild
Args:
source_dir: Source directory path
output_dir: Output directory for packages
project_name: Project name (qatar|ahtc|guez)
version: Version string
build_number: Build number
cmake_flags: CMake build flags
release_scope: If True, only include release scope files (TetraIF, Z/src, Lts/Common)
"""
info("--------------------------------")
info(f"Building DEB package for {project_name} {version}-{build_number}")
if release_scope:
info("Release scope mode: only packaging TetraIF, Z/src, Lts/Common")
info("--------------------------------")
# Create output directory
@@ -204,7 +278,7 @@ def build_deb(source_dir, output_dir, project_name, version, build_number, cmake
# Copy source to build directory
pkg_name = f"legatus-{project_name.lower()}"
pkg_dir = os.path.join(build_base, f"{pkg_name}-{version}")
copy_src_dir_to_dest_dir(source_dir, pkg_dir)
copy_src_dir_to_dest_dir(source_dir, pkg_dir, release_scope=release_scope)
# Create debian directory
deb_dir = os.path.join(pkg_dir, "debian")
@@ -266,12 +340,14 @@ def main():
parser.add_argument("--output_dir", required=True, help="Output directory for packages")
parser.add_argument("--cmake_build_flags", default="", help="CMake build flags")
parser.add_argument("--build_number", default="1", help="Build number")
parser.add_argument("--release_scope", action="store_true", help="Only include release scope files (TetraIF, Z/src, Lts/Common)")
args = parser.parse_args()
info(f"Building {args.config} package for {args.project_name} v{args.version}")
info(f"Output directory: {args.output_dir}")
info(f"CMake flags: {args.cmake_build_flags}")
info(f"Release scope: {args.release_scope}")
# Determine source directory (parent of rpmbuild folder)
script_dir = os.path.dirname(os.path.abspath(__file__))
@@ -285,7 +361,8 @@ def main():
project_name=args.project_name,
version=args.version,
build_number=args.build_number,
cmake_flags=args.cmake_build_flags
cmake_flags=args.cmake_build_flags,
release_scope=args.release_scope
)
info("Build completed successfully!")