in src/advisor/main.py [0:0]
def main(argv=sys.argv[1:]):
default_os = os.name
if default_os == 'nt':
default_os = 'windows'
else:
default_os = 'linux'
epilog = _('Use:') + '\n' + \
textwrap.fill(_('--issue-types=+CrossCompile to enable reporting of cross-compile specific issues.'),
initial_indent=' ',
subsequent_indent=' ') + '\n' + \
textwrap.fill(_('--issue-types=+CompilerSpecific to enable reporting of use of compiler-specific macros.'),
initial_indent=' ',
subsequent_indent=' ') + '\n' + \
textwrap.fill(
_('--issue-types=+NoEquivalent to enable reporting of aarch64 ported code that does not use intrinsics inline assembly versus other architectures.'),
initial_indent=' ',
subsequent_indent=' ') + '\n\n' + \
_('Available issue types:') + '\n' + \
textwrap.fill(', '.join(sorted(ISSUE_TYPES.keys())),
initial_indent=' ',
subsequent_indent=' ')
parser = argparse.ArgumentParser(
prog=__project__,
description=__summary__,
epilog=epilog,
formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('root', metavar='DIRECTORY',
help=_('root directory of source tree (default: .)'),
default='.')
parser.add_argument('--issue-types',
help=_('modify the types of issue that are reported (default: %s)') % IssueTypeConfig.DEFAULT_FILTER)
parser.add_argument('--no-filter', action='store_true',
help=_("don't filter architecture-specific code that appears to have an aarch64 equivalent"),
default=False)
parser.add_argument('--no-progress', action='store_false',
help=("don't show progress bar"),
dest='progress')
parser.add_argument('--output',
help=_('output file name'),
default=None)
parser.add_argument('--output-format',
help=_('output format: %s (default: %s)') % \
(','.join(str(output_format.value) for output_format in ReportOutputFormat),
ReportOutputFormat.DEFAULT.value),
default=ReportOutputFormat.DEFAULT.value)
parser.add_argument('--quiet', action='store_true',
help=_('suppress file errors'),
default=False)
parser.add_argument('--target-os',
help=_('target operating system: all,linux,windows (default: %s)') % default_os,
default=default_os)
parser.add_argument('--version', action='version',
version='%(prog)s ' + __version__)
parser.add_argument('--logging-level',
help=('the level of detail to be included on the log file'),
choices=['error', 'warning', 'info', 'debug'],
default='error')
parser.add_argument('--log-file',
help=('log file name'),
default='gpa.log')
parser.add_argument('--log-to-console', action='store_true',
help=('log to console instead of a file'))
args = parser.parse_args(argv)
if (args.log_to_console):
logging.basicConfig(level=get_logging_level(args.logging_level), format='%(asctime)s - %(levelname)s - %(message)s')
else:
logging.basicConfig(level=get_logging_level(args.logging_level), format='%(asctime)s - %(levelname)s - %(message)s', filename=args.log_file)
if not os.path.exists(args.root):
print(_('%s: directory not found.') % args.root, file=sys.stderr)
sys.exit(1)
elif not os.path.isdir(args.root):
print(_('%s: not a directory.') % args.root, file=sys.stderr)
sys.exit(1)
print_footer = False
report_factory = ReportFactory()
print_footer = False
try:
args.output_format = ReportOutputFormat(args.output_format)
if args.output_format == ReportOutputFormat.AUTO:
if not args.output:
args.output_format = ReportOutputFormat.TEXT
print_footer = True
else:
# Take the output format from the output file extension.
args.output_format = os.path.splitext(args.output)[1][1:]
args.output_format = report_factory.output_format_for_extension(args.output_format)
except ValueError:
print(_('%s: invalid output format') % args.output_format, file=sys.stderr)
sys.exit(1)
args.issue_types = IssueTypeConfig(args.issue_types)
report = report_factory.createReport(args.root, target_os=args.target_os, issue_type_config=args.issue_types, output_format=args.output_format)
if report.self_process:
report.process(args)
else:
scanners = Scanners(args.issue_types, filter_ported_code=not args.no_filter)
scanners.initialize_report(report)
scanner = AutoScanner(scanners)
if args.progress:
class FileNameLabel(Widget):
def __init__(self):
self.fname = None
def set_file_name(self, fname):
self.fname = fname
def update(self, pbar):
return self.fname if self.fname else ''
def progress_callback(filename):
fname_label.set_file_name(filename)
progress.update()
fname_label = FileNameLabel()
progress = ProgressBar(maxval=UnknownLength,
widgets=[AnimatedMarker(), ' ', Timer(), ' ', fname_label],
poll=0.1)
progress.start()
scanner.scan_tree(args.root, report,
progress_callback=progress_callback if args.progress else None)
if args.progress:
fname_label.set_file_name(None)
progress.finish()
scanners.finalize_report(report)
print(f'\nPorting Advisor for Graviton v{__version__}')
report_date = datetime.today().strftime('%Y-%m-%d %H:%M:%S')
print(f'Report date: {report_date}\n')
if args.output:
if report.send_filename:
report.write(args.output, report_errors=not args.quiet)
else:
with open(args.output, report.open_text_mode) as f:
report.write(f, report_errors=not args.quiet)
print(f'Report saved at: {args.output}')
else:
report.write(sys.stdout, report_errors=not args.quiet)
if print_footer:
print('\nReport generated successfully. Hint: you can use --output FILENAME.html to generate an HTML report.')