# Copyright (C) 2009 Gianluca Montecchi # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """Tag a bug, or search bugs for tags""" from libbe import cmdutil, bugdir import os, copy __desc__ = __doc__ def execute(args, manipulate_encodings=True, restrict_file_access=False): """ >>> from libbe import utility >>> bd = bugdir.SimpleBugDir() >>> bd.set_sync_with_disk(True) >>> os.chdir(bd.root) >>> a = bd.bug_from_shortname("a") >>> print a.extra_strings [] >>> execute(["a", "GUI"], manipulate_encodings=False) 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"], manipulate_encodings=False) Tags for a: GUI later >>> execute(["a"], manipulate_encodings=False) Tags for a: GUI later >>> execute(["--list"], manipulate_encodings=False) GUI later >>> execute(["a", "Alphabetically first"], manipulate_encodings=False) 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 [] >>> execute(["a"], manipulate_encodings=False) >>> bd._clear_bugs() # resync our copy of bug >>> a = bd.bug_from_shortname("a") >>> print a.extra_strings [] >>> execute(["a", "Alphabetically first"], manipulate_encodings=False) Tags for a: Alphabetically first >>> execute(["--remove", "a", "Alphabetically first"], manipulate_encodings=False) >>> bd.cleanup() """ 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=manipulate_encodings) 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() if len(tags) > 0: print '\n'.join(tags) return bug = cmdutil.bug_from_id(bd, 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 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: """ def help(): return get_parser().help_str() + longhelp