diff options
Diffstat (limited to 'trunk/src/epkgmove/epkgmove')
-rw-r--r-- | trunk/src/epkgmove/epkgmove | 895 |
1 files changed, 0 insertions, 895 deletions
diff --git a/trunk/src/epkgmove/epkgmove b/trunk/src/epkgmove/epkgmove deleted file mode 100644 index 42b6e7d..0000000 --- a/trunk/src/epkgmove/epkgmove +++ /dev/null @@ -1,895 +0,0 @@ -#!/usr/bin/python -O -# Copyright 2004 Ian Leitch -# Copyright 1999-2004 Gentoo Foundation -# $Header$ -# -# Author: -# Ian Leitch <port001@gentoo.org> -# - -import os -import re -import sys -import signal -import commands -from time import sleep -from random import randint -from optparse import OptionParser - -import portage -try: - from portage.output import * -except ImportError: - from output import * - -__author__ = "Ian Leitch" -__email__ = "port001@gentoo.org" -__productname__ = "epkgmove" -__version__ = "1.3.1 - \"Moving Fusion + Bandages + Plasters\"" -__description__ = "A tool for moving and renaming packages in CVS" - -def print_usage(): - - print - print "%s %s [ %s ] [ %s ] [ %s ]" % (white("Usage:"), turquoise(__productname__), green("option"), green("origin"), green("destination")) - print " '%s' and '%s' are expected as a full package name, e.g. net-im/gaim" % (green("origin"), green("destination")) - print " See %s --help for a list of options" % __productname__ - print - -def check_cwd(portdir): - - if os.getcwd() != portdir: - print - print "%s Not in PORTDIR!" % yellow(" *") - print "%s Setting to: %s" % (yellow(" *"), os.getcwd()) - os.environ["PORTDIR"]=os.getcwd() - return os.getcwd() - - return portdir - -def check_args(args, portdir, options, cvscmd): - - booboo = False - re_expr = "^[\da-zA-Z-]{,}/[\d\w0-9-]{,}$" - o_re_expr = re.compile(re_expr) - - if len(args) == 0: - print "\n%s ERROR: errr, didn't you forget something" % red("!!!"), - count = range(3) - for second in count: - sys.stdout.write(".") - sys.stdout.flush() - sleep(1) - sys.stdout.write("?") - sys.stdout.flush() - sleep(1) - print "\n\n%s %s hits you with a clue stick %s" % (green(" *"), __productname__, green("*")) - sleep(1) - print_usage() - sys.exit(1) - - if options.remove: - if len(args) > 1: - error("Please remove packages one at a time") - sys.exit(1) - elif not o_re_expr.match(args[0].rstrip("/")): - error("Expected full package name as argument") - sys.exit(1) - elif not os.path.exists(os.path.join(portdir, args[0].rstrip("/"))): - error("No such package '%s'" % args[0].rstrip("/")) - sys.exit(1) - else: - if not options.cvs_up: - update_categories(portdir, args, cvscmd["update"]) - return (args[0].rstrip("/"), None) - - if len(args) == 2: - if not o_re_expr.match(args[0].rstrip("/")): - error("Expected full package name as origin argument") - booboo = True - elif not o_re_expr.match(args[1].rstrip("/")): - error("Expected full package name as destination argument") - booboo = True - - if booboo == True: - sys.exit(1) - else: - error("Expected two arguments as input.") - print_usage() - sys.exit(1) - - if not options.cvs_up: - update_categories(portdir, args, cvscmd["update"]) - - if not os.path.exists(os.path.join(portdir, args[0].rstrip("/"))): - error("No such package '%s'" % args[0].rstrip("/")) - booboo = True - elif os.path.exists(os.path.join(portdir, args[1].rstrip("/"))): - error("Package '%s' already exists" % args[1].rstrip("/")) - booboo = True - - if booboo == True: - sys.exit(1) - - return (args[0].rstrip("/"), args[1].rstrip("/")) - -def check_repos(portdir): - - files = os.listdir(portdir) - - for file in files: - if not os.path.isdir(file): - files.remove(file) - - if "CVS" not in files: - error("Current directory doesn't look like a CVS repository") - sys.exit(1) - -def check_commit_queue(): - - empty = True - - print - print "%s Checking commit queue for outstanding changes..." % green(" *") - print "%s Note: This may take a VERY long time" % yellow(" *") - print - - output = commands.getoutput("cvs diff") - - for line in output.split("\n"): - if not line.startswith("?"): - empty = False - break - - if empty == False: - error("Commit queue not empty! Please commit all outstanding changes before using %s." % __productname__) - sys.exit(1) - -def update_categories(portdir, catpkgs, cvsupcmd): - - my_catpkgs = [] - - print - print "%s Updating categories: " % green(" *") - - if len(catpkgs) >= 2: - if catpkgs[0].split("/", 1)[0] == catpkgs[1].split("/", 1)[0]: - my_catpkgs.append(catpkgs[0]) - else: - my_catpkgs.append(catpkgs[0]) - my_catpkgs.append(catpkgs[1]) - else: - my_catpkgs.append(catpkgs[0]) - - for catpkg in my_catpkgs: - (category, package) = catpkg.split("/", 1) - if os.path.exists(os.path.join(portdir, category)): - os.chdir(os.path.join(portdir, category)) - print " %s %s" % (green("*"), category) - do_cmd(cvsupcmd) - else: - print " %s %s" % (red("!"), category) - - os.chdir(portdir) - -def error(msg): - - sys.stderr.write("\n%s ERROR: %s\n" % (red("!!!"), msg)) - -def signal_handler(signal_number=None, stack_frame=None): - - error("Caught SIGINT; exiting...") - sys.exit(1) - os.kill(0, signal.SIGKILL) - -def do_cmd(cmd): - - (status, output) = commands.getstatusoutput(cmd) - if status != 0: - error("Command '%s' failed with exit status %d." % (cmd, status)) - for line in output.split("\n"): - if line != "": - print " %s %s" % (red("!"), line) - sys.exit(1) - -class CVSAbstraction: - - def __init__(self, portdir, oldcatpkg, newcatpkg, cvscmd, options): - - self._portdir = portdir - self._cvscmd = cvscmd - self._options = options - self._ignore = ("CVS") - - self._old_category = "" - self._old_package = "" - self._new_category = "" - self._new_package = "" - self._old_catpkg = oldcatpkg - self._new_catpkg = newcatpkg - - self._action = "" - - self._distinguish_action(oldcatpkg, newcatpkg) - - def _distinguish_action(self, oldcatpkg, newcatpkg): - - (self._old_category, self._old_package) = oldcatpkg.split("/") - if newcatpkg: - (self._new_category, self._new_package) = newcatpkg.split("/") - - if self._old_category != self._new_category and self._new_category: - if self._old_package != self._new_package and self._new_package: - self._action = "MOVE & RENAME" - else: - self._action = "MOVE" - elif self._old_package != self._new_package and self._new_package: - self._action = "RENAME" - elif not self._new_package: - self._action = "REMOVE" - else: - error("Unable to distingush required action.") - sys.exit(1) - - def __backup(self): - - print "%s Backing up %s..." % (green(" *"), turquoise(self._old_catpkg)) - - if not os.path.exists("/tmp/%s" % __productname__): - os.mkdir("/tmp/%s" % __productname__) - - if os.path.exists("/tmp/%s/%s" % (__productname__, self._old_package)): - do_cmd("rm -rf /tmp/%s/%s" % (__productname__, self._old_package)) - - do_cmd("cp -R %s /tmp/%s/%s" % (os.path.join(self._portdir, self._old_catpkg), __productname__, self._old_package)) - - def perform_action(self): - - count_down = 5 - - print - if self._action == "REMOVE": - print "%s Performing a '%s' of %s..." % (green(" *"), green(self._action), turquoise(self._old_catpkg)) - else: - print "%s Performing a '%s' of %s to %s..." % (green(" *"), green(self._action), turquoise(self._old_catpkg), yellow(self._new_catpkg)) - - if not self._options.countdown: - print "%s Performing in: " % green(" *"), - count = range(count_down) - count.reverse() - for second in count: - sys.stdout.write("%s " % red(str(second + 1))) - sys.stdout.flush() - sleep(1) - print - - if not self._action == "REMOVE": - self.__backup() - - if self._action == "MOVE & RENAME": - self._perform_move_rename() - elif self._action == "MOVE": - self._perform_move() - elif self._action == "RENAME": - self._perform_rename() - elif self._action == "REMOVE": - self._perform_remove() - - def _perform_remove(self): - - deps = self.__get_reverse_deps() - - if deps: - print "%s The following ebuild(s) depend on this package:" % red(" *") - for dep in deps: - print "%s %s" % (red(" !"), dep) - if self._options.force: - print "%s Are you sure you wish to force removal of this package?" % yellow(" *"), - try: - choice = raw_input("(Yes/No): ") - except KeyboardInterrupt: - error("Interrupted by user.") - sys.exit(1) - if choice.strip().lower() != "yes": - error("Bailing on forced removal.") - sys.exit(1) - else: - error("Refusing to remove from CVS, package has dependents.") - sys.exit(1) - - self.__remove_old_package() - - def _perform_move(self): - - self.__add_new_package() - self.__regen_manifest() - self.__update_dependents(self.__get_reverse_deps()) - self.__remove_old_package() - - def _perform_move_rename(self): - - self._perform_rename() - - def _perform_rename(self): - - self.__rename_files() - self.__add_new_package() - self.__regen_digests() - self.__update_dependents(self.__get_reverse_deps()) - self.__remove_old_package() - - def __rename_files(self): - - def rename_files(arg, dir, files): - - if os.path.basename(dir) not in self._ignore: - if os.path.basename(dir) != self._old_package: - for file in files: - new_file = "" - if file.find(self._old_package) >= 0: - new_file = file.replace(self._old_package, self._new_package) - do_cmd("mv %s %s" % (os.path.join(dir, file), os.path.join(dir, new_file))) - if not os.path.isdir(os.path.join(dir, new_file)) and not file.startswith("digest-"): - self.__rename_file_contents(os.path.join(dir, new_file)) - else: - for file in files: - if file.endswith(".ebuild"): - new_file = file.replace(self._old_package, self._new_package) - do_cmd("mv %s %s" % (os.path.join(dir, file), os.path.join(dir, new_file))) - self.__rename_file_contents(os.path.join(dir, new_file)) - elif file.endswith(".xml"): - self.__rename_file_contents(os.path.join(dir, file)) - - print "%s Renaming files..." % green(" *") - os.path.walk("/tmp/%s/%s" % (__productname__, self._old_package), rename_files , None) - do_cmd("mv /tmp/%s/%s /tmp/%s/%s" % (__productname__, self._old_package, __productname__, self._new_package)) - - def __regen_manifest(self, path=None, dep=False): - - if dep: - print "%s Regenerating Manifest..." % green(" *") - else: - print "%s Regenerating Manifest..." % green(" *") - if path: - os.chdir(path) - else: - os.chdir(os.path.join(self._portdir, self._new_catpkg)) - for ebuild in os.listdir("."): - if ebuild.endswith(".ebuild"): - do_cmd("/usr/lib/portage/bin/ebuild %s manifest" % ebuild) - break - - self.__gpg_sign(dep) - - def __regen_digests(self): - - print "%s Regenerating digests:" % green(" *") - os.chdir(os.path.join(self._portdir, self._new_catpkg)) - for digest in os.listdir("files/"): - if digest.startswith("digest-"): - os.unlink("files/%s" % digest) - for ebuild in os.listdir("."): - if ebuild.endswith(".ebuild"): - print " >>> %s" % ebuild - do_cmd("/usr/lib/portage/bin/ebuild %s digest" % ebuild) - - self.__gpg_sign() - - def __gpg_sign(self, dep=False): - - gpg_cmd = "" - - os.chdir(os.path.join(self._portdir, self._new_catpkg)) - - if "sign" in portage.features: - if dep: - print "%s GPG Signing Manifest..." % green(" *") - else: - print "%s GPG Signing Manifest..." % green(" *") - gpg_cmd = "gpg --quiet --sign --clearsign --yes --default-key %s" % portage.settings["PORTAGE_GPG_KEY"] - if portage.settings.has_key("PORTAGE_GPG_DIR"): - gpg_cmd = "%s --homedir %s" % (gpg_cmd, portage.settings["PORTAGE_GPG_DIR"]) - do_cmd("%s Manifest" % gpg_cmd) - do_cmd("mv Manifest.asc Manifest") - do_cmd("%s 'Manifest recommit'" % self._cvscmd["commit"]) - - def __rename_file_contents(self, file): - - def choice_loop(line, match_count, choice_list, type="name", replace=""): - - new_line = line - accepted = False - skipp = False - - while(not accepted): - print " ", - if len(choice_list) > 0: - for choice in choice_list: - print "%s: Replace with '%s'," % (white(choice), green(choice_list[choice])), - if match_count == 0: - print "%s: Pass, %s: Skip this file, %s: Custom" % (white(str(len(choice_list)+1)), white(str(len(choice_list)+2)), white(str(len(choice_list)+3))), - else: - print "%s: Pass, %s: Custom" % (white(str(len(choice_list)+1)), white(str(len(choice_list)+2))), - try: - input = raw_input("%s " % white(":")) - except KeyboardInterrupt: - print - error("Interrupted by user.") - sys.exit(1) - if choice_list.has_key(input): - if type == "name": - new_line = new_line.replace(self._old_package, choice_list[input]) - accepted = True - elif type == "P": - new_line = new_line.replace("${P}", choice_list[input]) - accepted = True - elif type == "PN": - new_line = new_line.replace("${PN}", choice_list[input]) - accepted = True - elif type == "PV": - new_line = new_line.replace("${PV}", choice_list[input]) - accepted = True - elif type == "PVR": - new_line = new_line.replace("${PVR}", choice_list[input]) - accepted = True - elif type == "PR": - new_line = new_line.replace("${PR}", choice_list[input]) - accepted = True - elif type == "PF": - new_line = new_line.replace("${PF}", choice_list[input]) - accepted = True - elif input == str(len(choice_list)+1): - accepted = True - elif input == str(len(choice_list)+2) and match_count == 0: - accepted = True - skipp = True - elif input == str(len(choice_list)+3) and match_count == 0 or input == str(len(choice_list)+2) and match_count != 0: - - input_accepted = False - - while(not input_accepted): - try: - custom_input = raw_input(" %s Replacement string: " % green("*")) - except KeyboardInterrupt: - print - error("Interrupted by user.") - sys.exit(1) - while(1): - print " %s Replace '%s' with '%s'? (Y/N)" % (yellow("*"), white(replace), white(custom_input)), - try: - yes_no = raw_input(": ") - except KeyboardInterrupt: - print - error("Interrupted by user.") - sys.exit(1) - if yes_no.lower() == "y": - input_accepted = True - break - elif yes_no.lower() == "n": - break - - new_line = new_line.replace(replace, custom_input) - accepted = True - else: - accepted = False - - if skipp: - break - - return (new_line, skipp) - - found = False - contents = [] - new_contents = [] - match_count = 0 - skipp = False - - try: - readfd = open(file, "r") - contents = readfd.readlines() - readfd.close() - except IOError, e: - error(e) - sys.exit(1) - - for line in contents: - if line.find(self._old_package) >= 0: - found = True - break - - if found == True: - print "%s Editing %s:" % (green(" *"), white(file.split("/tmp/%s/%s/" % (__productname__, self._old_package))[1])) - try: - writefd = open(file, "w") - except IOError, e: - error(e) - sys.exit(1) - for line in contents: - tmp_line = line - if not line.startswith("# $Header:"): - if line.find(self._old_package) >= 0: - print "%s %s" % (green(" !"), line.strip().replace(self._old_package, yellow(self._old_package))) - (tmp_line, skipp) = choice_loop(tmp_line, match_count, {"1": self._new_package, - "2": "${PN}"}, type="name", replace=self._old_package) - match_count += 1 - if skipp: - break - if line.find("${P}") >= 0: - print "%s %s" % (green(" !"), line.strip().replace("${P}", yellow("${P}"))) - (pkg, version, revising) = portage.pkgsplit(os.path.split(file)[1][:-7]) - (tmp_line, skipp) = choice_loop(tmp_line, match_count, {"1": "%s-%s" % (pkg, version), - "2": "%s-%s" % (self._old_package, version)}, type="P", replace="${P}") - match_count += 1 - if skipp: - break - if line.find("${PN}") >= 0: - print "%s %s" % (green(" !"), line.strip().replace("${PN}", yellow("${PN}"))) - (tmp_line, skipp) = choice_loop(tmp_line, match_count, {"1": self._new_package, - "2": self._old_package}, type="PN", replace="${PN}") - match_count += 1 - if skipp: - break - if line.find("${PV}") >= 0: - print "%s %s" % (green(" !"), line.strip().replace("${PV}", yellow("${PV}"))) - (pkg, version, revision) = portage.pkgsplit(os.path.split(file)[1][:-7]) - (tmp_line, skipp) = choice_loop(tmp_line, match_count, {"1": version}, type="PV", replace="${PV}") - match_count += 1 - if skipp: - break - if line.find("${PVR}") >= 0: - print "%s %s" % (green(" !"), line.strip().replace("${PVR}", yellow("${PVR}"))) - (pkg, version, revision) = portage.pkgsplit(os.path.split(file)[1][:-7]) - (tmp_line, skipp) = choice_loop(tmp_line, match_count, {"1": "%s-%s" % (version, revision)}, type="PVR", replace="${PVR}") - match_count += 1 - if skipp: - break - if line.find("${PR}") >= 0: - print "%s %s" % (green(" !"), line.strip().replace("${PR}", yellow("${PR}"))) - (pkg, version, revision) = portage.pkgsplit(os.path.split(file)[1][:-7]) - (tmp_line, skipp) = choice_loop(tmp_line, match_count, {"1": revision}, type="PR", replace="${PR}") - match_count += 1 - if skipp: - break - if line.find("${PF}") >= 0: - print "%s %s" % (green(" !"), line.strip().replace("${PF}", yellow("${PF}"))) - (pkg, version, revision) = portage.pkgsplit(os.path.split(file)[1][:-7]) - (tmp_line, skipp) = choice_loop(tmp_line, match_count, {"1": "%s-%s-%s" % (pkg, version, revision), - "2": "%s-%s-%s" % (self._old_package, version, revision)}, type="PF", replace="${PF}") - match_count += 1 - if skipp: - break - if line.find("${P/") >= 0: - start = line.find("${P/") - i = 0 - hi_str = "" - while(line[start + (i - 1)] != "}"): - hi_str += line[start + i] - i += 1 - print "%s %s" % (green(" !"), line.strip().replace(hi_str, red(hi_str))) - (tmp_line, skipp) = choice_loop(tmp_line, match_count, {}, type=None, replace=hi_str) - match_count += 1 - if skipp: - break - if line.find("${PN/") >= 0: - start = line.find("${PN/") - i = 0 - hi_str = "" - while(line[start + (i - 1)] != "}"): - hi_str += line[start + i] - i += 1 - print "%s %s" % (green(" !"), line.strip().replace(hi_str, red(hi_str))) - (tmp_line, skipp) = choice_loop(tmp_line, match_count, {}, type=None, replace=hi_str) - match_count += 1 - if skipp: - break - if line.find("${PV/") >= 0: - start = line.find("${PV/") - i = 0 - hi_str = "" - while(line[start + (i - 1)] != "}"): - hi_str += line[start + i] - i += 1 - print "%s %s" % (green(" !"), line.strip().replace(hi_str, red(hi_str))) - (tmp_line, skipp) = choice_loop(tmp_line, match_count, {}, type=None, replace=hi_str) - match_count += 1 - if skipp: - break - if line.find("${PVR/") >= 0: - start = line.find("${PVR/") - i = 0 - hi_str = "" - while(line[start + (i - 1)] != "}"): - hi_str += line[start + i] - i += 1 - print "%s %s" % (green(" !"), line.strip().replace(hi_str, red(hi_str))) - (tmp_line, skipp) = choice_loop(tmp_line, match_count, {}, type=None, replace=hi_str) - match_count += 1 - if skipp: - break - if line.find("${PR/") >= 0: - start = line.find("${PR/") - i = 0 - hi_str = "" - while(line[start + (i - 1)] != "}"): - hi_str += line[start + i] - i += 1 - print "%s %s" % (green(" !"), line.strip().replace(hi_str, red(hi_str))) - (tmp_line, skipp) = choice_loop(tmp_line, match_count, {}, type=None, replace=hi_str) - match_count += 1 - if skipp: - break - if line.find("${PF/") >= 0: - start = line.find("${PF/") - i = 0 - hi_str = "" - while(line[start + (i - 1)] != "}"): - hi_str += line[start + i] - i += 1 - print "%s %s" % (green(" !"), line.strip().replace(hi_str, red(hi_str))) - (tmp_line, skipp) = choice_loop(tmp_line, match_count, {}, type=None, replace=hi_str) - match_count += 1 - if skipp: - break - - new_contents.append(tmp_line) - - if not skipp: - for line in new_contents: - writefd.write(line) - else: - for line in contents: - writefd.write(line) - - writefd.close() - - def __update_dependents(self, dep_list): - - if len(dep_list) <= 0: - return - - print "%s Updating dependents:" % green(" *") - os.chdir(self._portdir) - - for dep in dep_list: - print " >>> %s" % dep - new_contents = [] - (category, pkg) = dep.split("/") - pkg_split = portage.pkgsplit(pkg) - os.chdir(self._portdir) - do_cmd("%s %s" % (self._cvscmd["update"], os.path.join(category, pkg_split[0]))) - - try: - readfd = open(os.path.join(self._portdir, category, pkg_split[0], "%s.ebuild" % pkg), "r") - contents = readfd.readlines() - readfd.close() - except IOError, e: - error(e) - sys.exit(1) - - for line in contents: - if self._old_catpkg in line: - new_contents.append(line.replace(self._old_catpkg, self._new_catpkg)) - else: - new_contents.append(line) - - try: - writefd = open(os.path.join(self._portdir, category, pkg_split[0], "%s.ebuild" % pkg), "w") - writefd.write("".join(new_contents)) - writefd.close() - except IOError, e: - error(e) - sys.exit(1) - - os.chdir(os.path.join(self._portdir, category, pkg_split[0])) - do_cmd("echangelog 'Dependency update: %s -> %s.'" % (self._old_catpkg, self._new_catpkg)) - do_cmd("%s 'Dependency update: %s -> %s.'" % (self._cvscmd["commit"], self._old_catpkg, self._new_catpkg)) - self.__regen_manifest(path=os.path.join(self._portdir, category, pkg_split[0]), dep=True) - - def __get_reverse_deps(self): - - dep_list = [] - conf_portdir = "/usr/portage" - - def scan_for_dep(arg, dir, files): - - (null, category) = os.path.split(dir) - - for file in files: - if self._old_catpkg not in os.path.join(category, file): - if not os.path.isdir(os.path.join(dir, file)): - try: - fd = open(os.path.join(dir, file), "r") - contents = fd.readlines() - fd.close() - except IOError, e: - error(e) - sys.exit(1) - if self._old_catpkg in contents[0] or self._old_catpkg in contents[1] or self._old_catpkg in contents[12]: - dep_list.append(os.path.join(category, file)) - - print "%s Resolving reverse dependencies..." % green(" *") - - try: - fd = open("/etc/make.conf", "r") - contents = fd.readlines() - fd.close() - except IOError, e: - error(e) - sys.exit(1) - - for line in contents: - if line.startswith("PORTDIR="): - (null, conf_portdir) = line.strip("\"\n").split("=") - break - - os.path.walk(os.path.join(conf_portdir, "metadata/cache"), scan_for_dep, None) - - return dep_list - - def __remove_old_package(self): - - def remove_files(arg, dir, files): - - if os.path.basename(dir) not in self._ignore: - for file in files: - if not os.path.isdir(os.path.join(dir, file)): - print " <<< %s" % (os.path.join(dir.strip("./"), file)) - os.unlink(os.path.join(dir, file)) - do_cmd("%s %s" % (self._cvscmd["remove"], os.path.join(dir, file))) - - print "%s Removing %s from CVS:" % (green(" *"), turquoise(self._old_catpkg)) - os.chdir(os.path.join(self._portdir, self._old_catpkg)) - os.path.walk('.', remove_files , None) - os.chdir("..") - - print "%s Commiting changes..." % green(" *") - if self._options.remove: - explanation = "" - while(1): - print "%s Please provide an explanation for this removal:" % yellow(" *"), - try: - explanation = raw_input("") - explanation = explanation.replace("'", "\\'").replace('"', '\\"') - except KeyboardInterrupt: - print - error("Interrupted by user.") - sys.exit(1) - if explanation != "": - break - do_cmd("""%s "Removed from %s: %s" """ % (self._cvscmd["commit"], self._old_category, explanation)) - else: - do_cmd("%s 'Moved to %s.'" % (self._cvscmd["commit"], self._new_catpkg)) - do_cmd("rm -rf %s" % os.path.join(self._portdir, self._old_catpkg)) - - print "%s Checking for remnant files..." % (green(" *")) - do_cmd(self._cvscmd["update"]) - - if not os.path.exists(os.path.join(self._portdir, self._old_catpkg)): - if not self._action == "REMOVE": - print "%s %s successfully removed from CVS." % (green(" *"), turquoise(self._old_catpkg)) - else: - error("Remnants of %s still remain in CVS." % (turquoise(self._old_catpkg))) - - def __add_new_package(self): - - def add_files(arg, dir, files): - - (null, null, null, dirs) = dir.split("/", 3) - - if os.path.basename(dir) not in self._ignore: - os.chdir(os.path.join(self._portdir, self._new_category)) - if os.path.basename(dir) != self._new_package: - print " >>> %s/" % dirs - os.mkdir(dirs) - do_cmd("%s %s" % (self._cvscmd["add"], dirs)) - for file in files: - if not os.path.isdir(os.path.join(dir, file)): - print " >>> %s" % os.path.join(dirs, file) - do_cmd("cp %s %s" % (os.path.join(dir, file), dirs)) - do_cmd("%s %s" % (self._cvscmd["add"], os.path.join(dirs, file))) - - print "%s Adding %s to CVS:" % (green(" *"), turquoise(self._new_catpkg)) - os.chdir(os.path.join(self._portdir, self._new_category)) - print " >>> %s/" % self._new_package - os.mkdir(self._new_package) - do_cmd("%s %s" % (self._cvscmd["add"], self._new_package)) - os.chdir(self._new_package) - os.path.walk("/tmp/%s/%s" % (__productname__, self._new_package), add_files , None) - os.chdir(os.path.join(self._portdir, self._new_catpkg)) - - print "%s Adding ChangeLog entry..." % green(" *") - do_cmd("echangelog 'Moved from %s to %s.'" % (self._old_catpkg, self._new_catpkg)) - - print "%s Commiting changes..." % green(" *") - do_cmd("%s 'Moved from %s to %s.'" % (self._cvscmd["commit"], self._old_catpkg, self._new_catpkg)) - - print "%s %s successfully added to CVS." % (green(" *"), turquoise(self._new_catpkg)) - - def log_move(self): - - if not self._action == "REMOVE": - - update_files = [] - update_regex = "^[\d]Q-[\d]{4}$" - - p_file_regex = re.compile(update_regex) - - print "%s Logging move:" % (green(" *")) - os.chdir(os.path.join(self._portdir, "profiles/updates")) - do_cmd(self._cvscmd["update"]) - - for file in os.listdir("."): - o_file_regex = p_file_regex.match(file) - if file not in self._ignore and o_file_regex: - (q, y) = file.split("-") - update_files.append("%s-%s" % (y, q)) - - update_files.sort() - (y, q) = update_files[-1].split("-") - upfile = "%s-%s" % (q, y) - print " >>> %s" % upfile - - try: - fd = open(upfile, "a") - fd.write("move %s %s\n" % (self._old_catpkg, self._new_catpkg)) - fd.close() - except IOError, e: - error(e) - sys.exit(1) - - do_cmd("%s 'Moved %s to %s'" % (self._cvscmd["commit"], self._old_catpkg, self._new_catpkg)) - os.chdir(self._portdir) - - def clean_up(self): - - if not self._action == "REMOVE": - print "%s Removing back-up..." % (green(" *")) - do_cmd("rm -rf /tmp/%s/%s" % (__productname__, self._old_package)) - if len(os.listdir("/tmp/%s" % __productname__)) == 0: - do_cmd("rmdir /tmp/%s" % __productname__) - - os.chdir(self._portdir) - -if __name__ == "__main__": - - signal.signal(signal.SIGINT, signal_handler) - - cvscmd = {"remove": "cvs -Qf rm", - "commit": "cvs -Qf commit -m", - "update": "cvs -Qf up -dPC", - "add": "cvs -Qf add"} - - parser = OptionParser(usage="%prog [ option ] [ origin ] [ destination ]", version="%s-%s" % (__productname__, __version__)) - parser.add_option("--usage", action="store_true", dest="usage", default=False, help="Pint usage information") - parser.add_option("-q", "--queue-check", action="store_true", dest="commit_queue", default=False, help="Check the cvs tree for files awaiting commit") - parser.add_option("-u", "--no-cvs-up", action="store_true", dest="cvs_up", default=False, help="Skip running cvs up in the origin and destination categories") - parser.add_option("-c", "--no-countdown", action="store_true", dest="countdown", default=False, help="Skip countdown before performing") - parser.add_option("-R", "--remove", action="store_true", dest="remove", default=False, help="Remove package") - parser.add_option("-F", "--force", action="store_true", dest="force", default=False, help="Force removal of package, ignoring any reverse deps") - (options, args) = parser.parse_args() - - if options.usage: - print_usage() - sys.exit(0) - - if randint(1, 100) == 50: - print "%s I put on my robe and wizard hat..." % green(" *") - - portdir = check_cwd(portage.settings["PORTDIR"].rstrip("/")) - check_repos(portdir) - (oldcatpkg, newcatpkg) = check_args(args, portdir, options, cvscmd) - - if options.commit_queue: - check_commit_queue() - - ThisPackage = CVSAbstraction(portdir, oldcatpkg, newcatpkg, cvscmd, options) - - ThisPackage.perform_action() - ThisPackage.log_move() - ThisPackage.clean_up() - - if options.remove: - print "%s %s successfully removed from CVS." % (green(" *"), turquoise(oldcatpkg)) - else: - print "%s %s successfully moved to %s." % (green(" *"), turquoise(oldcatpkg), yellow(newcatpkg)) - |