diff --git a/pisi/build.py b/pisi/build.py index 50b680f2..920b3961 100644 --- a/pisi/build.py +++ b/pisi/build.py @@ -78,6 +78,16 @@ class PisiBuild: ui.error("PSPEC file is not valid") raise PisiBuildError, "invalid PSPEC file %s" % self.ctx.pspecfile + def setState(self, state): + stateFile = os.path.join(self.srcDir, "pisiBuildState") + open(stateFile, "w").write(state) + + def getState(self): + stateFile = os.path.join(self.srcDir, "pisiBuildState") + if not os.path.exists(stateFile): # no state + return None + return open(stateFile, "r").read() + def build(self): """Build the package in one shot.""" @@ -166,11 +176,8 @@ class PisiBuild: except KeyError: workdir = self.spec.source.name + "-" + self.spec.source.version - path = os.path.join(self.ctx.pkg_work_dir(), workdir) - if not os.path.exists(path): - ui.error ("No such file or directory: %s\n" % path) - sys.exit(1) - return path + return os.path.join(self.ctx.pkg_work_dir(), workdir) + def runActionFunction(self, func, mandatory=False): """Calls the corresponding function in actions.py. diff --git a/pisi/cli/commands.py b/pisi/cli/commands.py index 1afb10bf..f0ed5422 100644 --- a/pisi/cli/commands.py +++ b/pisi/cli/commands.py @@ -12,10 +12,7 @@ import pisi.toplevel def cmdObject(cmd, fail=False): commands = {"help": Help, "build": Build, - "build-unpack": BuildUnpack, - "build-runsetupaction": BuildRunSetupAction, - "build-runbuildaction": BuildRunBuildAction, - "build-runinstallaction": BuildRunInstallAction, + "build-until": BuildUntil, "info": Info, "install": Install, "list-installed": ListInstalled, @@ -375,82 +372,32 @@ TODO: Some description... # Partial build commands -class BuildUnpack(Command): - """Unpack source using a pspec.xml file +class BuildUntil(Command): + """Run the build process partially Usage: - build-unpack pspec.xml + -sStateName build-until + + Where states are: + unpack, setupaction, buildaction, installaction, buildpackages You can give an URI of the pspec.xml file. PISI will fetch all necessary files and unpack the source and prepare a source directory for you. """ def __init__(self): - super(BuildUnpack, self).__init__() + super(BuildUntil, self).__init__() + + def options(self): + self.parser.add_option("-s", action="store", dest="state") def run(self): if not self.args: self.help() return - for arg in self.args: - pisi.toplevel.build_unpack(arg, self.authInfo) - -class BuildRunSetupAction(Command): - """Unpack source using a pspec.xml file - - Usage: - build-runsetupaction pspec.xml - -TODO: Some desc. -""" - def __init__(self): - super(BuildRunSetupAction, self).__init__() - - def run(self): - if not self.args: - self.help() - return + state = self.options.state for arg in self.args: - pisi.toplevel.build_runSetupAction(arg, self.authInfo) + pisi.toplevel.build_until(arg, state, self.authInfo) - -class BuildRunBuildAction(Command): - """Unpack source using a pspec.xml file - - Usage: - build-runbuildaction pspec.xml - -TODO: Some desc. -""" - def __init__(self): - super(BuildRunBuildAction, self).__init__() - - def run(self): - if not self.args: - self.help() - return - - for arg in self.args: - pisi.toplevel.build_runBuildAction(arg, self.authInfo) - - -class BuildRunInstallAction(Command): - """Unpack source using a pspec.xml file - - Usage: - build-runsetupactions pspec.xml - -TODO: Some desc. -""" - def __init__(self): - super(BuildRunInstallAction, self).__init__() - - def run(self): - if not self.args: - self.help() - return - - for arg in self.args: - pisi.toplevel.build_runInstallAction(arg, self.authInfo) diff --git a/pisi/cli/common.py b/pisi/cli/common.py index 529b46b8..683f189e 100644 --- a/pisi/cli/common.py +++ b/pisi/cli/common.py @@ -4,10 +4,7 @@ where is one of: help build -build-unpack -build-runsetupaction -build-runbuildaction -build-runinstallaction +build-until index info install diff --git a/pisi/toplevel.py b/pisi/toplevel.py index e152ba7d..d1c0ead0 100644 --- a/pisi/toplevel.py +++ b/pisi/toplevel.py @@ -144,43 +144,85 @@ def prepare_for_build(pspecfile, authInfo=None): pb = PisiBuild(url.uri) return pb -def build_unpack(pspecfile, authInfo=None): - pb = prepare_for_build(pspecfile, authInfo) - pb.fetchSourceArchive() - pb.unpackSourceArchive() - pb.compileActionScript() - pb.applyPatches() - -def build_runSetupAction(pspecfile, authInfo=None): - pb = prepare_for_build(pspecfile, authInfo) - pb.fetchSourceArchive() - pb.unpackSourceArchive() - pb.compileActionScript() - pb.applyPatches() - pb.runSetupAction() - -def build_runBuildAction(pspecfile, authInfo=None): - pb = prepare_for_build(pspecfile, authInfo) - pb.fetchSourceArchive() - pb.unpackSourceArchive() - pb.compileActionScript() - pb.applyPatches() - pb.runSetupAction() - pb.runBuildAction() - -def build_runInstallAction(pspecfile, authInfo=None): - pb = prepare_for_build(pspecfile, authInfo) - pb.fetchSourceArchive() - pb.unpackSourceArchive() - pb.compileActionScript() - pb.applyPatches() - pb.runSetupAction() - pb.runBuildAction() - pb.runInstallAction() - def build(pspecfile, authInfo=None): pb = prepare_for_build(pspecfile, authInfo) pb.build() +def __buildState_unpack(pb): + # unpack is the first state to run. + pb.fetchSourceArchive() + pb.unpackSourceArchive() + pb.applyPatches() + + pb.setState("unpack") + +def __buildState_setupAction(pb, lastState): + + if lastState != "unpack": + __buildState_unpack(pb) + pb.runSetupAction() + + pb.setState("setupaction") + +def __buildState_buildAction(pb, lastState): + + if lastState != "setupaction": + __buildState_setupAction(pb, lastState) + pb.runBuildAction() + + pb.setState("buildaction") + +def __buildState_installAction(pb, lastState): + + if lastState != "buildaction": + __buildState_buildAction(pb, lastState) + pb.runInstallAction() + + pb.setState("installaction") + +def __buildState_package(pb, lastState): + + if lastState != "installaction": + __buildState_installAction(pb, lastState) + pb.buildPackages() + + pb.setState("buildpackages") + +def build_until(pspecfile, state, authInfo=None): + pb = prepare_for_build(pspecfile, authInfo) + pb.compileActionScript() + + last = pb.getState() + ui.info("Last state is %s\n"%last) + + if not last: last = "none" + elif last == state: return # allready there + + order = {"none": 0, + "unpack": 1, + "setupaction": 2, + "buildaction": 3, + "installaction": 4, + "buildpackages": 5} + + if last != "unpack" or order[last] < order["unpack"]: + __buildState_unpack(pb) + if state == "unpack": return + + if last != "setupaction" or order[last] < order["setupaction"]: + __buildState_setupAction(pb, last) + if state == "setupaction": return + + if last != "buildaction" or order[last] < order["buildaction"]: + __buildState_buildAction(pb, last) + if state == "buildaction": return + + if last != "installaction" or order[last] < order["installaction"]: + __buildState_installAction(pb, last) + if state == "installaction": return + + __buildState_package(pb, last) + +