Metadata-Version: 2.4
Name: dfetch
Version: 0.11.0
Summary: A vendoring tool for fetching and managing external dependencies.
Author-email: Ben Spoor <dfetch@spoor.cc>
License-Expression: MIT
Project-URL: Homepage, https://dfetch-org.github.io/
Project-URL: Documentation, https://dfetch.readthedocs.io/
Project-URL: Repository, https://github.com/dfetch-org/dfetch
Project-URL: Issues, https://github.com/dfetch-org/dfetch/issues
Project-URL: Changelog, https://github.com/dfetch-org/dfetch/blob/main/CHANGELOG.rst
Keywords: dfetch,dependency management,embedded development,fetch tool,vendoring,multi-repo,dependencies,git,svn,package manager,multi-project,monorepo
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: PyYAML==6.0.3
Requires-Dist: coloredlogs==15.0.1
Requires-Dist: pykwalify==1.8.0
Requires-Dist: halo==0.0.31
Requires-Dist: colorama==0.4.6
Requires-Dist: typing-extensions==4.15.0
Requires-Dist: tldextract==5.3.0
Requires-Dist: sarif-om==1.0.4
Requires-Dist: semver==3.0.4
Requires-Dist: patch-ng==1.19.0
Requires-Dist: cyclonedx-python-lib==11.6.0
Requires-Dist: infer-license==0.1.0; python_version <= "3.10.0"
Requires-Dist: infer-license==0.2.0; python_version > "3.10.0"
Requires-Dist: setuptools; python_version >= "3.12"
Provides-Extra: development
Requires-Dist: black==25.11.0; extra == "development"
Requires-Dist: doc8==1.1.2; extra == "development"
Requires-Dist: pydocstyle==6.3.0; extra == "development"
Requires-Dist: radon==6.0.1; extra == "development"
Requires-Dist: xenon==0.9.3; extra == "development"
Requires-Dist: types-PyYAML==6.0.12.20250915; extra == "development"
Requires-Dist: codespell==2.4.1; extra == "development"
Requires-Dist: mypy==1.19.1; extra == "development"
Requires-Dist: bandit==1.8.6; extra == "development"
Requires-Dist: vulture==2.14; extra == "development"
Requires-Dist: pyroma==5.0.1; extra == "development"
Requires-Dist: isort==6.1.0; extra == "development"
Requires-Dist: pylint==3.3.9; extra == "development"
Requires-Dist: pyright==1.1.407; extra == "development"
Requires-Dist: pyupgrade==3.21.0; extra == "development"
Requires-Dist: tomli; python_version < "3.11" and extra == "development"
Requires-Dist: pre-commit==4.3.0; extra == "development"
Requires-Dist: ruff==0.14.10; extra == "development"
Provides-Extra: docs
Requires-Dist: sphinx==8.2.3; extra == "docs"
Requires-Dist: sphinx-argparse==0.5.2; extra == "docs"
Requires-Dist: plantweb==1.3.0; extra == "docs"
Requires-Dist: sphinx_design==0.6.1; extra == "docs"
Requires-Dist: sphinxcontrib-details-directive==0.1.0; extra == "docs"
Requires-Dist: sphinx-sitemap==2.9.0; extra == "docs"
Requires-Dist: sphinx-jsonschema==1.19.2; extra == "docs"
Requires-Dist: sphinxcontrib-programoutput==0.18; extra == "docs"
Requires-Dist: sphinx-tabs==3.4.7; extra == "docs"
Requires-Dist: sphinx-autoissues==0.0.1; extra == "docs"
Provides-Extra: test
Requires-Dist: pytest==8.4.2; extra == "test"
Requires-Dist: pytest-cov==7.0.0; extra == "test"
Requires-Dist: behave==1.3.3; extra == "test"
Provides-Extra: casts
Requires-Dist: asciinema==2.4.0; extra == "casts"
Provides-Extra: build
Requires-Dist: nuitka==2.8.9; extra == "build"
Requires-Dist: tomli; python_version < "3.11" and extra == "build"
Requires-Dist: setuptools-scm==9.2.2; extra == "build"
Provides-Extra: sbom
Requires-Dist: cyclonedx-bom==7.2.1; extra == "sbom"
Dynamic: license-file

![](doc/images/dfetch_header.png)
[![](https://codescene.io/projects/10989/status-badges/code-health)](https://codescene.io/projects/10989)
[![](https://codescene.io/projects/10989/status-badges/system-mastery)](https://codescene.io/projects/10989)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/431474d43db0420a92ebc10c1886df8d)](https://app.codacy.com/gh/dfetch-org/dfetch?utm_source=github.com&utm_medium=referral&utm_content=dfetch-org/dfetch&utm_campaign=Badge_Grade)
[![Codacy Badge](https://app.codacy.com/project/badge/Coverage/503c21c8e46b4baca0b4519bcc9fd51e)](https://www.codacy.com/gh/dfetch-org/dfetch/dashboard?utm_source=github.com&utm_medium=referral&utm_content=dfetch-org/dfetch&utm_campaign=Badge_Coverage)
[![Documentation Status](https://readthedocs.org/projects/dfetch/badge/?version=latest)](https://dfetch.readthedocs.io/en/latest/?badge=latest)
[![Build](https://github.com/dfetch-org/dfetch/workflows/Test/badge.svg)](https://github.com/dfetch-org/dfetch/actions)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![GitHub](https://img.shields.io/github/license/dfetch-org/dfetch)](https://github.com/dfetch-org/dfetch/blob/main/LICENSE)
[![Gitter](https://badges.gitter.im/dfetch-org/community.svg)](https://gitter.im/dfetch-org/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
[![Libraries.io dependency status for GitHub repo](https://img.shields.io/librariesio/github/dfetch-org/dfetch)](https://libraries.io/github/dfetch-org/dfetch)
![Maintenance](https://img.shields.io/maintenance/yes/2026)
[![GitHub issues](https://img.shields.io/github/issues/dfetch-org/dfetch)](https://github.com/dfetch-org/dfetch/issues)
![PyPI - Python Version](https://img.shields.io/pypi/pyversions/dfetch)
[![PyPI](https://img.shields.io/pypi/v/dfetch)](https://pypi.org/project/dfetch/)
[![Contribute with Codespaces](https://img.shields.io/static/v1?label=Codespaces&message=Open&color=blue)](https://codespaces.new/dfetch-org/dfetch)
[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/11245/badge)](https://www.bestpractices.dev/projects/11245)


**DFetch can manage dependencies**

We make products that can last 15+ years; because of this we want to be able to have all sources available
to build the entire project from source without depending on external resources.
For this, we needed a dependency manager that was flexible enough to retrieve dependencies as plain text
from various sources. `svn externals`, `git submodules` and `git subtrees` solve a similar
problem, but not in a VCS-agnostic way or completely user-friendly way.
We want self-contained code repositories without any hassle for end-users.
Dfetch must promote upstreaming changes, but allow for local customizations.
The problem is described thoroughly in [managing external dependencies](https://embeddedartistry.com/blog/2020/06/22/qa-on-managing-external-dependencies/) and sometimes
is also known as [*vendoring*](https://dfetch.readthedocs.io/en/latest/vendoring.html).

Other tools that do similar things are ``Zephyr's West``, ``CMake ExternalProject`` and other meta tools.
See [alternatives](https://dfetch.readthedocs.io/en/latest/alternatives.html) for a complete list.

[**Getting started**](https://dfetch.readthedocs.io/en/latest/getting_started.html) |
[**Manual**](https://dfetch.readthedocs.io/en/latest/manual.html) |
[**Troubleshooting**](https://dfetch.readthedocs.io/en/latest/troubleshooting.html)  |
[**Contributing**](https://dfetch.readthedocs.io/en/latest/contributing.html)

## Install

### Stable

```bash
pip install dfetch
```

### latest version

```bash
pip install git+https://github.com/dfetch-org/dfetch.git#egg=dfetch
```

### Binary distributions

Each release on the [releases page](https://github.com/dfetch-org/dfetch/releases) provides installers for all major platforms.

- Linux `.deb` & `.rpm`
- macOS `.pkg`
- Windows `.msi`

## Github Action

You can use DFetch in your Github Actions workflow to check your dependencies.
The results will be uploaded to Github. Add the following to your workflow file:

```yaml
jobs:
  dfetch-check:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      security-events: write
    steps:
      - name: Run Dfetch Check
        uses: dfetch-org/dfetch@main
        with:
          working-directory: '.' # optional, defaults to project root
```
