Added `be depend'.
authorW. Trevor King <wking@drexel.edu>
Thu, 25 Jun 2009 13:10:04 +0000 (09:10 -0400)
committerW. Trevor King <wking@drexel.edu>
Thu, 25 Jun 2009 13:10:04 +0000 (09:10 -0400)
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.

.be/bugs/7ec2c071-9630-42b0-b08a-9854616f9144/comments/80780fa9-69f8-438c-8fbf-5a702b3badc1/body [new file with mode: 0644]
.be/bugs/7ec2c071-9630-42b0-b08a-9854616f9144/comments/80780fa9-69f8-438c-8fbf-5a702b3badc1/values [new file with mode: 0644]
.be/bugs/7ec2c071-9630-42b0-b08a-9854616f9144/values
becommands/depend.py [new file with mode: 0644]
becommands/tag.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 (file)
index 0000000..f1ce046
--- /dev/null
@@ -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 (file)
index 0000000..cd3e2bf
--- /dev/null
@@ -0,0 +1,8 @@
+Content-type: text/plain
+
+
+Date: Thu, 25 Jun 2009 12:39:26 +0000
+
+
+From: W. Trevor King <wking@drexel.edu>
+
index 07811f7efc940bf097ab635722a4b60ce96feee2..1059e1b144960c04002dcf80d85b19f31ff06b2b 100644 (file)
@@ -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 (file)
index 0000000..8dbb2eb
--- /dev/null
@@ -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
index 869746456cf8c5d5e6c9221380d5db7211685e1f..23942840fa9d0339cda3be3507813837d317a806 100644 (file)
@@ -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:<your-tag>
 """
 
 def help():