Sideband/sbapp/kivymd/tools/release/git_commands.py

95 lines
2.5 KiB
Python

# Copyright (c) 2019-2022 Artem Bulgakov
#
# This file is distributed under the terms of the same license,
# as the Kivy framework.
import subprocess
def command(cmd: list, capture_output: bool = False) -> str:
"""Run system command."""
print(f"Command: {subprocess.list2cmdline(cmd)}")
if capture_output:
out = subprocess.check_output(cmd)
out = out.decode("utf-8")
print(out.strip())
return out
else:
subprocess.check_call(cmd)
return ""
def get_previous_version() -> str:
"""Returns latest tag in git."""
command(["git", "checkout", "master"])
old_version = command(
["git", "describe", "--abbrev=0", "--tags"], capture_output=True
)
old_version = old_version[:-1] # Remove \n
return old_version
def git_clean(ask: bool = True):
"""Clean git repository from untracked and changed files."""
# Check what files will be removed
files_to_clean = command(
["git", "clean", "-dx", "--force", "--dry-run"], capture_output=True
).strip()
# Ask before removing
if ask and files_to_clean:
while True:
ans = input("Do you want to remove these files? (yes/no)").lower()
if ans == "y" or ans == "yes":
break
elif ans == "n" or ans == "no":
print("git clean is required. Exit")
exit(0)
# Remove all untracked files
command(["git", "clean", "-dx", "--force"])
command(["git", "reset", "--hard"])
def git_commit(message: str, allow_error: bool = False, add_files: list = None):
"""Make commit."""
add_files = add_files if add_files else ["-A"]
command(["git", "add", *add_files])
try:
command(["git", "commit", "--all", "-m", message])
except subprocess.CalledProcessError as e:
if not allow_error:
raise e
def git_tag(name: str):
"""Create tag."""
command(["git", "tag", name])
def git_push(branches_to_push: list, ask: bool = True, push: bool = False):
"""Push all changes."""
if ask:
push = input("Do you want to push changes? (y)") in (
"",
"y",
"yes",
)
cmd = ["git", "push", "--tags", "origin", "master", *branches_to_push]
if push:
command(cmd)
else:
print(
f"Changes are not pushed. Command for manual pushing: {subprocess.list2cmdline(cmd)}"
)
if __name__ == "__main__":
git_clean(ask=True)