Skip to content

AssertionError in get_parents when updating package from private repo #10658

@Quentin62

Description

@Quentin62

Description

When I want to update a package defined with a tag from a private repo from github

In the pyproject, the pkg is defined like this
"pkg_from_private_repo@ git+ssh://[email protected]/my_org/[email protected]"

poetry update pkg_from_private_repo

I get the following error

Updating dependencies
Resolving dependencies... (1.5s)

  AssertionError

  

  at ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/dulwich/repo.py:392 in get_parents
       388│ 
       389│         # Fallback to reading the commit object
       390│         if commit is None:
       391│             obj = self.store[commit_id]
    →  392│             assert isinstance(obj, Commit)
       393│             commit = obj
       394│         parents = commit.parents
       395│         assert isinstance(parents, list)
       396│         return parents

Workarounds

If I delete the virtual environment, and run poetry install and then poetry update pkg_from_private_repo, it works

Poetry Installation Method

pipx

Operating System

Ubuntu 24.04.3 LTS (in WSL2)

Poetry Version

2.2.1

Poetry Configuration

cache-dir = "/home/quentin/.cache/pypoetry"
data-dir = "/home/quentin/.local/share/pypoetry"
installer.max-workers = null
installer.no-binary = null
installer.only-binary = null
installer.parallel = true
installer.re-resolve = true
keyring.enabled = true
python.installation-dir = "{data-dir}/python"  # /home/quentin/.local/share/pypoetry/python
requests.max-retries = 0
solver.lazy-wheel = true
system-git-client = false
virtualenvs.create = true
virtualenvs.in-project = true
virtualenvs.options.always-copy = false
virtualenvs.options.no-pip = false
virtualenvs.options.system-site-packages = false
virtualenvs.path = "{cache-dir}/virtualenvs"  # /home/quentin/.cache/pypoetry/virtualenvs
virtualenvs.prompt = "{project_name}-py{python_version}"
virtualenvs.use-poetry-python = false

Python Sysconfig

sysconfig.txt

Example pyproject.toml

[project]
name = "demo"
version = "1.0.0"
description = ""
authors = [
    {name = aaaa",email = "[email protected]"},
]
readme = "README.md"
requires-python = ">=3.10,<3.13"
dependencies = [
    "pandas (>=2.0.0,<3.0.0)",
    "pkg_from_private_repo@ git+ssh://[email protected]/my_org/[email protected]",
]


[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"

Poetry Runtime Logs

poetry-runtime.log
Loading configuration file /home/quentin/.config/pypoetry/config.toml
Using virtualenv: /home/quentin/Package/demo/.venv
Checking keyring availability: Checking if keyring is available
[keyring:keyring.backend] Loading KWallet
[keyring:keyring.backend] Loading SecretService
[keyring:keyring.backend] Loading Windows
[keyring:keyring.backend] Loading chainer
[keyring:keyring.backend] Loading libsecret
[keyring:keyring.backend] Loading macOS
Backend 'fail Keyring' is not suitable
No valid keyring backend was found
Unavailable
Updating dependencies
Resolving dependencies...
 1: fact: demois 10.1.0
 1: derived: demo
[dulwich:dulwich.config] Loading gitconfig from paths: ['/home/quentin/.gitconfig', '/home/quentin/.config/git/config', '/etc/gitconfig']
[dulwich:dulwich.config] Successfully loaded gitconfig from: /home/quentin/.gitconfig
[dulwich:dulwich.config] Gitconfig file not found: /home/quentin/.config/git/config
[dulwich:dulwich.config] Gitconfig file not found: /etc/gitconfig
 1: Version solving took 1.634 seconds.
 1: Tried 1 solutions.

Stack trace:

28  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/cleo/application.py:327 in run
     325│ 
     326│             try:
   → 327│                 exit_code = self._run(io)
     328│             except BrokenPipeError:
     329│                 # If we are piped to another process, it may close early and send a

27  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/poetry/console/application.py:260 in _run
     258│ 
     259│             try:
   → 260│                 exit_code = super()._run(io)
     261│             except PoetryRuntimeError as e:
     262│                 io.write_error_line("")

26  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/cleo/application.py:431 in _run
     429│             io.input.interactive(interactive)
     430│ 
   → 431│         exit_code = self._run_command(command, io)
     432│         self._running_command = None
     433│ 

25  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/cleo/application.py:473 in _run_command
     471│ 
     472│         if error is not None:
   → 473│             raise error
     474│ 
     475│         return terminate_event.exit_code

24  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/cleo/application.py:457 in _run_command
     455│ 
     456│             if command_event.command_should_run():
   → 457│                 exit_code = command.run(io)
     458│             else:
     459│                 exit_code = ConsoleCommandEvent.RETURN_CODE_DISABLED

23  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/cleo/commands/base_command.py:117 in run
     115│         io.input.validate()
     116│ 
   → 117│         return self.execute(io) or 0
     118│ 
     119│     def merge_application_definition(self, merge_args: bool = True) -> None:

22  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/poetry/console/commands/installer_command.py:39 in execute
      37│     def execute(self, io: IO) -> int:
      38│         PoetryKeyring.preflight_check(io, self.poetry.config)
   →  39│         return super().execute(io)
      40│ 

21  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/cleo/commands/command.py:61 in execute
      59│ 
      60│         try:
   →  61│             return self.handle()
      62│         except KeyboardInterrupt:
      63│             return 1

20  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/poetry/console/commands/update.py:58 in handle
      56│         self.installer.update(True)
      57│ 
   →  58│         return self.installer.run()
      59│ 

19  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/poetry/installation/installer.py:103 in run
     101│             self.verbose(True)
     102│ 
   → 103│         return self._do_install()
     104│ 
     105│     def dry_run(self, dry_run: bool = True) -> Installer:

18  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/poetry/installation/installer.py:241 in _do_install
     239│                 source_root=self._env.path.joinpath("src")
     240│             ):
   → 241│                 solved_packages = solver.solve(
     242│                     use_latest=self._whitelist
     243│                 ).get_solved_packages()

17  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/poetry/puzzle/solver.py:87 in solve
      85│         with self._progress(), self._provider.use_latest_for(use_latest or []):
      86│             start = time.time()
   →  87│             packages = self._solve()
      88│             # simplify markers by removing redundant information
      89│             for transitive_info in packages.values():

16  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/poetry/puzzle/solver.py:170 in _solve
     168│ 
     169│         try:
   → 170│             result = resolve_version(self._package, self._provider)
     171│ 
     172│             packages = result.packages

15  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/poetry/mixology/__init__.py:18 in resolve_version
      16│     solver = VersionSolver(root, provider)
      17│ 
   →  18│     return solver.solve()
      19│ 

14  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/poetry/mixology/version_solver.py:192 in solve
     190│             while next is not None:
     191│                 self._propagate(next)
   → 192│                 next = self._choose_package_version()
     193│ 
     194│             return self._result()

13  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/poetry/mixology/version_solver.py:599 in _choose_package_version
     597│             package = locked
     598│ 
   → 599│         package = self._provider.complete_package(package)
     600│ 
     601│         conflict = False

12  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/poetry/puzzle/provider.py:577 in complete_package
      575│                     if locked is not None and locked.package.is_same_package_as(dep):
      576│                         continue
   →  577│                     self.search_for_direct_origin_dependency(dep)
      578│ 
      579│         dependencies = self._get_dependencies_with_overrides(_dependencies, package)

11  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/poetry/puzzle/provider.py:245 in search_for_direct_origin_dependency
      243│         elif dependency.is_vcs():
      244│             dependency = cast("VCSDependency", dependency)
   →  245│             package = self._search_for_vcs(dependency)
      246│ 
      247│         elif dependency.is_file():

10  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/poetry/puzzle/provider.py:320 in _search_for_vcs
      318│         and get the information we need by checking out the specified reference.
      319│         """
   →  320│         package = self._direct_origin.get_package_from_vcs(
      321│             dependency.vcs,
      322│             dependency.source,

 9  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/poetry/packages/direct_origin.py:116 in get_package_from_vcs
     114│             raise ValueError(f"Unsupported VCS dependency {vcs}")
     115│ 
   → 116│         return _get_package_from_git(
     117│             url=url,
     118│             branch=branch,

 8  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/poetry/packages/direct_origin.py:34 in _get_package_from_git
      32│     source_root: Path | None = None,
      33│ ) -> Package:
   →  34│     source = Git.clone(
      35│         url=url,
      36│         source_root=source_root,

 7  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/poetry/vcs/git/backend.py:540 in clone
     538│         try:
     539│             if not cls.is_using_legacy_client():
   → 540│                 local = cls._clone(url=url, refspec=refspec, target=target)
     541│                 cls._clone_submodules(repo=local)
     542│                 return local

 6  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/poetry/vcs/git/backend.py:318 in _clone
     316│             local = Repo(str(target))
     317│ 
   → 318│         remote_refs = cls._fetch_remote_refs(url=url, local=local)
     319│ 
     320│         logger.debug(

 5  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/poetry/vcs/git/backend.py:250 in _fetch_remote_refs
     248│ 
     249│         with local:
   → 250│             result: FetchPackResult = client.fetch(
     251│                 path,
     252│                 local,

 4  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/dulwich/client.py:1171 in fetch
     1169│             f, commit, abort = target.object_store.add_pack()
     1170│         try:
   → 1171│             result = self.fetch_pack(
     1172│                 path,
     1173│                 determine_wants,

 3  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/dulwich/client.py:1691 in fetch_pack
     1689│             elif filter_spec:
     1690│                 self._warn_filter_objects()
   → 1691│             (new_shallow, new_unshallow) = _handle_upload_pack_head(
     1692│                 proto,
     1693│                 list(negotiated_capabilities),

 2  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/dulwich/client.py:786 in _handle_upload_pack_head
      784│         proto.write_pkt_line(None)
      785│ 
   →  786│     have = next(graph_walker)
      787│     while have:
      788│         proto.write_pkt_line(COMMAND_HAVE + b" " + have + b"\n")

 1  ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/dulwich/object_store.py:2437 in next
     2435│             ret = self.heads.pop()
     2436│             try:
   → 2437│                 ps = self.get_parents(ret)
     2438│             except KeyError:
     2439│                 return None

AssertionError



at ~/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/dulwich/repo.py:392 in get_parents
     388│ 
     389│         # Fallback to reading the commit object
     390│         if commit is None:
     391│             obj = self.store[commit_id]
  →  392│             assert isinstance(obj, Commit)
     393│             commit = obj
     394│         parents = commit.parents
     395│         assert isinstance(parents, list)
     396│         return parents

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind/bugSomething isn't working as expectedstatus/triageThis issue needs to be triaged

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions