musicbrainz-userscripts/tools/update_version.py

87 lines
3.1 KiB
Python
Executable file
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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)