def __init__(self, log: Log, package: Package, clangFormatConfiguration: ClangFormatConfiguration, filteredFiles: Optional[List[str]]) -> None: allFiles = [] # type: List[ResolvedPath] if package.ResolvedBuildAllIncludeFiles is not None and package.AllowCheck and not package.IsVirtual: if package.AbsolutePath is None or package.ResolvedBuildSourceFiles is None: raise Exception("Invalid package") if filteredFiles is None: for fileName in package.ResolvedBuildAllIncludeFiles: fullPath = IOUtil.Join(package.AbsolutePath, fileName) # Only process files with the expected extension if PerformClangUtil.IsValidExtension( fileName, clangFormatConfiguration.FileExtensions): allFiles.append(ResolvedPath(fileName, fullPath)) for fileName in package.ResolvedBuildSourceFiles: fullPath = IOUtil.Join(package.AbsolutePath, fileName) if PerformClangUtil.IsValidExtension( fileName, clangFormatConfiguration.FileExtensions): allFiles.append(ResolvedPath(fileName, fullPath)) if package.ResolvedContentFiles is not None: for resolvedPath in package.ResolvedContentFiles: if PerformClangUtil.IsValidExtension( resolvedPath.ResolvedPath, clangFormatConfiguration.FileExtensions): allFiles.append( self.__GetResolvedPath(package, resolvedPath)) if package.ResolvedContentBuilderSyncInputFiles is not None: for resolvedPath in package.ResolvedContentBuilderSyncInputFiles: if PerformClangUtil.IsValidExtension( resolvedPath.ResolvedPath, clangFormatConfiguration.FileExtensions): allFiles.append( self.__GetResolvedPath(package, resolvedPath)) if package.ResolvedContentBuilderBuildInputFiles is not None: for resolvedPath in package.ResolvedContentBuilderBuildInputFiles: if PerformClangUtil.IsValidExtension( resolvedPath.ResolvedPath, clangFormatConfiguration.FileExtensions): allFiles.append( self.__GetResolvedPath(package, resolvedPath)) else: for fileEntry in filteredFiles: allFiles.append( self.__GetResolvedPathFromAbsPath(package, fileEntry)) self.AllFiles = allFiles
def TryLocateFilePatternInPackage( self, log: Log, package: Package, validExtensionList: List[str]) -> Optional[List[str]]: allPackageFileList = self.__GetAllPackageFilesList(package, None) filenameDict = self.__CreateFilenameLookupDict(allPackageFileList) # pattern match the filenames matchedFilenames = fnmatch.filter(filenameDict.keys(), self.PatternFileName) matchedFiles = self.__MatchPaths(matchedFilenames, filenameDict, self.PatternDirectory) # strip all files with unsupported extensions matchedFiles = [ filepath for filepath in matchedFiles if PerformClangUtil.IsValidExtension(filepath, validExtensionList) ] matchedFiles.sort() return matchedFiles if len(matchedFiles) > 0 else None
def _RunClangFormat(log: Log, toolConfig: ToolConfig, clangFormatConfiguration: ClangFormatConfiguration, clangExeInfo: ClangExeInfo, package: Package, filteredFiles: Optional[List[str]], repairEnabled: bool) -> None: if not package.ResolvedBuildAllIncludeFiles or not package.AllowCheck or package.IsVirtual: return if package.AbsolutePath is None or package.ResolvedBuildSourceFiles is None: raise Exception("Invalid package") allFiles = [] # type: List[str] if filteredFiles is None: for fileName in package.ResolvedBuildAllIncludeFiles: fullPath = IOUtil.Join(package.AbsolutePath, fileName) # Only process files with the expected extension if PerformClangUtil.IsValidExtension( fileName, clangFormatConfiguration.FileExtensions): allFiles.append(fileName) for fileName in package.ResolvedBuildSourceFiles: fullPath = IOUtil.Join(package.AbsolutePath, fileName) if PerformClangUtil.IsValidExtension( fileName, clangFormatConfiguration.FileExtensions): allFiles.append(fileName) if package.ResolvedContentFiles is not None: for resolvedPath in package.ResolvedContentFiles: if PerformClangUtil.IsValidExtension( resolvedPath.ResolvedPath, clangFormatConfiguration.FileExtensions): allFiles.append(resolvedPath.ResolvedPath) if package.ResolvedContentBuilderSyncInputFiles is not None: for resolvedPath in package.ResolvedContentBuilderSyncInputFiles: if PerformClangUtil.IsValidExtension( resolvedPath.ResolvedPath, clangFormatConfiguration.FileExtensions): allFiles.append(resolvedPath.ResolvedPath) if package.ResolvedContentBuilderBuildInputFiles is not None: for resolvedPath in package.ResolvedContentBuilderBuildInputFiles: if PerformClangUtil.IsValidExtension( resolvedPath.ResolvedPath, clangFormatConfiguration.FileExtensions): allFiles.append(resolvedPath.ResolvedPath) else: allFiles += filteredFiles cmd = clangExeInfo.ClangCommand buildCommand = [cmd, '-style=file'] if repairEnabled: buildCommand.append('-i') if len(clangFormatConfiguration.AdditionalUserArguments) > 0: log.LogPrint("Adding user supplied arguments before '--' {0}".format( clangFormatConfiguration.AdditionalUserArguments)) buildCommand += clangFormatConfiguration.AdditionalUserArguments buildCommand += allFiles currentWorkingDirectory = package.AbsolutePath FileFinder.FindClosestFileInRoot(log, toolConfig, currentWorkingDirectory, clangFormatConfiguration.CustomFormatFile) try: # if verbose enabled we log the clang-format version if log.Verbosity >= 4: log.LogPrint("Running command '{0}' in cwd: {1}".format( buildCommand, currentWorkingDirectory)) result = subprocess.call(buildCommand, cwd=currentWorkingDirectory) if result != 0: log.LogPrintWarning( "The command '{0}' failed with '{1}'. It was run with CWD: '{2}'" .format(" ".join(buildCommand), result, currentWorkingDirectory)) sys.exit(result) except FileNotFoundError: log.DoPrintWarning( "The command '{0}' failed with 'file not found'. It was run with CWD: '{1}'" .format(" ".join(buildCommand), currentWorkingDirectory)) raise
def _RunClangTidy( log: Log, toolConfig: ToolConfig, platformId: str, performClangTidyConfig: PerformClangTidyConfig, clangExeInfo: ClangExeInfo, package: Package, filteredFiles: Optional[List[str]], clangFormatFilename: Optional[str], localVariantInfo: LocalVariantInfo, virtualVariantEnvironmentCache: VirtualVariantEnvironmentCache, logOutput: bool = False) -> None: if package.ResolvedBuildAllIncludeFiles is None: raise Exception("invalid package") log.LogPrint("- {0}".format(package.Name)) clangTidyConfiguration = performClangTidyConfig.ClangTidyConfiguration if package.AbsolutePath is None or package.ResolvedBuildSourceFiles is None: raise Exception("Invalid package") allFiles = [] # type: List[str] if filteredFiles is None: for fileName in package.ResolvedBuildAllIncludeFiles: fullPath = IOUtil.Join(package.AbsolutePath, fileName) # Only process files with the expected extension if PerformClangUtil.IsValidExtension( fileName, clangTidyConfiguration.FileExtensions): allFiles.append(fileName) for fileName in package.ResolvedBuildSourceFiles: fullPath = IOUtil.Join(package.AbsolutePath, fileName) if PerformClangUtil.IsValidExtension( fileName, clangTidyConfiguration.FileExtensions): allFiles.append(fileName) else: for fileName in filteredFiles: if PerformClangUtil.IsValidExtension( fileName, clangTidyConfiguration.FileExtensions): allFiles.append(fileName) # ensure we process the files in the same order every time allFiles.sort() platformCompilerFlags = [] # type: List[str] platformDefineCommands = [] # type: List[str] platformStrictChecks = [] # type: List[str] if platformId in clangTidyConfiguration.PlatformDict: clangPlatformConfig = clangTidyConfiguration.PlatformDict[platformId] platformCompilerFlags = clangPlatformConfig.Compiler.Flags for platformDefine in clangPlatformConfig.Defines.All: platformDefineCommands.append('-D') platformDefineCommands.append(platformDefine) # We default to release for now for platformDefine in clangPlatformConfig.Defines.Release: platformDefineCommands.append('-D') platformDefineCommands.append(platformDefine) for strictCheck in clangPlatformConfig.StrictChecks: platformStrictChecks.append(strictCheck) includePaths = __BuildClangTidyPackageIncludePaths( log, localVariantInfo, virtualVariantEnvironmentCache, package) packageDefineCommands = __BuildClangTidyPackageDefines( log, localVariantInfo, package) cmd = clangExeInfo.ClangCommand buildCommand = [cmd] if performClangTidyConfig.Repair: buildCommand.append('-fix') #buildCommand.append('-fix-errors') #buildCommand.append('-header-filter=.*') usingCheckCommand = False if len(performClangTidyConfig.OverrideChecks) > 0: newOverrideChecks = ",".join(performClangTidyConfig.OverrideChecks) log.LogPrintVerbose( 2, "Overriding checks checks '{0}'".format(newOverrideChecks)) if performClangTidyConfig.StrictChecks: log.DoPrintWarning( "Ignoreing strict checks because 'override' is enabled") buildCommand.append("--checks") buildCommand.append(newOverrideChecks) usingCheckCommand = True elif performClangTidyConfig.StrictChecks and len(platformStrictChecks) > 0: newStrictChecks = ",".join(platformStrictChecks) log.LogPrintVerbose( 2, "Adding strict checks '{0}'".format(newStrictChecks)) buildCommand.append("--checks") buildCommand.append(newStrictChecks) usingCheckCommand = True if len(performClangTidyConfig.AdditionalUserArguments) > 0: log.LogPrintVerbose( 2, "Adding user supplied arguments before '--' {0}".format( performClangTidyConfig.AdditionalUserArguments)) if usingCheckCommand and '--checks' in performClangTidyConfig.AdditionalUserArguments: log.DoPrintWarning( "another command is adding '--checks' so it could conflict with the user supplied argument" ) buildCommand += performClangTidyConfig.AdditionalUserArguments buildCommand += allFiles buildCommand.append('--') if len(platformCompilerFlags) > 0: buildCommand += __LookupEnvironmentVariables( platformCompilerFlags, virtualVariantEnvironmentCache) if len(platformDefineCommands) > 0: buildCommand += platformDefineCommands if len(includePaths) > 0: buildCommand += includePaths if len(packageDefineCommands) > 0: buildCommand += packageDefineCommands if len(performClangTidyConfig.PostfixArguments) > 0: log.LogPrintVerbose( 2, "Adding user supplied arguments after '--' {0}".format( performClangTidyConfig.PostfixArguments)) buildCommand += performClangTidyConfig.PostfixArguments currentWorkingDirectory = package.AbsolutePath if clangFormatFilename is not None: FileFinder.FindClosestFileInRoot(log, toolConfig, currentWorkingDirectory, clangFormatFilename) FileFinder.FindClosestFileInRoot(log, toolConfig, currentWorkingDirectory, clangTidyConfiguration.CustomTidyFile) try: if log.Verbosity >= 4: log.LogPrint("Running command '{0}' in cwd: {1}".format( buildCommand, currentWorkingDirectory)) result = __RunNow(log, buildCommand, currentWorkingDirectory, logOutput) if result != 0: log.LogPrintWarning( "The command '{0}' failed with '{1}'. It was run with CWD: '{2}'" .format(" ".join(buildCommand), result, currentWorkingDirectory)) raise ExitException(result) except FileNotFoundError: log.DoPrintWarning( "The command '{0}' failed with 'file not found'. It was run with CWD: '{1}'" .format(" ".join(buildCommand), currentWorkingDirectory)) raise