diff options
Diffstat (limited to 'becommands')
-rw-r--r-- | becommands/depend.py | 83 | ||||
-rw-r--r-- | becommands/list.py | 16 | ||||
-rw-r--r-- | becommands/tag.py | 132 |
3 files changed, 227 insertions, 4 deletions
diff --git a/becommands/depend.py b/becommands/depend.py new file mode 100644 index 0000000..8dbb2eb --- /dev/null +++ b/becommands/depend.py @@ -0,0 +1,83 @@ +# Copyright (C) 2009 W. Trevor King <wking@drexel.edu> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +"""Add/remove bug dependencies.""" +from libbe import cmdutil, bugdir +import os, copy +__desc__ = __doc__ + +def execute(args, test=False): + """ + >>> from libbe import utility + >>> bd = bugdir.simple_bug_dir() + >>> bd.save() + >>> os.chdir(bd.root) + >>> execute(["a", "b"], test=True) + Blocks on a: + b + >>> execute(["a"], test=True) + Blocks on a: + b + >>> execute(["-r", "a", "b"], test=True) + """ + parser = get_parser() + options, args = parser.parse_args(args) + cmdutil.default_complete(options, args, parser, + bugid_args={0: lambda bug : bug.active==True, + 1: lambda bug : bug.active==True}) + + if len(args) < 1: + raise cmdutil.UsageError("Please a bug id.") + if len(args) > 2: + help() + raise cmdutil.UsageError("Too many arguments.") + + bd = bugdir.BugDir(from_disk=True, manipulate_encodings=not test) + bugA = bd.bug_from_shortname(args[0]) + if len(args) == 2: + bugB = bd.bug_from_shortname(args[1]) + estrs = bugA.extra_strings + depend_string = "BLOCKED-BY:%s" % bugB.uuid + if options.remove == True: + estrs.remove(depend_string) + else: # add the dependency + estrs.append(depend_string) + bugA.extra_strings = estrs # reassign to notice change + bugA.save() + + depends = [] + for estr in bugA.extra_strings: + if estr.startswith("BLOCKED-BY:"): + depends.append(estr[11:]) + if len(depends) > 0: + print "Blocks on %s:" % bugA.uuid + print '\n'.join(depends) + +def get_parser(): + parser = cmdutil.CmdOptionParser("be depend BUG-ID [BUG-ID]") + parser.add_option("-r", "--remove", action="store_true", dest="remove", + help="Remove dependency (instead of adding it)") + return parser + +longhelp=""" +Set a dependency with the second bug (B) blocking the first bug (A). +If bug B is not specified, just print a list of bugs blocking (A). + +To search for bugs blocked by a particular bug, try + $ be list --extra-strings BLOCKED-BY:<your-bug-uuid> +""" + +def help(): + return get_parser().help_str() + longhelp diff --git a/becommands/list.py b/becommands/list.py index 1f06569..fa2f592 100644 --- a/becommands/list.py +++ b/becommands/list.py @@ -109,6 +109,8 @@ def execute(args, test=False): target.append(bd.target) if target == []: # set the default value target = "all" + if options.extra_strings != None: + required_extra_strings = options.extra_strings.split(',') def filter(bug): if status != "all" and not bug.status in status: @@ -119,6 +121,10 @@ def execute(args, test=False): return False if target != "all" and not bug.target in target: return False + if options.extra_strings != None: + for string in bug.extra_strings: + if string not in required_extra_strings: + return False return True bugs = [b for b in bd if filter(b) ] @@ -152,13 +158,15 @@ def execute(args, test=False): def get_parser(): parser = cmdutil.CmdOptionParser("be list [options]") parser.add_option("-s", "--status", metavar="STATUS", dest="status", - help="List options matching STATUS", default=None) + help="List bugs matching STATUS", default=None) parser.add_option("-v", "--severity", metavar="SEVERITY", dest="severity", - help="List options matching SEVERITY", default=None) + help="List bugs matching SEVERITY", default=None) parser.add_option("-a", "--assigned", metavar="ASSIGNED", dest="assigned", - help="List options matching ASSIGNED", default=None) + help="List bugs matching ASSIGNED", default=None) parser.add_option("-t", "--target", metavar="TARGET", dest="target", - help="List options matching TARGET", default=None) + help="List bugs matching TARGET", default=None) + parser.add_option("-e", "--extra-strings", metavar="STRINGS", dest="extra_strings", + help="List bugs matching _all_ extra strings in comma-seperated list STRINGS. e.g. --extra-strings TAG:working,TAG:xml", default=None) parser.add_option("-S", "--sort", metavar="SORT-BY", dest="sort_by", help="Adjust bug-sort criteria with comma-separated list SORT-BY. e.g. \"--sort creator,time\". Available criteria: %s" % ','.join(AVAILABLE_CMPS), default=None) # boolean options. All but uuids and xml are special cases of long forms diff --git a/becommands/tag.py b/becommands/tag.py new file mode 100644 index 0000000..2394284 --- /dev/null +++ b/becommands/tag.py @@ -0,0 +1,132 @@ +# Copyright (C) 2009 W. Trevor King <wking@drexel.edu> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +"""Tag a bug, or search bugs for tags.""" +from libbe import cmdutil, bugdir +import os, copy +__desc__ = __doc__ + +def execute(args, test=False): + """ + >>> from libbe import utility + >>> bd = bugdir.simple_bug_dir() + >>> os.chdir(bd.root) + >>> a = bd.bug_from_shortname("a") + >>> print a.extra_strings + [] + >>> execute(["a", "GUI"], test=True) + Tags for a: + GUI + >>> bd._clear_bugs() # resync our copy of bug + >>> a = bd.bug_from_shortname("a") + >>> print a.extra_strings + ['TAG:GUI'] + >>> execute(["a", "later"], test=True) + Tags for a: + GUI + later + >>> execute(["a"], test=True) + Tags for a: + GUI + later + >>> execute(["--list"], test=True) + GUI + later + >>> execute(["a", "Alphabetically first"], test=True) + Tags for a: + Alphabetically first + GUI + later + >>> bd._clear_bugs() # resync our copy of bug + >>> a = bd.bug_from_shortname("a") + >>> print a.extra_strings + ['TAG:Alphabetically first', 'TAG:GUI', 'TAG:later'] + >>> a.extra_strings = [] + >>> print a.extra_strings + [] + >>> a.save() + >>> execute(["a"], test=True) + >>> bd._clear_bugs() # resync our copy of bug + >>> a = bd.bug_from_shortname("a") + >>> print a.extra_strings + [] + >>> execute(["a", "Alphabetically first"], test=True) + Tags for a: + Alphabetically first + >>> execute(["--remove", "a", "Alphabetically first"], test=True) + """ + parser = get_parser() + options, args = parser.parse_args(args) + cmdutil.default_complete(options, args, parser, + bugid_args={0: lambda bug : bug.active==True}) + + if len(args) == 0 and options.list == False: + raise cmdutil.UsageError("Please specify a bug id.") + elif len(args) > 2 or (len(args) > 0 and options.list == True): + help() + raise cmdutil.UsageError("Too many arguments.") + + bd = bugdir.BugDir(from_disk=True, manipulate_encodings=not test) + if options.list: + bd.load_all_bugs() + tags = [] + for bug in bd: + for estr in bug.extra_strings: + if estr.startswith("TAG:"): + tag = estr[4:] + if tag not in tags: + tags.append(tag) + tags.sort() + print '\n'.join(tags) + return + bug = bd.bug_from_shortname(args[0]) + if len(args) == 2: + given_tag = args[1] + estrs = bug.extra_strings + tag_string = "TAG:%s" % given_tag + if options.remove == True: + estrs.remove(tag_string) + else: # add the tag + estrs.append(tag_string) + bug.extra_strings = estrs # reassign to notice change + bug.save() + + tags = [] + for estr in bug.extra_strings: + if estr.startswith("TAG:"): + tags.append(estr[4:]) + + if len(tags) > 0: + print "Tags for %s:" % bug.uuid + print '\n'.join(tags) + +def get_parser(): + parser = cmdutil.CmdOptionParser("be tag BUG-ID [TAG]\nor: be tag --list") + parser.add_option("-r", "--remove", action="store_true", dest="remove", + help="Remove TAG (instead of adding it)") + parser.add_option("-l", "--list", action="store_true", dest="list", + help="List all available tags and exit") + return parser + +longhelp=""" +If TAG is given, add TAG to BUG-ID. If it is not specified, just +print the tags for BUG-ID. + +To search for bugs with a particular tag, try + $ be list --extra-strings TAG:<your-tag> +""" + +def help(): + return get_parser().help_str() + longhelp |