[#5343] Handle 4-part+ artifact links gracefully
diff --git a/Allura/allura/model/index.py b/Allura/allura/model/index.py
index 736a1e1..5772d20 100644
--- a/Allura/allura/model/index.py
+++ b/Allura/allura/model/index.py
@@ -127,22 +127,24 @@
def from_links(cls, *links):
'''Convert a sequence of shortlinks to the matching Shortlink objects'''
if len(links):
+ result = {}
# Parse all the links
parsed_links = dict((link, cls._parse_link(link)) for link in links)
links_by_artifact = defaultdict(list)
project_ids = set()
- for link, d in parsed_links.iteritems():
- project_ids.add(d['project_id'])
- links_by_artifact[unquote(d['artifact'])].append(d)
+ for link, d in parsed_links.items():
+ if d:
+ project_ids.add(d['project_id'])
+ links_by_artifact[unquote(d['artifact'])].append(d)
+ else:
+ result[link] = parsed_links.pop(link)
q = cls.query.find(dict(
link={'$in': links_by_artifact.keys()},
project_id={'$in': list(project_ids)}
), validate=False)
- result = {}
matches_by_artifact = dict(
(link, list(matches))
for link, matches in groupby(q, key=lambda s:unquote(s.link)))
- result = {}
for link, d in parsed_links.iteritems():
matches = matches_by_artifact.get(unquote(d['artifact']), [])
matches = (
diff --git a/Allura/allura/tests/model/test_artifact.py b/Allura/allura/tests/model/test_artifact.py
index b00f77a..0a621a7 100644
--- a/Allura/allura/tests/model/test_artifact.py
+++ b/Allura/allura/tests/model/test_artifact.py
@@ -98,6 +98,7 @@
assert M.Shortlink.lookup('[TestPage2]')
assert M.Shortlink.lookup('[wiki:TestPage2]')
assert M.Shortlink.lookup('[test:wiki:TestPage2]')
+ assert not M.Shortlink.lookup('[test:wiki:TestPage2:foo]')
assert not M.Shortlink.lookup('[Wiki:TestPage2]')
assert not M.Shortlink.lookup('[TestPage2_no_such_page]')
c.project.uninstall_app('wiki')