Skip to content

Commit 5367eaf

Browse files
committed
feat(build): adds in the -r or --release flag to the build command, which zips up build packages
Generates build package zip files of the form 'dotfiles-{os}-{profile}.zip' in the output directory fix #85
1 parent 01bf4e7 commit 5367eaf

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

pydotfiles/api/__init__.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ def build(self, command_arguments: list[str]) -> None:
7575
parser = self.__get_base_parser(help_description, "build")
7676
parser.add_argument("-d", "--directory", help="Builds all/indicated profile build packages located in the passed-in directory. Defaults to the current working directory", default=getcwd())
7777
parser.add_argument("-b", "--build-directory", help="The output directory. Defaults to pydotfiles-build in the current working directory", default=str(Path(getcwd()).joinpath("pydotfiles-build")))
78+
parser.add_argument("-r", "--release", help="Will generate releases (.zip) of each of the build files", action="store_true")
7879

7980
parser.add_argument("-p", "--profiles", nargs='+', help="Indicates which profiles should be built, and how they should be composed. Defaults to all profiles being built independently")
8081
parser.add_argument("-o", "--operating-systems", nargs='+', help="Indicates which operating system build packages should be built. Defaults to all profiles being built independently")
@@ -85,7 +86,7 @@ def build(self, command_arguments: list[str]) -> None:
8586

8687
configurations = load_configuration(Path(args.directory))
8788

88-
builder = Builder(configurations, Path(args.directory), Path(args.build_directory))
89+
builder = Builder(configurations, Path(args.directory), Path(args.build_directory), args.release)
8990
build_packages = builder.build(args.profiles, args.operating_systems)
9091
for name, build_package_path in build_packages.items():
9192
PrettyPrint.success(f"[{name}]\tSuccessfully generated build package in: {build_package_path}")

pydotfiles/v4/builder/__init__.py

+18-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
from os import path as os_path
1010
from dataclasses import dataclass
1111
from shutil import copy2 as shutil_copy2
12+
from shutil import rmtree as shutil_rmtree
1213
from os import chmod as os_chmod
14+
from zipfile import ZipFile
1315

1416
# Project imports
1517
from pydotfiles.v4.common import Configuration
@@ -32,7 +34,7 @@ class Builder:
3234
without requiring users to commit to a whole dynamically updated ecosystem
3335
"""
3436

35-
def __init__(self, configurations: list[Configuration], base_dir: Path, output_path: Path):
37+
def __init__(self, configurations: list[Configuration], base_dir: Path, output_path: Path, is_release: bool):
3638
# Maps from a given profile name to the file paths that are defined there
3739
self.profile_map: Dict[str, list[Path]] = defaultdict(list)
3840
self.profile_dependencies: Dict[str, list[str]] = defaultdict(list)
@@ -43,6 +45,7 @@ def __init__(self, configurations: list[Configuration], base_dir: Path, output_p
4345
self.defined_os: set[OSName] = set()
4446
self.base_dir = base_dir
4547
self.output_path = output_path
48+
self.is_release = is_release
4649

4750
for configuration in configurations:
4851
if isinstance(configuration.data, AlphaCore):
@@ -67,6 +70,10 @@ def __init__(self, configurations: list[Configuration], base_dir: Path, output_p
6770
self.profile_file_types[configuration.file_path] = AlphaDefaultSettings
6871

6972
def build(self, profiles: Optional[list[str]], specified_oses: Optional[list[str]]) -> Dict[str, Path]:
73+
# Clears out the current build directory
74+
shutil_rmtree(self.output_path)
75+
self.output_path.mkdir(parents=True, exist_ok=True)
76+
7077
active_profiles = self.__get_active_profiles(profiles)
7178
package_paths: Dict[str, Path] = {}
7279

@@ -143,6 +150,9 @@ def __build_package(self, build_data: list[Configuration], active_os: OSName, ac
143150
is_installation_init_written = True
144151
package_builder.build()
145152
package_builder.write_tail()
153+
154+
if self.is_release:
155+
self.__zip_dir(dirpath)
146156
return dirpath
147157

148158
def __consolidate_requirements(self, build_data: list[Configuration]) -> list[Configuration]:
@@ -221,6 +231,13 @@ def __consolidate_os_build_data(self, build_data: list[Configuration]) -> Option
221231
data=AlphaCore.from_dict(consolidated_data)
222232
)
223233

234+
def __zip_dir(self, directory: Path) -> Path:
235+
destination = Path(f"{directory}.zip")
236+
with ZipFile(destination, mode='w') as zip_fp:
237+
for content in directory.iterdir():
238+
zip_fp.write(content, content.name)
239+
return destination
240+
224241
##
225242
# Build package methods
226243
##

0 commit comments

Comments
 (0)