Add rez packages generation for server_addons

Allow to generate `rez` compatible packages for the `server_addons`, will create a `package.py` which then is also included in the `.zip`.
This commit is contained in:
Oscar Domingo 2024-02-14 14:52:18 +00:00
parent f9ab339ecb
commit 4113ff7bf0

View file

@ -144,11 +144,18 @@ def create_addon_zip(
output_dir: Path,
addon_name: str,
addon_version: str,
keep_source: bool
keep_source: bool,
rez_package: bool,
):
zip_filepath = output_dir / f"{addon_name}-{addon_version}.zip"
if rez_package:
zip_filepath = output_dir / f"{addon_name}-{addon_version}-rez.zip"
addon_output_dir = output_dir / addon_name / addon_version
with ZipFileLongPaths(zip_filepath, "w", zipfile.ZIP_DEFLATED) as zipf:
# TODO: Decide if we want to keep this for first pass checking without
# executing any python. Otherwiseh we can be removed
zipf.writestr(
"manifest.json",
json.dumps({
@ -168,8 +175,14 @@ def create_addon_zip(
src_path = os.path.join(root, filename)
if rel_root:
dst_path = os.path.join("addon", rel_root, filename)
if rez_package:
dst_path = os.path.join(rel_root, filename)
else:
dst_path = os.path.join("addon", filename)
if rez_package:
dst_path = filename
zipf.write(src_path, dst_path)
if not keep_source:
@ -180,7 +193,8 @@ def create_addon_package(
addon_dir: Path,
output_dir: Path,
create_zip: bool,
keep_source: bool
keep_source: bool,
rez_package: bool,
):
server_dir = addon_dir / "server"
addon_version = get_addon_version(addon_dir)
@ -191,22 +205,37 @@ def create_addon_package(
addon_output_dir.mkdir(parents=True)
# Copy server content
src_root = os.path.normpath(str(server_dir.absolute()))
src_root_offset = len(src_root) + 1
for root, _, filenames in os.walk(str(server_dir)):
dst_root = addon_output_dir
if root != src_root:
rel_root = root[src_root_offset:]
dst_root = dst_root / rel_root
if not rez_package:
src_root = os.path.normpath(str(server_dir.absolute()))
src_root_offset = len(src_root) + 1
for root, _, filenames in os.walk(str(server_dir)):
dst_root = addon_output_dir
if root != src_root:
rel_root = root[src_root_offset:]
dst_root = dst_root / rel_root
dst_root.mkdir(parents=True, exist_ok=True)
for filename in filenames:
src_path = os.path.join(root, filename)
shutil.copy(src_path, str(dst_root))
dst_root.mkdir(parents=True, exist_ok=True)
for filename in filenames:
src_path = os.path.join(root, filename)
shutil.copy(src_path, str(dst_root))
else:
package_py = addon_output_dir / "package.py"
with open(package_py, "w+") as pkg_py:
pkg_py.write(
f"""name = "{addon_dir.name}"
version = "{addon_version}"
plugin_for = ["ayon_server"]
build_command = "python {{root}}/rezbuild.py"
"""
)
shutil.copytree(
server_dir, addon_output_dir / "server", dirs_exist_ok=True
)
if create_zip:
create_addon_zip(
output_dir, addon_dir.name, addon_version, keep_source
output_dir, addon_dir.name, addon_version, keep_source, rez_package
)
@ -216,6 +245,7 @@ def main(
keep_source=False,
clear_output_dir=False,
addons=None,
rez_package=False,
):
current_dir = Path(os.path.dirname(os.path.abspath(__file__)))
root_dir = current_dir.parent
@ -250,7 +280,7 @@ def main(
continue
create_addon_package(
addon_dir, output_dir, create_zip, keep_source
addon_dir, output_dir, create_zip, keep_source, rez_package
)
print(f"- package '{addon_dir.name}' created")
@ -300,6 +330,13 @@ if __name__ == "__main__":
action="append",
help="Limit addon creation to given addon name",
)
parser.add_argument(
"-r",
"--rez",
dest="rez_package",
action="store_true",
help="Make it a Rez-compatible package",
)
args = parser.parse_args(sys.argv[1:])
main(
@ -308,4 +345,5 @@ if __name__ == "__main__":
args.keep_sources,
args.clear_output_dir,
args.addons,
args.rez_package,
)