Flutter Engine
 
Loading...
Searching...
No Matches
main.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <filesystem>
6#include <fstream>
7
9#include "third_party/abseil-cpp/absl/flags/flag.h"
10#include "third_party/abseil-cpp/absl/flags/parse.h"
11#include "third_party/abseil-cpp/absl/flags/usage.h"
12#include "third_party/abseil-cpp/absl/log/globals.h"
13#include "third_party/abseil-cpp/absl/log/initialize.h"
14#include "third_party/abseil-cpp/absl/strings/str_cat.h"
15
16namespace fs = std::filesystem;
17
18ABSL_FLAG(std::optional<std::string>,
19 working_dir,
20 std::nullopt,
21 "[REQUIRED] The directory to scan.");
22ABSL_FLAG(std::optional<std::string>, input, std::nullopt, "The file to scan.");
23ABSL_FLAG(std::optional<std::string>,
24 data_dir,
25 std::nullopt,
26 "[REQUIRED] The directory with the licenses.");
27ABSL_FLAG(std::optional<std::string>,
28 licenses_path,
29 std::nullopt,
30 "[REQUIRED] The path to write the licenses collection to.");
31ABSL_FLAG(std::optional<std::string>,
32 include_filter,
33 std::nullopt,
34 "Regex that overrides the include filter.");
35ABSL_FLAG(int, v, 0, "Set the verbosity of logs.");
37 treat_unmatched_comments_as_errors,
38 false,
39 "Whether unmatched comments are considered errors.");
40ABSL_FLAG(std::optional<std::string>,
41 root_package,
42 std::nullopt,
43 "Name of the root package.");
44
45namespace {
46int Run(std::string_view working_dir,
47 std::ostream& licenses,
48 std::string_view data_dir,
49 std::string_view include_filter,
50 const LicenseChecker::Flags& flags) {
51 absl::StatusOr<Data> data = Data::Open(data_dir);
52 if (!data.ok()) {
53 std::cerr << "Can't load data at " << data_dir << ": " << data.status()
54 << std::endl;
55 return 1;
56 }
57 std::stringstream ss;
58 ss << include_filter;
59
60 absl::StatusOr<Filter> filter = Filter::Open(ss);
61 if (!filter.ok()) {
62 std::cerr << "Invalid include_filter parameter." << std::endl;
63 return 1;
64 }
65
66 data->include_filter = std::move(filter.value());
67
68 std::vector<absl::Status> errors =
69 LicenseChecker::Run(working_dir, licenses, data.value(), flags);
70 for (const absl::Status& status : errors) {
71 std::cerr << status << "\n";
72 }
73
74 return errors.empty() ? 0 : 1;
75}
76} // namespace
77
78int main(int argc, char** argv) {
79 absl::SetProgramUsageMessage(
80 absl::StrCat("Sample usage:\n", argv[0],
81 " --working_dir=<directory> --data_dir=<directory>"));
82
83 std::vector<char*> args = absl::ParseCommandLine(argc, argv);
84 absl::SetGlobalVLogLevel(absl::GetFlag(FLAGS_v));
85 absl::InitializeLog();
86 absl::SetStderrThreshold(absl::LogSeverity::kInfo);
87
88 std::optional<std::string> working_dir = absl::GetFlag(FLAGS_working_dir);
89 std::optional<std::string> input = absl::GetFlag(FLAGS_input);
90 std::optional<std::string> data_dir = absl::GetFlag(FLAGS_data_dir);
91 std::optional<std::string> licenses_path = absl::GetFlag(FLAGS_licenses_path);
92 std::optional<std::string> include_filter =
93 absl::GetFlag(FLAGS_include_filter);
94 if (working_dir.has_value() && data_dir.has_value() &&
95 licenses_path.has_value()) {
96 std::ofstream licenses;
97 licenses.open(licenses_path.value());
98 if (licenses.bad()) {
99 std::cerr << "Unable to write to '" << licenses_path.value() << "'.";
100 return 1;
101 }
104 absl::GetFlag(FLAGS_treat_unmatched_comments_as_errors);
105 flags.root_package_name = absl::GetFlag(FLAGS_root_package);
106 if (input.has_value()) {
107 if (include_filter.has_value()) {
108 std::cerr << "`--input_filter` not supported with `--input`"
109 << std::endl;
110 }
111 fs::path full_path = fs::canonical(input.value());
112 return LicenseChecker::FileRun(working_dir.value(), full_path.string(),
113 licenses, data_dir.value(), flags);
114 } else {
115 if (include_filter.has_value()) {
116 return Run(working_dir.value(), licenses, data_dir.value(),
117 include_filter.value(), flags);
118 } else {
119 return LicenseChecker::Run(working_dir.value(), licenses,
120 data_dir.value(), flags);
121 }
122 }
123 }
124
125 if (!working_dir.has_value()) {
126 std::cerr << "Expected --working_dir flag." << std::endl;
127 }
128
129 if (!licenses_path.has_value()) {
130 std::cerr << "Expected --licenses_path flag." << std::endl;
131 }
132
133 if (!data_dir.has_value()) {
134 std::cerr << "Expected --data_dir flag." << std::endl;
135 }
136
137 return 1;
138}
static absl::StatusOr< Filter > Open(std::string_view path)
Definition filter.cc:9
static int FileRun(std::string_view working_dir, std::string_view full_path, std::ostream &licenses, std::string_view data_dir, const Flags &flags)
Run on a single file.
static std::vector< absl::Status > Run(std::string_view working_dir, std::ostream &licenses, const Data &data)
static int input(yyscan_t yyscanner)
int main(int argc, char **argv)
Definition main.cc:473
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
char ** argv
Definition library.h:9
static absl::StatusOr< Data > Open(std::string_view data_dir)
Definition data.cc:14
std::optional< std::string > root_package_name
std::shared_ptr< const fml::Mapping > data
ABSL_FLAG(std::optional< std::string >, working_dir, std::nullopt, "[REQUIRED] The directory to scan.")