Skip to main content

No project description provided

Project description

git-pypi

PyPI - Version PyPI - Python Version


Table of Contents

Overview

git-pypi provides a pip-compatible package index server that serves packages based on the contents of a git repository. The server implements a subset of Simple Repository API.

It is meant to be used in a monorepo scenario, where some packages housed in the repository depend on others. When using git-pypi as the package index, one can avoid specifying git package URIs explicitly.

The packages are indexed based on git tags. The service makes the following assumptions about the git repository:

  • tags adhere to the following format: <package-name>/v<package-version>,
  • tags are accurate w.r.t. the actual package versions they represent,
  • the repository layout is flat, e.g:
.
├── package-a/
│   ├── pyproject.toml
│   └── [...]
├── package-b/
│   ├── pyproject.toml
│   └── [...]
└── [...]

Only serving source distributions is supported at this time.

When a specific package (e.g. package_a-1.2.3.tar.gz) is requested by pip, and the artifact is not already cached, the server will perform the following operations:

  1. Check out the package directory tree (and, optionally, additional trees as dictated by the server config) at the given tag (e.g. package-a/v1.2.3) to a temporary build directory.
  2. Run the build command in the temporary build directory.
  3. Copy the package artifact to the cache.
  4. Remove the temporary build directory.
  5. Return a HTTP 200 response containing the package contents.

Subsequent requests for the same package will use the cached version. Cached items are keyed by the SHA1 of the commit, so re-tagging a commit will cause the package to be built again (NB: your package manager of choice is probably doing its own caching - something to watch out when re-tagging releases). Cache is persistent between server runs.

If a suitable config option is set, git-pypi shall also serve packages directly from a predefined directory. This can be used to vendor-in some Python dependencies in the repository. In the unlikely case of a naming conflict between "git" and "vendored" packages, the former take precedence.

Installation

pipx install git-pypi

Usage

After installation, git-pypi provides the following CLI scripts.

git-pypi-configure

Generates a default git-pypi configuration file.

$ git-pypi-configure -h

usage: git-pypi-configure [-h] [--config CONFIG] [--force]

Generate a default git-pypi configuration file.

options:
  -h, --help            show this help message and exit
  --config CONFIG, -c CONFIG
                        Config file path.
  --force, -f           Overwrite existing file.

git-pypi-run

Runs the git-pypi server.

$ git-pypi-run -h

usage: git-pypi-run [-h] [--git-repo GIT_REPO] [--host HOST] [--port PORT] [--config CONFIG] [--clear-cache] [--debug]

Run the git-pypi server.

options:
  -h, --help            show this help message and exit
  --git-repo GIT_REPO, -r GIT_REPO
                        Git repository path.
  --host HOST, -H HOST  Server host
  --port PORT, -p PORT  Server port
  --config CONFIG, -c CONFIG
                        Config file path.
  --clear-cache         Clear the package cache prior to starting.
  --debug               Enable debug logging.

Configuration

By default, git-pypi-run will attempt to read a configuration file from ~/.git-pypi/config.toml. Should the file be missing, a default configuration shall be used. The config file location can be overridden by using -c flag.

Sample configuration file:

# Directory where package artifacts can be found.
package-artifacts-dir-path = "dist"

# Cache directory location.
cached-artifacts-dir-path = "~/.git-pypi/cache/artifacts"

# The sdist package build command.
build-command = ["make", "build"]

# Extra trees to check out for building (besides the requested package).
# extra_checkout_paths = [".makefiles"]

# Fallback index URL used if a package cannot be found. Leave empty or null to
# disable the additional lookup.
fallback-index-url = "https://pypi.python.org/simple"

# A directory containing vendored packages, relative to the repository root.
# Set to null to disable looking up packages in the local dir.
local-packages-dir-path = "vendor"

[server]
host = "127.0.0.1"
port = 60100
threads = 4
timeout = 300

Example Repository Layout

Below is an example monorepository layout that works well with git-pypi.

.
├── package-a/
│   ├── Makefile
│   ├── pyproject.toml
│   ├── src/
│   └── [...]
├── package-b/
│   ├── Makefile
│   ├── pyproject.toml
│   ├── src/
│   └── [...]
├── package-c/
│   ├── Makefile
│   ├── pyproject.toml
│   ├── src/
│   └── [...]
├── vendor/
│   ├── vendored_dep_a-3.0.0-py3-any.whl
│   ├── vendored_dep_b-0.1.1.tar.gz
│   └── vendored_dep_b-0.2.0.tar.gz
├── .config/
│   └── git-pypi.toml
├── Makefile
└── [...]

Development

A makefile codifying several common tasks is available for developer's conevenience.

make fmt                    # format the code
make check                  # run static checks
make test                   # run tests
make test-update-snapshots  # run tests and update snapshots
make build                  # build a package

License

git-pypi is distributed under the terms of the MIT license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

git_pypi-0.4.0.tar.gz (30.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

git_pypi-0.4.0-py3-none-any.whl (15.7 kB view details)

Uploaded Python 3

File details

Details for the file git_pypi-0.4.0.tar.gz.

File metadata

  • Download URL: git_pypi-0.4.0.tar.gz
  • Upload date:
  • Size: 30.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.27.0

File hashes

Hashes for git_pypi-0.4.0.tar.gz
Algorithm Hash digest
SHA256 6251fc967c0bc5ec11d0ff0db21057a34d4a1aed7f4f7ba60da764b5ddeda4a1
MD5 c5b8dc5f8258a05a391c9a9c1dcd1e33
BLAKE2b-256 2cee56becd0bb0aecc55758f30ff3aacb6301dda86cda377565c32cab488d069

See more details on using hashes here.

File details

Details for the file git_pypi-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: git_pypi-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 15.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.27.0

File hashes

Hashes for git_pypi-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9fba7187cd229d45c090549f787793a1849ccc2b089aa5e331b204207673b3f6
MD5 69763eacff6c24daad198ec25c6a1b88
BLAKE2b-256 a88a57342696c47d54fe5090ef6d74bec50e02bbfc03e398412cfe56b659f493

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page