musicbrainz-userscripts/tools/update_version.py

88 lines
3.1 KiB
Python
Raw Normal View History

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import sys
import fileinput
import re
import datetime
"""
Update the version of .user.js file(s) passed as arguments
File is edited in-place, and the version is set to YYYY.MM.DD.N format
automatically.
If version is missing, one will be added.
If ran more than once a day, N will be updated.
UTC date is used.
Add or update version in the metablock:
$> ./tools/update_version.py bandcamp_importer.user.js
To test without modifying file, use stdin:
$> ./tools/update_version.py < bandcamp_importer.user.js
"""
def make_version_line(old_value='0.0.0.0', spacing=' '*8, eol="\n"):
prev_version = [int(x) for x in old_value.split('.')]
now = datetime.datetime.utcnow()
version = [now.year, now.month, now.day, 0]
if prev_version[:3] == version[:3]:
version[3] = prev_version[3] + 1
version_str = '%04d.%02d.%02d.%d' % tuple(version)
return ('// @version' + spacing + version_str + eol, version_str)
re_start_header = re.compile(r'//\s*==UserScript==', re.IGNORECASE)
re_stop_header = re.compile(r'//\s*==/UserScript==', re.IGNORECASE)
re_keyval = re.compile(r'^[\s\*/]+@(\S+)(\s+)(.+)\s*$', re.IGNORECASE)
def process_files(files, verbose=True):
def echo(*args):
if verbose:
sys.stderr.write(*args)
for line in fileinput.input(files, inplace=1):
try:
current = fileinput.filename()
if fileinput.isfirstline():
echo('%s: processing...\n' % current)
version_done = False
in_header = False
header_processed = False
if not header_processed:
if not in_header:
in_header = re_start_header.search(line)
else:
if re_stop_header.search(line):
in_header = False
header_processed = True
if not version_done:
newline, version_str = make_version_line()
sys.stdout.write(newline)
echo('%s: %s (added)\n' %
(current, version_str))
else:
m = re_keyval.search(line)
if m:
key, spacing, value = m.groups()
if key == 'version':
if version_done:
echo('%s: %s dupe removed\n' %
(current, value))
continue # skip the line, more than one version
line, version_str = make_version_line(value, spacing)
echo('%s: %s (old)\n' % (current, value))
echo('%s: %s (new)\n' % (current, version_str))
version_done = True
finally:
sys.stdout.write(line)
if __name__ == "__main__":
process_files(sys.argv[1:], verbose=True)