def eval(self): extras = {} if self.args.extra_fields: try: for item in self.args.extra_fields: key, value = item.split("=") if key in extras: if not isinstance(extras[key], list): v = [extras[key]] extras[key] = v extras[key].append(value) else: extras[key] = value except Exception: raise UsageWarning("Unknown extra fields %s" % (self.args.extra_fields)) self.jira.update_issue( self.args.issue, **extras ) if self.args.issue_comment: self.jira.add_comment( self.args.issue, self.args.issue_comment if isinstance(self.args.issue_comment, basestring) else get_text_from_editor() ) print_output(self.jira.format_issue(self.jira.get_issue(self.args.issue), comments_only=True)) elif self.args.issue_priority: self.jira.update_issue( self.args.issue, priority=self.jira.get_priorities()[self.args.issue_priority]["id"] ) elif self.args.issue_components: components = dict( (k["name"], k["id"]) for k in self.jira.get_components( self.args.issue.split("-")[0] ) ) current_components = set(k["name"] for k in self.jira.get_issue(self.args.issue)["components"]) if not set(self.args.issue_components).issubset(current_components): new_components = current_components.union(self.args.issue_components) self.jira.update_issue(self.args.issue, components=[components[k] for k in new_components] ) print_output(colorfunc( 'component(s): %s added to %s' % ( ",".join(self.args.issue_components), self.args.issue), 'green' )) else: raise UsageWarning("component(s):[%s] already exist in %s" % ( ",".join(self.args.issue_components), self.args.issue) ) elif self.args.issue_transition: self.jira.transition_issue(self.args.issue, self.args.issue_transition.lower()) print_output(colorfunc( '%s transitioned to "%s"' % (self.args.issue, self.args.issue_transition), 'green' )) elif self.args.issue_assignee: self.jira.assign_issue(self.args.issue, self.args.issue_assignee) print_output(colorfunc( '%s assigned to %s' % (self.args.issue, self.args.issue_assignee), 'green' ))
def eval(self): mappers = { "issue_types": (self.jira.get_issue_types,), 'subtask_types': (self.jira.get_subtask_issue_types,), 'projects': (self.jira.get_projects,), 'priorities': (self.jira.get_priorities,), 'statuses': (self.jira.get_statuses,), 'resolutions': (self.jira.get_resolutions,), 'components': (self.jira.get_components, 'project'), 'versions': (self.jira.list_versions, 'project'), 'transitions': (self.jira.get_available_transitions, 'issue'), 'filters': (self.jira.get_filters,), 'aliases': (lambda: [{"name": k, "description": v} for k, v in Config(section='alias').items().items()],) } func, arguments = mappers[self.args.type][0], mappers[self.args.type][1:] _ = [] _k = {} for earg in arguments: if isinstance(earg, tuple): if getattr(self.args, earg[0]): _k.update({earg[0]: getattr(self.args, earg[0])}) else: _k[earg[0]] = earg[1] else: if not getattr(self.args, earg): raise UsageError("'--%s' is required for listing '%s'" % (earg, self.args.type)) _.append(getattr(self.args, earg)) found = False data = func(*_, **_k) data_dict = OrderedDict() if type(data) == type([]): for item in data: data_dict[item['name']] = item else: data_dict = data for item in data_dict.values(): found = True val = item if self.args.debug: pprint.pprint(item, stream=sys.stderr) if type(item) == type({}): val = colorfunc(item['name'], 'white') if 'key' in item and item['key']: val += " [" + colorfunc(item['key'], 'magenta') + "]" if 'id' in item and item['id']: val += " [" + colorfunc(item['id'], 'yellow') + "]" if 'description' in item and item['description']: val += " [" + colorfunc(item['description'], 'green') + "]" print_output(colorfunc(val, 'white')) if not found: raise UsageWarning("No %s found." % self.args.type)
def eval(self): if self.args.issue_comment: self.jira.add_comment(self.args.issue, get_text_from_editor()) print_output( self.jira.format_issue(self.jira.get_issue(self.args.issue), comments_only=True)) elif self.args.issue_priority: self.jira.update_issue(self.args.issue, priority=self.jira.get_priorities()[ self.args.issue_priority]["id"]) elif self.args.issue_components: components = dict((k["name"], k["id"]) for k in self.jira.get_components( self.args.issue.split("-")[0])) current_components = set( k["name"] for k in self.jira.get_issue(self.args.issue)["components"]) if not set( self.args.issue_components).issubset(current_components): new_components = current_components.union( self.args.issue_components) self.jira.update_issue( self.args.issue, components=[components[k] for k in new_components]) print_output( colorfunc( 'component(s): %s added to %s' % (",".join( self.args.issue_components), self.args.issue), 'green')) else: raise UsageWarning( "component(s):[%s] already exist in %s" % (",".join(self.args.issue_components), self.args.issue)) elif self.args.issue_transition: self.jira.transition_issue(self.args.issue, self.args.issue_transition.lower()) print_output( colorfunc( '%s transitioned to "%s"' % (self.args.issue, self.args.issue_transition), 'green')) elif self.args.issue_assignee: self.jira.update_issue(self.args.issue, assignee=self.args.issue_assignee) print_output( colorfunc( '%s assigned to %s' % (self.args.issue, self.args.issue_assignee), 'green'))
def eval(self): mappers = { "issue_types": (self.jira.get_issue_types,), "subtask_types": (self.jira.get_subtask_issue_types,), "projects": (self.jira.get_projects,), "priorities": (self.jira.get_priorities,), "statuses": (self.jira.get_statuses,), "resolutions": (self.jira.get_resolutions,), "components": (self.jira.get_components, "project"), "versions": (self.jira.list_versions, "project"), "transitions": (self.jira.get_available_transitions, "issue"), "filters": (self.jira.get_filters,), } func, arguments = mappers[self.args.type][0], mappers[self.args.type][1:] _ = [] _k = {} for earg in arguments: if isinstance(earg, tuple): if getattr(self.args, earg[0]): _k.update({earg[0]: getattr(self.args, earg[0])}) else: _k[earg[0]] = earg[1] else: if not getattr(self.args, earg): raise UsageError("'--%s' is required for listing '%s'" % (earg, self.args.type)) _.append(getattr(self.args, earg)) found = False data = func(*_, **_k) data_dict = OrderedDict() if type(data) == type([]): for item in data: data_dict[item["name"]] = item else: data_dict = data for item in data_dict.values(): found = True val = item if type(item) == type({}): val = colorfunc(item["name"], "white") if "key" in item and item["key"]: val += " [" + colorfunc(item["key"], "magenta") + "]" if "description" in item and item["description"]: val += " [" + colorfunc(item["description"], "green") + "]" print_output(colorfunc(val, "white")) if not found: raise UsageWarning("No %s found." % self.args.type)
def eval(self): mappers = { "issue_types": (self.jira.get_issue_types,), 'subtask_types': (self.jira.get_subtask_issue_types,), 'projects': (self.jira.get_projects,), 'priorities': (self.jira.get_priorities,), 'statuses': (self.jira.get_statuses,), 'resolutions': (self.jira.get_resolutions,), 'components': (self.jira.get_components, 'project'), 'transitions': (self.jira.get_available_transitions, 'issue'), 'filters': (self.jira.get_filters,) } func, arguments = mappers[self.args.type][0], mappers[self.args.type][1:] _ = [] _k = {} for earg in arguments: if isinstance(earg, tuple): if getattr(self.args, earg[0]): _k.update({earg[0]: getattr(self.args, earg[0])}) else: _k[earg[0]] = earg[1] else: if not getattr(self.args, earg): raise UsageError("'--%s' is required for listing '%s'" % (earg, self.args.type)) _.append(getattr(self.args, earg)) found = False data = func(*_, **_k) data_dict = {} if type(data) == type([]): for item in data: data_dict[item['name']] = item else: data_dict = data for item in data_dict.values(): found = True val = item if type(item) == type({}): val = colorfunc(item['name'], 'white') if 'key' in item and item['key']: val += " [" + colorfunc(item['key'], 'magenta') + "]" if 'description' in item and item['description']: val += " [" + colorfunc(item['description'], 'green') + "]" print_output(colorfunc(val, 'white')) if not found: raise UsageWarning("No %s found." % self.args.type)
def eval(self): if self.args.issue_comment: self.jira.add_comment( self.args.issue, self.args.issue_comment if isinstance(self.args.issue_comment, basestring) else get_text_from_editor() ) print_output(self.jira.format_issue(self.jira.get_issue(self.args.issue), comments_only=True)) elif self.args.issue_priority: self.jira.update_issue( self.args.issue, priority=self.jira.get_priorities()[self.args.issue_priority]["id"] ) elif self.args.issue_components: components = dict( (k["name"], k["id"]) for k in self.jira.get_components( self.args.issue.split("-")[0] ) ) current_components = set(k["name"] for k in self.jira.get_issue(self.args.issue)["components"]) if not set(self.args.issue_components).issubset(current_components): new_components = current_components.union(self.args.issue_components) self.jira.update_issue(self.args.issue, components=[components[k] for k in new_components] ) print_output(colorfunc( 'component(s): %s added to %s' % ( ",".join(self.args.issue_components), self.args.issue), 'green' )) else: raise UsageWarning("component(s):[%s] already exist in %s" % ( ",".join(self.args.issue_components), self.args.issue) ) elif self.args.issue_transition: self.jira.transition_issue(self.args.issue, self.args.issue_transition.lower()) print_output(colorfunc( '%s transitioned to "%s"' % (self.args.issue, self.args.issue_transition), 'green' )) elif self.args.issue_assignee: self.jira.update_issue(self.args.issue, assignee=self.args.issue_assignee) print_output(colorfunc( '%s assigned to %s' % (self.args.issue, self.args.issue_assignee), 'green' ))
def format_issue(self, issue, mode=0, formatter=None, comments_only=False): fields = {} status_color = "blue" status_string = JiraBridge.object_from_key( issue.setdefault('status', '1'), self.get_statuses )["name"].lower() if status_string in ["resolved", "closed", "done"]: status_color = "green" elif status_string in ["open", "unassigned", "reopened", "to do"]: status_color = "red" special_fields = { "status": self.get_statuses, "priority": self.get_priorities, "type": self.get_issue_types } if formatter: groups = re.compile("(%([\w]+))").findall(formatter) ret_str = formatter for k, v in groups: if v.lower() in special_fields.keys(): key=issue[v.lower()] data = "" or JiraBridge.object_from_key(key, special_fields[v.lower()])["name"] ret_str = ret_str.replace(k, data) else: ret_str = ret_str.replace(k, str(issue.setdefault(v.lower(),""))) return ret_str if mode >= 0: # minimal fields["issue"] = issue["key"] fields["status"] = colorfunc(JiraBridge.object_from_key(issue["status"], self.get_statuses)["name"], status_color) fields["reporter"] = issue.setdefault("reporter","") fields["assignee"] = issue.setdefault("assignee","") fields["summary"] = issue.setdefault("summary","") fields["link"] = colorfunc( "%s/browse/%s" % ( self.base_url, issue["key"] ), "white", attrs=["underline"] ) if mode == 1 or comments_only: fields["description"] = issue.setdefault("description","") or "" if not issue.get("priority", ""): self.fields["priority"] = "" else: fields["priority"] = JiraBridge.object_from_key(issue["priority"], self.get_priorities)["name"] fields["type"] = JiraBridge.object_from_key( issue["type"], self.get_issue_types if 'parent' not in issue else self.get_subtask_issue_types )["name"] fields["comments"] = "\n" comments = self.get_issue_comments(issue["key"]) for comment in comments: comment_str = comment["body"].strip() fields["comments"] += "%s %s : %s\n" % ( colorfunc(comment["created"], "blue"), colorfunc(comment["author"], "green"), comment_str ) children_string = "" if mode > 1: description = (issue.setdefault("description", "") or "").split("\n") fields["description"] = "\n".join([description[0]] + [" "*23 + k for k in description[1:]]) for child in self.search_issues_jql("parent=%s" % issue["key"]): child_type = JiraBridge.object_from_key(child["type"], self.get_subtask_issue_types)["name"].lower() key = ("%s" % child_type).ljust(20) value = "%s (%s) %s" % ( child["key"], child["summary"], colorfunc("%s/browse/%s" % (self.base_url, child["key"]), "white", attrs=['underline']) ) children_string += "%s : %s\n" % (key, value) if comments_only: return fields["comments"].strip() elif mode < 0: url_str = colorfunc(parse.urljoin(self.base_url, "/browse/%s" % (issue["key"])), "white", attrs=["underline"]) ret_str = colorfunc(issue["key"], status_color) + " " + issue.setdefault("summary", "") + " " + url_str if not COLOR: ret_str += " [%s] " % self.get_statuses()[issue["status"]] return ret_str for k, v in fields.items(): if not v: fields[k] = "" formatted = "\n".join(" : ".join((k.ljust(20), v)) for k, v in fields.items() if not k == 'comments') + "\n" formatted += children_string if "comments" in fields: formatted += fields["comments"] return formatted
def format_issue(self, issue, mode=0, formatter=None, comments_only=False): fields = {} status_color = "blue" status_from_id = JiraBridge.object_from_key( issue.setdefault('status', '1'), self.get_statuses ) if not status_from_id: status_from_id = self.get_status(issue.setdefault('status', '1')) status_string = (status_from_id and status_from_id['name']) or 'unknown' status_category = status_from_id.get('statusCategory', {}) if status_category: status_color = status_category.get('colorName') if status_color: status_color = status_color.split("-")[0] if status_color not in termcolor.COLORS: status_color = None if not status_color: if status_string.lower() in ["resolved", "closed", "done"]: status_color = "green" elif status_string.lower() in ["open", "unassigned", "reopened", "to do"]: status_color = "red" list_fields = set(['versions', 'fixversions']) special_fields = { "status": self.get_statuses, "priority": self.get_priorities, "type": lambda: dict(list(self.get_issue_types().items()) + list(self.get_subtask_issue_types().items())) } special_field_fallback = { "status": self.get_status, "type": self.get_issue_type } if formatter: groups = re.compile("(%([\w]+))").findall(formatter) ret_str = formatter for k, v in groups: if v.lower() in special_fields.keys(): key = issue[v.lower()] data = "" or JiraBridge.object_from_key(key, special_fields[v.lower()]).get("name") if not data and v.lower() in special_field_fallback: data = special_field_fallback[v.lower()](key).get("name") ret_str = ret_str.replace(k, data) elif v.lower() in list_fields: fix_versions = ", ".join(v.name for v in issue.get('fixVersions', [])) ret_str = ret_str.replace(k, fix_versions) else: ret_str = ret_str.replace(k, str(issue.setdefault(v.lower(), ""))) return ret_str if mode >= 0: # minimal fields["issue"] = issue["key"] fields["status"] = colorfunc( JiraBridge.object_from_key( issue["status"], self.get_statuses ).get("name", self.get_status(issue["status"])['name']) , status_color ) fields["reporter"] = issue.setdefault("reporter","") fields["assignee"] = issue.setdefault("assignee","") fields["summary"] = issue.setdefault("summary","") fields["link"] = colorfunc( "%s/browse/%s" % ( self.base_url, issue["key"] ), "white", attrs=["underline"] ) if mode == 1 or comments_only: fields["description"] = issue.setdefault("description","") or "" if not issue.get("priority", ""): fields["priority"] = "" else: fields["priority"] = JiraBridge.object_from_key(issue["priority"], self.get_priorities)["name"] fields["type"] = JiraBridge.object_from_key( issue["type"], self.get_issue_types if 'parent' not in issue else self.get_subtask_issue_types ).get("name", self.get_issue_type(issue["type"])) fields["comments"] = "\n" comments = self.get_issue_comments(issue["key"]) for comment in comments: comment_str = comment["body"].strip() fields["comments"] += "%s %s : %s\n" % ( colorfunc(comment["created"], "blue"), colorfunc(comment["author"], "green"), comment_str ) children_string = "" if mode > 1: description = (issue.setdefault("description", "") or "").split("\n") fields["description"] = "\n".join([description[0]] + [" "*23 + k for k in description[1:]]) for child in self.search_issues_jql("parent=%s" % issue["key"]): child_type = JiraBridge.object_from_key(child["type"], self.get_subtask_issue_types)["name"].lower() key = ("%s" % child_type).ljust(20) value = "%s (%s) %s" % ( child["key"], child["summary"], colorfunc("%s/browse/%s" % (self.base_url, child["key"]), "white", attrs=['underline']) ) children_string += "%s : %s\n" % (key, value) if comments_only: return fields["comments"].strip() elif mode < 0: url_str = colorfunc(parse.urljoin(self.base_url, "/browse/%s" % (issue["key"])), "white", attrs=["underline"]) ret_str = colorfunc(issue["key"], status_color) + " " + issue.setdefault("summary", "") + " " + url_str if not COLOR: ret_str += " [%s] " % status_string return ret_str for k, v in fields.items(): if not v: fields[k] = "" formatted = "" for k, v in fields.items(): if not k == 'comments': formatted += ' : '.join((k.ljust(20), str(v))) + '\n' formatted += children_string if "comments" in fields: formatted += fields["comments"] return formatted
def format_issue(self, issue, mode=0, formatter=None, comments_only=False): fields = {} status_color = "blue" status_string = JiraBridge.object_from_key( issue.setdefault('status', '1'), self.get_statuses)["name"].lower() if status_string in ["resolved", "closed", "done"]: status_color = "green" elif status_string in ["open", "unassigned", "reopened", "to do"]: status_color = "red" special_fields = { "status": self.get_statuses, "priority": self.get_priorities, "type": self.get_issue_types } if formatter: groups = re.compile("(%([\w]+))").findall(formatter) ret_str = formatter for k, v in groups: if v.lower() in special_fields.keys(): key = issue[v.lower()] data = "" or JiraBridge.object_from_key( key, special_fields[v.lower()])["name"] ret_str = ret_str.replace(k, data) else: ret_str = ret_str.replace( k, str(issue.setdefault(v.lower(), ""))) return ret_str if mode >= 0: # minimal fields["issue"] = issue["key"] fields["status"] = colorfunc( JiraBridge.object_from_key(issue["status"], self.get_statuses)["name"], status_color) fields["reporter"] = issue.setdefault("reporter", "") fields["assignee"] = issue.setdefault("assignee", "") fields["summary"] = issue.setdefault("summary", "") fields["link"] = colorfunc(parse.urljoin( self.base_url, "/browse/%s" % (issue["key"])), "white", attrs=["underline"]) if mode == 1 or comments_only: fields["description"] = issue.setdefault("description", "") or "" if not issue.get("priority", ""): self.fields["priority"] = "" else: fields["priority"] = JiraBridge.object_from_key( issue["priority"], self.get_priorities)["name"] fields["type"] = JiraBridge.object_from_key( issue["type"], self.get_issue_types)["name"] fields["comments"] = "\n" comments = self.get_issue_comments(issue["key"]) for comment in comments: comment_str = comment["body"].strip() fields["comments"] += "%s %s : %s\n" % ( colorfunc(comment["created"], "blue"), colorfunc(comment["author"], "green"), comment_str) children_string = "" if mode > 1: description = (issue.setdefault("description", "") or "").split("\n") fields["description"] = "\n".join( [description[0]] + [" " * 23 + k for k in description[1:]]) for child in self.search_issues_jql("parent=%s" % issue["key"]): child_type = JiraBridge.object_from_key( child["type"], self.get_subtask_issue_types)["name"].lower() key = ("%s" % child_type).ljust(20) value = "%s (%s) %s" % (child["key"], child["summary"], colorfunc( "%s/browse/%s" % (self.base_url, child["key"]), "white", attrs=['underline'])) children_string += "%s : %s\n" % (key, value) if comments_only: return fields["comments"].strip() elif mode < 0: url_str = colorfunc(parse.urljoin(self.base_url, "/browse/%s" % (issue["key"])), "white", attrs=["underline"]) ret_str = colorfunc(issue["key"], status_color) + " " + issue.setdefault( "summary", "") + " " + url_str if not COLOR: ret_str += " [%s] " % self.get_statuses()[issue["status"]] return ret_str for k, v in fields.items(): if not v: fields[k] = "" formatted = "\n".join(" : ".join((k.ljust(20), v)) for k, v in fields.items() if not k == 'comments') + "\n" formatted += children_string if "comments" in fields: formatted += fields["comments"] return formatted
def eval(self): if self.args.extra_fields: extras = self.extract_extras() self.jira.update_issue(self.args.issue, **extras) if self.args.issue_comment: self.jira.add_comment( self.args.issue, self.args.issue_comment if isinstance(self.args.issue_comment, basestring) else get_text_from_editor(), ) print_output(self.jira.format_issue(self.jira.get_issue(self.args.issue), comments_only=True)) elif self.args.issue_priority: self.jira.update_issue(self.args.issue, priority=self.jira.get_priorities()[self.args.issue_priority]["id"]) elif self.args.issue_components: components = dict((k["name"], k["id"]) for k in self.jira.get_components(self.args.issue.split("-")[0])) current_components = set(k["name"] for k in self.jira.get_issue(self.args.issue)["components"]) if not set(self.args.issue_components).issubset(current_components): new_components = current_components.union(self.args.issue_components) self.jira.update_issue(self.args.issue, components=[components[k] for k in new_components]) print_output( colorfunc( "component(s): %s added to %s" % (",".join(self.args.issue_components), self.args.issue), "green", ) ) else: raise UsageWarning( "component(s):[%s] already exist in %s" % (",".join(self.args.issue_components), self.args.issue) ) elif self.args.issue_transition: self.jira.transition_issue(self.args.issue, self.args.issue_transition.lower(), self.args.resolution) print_output(colorfunc('%s transitioned to "%s"' % (self.args.issue, self.args.issue_transition), "green")) elif self.args.issue_assignee: self.jira.assign_issue(self.args.issue, self.args.issue_assignee) print_output(colorfunc("%s assigned to %s" % (self.args.issue, self.args.issue_assignee), "green")) elif self.args.labels: self.jira.add_labels(self.args.issue, self.args.labels, True) print_output(colorfunc("%s labelled with %s" % (self.args.issue, ",".join(self.args.labels)), "green")) if self.args.affects_version: self.jira.add_versions(self.args.issue, self.args.affects_version, "affects") print_output( colorfunc( "Added affected version(s) %s to %s" % (",".join(self.args.affects_version), self.args.issue), "green", ) ) if self.args.remove_affects_version: self.jira.remove_versions(self.args.issue, self.args.remove_affects_version, "affects") print_output( colorfunc( "Removed affected version(s) %s from %s" % (",".join(self.args.remove_affects_version), self.args.issue), "blue", ) ) if self.args.fix_version: self.jira.add_versions(self.args.issue, self.args.fix_version, "fix") print_output( colorfunc( "Added fixed version(s) %s to %s" % (",".join(self.args.fix_version), self.args.issue), "green" ) ) if self.args.remove_fix_version: self.jira.remove_versions(self.args.issue, self.args.remove_fix_version, "fix") print_output( colorfunc( "Removed fixed version(s) %s from %s" % (",".join(self.args.remove_fix_version), self.args.issue), "blue", ) )
def eval(self): if self.args.extra_fields: extras = self.extract_extras() self.jira.update_issue(self.args.issue, **extras) if self.args.issue_comment: self.jira.add_comment( self.args.issue, self.args.issue_comment if isinstance( self.args.issue_comment, basestring) else get_text_from_editor()) print_output( self.jira.format_issue(self.jira.get_issue(self.args.issue), comments_only=True)) elif self.args.issue_priority: self.jira.update_issue(self.args.issue, priority=self.jira.get_priorities()[ self.args.issue_priority]["id"]) elif self.args.issue_components: components = dict((k["name"], k["id"]) for k in self.jira.get_components( self.args.issue.split("-")[0])) current_components = set( k["name"] for k in self.jira.get_issue(self.args.issue)["components"]) if not set( self.args.issue_components).issubset(current_components): new_components = current_components.union( self.args.issue_components) self.jira.update_issue( self.args.issue, components=[components[k] for k in new_components]) print_output( colorfunc( 'component(s): %s added to %s' % (",".join( self.args.issue_components), self.args.issue), 'green')) else: raise UsageWarning( "component(s):[%s] already exist in %s" % (",".join(self.args.issue_components), self.args.issue)) elif self.args.issue_transition: self.jira.transition_issue(self.args.issue, self.args.issue_transition.lower(), self.args.resolution) print_output( colorfunc( '%s transitioned to "%s"' % (self.args.issue, self.args.issue_transition), 'green')) elif self.args.issue_assignee: self.jira.assign_issue(self.args.issue, self.args.issue_assignee) print_output( colorfunc( '%s assigned to %s' % (self.args.issue, self.args.issue_assignee), 'green')) elif self.args.labels: self.jira.add_labels(self.args.issue, self.args.labels, True) print_output( colorfunc( '%s labelled with %s' % (self.args.issue, ",".join(self.args.labels)), 'green')) if self.args.affects_version: self.jira.add_versions(self.args.issue, self.args.affects_version, 'affects') print_output( colorfunc( 'Added affected version(s) %s to %s' % (",".join(self.args.affects_version), self.args.issue), 'green')) if self.args.remove_affects_version: self.jira.remove_versions(self.args.issue, self.args.remove_affects_version, 'affects') print_output( colorfunc( 'Removed affected version(s) %s from %s' % (",".join( self.args.remove_affects_version), self.args.issue), 'blue')) if self.args.fix_version: self.jira.add_versions(self.args.issue, self.args.fix_version, 'fix') print_output( colorfunc( 'Added fixed version(s) %s to %s' % (",".join(self.args.fix_version), self.args.issue), 'green')) if self.args.remove_fix_version: self.jira.remove_versions(self.args.issue, self.args.remove_fix_version, 'fix') print_output( colorfunc( 'Removed fixed version(s) %s from %s' % (",".join(self.args.remove_fix_version), self.args.issue), 'blue'))