mirror of
https://github.com/ONLYOFFICE/onlyoffice.github.io.git
synced 2026-02-10 18:05:06 +08:00
pack.py - Added the ability to skip files and folders for the plugin
This commit is contained in:
101
packer/pack.py
101
packer/pack.py
@ -1,7 +1,9 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
|
import json
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from fnmatch import fnmatch
|
||||||
|
|
||||||
def pack_plugins():
|
def pack_plugins():
|
||||||
content_dir = "sdkjs-plugins/content/"
|
content_dir = "sdkjs-plugins/content/"
|
||||||
@ -15,18 +17,99 @@ def pack_plugins():
|
|||||||
|
|
||||||
for plugin_name in os.listdir(content_dir):
|
for plugin_name in os.listdir(content_dir):
|
||||||
plugin_path = os.path.join(content_dir, plugin_name)
|
plugin_path = os.path.join(content_dir, plugin_name)
|
||||||
|
|
||||||
zip_file = os.path.join(artifacts_dir, f"{plugin_name}")
|
|
||||||
|
|
||||||
# Create zip
|
|
||||||
zip_path = shutil.make_archive(zip_file, 'zip', plugin_path)
|
|
||||||
# Rename to plugin
|
|
||||||
plugin_path = Path(zip_path).with_suffix(".plugin")
|
|
||||||
Path(zip_path).rename(plugin_path)
|
|
||||||
|
|
||||||
print(f"Created: {plugin_name}")
|
# Load exclusion configuration for this specific plugin
|
||||||
|
plugin_config_path = os.path.join(plugin_path, ".dev", "config.json")
|
||||||
|
excludes = []
|
||||||
|
|
||||||
|
if os.path.exists(plugin_config_path):
|
||||||
|
try:
|
||||||
|
with open(plugin_config_path, 'r') as f:
|
||||||
|
config = json.load(f)
|
||||||
|
excludes = config.get("excludes", [])
|
||||||
|
print(f"[{plugin_name}] Loaded exclude patterns: {excludes}")
|
||||||
|
except json.JSONDecodeError as e:
|
||||||
|
print(f"[{plugin_name}] Error parsing config.json: {e}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Create temporary directory for filtered files
|
||||||
|
temp_dir = os.path.join(artifacts_dir, f"temp_{plugin_name}")
|
||||||
|
os.makedirs(temp_dir, exist_ok=True)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Copy only files that match the plugin's configuration
|
||||||
|
copy_filtered_files(plugin_path, temp_dir, excludes)
|
||||||
|
|
||||||
|
# Check if any files remain after filtering
|
||||||
|
if not any(os.scandir(temp_dir)):
|
||||||
|
print(f"[{plugin_name}] No files to pack after filtering")
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Create zip archive from filtered directory
|
||||||
|
zip_file = os.path.join(artifacts_dir, f"{plugin_name}")
|
||||||
|
zip_path = shutil.make_archive(zip_file, 'zip', temp_dir)
|
||||||
|
|
||||||
|
# Rename to .plugin extension
|
||||||
|
plugin_file_path = Path(zip_path).with_suffix(".plugin")
|
||||||
|
Path(zip_path).rename(plugin_file_path)
|
||||||
|
|
||||||
|
print(f"Created: {plugin_name}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[{plugin_name}] Error: {e}")
|
||||||
|
finally:
|
||||||
|
# Clean up temporary directory
|
||||||
|
shutil.rmtree(temp_dir, ignore_errors=True)
|
||||||
|
else:
|
||||||
|
zip_file = os.path.join(artifacts_dir, f"{plugin_name}")
|
||||||
|
|
||||||
|
# Create zip
|
||||||
|
zip_path = shutil.make_archive(zip_file, 'zip', plugin_path)
|
||||||
|
# Rename to plugin
|
||||||
|
plugin_path = Path(zip_path).with_suffix(".plugin")
|
||||||
|
Path(zip_path).rename(plugin_path)
|
||||||
|
|
||||||
|
print(f"Created: {plugin_name}")
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def copy_filtered_files(source_dir, dest_dir, excludes):
|
||||||
|
"""Copy files from source_dir to dest_dir, excluding specified patterns"""
|
||||||
|
for root, dirs, files in os.walk(source_dir):
|
||||||
|
# Filter directories
|
||||||
|
dirs[:] = [d for d in dirs if not should_exclude(os.path.join(root, d), source_dir, excludes)]
|
||||||
|
|
||||||
|
for file in files:
|
||||||
|
source_file = os.path.join(root, file)
|
||||||
|
relative_path = os.path.relpath(source_file, source_dir)
|
||||||
|
|
||||||
|
if not should_exclude(relative_path, source_dir, excludes):
|
||||||
|
dest_file = os.path.join(dest_dir, relative_path)
|
||||||
|
os.makedirs(os.path.dirname(dest_file), exist_ok=True)
|
||||||
|
shutil.copy2(source_file, dest_file)
|
||||||
|
|
||||||
|
def should_exclude(path, base_dir, excludes):
|
||||||
|
"""Check if a path should be excluded based on patterns"""
|
||||||
|
# Convert path to relative format
|
||||||
|
if os.path.isabs(path):
|
||||||
|
relative_path = os.path.relpath(path, base_dir)
|
||||||
|
else:
|
||||||
|
relative_path = path
|
||||||
|
|
||||||
|
# Normalize path separators
|
||||||
|
relative_path = relative_path.replace('\\', '/')
|
||||||
|
|
||||||
|
# Check all exclusion patterns
|
||||||
|
for pattern in excludes:
|
||||||
|
# Normalize pattern
|
||||||
|
pattern = pattern.replace('\\', '/')
|
||||||
|
|
||||||
|
# Check pattern match
|
||||||
|
if fnmatch(relative_path, pattern) or fnmatch(relative_path + '/', pattern + '/'):
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
pack_plugins()
|
pack_plugins()
|
||||||
|
|
||||||
Reference in New Issue
Block a user