From ae4f98125cf8d7ae5cffb1fc2f9aaa453d657e7a Mon Sep 17 00:00:00 2001
From: Arun Babu Neelicattu <arun.neelicattu@gmail.com>
Date: Fri, 4 Mar 2022 21:55:24 +0100
Subject: [PATCH] PEP610: handle optional vcs_info.requested_version

As per PEP610, presence of `vcs_info.requested_version` is optional in
direct_url.json for vcs packages. Prior to this change, Poetry would
crash when loading an environment with a vcs package not installed by
Poetry.
---
 .../repositories/installed_repository.py      |  4 +++-
 .../METADATA                                  |  6 +++++
 .../direct_url.json                           |  7 ++++++
 .../repositories/test_installed_repository.py | 22 +++++++++++++++++++
 4 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 tests/repositories/fixtures/installed/lib/python3.7/site-packages/git_pep_610_no_requested_version-1.2.3.dist-info/METADATA
 create mode 100644 tests/repositories/fixtures/installed/lib/python3.7/site-packages/git_pep_610_no_requested_version-1.2.3.dist-info/direct_url.json

diff --git a/src/poetry/repositories/installed_repository.py b/src/poetry/repositories/installed_repository.py
index 47130090f40..e1568df41c4 100644
--- a/src/poetry/repositories/installed_repository.py
+++ b/src/poetry/repositories/installed_repository.py
@@ -201,8 +201,10 @@ def create_package_from_pep610(cls, distribution: metadata.Distribution) -> Pack
             # VCS distribution
             source_type = url_reference["vcs_info"]["vcs"]
             source_url = url_reference["url"]
-            source_reference = url_reference["vcs_info"]["requested_revision"]
             source_resolved_reference = url_reference["vcs_info"]["commit_id"]
+            source_reference = url_reference["vcs_info"].get(
+                "requested_revision", source_resolved_reference
+            )
 
         package = Package(
             distribution.metadata["name"],
diff --git a/tests/repositories/fixtures/installed/lib/python3.7/site-packages/git_pep_610_no_requested_version-1.2.3.dist-info/METADATA b/tests/repositories/fixtures/installed/lib/python3.7/site-packages/git_pep_610_no_requested_version-1.2.3.dist-info/METADATA
new file mode 100644
index 00000000000..986f958ab4f
--- /dev/null
+++ b/tests/repositories/fixtures/installed/lib/python3.7/site-packages/git_pep_610_no_requested_version-1.2.3.dist-info/METADATA
@@ -0,0 +1,6 @@
+Metadata-Version: 2.1
+Name: git-pep-610-no-requested-version
+Version: 1.2.3
+Summary: Foo
+License: MIT
+Requires-Python: >=3.6
diff --git a/tests/repositories/fixtures/installed/lib/python3.7/site-packages/git_pep_610_no_requested_version-1.2.3.dist-info/direct_url.json b/tests/repositories/fixtures/installed/lib/python3.7/site-packages/git_pep_610_no_requested_version-1.2.3.dist-info/direct_url.json
new file mode 100644
index 00000000000..d646852cdde
--- /dev/null
+++ b/tests/repositories/fixtures/installed/lib/python3.7/site-packages/git_pep_610_no_requested_version-1.2.3.dist-info/direct_url.json
@@ -0,0 +1,7 @@
+{
+  "url": "https://github.com/demo/git-pep-610-no-requested-version.git",
+  "vcs_info": {
+    "vcs": "git",
+    "commit_id": "123456"
+  }
+}
diff --git a/tests/repositories/test_installed_repository.py b/tests/repositories/test_installed_repository.py
index 3230bf5317e..c13be7d8e3e 100644
--- a/tests/repositories/test_installed_repository.py
+++ b/tests/repositories/test_installed_repository.py
@@ -34,6 +34,9 @@
     metadata.PathDistribution(SITE_PLATLIB / "lib64-2.3.4.dist-info"),
     metadata.PathDistribution(SITE_PLATLIB / "bender-2.0.5.dist-info"),
     metadata.PathDistribution(SITE_PURELIB / "git_pep_610-1.2.3.dist-info"),
+    metadata.PathDistribution(
+        SITE_PURELIB / "git_pep_610_no_requested_version-1.2.3.dist-info"
+    ),
     metadata.PathDistribution(SITE_PURELIB / "url_pep_610-1.2.3.dist-info"),
     metadata.PathDistribution(SITE_PURELIB / "file_pep_610-1.2.3.dist-info"),
     metadata.PathDistribution(SITE_PURELIB / "directory_pep_610-1.2.3.dist-info"),
@@ -189,6 +192,25 @@ def test_load_pep_610_compliant_git_packages(repository: InstalledRepository):
     assert package.source_resolved_reference == "123456"
 
 
+def test_load_pep_610_compliant_git_packages_no_requested_version(
+    repository: InstalledRepository,
+):
+    package = get_package_from_repository(
+        "git-pep-610-no-requested-version", repository
+    )
+
+    assert package is not None
+    assert package.name == "git-pep-610-no-requested-version"
+    assert package.version.text == "1.2.3"
+    assert package.source_type == "git"
+    assert (
+        package.source_url
+        == "https://github.com/demo/git-pep-610-no-requested-version.git"
+    )
+    assert package.source_resolved_reference == "123456"
+    assert package.source_reference == package.source_resolved_reference
+
+
 def test_load_pep_610_compliant_url_packages(repository: InstalledRepository):
     package = get_package_from_repository("url-pep-610", repository)