add changelog feature and add integration test for it

This commit is contained in:
Jörg Thalheim 2022-11-14 14:50:53 +01:00
parent 4dbc76a572
commit 570a6ac64b
5 changed files with 65 additions and 31 deletions

View File

@ -5,7 +5,7 @@ import tempfile
from typing import NoReturn, Optional
from .version.version import VersionPreference
from .eval import Package
from .eval import Package, eval_attr
from .options import Options
from .update import update
from .utils import run
@ -16,8 +16,8 @@ def die(msg: str) -> NoReturn:
sys.exit(1)
def parse_args() -> Options:
parser = argparse.ArgumentParser()
def parse_args(args: list[str]) -> Options:
parser = argparse.ArgumentParser(prog=args[0])
help = "File to import rather than default.nix. Examples, ./release.nix"
parser.add_argument("-f", "--file", default="./.", help=help)
parser.add_argument("--build", action="store_true", help="build the package")
@ -60,22 +60,22 @@ def parse_args() -> Options:
default=None,
)
parser.add_argument("attribute", help="Attribute name within the file evaluated")
args = parser.parse_args()
a = parser.parse_args(args)
return Options(
import_path=args.file,
build=args.build,
commit=args.commit,
write_commit_message=args.write_commit_message,
run=args.run,
shell=args.shell,
version=args.version,
version_preference=VersionPreference.from_str(args.version),
attribute=args.attribute,
test=args.test,
version_regex=args.version_regex,
review=args.review,
format=args.format,
override_filename=args.override_filename,
import_path=a.file,
build=a.build,
commit=a.commit,
write_commit_message=a.write_commit_message,
run=a.run,
shell=a.shell,
version=a.version,
version_preference=VersionPreference.from_str(a.version),
attribute=a.attribute,
test=a.test,
version_regex=a.version_regex,
review=a.review,
format=a.format,
override_filename=a.override_filename,
)
@ -102,15 +102,16 @@ def format_commit_message(package: Package) -> str:
and new_version.startswith("v")
):
new_version = new_version[1:]
return f"{package.attribute}: {package.old_version} -> {new_version}"
msg = f"{package.attribute}: {package.old_version} -> {new_version}"
if package.changelog:
msg += f"\n\nChangelog: {package.changelog}"
return msg
def git_commit(git_dir: str, package: Package) -> None:
msg = format_commit_message(package)
new_version = package.new_version
run(["git", "-C", git_dir, "add", package.filename], stdout=None)
if new_version and package.old_version != new_version:
run(
["git", "-C", git_dir, "commit", "--verbose", "--message", msg], stdout=None
@ -214,8 +215,8 @@ def nixpkgs_fmt(package: Package, git_dir: Optional[str]) -> None:
run(["git", "-C", git_dir, "add", package.filename], stdout=None)
def main() -> None:
options = parse_args()
def main(args: list[str] = sys.argv) -> None:
options = parse_args(args)
if not os.path.exists(options.import_path):
die(f"path {options.import_path} does not exists")
@ -254,6 +255,9 @@ def main() -> None:
if options.commit:
assert git_dir is not None
if package.changelog:
# If we have a changelog we will re-eval the package in case it has changed
package.changelog = eval_attr(options).changelog
git_commit(git_dir, package)
if options.write_commit_message is not None:

View File

@ -24,6 +24,7 @@ class Package:
line: int
urls: Optional[List[str]]
url: Optional[str]
changelog: Optional[str]
rev: str
hash: Optional[str]
vendor_hash: Optional[str]
@ -73,6 +74,7 @@ def eval_expression(import_path: str, attr: str) -> str:
cargo_deps = pkg.cargoHash or pkg.cargoSha256 or null;
npm_deps = pkg.npmDepsHash or null;
tests = builtins.attrNames (pkg.passthru.tests or {{}});
changelog = pkg.meta.changelog or null;
}})"""

View File

@ -1,7 +1,9 @@
#!/usr/bin/env python3
import subprocess
import pytest
import sys
import os
from pathlib import Path
from typing import Type, Iterator
import shutil
@ -20,11 +22,23 @@ class Helpers:
@staticmethod
@contextmanager
def testpkgs() -> Iterator[Path]:
def testpkgs(init_git: bool = False) -> Iterator[Path]:
with tempfile.TemporaryDirectory() as tmpdirname:
shutil.copytree(
Helpers.root().joinpath("testpkgs"), tmpdirname, dirs_exist_ok=True
)
if init_git:
os.environ["GIT_AUTHOR_NAME"] = "nix-update"
os.environ["GIT_AUTHOR_EMAIL"] = "nix-update@example.com"
os.environ["GIT_COMMITTER_NAME"] = "nix-update"
os.environ["GIT_COMMITTER_EMAIL"] = "nix-update@example.com"
subprocess.run(["git", "-C", tmpdirname, "init"], check=True)
subprocess.run(["git", "-C", tmpdirname, "add", "--all"], check=True)
subprocess.run(
["git", "-C", tmpdirname, "commit", "-m", "first commit"],
check=True,
)
yield Path(tmpdirname)

View File

@ -1,15 +1,13 @@
#!/usr/bin/env python3
from nix_update.options import Options
from nix_update.update import update
from nix_update import main
import subprocess
import conftest
def test_update(helpers: conftest.Helpers) -> None:
with helpers.testpkgs() as path:
opts = Options(attribute="pypi", import_path=str(path))
update(opts)
def test_main(helpers: conftest.Helpers) -> None:
with helpers.testpkgs(init_git=True) as path:
main(["--file", str(path), "--commit", "pypi"])
version = subprocess.run(
[
"nix",
@ -21,7 +19,21 @@ def test_update(helpers: conftest.Helpers) -> None:
path,
"pypi.version",
],
check=True,
text=True,
stdout=subprocess.PIPE,
).stdout.strip()
assert version >= "3.0.1"
commit = subprocess.run(
["git", "-C", path, "log", "-1"],
text=True,
stdout=subprocess.PIPE,
check=True,
).stdout.strip()
print(commit)
assert version in commit
assert "pypi" in commit
assert (
f"https://github.com/Mic92/python-mpd2/blob/{version}/doc/changes.rst"
in commit
)
assert version.stdout.strip() >= "3.0.1"

View File

@ -16,4 +16,6 @@ buildPythonPackage rec {
];
pytestFlagsArray = [ "mpd/tests.py" ];
meta.changelog = "https://github.com/Mic92/python-mpd2/blob/${version}/doc/changes.rst";
}