#[ Description: Control workflow of update, clone and pull. Authors: 2020, Nong Hoang Tu Contributors: Module structure: - doUpdateProject: Control the way a project is updated - updateProjectAll: Call doUpdateProject for all projects in root_folder - updateProjectArr: Call doUpdateProject, update projects that were given by user - pullProjectAll: Pull all projects in root_folder - pullProjectArr: Pull projects were given by user - cloneProject: Clone projects were given by user - handleUpdateProject: Select updateProjectArr or updateProjectAll by number of projects were given by user. This proc is called from main - handlePullProject: Select updatePulltArr or updatePullAll by number of projects were given by user. This proc is called from main TODO: ]# import configs import .. / interfaces / logutils import .. / update / cmdutils import os proc doUpdateProject(config: ProgConf, project: DebPackage): Err = #[ Workflow: 1. Pull project to sync changes from manual packaging 2. Check for update 3. Upgrade source code 4. Create changelog 5. Create tag 6. Push ]# var stderr, localVer, serverVer: string if gbpPull(config.uscanPath, project.path, stderr) != 0: project.log.logErr(project.name, "Error while pulling", stderr) return Err.failed else: project.log.logInfo(project.name, "Pull completed. Start checking new update") let updateStt = checkUpdate(config.uscanPath, project.path, localVer, serverVer, stderr) if updateStt == Err.updated: project.log.logInfo(project.name, "Up to date") return Err.updated elif updateStt == Err.failed: project.log.logErr(project.name, "Error while checking for new version", stderr) return Err.updated else: project.log.logInfo(project.name, "[" & localVer & "] [" & serverVer & "]. Start upgrading source code.") if gbpUpdate(config.uscanPath, project.path, stderr) != 0: project.log.logErr(project.name, "Error while updating", stderr) return Err.failed else: project.log.logInfo(project.name, "Upgrade to new version successfully. Making changelog.") if gbpDch(config.uscanPath, project.path, serverVer, stderr) != 0: project.log.logErr(project.name, "Error while creating new changelog", stderr) return Err.failed else: project.log.logInfo(project.name, "New changelog was created. Making new tag.") if gbpTag(config.uscanPath, project.path, stderr) != 0: project.log.logErr(project.name, "Error while creating new tag", stderr) return Err.failed else: project.log.logInfo(project.name, "Create new tag successfully. Start pushing.") if gbpPush(config.uscanPath, project.path, stderr) != 0: project.log.logErr(project.name, "Error while pushing new patches", stderr) return Err.failed else: project.log.logInfo(project.name, "Pushed new version to " & dirName(config.gitUrl) & project.name) return Err.updateSuccess proc updateProjectAll(config: ProgConf) = let resultLog = initResultLogs(config.logPath) fullLog = initFullLogs(config.logPath) var project: DebPackage project.log = fullLog for kind, path in walkDir(config.rootPath): if kind == pcDir: project.path = path project.name = path.splitPath.tail let updateResult = doUpdateProject(config, project) if updateResult == Err.updated: resultLog.logInfo(project.name, "Up to date") elif updateResult == Err.updateSuccess: resultLog.logInfo(project.name, "Update successfully") else: resultLog.logErr(project.name, "Failed to update", "") proc updateProjectArr(config: ProgConf, projectArr: seq[string]) = let resultLog = initResultLogs(config.logPath) fullLog = initFullLogs(config.logPath) var project: DebPackage project.log = fullLog for name in projectArr: project.name = name project.path = dirName(config.rootPath & name) if not dirExists(project.path): resultLog.logErr(project.name, "Dir doesn't exist", "") else: let updateResult = doUpdateProject(config, project) if updateResult == Err.updated: resultLog.logInfo(project.name, "Up to date") elif updateResult == Err.updateSuccess: resultLog.logInfo(project.name, "Update successfully") else: resultLog.logErr(project.name, "Failed to update", "") proc pullProjectAll(config: ProgConf) = let fullLog = initFullLogs(config.logPath) var project: DebPackage stderr: string project.log = fullLog for kind, path in walkDir(config.rootPath): if kind == pcDir: project.path = path project.name = path.splitPath.tail if gbpPull(config.uscanPath, project.path, stderr) != 0: project.log.logErr(project.name, "Error while pulling", stderr) else: project.log.logInfo(project.name, "Pulled successfully.") proc pullProjectArr(config: ProgConf, projectArr: seq[string]) = let fullLog = initFullLogs(config.logPath) var project: DebPackage stderr: string project.log = fullLog for name in projectArr: project.name = name project.path = dirName(config.rootPath & name) if not dirExists(project.path): project.log.logErr(project.name, "Dir doesn't exist", "") else: if gbpPull(config.uscanPath, project.path, stderr) != 0: project.log.logErr(project.name, "Error while pulling", stderr) else: project.log.logInfo(project.name, "Pulled successfully.") proc cloneProject*(projects: seq[string]) = var config: ProgConf project: DebPackage stderr: string let fullLog = initFullLogs(config.logPath) if not initConfig(config): return project.log = fullLog for name in projects: project.name = name project.path = dirName(config.rootPath & name) if dirExists(project.path): project.log.logErr(project.name, "Dir exists", "") else: if gbpClone(config.gbpPath, config.gitUrl, project.name, project.path, stderr) != 0: project.log.logErr(project.name, "Error while cloning", stderr) else: project.log.logInfo(project.name, "Cloned successfully.") proc handleUpdateProject*(projects: seq[string]) = var config: ProgConf if not initConfig(config): return if len(projects) == 0: updateProjectAll(config) else: updateProjectArr(config, projects) proc handlePullProject*(projects: seq[string]) = var config: ProgConf if not initConfig(config): return if len(projects) == 0: pullProjectAll(config) else: pullProjectArr(config, projects)