aboutsummaryrefslogtreecommitdiffstats
path: root/libbe/command/diff.py
diff options
context:
space:
mode:
Diffstat (limited to 'libbe/command/diff.py')
-rw-r--r--libbe/command/diff.py183
1 files changed, 97 insertions, 86 deletions
diff --git a/libbe/command/diff.py b/libbe/command/diff.py
index c5c34f9..de8cf67 100644
--- a/libbe/command/diff.py
+++ b/libbe/command/diff.py
@@ -16,107 +16,121 @@
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-"""Compare bug reports with older tree"""
-from libbe import cmdutil, bugdir, diff
-import os
-__desc__ = __doc__
+import libbe
+import libbe.bug
+import libbe.command
+import libbe.command.util
+import libbe.storage
-def execute(args, manipulate_encodings=True, restrict_file_access=False,
- dir="."):
- """
- >>> import os
- >>> bd = bugdir.SimpleBugDir()
- >>> bd.set_sync_with_disk(True)
- >>> original = bd.vcs.commit("Original status")
- >>> bug = bd.bug_from_uuid("a")
- >>> bug.status = "closed"
- >>> changed = bd.vcs.commit("Closed bug a")
- >>> os.chdir(bd.root)
+import libbe.diff
+
+class Diff (libbe.command.Command):
+ """Compare bug reports with older tree
+
+ >>> import sys
+ >>> import libbe.bugdir
+ >>> bd = libbe.bugdir.SimpleBugDir(memory=False)
+ >>> cmd = Subscribe()
+ >>> cmd._storage = bd.storage
+ >>> cmd._setup_io = lambda i_enc,o_enc : None
+ >>> cmd.stdout = sys.stdout
+
+ >>> original = bd.storage.commit('Original status')
+ >>> bug = bd.bug_from_uuid('a')
+ >>> bug.status = 'closed'
+ >>> changed = bd.vcs.commit('Closed bug a')
>>> if bd.vcs.versioned == True:
- ... execute([original], manipulate_encodings=False)
+ ... ret = cmd.run(args=[original])
... else:
- ... print "Modified bugs:\\n a:cm: Bug A\\n Changed bug settings:\\n status: open -> closed"
+ ... print 'Modified bugs:\\n a:cm: Bug A\\n Changed bug settings:\\n status: open -> closed'
Modified bugs:
a:cm: Bug A
Changed bug settings:
status: open -> closed
>>> if bd.vcs.versioned == True:
- ... execute(["--subscribe", "%(bugdir_id)s:mod", "--uuids", original],
- ... manipulate_encodings=False)
+ ... ret = cmd.run({'subscribe':'%(bugdir_id)s:mod', 'uuids':True}, [original])
... else:
- ... print "a"
+ ... print 'a'
a
>>> if bd.vcs.versioned == False:
- ... execute([original], manipulate_encodings=False)
+ ... ret = cmd.run(args=[original])
... else:
- ... raise cmdutil.UsageError('This directory is not revision-controlled.')
+ ... raise libbe.command.UserError('This repository not revision-controlled.')
Traceback (most recent call last):
...
- UsageError: This directory is not revision-controlled.
+ UserError: This repository is not revision-controlled.
>>> bd.cleanup()
- """ % {'bugdir_id':diff.BUGDIR_ID}
- parser = get_parser()
- options, args = parser.parse_args(args)
- cmdutil.default_complete(options, args, parser)
- if len(args) == 0:
- revision = None
- if len(args) == 1:
- revision = args[0]
- if len(args) > 1:
- raise cmdutil.UsageError('Too many arguments.')
- try:
- subscriptions = diff.subscriptions_from_string(
- options.subscribe)
- except ValueError, e:
- raise cmdutil.UsageError(e.msg)
- bd = bugdir.BugDir(from_disk=True,
- manipulate_encodings=manipulate_encodings,
- root=dir)
- if bd.vcs.versioned == False:
- raise cmdutil.UsageError('This directory is not revision-controlled.')
- if options.dir == None:
- if revision == None: # get the most recent revision
- revision = bd.vcs.revision_id(-1)
- old_bd = bd.duplicate_bugdir(revision)
- else:
- old_bd_current = bugdir.BugDir(root=os.path.abspath(options.dir),
- from_disk=True,
- manipulate_encodings=False)
- if revision == None: # use the current working state
- old_bd = old_bd_current
- else:
- if old_bd_current.vcs.versioned == False:
- raise cmdutil.UsageError('%s is not revision-controlled.'
- % options.dir)
- old_bd = old_bd_current.duplicate_bugdir(revision)
- d = diff.Diff(old_bd, bd)
- tree = d.report_tree(subscriptions)
+ """ % {'bugdir_id':libbe.diff.BUGDIR_ID}
+ name = 'diff'
- if options.uuids == True:
- uuids = []
- bugs = tree.child_by_path('/bugs')
- for bug_type in bugs:
- uuids.extend([bug.name for bug in bug_type])
- print '\n'.join(uuids)
- else :
- rep = tree.report_string()
- if rep != None:
- print rep
- bd.remove_duplicate_bugdir()
- if options.dir != None and revision != None:
- old_bd_current.remove_duplicate_bugdir()
+ def __init__(self, *args, **kwargs):
+ libbe.command.Command.__init__(self, *args, **kwargs)
+ self.options.extend([
+ libbe.command.Option(name='repo', short_name='r',
+ help='Compare with repository in REPO instead'
+ ' of the current repository.',
+ arg=libbe.command.Argument(
+ name='repo', metavar='REPO',
+ completion_callback=libbe.command.util.complete_path)),
+ libbe.command.Option(name='subscribe', short_name='s',
+ help='Only print changes matching SUBSCRIPTION, '
+ 'subscription is a comma-separ\ated list of ID:TYPE '
+ 'tuples. See `be subscribe --help` for descriptions '
+ 'of ID and TYPE.',
+ arg=libbe.command.Argument(
+ name='subscribe', metavar='SUBSCRIPTION')),
+ libbe.command.Option(name='uuids', short_name='u',
+ help='Only print the changed bug UUIDS.'),
+ ])
+ self.args.extend([
+ libbe.command.Argument(
+ name='revision', metavar='REVISION', default=None,
+ optional=True)
+ ])
-def get_parser():
- parser = cmdutil.CmdOptionParser("be diff [options] REVISION")
- parser.add_option("-d", "--dir", dest="dir", metavar="DIR",
- help="Compare with repository in DIR instead of the current directory.")
- parser.add_option("-s", "--subscribe", dest="subscribe", metavar="SUBSCRIPTION",
- help="Only print changes matching SUBSCRIPTION, subscription is a comma-separ\ated list of ID:TYPE tuples. See `be subscribe --help` for descriptions of ID and TYPE.")
- parser.add_option("-u", "--uuids", action="store_true", dest="uuids",
- help="Only print the bug UUIDS.", default=False)
- return parser
+ def _run(self, **params):
+ try:
+ subscriptions = libbe.diff.subscriptions_from_string(
+ params['subscribe'])
+ except ValueError, e:
+ raise libbe.command.UserError(e.msg)
+ bugdir = self._get_bugdir()
+ if bugdir.storage.versioned == False:
+ raise libbe.command.UserError(
+ 'This repository is not revision-controlled.')
+ if params['repo'] == None:
+ if params['revision'] == None: # get the most recent revision
+ params['revision'] = bugdir.storage.revision_id(-1)
+ old_bd = bugdir.duplicate_bugdir(params['revision']) # TODO
+ else:
+ old_storage = libbe.storage.get_storage(params['repo'])
+ old_storage.connect()
+ old_bd_current = bugdir.BugDir(old_storage, from_disk=True)
+ if params['revision'] == None: # use the current working state
+ old_bd = old_bd_current
+ else:
+ if old_bd_current.storage.versioned == False:
+ raise libbe.command.UserError(
+ '%s is not revision-controlled.'
+ % storage.repo)
+ old_bd = old_bd_current.duplicate_bugdir(revision) # TODO
+ d = libbe.diff.Diff(old_bd, bugir)
+ tree = d.report_tree(subscriptions)
+
+ if params['uuids'] == True:
+ uuids = []
+ bugs = tree.child_by_path('/bugs')
+ for bug_type in bugs:
+ uuids.extend([bug.name for bug in bug_type])
+ print >> self.stdout, '\n'.join(uuids)
+ else :
+ rep = tree.report_string()
+ if rep != None:
+ print >> self.stdout, rep
+ return 0
-longhelp="""
+ def _long_help(self):
+ return """
Uses the VCS to compare the current tree with a previous tree, and
prints a pretty report. If REVISION is given, it is a specifier for
the particular previous tree to use. Specifiers are specific to their
@@ -128,6 +142,3 @@ Besides the standard summary output, you can use the options to output
UUIDS for the different categories. This output can be used as the
input to 'be show' to get an understanding of the current status.
"""
-
-def help():
- return get_parser().help_str() + longhelp