diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..cd1662a --- /dev/null +++ b/.flake8 @@ -0,0 +1,3 @@ +[flake8] +max-line-length = 100 +max-doc-length = 100 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..8611f0b --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,22 @@ +name: flake8 + +on: [push, pull_request] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.9' + - name: Install dependencies + run: | + python -m pip install --upgrade pip + if [ -f requirements-test.txt ]; then pip install -r requirements-test.txt; fi + - name: Make lint + run: | + make lint diff --git a/.isort.cfg b/.isort.cfg new file mode 100644 index 0000000..b110a6b --- /dev/null +++ b/.isort.cfg @@ -0,0 +1,2 @@ +[settings] +force_single_line=True diff --git a/Makefile b/Makefile index 5a71588..4d76d9e 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,17 @@ index.html : README.md static/skeleton.css static/box.svg static/template.html pandoc -s README.md -o index.html -c static/skeleton.css --template static/template.html -T mkrepo +.PHONY: lint +lint: flake8 isort + +.PHONY: flake8 +flake8: + flake8 . + +.PHONY: isort +isort: + isort . -c + test : PYTHONPATH=$(PWD)/test python -m unittest discover -v diff --git a/debrepo.py b/debrepo.py index 695a353..e649669 100755 --- a/debrepo.py +++ b/debrepo.py @@ -1,19 +1,20 @@ #!/usr/bin/env python +import bz2 import collections -import mimetypes +import datetime +import email import gzip -import bz2 -import subprocess -import re +import hashlib +import mimetypes import os +import re +import subprocess +import sys import tempfile -from io import BytesIO -import hashlib import time -import datetime -import email -import sys +from io import BytesIO + def file_checksum(file_name, checksum_type): h = hashlib.new(checksum_type) @@ -139,7 +140,7 @@ def __eq__(self, other): other.fields['Version'])) def __ne__(self, other): - return not(self == other) + return not (self == other) class Package(IndexUnit): @@ -471,8 +472,11 @@ def split_control_file_path(path, ctrl_type): # The package management system will break the version number apart at the last hyphen # in the string (if there is one) to determine the upstream_version and debian_revision. # The absence of a debian_revision is equivalent to a debian_revision of 0. - expr2 = r'^(?P[a-z0-9][-a-z0-9.+]+)_(?P[a-zA-Z0-9.+:~]+)'\ - r'_(?P[^\.]+)\.deb$' + expr2 = ( + r'^(?P[a-z0-9][-a-z0-9.+]+)_' + r'(?P[a-zA-Z0-9.+:~]+)_' + r'(?P[^\.]+)\.deb$' + ) match_package = re.match(expr2, os.path.basename(path)) if not match_package: @@ -526,7 +530,7 @@ def process_index_file(repo_info, path, dist, component, arch, index_type): elif index_type == 'sources': index = SourceIndex() else: - raise(RuntimeError('Unknown index type: ' + index_type)) + raise RuntimeError('Unknown index type: ' + index_type) index.parse_string(repo_info.storage.read_file(path).decode('utf-8')) if index_type == 'packages': @@ -641,7 +645,7 @@ def process_index_units(repo_info, tempdir, index_type, force=False): expr = r'^.*\.dsc$' tmp_filename = 'source.dsc' else: - raise(RuntimeError('Unknown index type: ' + index_type)) + raise RuntimeError('Unknown index type: ' + index_type) mtimes = get_mtimes(index_list) tmpdir = tempfile.mkdtemp('', 'tmp', tempdir) @@ -736,7 +740,7 @@ def update_index_files(repo_info, index_type): index_filename = 'Sources' index_list = repo_info.source_index_list else: - raise(RuntimeError('Unknown index type: ' + index_type)) + raise RuntimeError('Unknown index type: ' + index_type) for key in index_list: dist, component, arch = key @@ -806,8 +810,7 @@ def update_release_files(repo_info, sign): release['Date'] = creation_date release['Architectures'] = ' '.join(repo_info.architectures[dist]) release['Components'] = ' '.join(repo_info.components[dist]) - release['Description'] = os.getenv('MKREPO_DEB_DESCRIPTION')\ - or 'Repo generator' + release['Description'] = os.getenv('MKREPO_DEB_DESCRIPTION') or 'Repo generator' checksum_lines = collections.defaultdict(list) checksum_names = {'md5': 'MD5Sum', 'sha1': 'SHA1', 'sha256': 'SHA256'} @@ -826,7 +829,7 @@ def update_release_files(repo_info, sign): release_str = release.dump_string() repo_info.storage.write_file('dists/%s/Release' % dist, - release_str.encode('utf-8')) + release_str.encode('utf-8')) if sign: sign_release_file(repo_info.storage, release_str, dist) diff --git a/mkrepo b/mkrepo index 65f0eec..eb3be9d 100755 --- a/mkrepo +++ b/mkrepo @@ -1,4 +1,5 @@ #!/usr/bin/env python import mkrepo -mkrepo.main() \ No newline at end of file + +mkrepo.main() diff --git a/mkrepo.py b/mkrepo.py index b256389..33b387e 100755 --- a/mkrepo.py +++ b/mkrepo.py @@ -1,10 +1,11 @@ #!/usr/bin/env python import argparse -import storage +import os + import debrepo import rpmrepo -import os +import storage def is_deb_repo(stor): diff --git a/requirements-test.txt b/requirements-test.txt new file mode 100644 index 0000000..217f358 --- /dev/null +++ b/requirements-test.txt @@ -0,0 +1,2 @@ +flake8>=3.7.9 +isort>=5.9.3 \ No newline at end of file diff --git a/rpmrepo.py b/rpmrepo.py index 742be1b..03e60da 100755 --- a/rpmrepo.py +++ b/rpmrepo.py @@ -1,25 +1,21 @@ #!/usr/bin/env python +import datetime +import gzip +import hashlib import os -import sys import re - +import shutil import subprocess +import sys import tempfile -import shutil -import storage -import gzip -from io import BytesIO -import rpmfile -import hashlib -import json -import itertools - -import datetime import time - +from io import BytesIO from xml.sax.saxutils import escape +import rpmfile +import storage + try: import xml.etree.cElementTree as ET except ImportError: @@ -98,13 +94,16 @@ def gpg_sign_string(data, keyname=None, inline=False): def sign_metadata(repomdfile): - """Requires a proper ~/.rpmmacros file. See """ + """Requires a proper ~/.rpmmacros file. + + See + """ cmd = ["gpg", "--detach-sign", "--armor", "--digest-algo SHA256", repomdfile] try: subprocess.check_call(cmd) - print ("Successfully signed repository metadata file") - except subprocess.CalledProcessError as e: - print ("Unable to sign repository metadata '%s'" % (repomdfile)) + print("Successfully signed repository metadata file") + except subprocess.CalledProcessError: + print("Unable to sign repository metadata '%s'" % repomdfile) exit(1) @@ -439,8 +438,11 @@ def dump_primary(primary): res = "" res += '\n' - res += '\n' % len( - primary) + res += ( + '\n' % len(primary) + ) for package in primary.values(): res += '\n' @@ -453,8 +455,8 @@ def dump_primary(primary): for c in ['epoch', 'ver', 'rel'] if ver[c]]) res += '%s/>\n' % components - res += ' %s\n' % \ - package['checksum'] + res += ' %s\n' % ( + package['checksum']) res += ' %s\n' % escape(package['summary'] or '') res += ' %s\n' % escape( @@ -546,7 +548,7 @@ def parse_ver_str(ver_str): epoch = match.group(1)[:-1] if match.group(1) else "0" ver = match.group(2) rel = match.group(3)[1:] if match.group(3) else None - return (epoch, ver, rel) + return epoch, ver, rel def header_to_other(header, sha256): @@ -897,13 +899,17 @@ def generate_repomd(filelists_str, filelists_gz, res = "" res += '\n' - res += '\n' + res += ( + '\n' + ) res += ' %s\n' % revision res += ' \n' res += ' %s\n' % filelists_gz_sha256 - res += ' %s\n' % filelists_str_sha256 + res += ' %s\n' % ( + filelists_str_sha256) res += ' \n' % filelists_name res += ' %s\n' % int(nowtimestamp) res += ' %s\n' % len(filelists_gz) @@ -912,7 +918,8 @@ def generate_repomd(filelists_str, filelists_gz, res += ' \n' res += ' %s\n' % primary_gz_sha256 - res += ' %s\n' % primary_str_sha256 + res += ' %s\n' % ( + primary_str_sha256) res += ' \n' % primary_name res += ' %s\n' % int(nowtimestamp) res += ' %s\n' % len(primary_gz) diff --git a/setup.py b/setup.py index 3ea26cf..95f51a2 100755 --- a/setup.py +++ b/setup.py @@ -1,5 +1,6 @@ #!/usr/bin/env python from distutils.core import setup + setup( name='mkrepo', packages=[''], diff --git a/storage.py b/storage.py index 95f0895..62eac0f 100755 --- a/storage.py +++ b/storage.py @@ -1,12 +1,13 @@ #!/usr/bin/env python -import os import errno +import os import shutil +import time import urllib -import boto3 from io import BytesIO -import time + +import boto3 class Storage: diff --git a/test/dummy_storage.py b/test/dummy_storage.py index 6f4ec00..601d32e 100755 --- a/test/dummy_storage.py +++ b/test/dummy_storage.py @@ -1,5 +1,5 @@ -from io import BytesIO import time +from io import BytesIO from storage import Storage diff --git a/test/test_debrepo.py b/test/test_debrepo.py index 99c8f2e..315ef0c 100755 --- a/test/test_debrepo.py +++ b/test/test_debrepo.py @@ -1,11 +1,11 @@ #!/usr/bin/env python3 import os -import sys import unittest import debrepo + class TestVersionParsing(unittest.TestCase): def test_versions(self): versions = [ diff --git a/test/test_dummy_storage.py b/test/test_dummy_storage.py index 4588575..7cca4c4 100755 --- a/test/test_dummy_storage.py +++ b/test/test_dummy_storage.py @@ -1,9 +1,8 @@ -import os -import sys import unittest from dummy_storage import DummyStorage + class TestDummyStorage(unittest.TestCase): def test_base_functionality(self): """Tests the basic functionality of DummyStorage.""" diff --git a/test/test_rpmrepo.py b/test/test_rpmrepo.py index 0a5762f..1cb16d3 100755 --- a/test/test_rpmrepo.py +++ b/test/test_rpmrepo.py @@ -1,6 +1,7 @@ import unittest from dummy_storage import DummyStorage + import rpmrepo @@ -11,19 +12,36 @@ def test_work_with_missing_metafiles(self): """ repomd_data = '' repomd_data += '\n' - repomd_data += '\n' + repomd_data += ('\n') repomd_data += ' 1\n' repomd_data += ' \n' - repomd_data += ' 7aaefa796605c6c6e0ca699ef5a3b1120207d291e47341dcae3fde824b368719\n' - repomd_data += ' 74fed1d15e4bfe14aa354d8f91ea339bebc5e4a6bf748087807ef22a68e08d2c\n' + repomd_data += ( + ' ' + '7aaefa796605c6c6e0ca699ef5a3b1120207d291e47341dcae3fde824b368719' + '\n' + ) + repomd_data += ( + ' ' + '74fed1d15e4bfe14aa354d8f91ea339bebc5e4a6bf748087807ef22a68e08d2c' + '\n' + ) repomd_data += ' \n' repomd_data += ' 1633360840\n' repomd_data += ' 341\n' repomd_data += ' 832\n' repomd_data += ' \n' repomd_data += ' \n' - repomd_data += ' ab110cb17fefe3d6db446c5707c725c18ae086dd55ca82ea160912f821f58715\n' - repomd_data += ' b2387880960bca7f74937484dab6eff71d24090cff61739a88a01b5037fac4a8\n' + repomd_data += ( + ' ' + 'ab110cb17fefe3d6db446c5707c725c18ae086dd55ca82ea160912f821f58715' + '\n' + ) + repomd_data += ( + ' ' + 'b2387880960bca7f74937484dab6eff71d24090cff61739a88a01b5037fac4a8' + '\n' + ) repomd_data += ' \n' repomd_data += ' 1633360840\n' repomd_data += ' 641\n' @@ -49,7 +67,8 @@ def test_work_with_missing_information_about_metafiles(self): """ repomd_data = '' repomd_data += '\n' - repomd_data += '\n' + repomd_data += ('\n') repomd_data += ' 1\n' repomd_data += '\n'