Added --tags to `be list`.
authorW. Trevor King <wking@drexel.edu>
Fri, 25 Jun 2010 18:31:34 +0000 (14:31 -0400)
committerW. Trevor King <wking@drexel.edu>
Fri, 25 Jun 2010 18:31:34 +0000 (14:31 -0400)
And broke out tagging functions in libbe.command.tag, so they are
accessible to other commands.

NEWS
libbe/command/list.py
libbe/command/tag.py

diff --git a/NEWS b/NEWS
index 2defeb0c421b811475746840722a406d4eb4d2cc..5dff61d5272922488050635d80805b7bc2415088 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,6 @@
+June 25, 2010
+ * Added --tags to `be list`.
+
 February 20, 2010
  * `be html` uses truncated IDs in comment and bug URLs and anchors.
 
index a522b4ac4ae6f55c28bce4e8890ad458496b6901..197604b6cf4d8f23adb6e1e38d196033fd907bc3 100644 (file)
@@ -25,6 +25,7 @@ import libbe
 import libbe.bug
 import libbe.command
 import libbe.command.depend
+import libbe.command.tag
 import libbe.command.target
 import libbe.command.util
 
@@ -127,6 +128,8 @@ class List (libbe.command.Command):
                     arg=libbe.command.Argument(
                         name='sort', metavar='SORT', default=None,
                         completion_callback=libbe.command.util.Completer(AVAILABLE_CMPS))),
+                libbe.command.Option(name='tags', short_name='t',
+                    help='Add TAGS: field to standard listing format.'),
                 libbe.command.Option(name='ids', short_name='i',
                     help='Only print the bug IDS'),
                 libbe.command.Option(name='xml', short_name='x',
@@ -173,7 +176,7 @@ class List (libbe.command.Command):
             for bug in bugs:
                 print >> self.stdout, bug.id.user()
         else:
-            self._list_bugs(bugs, xml=params['xml'])
+            self._list_bugs(bugs, show_tags=params['tags'], xml=params['xml'])
         bugdir.storage.writeable = writeable
         return 0
 
@@ -230,7 +233,7 @@ class List (libbe.command.Command):
         bugs.sort(cmp_fn)
         return bugs
 
-    def _list_bugs(self, bugs, xml=False):
+    def _list_bugs(self, bugs, show_tags=False, xml=False):
         if xml == True:
             print >> self.stdout, \
                 '<?xml version="1.0" encoding="%s" ?>' % self.stdout.encoding
@@ -240,18 +243,27 @@ class List (libbe.command.Command):
                 if xml == True:
                     print >> self.stdout, bug.xml(show_comments=True)
                 else:
-                    print >> self.stdout, bug.string(shortlist=True)
+                    bug_string = bug.string(shortlist=True)
+                    if show_tags == True:
+                        attrs,summary = bug_string.split(' ', 1)
+                        bug_string = (
+                            '%s%s: %s'
+                            % (attrs,
+                               ','.join(libbe.command.tag.get_tags(bug)),
+                               summary))
+                    print >> self.stdout, bug_string
         if xml == True:
             print >> self.stdout, '</be-xml>'
 
     def _long_help(self):
         return """
 This command lists bugs.  Normally it prints a short string like
-  bea/576:om: Allow attachments
+  bea/576:om:[TAGS:] Allow attachments
 Where
   bea/576   the bug id
   o         the bug status is 'open' (first letter)
   m         the bug severity is 'minor' (first letter)
+  TAGS      comma-separated list of bug tags (if --tags is set)
   Allo...   the bug summary string
 
 You can optionally (-u) print only the bug ids.
index da7c03e7b86a484b19f55d14f8c11dfb3fa16446..156bc6f78ab3d98a727759a7bb6089a661b15c52 100644 (file)
@@ -108,14 +108,7 @@ class Tag (libbe.command.Command):
                 'Do not specify a bug id with the --list option.')
         bugdir = self._get_bugdir()
         if params['list'] == True:
-            bugdir.load_all_bugs()
-            tags = []
-            for bug in bugdir:
-                for estr in bug.extra_strings:
-                    if estr.startswith(TAG_TAG):
-                        tag = estr[len(TAG_TAG):]
-                        if tag not in tags:
-                            tags.append(tag)
+            tags = get_all_tags(bugdir)
             tags.sort()
             if len(tags) > 0:
                 print >> self.stdout, '\n'.join(tags)
@@ -124,14 +117,13 @@ class Tag (libbe.command.Command):
         bug,dummy_comment = libbe.command.util.bug_comment_from_user_id(
             bugdir, params['id'])
         if len(params['tag']) > 0:
-            estrs = bug.extra_strings
+            tags = get_tags(bug)
             for tag in params['tag']:
-                tag_string = '%s%s' % (TAG_TAG, tag)
                 if params['remove'] == True:
-                    estrs.remove(tag_string)
+                    tags.remove(tag)
                 else: # add the tag
-                    estrs.append(tag_string)
-            bug.extra_strings = estrs # reassign to notice change
+                    tags.append(tag)
+            set_tags(bug, tags)
 
         tags = []
         for estr in bug.extra_strings:
@@ -151,3 +143,43 @@ print the tags for BUG-ID.
 To search for bugs with a particular tag, try
   $ be list --extra-strings %s<your-tag>
 """ % TAG_TAG
+
+# functions exposed to other modules
+
+def get_all_tags(bugdir):
+    bugdir.load_all_bugs()
+    tags = []
+    for bug in bugdir:
+        for tag in get_tags(bug):
+            if tag not in tags:
+                tags.append(tag)
+    return tags
+
+def get_tags(bug):
+    tags = []
+    for estr in bug.extra_strings:
+        if estr.startswith(TAG_TAG):
+            tag = estr[len(TAG_TAG):]
+            if tag not in tags:
+                tags.append(tag)
+    return tags
+
+def set_tags(bug, tags):
+    estrs = bug.extra_strings
+    new_estrs = []
+    for estr in estrs:
+        if not estr.startswith(TAG_TAG):
+            new_estrs.append(estr)
+    for tag in tags:
+        new_estrs.append('%s%s' % (TAG_TAG, tag))
+    bug.extra_strings = new_estrs # reassign to notice change
+
+def append_tag(bug, tag):
+    estrs = bug.extra_strings
+    estrs.append('%s%s' % (TAG_TAG, tag))
+    bug.extra_strings = estrs # reassign to notice change
+
+def remove_tag(bug, tag):
+    estrs = bug.extra_strings
+    estrs.remove('%s%s' % (TAG_TAG, tag))
+    bug.extra_strings = estrs # reassign to notice change