#!/usr/bin/python # # Copyright (C) 2011 Google Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. """Script to verify file header. """ # pylint: disable=C0103 # [C0103] Invalid name import sys import re import itertools from ganeti import constants from ganeti import utils from ganeti import compat #: Assume header is always in the first 8kB of a file _READ_SIZE = 8 * 1024 _GPLv2 = [ "This program is free software; you can redistribute it and/or modify", "it under the terms of the GNU General Public License as published by", "the Free Software Foundation; either version 2 of the License, or", "(at your option) any later version.", "", "This program is distributed in the hope that it will be useful, but", "WITHOUT ANY WARRANTY; without even the implied warranty of", "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU", "General Public License for more details.", "", "You should have received a copy of the GNU General Public License", "along with this program; if not, write to the Free Software", "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA", "02110-1301, USA.", ] _SHEBANG = re.compile(r"^#(?:|!(?:/usr/bin/python(?:| -u)|/bin/(?:|ba)sh))$") _COPYRIGHT_YEAR = r"20[01][0-9]" _COPYRIGHT = re.compile(r"# Copyright \(C\) (%s(?:, %s)*) Google Inc\.$" % (_COPYRIGHT_YEAR, _COPYRIGHT_YEAR)) _COPYRIGHT_DESC = "Copyright (C) [, ...] Google Inc." _AUTOGEN = "# This file is automatically generated, do not edit!" class HeaderError(Exception): pass def _Fail(lineno, msg): raise HeaderError("Line %s: %s" % (lineno, msg)) def _CheckHeader(getline_fn): (lineno, line) = getline_fn() if line == _AUTOGEN: return if not _SHEBANG.match(line): _Fail(lineno, ("Must contain nothing but a hash character (#) or a" " shebang line (e.g. #!/bin/bash)")) (lineno, line) = getline_fn() if line == _AUTOGEN: return if line != "#": _Fail(lineno, "Must contain nothing but hash character (#)") (lineno, line) = getline_fn() if line: _Fail(lineno, "Must be empty") (lineno, line) = getline_fn() if not _COPYRIGHT.match(line): _Fail(lineno, "Must contain copyright information (%s)" % _COPYRIGHT_DESC) (lineno, line) = getline_fn() if line != "#": _Fail(lineno, "Must contain nothing but hash character (#)") for licence_line in _GPLv2: (lineno, line) = getline_fn() if line != ("# %s" % licence_line).rstrip(): _Fail(lineno, "Does not match expected licence line (%s)" % licence_line) (lineno, line) = getline_fn() if line: _Fail(lineno, "Must be empty") def Main(): """Main program. """ fail = False for filename in sys.argv[1:]: content = utils.ReadFile(filename, size=_READ_SIZE) lines = zip(itertools.count(1), content.splitlines()) try: _CheckHeader(compat.partial(lines.pop, 0)) except HeaderError, err: report = str(err) print "%s: %s" % (filename, report) fail = True if fail: sys.exit(constants.EXIT_FAILURE) else: sys.exit(constants.EXIT_SUCCESS) if __name__ == "__main__": Main()