diff --git a/scripts/TouchinBuild/CommandBuilders/SignApkBuilder.py b/scripts/TouchinBuild/CommandBuilders/SignApkBuilder.py new file mode 100644 index 0000000..74180b8 --- /dev/null +++ b/scripts/TouchinBuild/CommandBuilders/SignApkBuilder.py @@ -0,0 +1,30 @@ +from commands.CleanBuildCommands.SignApkCommand import SignApkCommand +from parsers.SignApkParser import SignApkParser + + +class SignApkCommandBuilder: + def __init__(self, pathToBuildUtil): + assert pathToBuildUtil is not None + + self.pathToBuildUtil = pathToBuildUtil + + def isSignApk(self, line): + assert line is not None + + parser = SignApkParser() + isValid = parser.isValidLine(line) + + return isValid + + def getCommandFor(self, line): + assert line is not None + + parser = SignApkParser() + result = parser.parseLine(line) + + slnPath = result[0] + slnConfig = result[1] + projectName = result[2] + + command = SignApkCommand(self.pathToBuildUtil, slnPath, slnConfig, projectName) + return command \ No newline at end of file diff --git a/scripts/TouchinBuild/Core/StepsRunner.py b/scripts/TouchinBuild/Core/StepsRunner.py index e2a1238..fefce63 100644 --- a/scripts/TouchinBuild/Core/StepsRunner.py +++ b/scripts/TouchinBuild/Core/StepsRunner.py @@ -11,6 +11,7 @@ from CommandBuilders.PatchManifestCommandBuilder import PatchManifestCommandBuil from CommandBuilders.RemoveProjectCommandBuilder import RemoveProjectCommandBuilder from CommandBuilders.RestoreBackupCommandBuilder import RestoreBackupCommandBuilder from CommandBuilders.ShCommandBuilder import ShCommandBuilder +from CommandBuilders.SignApkBuilder import SignApkCommandBuilder from CommandBuilders.TestflightCommandBuilder import TestflightCommandBuilder @@ -42,6 +43,7 @@ class StepsRunner: buildUtilPath = config['build_tool'] self.cleanBuilder = CleanBuildCommandBuilder(buildUtilPath, 'clean') self.buildBuilder = CleanBuildCommandBuilder(buildUtilPath, 'build') + self.signAndroid = SignApkCommandBuilder(buildUtilPath) def run(self, content): assert content is not None @@ -64,6 +66,8 @@ class StepsRunner: cmd = self.cleanBuilder.getCommandFor(line) elif self.buildBuilder.isCleanBuild(line): cmd = self.buildBuilder.getCommandFor(line) + elif self.signAndroid.isSignApk(line): + cmd = self.signAndroid.getCommandFor(line) elif self.createBackupBuilder.isCreateBackup(line): cmd = self.createBackupBuilder.getCommandFor(line) elif self.createDirs.isMakeDirsCommand(line): diff --git a/scripts/TouchinBuild/commands/CleanBuildCommands/SignApkCommand.py b/scripts/TouchinBuild/commands/CleanBuildCommands/SignApkCommand.py new file mode 100644 index 0000000..7fc0e4e --- /dev/null +++ b/scripts/TouchinBuild/commands/CleanBuildCommands/SignApkCommand.py @@ -0,0 +1,28 @@ +from commands.ShellCommandBase import ShellCommandBase + + +class SignApkCommand(ShellCommandBase): + def __init__(self, pathToBuildUtil, slnPath, slnConfig, projectName): + ShellCommandBase.__init__(self) + + assert pathToBuildUtil is not None + assert slnPath is not None + assert slnConfig is not None + assert projectName is not None + + self.pathToBuildUtil = pathToBuildUtil + self.slnPath = slnPath + self.slnConfig = slnConfig + self.projectName = projectName + + self.commandPattern = '%(mdtool) -v build "--configuration:%(config)" "--project:%(project)" /t:SignAndroidPackage "%(slnPath)"' + + def execute(self): + cmdText = self.commandPattern % { + 'mdtool': self.pathToBuildUtil, + 'config': self.slnConfig, + 'project': self.projectName, + 'slnPath': self.slnPath + } + + self.executeShell(cmdText) diff --git a/scripts/TouchinBuild/parsers/SignApkParser.py b/scripts/TouchinBuild/parsers/SignApkParser.py new file mode 100644 index 0000000..4108b9f --- /dev/null +++ b/scripts/TouchinBuild/parsers/SignApkParser.py @@ -0,0 +1,40 @@ +import re +from parsers.LineParser import LineParser +from parsers.RegexpBuilder import RegexpBuilder + + +class SignApkParser(LineParser): + def __init__(self): + LineParser.__init__(self) + + def parseLine(self, line): + assert line is not None + + filePathRegexp = r"'(?P[./ a-zA-Z]+\.sln)'" + slnConfigRegexp = r"'(?P[a-zA-Z|]+)'" + projectRegexp = r"(?P[.a-zA-Z]+)$" + + rb = RegexpBuilder() + rSrc = rb.startsWith('sign') + rb.than('android') + filePathRegexp + rb.keywordToken('for') + slnConfigRegexp +\ + rb.keywordToken('project') + projectRegexp + regexp = re.compile(rSrc, re.UNICODE) + + match = regexp.match(line) + self._guardMatch(match, line, rSrc) + + path = match.group('path') + slnConfig = match.group('config') + project = match.group('project') + + return path, slnConfig, project + + def isValidLine(self, line): + assert line is not None + + rb = RegexpBuilder() + rSrc = rb.startsWith('sign') + rb.than('android') + + regexp = re.compile(rSrc, re.UNICODE) + match = regexp.match(line) + + return match is not None \ No newline at end of file