Files
Christian Schneider 4326e972ac Releasing the former Stadia file transfer tools
The tools allow efficient and fast synchronization of large directory
trees from a Windows workstation to a Linux target machine.

cdc_rsync* support efficient copy of files by using content-defined
chunking (CDC) to identify chunks within files that can be reused.

asset_stream_manager + cdc_fuse_fs support efficient streaming of a
local directory to a remote virtual file system based on FUSE. It also
employs CDC to identify and reuse unchanged data chunks.
2022-11-03 10:39:10 +01:00

81 lines
2.1 KiB
C++

// Copyright 2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "common/path_filter.h"
namespace cdc_ft {
namespace internal {
bool IsMatch(const char* pattern, const char* path, size_t path_len) {
for (/*empty*/; *pattern != '\0'; ++pattern) {
switch (*pattern) {
case '?':
if (*path == '\0') {
return false;
}
++path;
break;
case '*': {
if (pattern[1] == '\0') {
return true;
}
for (size_t n = 0; n < path_len; n++) {
if (IsMatch(pattern + 1, path + n, path_len - n)) {
return true;
}
}
return false;
}
default:
if (*path != *pattern) {
return false;
}
++path;
}
}
return *path == '\0';
}
bool IsMatch(const std::string& pattern, const std::string& path) {
return IsMatch(pattern.c_str(), path.c_str(), path.size());
}
} // namespace internal
PathFilter::PathFilter() = default;
PathFilter::~PathFilter() = default;
bool PathFilter::IsEmpty() const { return rules_.empty(); }
void PathFilter::AddRule(Rule::Type type, std::string pattern) {
rules_.emplace_back(type, std::move(pattern));
}
bool PathFilter::IsMatch(const std::string& path) const {
for (const Rule& rule : rules_) {
if (internal::IsMatch(rule.pattern.c_str(), path.c_str(), path.size())) {
return rule.type == Rule::Type::kInclude;
}
}
return true;
}
PathFilter::Rule::Rule(Type type, std::string pattern)
: type(type), pattern(std::move(pattern)) {}
} // namespace cdc_ft