diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 6731d21..4657093 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -3863,3 +3863,41 @@ def add_metadata_update_notif(session, issue, messages, user, ticketfolder): session.add(issue_comment) # Make sure we won't have SQLAlchemy error before we continue session.commit() + + +def tokenize_search_string(pattern): + """This function tokenizes search patterns into key:value and rest. + + It will also correctly parse key values between quotes. + """ + if pattern is None: + return {}, None + def finalize_token(token, custom_search): + if ':' in token: + # This was a "key:value" parameter + key, value = token.split(':', 1) + custom_search[key] = value + return '' + else: + # This was a token without colon, thus a search pattern + return '%s ' % token + + custom_search = {} + # Remaining is the remaining real search_pattern (aka, non-key:values) + remaining = '' + # Token is the current "search token" we are processing + token = '' + in_quotes = False + for char in pattern: + if char == ' ' and not in_quotes: + remaining += finalize_token(token, custom_search) + token = '' + elif char == '"': + in_quotes = not in_quotes + else: + token += char + + # Parse the final token + remaining += finalize_token(token, custom_search) + + return custom_search, remaining.strip() diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py index 3220229..710b659 100644 --- a/pagure/ui/issues.py +++ b/pagure/ui/issues.py @@ -603,6 +603,11 @@ def view_issues(repo, username=None, namespace=None): for idx, key in enumerate(custom_keys): custom_search[key] = custom_values[idx] + search_string = search_pattern + extra_fields, search_pattern = pagure.lib.tokenize_search_string( + search_pattern) + custom_search.update(extra_fields) + repo = flask.g.repo if not repo.settings.get('issue_tracker', True): @@ -710,7 +715,7 @@ def view_issues(repo, username=None, namespace=None): priority=priority, total_page=total_page, add_report_form=pagure.forms.AddReportForm(), - search_pattern=search_pattern, + search_pattern=search_string, )