Compare commits

..

No commits in common. "68b1142cd7b33f406fc5f4d078d688b847a6dcf4" and "0ce3932e9c8f249ce380d8adc6b45ca106a1108a" have entirely different histories.

1 changed files with 40 additions and 45 deletions

View File

@ -96,69 +96,64 @@ def version(client):
@click.option('--label', 'labels', multiple=True, help='Filter for issues with all the given labels') @click.option('--label', 'labels', multiple=True, help='Filter for issues with all the given labels')
@click.option('--text', 'texts', multiple=True, help='Filter for issues containing all the given strings') @click.option('--text', 'texts', multiple=True, help='Filter for issues containing all the given strings')
@click.option('--flagged/--not-flagged', is_flag=True, default=None, help='Filter issues being flagged or not flagged') @click.option('--flagged/--not-flagged', is_flag=True, default=None, help='Filter issues being flagged or not flagged')
@click.option('--watching/--not-watching', is_flag=True, default=None, help='Filter issues I watch or do not watch')
@click.option('--order', help='Sort by this field') @click.option('--order', help='Sort by this field')
@click.option('--asc/--desc', 'asc', help='Sort ascending/descending. Default: descending') @click.option('--asc/--desc', 'asc', help='Sort ascending/descending. Default: descending')
@click.option('--jql', help='Provide your own JQL query string to include in the search via AND.') @click.option('--jql', default='', help='Provide your own JQL query to search for issues. '
'Setting this ignores all other query options except --project.')
@pass_client @pass_client
@pass_config @pass_config
def issues(config, client, project, components, status, labels, texts, flagged, watching, order, asc, jql): def issues(config, client, project, components, status, labels, texts, flagged, order, asc, jql):
if project is None and config.has_section('filters') and config.get('filters', 'default_project'): if not project and config.has_section('filters') and config.get('filters', 'default_project'):
project = config['filters']['default_project'] project = config['filters']['default_project']
project_jql = f"project = {project}"
# TODO add filtering by created since # TODO add filtering by created since
# TODO add filtering by updated # TODO add filtering by updated
# TODO support pagination I guess? i.e. a limit # TODO support pagination I guess? i.e. a limit
filters = [] if not jql:
filters = []
if jql: if texts:
filters.append(jql) texts_jql = ' AND '.join([f'text ~ "{text}"' for text in texts])
filters.append(f"( {texts_jql} )")
if texts: if components:
texts_jql = ' AND '.join([f'text ~ "{text}"' for text in texts]) component_list = ', '.join([f'"{c}"' for c in components])
filters.append(f"( {texts_jql} )") components_jql = f"component in ({component_list})"
filters.append(components_jql)
if components: if status:
component_list = ', '.join([f'"{c}"' for c in components]) status_list = ', '.join([f'"{s}"' for s in status if not s.startswith('!')])
components_jql = f"component in ({component_list})" if status_list:
filters.append(components_jql) status_jql = f"status IN ({status_list})"
filters.append(status_jql)
status_list = ', '.join([f'"{s[1:]}"' for s in status if s.startswith('!')])
if status_list:
status_jql = f"status NOT IN ({status_list})"
filters.append(status_jql)
if status: if labels:
status_list = ', '.join([f'"{s}"' for s in status if not s.startswith('!')]) labels_jql = ' AND '.join([f'labels = "{label}"' for label in labels])
if status_list: filters.append(f"( {labels_jql} )")
status_jql = f"status IN ({status_list})"
filters.append(status_jql)
status_list = ', '.join([f'"{s[1:]}"' for s in status if s.startswith('!')])
if status_list:
status_jql = f"status NOT IN ({status_list})"
filters.append(status_jql)
if labels: if flagged is not None:
labels_jql = ' AND '.join([f'labels = "{label}"' for label in labels]) if flagged:
filters.append(f"( {labels_jql} )") flagged_jql = 'flagged IS NOT EMPTY'
else:
flagged_jql = 'flagged IS EMPTY'
filters.append(flagged_jql)
if flagged is not None: if project:
if flagged: filters.append(project_jql)
flagged_jql = 'flagged IS NOT EMPTY'
else:
flagged_jql = 'flagged IS EMPTY'
filters.append(flagged_jql)
if watching is not None: jql = ' AND '.join(filters)
if watching:
watching_jql = 'watcher = currentUser()'
else:
watching_jql = 'watcher != currentUser()'
filters.append(watching_jql)
if project: if order:
project_jql = f"project = {project}" jql += f" ORDER BY {order} {'ASC' if asc else 'DESC'}"
filters.append(project_jql)
jql = ' AND '.join(filters) else:
if project:
if order: jql = f"project = {project} AND {jql}"
jql += f" ORDER BY {order} {'ASC' if asc else 'DESC'}"
print(f"Searching with query: {jql}") print(f"Searching with query: {jql}")
issues = client.search_issues(jql) issues = client.search_issues(jql)