Pull more functions out of repoman proper and into repoman.utilities, correct a typo...
authorAlec Warner <antarus@gentoo.org>
Sun, 27 Jan 2008 11:26:48 +0000 (11:26 -0000)
committerAlec Warner <antarus@gentoo.org>
Sun, 27 Jan 2008 11:26:48 +0000 (11:26 -0000)
svn path=/main/trunk/; revision=9227

bin/repoman

index 36fcfa30031d57a9edc9c610f98ea17fdde879de..9631ccb28acf8f6c2d79f23675ebb10d5e0648fc 100755 (executable)
@@ -14,7 +14,6 @@ import logging
 import optparse
 import os
 import re
-import shutil
 import signal
 import stat
 import sys
@@ -22,8 +21,6 @@ import tempfile
 import time
 
 from commands import getstatusoutput
-from fileinput import input
-from grp import getgrnam
 from itertools import izip
 from stat import S_ISDIR, ST_CTIME
 
@@ -64,15 +61,15 @@ import portage.dep
 portage.dep._dep_check_strict = True
 import portage.exception
 from portage import cvstree, normalize_path
+from portage import util
 from portage.exception import ParseError
 from portage.manifest import Manifest
 from portage.process import find_binary, spawn
-from portage.util import initialize_logger
 from portage.output import bold, create_color_func, darkgreen, \
        green, nocolor, red, turquoise, yellow
 from portage.output import ConsoleStyleFile, StyleWriter
 
-initialize_logger()
+util.initialize_logger()
 
 # 14 is the length of DESCRIPTION=""
 max_desc_len = 100
@@ -149,7 +146,7 @@ def ParseArgs(args, qahelp):
                'fix' : 'Fix simple QA issues (stray digests, missing digests)',
                'full' : 'Scan directory tree and print all issues (not a summary)',
                'help' : 'Show this screen',
-               'last' : 'Remember report from last ru',
+               'last' : 'Remember report from last run',
                'lfull' : 'Remember report from last run (full listing)',
                'manifest' : 'Generate a Manifest (fetches files if necessary)',
                'scan' : 'Scan directory tree for QA issues' 
@@ -354,111 +351,12 @@ for x in missingvars:
                qawarnings.append(x)
 
 valid_restrict = frozenset(["binchecks", "bindist",
-       "fetch", "installsources", "mirror", 
+       "fetch", "installsources", "mirror",
        "primaryuri", "strip", "test", "userpriv"])
 
 # file.executable
 no_exec = frozenset(["Manifest","ChangeLog","metadata.xml"])
 
-def editor_is_executable(editor):
-       """
-       Given an EDITOR string, validate that it refers to
-       an executable. This uses shlex.split() to split the
-       first component and do a PATH lookup if necessary.
-
-       @param editor: An EDITOR value from the environment.
-       @type: string
-       @rtype: bool
-       @returns: True if an executable is found, False otherwise.
-       """
-       import shlex
-       editor_split = shlex.split(editor)
-       if not editor_split:
-               return False
-       filename = editor_split[0]
-       if not os.path.isabs(filename):
-               return find_binary(filename) is not None
-       return os.access(filename, os.X_OK) and os.path.isfile(filename)
-
-def get_commit_message_with_editor(editor, message=None):
-       """
-       Execute editor with a temporary file as it's argument
-       and return the file content afterwards.
-
-       @param editor: An EDITOR value from the environment
-       @type: string
-       @param message: An iterable of lines to show in the editor.
-       @type: iterable
-       @rtype: string or None
-       @returns: A string on success or None if an error occurs.
-       """
-       from tempfile import mkstemp
-       fd, filename = mkstemp()
-       try:
-               os.write(fd, "\n# Please enter the commit message " + \
-                       "for your changes.\n# (Comment lines starting " + \
-                       "with '#' will not be included)\n")
-               if message:
-                       os.write(fd, "#\n")
-                       for line in message:
-                               os.write(fd, "#" + line)
-               os.close(fd)
-               retval = os.system(editor + " '%s'" % filename)
-               if not (os.WIFEXITED(retval) and os.WEXITSTATUS(retval) == os.EX_OK):
-                       return None
-               try:
-                       mylines = open(filename).readlines()
-               except OSError, e:
-                       if e.errno != errno.ENOENT:
-                               raise
-                       del e
-                       return None
-               return "".join(line for line in mylines if not line.startswith("#"))
-       finally:
-               try:
-                       os.unlink(filename)
-               except OSError:
-                       pass
-
-def get_commit_message_with_stdin():
-       """
-       Read a commit message from the user and return it.
-
-       @rtype: string or None
-       @returns: A string on success or None if an error occurs.
-       """
-       print "Please enter a commit message. Use Ctrl-d to finish or Ctrl-c to abort."
-       commitmessage = []
-       while True:
-               commitmessage.append(sys.stdin.readline())
-               if not commitmessage[-1]:
-                       break
-       commitmessage = "".join(commitmessage)
-       return commitmessage
-
-def format_qa_output(f, stats, fails, dofull, dofail):
-       full = options.mode in ("full", "lfull")
-       for x in qacats:
-               if not stats[x]:
-                       continue
-               f.add_literal_data("  " + x.ljust(30))
-               if x in qawarnings:
-                       f.push_style("WARN")
-               else:
-                       f.push_style("BAD")
-               f.add_literal_data(str(stats[x]))
-               f.pop_style()
-               f.add_line_break()
-               if not dofull:
-                       if not full and dofail and x in qawarnings:
-                               # warnings are considered noise when there are failures
-                               continue
-                       fails_list = fails[x]
-                       if not full and len(fails_list) > 12:
-                               fails_list = fails_list[:12]
-                       for y in fails_list:
-                               f.add_literal_data("   "+y)
-                               f.add_line_break()
 
 def last(full=False):
        """Print the results of the last repoman run
@@ -498,7 +396,7 @@ def last(full=False):
        console_writer = StyleWriter(file=style_file, maxcol=9999)
        console_writer.style_listener = style_file.new_styles
        f = formatter.AbstractFormatter(console_writer)
-       format_qa_output(f, stats, fails, dofull, dofail)
+       utilities.format_qa_output(f, stats, fails, dofull, dofail, options, qawarnings)
        print
        if dofull:
                print bold("Note: type \"repoman lfull\" for a complete listing of repomans last run.")
@@ -755,41 +653,8 @@ else:
        #this can be problematic if xmllint changes their output
        xmllint_capable=True
 
-if options.mode == 'commit':
-       retval = ("","")
-       if isCvs:
-               print
-               print "Performing a " + green("cvs -n up") + \
-                       " with a little magic grep to check for updates."
-               retval = getstatusoutput("/usr/bin/cvs -n up 2>&1 | " + \
-                       "egrep '^[^\?] .*' | " + \
-                       "egrep -v '^. .*/digest-[^/]+|^cvs server: .* -- ignored$'")
-
-       mylines = retval[1].splitlines()
-       myupdates = []
-       for x in mylines:
-               if not x:
-                       continue
-               if x[0] not in "UPMAR": # Updates,Patches,Modified,Added,Removed
-                       print red("!!! Please fix the following issues reported " + \
-                               "from cvs: ")+green("(U,P,M,A,R are ok)")
-                       print red("!!! Note: This is a pretend/no-modify pass...")
-                       print retval[1]
-                       print
-                       sys.exit(1)
-               elif x[0] in "UP":
-                       myupdates.append(x[2:])
-
-       if myupdates:
-               print green("Fetching trivial updates...")
-               if options.pretend:
-                       print "(/usr/bin/cvs up "+" ".join(myupdates)+")"
-                       retval = os.EX_OK
-               else:
-                       retval = os.system("/usr/bin/cvs up " + " ".join(myupdates))
-               if retval != os.EX_OK:
-                       print "!!! cvs exited with an error. Terminating."
-                       sys.exit(retval)
+if options.mode == 'commit' and isCvs:
+       utilties.detect_vcs_conflicts(options, vcs="cvs")
 
 if options.mode == "manifest":
        pass
@@ -1568,7 +1433,7 @@ console_writer.style_listener = style_file.new_styles
 
 f = formatter.AbstractFormatter(console_writer)
 
-format_qa_output(f, stats, fails, dofull, dofail)
+utilities.format_qa_output(f, stats, fails, dofull, dofail, options, qawarnings)
 
 style_file.flush()
 del console_writer, f, style_file
@@ -1731,11 +1596,11 @@ else:
        if not commitmessage or not commitmessage.strip():
                try:
                        editor = os.environ.get("EDITOR")
-                       if editor and editor_is_executable(editor):
-                               commitmessage = get_commit_message_with_editor(
+                       if editor and utilities.editor_is_executable(editor):
+                               commitmessage = utilties.get_commit_message_with_editor(
                                        editor, message=qa_output)
                        else:
-                               commitmessage = get_commit_message_with_stdin()
+                               commitmessage = utilties.get_commit_message_with_stdin()
                except KeyboardInterrupt:
                        exithandler()
                if not commitmessage or not commitmessage.strip():