summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-12-16 13:20:29 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-12-16 13:20:29 +0100
commit0a89edfda900b6322d0823a56f3d8241c90035a2 (patch)
treeb9004a4e5ffa785f9b0bbcc9e27639e1f0d13259 /scripts
parent42bfaf23fb67270261942ce8f6a0e9bc0416bf33 (diff)
Google C++ Testing Framework 1.8.0
Diffstat (limited to 'scripts')
-rw-r--r--scripts/common.py83
-rwxr-xr-xscripts/fuse_gtest_files.py33
-rwxr-xr-xscripts/release_docs.py158
3 files changed, 259 insertions, 15 deletions
diff --git a/scripts/common.py b/scripts/common.py
new file mode 100644
index 0000000..3c0347a
--- /dev/null
+++ b/scripts/common.py
@@ -0,0 +1,83 @@
+# Copyright 2013 Google Inc. All Rights Reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Shared utilities for writing scripts for Google Test/Mock."""
+
+__author__ = 'wan@google.com (Zhanyong Wan)'
+
+
+import os
+import re
+
+
+# Matches the line from 'svn info .' output that describes what SVN
+# path the current local directory corresponds to. For example, in
+# a googletest SVN workspace's trunk/test directory, the output will be:
+#
+# URL: https://googletest.googlecode.com/svn/trunk/test
+_SVN_INFO_URL_RE = re.compile(r'^URL: https://(\w+)\.googlecode\.com/svn(.*)')
+
+
+def GetCommandOutput(command):
+ """Runs the shell command and returns its stdout as a list of lines."""
+
+ f = os.popen(command, 'r')
+ lines = [line.strip() for line in f.readlines()]
+ f.close()
+ return lines
+
+
+def GetSvnInfo():
+ """Returns the project name and the current SVN workspace's root path."""
+
+ for line in GetCommandOutput('svn info .'):
+ m = _SVN_INFO_URL_RE.match(line)
+ if m:
+ project = m.group(1) # googletest or googlemock
+ rel_path = m.group(2)
+ root = os.path.realpath(rel_path.count('/') * '../')
+ return project, root
+
+ return None, None
+
+
+def GetSvnTrunk():
+ """Returns the current SVN workspace's trunk root path."""
+
+ _, root = GetSvnInfo()
+ return root + '/trunk' if root else None
+
+
+def IsInGTestSvn():
+ project, _ = GetSvnInfo()
+ return project == 'googletest'
+
+
+def IsInGMockSvn():
+ project, _ = GetSvnInfo()
+ return project == 'googlemock'
diff --git a/scripts/fuse_gtest_files.py b/scripts/fuse_gtest_files.py
index 57ef72f..3f3e9f3 100755
--- a/scripts/fuse_gtest_files.py
+++ b/scripts/fuse_gtest_files.py
@@ -60,7 +60,10 @@ __author__ = 'wan@google.com (Zhanyong Wan)'
import os
import re
-import sets
+try:
+ from sets import Set as set # For Python 2.3 compatibility
+except ImportError:
+ pass
import sys
# We assume that this file is in the scripts/ directory in the Google
@@ -90,10 +93,10 @@ def VerifyFileExists(directory, relative_path):
"""
if not os.path.isfile(os.path.join(directory, relative_path)):
- print 'ERROR: Cannot find %s in directory %s.' % (relative_path,
- directory)
- print ('Please either specify a valid project root directory '
- 'or omit it on the command line.')
+ print('ERROR: Cannot find %s in directory %s.' % (relative_path,
+ directory))
+ print('Please either specify a valid project root directory '
+ 'or omit it on the command line.')
sys.exit(1)
@@ -119,11 +122,11 @@ def VerifyOutputFile(output_dir, relative_path):
# TODO(wan@google.com): The following user-interaction doesn't
# work with automated processes. We should provide a way for the
# Makefile to force overwriting the files.
- print ('%s already exists in directory %s - overwrite it? (y/N) ' %
- (relative_path, output_dir))
+ print('%s already exists in directory %s - overwrite it? (y/N) ' %
+ (relative_path, output_dir))
answer = sys.stdin.readline().strip()
if answer not in ['y', 'Y']:
- print 'ABORTED.'
+ print('ABORTED.')
sys.exit(1)
# Makes sure the directory holding the output file exists; creates
@@ -146,8 +149,8 @@ def ValidateOutputDir(output_dir):
def FuseGTestH(gtest_root, output_dir):
"""Scans folder gtest_root to generate gtest/gtest.h in output_dir."""
- output_file = file(os.path.join(output_dir, GTEST_H_OUTPUT), 'w')
- processed_files = sets.Set() # Holds all gtest headers we've processed.
+ output_file = open(os.path.join(output_dir, GTEST_H_OUTPUT), 'w')
+ processed_files = set() # Holds all gtest headers we've processed.
def ProcessFile(gtest_header_path):
"""Processes the given gtest header file."""
@@ -159,7 +162,7 @@ def FuseGTestH(gtest_root, output_dir):
processed_files.add(gtest_header_path)
# Reads each line in the given gtest header.
- for line in file(os.path.join(gtest_root, gtest_header_path), 'r'):
+ for line in open(os.path.join(gtest_root, gtest_header_path), 'r'):
m = INCLUDE_GTEST_FILE_REGEX.match(line)
if m:
# It's '#include "gtest/..."' - let's process it recursively.
@@ -175,7 +178,7 @@ def FuseGTestH(gtest_root, output_dir):
def FuseGTestAllCcToFile(gtest_root, output_file):
"""Scans folder gtest_root to generate gtest/gtest-all.cc in output_file."""
- processed_files = sets.Set()
+ processed_files = set()
def ProcessFile(gtest_source_file):
"""Processes the given gtest source file."""
@@ -187,7 +190,7 @@ def FuseGTestAllCcToFile(gtest_root, output_file):
processed_files.add(gtest_source_file)
# Reads each line in the given gtest source file.
- for line in file(os.path.join(gtest_root, gtest_source_file), 'r'):
+ for line in open(os.path.join(gtest_root, gtest_source_file), 'r'):
m = INCLUDE_GTEST_FILE_REGEX.match(line)
if m:
if 'include/' + m.group(1) == GTEST_SPI_H_SEED:
@@ -218,7 +221,7 @@ def FuseGTestAllCcToFile(gtest_root, output_file):
def FuseGTestAllCc(gtest_root, output_dir):
"""Scans folder gtest_root to generate gtest/gtest-all.cc in output_dir."""
- output_file = file(os.path.join(output_dir, GTEST_ALL_CC_OUTPUT), 'w')
+ output_file = open(os.path.join(output_dir, GTEST_ALL_CC_OUTPUT), 'w')
FuseGTestAllCcToFile(gtest_root, output_file)
output_file.close()
@@ -242,7 +245,7 @@ def main():
# fuse_gtest_files.py GTEST_ROOT_DIR OUTPUT_DIR
FuseGTest(sys.argv[1], sys.argv[2])
else:
- print __doc__
+ print(__doc__)
sys.exit(1)
diff --git a/scripts/release_docs.py b/scripts/release_docs.py
new file mode 100755
index 0000000..1291347
--- /dev/null
+++ b/scripts/release_docs.py
@@ -0,0 +1,158 @@
+#!/usr/bin/env python
+#
+# Copyright 2013 Google Inc. All Rights Reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Script for branching Google Test/Mock wiki pages for a new version.
+
+SYNOPSIS
+ release_docs.py NEW_RELEASE_VERSION
+
+ Google Test and Google Mock's external user documentation is in
+ interlinked wiki files. When we release a new version of
+ Google Test or Google Mock, we need to branch the wiki files
+ such that users of a specific version of Google Test/Mock can
+ look up documenation relevant for that version. This script
+ automates that process by:
+
+ - branching the current wiki pages (which document the
+ behavior of the SVN trunk head) to pages for the specified
+ version (e.g. branching FAQ.wiki to V2_6_FAQ.wiki when
+ NEW_RELEASE_VERSION is 2.6);
+ - updating the links in the branched files to point to the branched
+ version (e.g. a link in V2_6_FAQ.wiki that pointed to
+ Primer.wiki#Anchor will now point to V2_6_Primer.wiki#Anchor).
+
+ NOTE: NEW_RELEASE_VERSION must be a NEW version number for
+ which the wiki pages don't yet exist; otherwise you'll get SVN
+ errors like "svn: Path 'V1_7_PumpManual.wiki' is not a
+ directory" when running the script.
+
+EXAMPLE
+ $ cd PATH/TO/GTEST_SVN_WORKSPACE/trunk
+ $ scripts/release_docs.py 2.6 # create wiki pages for v2.6
+ $ svn status # verify the file list
+ $ svn diff # verify the file contents
+ $ svn commit -m "release wiki pages for v2.6"
+"""
+
+__author__ = 'wan@google.com (Zhanyong Wan)'
+
+import os
+import re
+import sys
+
+import common
+
+
+# Wiki pages that shouldn't be branched for every gtest/gmock release.
+GTEST_UNVERSIONED_WIKIS = ['DevGuide.wiki']
+GMOCK_UNVERSIONED_WIKIS = [
+ 'DesignDoc.wiki',
+ 'DevGuide.wiki',
+ 'KnownIssues.wiki'
+ ]
+
+
+def DropWikiSuffix(wiki_filename):
+ """Removes the .wiki suffix (if any) from the given filename."""
+
+ return (wiki_filename[:-len('.wiki')] if wiki_filename.endswith('.wiki')
+ else wiki_filename)
+
+
+class WikiBrancher(object):
+ """Branches ..."""
+
+ def __init__(self, dot_version):
+ self.project, svn_root_path = common.GetSvnInfo()
+ if self.project not in ('googletest', 'googlemock'):
+ sys.exit('This script must be run in a gtest or gmock SVN workspace.')
+ self.wiki_dir = svn_root_path + '/wiki'
+ # Turn '2.6' to 'V2_6_'.
+ self.version_prefix = 'V' + dot_version.replace('.', '_') + '_'
+ self.files_to_branch = self.GetFilesToBranch()
+ page_names = [DropWikiSuffix(f) for f in self.files_to_branch]
+ # A link to Foo.wiki is in one of the following forms:
+ # [Foo words]
+ # [Foo#Anchor words]
+ # [http://code.google.com/.../wiki/Foo words]
+ # [http://code.google.com/.../wiki/Foo#Anchor words]
+ # We want to replace 'Foo' with 'V2_6_Foo' in the above cases.
+ self.search_for_re = re.compile(
+ # This regex matches either
+ # [Foo
+ # or
+ # /wiki/Foo
+ # followed by a space or a #, where Foo is the name of an
+ # unversioned wiki page.
+ r'(\[|/wiki/)(%s)([ #])' % '|'.join(page_names))
+ self.replace_with = r'\1%s\2\3' % (self.version_prefix,)
+
+ def GetFilesToBranch(self):
+ """Returns a list of .wiki file names that need to be branched."""
+
+ unversioned_wikis = (GTEST_UNVERSIONED_WIKIS if self.project == 'googletest'
+ else GMOCK_UNVERSIONED_WIKIS)
+ return [f for f in os.listdir(self.wiki_dir)
+ if (f.endswith('.wiki') and
+ not re.match(r'^V\d', f) and # Excluded versioned .wiki files.
+ f not in unversioned_wikis)]
+
+ def BranchFiles(self):
+ """Branches the .wiki files needed to be branched."""
+
+ print 'Branching %d .wiki files:' % (len(self.files_to_branch),)
+ os.chdir(self.wiki_dir)
+ for f in self.files_to_branch:
+ command = 'svn cp %s %s%s' % (f, self.version_prefix, f)
+ print command
+ os.system(command)
+
+ def UpdateLinksInBranchedFiles(self):
+
+ for f in self.files_to_branch:
+ source_file = os.path.join(self.wiki_dir, f)
+ versioned_file = os.path.join(self.wiki_dir, self.version_prefix + f)
+ print 'Updating links in %s.' % (versioned_file,)
+ text = file(source_file, 'r').read()
+ new_text = self.search_for_re.sub(self.replace_with, text)
+ file(versioned_file, 'w').write(new_text)
+
+
+def main():
+ if len(sys.argv) != 2:
+ sys.exit(__doc__)
+
+ brancher = WikiBrancher(sys.argv[1])
+ brancher.BranchFiles()
+ brancher.UpdateLinksInBranchedFiles()
+
+
+if __name__ == '__main__':
+ main()