This patch adds a --output-style option to repoman, which gives the user
a choice of output formats for the repoman checks. Choices are "default"
(current style) and "column" (a greppable format), but it should be easy
to add more. Fixes bug 481584.

v2: Fix docstring to be complete and in the standard format, make use of
default choices in --output-style wrt comments by antarus and dol-sen
---
 bin/repoman              | 15 ++++++++++++++-
 pym/repoman/utilities.py | 44 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 58 insertions(+), 1 deletion(-)

diff --git a/bin/repoman b/bin/repoman
index 3504b6b..c7a1c4c 100755
--- a/bin/repoman
+++ b/bin/repoman
@@ -144,9 +144,16 @@ def ParseArgs(argv, qahelp):
                'scan' : 'Scan directory tree for QA issues'
        }
 
+       output_choices = {
+               'default' : 'The normal output format',
+               'column' : 'Columnar output suitable for use with grep'
+       }
+
        mode_keys = list(modes)
        mode_keys.sort()
 
+       output_keys = sorted(output_choices)
+
        parser = ArgumentParser(usage="repoman [options] [mode]",
                description="Modes: %s" % " | ".join(mode_keys),
                epilog="For more help consult the man page.")
@@ -228,6 +235,9 @@ def ParseArgs(argv, qahelp):
        parser.add_argument('--without-mask', dest='without_mask', 
action='store_true',
                default=False, help='behave as if no package.mask entries exist 
(not allowed with commit mode)')
 
+       parser.add_argument('--output-style', dest='output_style', 
choices=output_keys,
+               help='select output type', default='default')
+
        parser.add_argument('--mode', dest='mode', choices=mode_keys,
                help='specify which mode repoman will run in (default=full)')
 
@@ -2422,7 +2432,10 @@ console_writer.style_listener = style_file.new_styles
 
 f = formatter.AbstractFormatter(console_writer)
 
-utilities.format_qa_output(f, stats, fails, dofull, dofail, options, 
qawarnings)
+if options.output_style == 'column':
+       utilities.format_qa_output_column(f, stats, fails, dofull, dofail, 
options, qawarnings)
+else:
+       utilities.format_qa_output(f, stats, fails, dofull, dofail, options, 
qawarnings)
 
 style_file.flush()
 del console_writer, f, style_file
diff --git a/pym/repoman/utilities.py b/pym/repoman/utilities.py
index 3ec3a4a..aec61fe 100644
--- a/pym/repoman/utilities.py
+++ b/pym/repoman/utilities.py
@@ -330,6 +330,50 @@ def format_qa_output(formatter, stats, fails, dofull, 
dofail, options, qawarning
                                formatter.add_line_break()
 
 
+def format_qa_output_column(formatter, stats, fails, dofull, dofail, options, 
qawarnings):
+       """Helper function that formats output in a machine-parseable column 
format
+
+       @param formatter: an instance of Formatter
+       @type formatter: Formatter
+       @param path: dict of qa status items
+       @type path: dict
+       @param fails: dict of qa status failures
+       @type fails: dict
+       @param dofull: Whether to print full results or a summary
+       @type dofull: boolean
+       @param dofail: Whether failure was hard or soft
+       @type dofail: boolean
+       @param options: The command-line options provided to repoman
+       @type options: Namespace
+       @param qawarnings: the set of warning types
+       @type qawarnings: set
+       @return: None (modifies formatter)
+       """
+       full = options.mode == 'full'
+       for category, number in stats.items():
+               # we only want key value pairs where value > 0
+               if number < 1:
+                       continue
+
+               formatter.add_literal_data("NumberOf " + category + " ")
+               if category in qawarnings:
+                       formatter.push_style("WARN")
+               else:
+                       formatter.push_style("BAD")
+               formatter.add_literal_data("%s" % number)
+               formatter.pop_style()
+               formatter.add_line_break()
+               if not dofull:
+                       if not full and dofail and category in qawarnings:
+                               # warnings are considered noise when there are 
failures
+                               continue
+                       fails_list = fails[category]
+                       if not full and len(fails_list) > 12:
+                               fails_list = fails_list[:12]
+                       for failure in fails_list:
+                               formatter.add_literal_data(category + " " + 
failure)
+                               formatter.add_line_break()
+
 def editor_is_executable(editor):
        """
        Given an EDITOR string, validate that it refers to
-- 
1.8.5.3


Reply via email to