diff --git a/.github/workflows/pythonpackage.yml b/.github/workflows/pythonpackage.yml
index 14e72afa..bb19e378 100644
--- a/.github/workflows/pythonpackage.yml
+++ b/.github/workflows/pythonpackage.yml
@@ -1,57 +1,57 @@
name: Python package
on: [push, pull_request]
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
- python-version: [3.5, 3.6, 3.7, 3.8, pypy3]
+ python-version: [3.5, 3.6, 3.7, 3.8, 3.9, pypy3]
exclude:
# sqlite3 exit handling seems to get in the way
- os: macos-latest
python-version: pypy3
# doesn't support passing in bytestrings to os.scandir
- os: windows-latest
python-version: pypy3
# path encoding
- os: windows-latest
python-version: 3.5
# path encoding
- os: macos-latest
python-version: 3.5
fail-fast: false
steps:
- uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -U pip coverage codecov flake8 fastimport
- name: Install mypy
run: |
pip install -U mypy
if: "matrix.python-version != 'pypy3'"
- name: Style checks
run: |
python -m flake8
- name: Typing checks
run: |
python -m mypy dulwich
if: "matrix.python-version != 'pypy3'"
- name: Build
run: |
python setup.py build_ext -i
- name: Coverage test suite run
run: |
python -m coverage run -p -m unittest dulwich.tests.test_suite
- name: Upload coverage details
run: |
codecov
diff --git a/README.rst b/README.rst
index 9903c191..0c3e1fa6 100644
--- a/README.rst
+++ b/README.rst
@@ -1,92 +1,92 @@
This is the Dulwich project.
It aims to provide an interface to git repos (both local and remote) that
doesn't call out to git directly but instead uses pure Python.
**Main website**:
**License**: Apache License, version 2 or GNU General Public License, version 2 or later.
The project is named after the part of London that Mr. and Mrs. Git live in
in the particular Monty Python sketch.
Installation
------------
By default, Dulwich' setup.py will attempt to build and install the optional C
extensions. The reason for this is that they significantly improve the performance
since some low-level operations that are executed often are much slower in CPython.
If you don't want to install the C bindings, specify the --pure argument to setup.py::
$ python setup.py --pure install
or if you are installing from pip::
$ pip install dulwich --global-option="--pure"
Note that you can also specify --global-option in a
`requirements.txt `_
file, e.g. like this::
dulwich --global-option=--pure
Getting started
---------------
Dulwich comes with both a lower-level API and higher-level plumbing ("porcelain").
For example, to use the lower level API to access the commit message of the
last commit::
>>> from dulwich.repo import Repo
>>> r = Repo('.')
>>> r.head()
'57fbe010446356833a6ad1600059d80b1e731e15'
>>> c = r[r.head()]
>>> c
>>> c.message
'Add note about encoding.\n'
And to print it using porcelain::
>>> from dulwich import porcelain
>>> porcelain.log('.', max_entries=1)
--------------------------------------------------
commit: 57fbe010446356833a6ad1600059d80b1e731e15
Author: Jelmer Vernooij
Date: Sat Apr 29 2017 23:57:34 +0000
Add note about encoding.
Further documentation
---------------------
The dulwich documentation can be found in docs/ and built by running ``make
doc``. It can also be found `on the web `_.
Help
----
There is a *#dulwich* IRC channel on the `Freenode `_, and
`dulwich-announce `_
and `dulwich-discuss `_
mailing lists.
Contributing
------------
For a full list of contributors, see the git logs or `AUTHORS `_.
If you'd like to contribute to Dulwich, see the `CONTRIBUTING `_
file and `list of open issues `_.
Supported versions of Python
----------------------------
-At the moment, Dulwich supports (and is tested on) CPython 3.5, 3.6,
-3.7, 3.8 and Pypy.
+At the moment, Dulwich supports (and is tested on) CPython 3.5 and later and
+Pypy.
The latest release series to support Python 2.x was the 0.19 series. See
the 0.19 branch in the Dulwich git repository.
diff --git a/setup.py b/setup.py
index 7426379c..ac1fd303 100755
--- a/setup.py
+++ b/setup.py
@@ -1,134 +1,135 @@
#!/usr/bin/python3
# encoding: utf-8
# Setup file for dulwich
# Copyright (C) 2008-2016 Jelmer Vernooij
try:
from setuptools import setup, Extension
except ImportError:
from distutils.core import setup, Extension
has_setuptools = False
else:
has_setuptools = True
from distutils.core import Distribution
import io
import os
import sys
from typing import Dict, Any
if sys.version_info < (3, 5):
raise Exception(
'Dulwich only supports Python 3.5 and later. '
'For 2.7 support, please install a version prior to 0.20')
dulwich_version_string = '0.20.6'
class DulwichDistribution(Distribution):
def is_pure(self):
if self.pure:
return True
def has_ext_modules(self):
return not self.pure
global_options = Distribution.global_options + [
('pure', None, "use pure Python code instead of C "
"extensions (slower on CPython)")]
pure = False
if sys.platform == 'darwin' and os.path.exists('/usr/bin/xcodebuild'):
# XCode 4.0 dropped support for ppc architecture, which is hardcoded in
# distutils.sysconfig
import subprocess
p = subprocess.Popen(
['/usr/bin/xcodebuild', '-version'], stdout=subprocess.PIPE,
stderr=subprocess.PIPE, env={})
out, err = p.communicate()
for line in out.splitlines():
line = line.decode("utf8")
# Also parse only first digit, because 3.2.1 can't be parsed nicely
if (line.startswith('Xcode') and
int(line.split()[1].split('.')[0]) >= 4):
os.environ['ARCHFLAGS'] = ''
tests_require = ['fastimport']
if '__pypy__' not in sys.modules and not sys.platform == 'win32':
tests_require.extend([
'gevent', 'geventhttpclient', 'mock', 'setuptools>=17.1'])
ext_modules = [
Extension('dulwich._objects', ['dulwich/_objects.c']),
Extension('dulwich._pack', ['dulwich/_pack.c']),
Extension('dulwich._diff_tree', ['dulwich/_diff_tree.c']),
]
setup_kwargs = {} # type: Dict[str, Any]
scripts = ['bin/dul-receive-pack', 'bin/dul-upload-pack']
if has_setuptools:
setup_kwargs['extras_require'] = {
'fastimport': ['fastimport'],
'https': ['urllib3[secure]>=1.24.1'],
'pgp': ['gpg'],
'watch': ['pyinotify'],
}
setup_kwargs['install_requires'] = ['urllib3>=1.24.1', 'certifi']
setup_kwargs['include_package_data'] = True
setup_kwargs['test_suite'] = 'dulwich.tests.test_suite'
setup_kwargs['tests_require'] = tests_require
setup_kwargs['entry_points'] = {
"console_scripts": [
"dulwich=dulwich.cli:main",
]}
setup_kwargs['python_requires'] = '>=3.5'
else:
scripts.append('bin/dulwich')
with io.open(os.path.join(os.path.dirname(__file__), "README.rst"),
encoding="utf-8") as f:
description = f.read()
setup(name='dulwich',
author="Jelmer Vernooij",
author_email="jelmer@jelmer.uk",
url="https://www.dulwich.io/",
long_description=description,
description="Python Git Library",
version=dulwich_version_string,
license='Apachev2 or later or GPLv2',
project_urls={
"Bug Tracker": "https://github.com/dulwich/dulwich/issues",
"Repository": "https://www.dulwich.io/code/",
"GitHub": "https://github.com/dulwich/dulwich",
},
keywords="git vcs",
packages=['dulwich', 'dulwich.tests', 'dulwich.tests.compat',
'dulwich.contrib'],
package_data={'': ['../docs/tutorial/*.txt']},
scripts=scripts,
ext_modules=ext_modules,
distclass=DulwichDistribution,
classifiers=[
'Development Status :: 4 - Beta',
'License :: OSI Approved :: Apache Software License',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: Implementation :: CPython',
'Programming Language :: Python :: Implementation :: PyPy',
'Operating System :: POSIX',
'Operating System :: Microsoft :: Windows',
'Topic :: Software Development :: Version Control',
],
**setup_kwargs
)