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:
1 file changed
+82
-5
+82
-5
@@ -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!")
|
||||
|
||||
Reference in new issue
Block a user