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