#!/usr/bin/env python
import sys

# Sort a group list, carefully preserving comments.

def xfstest_key(key):
	'''Extract the numeric part of a test name if possible.'''
	k = 0

	assert type(key) == str

	# No test number at all...
	if not key[0].isdigit():
		return key

	# ...otherwise extract as much number as we can.
	for digit in key:
		if digit.isdigit():
			k = k * 10 + int(digit)
		else:
			return k
	return k

def read_group(fd):
	'''Read the group list, carefully attaching comments to the next test.'''
	tests = {}
	comments = None

	for line in fd:
		sline = line.strip()
		tokens = sline.split()
		if len(tokens) == 0 or tokens[0] == '#':
			if comments == None:
				comments = []
			comments.append(sline)
		else:
			tests[tokens[0]] = (comments, tokens[1:])
			comments = None
	return tests

def sort_keys(keys):
	'''Separate keys into integer and non-integer tests.'''
	int_keys = []
	int_xkeys = []
	str_keys = []

	# Sort keys into integer(ish) tests and other
	for key in keys:
		xkey = xfstest_key(key)
		if type(xkey) == int:
			int_keys.append(key)
			int_xkeys.append(xkey)
		else:
			str_keys.append(key)
	return (int_keys, int_xkeys, str_keys)

def write_sorted(tests, fd):
	def dump_xkey(xkey):
		(comments, tokens) = tests[key]
		if comments:
			for c in comments:
				fd.write('%s\n' % c)
		fd.write('%s %s\n' % (key, ' '.join(tokens)))
	'''Print tests (and comments) in number order.'''

	(int_keys, ignored, str_keys) = sort_keys(tests.keys())
	for key in sorted(int_keys, key = xfstest_key):
		dump_xkey(key)
	for key in sorted(str_keys):
		dump_xkey(key)

def sort_main():
	if '--help' in sys.argv[1:]:
		print('Usage: %s groupfiles' % sys.argv[0])
		sys.exit(0)

	for arg in sys.argv[1:]:
		with open(arg, 'r+') as fd:
			x = read_group(fd)
			fd.seek(0, 0)
			write_sorted(x, fd)

def nextid_main():
	if '--help' in sys.argv[1:]:
		print('Usage: %s group[/startid] ' % sys.argv[0])
		sys.exit(0)

	if len(sys.argv) != 2:
		print('Specify exactly one group name.')
		sys.exit(1)

	c = sys.argv[1].split('/')
	if len(c) > 1:
		startid = int(c[1])
	else:
		startid = 1
	group = c[0]

	with open('tests/%s/group' % group, 'r') as fd:
		x = read_group(fd)
		xkeys = {int(x) for x in sort_keys(x.keys())[1]}

		xid = startid
		while xid in xkeys:
			xid += 1
		print('%s/%03d' % (group, xid))

if __name__ == '__main__':
	if 'nextid' in sys.argv[0]:
		nextid_main()
	else:
		sort_main()
