def __processImportCommandline(self, commandline): if len(commandline) < 3: self.printUsage() return False for currArg in commandline[1:]: if currArg.lower() in ("/help", "/h", "-help", "--help", "-h"): self.printUsage() return False elif currArg == "--import": continue elif utilityFunctions.isURL(currArg) or os.path.isfile( currArg) or os.path.isdir(currArg): name = target.targetPathToName(currArg) if name == "": return False currTarget = target.Target(name, currArg) self.targetsToImport.append(currTarget) continue currFlag = currArg[:2].lower() currValue = currArg[2:] if currFlag in ("-p", "-l", "-n", "-j", "-b", "-w", "-k", "-o", "-g", "-f"): logger.writeError( "Command-line option is not allowed in import mode: " + currArg) return False if currFlag == "-i": if not validateOption(currFlag, currValue): return False self.interactive = True elif currFlag == "-v": if not validateOption(currFlag, currValue): return False self.verbose = True else: logger.writeError( "File not found or command-line option not understood: " + currArg) return False if len(self.targetsToImport) == 0: self.printUsage() logger.writeError( "No packages given when MixDown is in import mode") return False return True
def __processImportCommandline(self, commandline): if len(commandline) < 3: self.printUsage() return False for currArg in commandline[1:]: if currArg.lower() in ("/help", "/h", "-help", "--help", "-h"): self.printUsage() return False elif currArg == "--import": continue elif utilityFunctions.isURL(currArg) or os.path.isfile(currArg) or os.path.isdir(currArg): name = target.targetPathToName(currArg) if name == "": return False currTarget = target.Target(name, currArg) self.targetsToImport.append(currTarget) continue currFlag = currArg[:2].lower() currValue = currArg[2:] if currFlag in ("-p", "-l", "-n", "-j", "-b", "-w", "-k", "-o", "-g", "-f"): logger.writeError("Command-line option is not allowed in import mode: " + currArg) return False if currFlag == "-i": if not validateOption(currFlag, currValue): return False self.interactive = True elif currFlag == "-v": if not validateOption(currFlag, currValue): return False self.verbose = True else: logger.writeError("File not found or command-line option not understood: " + currArg) return False if len(self.targetsToImport) == 0: self.printUsage() logger.writeError("No packages given when MixDown is in import mode") return False return True
def importTargets(options): logger.setLogger("console") finalTargets = [] ignoredTargets = [] partialImport = False fetchStep = commands.BuildStep("fetch", commands.__getFetchCommand(None)) unpackStep = commands.BuildStep("unpack", commands.__getUnpackCommand(None)) tempDir = tempfile.mkdtemp(prefix="mixdown-") options.downloadDir = os.path.join(tempDir, "mdDownloads") while len(options.targetsToImport) != 0: target = options.targetsToImport.pop(0) logger.writeMessage("Analyzing target...", target.name) logger.writeMessage("Extracting target...", target.name) target.outputPath = os.path.join(tempDir, target.name) target.currBuildStep = fetchStep if not commands.buildStepActor(target, options, None): utilityFunctions.removeDir(tempDir) return None, False target.currBuildStep = unpackStep if not commands.buildStepActor(target, options, None): utilityFunctions.removeDir(tempDir) return None, False #Generate build files and find possible dependencies possibleDeps = [] if cmake.isCMakeProject(target.path): logger.writeMessage("CMake project found...", target.name) logger.writeMessage("Analyzing for dependencies...", target.name) possibleDeps = cmake.getDependencies(target.path, target.name) elif autoTools.isAutoToolsProject(target.path): logger.writeMessage("Auto Tools project found...", target.name) if not os.path.exists(os.path.join(target.path, "configure")): if not autoTools.generateConfigureFiles(target.path, target.name): utilityFunctions.removeDir(tempDir) return None, False logger.writeMessage("Analyzing for dependencies...", target.name) possibleDeps = autoTools.getDependencies(target.path, target.name) if possibleDeps == None: target.comment = "Unable to parse 'configure --help' output. MixDown cannot determine dependencies for this target." logger.writeError(target.comment, target.name) partialImport = True possibleDeps = [] elif make.isMakeProject(target.path): target.comment = "Make project found. MixDown cannot determine dependencies from Make projects." logger.writeError(target.comment, target.name) partialImport = True else: target.comment = "Unknown build system found. MixDown cannot determine dependencies or build commands." logger.writeError(target.comment, target.name) partialImport = True #Find actual dependencies for possibleDependency in possibleDeps: if getTarget(possibleDependency, finalTargets + options.targetsToImport): logger.writeMessage("Known dependency found (" + possibleDependency + ")", target.name) target.dependsOn.append(possibleDependency) continue elif options.interactive and possibleDependency in ignoredTargets: logger.writeMessage("Previously ignored dependency found (" + possibleDependency + ")", target.name) continue if searchForPossibleAliasInList(possibleDependency, finalTargets + options.targetsToImport, options.interactive): target.dependsOn.append(possibleDependency) elif not options.interactive: logger.writeMessage("Ignoring unknown dependency (" + possibleDependency + ")", target.name) else: logger.writeMessage("Unknown dependency found (" + possibleDependency + ")", target.name) userInput = raw_input(possibleDependency + ": Input location, target name, or blank to ignore:").strip() if userInput == "": ignoredTargets.append(possibleDependency) elif os.path.isfile(userInput) or os.path.isdir(userInput) or utilityFunctions.isURL(userInput): name = target.targetPathToName(userInput) if name == "": return None, False newTarget = target.Target(name, userInput) options.targetsToImport.append(newTarget) if target.normalizeName(possibleDependency) != target.normalizeName(userInput): newTarget.aliases.append(possibleDependency) target.dependsOn.append(possibleDependency) else: aliasTarget = getTarget(userInput, finalTargets + options.targetsToImport, possibleDependency) if aliasTarget != None: logger.writeMessage("Alias added (" + userInput + ")", aliasTarget.name) target.dependsOn.append(possibleDependency) else: aliasLocation = raw_input(userInput + ": Target name not found in any known targets. Location of new target:").strip() if os.path.isfile(aliasLocation) or os.path.isdir(aliasLocation) or utilityFunctions.isURL(aliasLocation): name = target.targetPathToName(aliasLocation) if name == "": return None, False newTarget = target.Target(name, aliasLocation) notReviewedTargets.append(newTarget) if target.normalizeName(possibleDependency) != target.normalizeName(aliasLocation): newTarget.aliases.append(possibleDependency) target.dependsOn.append(possibleDependency) else: logger.writeError(userInput + ": Alias location not understood.", exitProgram=True) finalTargets.append(target) #Create project for targets projects = project.Project("ProjectNameNotDetermined", finalTargets) if not projects.examine(options): logger.writeError("Project failed examination", exitProgram=True) if not projects.validate(options): logger.writeError("Project failed validation", exitProgram=True) mainTargetPath = projects.targets[0].origPath if utilityFunctions.isURL(mainTargetPath): mainTargetPath = utilityFunctions.URLToFilename(mainTargetPath) mainTargetName, mainTargetVersion = utilityFunctions.splitFileName(mainTargetPath) if mainTargetVersion != "": projects.name = mainTargetName + "-" + mainTargetVersion else: projects.name = mainTargetName projects.path = projects.name + ".md" for target in projects.targets: target.outputPath = "" if projects.examine(options): logger.writeMessage("\nFinal targets...\n\n" + str(projects)) projects.write() utilityFunctions.removeDir(tempDir) return projects, partialImport
def importTargets(options): logger.setLogger("console") finalTargets = [] ignoredTargets = [] partialImport = False fetchStep = commands.BuildStep("fetch", commands.__getFetchCommand(None)) unpackStep = commands.BuildStep("unpack", commands.__getUnpackCommand(None)) tempDir = tempfile.mkdtemp(prefix="mixdown-") options.downloadDir = os.path.join(tempDir, "mdDownloads") while len(options.targetsToImport) != 0: target = options.targetsToImport.pop(0) logger.writeMessage("Analyzing target...", target.name) logger.writeMessage("Extracting target...", target.name) target.outputPath = os.path.join(tempDir, target.name) target.currBuildStep = fetchStep if not commands.buildStepActor(target, options, None): utilityFunctions.removeDir(tempDir) return None, False target.currBuildStep = unpackStep if not commands.buildStepActor(target, options, None): utilityFunctions.removeDir(tempDir) return None, False #Generate build files and find possible dependencies possibleDeps = [] if cmake.isCMakeProject(target.path): logger.writeMessage("CMake project found...", target.name) logger.writeMessage("Analyzing for dependencies...", target.name) possibleDeps = cmake.getDependencies(target.path, target.name) elif autoTools.isAutoToolsProject(target.path): logger.writeMessage("Auto Tools project found...", target.name) if not os.path.exists(os.path.join(target.path, "configure")): if not autoTools.generateConfigureFiles( target.path, target.name): utilityFunctions.removeDir(tempDir) return None, False logger.writeMessage("Analyzing for dependencies...", target.name) possibleDeps = autoTools.getDependencies(target.path, target.name) if possibleDeps == None: target.comment = "Unable to parse 'configure --help' output. MixDown cannot determine dependencies for this target." logger.writeError(target.comment, target.name) partialImport = True possibleDeps = [] elif make.isMakeProject(target.path): target.comment = "Make project found. MixDown cannot determine dependencies from Make projects." logger.writeError(target.comment, target.name) partialImport = True else: target.comment = "Unknown build system found. MixDown cannot determine dependencies or build commands." logger.writeError(target.comment, target.name) partialImport = True #Find actual dependencies for possibleDependency in possibleDeps: if getTarget(possibleDependency, finalTargets + options.targetsToImport): logger.writeMessage( "Known dependency found (" + possibleDependency + ")", target.name) target.dependsOn.append(possibleDependency) continue elif options.interactive and possibleDependency in ignoredTargets: logger.writeMessage( "Previously ignored dependency found (" + possibleDependency + ")", target.name) continue if searchForPossibleAliasInList( possibleDependency, finalTargets + options.targetsToImport, options.interactive): target.dependsOn.append(possibleDependency) elif not options.interactive: logger.writeMessage( "Ignoring unknown dependency (" + possibleDependency + ")", target.name) else: logger.writeMessage( "Unknown dependency found (" + possibleDependency + ")", target.name) userInput = raw_input( possibleDependency + ": Input location, target name, or blank to ignore:" ).strip() if userInput == "": ignoredTargets.append(possibleDependency) elif os.path.isfile(userInput) or os.path.isdir( userInput) or utilityFunctions.isURL(userInput): name = target.targetPathToName(userInput) if name == "": return None, False newTarget = target.Target(name, userInput) options.targetsToImport.append(newTarget) if target.normalizeName( possibleDependency) != target.normalizeName( userInput): newTarget.aliases.append(possibleDependency) target.dependsOn.append(possibleDependency) else: aliasTarget = getTarget( userInput, finalTargets + options.targetsToImport, possibleDependency) if aliasTarget != None: logger.writeMessage("Alias added (" + userInput + ")", aliasTarget.name) target.dependsOn.append(possibleDependency) else: aliasLocation = raw_input( userInput + ": Target name not found in any known targets. Location of new target:" ).strip() if os.path.isfile(aliasLocation) or os.path.isdir( aliasLocation) or utilityFunctions.isURL( aliasLocation): name = target.targetPathToName(aliasLocation) if name == "": return None, False newTarget = target.Target(name, aliasLocation) notReviewedTargets.append(newTarget) if target.normalizeName(possibleDependency ) != target.normalizeName( aliasLocation): newTarget.aliases.append(possibleDependency) target.dependsOn.append(possibleDependency) else: logger.writeError( userInput + ": Alias location not understood.", exitProgram=True) finalTargets.append(target) #Create project for targets projects = project.Project("ProjectNameNotDetermined", finalTargets) if not projects.examine(options): logger.writeError("Project failed examination", exitProgram=True) if not projects.validate(options): logger.writeError("Project failed validation", exitProgram=True) mainTargetPath = projects.targets[0].origPath if utilityFunctions.isURL(mainTargetPath): mainTargetPath = utilityFunctions.URLToFilename(mainTargetPath) mainTargetName, mainTargetVersion = utilityFunctions.splitFileName( mainTargetPath) if mainTargetVersion != "": projects.name = mainTargetName + "-" + mainTargetVersion else: projects.name = mainTargetName projects.path = projects.name + ".md" for target in projects.targets: target.outputPath = "" if projects.examine(options): logger.writeMessage("\nFinal targets...\n\n" + str(projects)) projects.write() utilityFunctions.removeDir(tempDir) return projects, partialImport