Added 'remove' command to remove bugs. Use __desc__ for command help.
authorW. Trevor King <wking@drexel.edu>
Sun, 16 Nov 2008 19:12:06 +0000 (14:12 -0500)
committerW. Trevor King <wking@drexel.edu>
Sun, 16 Nov 2008 19:12:06 +0000 (14:12 -0500)
Using the __desc__ reduces documentation duplication.  It's also better
than using __doc__, because __doc__ could (should?) be more than one-line
long, and we just want a short description to jog our memories in the
complete command list.

Also moved unique_name from cmdutil.py to names.py to avoid the
  bug->cmdutil->bugdir->bug
cyclic include.

21 files changed:
.be/bugs/cf56e648-3b09-4131-8847-02dff12b4db2/comments/f05359f6-1bfc-4aa6-9a6d-673516bc0f94/body [new file with mode: 0644]
.be/bugs/cf56e648-3b09-4131-8847-02dff12b4db2/comments/f05359f6-1bfc-4aa6-9a6d-673516bc0f94/values [new file with mode: 0644]
be
becommands/__init__.py
becommands/close.py
becommands/comment.py
becommands/diff.py
becommands/help.py
becommands/list.py
becommands/new.py
becommands/open.py
becommands/set.py
becommands/set_root.py
becommands/severity.py
becommands/show.py
becommands/template [deleted file]
becommands/upgrade.py
libbe/bug.py
libbe/cmdutil.py
libbe/names.py
libbe/plugin.py

diff --git a/.be/bugs/cf56e648-3b09-4131-8847-02dff12b4db2/comments/f05359f6-1bfc-4aa6-9a6d-673516bc0f94/body b/.be/bugs/cf56e648-3b09-4131-8847-02dff12b4db2/comments/f05359f6-1bfc-4aa6-9a6d-673516bc0f94/body
new file mode 100644 (file)
index 0000000..d7a57d9
--- /dev/null
@@ -0,0 +1 @@
+I dunno, bugs everywhere is such a great mental image... ;)
diff --git a/.be/bugs/cf56e648-3b09-4131-8847-02dff12b4db2/comments/f05359f6-1bfc-4aa6-9a6d-673516bc0f94/values b/.be/bugs/cf56e648-3b09-4131-8847-02dff12b4db2/comments/f05359f6-1bfc-4aa6-9a6d-673516bc0f94/values
new file mode 100644 (file)
index 0000000..cb5a094
--- /dev/null
@@ -0,0 +1,21 @@
+
+
+
+Content-type=text/plain
+
+
+
+
+
+
+Date=Sat, 15 Nov 2008 23:56:51 +0000
+
+
+
+
+
+
+From=wking
+
+
+
diff --git a/be b/be
index 9be1804716be24a9586919fbb368df1d5fb0405f..ea7f65a30495e42d4f14e4f7b3f25eaa90c11e88 100755 (executable)
--- a/be
+++ b/be
@@ -22,39 +22,16 @@ from libbe.bugdir import tree_root, create_bug_dir
 from libbe import names, plugin, cmdutil
 import sys
 import os
-import becommands.severity
-import becommands.status
-import becommands.list
-import becommands.show
-import becommands.set_root
-import becommands.new
-import becommands.close
-import becommands.open
-__doc__ = """Bugs Everywhere - Distributed bug tracking
-
-Supported becommands
- set-root: assign the root directory for bug tracking
-      new: Create a new bug
-     list: list bugs
-     show: show a particular bug
-    close: close a bug
-     open: re-open a bug
- severity: %s
-   status: %s
-
-Unimplemented becommands
-  comment: append a comment to a bug
-""" % (becommands.severity.__desc__,
-       becommands.status.__desc__)
-
+import becommands
 
+__doc__ == cmdutil.help()
 
 if len(sys.argv) == 1 or sys.argv[1] in ('--help', '-h'):
-    cmdutil.print_command_list()
+    print cmdutil.help()
 else:
     try:
         try:
-            sys.exit(execute(sys.argv[1], sys.argv[2:]))
+            sys.exit(cmdutil.execute(sys.argv[1], sys.argv[2:]))
         except KeyError, e:
             raise UserError("Unknown command \"%s\"" % e.args[0])
         except cmdutil.GetHelp:
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6b0737845c493b601d7edec4ced24f53b3f61fca 100644 (file)
@@ -0,0 +1,15 @@
+"Command plugins for the BugsEverywhere be script."
+
+__all__ = ["set_root", "set", "new", "remove", "list", "show", "close", "open",
+           "assign", "severity", "status", "target", "comment", "diff",
+           "upgrade", "help"]
+
+def import_all():
+    for i in __all__:
+        name = __name__ + "." + i
+        try:
+            __import__(name, globals(), locals(), [])
+        except ImportError:
+            print "Import of %s failed!" % (name,)
+
+import_all()
index 52ab735fb69df11447f585726dc6b80ffb8fa296..8e62b90292e01e22a6259d7fb6eb8a4a459a520f 100644 (file)
@@ -16,6 +16,8 @@
 #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 """Close a bug"""
 from libbe import cmdutil
+__desc__ = __doc__
+
 def execute(args):
     """
     >>> from libbe import tests
index 50fdc23d4d1cebbb6166aefa752d65a4e3aac898..5939490f645c252b77caf99cb4dcd28970568fc9 100644 (file)
@@ -18,6 +18,8 @@
 from libbe import cmdutil, names, utility
 from libbe.bug import new_comment
 import os
+__desc__ = __doc__
+
 def execute(args):
     """
     >>> from libbe import tests, names
index 82ebb2c64491e646835e0c2f3d77f681f87d040b..5a3a7cfa5a17514829c91561f818ff0ba6823b9f 100644 (file)
@@ -18,6 +18,8 @@
 """Compare bug reports with older tree"""
 from libbe import bugdir, diff, cmdutil
 import os
+__desc__ = __doc__
+
 def execute(args):
     options, args = get_parser().parse_args(args)
     if len(args) == 0:
index 45d35ca17fccfabb009f0674d9e2a98249f64f97..f6cfe3f50b3f5fcff11b1a40d0d1f81f3dbc89f0 100644 (file)
@@ -16,6 +16,7 @@
 #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 """Print help for given subcommand"""
 from libbe import cmdutil, names, utility
+__desc__ = __doc__
 
 def execute(args):
     """
@@ -25,7 +26,7 @@ def execute(args):
     if len(args) > 1:
         raise cmdutil.UserError("Too many arguments.")
     if len(args) == 0:
-        cmdutil.print_command_list()
+        print cmdutil.help()
     else:
         try:
             print cmdutil.help(args[0])
index 4514039eeb453de627e11d857bfd72cf0fa4c343..59eb8adf957fe10ac4ee04819deff5c133c67139 100644 (file)
@@ -19,6 +19,8 @@ from libbe import cmdutil, names
 from libbe.bug import cmp_full, severity_values, status_values, \
     active_status_values, inactive_status_values
 import os
+__desc__ = __doc__
+
 def execute(args):
     options, args = get_parser().parse_args(args)
     if len(args) > 0:
index b22dd0a1f76fcbc2f58a5177258621401f941414..40ab3f516ccb1ed2a44b15e9e81775ad5fb3c1c9 100644 (file)
@@ -17,6 +17,7 @@
 """Create a new bug"""
 from libbe import cmdutil, names, utility
 from libbe.bug import new_bug
+__desc__ = __doc__
 
 def execute(args):
     """
@@ -47,7 +48,7 @@ def execute(args):
     bug.summary = args[0]
     bug.save()
     bugs = (dir.list())
-    print "Created bug with ID %s" % cmdutil.unique_name(bug, bugs)
+    print "Created bug with ID %s" % names.unique_name(bug, bugs)
 
 def get_parser():
     parser = cmdutil.CmdOptionParser("be new SUMMARY")
index f7c23c19b692090738bb8368cbb696fdf9d28ff1..654a1f571de769a1c5465d9dd30f1948baddbb98 100644 (file)
@@ -16,6 +16,8 @@
 #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 """Re-open a bug"""
 from libbe import cmdutil
+__desc__ = __doc__
+
 def execute(args):
     """
     >>> from libbe import tests
index e359df1bb055a1af0f64be86fcdad62b687fd674..8a76133896037ea6001f167da79b6f23ee3e0fd4 100644 (file)
@@ -16,6 +16,8 @@
 #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 """Change tree settings"""
 from libbe import cmdutil 
+__desc__ = __doc__
+
 def execute(args):
     """
     >>> from libbe import tests
index 2ae7e1a6af567684af29a7f927729ea46edf4906..cc21c315d1fa74239231f58e1682837a08726d09 100644 (file)
@@ -16,6 +16,7 @@
 #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 """Assign the root directory for bug tracking"""
 from libbe import bugdir, cmdutil, rcs
+__desc__ = __doc__
 
 def execute(args):
     """
index 1a68c317a734369a45d985a3a1bae763a8a45485..6845875ebf55b4eff3ad72e9edb73b8993c83eb6 100644 (file)
@@ -17,7 +17,6 @@
 """Show or change a bug's severity level"""
 from libbe import cmdutil 
 from libbe.bug import severity_values, severity_description
-
 __desc__ = __doc__
 
 def execute(args):
index 678a607c5d2ac76c858431eedd70eb77c02fb6c7..669a81d404653388aa571554196d861a1b7e3427 100644 (file)
 #    along with this program; if not, write to the Free Software
 #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 """Show a particular bug"""
-from libbe import cmdutil, utility
+from libbe import cmdutil, names, utility
 from libbe.bug import thread_comments
 import os
+__desc__ = __doc__
 
 def execute(args):
     options, args = get_parser().parse_args(args)
@@ -26,7 +27,7 @@ def execute(args):
     bug_dir = cmdutil.bug_tree()
     bug = cmdutil.get_bug(args[0], bug_dir)
     print bug.string().rstrip("\n")
-    unique_name = cmdutil.unique_name(bug, bug_dir.list())
+    unique_name = names.unique_name(bug, bug_dir.list())
     comments = []
     name_map = {}
     for c_name, comment in cmdutil.iter_comment_name(bug, unique_name):
diff --git a/becommands/template b/becommands/template
deleted file mode 100644 (file)
index 3c871e6..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-"""Short description"""
-from libbe import bugdir, cmdutil, names
-import os
-def execute(args):
-    options, args = get_parser().parse_args(args)
-    if len(args) > 0:
-        raise cmdutil.UsageError
-
-
-def get_parser():
-    parser = cmdutil.CmdOptionParser("be list [options]")
-#    parser.add_option("-w", "--wishlist", action="store_true", dest="wishlist",
-#                      help="List bugs with 'wishlist' severity")
-    return parser
-
-longhelp="""
-This is for the longwinded description
-"""
-
-def help():
-    return get_parser().help_str() + longhelp
index f5b12ef0775f41cd19a7cffbca38ff9d99258ebf..7ed3630e1f079e1f1d3af81d64eefe7a29f26392 100644 (file)
@@ -18,6 +18,7 @@
 import os.path
 import errno
 from libbe import bugdir, rcs, cmdutil
+__desc__ = __doc__
 
 def execute(args):
     options, args = get_parser().parse_args(args)
index 430a3333efe316c659f5c46370924241dcbc8e4d..a0054caac95ed4b1dec20ab89e5a7794e97ec688 100644 (file)
@@ -16,9 +16,9 @@
 #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 import os
 import os.path
+import shutil
 import errno
 import names
-import cmdutil
 import mapfile
 import time
 import utility
@@ -116,7 +116,7 @@ class Bug(object):
     def string(self, bugs=None, shortlist=False):
         if bugs == None:
             bugs = list(self.bugdir.list())
-        short_name = cmdutil.unique_name(self, bugs)
+        short_name = names.unique_name(self, bugs)
         if shortlist == False:
             htime = utility.handy_time(self.time)
             ftime = utility.time_to_str(self.time)
@@ -136,7 +136,7 @@ class Bug(object):
                     newinfo.append((k,v))
             info = newinfo
             longest_key_len = max([len(k) for k,v in info])
-            infolines = ["  %*s : %s\n" % (longest_key_len,k,v) for k,v in info]
+            infolines = ["  %*s : %s\n" %(longest_key_len,k,v) for k,v in info]
             return "".join(infolines) + "%s\n" % self.summary
         else:
             statuschar = self.status[0]
@@ -145,8 +145,11 @@ class Bug(object):
             return "%s:%s: %s\n" % (short_name, chars, self.summary)
     def __str__(self):
         return self.string(shortlist=True)
-    def get_path(self, file):
-        return os.path.join(self.path, self.uuid, file)
+    def get_path(self, file=None):
+        if file == None:
+            return os.path.join(self.path, self.uuid)
+        else:
+            return os.path.join(self.path, self.uuid, file)
 
     def _get_active(self):
         return self.status in active_status_values
@@ -170,7 +173,11 @@ class Bug(object):
             map["time"] = utility.time_to_str(self.time)
         path = self.get_path("values")
         mapfile.map_save(rcs_by_name(self.rcs_name), path, map)
-
+    
+    def remove(self):
+        path = self.get_path()
+        shutil.rmtree(path)
+    
     def _get_rcs(self):
         return rcs_by_name(self.rcs_name)
 
@@ -260,14 +267,14 @@ class Comment(object):
     def save(self):
         map_file = {"Date": utility.time_to_str(self.time)}
         add_headers(self, map_file, ("From", "in_reply_to", "content_type"))
-        if not os.path.exists(self.get_path(None)):
-            self.bug.rcs.mkdir(self.get_path(None))
+        if not os.path.exists(self.get_path()):
+            self.bug.rcs.mkdir(self.get_path())
         mapfile.map_save(self.bug.rcs, self.get_path("values"), map_file)
         self.bug.rcs.set_file_contents(self.get_path("body"), 
                                        self.body.encode('utf-8'))
             
 
-    def get_path(self, name):
+    def get_path(self, name=None):
         my_dir = os.path.join(self.bug.get_path("comments"), self.uuid)
         if name is None:
             return my_dir
index b5a93c7728fe77e8bd640128c3b9ed62fadfbbcc..ace2d8121248a7201ad84ea907bff644ffb624ee 100644 (file)
@@ -23,24 +23,6 @@ from textwrap import TextWrapper
 from StringIO import StringIO
 import utility
 
-def unique_name(bug, bugs):
-    """
-    Generate short names from uuids.  Picks the minimum number of
-    characters (>=3) from the beginning of the uuid such that the
-    short names are unique.
-    
-    Obviously, as the number of bugs in the database grows, these
-    short names will cease to be unique.  The complete uuid should be
-    used for long term reference.
-    """
-    chars = 3
-    for some_bug in bugs:
-        if bug.uuid == some_bug.uuid:
-            continue
-        while (bug.uuid[:chars] == some_bug.uuid[:chars]):
-            chars+=1
-    return bug.uuid[:chars]
-
 class UserError(Exception):
     def __init__(self, msg):
         Exception.__init__(self, msg)
@@ -94,9 +76,20 @@ def execute(cmd, args):
     encoding = locale.getpreferredencoding() or 'ascii'
     return get_command(cmd).execute([a.decode(encoding) for a in args])
 
-def help(cmd):
-    return get_command(cmd).help()
-
+def help(cmd=None):
+    if cmd != None:
+        return get_command(cmd).help()
+    else:
+        cmdlist = []
+        for name, module in iter_commands():
+            cmdlist.append((name, module.__desc__))
+        longest_cmd_len = max([len(name) for name,desc in cmdlist])
+        ret = ["Bugs Everywhere - Distributed bug tracking\n",
+               "Supported commands"]
+        for name, desc in cmdlist:
+            numExtraSpaces = longest_cmd_len-len(name)
+            ret.append("be %s%*s    %s" % (name, numExtraSpaces, "", desc))
+        return "\n".join(ret)
 
 class GetHelp(Exception):
     pass
@@ -205,15 +198,6 @@ def bug_tree(dir=None):
     except bugdir.NoBugDir, e:
         raise UserErrorWrap(e)
 
-def print_command_list():
-    cmdlist = []
-    print """Bugs Everywhere - Distributed bug tracking
-    
-Supported commands"""
-    for name, module in iter_commands():
-        cmdlist.append((name, module.__doc__))
-    for name, desc in cmdlist:
-        print "be %s\n    %s" % (name, desc)
 
 def _test():
     import doctest
index d2e077ada7542f890c60e474a086288edb58b452..c86063d107cb34269e7a2f41fa8008151f0a18eb 100644 (file)
@@ -35,3 +35,21 @@ def creator():
         return os.environ["LOGNAME"]
     else:
         return os.environ["USERNAME"]
+
+def unique_name(bug, bugs):
+    """
+    Generate short names from uuids.  Picks the minimum number of
+    characters (>=3) from the beginning of the uuid such that the
+    short names are unique.
+    
+    Obviously, as the number of bugs in the database grows, these
+    short names will cease to be unique.  The complete uuid should be
+    used for long term reference.
+    """
+    chars = 3
+    for some_bug in bugs:
+        if bug.uuid == some_bug.uuid:
+            continue
+        while (bug.uuid[:chars] == some_bug.uuid[:chars]):
+            chars+=1
+    return bug.uuid[:chars]
index 4016ca1ffc3e1d5aa67b36d2f0cc1d644fd9be34..92549865db9d7a72863d0d51a1fb0715a4c84fa4 100644 (file)
@@ -55,6 +55,7 @@ def get_plugin(prefix, name):
 plugin_path = os.path.realpath(os.path.dirname(os.path.dirname(__file__)))
 if plugin_path not in sys.path:
     sys.path.append(plugin_path)
+
 def _test():
     import doctest
     doctest.testmod()