From ea62dd57fa0ea41a164c02129cb0e70a3298bc9f Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Thu, 25 Jun 2009 09:10:04 -0400 Subject: [PATCH] Added `be depend'. This closes bug 7ec2c071-9630-42b0-b08a-9854616f9144. BE is now bug free ;). At least until the next commit :p. Writing depend.py turned up a few style points in tag.py which I also fixed. --- .../80780fa9-69f8-438c-8fbf-5a702b3badc1/body | 2 + .../values | 8 ++ .../values | 2 +- becommands/depend.py | 83 +++++++++++++++++++ becommands/tag.py | 34 ++++---- 5 files changed, 108 insertions(+), 21 deletions(-) create mode 100644 .be/bugs/7ec2c071-9630-42b0-b08a-9854616f9144/comments/80780fa9-69f8-438c-8fbf-5a702b3badc1/body create mode 100644 .be/bugs/7ec2c071-9630-42b0-b08a-9854616f9144/comments/80780fa9-69f8-438c-8fbf-5a702b3badc1/values create mode 100644 becommands/depend.py diff --git a/.be/bugs/7ec2c071-9630-42b0-b08a-9854616f9144/comments/80780fa9-69f8-438c-8fbf-5a702b3badc1/body b/.be/bugs/7ec2c071-9630-42b0-b08a-9854616f9144/comments/80780fa9-69f8-438c-8fbf-5a702b3badc1/body new file mode 100644 index 0000000..f1ce046 --- /dev/null +++ b/.be/bugs/7ec2c071-9630-42b0-b08a-9854616f9144/comments/80780fa9-69f8-438c-8fbf-5a702b3badc1/body @@ -0,0 +1,2 @@ +Arbitrary tagging now supported via `be tag'. +Dependencies supported via `be depend'. diff --git a/.be/bugs/7ec2c071-9630-42b0-b08a-9854616f9144/comments/80780fa9-69f8-438c-8fbf-5a702b3badc1/values b/.be/bugs/7ec2c071-9630-42b0-b08a-9854616f9144/comments/80780fa9-69f8-438c-8fbf-5a702b3badc1/values new file mode 100644 index 0000000..cd3e2bf --- /dev/null +++ b/.be/bugs/7ec2c071-9630-42b0-b08a-9854616f9144/comments/80780fa9-69f8-438c-8fbf-5a702b3badc1/values @@ -0,0 +1,8 @@ +Content-type: text/plain + + +Date: Thu, 25 Jun 2009 12:39:26 +0000 + + +From: W. Trevor King + diff --git a/.be/bugs/7ec2c071-9630-42b0-b08a-9854616f9144/values b/.be/bugs/7ec2c071-9630-42b0-b08a-9854616f9144/values index 07811f7..1059e1b 100644 --- a/.be/bugs/7ec2c071-9630-42b0-b08a-9854616f9144/values +++ b/.be/bugs/7ec2c071-9630-42b0-b08a-9854616f9144/values @@ -4,7 +4,7 @@ creator: abentley severity: minor -status: open +status: closed summary: Arbitrary tags 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 +# +# 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: +""" + +def help(): + return get_parser().help_str() + longhelp diff --git a/becommands/tag.py b/becommands/tag.py index 8697464..2394284 100644 --- a/becommands/tag.py +++ b/becommands/tag.py @@ -27,14 +27,14 @@ def execute(args, test=False): >>> print a.extra_strings [] >>> execute(["a", "GUI"], test=True) - Tagging bug a: + 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) - Tagging bug a: + Tags for a: GUI later >>> execute(["a"], test=True) @@ -45,7 +45,7 @@ def execute(args, test=False): GUI later >>> execute(["a", "Alphabetically first"], test=True) - Tagging bug a: + Tags for a: Alphabetically first GUI later @@ -58,16 +58,14 @@ def execute(args, test=False): [] >>> a.save() >>> execute(["a"], test=True) - Tags for a: >>> bd._clear_bugs() # resync our copy of bug >>> a = bd.bug_from_shortname("a") >>> print a.extra_strings [] >>> execute(["a", "Alphabetically first"], test=True) - Tagging bug a: + Tags for a: Alphabetically first >>> execute(["--remove", "a", "Alphabetically first"], test=True) - Tags for a: """ parser = get_parser() options, args = parser.parse_args(args) @@ -94,32 +92,25 @@ def execute(args, test=False): print '\n'.join(tags) return bug = bd.bug_from_shortname(args[0]) - - new_tag = None if len(args) == 2: given_tag = args[1] - tags = bug.extra_strings + estrs = bug.extra_strings tag_string = "TAG:%s" % given_tag if options.remove == True: - tags.remove(tag_string) + estrs.remove(tag_string) else: # add the tag - new_tag = given_tag - tags.append(tag_string) - bug.extra_strings = tags # reassign to notice change - - bug.save() + 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 new_tag == None: + if len(tags) > 0: print "Tags for %s:" % bug.uuid - else: - print "Tagging bug %s:" % bug.uuid - for tag in tags: - print tag + print '\n'.join(tags) def get_parser(): parser = cmdutil.CmdOptionParser("be tag BUG-ID [TAG]\nor: be tag --list") @@ -132,6 +123,9 @@ def get_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: """ def help(): -- 2.26.2