Skip to content

URL dependencies with refs are no longer supported #3701

@nyoxi

Description

@nyoxi

Describe the bug

Trying to use URL dependency on Git repository that references a branch does not work anymore and leads to UnpackError. I posted PR for unearth (frostming/unearth#171) that fixes the problem some time ago but this did not get any attention yet.

To reproduce

  1. pdm init
  2. pdm add "requests @ https://github.com/psf/requests@v2.31.1"

Expected Behavior

Dependency on URL referring to git branch can be added without issues.

Environment Information

PDM version:
  2.26.1
Python Interpreter:
  /tmp/tmp.N46OzhWJaa/.venv/bin/python (3.13)
Project Root:
  /tmp/tmp.N46OzhWJaa
Local Packages:
  /tmp/tmp.N46OzhWJaa/.venv/lib/python3.13/site-packages
{
  "implementation_name": "cpython",
  "implementation_version": "3.13.7",
  "os_name": "posix",
  "platform_machine": "x86_64",
  "platform_release": "6.17.8-arch1-1",
  "platform_system": "Linux",
  "platform_version": "#1 SMP PREEMPT_DYNAMIC Fri, 14 Nov 2025 06:54:20 +0000",
  "python_full_version": "3.13.7",
  "platform_python_implementation": "CPython",
  "python_version": "3.13",
  "sys_platform": "linux"
}

Verbose Command Output

Adding packages to default dependencies: requests @ git+https://github.com/psf/requests@v2.31.1
pdm.termui: ======== Start resolving requirements ========
pdm.termui:   requests @ git+https://github.com/psf/requests@v2.31.1
pdm.termui:   Adding requirement python==3.13.*
pdm.termui:   Adding requirement requests @ git+https://github.com/psf/requests@v2.31.1
pdm.termui: ======== Starting round 0 ========
unearth.vcs.git: Cloning https://github.com/psf/requests (revision: v2.31.1) to /tmp/pdm-build-q4tua741

Traceback (most recent call last):
  File "/sbin/pdm", line 8, in <module>
    sys.exit(main())
             ~~~~^^
  File "/usr/lib/python3.13/site-packages/pdm/core.py", line 391, in main
    return core.main(args or sys.argv[1:])
           ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/pdm/core.py", line 270, in main
    raise cast(Exception, err).with_traceback(traceback) from None
  File "/usr/lib/python3.13/site-packages/pdm/core.py", line 265, in main
    self.handle(project, options)
    ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/pdm/core.py", line 195, in handle
    command.handle(project, options)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/pdm/cli/commands/add.py", line 71, in handle
    self.do_add(
    ~~~~~~~~~~~^
        project,
        ^^^^^^^^
    ...<12 lines>...
        hooks=HookManager(project, options.skip),
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/lib/python3.13/site-packages/pdm/cli/commands/add.py", line 159, in do_add
    resolved = do_lock(
        project,
    ...<5 lines>...
        groups=lock_groups,
    )
  File "/usr/lib/python3.13/site-packages/pdm/cli/actions.py", line 141, in do_lock
    resolved, new_groups = resolver.resolve()
                           ~~~~~~~~~~~~~~~~^^
  File "/usr/lib/python3.13/site-packages/pdm/resolver/resolvelib.py", line 51, in resolve
    mapping = self._do_resolve()
  File "/usr/lib/python3.13/site-packages/pdm/resolver/resolvelib.py", line 89, in _do_resolve
    result = resolver.resolve(requirements, max_rounds)
  File "/usr/lib/python3.13/site-packages/resolvelib/resolvers/resolution.py", line 601, in resolve
    state = resolution.resolve(requirements, max_rounds=max_rounds)
  File "/usr/lib/python3.13/site-packages/resolvelib/resolvers/resolution.py", line 509, in resolve
    name = min(narrowed_unstatisfied_names, key=self._get_preference)
  File "/usr/lib/python3.13/site-packages/resolvelib/resolvers/resolution.py", line 182, in _get_preference
    return self._p.get_preference(
           ~~~~~~~~~~~~~~~~~~~~~~^
        identifier=name,
        ^^^^^^^^^^^^^^^^
    ...<9 lines>...
        backtrack_causes=self.state.backtrack_causes,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/lib/python3.13/site-packages/pdm/resolver/providers.py", line 116, in get_preference
    deps = self.get_dependencies(candidate)
  File "/usr/lib/python3.13/site-packages/pdm/resolver/providers.py", line 305, in get_dependencies
    deps, requires_python, _ = self._get_dependencies_from_repository(candidate)
                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/pdm/resolver/providers.py", line 426, in _get_dependencies_from_repository
    return super()._get_dependencies_from_repository(candidate)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/pdm/resolver/providers.py", line 299, in _get_dependencies_from_repository
    return self.repository.get_dependencies(candidate)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/pdm/models/repositories/base.py", line 101, in get_dependencies
    requirements, requires_python, summary = getter(candidate)
                                             ~~~~~~^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/pdm/models/repositories/base.py", line 40, in wrapper
    result = func(self, candidate)
  File "/usr/lib/python3.13/site-packages/pdm/models/repositories/base.py", line 269, in _get_dependencies_from_metadata
    deps = prepared.get_dependencies_from_metadata()
  File "/usr/lib/python3.13/site-packages/pdm/models/candidates.py", line 634, in get_dependencies_from_metadata
    return filter_requirements_with_extras(self.metadata.requires or [], extras)
                                           ^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/pdm/models/candidates.py", line 621, in metadata
    result = self.prepare_metadata()
  File "/usr/lib/python3.13/site-packages/pdm/models/candidates.py", line 512, in prepare_metadata
    self._unpack(validate_hashes=False)
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/pdm/models/candidates.py", line 480, in _unpack
    result = finder.download_and_unpack(
        self.link,
    ...<4 lines>...
        unpack_reporter=self.reporter.report_unpack,
    )
  File "/usr/lib/python3.13/site-packages/unearth/finder.py", line 452, in download_and_unpack
    file = unpack_link(
        self.session,
    ...<6 lines>...
        unpack_reporter=unpack_reporter,
    )
  File "/usr/lib/python3.13/site-packages/unearth/preparer.py", line 322, in unpack_link
    backend.fetch(link, location)
    ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/unearth/vcs/base.py", line 152, in fetch
    return self.fetch_new(location, url, rev, args)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/unearth/vcs/git.py", line 67, in fetch_new
    revision = self._resolve_revision(location, rev)
  File "/usr/lib/python3.13/site-packages/unearth/vcs/git.py", line 171, in _resolve_revision
    result = self.run_command(
        ["rev-parse", rev],
    ...<2 lines>...
        log_output=False,
    )
  File "/usr/lib/python3.13/site-packages/unearth/vcs/base.py", line 78, in run_command
    raise UnpackError(e.output) from None
unearth.errors.UnpackError: v2.31.1

Additional Context

No response

Are you willing to submit a PR to fix this bug?

  • Yes, I would like to submit a PR.

Metadata

Metadata

Assignees

No one assigned

    Labels

    🐛 bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions