poetry icon indicating copy to clipboard operation
poetry copied to clipboard

fix: make git ref resolution less greedy for HEAD

Open abn opened this issue 1 year ago • 6 comments

This change ensures that when ref HEAD is specified, it is not incorrectly resolved to refs/head/HEAD. HEAD is not treated as a branch, and correctly resolved from the ref spec.

Resolves: #7024 Closes: #6874

abn avatar Nov 14 '22 17:11 abn

We clone the package twice in spite of the cache on https://github.com/python-poetry/poetry/blob/25767bcb4022a4a75e9c0f7c0eae5c8b8a72e12c/src/poetry/puzzle/provider.py#L88-L96 because the first time round rev is None and the second time it is "HEAD".

From that point of view the alternative fix that I tried in https://github.com/python-poetry/poetry/pull/6874#issue-1419899629 does better, but perhaps it's the wrong direction or has other disadvantages.

dimbleby avatar Nov 14 '22 18:11 dimbleby

Right, that makes more sense. What do we think about introducing a new datatype here to avoid the overloaded strings and to encapsulate the HEAD == None logic? The tests look good; we just need to realize that None and HEAD are the same thing (and to avoid the entropy of a string conversion from HEAD causing the cache to miss and clone a second time).

neersighted avatar Nov 14 '22 19:11 neersighted

@neersighted I kind of feel that adding a new datatype here might be overkill at present, but happy to be told otherwise. Alternatively, we could do something like this.

cache-fix.patch

diff --git a/src/poetry/puzzle/provider.py b/src/poetry/puzzle/provider.py
index 4d2e2d30..97abfb8c 100644
--- a/src/poetry/puzzle/provider.py
+++ b/src/poetry/puzzle/provider.py
@@ -86,7 +86,7 @@ class Indicator(ProgressIndicator):  # type: ignore[misc]
 
 
 @functools.lru_cache(maxsize=None)
-def _get_package_from_git(
+def _get_package_from_git_cached(
     url: str,
     branch: str | None = None,
     tag: str | None = None,
@@ -118,6 +118,24 @@ def _get_package_from_git(
     return package
 
 
+def _get_package_from_git(
+    url: str,
+    branch: str | None = None,
+    tag: str | None = None,
+    rev: str | None = None,
+    subdirectory: str | None = None,
+    source_root: Path | None = None,
+) -> Package:
+    return _get_package_from_git_cached(
+            url,
+            branch if branch != "HEAD" else None,
+            tag,
+            rev if rev != "HEAD" else None,
+            subdirectory,
+            source_root,
+        )
+
+
 class Provider:
     UNSAFE_PACKAGES: set[str] = set()
 

Either way, I can raise another PR to deal with the double clone issue. Let's solve the functionality issue by merging this?

Edit: Also there already is https://github.com/python-poetry/poetry/blob/25767bcb4022a4a75e9c0f7c0eae5c8b8a72e12c/src/poetry/vcs/git/backend.py#L44

abn avatar Nov 14 '22 20:11 abn

cf https://github.com/python-poetry/poetry-plugin-export/issues/172 in which the HEAD reference is again escaping where it oughtn't.

I wonder whether HEAD simply isn't a good reference to use and this fix is just papering over that (and requiring more of the same elsewhere).

Perhaps the alternative at https://github.com/python-poetry/poetry/pull/6874#issue-1419899629 is better after all - though I seem to recall there was more unit test noise to work through in that case.

dimbleby avatar Jan 02 '23 12:01 dimbleby

Is there any plan to merge / fix this?

Kuba314 avatar Mar 24 '23 12:03 Kuba314

@Secrus I have rebased this and fixed the mypy issue.

abn avatar Feb 23 '24 22:02 abn

This pull request has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.

github-actions[bot] avatar Apr 02 '24 00:04 github-actions[bot]