118 lines
3.2 KiB
Python
Executable file
118 lines
3.2 KiB
Python
Executable file
#!/usr/bin/python3
|
|
|
|
import json, os, time
|
|
from typing import Tuple
|
|
|
|
def confirm(prompt: str) -> bool:
|
|
confirmed = input(prompt + ' (Y/N) ')
|
|
return confirmed.lower() == 'y'
|
|
|
|
def load_latest_data() -> dict:
|
|
if os.path.isfile('latest.json'):
|
|
return json.loads(open('latest.json').read())
|
|
return {'id': 0}
|
|
|
|
def match_name(filename: str, extension: str=None, exact_name: str=None):
|
|
if exact_name is not None:
|
|
return filename == exact_name
|
|
elif extension is not None:
|
|
return filename.lower().endswith(extension.lower())
|
|
return True
|
|
|
|
def scan_for_file(ask: bool=False, extension: str=None, exact_name: str=None) -> Tuple[str]:
|
|
for file in os.scandir():
|
|
if file.is_dir(): continue
|
|
if not match_name(file.name, extension, exact_name): continue
|
|
|
|
if ask:
|
|
if not confirm(f"Found {file.name} in the current directory, do you want to proceed with it?"):
|
|
return (None, None)
|
|
|
|
return (file.path, file.name)
|
|
return (None, None)
|
|
|
|
def wait_for_file(waiting_dir: str, extension: str=None, exact_name: str=None) -> Tuple[str]:
|
|
print(f"Please put a {extension} file in {waiting_dir}")
|
|
while True:
|
|
files = [i for i in os.scandir(waiting_dir)]
|
|
|
|
if len(files) == 0:
|
|
time.sleep(0.5)
|
|
continue
|
|
|
|
file = files[0]
|
|
filepath = file.path
|
|
filename = file.name
|
|
|
|
if match_name(filename, extension, exact_name):
|
|
break
|
|
else:
|
|
os.remove(filepath)
|
|
print(f"Not a {extension} file: {filename}")
|
|
|
|
return (filepath, filename)
|
|
|
|
def write_metadata(metadata: dict):
|
|
dir = metadata['label']
|
|
metadata = json.dumps(metadata)
|
|
for filepath in [os.path.join('releases', dir, 'meta.json'), 'latest.json']:
|
|
file = open(filepath, 'w')
|
|
file.write(metadata)
|
|
file.close()
|
|
|
|
def main():
|
|
latest_data = load_latest_data()
|
|
if latest_data['id'] > 0:
|
|
print(f"Current release: {latest_data['label']}")
|
|
print(f"Released {time.strftime('%d.%m.%Y %H:%M', time.localtime(latest_data['timestamp']))}")
|
|
print('')
|
|
|
|
version = input('New version? ')
|
|
|
|
if os.path.isdir(version):
|
|
raise FileExistsError()
|
|
|
|
filepath, filename = scan_for_file(ask=True, extension='jar')
|
|
|
|
if filepath is None:
|
|
os.makedirs('pending', exist_ok=True)
|
|
try:
|
|
filepath, filename = wait_for_file('pending', 'jar')
|
|
except KeyboardInterrupt:
|
|
os.rmdir('pending')
|
|
return
|
|
|
|
changelog = confirm('Do you want to include a changelog?')
|
|
if changelog:
|
|
cfilepath, cfilename = scan_for_file(ask=True, exact_name='changelog.txt')
|
|
if cfilepath is None:
|
|
try:
|
|
os.makedirs('pending', exist_ok=True)
|
|
cfilepath, cfilename = wait_for_file('pending', 'txt')
|
|
except KeyboardInterrupt:
|
|
os.rmdir('pending')
|
|
return
|
|
|
|
version_dir = os.path.join('releases', version)
|
|
|
|
os.mkdir(version_dir)
|
|
os.rename(filepath, os.path.join(version_dir, filename))
|
|
if changelog: os.rename(cfilepath, os.path.join(version_dir, 'changelog.txt'))
|
|
|
|
try:
|
|
os.rmdir('pending')
|
|
except FileNotFoundError:
|
|
pass
|
|
|
|
metadata = {
|
|
'label': version,
|
|
'id': latest_data['id'] + 1,
|
|
'timestamp': int(time.time()),
|
|
'file': filename
|
|
}
|
|
write_metadata(metadata)
|
|
|
|
print("Done, don't forget to commit and push")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|