mirror of https://github.com/axmolengine/axmol.git
201 lines
7.0 KiB
Python
201 lines
7.0 KiB
Python
|
|
||
|
import os
|
||
|
import os.path
|
||
|
|
||
|
import cocos
|
||
|
from MultiLanguage import MultiLanguage
|
||
|
|
||
|
from functions import *
|
||
|
from package_helper import *
|
||
|
from zip_unpacker import ZipUnpacker
|
||
|
from add_framework_helper import AddFrameworkHelper
|
||
|
from remove_framework_helper import RemoveFrameworkHelper
|
||
|
from create_framework_helper import CreateFrameworkHelper
|
||
|
from set_framework_helper import SetFrameworkHelper
|
||
|
|
||
|
def get_engine_of_project(project):
|
||
|
ver_str = None
|
||
|
x_ver_file = os.path.join(project["path"], 'frameworks/cocos2d-x/cocos/cocos2d.cpp')
|
||
|
pattern = r".*return[ \t]+\"cocos2d-x (.*)\";"
|
||
|
|
||
|
f = open(x_ver_file)
|
||
|
for line in f.readlines():
|
||
|
match = re.match(pattern, line)
|
||
|
if match:
|
||
|
ver_str = match.group(1)
|
||
|
break
|
||
|
f.close()
|
||
|
|
||
|
return ver_str
|
||
|
|
||
|
class ProjectHelper:
|
||
|
SUPPORTED_PLATFORMS = ("proj.android", "proj.ios_mac", "proj.win32")
|
||
|
PACKAGES_DIRNAME = "packages"
|
||
|
PACKAGE_INFO_FILE = "package.json"
|
||
|
PACKAGE_UNINSTALL_FILE = "uninstall.json"
|
||
|
|
||
|
@classmethod
|
||
|
def get_current_project(cls):
|
||
|
cwd = os.path.realpath(os.getcwd())
|
||
|
prefix = cwd
|
||
|
|
||
|
project = {}
|
||
|
project["path"] = prefix
|
||
|
|
||
|
project["classes_dir"] = "Classes"
|
||
|
if os.path.exists(prefix + os.sep + project["classes_dir"]):
|
||
|
project["type"] = "cpp"
|
||
|
prefix = ""
|
||
|
else:
|
||
|
prefix = "frameworks" + os.sep + "runtime-src" + os.sep
|
||
|
project["classes_dir"] = prefix + os.sep + "Classes"
|
||
|
if os.path.exists(cwd + os.sep + project["classes_dir"]):
|
||
|
project["type"] = "script"
|
||
|
|
||
|
if not "type" in project:
|
||
|
message = MultiLanguage.get_string('PACKAGE_ERROR_WRONG_DIR')
|
||
|
raise cocos.CCPluginError(message, cocos.CCPluginError.ERROR_WRONG_CONFIG)
|
||
|
|
||
|
for platform in cls.SUPPORTED_PLATFORMS:
|
||
|
path = project["path"] + os.sep + prefix + platform
|
||
|
if os.path.exists(path):
|
||
|
project[platform] = path
|
||
|
|
||
|
project["packages_dir"] = project["path"] + os.sep + cls.PACKAGES_DIRNAME
|
||
|
return project
|
||
|
|
||
|
@classmethod
|
||
|
def get_added_packages(cls, project):
|
||
|
packages_dir = project["packages_dir"]
|
||
|
if not os.path.isdir(packages_dir):
|
||
|
return
|
||
|
|
||
|
packages = []
|
||
|
dirs = os.listdir(packages_dir)
|
||
|
for dir in dirs:
|
||
|
dir_path = packages_dir + os.sep + dir
|
||
|
if not os.path.isdir(dir_path):
|
||
|
continue
|
||
|
uninstall_file = dir_path + os.sep + cls.PACKAGE_UNINSTALL_FILE
|
||
|
if not os.path.isfile(uninstall_file):
|
||
|
continue
|
||
|
info_file = dir_path + os.sep + cls.PACKAGE_INFO_FILE
|
||
|
if not os.path.isfile(info_file):
|
||
|
continue
|
||
|
import json
|
||
|
f = open(info_file, "rb")
|
||
|
package_info = json.load(f)
|
||
|
f.close()
|
||
|
package_info["dir_path"] = dir_path
|
||
|
packages.append(package_info)
|
||
|
|
||
|
return packages
|
||
|
|
||
|
@classmethod
|
||
|
def check_added_package(cls, project, package_name):
|
||
|
packages = cls.get_added_packages(project)
|
||
|
if packages is None:
|
||
|
return
|
||
|
|
||
|
for package in packages:
|
||
|
if package["name"] == package_name:
|
||
|
return package
|
||
|
|
||
|
@classmethod
|
||
|
def show_project_info(cls, project):
|
||
|
print MultiLanguage.get_string('PACKAGE_PROJ_PATH_FMT', project["path"])
|
||
|
print MultiLanguage.get_string('PACKAGE_PROJ_TYPE_FMT', project["type"])
|
||
|
|
||
|
@classmethod
|
||
|
def add_framework(cls, project, package_name):
|
||
|
cls.show_project_info(project)
|
||
|
|
||
|
package_data = cls.check_added_package(project, package_name)
|
||
|
if not package_data is None:
|
||
|
print MultiLanguage.get_string('PACKAGE_PKG_ADDED_WARN_FMT', (package_name, package_name))
|
||
|
return
|
||
|
|
||
|
engine = get_engine_of_project(project)
|
||
|
if engine is None:
|
||
|
print MultiLanguage.get_string('PACKAGE_PROJ_UNKOWN_ENGINE')
|
||
|
return
|
||
|
|
||
|
package_data = PackageHelper.get_installed_package_newest_version(package_name, engine)
|
||
|
if package_data is None:
|
||
|
print MultiLanguage.get_string('PACKAGE_NOT_FOUND_PKG_FMT', (package_name, engine, package_name))
|
||
|
return
|
||
|
|
||
|
print MultiLanguage.get_string('PACKAGE_PKG_ADD_FMT',
|
||
|
(package_data["name"], package_data["version"], package_data["author"]))
|
||
|
|
||
|
# unpacking files
|
||
|
ensure_directory(project["packages_dir"])
|
||
|
unpacker = ZipUnpacker(PackageHelper.get_installed_package_zip_path(package_data))
|
||
|
unpacker.unpack(project["packages_dir"])
|
||
|
|
||
|
# execute install.json
|
||
|
install_helper = AddFrameworkHelper(project, package_data)
|
||
|
install_helper.run()
|
||
|
|
||
|
@classmethod
|
||
|
def remove_framework(cls, project, package_name):
|
||
|
cls.show_project_info(project)
|
||
|
|
||
|
package = cls.check_added_package(project, package_name)
|
||
|
if package is None:
|
||
|
print MultiLanguage.get_string('PACKAGE_PKG_NOT_FOUND_FMT', package_name)
|
||
|
return
|
||
|
|
||
|
dir = package["dir_path"]
|
||
|
print MultiLanguage.get_string('PACKAGE_PKG_REMOVE_FMT', dir)
|
||
|
uninstall_helper = RemoveFrameworkHelper(project, dir)
|
||
|
uninstall_helper.run()
|
||
|
print MultiLanguage.get_string('PACKAGE_PKG_REMOVE_OK')
|
||
|
|
||
|
@classmethod
|
||
|
def update_framework(cls, project, package_name):
|
||
|
cls.show_project_info(project)
|
||
|
|
||
|
package = cls.check_added_package(project, package_name)
|
||
|
if package is None:
|
||
|
print MultiLanguage.get_string('PACKAGE_PKG_NOT_FOUND_FMT', package_name)
|
||
|
return
|
||
|
|
||
|
engine = get_engine_of_project(project)
|
||
|
if engine is None:
|
||
|
print MultiLanguage.get_string('PACKAGE_PROJ_UNKOWN_ENGINE')
|
||
|
return
|
||
|
|
||
|
package_data = PackageHelper.get_installed_package_newest_version(package_name, engine)
|
||
|
if package_data is None:
|
||
|
print MultiLanguage.get_string('PACKAGE_NOT_FOUND_PKG_FMT', (package_name, engine, package_name))
|
||
|
return
|
||
|
newest_version = package_data["version"]
|
||
|
|
||
|
dir = package["dir_path"]
|
||
|
if compare_version(newest_version, package["version"]) < 1:
|
||
|
print MultiLanguage.get_string('PACKAGE_PKG_IS_NEWEST_FMT', (package_name, package_name))
|
||
|
return
|
||
|
cls.remove_framework(project, package_name)
|
||
|
cls.add_framework(project, package_name)
|
||
|
print MultiLanguage.get_string('PACKAGE_PROJ_PKG_UPDATE_OK')
|
||
|
|
||
|
@classmethod
|
||
|
def create_framework(cls, project, package_name):
|
||
|
cls.show_project_info(project)
|
||
|
|
||
|
ensure_directory(project["packages_dir"])
|
||
|
create_helper = CreateFrameworkHelper(project, package_name)
|
||
|
create_helper.run()
|
||
|
|
||
|
@classmethod
|
||
|
def set_framework(cls, project, package_name, version):
|
||
|
cls.show_project_info(project)
|
||
|
packages_dir = project["packages_dir"]
|
||
|
if not os.path.isdir(packages_dir):
|
||
|
print MultiLanguage.get_string('PACKAGE_NO_PKG_FOUND')
|
||
|
return
|
||
|
|
||
|
set_helper = SetFrameworkHelper(project, package_name, version)
|
||
|
set_helper.run()
|