progress_receiver(1.0);
}
+std::string
+format_argv_for_logging(const char* const* argv)
+{
+ std::string result;
+ for (size_t i = 0; argv[i]; ++i) {
+ if (i != 0) {
+ result += ' ';
+ }
+ for (const char* arg = argv[i]; *arg; ++arg) {
+ result += *arg;
+ }
+ }
+ return result;
+}
+
std::string
format_hex(const uint8_t* data, size_t size)
{
const SubdirVisitor& visitor,
const ProgressReceiver& progress_receiver);
+// Format `argv` as a simple string for logging purposes. That is, the result is
+// not intended to be machine parsable. `argv` must be terminated by a nullptr.
+std::string format_argv_for_logging(const char* const* argv);
+
// Format a hexadecimal string representing `size` bytes of `data`. The returned
// string will be `2 * size` long.
std::string format_hex(const uint8_t* data, size_t size);
bool debug_log_enabled = false;
-void
-print_command(FILE* fp, const char* const* argv)
-{
- for (int i = 0; argv[i]; i++) {
- fprintf(fp, "%s%s", (i == 0) ? "" : " ", argv[i]);
- }
- fprintf(fp, "\n");
-}
-
} // namespace
// Initialize logging. Call only once.
return;
}
+ std::string argv_as_string = Util::format_argv_for_logging(argv);
+
log_prefix(true);
if (logfile) {
fputs(prefix, *logfile);
- print_command(*logfile, argv);
+ fwrite(argv_as_string.data(), argv_as_string.length(), 1, *logfile);
+ fputc('\n', *logfile);
int rc = fflush(*logfile);
if (rc) {
warn_log_fail();
}
#ifdef HAVE_SYSLOG
if (use_syslog) {
- syslog(LOG_DEBUG, "%s", format_command(argv).c_str());
+ syslog(LOG_DEBUG, "%s", Util::format_argv_for_logging(argv).c_str());
}
#endif
if (debug_log_enabled) {
debug_log_buffer += prefix;
- debug_log_buffer += format_command(argv);
+ debug_log_buffer += argv_as_string;
+ debug_log_buffer += '\n';
}
}
cc_log("Failed to open %s: %s", path, strerror(errno));
}
}
-
-std::string
-format_command(const char* const* argv)
-{
- std::string result;
- for (int i = 0; argv[i]; i++) {
- if (i != 0) {
- result += ' ';
- }
- for (const char* arg = argv[i]; *arg != '\0'; arg++) {
- result += *arg;
- }
- }
- result += '\n';
- return result;
-}
void cc_bulklog(const char* format, ...) ATTR_FORMAT(printf, 1, 2);
void cc_log_argv(const char* prefix, const char* const* argv);
void cc_dump_debug_log_buffer(const char* path);
-std::string format_command(const char* const* argv);
test_ZstdCompression.cpp
test_argprocessing.cpp
test_compopt.cpp
- test_hashutil.cpp
- test_logging.cpp)
+ test_hashutil.cpp)
if(INODE_CACHE_SUPPORTED)
list(APPEND source_files test_InodeCache.cpp)
CHECK(actual == expected);
}
+TEST_CASE("Util::format_argv_for_logging")
+{
+ const char* argv_0[] = {nullptr};
+ CHECK(Util::format_argv_for_logging(argv_0) == "");
+
+ const char* argv_2[] = {"foo", "bar", nullptr};
+ CHECK(Util::format_argv_for_logging(argv_2) == "foo bar");
+}
+
TEST_CASE("format_hex")
{
uint8_t none[] = "";
+++ /dev/null
-// Copyright (C) 2010-2020 Joel Rosdahl and other contributors
-//
-// See doc/AUTHORS.adoc for a complete list of contributors.
-//
-// This program is free software; you can redistribute it and/or modify it
-// under the terms of the GNU General Public License as published by the Free
-// Software Foundation; either version 3 of the License, or (at your option)
-// any later version.
-//
-// This program is distributed in the hope that it will be useful, but WITHOUT
-// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-// more details.
-//
-// You should have received a copy of the GNU General Public License along with
-// this program; if not, write to the Free Software Foundation, Inc., 51
-// Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-#include "../src/logging.hpp"
-
-#include "third_party/doctest.h"
-
-TEST_SUITE_BEGIN("logging");
-
-TEST_CASE("format_command")
-{
- const char* argv_0[] = {nullptr};
- CHECK(format_command(argv_0) == "\n");
-
- const char* argv_2[] = {"foo", "bar", nullptr};
- CHECK(format_command(argv_2) == "foo bar\n");
-}
-
-TEST_SUITE_END();