class SvnFlow: def __init__(self): self.svn = Svn(svn_utils.find_svn_root_path()) self.trunk_dir = "trunk" self.tags_dir = "tags" self.branches_dir = "branches" self.develop_branch = os.path.join(self.branches_dir, "develop") self.feature_dir = os.path.join(self.branches_dir, "feature") self.release_dir = os.path.join(self.branches_dir, "release") self.hotfix_dir = os.path.join(self.branches_dir, "hotfix") self.branch_dir_by_type = {"feature" : self.feature_dir, \ "release" : self.release_dir, \ "hotfix" : self.hotfix_dir} def init(self): self.__create_dir(self.trunk_dir) self.__create_dir(self.branches_dir) self.__create_dir(self.tags_dir) self.__create_develop_branch() self.__create_dir(self.feature_dir) self.__create_dir(self.release_dir) self.__create_dir(self.hotfix_dir) self.svn.update_all() # # Returns 0 if no errors were encountered. Otherwise 1 is returned. # def test(self): retval = 0 retval = self.__test_dir("trunk") or retval retval = self.__test_dir("tags") or retval retval = self.__test_dir(self.branches_dir) or retval retval = self.__test_dir(self.feature_dir) or retval retval = self.__test_dir(self.release_dir) or retval retval = self.__test_dir(self.hotfix_dir) or retval return retval def feature_start(self, name): self.__branch_start(name, "feature", self.develop_branch) def feature_finish(self, name): feature_branch = os.path.join(self.feature_dir, name) self.__raise_if_dir_invalid(feature_branch) self.svn.update_all() self.svn.merge(feature_branch, self.develop_branch, reintegrate=True) self.__commit_and_log("Merged feature '" + name + "' to develop.") self.svn.remove(feature_branch) self.__commit_and_log("Removed feature '" + name + "' branch.") self.svn.update_all() def feature_list(self): self.__branch_list("feature") def release_start(self, version): self.__branch_start(version, "release", self.develop_branch) def release_finish(self, version): release_branch = os.path.join(self.release_dir, version) self.__raise_if_dir_invalid(release_branch) self.svn.update_all() self.svn.merge(release_branch, self.trunk_dir) self.__commit_and_log("Merged release '" + version \ + "' to trunk.") self.svn.update_all() tag_branch = os.path.join(self.tags_dir, version) tag_message = self.__get_tag_message() self.svn.tag(self.trunk_dir, tag_branch, tag_message) self.svn.update_all() self.svn.merge(release_branch, self.develop_branch, reintegrate=True) self.__commit_and_log("Merged release '" + version \ + "' to develop.") self.svn.remove(release_branch) self.__commit_and_log("Removed release '" + version \ + "' branch.") self.svn.update_all() def release_list(self): self.__branch_list("release") def hotfix_start(self, version): self.__branch_start(version, "hotfix", self.trunk_dir) def hotfix_finish(self, version): hotfix_branch = os.path.join(self.hotfix_dir, version) self.__raise_if_dir_invalid(hotfix_branch) self.svn.update_all() self.svn.merge(hotfix_branch, self.develop_branch) self.__commit_and_log("Merged hotfix '" + version \ + "' to develop.") self.svn.update_all() self.svn.merge(hotfix_branch, self.trunk_dir, reintegrate=True) self.__commit_and_log("Merged hotfix '" + version + "' to trunk.") self.svn.update_all() tag_branch = os.path.join(self.tags_dir, version) tag_message = self.__get_tag_message() self.svn.tag(self.trunk_dir, tag_branch, tag_message) self.svn.remove(hotfix_branch) self.__commit_and_log("Removed hotfix '" + version + "' branch.") self.svn.update_all() def hotfix_list(self): self.__branch_list("hotfix") def __branch_list(self, branch_type): branches = self.svn.list(self.branch_dir_by_type[branch_type]) if len(branches) < 1: print "No " + branch_type + " branches are present." else: print branch_type + " branches:" for b in branches: print "\t" + b[:-1] def __branch_start(self, name, branch_type, branch_off): branch_dir = self.branch_dir_by_type[branch_type] branch = os.path.join(branch_dir, name) if os.path.exists(self.svn.full_path(branch)): raise Exception(branch_type + " branch '" + branch \ + "' already exists.") self.svn.update_all() self.svn.branch(branch_off, branch) self.__commit_and_log("Created " + branch_type + " branch '" \ + name + "'.") self.svn.update_all() # # Reads tag message from stdin and returns the result. # def __get_tag_message(self): stdout.write("Tag message: ") return stdin.readline()[:-1] def __test_dir(self, dir_path): retval = 0 try: self.__raise_if_dir_invalid(dir_path) self.__raise_if_not_exists(dir_path) log(dir_path + " [" + console_utils.text_green("OK") \ + "]") except Exception, e: log(dir_path + " [" + console_utils.text_red("FAIL") \ + "]") console_utils.print_error(str(e)) retval = 1 return retval