mirror of
https://github.com/google/styleguide.git
synced 2024-03-22 13:11:43 +08:00
CPPLINT.cfg root=setting is now relative to CFG file.
Also further improve the documentation and testing around --root. Previously the root=setting in the CFG file was treated identically to passing --root=setting on the command line, which seems undesirable since it depends on were cpplint.cfg was invoked from (for relative paths). Judging on settings such as 'exclude_files' it seems within the spirit to make the settings 'current working directory' contextual to the same directory that CPPLINT.cfg is in. This also makes execution consistent (picking up the "correct" settings) regardless of the CWD when executing cpplint.py. Example: echo 'root=..' >> /a/b/c/CPPLINT.cfg cd / cpplint.py /a/b/c/source_file.h # expects header guard of C_SOURCE_FILE_H_ However the old behavior would use '/../' = '/' and incorrectly think the root was 'A_B_C_SOURCE_FILE_H_'.
This commit is contained in:
parent
e7ddd2af62
commit
8a87a46cc7
34
cpplint/cpplint.py
vendored
34
cpplint/cpplint.py
vendored
|
@ -114,12 +114,13 @@ Syntax: cpplint.py [--verbose=#] [--output=vs7] [--filter=-x,+y,...]
|
||||||
ignored.
|
ignored.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
Assuming that src/.git exists, the header guard CPP variables for
|
Assuming that top/src/.git exists (and cwd=top/src), the header guard
|
||||||
src/chrome/browser/ui/browser.h are:
|
CPP variables for top/src/chrome/browser/ui/browser.h are:
|
||||||
|
|
||||||
No flag => CHROME_BROWSER_UI_BROWSER_H_
|
No flag => CHROME_BROWSER_UI_BROWSER_H_
|
||||||
--root=chrome => BROWSER_UI_BROWSER_H_
|
--root=chrome => BROWSER_UI_BROWSER_H_
|
||||||
--root=chrome/browser => UI_BROWSER_H_
|
--root=chrome/browser => UI_BROWSER_H_
|
||||||
|
--root=.. => SRC_CHROME_BROWSER_UI_BROWSER_H_
|
||||||
|
|
||||||
linelength=digits
|
linelength=digits
|
||||||
This is the allowed line length for the project. The default value is
|
This is the allowed line length for the project. The default value is
|
||||||
|
@ -168,9 +169,9 @@ Syntax: cpplint.py [--verbose=#] [--output=vs7] [--filter=-x,+y,...]
|
||||||
"linelength" allows to specify the allowed line length for the project.
|
"linelength" allows to specify the allowed line length for the project.
|
||||||
|
|
||||||
The "root" option is similar in function to the --root flag (see example
|
The "root" option is similar in function to the --root flag (see example
|
||||||
above).
|
above). Paths are relative to the directory of the CPPLINT.cfg.
|
||||||
|
|
||||||
The "headers" option is similar in function to the --headers flag
|
The "headers" option is similar in function to the --headers flag
|
||||||
(see example above).
|
(see example above).
|
||||||
|
|
||||||
CPPLINT.cfg has an effect on files in the same directory and all
|
CPPLINT.cfg has an effect on files in the same directory and all
|
||||||
|
@ -539,6 +540,7 @@ _error_suppressions = {}
|
||||||
# The root directory used for deriving header guard CPP variable.
|
# The root directory used for deriving header guard CPP variable.
|
||||||
# This is set by --root flag.
|
# This is set by --root flag.
|
||||||
_root = None
|
_root = None
|
||||||
|
_root_debug = False
|
||||||
|
|
||||||
# The allowed line length of files.
|
# The allowed line length of files.
|
||||||
# This is set by --linelength flag.
|
# This is set by --linelength flag.
|
||||||
|
@ -1802,8 +1804,14 @@ def GetHeaderGuardCPPVariable(filename):
|
||||||
file_path_from_root = fileinfo.RepositoryName()
|
file_path_from_root = fileinfo.RepositoryName()
|
||||||
|
|
||||||
def FixupPathFromRoot():
|
def FixupPathFromRoot():
|
||||||
|
if _root_debug:
|
||||||
|
sys.stderr.write("\n_root fixup, _root = '%s', repository name = '%s'\n"
|
||||||
|
%(_root, fileinfo.RepositoryName()))
|
||||||
|
|
||||||
# Process the file path with the --root flag if it was set.
|
# Process the file path with the --root flag if it was set.
|
||||||
if not _root:
|
if not _root:
|
||||||
|
if _root_debug:
|
||||||
|
sys.stderr.write("_root unspecified\n")
|
||||||
return file_path_from_root
|
return file_path_from_root
|
||||||
|
|
||||||
def StripListPrefix(lst, prefix):
|
def StripListPrefix(lst, prefix):
|
||||||
|
@ -1817,6 +1825,11 @@ def GetHeaderGuardCPPVariable(filename):
|
||||||
# --root=subdir , lstrips subdir from the header guard
|
# --root=subdir , lstrips subdir from the header guard
|
||||||
maybe_path = StripListPrefix(PathSplitToList(file_path_from_root),
|
maybe_path = StripListPrefix(PathSplitToList(file_path_from_root),
|
||||||
PathSplitToList(_root))
|
PathSplitToList(_root))
|
||||||
|
|
||||||
|
if _root_debug:
|
||||||
|
sys.stderr.write("_root lstrip (maybe_path=%s, file_path_from_root=%s," +
|
||||||
|
" _root=%s)\n" %(maybe_path, file_path_from_root, _root))
|
||||||
|
|
||||||
if maybe_path:
|
if maybe_path:
|
||||||
return os.path.join(*maybe_path)
|
return os.path.join(*maybe_path)
|
||||||
|
|
||||||
|
@ -1826,9 +1839,17 @@ def GetHeaderGuardCPPVariable(filename):
|
||||||
|
|
||||||
maybe_path = StripListPrefix(PathSplitToList(full_path),
|
maybe_path = StripListPrefix(PathSplitToList(full_path),
|
||||||
PathSplitToList(root_abspath))
|
PathSplitToList(root_abspath))
|
||||||
|
|
||||||
|
if _root_debug:
|
||||||
|
sys.stderr.write("_root prepend (maybe_path=%s, full_path=%s, " +
|
||||||
|
"root_abspath=%s)\n" %(maybe_path, full_path, root_abspath))
|
||||||
|
|
||||||
if maybe_path:
|
if maybe_path:
|
||||||
return os.path.join(*maybe_path)
|
return os.path.join(*maybe_path)
|
||||||
|
|
||||||
|
if _root_debug:
|
||||||
|
sys.stderr.write("_root ignore, returning %s\n" %(file_path_from_root))
|
||||||
|
|
||||||
# --root=FAKE_DIR is ignored
|
# --root=FAKE_DIR is ignored
|
||||||
return file_path_from_root
|
return file_path_from_root
|
||||||
|
|
||||||
|
@ -5947,7 +5968,8 @@ def ProcessConfigOverrides(filename):
|
||||||
sys.stderr.write('Line length must be numeric.')
|
sys.stderr.write('Line length must be numeric.')
|
||||||
elif name == 'root':
|
elif name == 'root':
|
||||||
global _root
|
global _root
|
||||||
_root = val
|
# root directories are specified relative to CPPLINT.cfg dir.
|
||||||
|
_root = os.path.join(os.path.dirname(cfg_file), val)
|
||||||
elif name == 'headers':
|
elif name == 'headers':
|
||||||
ProcessHppHeadersOption(val)
|
ProcessHppHeadersOption(val)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -4218,6 +4218,8 @@ class CpplintTest(CpplintTestBase):
|
||||||
error_collector.ResultList())
|
error_collector.ResultList())
|
||||||
|
|
||||||
def testBuildHeaderGuardWithRoot(self):
|
def testBuildHeaderGuardWithRoot(self):
|
||||||
|
# note: Tested file paths must be real, otherwise
|
||||||
|
# the repository name lookup will fail.
|
||||||
file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
||||||
'cpplint_test_header.h')
|
'cpplint_test_header.h')
|
||||||
file_info = cpplint.FileInfo(file_path)
|
file_info = cpplint.FileInfo(file_path)
|
||||||
|
@ -4238,9 +4240,33 @@ class CpplintTest(CpplintTestBase):
|
||||||
#
|
#
|
||||||
|
|
||||||
# left-strip the header guard by using a root dir inside of the repo dir.
|
# left-strip the header guard by using a root dir inside of the repo dir.
|
||||||
|
# relative directory
|
||||||
cpplint._root = 'cpplint'
|
cpplint._root = 'cpplint'
|
||||||
self.assertEquals('CPPLINT_TEST_HEADER_H_',
|
self.assertEquals('CPPLINT_TEST_HEADER_H_',
|
||||||
cpplint.GetHeaderGuardCPPVariable(file_path))
|
cpplint.GetHeaderGuardCPPVariable(file_path))
|
||||||
|
|
||||||
|
nested_file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
||||||
|
os.path.join('nested',
|
||||||
|
'cpplint_test_header.h'))
|
||||||
|
cpplint._root = os.path.join('cpplint', 'nested')
|
||||||
|
actual = cpplint.GetHeaderGuardCPPVariable(nested_file_path)
|
||||||
|
self.assertEquals('CPPLINT_TEST_HEADER_H_',
|
||||||
|
actual)
|
||||||
|
|
||||||
|
# absolute directory
|
||||||
|
# (note that CPPLINT.cfg root=setting is always made absolute)
|
||||||
|
cpplint._root = os.path.join(os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
self.assertEquals('CPPLINT_TEST_HEADER_H_',
|
||||||
|
cpplint.GetHeaderGuardCPPVariable(file_path))
|
||||||
|
|
||||||
|
nested_file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
||||||
|
os.path.join('nested',
|
||||||
|
'cpplint_test_header.h'))
|
||||||
|
cpplint._root = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
||||||
|
'nested')
|
||||||
|
self.assertEquals('CPPLINT_TEST_HEADER_H_',
|
||||||
|
cpplint.GetHeaderGuardCPPVariable(nested_file_path))
|
||||||
|
|
||||||
# --root flag is ignored if an non-existent directory is specified.
|
# --root flag is ignored if an non-existent directory is specified.
|
||||||
cpplint._root = 'NON_EXISTENT_DIR'
|
cpplint._root = 'NON_EXISTENT_DIR'
|
||||||
self.assertEquals('CPPLINT_CPPLINT_TEST_HEADER_H_',
|
self.assertEquals('CPPLINT_CPPLINT_TEST_HEADER_H_',
|
||||||
|
@ -4250,6 +4276,7 @@ class CpplintTest(CpplintTestBase):
|
||||||
# than the repo dir
|
# than the repo dir
|
||||||
|
|
||||||
# (using absolute paths)
|
# (using absolute paths)
|
||||||
|
# (note that CPPLINT.cfg root=setting is always made absolute)
|
||||||
this_files_path = os.path.dirname(os.path.abspath(__file__))
|
this_files_path = os.path.dirname(os.path.abspath(__file__))
|
||||||
(styleguide_path, this_files_dir) = os.path.split(this_files_path)
|
(styleguide_path, this_files_dir) = os.path.split(this_files_path)
|
||||||
(styleguide_parent_path, _) = os.path.split(styleguide_path)
|
(styleguide_parent_path, _) = os.path.split(styleguide_path)
|
||||||
|
@ -4260,6 +4287,10 @@ class CpplintTest(CpplintTestBase):
|
||||||
self.assertEquals('STYLEGUIDE_CPPLINT_CPPLINT_TEST_HEADER_H_',
|
self.assertEquals('STYLEGUIDE_CPPLINT_CPPLINT_TEST_HEADER_H_',
|
||||||
cpplint.GetHeaderGuardCPPVariable(file_path))
|
cpplint.GetHeaderGuardCPPVariable(file_path))
|
||||||
|
|
||||||
|
# To run the 'relative path' tests, we must be in the directory of this test file.
|
||||||
|
cur_dir = os.getcwd()
|
||||||
|
os.chdir(this_files_path)
|
||||||
|
|
||||||
# (using relative paths)
|
# (using relative paths)
|
||||||
styleguide_rel_path = os.path.relpath(styleguide_path, this_files_path)
|
styleguide_rel_path = os.path.relpath(styleguide_path, this_files_path)
|
||||||
# '..'
|
# '..'
|
||||||
|
@ -4275,6 +4306,9 @@ class CpplintTest(CpplintTestBase):
|
||||||
|
|
||||||
cpplint._root = None
|
cpplint._root = None
|
||||||
|
|
||||||
|
# Restore previous CWD.
|
||||||
|
os.chdir(cur_dir)
|
||||||
|
|
||||||
def testPathSplitToList(self):
|
def testPathSplitToList(self):
|
||||||
self.assertEquals([''],
|
self.assertEquals([''],
|
||||||
cpplint.PathSplitToList(os.path.join('')))
|
cpplint.PathSplitToList(os.path.join('')))
|
||||||
|
|
1
cpplint/nested/cpplint_test_header.h
Normal file
1
cpplint/nested/cpplint_test_header.h
Normal file
|
@ -0,0 +1 @@
|
||||||
|
// A test header for cpplint_unittest.py.
|
Loading…
Reference in New Issue
Block a user