diff --git a/bin/packages/git_status.py b/bin/packages/git_status.py new file mode 100755 index 00000000..21b9f2ac --- /dev/null +++ b/bin/packages/git_status.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python3 +# -*-coding:UTF-8 -* + +import subprocess + +TERMINAL_RED = '\033[91m' +TERMINAL_YELLOW = '\33[93m' +TERMINAL_BLUE = '\33[94m' +TERMINAL_BLINK = '\33[6m' +TERMINAL_DEFAULT = '\033[0m' + +# Check if working directory is clean +def is_working_directory_clean(verbose=False): + if verbose: + print('check if this git directory is clean ...') + #print('git ls-files -m') + process = subprocess.run(['git', 'ls-files', '-m'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if process.returncode == 0: + res = process.stdout + if res == b'': + return True + else: + return False + else: + if verbose: + print('{}{}{}'.format(TERMINAL_RED, process.stderr.decode(), TERMINAL_DEFAULT)) + return False + +# Check if this git is a fork +def is_not_fork(origin_repo, verbose=False): + if verbose: + print('check if this git is a fork ...') + #print('git remote -v') + process = subprocess.run(['git', 'remote', '-v'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if process.returncode == 0: + res = process.stdout.decode() + if verbose: + print(res) + if 'origin {}'.format(origin_repo) in res: + return True + else: + return False + else: + if verbose: + print('{}{}{}'.format(TERMINAL_RED, process.stderr.decode(), TERMINAL_DEFAULT)) + return False + +# Get current branch +def get_current_branch(verbose=False): + if verbose: + print('retrieving current branch ...') + #print('git rev-parse --abbrev-ref HEAD') + process = subprocess.run(['git', 'rev-parse', '--abbrev-ref', 'HEAD'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if process.returncode == 0: + current_branch = process.stdout.replace(b'\n', b'').decode() + if verbose: + print(current_branch) + return current_branch + + else: + if verbose: + print('{}{}{}'.format(TERMINAL_RED, process.stderr.decode(), TERMINAL_DEFAULT)) + return '' + +# Get last commit id on master branch from remote +def get_last_commit_id_from_remote(branch='master', verbose=False): + if verbose: + print('retrieving last remote commit id ...') + #print('git ls-remote origin master') + process = subprocess.run(['git', 'ls-remote', 'origin', branch], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if process.returncode == 0: + last_commit_id = process.stdout.split(b'\t')[0].replace(b'\n', b'').decode() + if verbose: + print(last_commit_id) + return last_commit_id + + else: + if verbose: + print('{}{}{}'.format(TERMINAL_RED, process.stderr.decode(), TERMINAL_DEFAULT)) + return '' + +# Get last commit id on master branch from local +def get_last_commit_id_from_local(branch='master', verbose=False): + if verbose: + print('retrieving last local commit id ...') + #print('git rev-parse master') + process = subprocess.run(['git', 'rev-parse', branch], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if process.returncode == 0: + last_commit_id = process.stdout.replace(b'\n', b'').decode() + if verbose: + print(last_commit_id) + return last_commit_id + + else: + if verbose: + print('{}{}{}'.format(TERMINAL_RED, process.stderr.decode(), TERMINAL_DEFAULT)) + return '' + +# Get last local tag +def get_last_tag_from_local(verbose=False): + if verbose: + print('retrieving last local tag ...') + #print('git describe --abbrev=0 --tags') + process = subprocess.run(['git', 'describe', '--abbrev=0', '--tags'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if process.returncode == 0: + last_local_tag = process.stdout.replace(b'\n', b'').decode() + if verbose: + print(last_local_tag) + return last_local_tag + + else: + if verbose: + print('{}{}{}'.format(TERMINAL_RED, process.stderr.decode(), TERMINAL_DEFAULT)) + return '' + +# Get last local tag +def get_last_tag_from_remote(verbose=False): + if verbose: + print('retrieving last remote tag ...') + #print('git ls-remote --tags') + process = subprocess.run(['git', 'ls-remote', '--tags'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if process.returncode == 0: + res = process.stdout.split(b'\n')[-2].split(b'/')[-1].replace(b'^{}', b'').decode() + if verbose: + print(res) + return res + + else: + if verbose: + print('{}{}{}'.format(TERMINAL_RED, process.stderr.decode(), TERMINAL_DEFAULT)) + return '' + +if __name__ == "__main__": + get_last_commit_id_from_remote(verbose=True) + get_last_commit_id_from_local(verbose=True) + get_last_tag_from_local(verbose=True) + get_current_branch(verbose=True) + print(is_fork('https://github.com/CIRCL/AIL-framework.git')) + print(is_working_directory_clean()) + get_last_tag_from_remote(verbose=True)