Sync from Google

This commit is contained in:
Corentin Le Molgat
2022-03-03 14:08:37 +01:00
parent bf1e668e10
commit fca3456c45
15 changed files with 91 additions and 87 deletions

View File

@@ -57,10 +57,12 @@ OR-Tools depends on several mandatory libraries.
You must compile OR-Tools using C++20:
* on UNIX:
```sh
bazel build --cxxopt=-std=c++20 //...:all
```
* on Windows when using MSVC:
```sh
bazel build --cxxopt="-std:c++20" //...:all
```
@@ -70,10 +72,12 @@ You must compile OR-Tools using C++20:
You may run tests using:
* on UNIX:
```sh
bazel test --cxxopt=-std=c++20 //...:all
```
* on Windows when using MSVC:
```sh
bazel test --cxxopt="-std:c++20" //...:all
```

View File

@@ -289,8 +289,8 @@ class KnapsackSolver {
// TODO(user): Add a new propagator class used as a guide when the problem has
// several dimensions.
// ----- KnapsackAssignement -----
// KnapsackAssignement is a small struct used to pair an item with its
// ----- KnapsackAssignment -----
// KnapsackAssignment is a small struct used to pair an item with its
// assignment. It is mainly used for search nodes and updates.
struct KnapsackAssignment {
KnapsackAssignment(int _item_id, bool _is_in)

View File

@@ -47,7 +47,7 @@ bool File::Flush() { return fflush(f_) == 0; }
bool File::Close() {
if (fclose(f_) == 0) {
f_ = NULL;
f_ = nullptr;
return true;
} else {
return false;
@@ -80,7 +80,7 @@ size_t File::Write(const void* const buf, size_t size) {
File* File::OpenOrDie(const char* const name, const char* const flag) {
FILE* const f_des = fopen(name, flag);
if (f_des == NULL) {
if (f_des == nullptr) {
std::cerr << "Cannot open " << name;
exit(1);
}
@@ -90,7 +90,7 @@ File* File::OpenOrDie(const char* const name, const char* const flag) {
File* File::Open(const char* const name, const char* const flag) {
FILE* const f_des = fopen(name, flag);
if (f_des == NULL) return NULL;
if (f_des == nullptr) return nullptr;
File* const f = new File(f_des, name);
return f;
}
@@ -134,7 +134,7 @@ bool File::WriteLine(const std::string& line) {
absl::string_view File::filename() const { return name_; }
bool File::Open() const { return f_ != NULL; }
bool File::Open() const { return f_ != nullptr; }
void File::Init() {}
@@ -164,7 +164,7 @@ absl::Status GetContents(const absl::string_view& filename, std::string* output,
int flags) {
if (flags == Defaults()) {
File* file = File::Open(filename, "r");
if (file != NULL) {
if (file != nullptr) {
const int64_t size = file->Size();
if (file->ReadToString(output, size) == size) return absl::OkStatus();
#if defined(_MSC_VER)
@@ -183,7 +183,7 @@ absl::Status GetContents(const absl::string_view& filename, std::string* output,
absl::Status WriteString(File* file, const absl::string_view& contents,
int flags) {
if (flags == Defaults() && file != NULL &&
if (flags == Defaults() && file != nullptr &&
file->Write(contents.data(), contents.size()) == contents.size() &&
file->Close()) {
return absl::OkStatus();

View File

@@ -174,9 +174,9 @@ class IntType;
// operators.
//
// The template parameter IntTypeName defines the name for the int type and must
// be unique within a binary (the convenient DEFINE_INT_TYPE macro at the end of
// the file generates a unique IntTypeName). The parameter ValueType defines
// the integer type value (see supported list above).
// be unique within a binary (the convenient DEFINE_INT_TYPE macro at the
// end of the file generates a unique IntTypeName). The parameter ValueType
// defines the integer type value (see supported list above).
//
// This class is NOT thread-safe.
template <typename IntTypeName, typename _ValueType>

View File

@@ -25,16 +25,16 @@ class JNIUtil {
// Creates a Java jstring from a null-terminated UTF-8 encoded C String.
// The caller must delete the jstring reference.
static jstring MakeJString(JNIEnv* env, const char* cstr) {
if (cstr == NULL) return NULL;
if (cstr == nullptr) return nullptr;
return env->NewStringUTF(cstr);
}
// Creates a null-terminated UTF-8 encoded C string from a jstring.
// The returned string should be "delete[]"-ed when no longer needed.
static char* MakeCString(JNIEnv* env, jstring str) {
if (str == NULL) return NULL;
if (str == nullptr) return nullptr;
jsize length = env->GetStringUTFLength(str);
const char* src = env->GetStringUTFChars(str, NULL);
const char* src = env->GetStringUTFChars(str, nullptr);
char* dst = new char[length + 1];
memcpy(dst, src, length);
dst[length] = '\0';

View File

@@ -141,11 +141,11 @@ ABSL_FLAG(int, logbufsecs, 30,
static const char* DefaultLogDir() {
const char* env;
env = getenv("GOOGLE_LOG_DIR");
if (env != NULL && env[0] != '\0') {
if (env != nullptr && env[0] != '\0') {
return env;
}
env = getenv("TEST_TMPDIR");
if (env != NULL && env[0] != '\0') {
if (env != nullptr && env[0] != '\0') {
return env;
}
return "";
@@ -229,7 +229,7 @@ static bool TerminalSupportsColor() {
#else
// On non-Windows platforms, we rely on the TERM variable.
const char* const term = getenv("TERM");
if (term != NULL && term[0] != '\0') {
if (term != nullptr && term[0] != '\0') {
term_supports_color =
!strcmp(term, "xterm") || !strcmp(term, "xterm-color") ||
!strcmp(term, "xterm-256color") || !strcmp(term, "screen-256color") ||
@@ -296,7 +296,7 @@ static const char* GetAnsiColorCode(GLogColor color) {
case COLOR_DEFAULT:
return "";
}
return NULL; // stop warning about return type.
return nullptr; // stop warning about return type.
}
#endif // !_MSC_VER
@@ -323,9 +323,9 @@ struct LogMessage::LogMessageData {
int line_; // line number where logging call is.
void (LogMessage::*send_method_)(); // Call this in destructor to send
union { // At most one of these is used: union to keep the size low.
LogSink* sink_; // NULL or sink to send message to
std::vector<std::string>* outvec_; // NULL or vector to push message onto
std::string* message_; // NULL or string to write message into
LogSink* sink_; // null or sink to send message to
std::vector<std::string>* outvec_; // null or vector to push message onto
std::string* message_; // null or string to write message into
};
time_t timestamp_; // Time of creation of LogMessage
struct ::tm tm_time_; // Time of creation of LogMessage
@@ -509,7 +509,7 @@ class LogDestination {
string LogDestination::addresses_; // NOLINT
string LogDestination::hostname_; // NOLINT
vector<LogSink*>* LogDestination::sinks_ = NULL;
vector<LogSink*>* LogDestination::sinks_ = nullptr;
absl::Mutex LogDestination::sink_mutex_;
bool LogDestination::terminal_supports_color_ = TerminalSupportsColor();
@@ -532,7 +532,7 @@ inline void LogDestination::FlushLogFilesUnsafe(int min_severity) {
// about it
for (int i = min_severity; i < NUM_SEVERITIES; i++) {
LogDestination* log = log_destinations_[i];
if (log != NULL) {
if (log != nullptr) {
// Flush the base fileobject_ logger directly instead of going
// through any wrappers to reduce chance of deadlock.
log->fileobject_.FlushUnlocked();
@@ -546,7 +546,7 @@ inline void LogDestination::FlushLogFiles(int min_severity) {
absl::MutexLock l(&log_mutex);
for (int i = min_severity; i < NUM_SEVERITIES; i++) {
LogDestination* log = log_destination(i);
if (log != NULL) {
if (log != nullptr) {
log->logger_->Flush();
}
}
@@ -719,7 +719,7 @@ inline void LogDestination::WaitForSinks(LogMessage::LogMessageData* data) {
const bool send_to_sink =
(data->send_method_ == &LogMessage::SendToSink) ||
(data->send_method_ == &LogMessage::SendToSinkAndLog);
if (send_to_sink && data->sink_ != NULL) {
if (send_to_sink && data->sink_ != nullptr) {
data->sink_->WaitTillSent();
}
}
@@ -729,7 +729,7 @@ LogDestination* LogDestination::log_destinations_[NUM_SEVERITIES];
inline LogDestination* LogDestination::log_destination(LogSeverity severity) {
assert(severity >= 0 && severity < NUM_SEVERITIES);
if (!log_destinations_[severity]) {
log_destinations_[severity] = new LogDestination(severity, NULL);
log_destinations_[severity] = new LogDestination(severity, nullptr);
}
return log_destinations_[severity];
}
@@ -737,21 +737,21 @@ inline LogDestination* LogDestination::log_destination(LogSeverity severity) {
void LogDestination::DeleteLogDestinations() {
for (int severity = 0; severity < NUM_SEVERITIES; ++severity) {
delete log_destinations_[severity];
log_destinations_[severity] = NULL;
log_destinations_[severity] = nullptr;
}
absl::MutexLock l(&sink_mutex_);
delete sinks_;
sinks_ = NULL;
sinks_ = nullptr;
}
namespace {
LogFileObject::LogFileObject(LogSeverity severity, const char* base_filename)
: base_filename_selected_(base_filename != NULL),
base_filename_((base_filename != NULL) ? base_filename : ""),
: base_filename_selected_(base_filename != nullptr),
base_filename_((base_filename != nullptr) ? base_filename : ""),
symlink_basename_(logging_internal::ProgramInvocationShortName()),
filename_extension_(),
file_(NULL),
file_(nullptr),
severity_(severity),
bytes_since_flush_(0),
dropped_mem_length_(0),
@@ -764,9 +764,9 @@ LogFileObject::LogFileObject(LogSeverity severity, const char* base_filename)
LogFileObject::~LogFileObject() {
absl::MutexLock l(&lock_);
if (file_ != NULL) {
if (file_ != nullptr) {
fclose(file_);
file_ = NULL;
file_ = nullptr;
}
}
@@ -775,9 +775,9 @@ void LogFileObject::SetBasename(const char* basename) {
base_filename_selected_ = true;
if (base_filename_ != basename) {
// Get rid of old log file since we are changing names
if (file_ != NULL) {
if (file_ != nullptr) {
fclose(file_);
file_ = NULL;
file_ = nullptr;
rollover_attempt_ = kRolloverAttemptFrequency - 1;
}
base_filename_ = basename;
@@ -788,9 +788,9 @@ void LogFileObject::SetExtension(const char* ext) {
absl::MutexLock l(&lock_);
if (filename_extension_ != ext) {
// Get rid of old log file since we are changing names
if (file_ != NULL) {
if (file_ != nullptr) {
fclose(file_);
file_ = NULL;
file_ = nullptr;
rollover_attempt_ = kRolloverAttemptFrequency - 1;
}
filename_extension_ = ext;
@@ -808,7 +808,7 @@ void LogFileObject::Flush() {
}
void LogFileObject::FlushUnlocked() {
if (file_ != NULL) {
if (file_ != nullptr) {
fflush(file_);
bytes_since_flush_ = 0;
}
@@ -832,7 +832,7 @@ bool LogFileObject::CreateLogfile(const string& time_pid_string) {
#endif
file_ = fdopen(fd, "a"); // Make a FILE*.
if (file_ == NULL) { // Man, we're screwed!
if (file_ == nullptr) { // Man, we're screwed!
close(fd);
unlink(filename); // Erase the half-baked evidence: an unusable log file
return false;
@@ -888,14 +888,14 @@ void LogFileObject::Write(bool force_flush, time_t timestamp,
}
if (static_cast<int>(file_length_ >> 20) >= MaxLogSize()) {
if (file_ != NULL) fclose(file_);
file_ = NULL;
if (file_ != nullptr) fclose(file_);
file_ = nullptr;
file_length_ = bytes_since_flush_ = dropped_mem_length_ = 0;
rollover_attempt_ = kRolloverAttemptFrequency - 1;
}
// If there's no destination file, make one before outputting
if (file_ == NULL) {
if (file_ == nullptr) {
// Try to rollover the log file every 32 log messages. The only time
// this could matter would be when we have trouble creating the log
// file. If that happens, we'll lose lots of log messages, of course!
@@ -1065,52 +1065,52 @@ LogMessage::LogMessageData::LogMessageData()
LogMessage::LogMessage(const char* file, int line, LogSeverity severity,
int ctr, void (LogMessage::*send_method)())
: allocated_(NULL) {
: allocated_(nullptr) {
Init(file, line, severity, send_method);
data_->stream_.set_ctr(ctr);
}
LogMessage::LogMessage(const char* file, int line, const CheckOpString& result)
: allocated_(NULL) {
: allocated_(nullptr) {
Init(file, line, GLOG_FATAL, &LogMessage::SendToLog);
stream() << "Check failed: " << (*result.str_) << " ";
}
LogMessage::LogMessage(const char* file, int line) : allocated_(NULL) {
LogMessage::LogMessage(const char* file, int line) : allocated_(nullptr) {
Init(file, line, GLOG_INFO, &LogMessage::SendToLog);
}
LogMessage::LogMessage(const char* file, int line, LogSeverity severity)
: allocated_(NULL) {
: allocated_(nullptr) {
Init(file, line, severity, &LogMessage::SendToLog);
}
LogMessage::LogMessage(const char* file, int line, LogSeverity severity,
LogSink* sink, bool also_send_to_log)
: allocated_(NULL) {
: allocated_(nullptr) {
Init(file, line, severity,
also_send_to_log ? &LogMessage::SendToSinkAndLog
: &LogMessage::SendToSink);
data_->sink_ = sink; // override Init()'s setting to NULL
data_->sink_ = sink; // override Init()'s setting to null
}
LogMessage::LogMessage(const char* file, int line, LogSeverity severity,
vector<string>* outvec)
: allocated_(NULL) {
: allocated_(nullptr) {
Init(file, line, severity, &LogMessage::SaveOrSendToLog);
data_->outvec_ = outvec; // override Init()'s setting to NULL
data_->outvec_ = outvec; // override Init()'s setting to null
}
LogMessage::LogMessage(const char* file, int line, LogSeverity severity,
string* message)
: allocated_(NULL) {
: allocated_(nullptr) {
Init(file, line, severity, &LogMessage::WriteToStringAndLog);
data_->message_ = message; // override Init()'s setting to NULL
data_->message_ = message; // override Init()'s setting to null
}
void LogMessage::Init(const char* file, int line, LogSeverity severity,
void (LogMessage::*send_method)()) {
allocated_ = NULL;
allocated_ = nullptr;
if (severity != GLOG_FATAL || !exit_on_dfatal) {
// No need for locking, because this is thread local.
if (thread_data_available) {
@@ -1138,8 +1138,8 @@ void LogMessage::Init(const char* file, int line, LogSeverity severity,
data_->severity_ = severity;
data_->line_ = line;
data_->send_method_ = send_method;
data_->sink_ = NULL;
data_->outvec_ = NULL;
data_->sink_ = nullptr;
data_->outvec_ = nullptr;
timespec now_ts = absl::ToTimespec(absl::Now());
data_->timestamp_ = now_ts.tv_sec;
localtime_r(&data_->timestamp_, &data_->tm_time_);
@@ -1394,7 +1394,7 @@ void LogMessage::Fail() { g_logging_fail_func(); }
// L >= log_mutex (callers must hold the log_mutex).
void LogMessage::SendToSink() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {
if (data_->sink_ != NULL) {
if (data_->sink_ != nullptr) {
RAW_DCHECK(data_->num_chars_to_log_ > 0 &&
data_->message_text_[data_->num_chars_to_log_ - 1] == '\n',
"");
@@ -1413,7 +1413,7 @@ void LogMessage::SendToSinkAndLog() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {
// L >= log_mutex (callers must hold the log_mutex).
void LogMessage::SaveOrSendToLog() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {
if (data_->outvec_ != NULL) {
if (data_->outvec_ != nullptr) {
RAW_DCHECK(data_->num_chars_to_log_ > 0 &&
data_->message_text_[data_->num_chars_to_log_ - 1] == '\n',
"");
@@ -1427,7 +1427,7 @@ void LogMessage::SaveOrSendToLog() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {
}
void LogMessage::WriteToStringAndLog() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {
if (data_->message_ != NULL) {
if (data_->message_ != nullptr) {
RAW_DCHECK(data_->num_chars_to_log_ > 0 &&
data_->message_text_[data_->num_chars_to_log_ - 1] == '\n',
"");
@@ -1682,7 +1682,7 @@ static vector<string>* logging_directories_list;
const vector<string>& GetLoggingDirectories() {
// Not strictly thread-safe but we're called early in InitGoogle().
if (logging_directories_list == NULL) {
if (logging_directories_list == nullptr) {
logging_directories_list = new vector<string>;
if (!absl::GetFlag(FLAGS_log_dir).empty()) {
@@ -1708,7 +1708,7 @@ void TestOnly_ClearLoggingDirectoriesList() {
"TestOnly_ClearLoggingDirectoriesList should only be "
"called from test code.\n");
delete logging_directories_list;
logging_directories_list = NULL;
logging_directories_list = nullptr;
}
void GetExistingTempDirectories(vector<string>* list) {
@@ -1731,7 +1731,7 @@ void GetExistingTempDirectories(vector<string>* list) {
const char* names) { \
bool equal = s1 == s2 || (s1 && s2 && !func(s1, s2)); \
if (equal == expected) { \
return NULL; \
return nullptr; \
} else { \
ostringstream ss; \
if (!s1) s1 = ""; \
@@ -1748,7 +1748,7 @@ DEFINE_CHECK_STROP_IMPL(CHECK_STRCASENE, strcasecmp, false)
int posix_strerror_r(int err, char* buf, size_t len) {
// Sanity check input parameters
if (buf == NULL || len <= 0) {
if (buf == nullptr || len <= 0) {
errno = EINVAL;
return -1;
}
@@ -1878,7 +1878,7 @@ void ShutdownGoogleLogging() {
logging_internal::ShutdownGoogleLoggingUtilities();
LogDestination::DeleteLogDestinations();
delete logging_directories_list;
logging_directories_list = NULL;
logging_directories_list = nullptr;
}
} // namespace google

View File

@@ -132,7 +132,7 @@ inline char* strerror_r(int errnum, char* buf, size_t buflen) {
namespace google {
static const char* g_program_invocation_short_name = NULL;
static const char* g_program_invocation_short_name = nullptr;
static pthread_t g_main_thread_id;
} // namespace google
@@ -205,14 +205,14 @@ static void DumpStackTrace(int skip_count, DebugWriter* writerfn, void* arg) {
}
static void DumpStackTraceAndExit() {
DumpStackTrace(1, DebugWriteToStderr, NULL);
DumpStackTrace(1, DebugWriteToStderr, nullptr);
abort();
}
namespace logging_internal {
const char* ProgramInvocationShortName() {
if (g_program_invocation_short_name != NULL) {
if (g_program_invocation_short_name != nullptr) {
return g_program_invocation_short_name;
} else {
// TODO(user): Use /proc/self/cmdline and so?
@@ -221,7 +221,7 @@ const char* ProgramInvocationShortName() {
}
bool IsGoogleLoggingInitialized() {
return g_program_invocation_short_name != NULL;
return g_program_invocation_short_name != nullptr;
}
unsigned int GetTID() {
@@ -251,12 +251,12 @@ static void MyUserNameInitializer() {
#else
const char* user = getenv("USER");
#endif
if (user != NULL) {
if (user != nullptr) {
g_my_user_name = user;
} else {
#if !defined(_MSC_VER) // Not windows.
struct passwd pwd;
struct passwd* result = NULL;
struct passwd* result = nullptr;
char buffer[1024] = {'\0'};
uid_t uid = geteuid();
int pwuid_res = getpwuid_r(uid, &pwd, buffer, sizeof(buffer), &result);
@@ -318,7 +318,7 @@ void ShutdownGoogleLoggingUtilities() {
CHECK(IsGoogleLoggingInitialized())
<< "You called ShutdownGoogleLogging() without calling "
"InitGoogleLogging() first!";
g_program_invocation_short_name = NULL;
g_program_invocation_short_name = nullptr;
#if !defined(_MSC_VER)
closelog();
#endif // !defined(_MSC_VER)

View File

@@ -44,7 +44,7 @@ static inline int PyString_AsStringAndSize(PyObject* obj, char** buf,
Py_ssize_t* psize) {
if (PyUnicode_Check(obj)) {
*buf = const_cast<char*>(PyUnicode_AsUTF8AndSize(obj, psize));
return *buf == NULL ? -1 : 0;
return *buf == nullptr ? -1 : 0;
} else if (PyBytes_Check(obj)) {
return PyBytes_AsStringAndSize(obj, buf, psize);
}
@@ -300,15 +300,15 @@ inline bool vector_input_wrap_helper(PyObject* seq, std::vector<T>* out,
// into the corresponding Python object.
template <class T, class Converter>
inline PyObject* list_output_helper(const T* vec, Converter converter) {
if (vec == NULL) Py_RETURN_NONE; // Return a nice out-of-band value.
if (vec == nullptr) Py_RETURN_NONE; // Return a nice out-of-band value.
PyObject* lst = PyList_New(vec->size());
if (lst == NULL) return NULL;
if (lst == nullptr) return nullptr;
int i = 0;
for (typename T::const_reference pt : *vec) {
PyObject* obj = converter(pt);
if (!obj) {
Py_DECREF(lst);
return NULL;
return nullptr;
}
PyList_SET_ITEM(lst, i++, obj);
}

View File

@@ -19,7 +19,7 @@ namespace operations_research {
void RunWorker(void* data) {
ThreadPool* const thread_pool = reinterpret_cast<ThreadPool*>(data);
std::function<void()> work = thread_pool->GetNextTask();
while (work != NULL) {
while (work != nullptr) {
work();
work = thread_pool->GetNextTask();
}

View File

@@ -116,9 +116,9 @@ static void VLOG2Initializer() {
const std::string vmodule_flag = absl::GetFlag(FLAGS_vmodule);
const char* vmodule = vmodule_flag.c_str();
const char* sep;
VModuleInfo* head = NULL;
VModuleInfo* tail = NULL;
while ((sep = strchr(vmodule, '=')) != NULL) {
VModuleInfo* head = nullptr;
VModuleInfo* tail = nullptr;
while ((sep = strchr(vmodule, '=')) != nullptr) {
std::string pattern(vmodule, sep - vmodule);
int module_level;
if (sscanf(sep, "=%d", &module_level) == 1) {
@@ -133,7 +133,7 @@ static void VLOG2Initializer() {
}
// Skip past this entry
vmodule = strchr(sep, ',');
if (vmodule == NULL) break;
if (vmodule == nullptr) break;
vmodule++; // Skip past ","
}
if (head) { // Put them into the list at the head:
@@ -150,7 +150,7 @@ int SetVLOGLevel(const char* module_pattern, int log_level) {
bool found = false;
{
absl::MutexLock l(&vmodule_lock); // protect whole read-modify-write
for (const VModuleInfo* info = vmodule_list; info != NULL;
for (const VModuleInfo* info = vmodule_list; info != nullptr;
info = info->next) {
if (info->module_pattern == module_pattern) {
if (!found) {
@@ -210,7 +210,7 @@ bool InitVLOG3__(int32_t** vmodule_info, bool* initialized, const char* fname,
// find target in vector of modules, replace site_flag_value with
// a module-specific verbose level, if any.
for (const VModuleInfo* info = vmodule_list; info != NULL;
for (const VModuleInfo* info = vmodule_list; info != nullptr;
info = info->next) {
if (SafeFNMatch_(info->module_pattern.c_str(), info->module_pattern.size(),
base, base_length)) {

View File

@@ -966,7 +966,7 @@ PROTO2_RETURN(operations_research::CpModel,
namespace operations_research {
// Globals
// IMPORTANT(user): Global will be placed in operations_research_constraint_solver.cs
// IMPORTANT(corentinl): Global will be placed in operations_research_constraint_solver.cs
// Ignored:
%ignore FillValues;
} // namespace operations_research

View File

@@ -35,12 +35,12 @@
syntax = "proto2";
package operations_research;
option java_package = "com.google.ortools.graph";
option java_multiple_files = true;
option csharp_namespace = "Google.OrTools.Graph";
package operations_research;
message FlowArcProto {
// A directed arc goes from a tail node to a head node.
// Node ids must be non-negative (>= 0).

View File

@@ -249,4 +249,4 @@ Image has been generated using [plantuml](http://plantuml.com/):
```bash
plantuml -Tsvg docs/{file}.dot
```
So you can find the dot source files in [doc](doc).
So you can find the dot source files in [docs](docs).

View File

@@ -38,7 +38,7 @@ make alpine-edge_test
Dockerfile is split in several stages.
![docker](doc/deps.svg)
![docker](docs/deps.svg)
### Docker aarch64 on x86_64 machine

View File

@@ -277,7 +277,7 @@ function build_python() {
echo "DONE" | tee -a build.log
PY_PATH="/Library/Frameworks/Python.framework/Versions/$i"
if [ ! -d "$PY_PATH" ]; then
if [[ ! -d "$PY_PATH" ]]; then
echo "Error: Python $i is not found (${PY_PATH})." | tee -a build.log
exit 1
fi