From patchwork Sat Nov 21 00:50:08 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 7673111 Return-Path: X-Original-To: patchwork-fstests@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 4E23A9F1C2 for ; Sat, 21 Nov 2015 00:50:52 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 3B5DE2042A for ; Sat, 21 Nov 2015 00:50:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3D95F20416 for ; Sat, 21 Nov 2015 00:50:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1163440AbbKUAun (ORCPT ); Fri, 20 Nov 2015 19:50:43 -0500 Received: from aserp1040.oracle.com ([141.146.126.69]:48863 "EHLO aserp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1163147AbbKUAum (ORCPT ); Fri, 20 Nov 2015 19:50:42 -0500 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id tAL0oBWs012705 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 21 Nov 2015 00:50:11 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id tAL0oAZn026118 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 21 Nov 2015 00:50:11 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id tAL0oALc027901; Sat, 21 Nov 2015 00:50:10 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 20 Nov 2015 16:50:10 -0800 Subject: [PATCH 1/2] test-scripts: test migration scripts From: "Darrick J. Wong" To: david@fromorbit.com, darrick.wong@oracle.com Cc: fstests@vger.kernel.org, xfs@oss.sgi.com, hch@infradead.org, tao.peng@primarydata.com, linux-ext4@vger.kernel.org, Anna.Schumaker@netapp.com, linux-btrfs@vger.kernel.org Date: Fri, 20 Nov 2015 16:50:08 -0800 Message-ID: <20151121005008.20398.37255.stgit@birch.djwong.org> In-Reply-To: <20151121005001.20398.92856.stgit@birch.djwong.org> References: <20151121005001.20398.92856.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Source-IP: userv0021.oracle.com [156.151.31.71] Sender: fstests-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: fstests@vger.kernel.org X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add two scripts: "nextid" finds the next available test ID number in a group, and "mvtest" relocates a test, fixes the golden output, and moves the group entry for that test. v2: sorting group files should preserve group order; nextid should use the same algorithm as new; move both tools to tools/. Signed-off-by: Darrick J. Wong --- tools/mvtest | 55 +++++++++++++++++++++++++++ tools/nextid | 1 tools/sort-group | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 168 insertions(+) create mode 100755 tools/mvtest create mode 120000 tools/nextid create mode 100755 tools/sort-group -- To unsubscribe from this list: send the line "unsubscribe fstests" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/tools/mvtest b/tools/mvtest new file mode 100755 index 0000000..af601d6 --- /dev/null +++ b/tools/mvtest @@ -0,0 +1,55 @@ +#!/bin/sh + +# Renumber a test +dir="$(dirname "$0")" + +if [ -z "$1" ] || [ "$1" = "--help" ]; then + echo "Usage: $0 path_to_test new_path_to_test" + exit 1 +fi + +src="$1" +dest="$2" + +die() { + echo "$@" + exit 1 +} + +append() { + out="$1" + shift + echo "$@" >> "${out}" +} + +test "${src}" != "${dest}" || die "Test \"${src}\" is the same as dest." +test -e "tests/${src}" || die "Test \"${src}\" does not exist." +test ! -e "tests/${dest}" || die "Test \"${src}\" already exists." + +sid="$(basename "${src}")" +did="$(basename "${dest}")" + +sgroup="$(basename "$(dirname "tests/${src}")")" +dgroup="$(basename "$(dirname "tests/${dest}")")" + +sgroupfile="tests/${sgroup}/group" +dgroupfile="tests/${sgroup}/group" + +git mv "tests/${src}" "tests/${dest}" +git mv "tests/${src}.out" "tests/${dest}.out" +sed -e "s/^# FS QA Test No. ${sid}$/# FS QA Test No. ${did}/g" -i "tests/${dest}" +sed -e "s/^QA output created by ${sid}$/QA output created by ${did}/g" -i "tests/${dest}.out" +sed -e "s/test-${sid}/test-${did}/g" -i "tests/${dest}.out" + +grpline="$(grep "^${sid} " "${sgroupfile}")" +newgrpline="$(echo "${grpline}" | sed -e "s/^${sid} /${did} /g")" + +sed -e "/^${sid}.*$/d" -i "${sgroupfile}" +cp "${dgroupfile}" "${dgroupfile}.new" +append "${dgroupfile}.new" "${newgrpline}" +"${dir}/sort-group.py" "${dgroupfile}.new" +mv "${dgroupfile}.new" "${dgroupfile}" + +echo "Moved \"${src}\" to \"${dest}\"." + +exit 0 diff --git a/tools/nextid b/tools/nextid new file mode 120000 index 0000000..5c31d60 --- /dev/null +++ b/tools/nextid @@ -0,0 +1 @@ +sort-group \ No newline at end of file diff --git a/tools/sort-group b/tools/sort-group new file mode 100755 index 0000000..84944ed --- /dev/null +++ b/tools/sort-group @@ -0,0 +1,112 @@ +#!/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/%d' % (group, xid)) + +if __name__ == '__main__': + if 'nextid' in sys.argv[0]: + nextid_main() + else: + sort_main()