WIP: some vcs integration

This commit is contained in:
Manuel Barkhau 2018-09-03 00:14:10 +02:00
parent ce9083ef85
commit 02b4ff2899
4 changed files with 58 additions and 40 deletions

View file

@ -146,7 +146,7 @@ def init(dry: bool) -> None:
"--commit", "--commit",
default=True, default=True,
is_flag=True, is_flag=True,
help="Tag the commit.", help="Commit after updating version strings.",
) )
@click.option( @click.option(
"--tag", "--tag",
@ -154,7 +154,24 @@ def init(dry: bool) -> None:
is_flag=True, is_flag=True,
help="Tag the commit.", help="Tag the commit.",
) )
def bump(release: str, verbose: bool, dry: bool, commit: bool, tag: bool) -> None: @click.option(
"--allow-dirty",
default=False,
is_flag=True,
help=(
"Commit even when working directory is has uncomitted changes. "
"(WARNING: The commit will still be aborted if there are uncomitted "
"to files with version strings."
),
)
def bump(
release: str,
verbose: bool,
dry: bool,
commit: bool,
tag: bool,
allow_dirty: bool,
) -> None:
_init_loggers(verbose) _init_loggers(verbose)
if release and release not in parse.VALID_RELESE_VALUES: if release and release not in parse.VALID_RELESE_VALUES:
@ -179,6 +196,25 @@ def bump(release: str, verbose: bool, dry: bool, commit: bool, tag: bool) -> Non
if dry: if dry:
log.info("Running with '--dry', showing diffs instead of updating files.") log.info("Running with '--dry', showing diffs instead of updating files.")
_vcs = vcs.get_vcs()
dirty_files = _vcs.dirty_files()
if dirty_files:
log.warn(f"{_vcs.__name__} working directory is not clean:")
for file in dirty_files:
log.warn(" " + file)
if not allow_dirty and dirty_files:
sys.exit(1)
pattern_files = cfg["file_patterns"].keys()
dirty_pattern_files = set(dirty_files) & set(pattern_files)
if dirty_pattern_files:
log.error("Not commiting when pattern files are dirty:")
for file in dirty_pattern_files:
log.warn(" " + file)
sys.exit(1)
matches: typ.List[parse.PatternMatch] matches: typ.List[parse.PatternMatch]
for filepath, patterns in cfg["file_patterns"].items(): for filepath, patterns in cfg["file_patterns"].items():
with io.open(filepath, mode="rt", encoding="utf-8") as fh: with io.open(filepath, mode="rt", encoding="utf-8") as fh:
@ -203,10 +239,10 @@ def bump(release: str, verbose: bool, dry: bool, commit: bool, tag: bool) -> Non
tofile="b/" + filepath, tofile="b/" + filepath,
))) )))
# if not dry: if not dry:
# new_content = "\n".join(new_lines) new_content = "\n".join(new_lines)
# with io.open(filepath, mode="wt", encoding="utf-8") as fh: with io.open(filepath, mode="wt", encoding="utf-8") as fh:
# fh.write(new_content) fh.write(new_content)
if dry: if dry:
return return
@ -214,7 +250,6 @@ def bump(release: str, verbose: bool, dry: bool, commit: bool, tag: bool) -> Non
if not commit: if not commit:
return return
v = vcs.get_vcs() if _vcs is None:
if v is None:
log.warn("Version Control System not found, aborting commit.") log.warn("Version Control System not found, aborting commit.")
return return

View file

@ -17,12 +17,6 @@ import subprocess as sp
log = logging.getLogger("pycalver.vcs") log = logging.getLogger("pycalver.vcs")
class WorkingDirectoryIsDirtyException(Exception):
def __init__(self, message):
self.message = message
class BaseVCS: class BaseVCS:
@classmethod @classmethod
@ -50,21 +44,14 @@ class BaseVCS:
raise raise
@classmethod @classmethod
def assert_nondirty(cls): def dirty_files(cls):
status_output = sp.check_output(cls._STATUS_COMMAND) status_output = sp.check_output(cls._STATUS_COMMAND)
lines = [ return [
line.strip() line.decode("utf-8")[2:].strip()
for line in status_output.splitlines() for line in status_output.splitlines()
if not line.strip().startswith(b"??") if not line.strip().startswith(b"??")
] ]
if lines:
cleaned_output = b"\n".join(lines)
cls_name = cls.__name__
raise WorkingDirectoryIsDirtyException(
f"{cls_name} working directory is not clean:\n{cleaned_output}"
)
class Git(BaseVCS): class Git(BaseVCS):
@ -76,6 +63,10 @@ class Git(BaseVCS):
def tag(cls, name): def tag(cls, name):
sp.check_output(["git", "tag", name]) sp.check_output(["git", "tag", name])
@classmethod
def add_path(cls, path):
sp.check_output(["git", "add", "--update", path])
class Mercurial(BaseVCS): class Mercurial(BaseVCS):
@ -87,25 +78,17 @@ class Mercurial(BaseVCS):
def tag(cls, name): def tag(cls, name):
sp.check_output(["hg", "tag", name]) sp.check_output(["hg", "tag", name])
@classmethod
def add_path(cls, path):
pass
VCS = [Git, Mercurial] VCS = [Git, Mercurial]
def get_vcs(allow_dirty=False): def get_vcs():
for vcs in VCS: for vcs in VCS:
if not vcs.is_usable(): if vcs.is_usable():
continue
if not allow_dirty:
try:
vcs.assert_nondirty()
except WorkingDirectoryIsDirtyException as e:
log.warn(
f"{e.message}\n\n"
f"Use --allow-dirty to override this if you know what you're doing."
)
raise
return vcs return vcs
return None return None

0
test/test_parse.py Normal file
View file