mirror of
https://github.com/murdos/musicbrainz-userscripts
synced 2024-11-14 23:07:09 +00:00
88 lines
3.1 KiB
Python
88 lines
3.1 KiB
Python
|
#!/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)
|
|||
|
|