diff --git a/swh/web/common/identifiers.py b/swh/web/common/identifiers.py --- a/swh/web/common/identifiers.py +++ b/swh/web/common/identifiers.py @@ -233,6 +233,12 @@ A parsed SWHID. """ try: + # ensure core part of SWHID is in lower case to avoid parsing error + qualifiers_pos = swhid.find(";") + if qualifiers_pos == -1: + swhid = swhid.lower() + else: + swhid = swhid[:qualifiers_pos].lower() + swhid[qualifiers_pos:] swhid_parsed = QualifiedSWHID.from_string(swhid) except ValidationError as ve: raise BadInputExc("Error when parsing identifier: %s" % " ".join(ve.messages)) diff --git a/swh/web/tests/browse/views/test_identifiers.py b/swh/web/tests/browse/views/test_identifiers.py --- a/swh/web/tests/browse/views/test_identifiers.py +++ b/swh/web/tests/browse/views/test_identifiers.py @@ -28,91 +28,117 @@ def test_content_id_browse(client, content): cnt_sha1_git = content["sha1_git"] swhid = gen_swhid(CONTENT, cnt_sha1_git) - url = reverse("browse-swhid", url_args={"swhid": swhid}) - query_string = "sha1_git:" + cnt_sha1_git - content_browse_url = reverse( - "browse-content", url_args={"query_string": query_string} - ) + for swhid_ in (swhid, swhid.upper()): + url = reverse("browse-swhid", url_args={"swhid": swhid_}) - resp = check_html_get_response(client, url, status_code=302) - assert resp["location"] == content_browse_url + query_string = "sha1_git:" + cnt_sha1_git + content_browse_url = reverse( + "browse-content", url_args={"query_string": query_string} + ) + + resp = check_html_get_response(client, url, status_code=302) + assert resp["location"] == content_browse_url @given(directory()) def test_directory_id_browse(client, directory): swhid = gen_swhid(DIRECTORY, directory) - url = reverse("browse-swhid", url_args={"swhid": swhid}) - directory_browse_url = reverse("browse-directory", url_args={"sha1_git": directory}) + for swhid_ in (swhid, swhid.upper()): + url = reverse("browse-swhid", url_args={"swhid": swhid_}) - resp = check_html_get_response(client, url, status_code=302) - assert resp["location"] == directory_browse_url + directory_browse_url = reverse( + "browse-directory", url_args={"sha1_git": directory} + ) + + resp = check_html_get_response(client, url, status_code=302) + assert resp["location"] == directory_browse_url @given(revision()) def test_revision_id_browse(client, revision): swhid = gen_swhid(REVISION, revision) - url = reverse("browse-swhid", url_args={"swhid": swhid}) - revision_browse_url = reverse("browse-revision", url_args={"sha1_git": revision}) + for swhid_ in (swhid, swhid.upper()): + url = reverse("browse-swhid", url_args={"swhid": swhid_}) - resp = check_html_get_response(client, url, status_code=302) - assert resp["location"] == revision_browse_url + revision_browse_url = reverse( + "browse-revision", url_args={"sha1_git": revision} + ) - query_params = {"origin_url": "https://github.com/user/repo"} - url = reverse("browse-swhid", url_args={"swhid": swhid}, query_params=query_params) + resp = check_html_get_response(client, url, status_code=302) + assert resp["location"] == revision_browse_url - revision_browse_url = reverse( - "browse-revision", url_args={"sha1_git": revision}, query_params=query_params - ) + query_params = {"origin_url": "https://github.com/user/repo"} + url = reverse( + "browse-swhid", url_args={"swhid": swhid_}, query_params=query_params + ) - resp = check_html_get_response(client, url, status_code=302) - assert resp["location"] == revision_browse_url + revision_browse_url = reverse( + "browse-revision", + url_args={"sha1_git": revision}, + query_params=query_params, + ) + + resp = check_html_get_response(client, url, status_code=302) + assert resp["location"] == revision_browse_url @given(release()) def test_release_id_browse(client, release): swhid = gen_swhid(RELEASE, release) - url = reverse("browse-swhid", url_args={"swhid": swhid}) - release_browse_url = reverse("browse-release", url_args={"sha1_git": release}) + for swhid_ in (swhid, swhid.upper()): + url = reverse("browse-swhid", url_args={"swhid": swhid_}) - resp = check_html_get_response(client, url, status_code=302) - assert resp["location"] == release_browse_url + release_browse_url = reverse("browse-release", url_args={"sha1_git": release}) - query_params = {"origin_url": "https://github.com/user/repo"} + resp = check_html_get_response(client, url, status_code=302) + assert resp["location"] == release_browse_url - url = reverse("browse-swhid", url_args={"swhid": swhid}, query_params=query_params) + query_params = {"origin_url": "https://github.com/user/repo"} - release_browse_url = reverse( - "browse-release", url_args={"sha1_git": release}, query_params=query_params - ) + url = reverse( + "browse-swhid", url_args={"swhid": swhid_}, query_params=query_params + ) - resp = check_html_get_response(client, url, status_code=302) - assert resp["location"] == release_browse_url + release_browse_url = reverse( + "browse-release", url_args={"sha1_git": release}, query_params=query_params + ) + + resp = check_html_get_response(client, url, status_code=302) + assert resp["location"] == release_browse_url @given(snapshot()) def test_snapshot_id_browse(client, snapshot): swhid = gen_swhid(SNAPSHOT, snapshot) - url = reverse("browse-swhid", url_args={"swhid": swhid}) - snapshot_browse_url = reverse("browse-snapshot", url_args={"snapshot_id": snapshot}) + for swhid_ in (swhid, swhid.upper()): + url = reverse("browse-swhid", url_args={"swhid": swhid_}) - resp = check_html_get_response(client, url, status_code=302) - assert resp["location"] == snapshot_browse_url + snapshot_browse_url = reverse( + "browse-snapshot", url_args={"snapshot_id": snapshot} + ) - query_params = {"origin_url": "https://github.com/user/repo"} + resp = check_html_get_response(client, url, status_code=302) + assert resp["location"] == snapshot_browse_url - url = reverse("browse-swhid", url_args={"swhid": swhid}, query_params=query_params) + query_params = {"origin_url": "https://github.com/user/repo"} - release_browse_url = reverse( - "browse-snapshot", url_args={"snapshot_id": snapshot}, query_params=query_params - ) + url = reverse( + "browse-swhid", url_args={"swhid": swhid_}, query_params=query_params + ) - resp = check_html_get_response(client, url, status_code=302) - assert resp["location"] == release_browse_url + release_browse_url = reverse( + "browse-snapshot", + url_args={"snapshot_id": snapshot}, + query_params=query_params, + ) + + resp = check_html_get_response(client, url, status_code=302) + assert resp["location"] == release_browse_url @given(release()) diff --git a/swh/web/tests/common/test_identifiers.py b/swh/web/tests/common/test_identifiers.py --- a/swh/web/tests/common/test_identifiers.py +++ b/swh/web/tests/common/test_identifiers.py @@ -96,11 +96,12 @@ f"browse-{obj_type}", url_args=url_args, query_params=query_params ) - resolved_swhid = resolve_swhid(swhid, query_params) + for swhid_ in (swhid, swhid.upper()): + resolved_swhid = resolve_swhid(swhid_, query_params) - assert isinstance(resolved_swhid["swhid_parsed"], QualifiedSWHID) - assert str(resolved_swhid["swhid_parsed"]) == swhid - assert resolved_swhid["browse_url"] == browse_url + assert isinstance(resolved_swhid["swhid_parsed"], QualifiedSWHID) + assert str(resolved_swhid["swhid_parsed"]) == swhid + assert resolved_swhid["browse_url"] == browse_url with pytest.raises(BadInputExc, match="'ori' is not a valid ObjectType"): resolve_swhid(f"swh:1:ori:{random_sha1()}") @@ -116,10 +117,10 @@ (SNAPSHOT, snapshot), ): swhid = gen_swhid(obj_type, obj_id) - swh_parsed_swhid = get_swhid(swhid) - - assert isinstance(swh_parsed_swhid, QualifiedSWHID) - assert str(swh_parsed_swhid) == swhid + for swhid_ in (swhid, swhid.upper()): + swh_parsed_swhid = get_swhid(swhid_) + assert isinstance(swh_parsed_swhid, QualifiedSWHID) + assert str(swh_parsed_swhid) == swhid.lower() with pytest.raises(BadInputExc, match="Error when parsing identifier"): get_swhid("foo") @@ -192,14 +193,18 @@ swh_objects_info, snapshot_context=None, extra_context=extra_context, ) - swhid_dir_parsed = get_swhid(swhids[0]["swhid_with_context"]) + swhid_lower = swhids[0]["swhid_with_context"] + swhid_upper = swhid_lower.replace(swhids[0]["swhid"], swhids[0]["swhid"].upper()) - anchor = gen_swhid(DIRECTORY, directory) + for swhid in (swhid_lower, swhid_upper): + swhid_dir_parsed = get_swhid(swhid) - assert swhid_dir_parsed.qualifiers() == { - "anchor": anchor, - "path": dir_subdir_path, - } + anchor = gen_swhid(DIRECTORY, directory) + + assert swhid_dir_parsed.qualifiers() == { + "anchor": anchor, + "path": dir_subdir_path, + } if dir_subdir_files: swhid_cnt_parsed = get_swhid(swhids[1]["swhid_with_context"]) @@ -236,13 +241,18 @@ ) assert swhids[0]["context"] == {} - swhid_dir_parsed = get_swhid(swhids[1]["swhid_with_context"]) - anchor = gen_swhid(REVISION, revision) + swhid_lower = swhids[1]["swhid_with_context"] + swhid_upper = swhid_lower.replace(swhids[1]["swhid"], swhids[1]["swhid"].upper()) - assert swhid_dir_parsed.qualifiers() == { - "anchor": anchor, - } + for swhid in (swhid_lower, swhid_upper): + swhid_dir_parsed = get_swhid(swhid) + + anchor = gen_swhid(REVISION, revision) + + assert swhid_dir_parsed.qualifiers() == { + "anchor": anchor, + } if dir_entry["type"] == "file": swhid_cnt_parsed = get_swhid(swhids[2]["swhid_with_context"]) @@ -574,26 +584,29 @@ if lines: obj_context["lines"] = lines - obj_swhid = gen_swhid(object_type, object_id, metadata=obj_context) + obj_core_swhid = gen_swhid(object_type, object_id) + obj_swhid_lower = gen_swhid(object_type, object_id, metadata=obj_context) + obj_swhid_upper = obj_swhid_lower.replace(obj_core_swhid, obj_core_swhid.upper(), 1) - obj_swhid_resolved = resolve_swhid(obj_swhid) + for obj_swhid in (obj_swhid_lower, obj_swhid_upper): + obj_swhid_resolved = resolve_swhid(obj_swhid) - url_args = {"sha1_git": object_id} - if object_type == CONTENT: - url_args = {"query_string": f"sha1_git:{object_id}"} - elif object_type == SNAPSHOT: - url_args = {"snapshot_id": object_id} + url_args = {"sha1_git": object_id} + if object_type == CONTENT: + url_args = {"query_string": f"sha1_git:{object_id}"} + elif object_type == SNAPSHOT: + url_args = {"snapshot_id": object_id} - expected_url = reverse( - f"browse-{object_type}", url_args=url_args, query_params=query_params, - ) - if lines: - lines_number = lines.split("-") - expected_url += f"#L{lines_number[0]}" - if len(lines_number) > 1: - expected_url += f"-L{lines_number[1]}" + expected_url = reverse( + f"browse-{object_type}", url_args=url_args, query_params=query_params, + ) + if lines: + lines_number = lines.split("-") + expected_url += f"#L{lines_number[0]}" + if len(lines_number) > 1: + expected_url += f"-L{lines_number[1]}" - assert obj_swhid_resolved["browse_url"] == expected_url + assert obj_swhid_resolved["browse_url"] == expected_url @given(directory()) diff --git a/swh/web/urls.py b/swh/web/urls.py --- a/swh/web/urls.py +++ b/swh/web/urls.py @@ -49,12 +49,12 @@ url(r"^jsreverse/$", urls_js, name="js_reverse"), # keep legacy SWHID resolving URL with trailing slash for backward compatibility url( - r"^(?Pswh:[0-9]+:[a-z]+:[0-9a-f]+.*)/$", + r"^(?P(swh|SWH):[0-9]+:[A-Za-z]+:[0-9A-Fa-f]+.*)/$", swhid_browse, name="browse-swhid-legacy", ), url( - r"^(?Pswh:[0-9]+:[a-z]+:[0-9a-f]+.*)$", + r"^(?P(swh|SWH):[0-9]+:[A-Za-z]+:[0-9A-Fa-f]+.*)$", swhid_browse, name="browse-swhid", ),