2018-09-02 21:48:12 +02:00
|
|
|
#!/usr/bin/env python
|
|
|
|
|
# This file is part of the pycalver project
|
|
|
|
|
# https://github.com/mbarkhau/pycalver
|
|
|
|
|
#
|
|
|
|
|
# (C) 2018 Manuel Barkhau (@mbarkhau)
|
|
|
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
|
|
2018-09-03 22:23:51 +02:00
|
|
|
import io
|
2018-09-02 21:48:12 +02:00
|
|
|
import difflib
|
2018-09-03 22:23:51 +02:00
|
|
|
import logging
|
|
|
|
|
import typing as typ
|
|
|
|
|
|
|
|
|
|
from . import parse
|
2018-09-02 21:48:12 +02:00
|
|
|
|
|
|
|
|
log = logging.getLogger("pycalver.rewrite")
|
|
|
|
|
|
|
|
|
|
|
2018-09-03 22:23:51 +02:00
|
|
|
def rewrite(
|
|
|
|
|
new_version: str,
|
2018-09-04 09:56:53 +02:00
|
|
|
file_patterns: typ.Dict[str, typ.List[str]],
|
2018-09-03 22:23:51 +02:00
|
|
|
dry=False,
|
|
|
|
|
verbose=False,
|
|
|
|
|
) -> None:
|
|
|
|
|
new_version_nfo = parse.parse_version_info(new_version)
|
|
|
|
|
new_version_fmt_kwargs = new_version_nfo._asdict()
|
|
|
|
|
|
|
|
|
|
matches: typ.List[parse.PatternMatch]
|
|
|
|
|
for filepath, patterns in file_patterns.items():
|
|
|
|
|
with io.open(filepath, mode="rt", encoding="utf-8") as fh:
|
|
|
|
|
content = fh.read()
|
|
|
|
|
|
|
|
|
|
old_lines = content.splitlines()
|
|
|
|
|
new_lines = old_lines.copy()
|
|
|
|
|
|
|
|
|
|
matches = parse.parse_patterns(old_lines, patterns)
|
|
|
|
|
for m in matches:
|
|
|
|
|
replacement = m.pattern.format(**new_version_fmt_kwargs)
|
|
|
|
|
span_l, span_r = m.span
|
|
|
|
|
new_line = m.line[:span_l] + replacement + m.line[span_r:]
|
|
|
|
|
new_lines[m.lineno] = new_line
|
|
|
|
|
|
|
|
|
|
if dry or verbose:
|
|
|
|
|
print("\n".join(difflib.unified_diff(
|
|
|
|
|
old_lines,
|
|
|
|
|
new_lines,
|
|
|
|
|
lineterm="",
|
|
|
|
|
fromfile="a/" + filepath,
|
|
|
|
|
tofile="b/" + filepath,
|
|
|
|
|
)))
|
|
|
|
|
|
|
|
|
|
if dry:
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
new_content = "\n".join(new_lines)
|
|
|
|
|
with io.open(filepath, mode="wt", encoding="utf-8") as fh:
|
|
|
|
|
fh.write(new_content)
|