From a352633a17fd6e798487067ff1d61f863c885e19 Mon Sep 17 00:00:00 2001 From: "Tim St. Clair" Date: Tue, 12 Jan 2016 12:35:38 -0800 Subject: [PATCH 1/2] Fix check_boilerplate.sh for 2016 Copied the kubernetes boilerplate checker from https://github.com/kubernetes/kubernetes/tree/master/hack/boilerplate, and updated templates for cAdvisor. --- build/{ => boilerplate}/boilerplate.go.txt | 2 +- build/boilerplate/boilerplate.py | 158 +++++++++++++++++++++ build/boilerplate/boilerplate.py.txt | 15 ++ build/boilerplate/boilerplate.sh.txt | 13 ++ build/check_boilerplate.sh | 29 ++-- 5 files changed, 201 insertions(+), 16 deletions(-) rename build/{ => boilerplate}/boilerplate.go.txt (91%) create mode 100755 build/boilerplate/boilerplate.py create mode 100644 build/boilerplate/boilerplate.py.txt create mode 100644 build/boilerplate/boilerplate.sh.txt diff --git a/build/boilerplate.go.txt b/build/boilerplate/boilerplate.go.txt similarity index 91% rename from build/boilerplate.go.txt rename to build/boilerplate/boilerplate.go.txt index 5804195f..0d060144 100644 --- a/build/boilerplate.go.txt +++ b/build/boilerplate/boilerplate.go.txt @@ -1,4 +1,4 @@ -// Copyright 2014 Google Inc. All Rights Reserved. +// Copyright YEAR Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/build/boilerplate/boilerplate.py b/build/boilerplate/boilerplate.py new file mode 100755 index 00000000..c5c16e7b --- /dev/null +++ b/build/boilerplate/boilerplate.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python + +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import print_function + +import argparse +import glob +import json +import mmap +import os +import re +import sys + +parser = argparse.ArgumentParser() +parser.add_argument("filenames", help="list of files to check, all files if unspecified", nargs='*') +args = parser.parse_args() + +rootdir = os.path.dirname(__file__) + "/../../" +rootdir = os.path.abspath(rootdir) + +def get_refs(): + refs = {} + for path in glob.glob(os.path.join(rootdir, "build/boilerplate/boilerplate.*.txt")): + extension = os.path.basename(path).split(".")[1] + + ref_file = open(path, 'r') + ref = ref_file.read().splitlines() + ref_file.close() + refs[extension] = ref + + return refs + +def file_passes(filename, refs, regexs): + try: + f = open(filename, 'r') + except: + return False + + data = f.read() + f.close() + + extension = file_extension(filename) + ref = refs[extension] + + # remove build tags from the top of Go files + if extension == "go": + p = regexs["go_build_constraints"] + (data, found) = p.subn("", data, 1) + + # remove shebang from the top of shell files + if extension == "sh": + p = regexs["shebang"] + (data, found) = p.subn("", data, 1) + + data = data.splitlines() + + # if our test file is smaller than the reference it surely fails! + if len(ref) > len(data): + return False + + # trim our file to the same number of lines as the reference file + data = data[:len(ref)] + + p = regexs["year"] + for d in data: + if p.search(d): + return False + + # Replace all occurrences of the regex "2016|2015|2014" with "YEAR" + p = regexs["date"] + for i, d in enumerate(data): + (data[i], found) = p.subn('YEAR', d) + if found != 0: + break + + # if we don't match the reference at this point, fail + if ref != data: + return False + + return True + +def file_extension(filename): + return os.path.splitext(filename)[1].split(".")[-1].lower() + +skipped_dirs = ['Godeps', 'third_party', '_gopath', '_output', '.git'] +def normalize_files(files): + newfiles = [] + for pathname in files: + if any(x in pathname for x in skipped_dirs): + continue + newfiles.append(pathname) + for i, pathname in enumerate(newfiles): + if not os.path.isabs(pathname): + newfiles[i] = os.path.join(rootdir, pathname) + return newfiles + +def get_files(extensions): + files = [] + if len(args.filenames) > 0: + files = args.filenames + else: + for root, dirs, walkfiles in os.walk(rootdir): + # don't visit certain dirs. This is just a performance improvement + # as we would prune these later in normalize_files(). But doing it + # cuts down the amount of filesystem walking we do and cuts down + # the size of the file list + for d in skipped_dirs: + if d in dirs: + dirs.remove(d) + + for name in walkfiles: + pathname = os.path.join(root, name) + files.append(pathname) + + files = normalize_files(files) + outfiles = [] + for pathname in files: + extension = file_extension(pathname) + if extension in extensions: + outfiles.append(pathname) + return outfiles + +def get_regexs(): + regexs = {} + # Search for "YEAR" which exists in the boilerplate, but shouldn't in the real thing + regexs["year"] = re.compile( 'YEAR' ) + # dates can be 2014, 2015 or 2016, company holder names can be anything + regexs["date"] = re.compile( '(2014|2015|2016)' ) + # strip // +build \n\n build constraints + regexs["go_build_constraints"] = re.compile(r"^(// \+build.*\n)+\n", re.MULTILINE) + # strip #!.* from shell scripts + regexs["shebang"] = re.compile(r"^(#!.*\n)\n*", re.MULTILINE) + return regexs + +def main(): + regexs = get_regexs() + refs = get_refs() + filenames = get_files(refs.keys()) + + for filename in filenames: + if not file_passes(filename, refs, regexs): + print(filename, file=sys.stdout) + +if __name__ == "__main__": + sys.exit(main()) diff --git a/build/boilerplate/boilerplate.py.txt b/build/boilerplate/boilerplate.py.txt new file mode 100644 index 00000000..21183f86 --- /dev/null +++ b/build/boilerplate/boilerplate.py.txt @@ -0,0 +1,15 @@ +#!/usr/bin/env python + +# Copyright YEAR Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/build/boilerplate/boilerplate.sh.txt b/build/boilerplate/boilerplate.sh.txt new file mode 100644 index 00000000..074cb1e7 --- /dev/null +++ b/build/boilerplate/boilerplate.sh.txt @@ -0,0 +1,13 @@ +# Copyright YEAR Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/build/check_boilerplate.sh b/build/check_boilerplate.sh index 4653c283..65a87f2e 100755 --- a/build/check_boilerplate.sh +++ b/build/check_boilerplate.sh @@ -14,20 +14,19 @@ # See the License for the specific language governing permissions and # limitations under the License. -REF_FILE="./build/boilerplate.go.txt" -if [ ! -e $REF_FILE ]; then - echo "Missing reference file: " ${REF_FILE} +set -o errexit +set -o nounset +set -o pipefail + +GIT_ROOT=$(dirname "${BASH_SOURCE}")/.. +boiler="${GIT_ROOT}/build/boilerplate/boilerplate.py" + +files_need_boilerplate=($(${boiler} "$@")) + +if [[ ${#files_need_boilerplate[@]} -gt 0 ]]; then + for file in "${files_need_boilerplate[@]}"; do + echo "Boilerplate header is wrong for: ${file}" + done + exit 1 fi - -LINES=$(cat "${REF_FILE}" | wc -l | tr -d ' ') -GO_FILES=$(find . -not -wholename "*Godeps*" -name "*.go") - -for FILE in ${GO_FILES}; do - DIFFER=$(cat "${FILE}" | sed 's/2015/2014/g' | head "-${LINES}" | diff -q - "${REF_FILE}") - - if [[ ! -z "${DIFFER}" ]]; then - echo "${FILE} does not have the correct copyright notice." - exit 1 - fi -done From 1e1736ebc924bdc33831bd59405bd7e3cf019caa Mon Sep 17 00:00:00 2001 From: "Tim St. Clair" Date: Tue, 12 Jan 2016 12:35:46 -0800 Subject: [PATCH 2/2] Fix shell scripts boilerplate --- build/build.sh | 1 + build/check_gofmt.sh | 14 ++++++++++++++ build/release.sh | 14 ++++++++++++++ deploy/build.sh | 14 ++++++++++++++ 4 files changed, 43 insertions(+) diff --git a/build/build.sh b/build/build.sh index 4c11e083..af63ff8b 100755 --- a/build/build.sh +++ b/build/build.sh @@ -12,6 +12,7 @@ # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and +# limitations under the License. set -e diff --git a/build/check_gofmt.sh b/build/check_gofmt.sh index 34fd9d7c..b742c398 100755 --- a/build/check_gofmt.sh +++ b/build/check_gofmt.sh @@ -1,5 +1,19 @@ #!/bin/bash +# Copyright 2015 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + # Check usage. if [ $# -ne 1 ]; then echo "USAGE: check_gofmt " diff --git a/build/release.sh b/build/release.sh index b5b7c790..32162fe8 100755 --- a/build/release.sh +++ b/build/release.sh @@ -1,5 +1,19 @@ #!/bin/bash +# Copyright 2015 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + version=$( cat version/VERSION ) branch=$( git rev-parse --abbrev-ref HEAD 2> /dev/null || echo 'unknown' ) diff --git a/deploy/build.sh b/deploy/build.sh index f3a8dc50..ef0a6f40 100755 --- a/deploy/build.sh +++ b/deploy/build.sh @@ -1,5 +1,19 @@ #!/bin/bash +# Copyright 2015 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + set -e set -x