Commit 9f129d87 authored by Andrew Grieve's avatar Andrew Grieve Committed by Commit Bot

md5sum: Reduce dependencies on //base

Removes all references except for md5 and base64.

Bug: 1120190
Change-Id: I33f8f8c6966e22c92b1e6e31e468b23cf6a95354
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2368422Reviewed-by: default avatarMichael Thiessen <mthiesse@chromium.org>
Commit-Queue: Andrew Grieve <agrieve@chromium.org>
Cr-Commit-Position: refs/heads/master@{#800639}
parent 731d4185
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <stddef.h> #include <stddef.h>
#include <dirent.h>
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include <memory> #include <memory>
...@@ -14,27 +15,21 @@ ...@@ -14,27 +15,21 @@
#include <string> #include <string>
#include "base/base64.h" #include "base/base64.h"
#include "base/files/file_enumerator.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/files/scoped_file.h"
#include "base/hash/md5.h" #include "base/hash/md5.h"
#include "base/logging.h"
#include "base/strings/string_split.h"
#include "third_party/zlib/google/compression_utils_portable.h" #include "third_party/zlib/google/compression_utils_portable.h"
namespace { namespace {
// Only used in the gzip mode. // Only used in the gzip mode.
const char* const kFilePathDelimiter = ";"; const char kFilePathDelimiter = ';';
const int kMD5HashLength = 16; const int kMD5HashLength = 16;
// Returns whether |path|'s MD5 was successfully written to |digest_string|. // Returns whether |path|'s MD5 was successfully written to |digest_string|.
bool MD5Sum(const std::string& path, std::string* digest_string) { bool MD5Sum(const std::string& path, std::string* digest_string) {
base::ScopedFILE file(fopen(path.c_str(), "rb")); FILE* fd = fopen(path.c_str(), "rb");
if (!file) { if (!fd) {
LOG(ERROR) << "Could not open file " << path; std::cerr << "Could not open file " << path << std::endl;
return false; return false;
} }
base::MD5Context ctx; base::MD5Context ctx;
...@@ -42,45 +37,62 @@ bool MD5Sum(const std::string& path, std::string* digest_string) { ...@@ -42,45 +37,62 @@ bool MD5Sum(const std::string& path, std::string* digest_string) {
const size_t kBufferSize = 1 << 16; const size_t kBufferSize = 1 << 16;
std::unique_ptr<char[]> buf(new char[kBufferSize]); std::unique_ptr<char[]> buf(new char[kBufferSize]);
size_t len; size_t len;
while ((len = fread(buf.get(), 1, kBufferSize, file.get())) > 0) while ((len = fread(buf.get(), 1, kBufferSize, fd)) > 0)
base::MD5Update(&ctx, base::StringPiece(buf.get(), len)); base::MD5Update(&ctx, base::StringPiece(buf.get(), len));
if (ferror(file.get())) { if (ferror(fd)) {
LOG(ERROR) << "Error reading file " << path; std::cerr << "Error reading file " << path << std::endl;
return false; return false;
} }
fclose(fd);
base::MD5Digest digest; base::MD5Digest digest;
base::MD5Final(&digest, &ctx); base::MD5Final(&digest, &ctx);
*digest_string = base::MD5DigestToBase16(digest); *digest_string = base::MD5DigestToBase16(digest);
return true; return true;
} }
void MakeFileSetHelper(const std::string& path,
std::set<std::string>& file_set) {
DIR* dir = opendir(path.c_str());
if (!dir) {
file_set.insert(path);
return;
}
dirent* entry;
while ((entry = readdir(dir))) {
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
continue;
MakeFileSetHelper(path + '/' + entry->d_name, file_set);
}
closedir(dir);
}
// Returns the set of all files contained in |files|. This handles directories // Returns the set of all files contained in |files|. This handles directories
// by walking them recursively. Excludes, .svn directories and file under them. // by walking them recursively. Excludes, .svn directories and file under them.
std::vector<std::string> MakeFileSet(const char** files) { std::vector<std::string> MakeFileSet(const char** files) {
const std::string svn_dir_component = FILE_PATH_LITERAL("/.svn/");
std::set<std::string> file_set; std::set<std::string> file_set;
for (const char** file = files; *file; ++file) { for (const char** file = files; *file; ++file) {
base::FilePath file_path(*file); MakeFileSetHelper(*file, file_set);
if (base::DirectoryExists(file_path)) {
base::FileEnumerator file_enumerator(
file_path, true /* recurse */, base::FileEnumerator::FILES);
for (base::FilePath child, empty;
(child = file_enumerator.Next()) != empty; ) {
// If the path contains /.svn/, ignore it.
if (child.value().find(svn_dir_component) == std::string::npos) {
file_set.insert(child.value());
}
}
} else {
file_set.insert(*file);
}
} }
return std::vector<std::string>(file_set.begin(), file_set.end()); return std::vector<std::string>(file_set.begin(), file_set.end());
} }
std::vector<std::string> StringSplit(const std::string& str, char delim) {
std::vector<std::string> ret;
size_t found_idx = str.find(delim);
size_t start_idx = 0;
while (found_idx != std::string::npos) {
ret.push_back(str.substr(start_idx, found_idx - start_idx));
start_idx = found_idx + 1;
found_idx = str.find(delim, start_idx);
}
ret.push_back(str.substr(start_idx, std::string::npos));
return ret;
}
std::vector<std::string> MakeFileListFromCompressedList(const char* data) { std::vector<std::string> MakeFileListFromCompressedList(const char* data) {
std::vector<std::string> file_list;
std::string gzipdata; std::string gzipdata;
// Expected compressed input is using Base64 encoding, we got convert it // Expected compressed input is using Base64 encoding, we got convert it
// to a regular string before passing it to zlib. // to a regular string before passing it to zlib.
...@@ -99,12 +111,7 @@ std::vector<std::string> MakeFileListFromCompressedList(const char* data) { ...@@ -99,12 +111,7 @@ std::vector<std::string> MakeFileListFromCompressedList(const char* data) {
reinterpret_cast<const unsigned char*>(gzipdata.c_str()), reinterpret_cast<const unsigned char*>(gzipdata.c_str()),
compressed_size); compressed_size);
for (const auto& file : base::SplitStringPiece( return StringSplit(decompressed, kFilePathDelimiter);
decompressed, kFilePathDelimiter, base::KEEP_WHITESPACE,
base::SPLIT_WANT_NONEMPTY)) {
file_list.push_back(file.as_string());
}
return file_list;
} }
} // namespace } // namespace
...@@ -112,9 +119,9 @@ std::vector<std::string> MakeFileListFromCompressedList(const char* data) { ...@@ -112,9 +119,9 @@ std::vector<std::string> MakeFileListFromCompressedList(const char* data) {
int main(int argc, const char* argv[]) { int main(int argc, const char* argv[]) {
bool gzip_mode = argc >= 2 && strcmp("-gz", argv[1]) == 0; bool gzip_mode = argc >= 2 && strcmp("-gz", argv[1]) == 0;
if (argc < 2 || (gzip_mode && argc < 3)) { if (argc < 2 || (gzip_mode && argc < 3)) {
LOG(ERROR) << "Usage: md5sum <path/to/file_or_dir>... or md5sum " std::cerr << "Usage: md5sum <path/to/file_or_dir>... or md5sum "
<< "-gz base64-gzipped-'" << kFilePathDelimiter << "-gz base64-gzipped-'" << kFilePathDelimiter
<< "'-separated-files"; << "'-separated-files" << std::endl;
return 1; return 1;
} }
std::vector<std::string> files; std::vector<std::string> files;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment