5 #include "cvmfs_config.h"
8 #ifndef __STDC_FORMAT_MACROS
9 #define __STDC_FORMAT_MACROS
33 DiffReporter(
bool show_header,
bool machine_readable,
bool ignore_timediff)
34 : show_header_(show_header)
35 , machine_readable_(machine_readable)
36 , ignore_timediff_(ignore_timediff)
47 if (machine_readable_) {
49 "# line descriptor: A - add, R - remove, M - modify, "
50 "S - statistics; modify flags: S - size, M - mode, T - timestamp, "
51 "C - content, L - symlink target; entry types: F - regular file, "
52 "S - symbolic link, D - directory, N - nested catalog");
64 std::string operation = machine_readable_ ?
"S " :
"d(";
65 std::string type_file = machine_readable_ ?
"F" :
"# regular files):";
66 std::string type_symlink = machine_readable_ ?
"S" :
"# symlinks):";
67 std::string type_directory = machine_readable_ ?
"D" :
"# directories):";
68 std::string type_catalog = machine_readable_ ?
"N" :
"# catalogs):";
69 int64_t diff_file = delta.
self.regular_files + delta.
subtree.regular_files;
70 int64_t diff_symlink = delta.
self.symlinks + delta.
subtree.symlinks;
71 int64_t diff_catalog = delta.
self.nested_catalogs +
74 int64_t diff_directory = delta.
self.directories +
75 delta.
subtree.directories - diff_catalog;
77 type_file.c_str(), diff_file);
79 type_symlink.c_str(), diff_symlink);
81 type_directory.c_str(), diff_directory);
83 type_catalog.c_str(), diff_catalog);
87 virtual void OnAdd(
const std::string &path,
90 std::string operation = machine_readable_ ?
"A" :
"add";
91 if (machine_readable_) {
93 operation.c_str(), PrintEntryType(entry).c_str(), path.c_str());
101 path.c_str(), operation.c_str(),
102 PrintEntryType(entry).c_str(), entry.
size());
110 std::string operation = machine_readable_ ?
"R" :
"remove";
111 if (machine_readable_) {
113 operation.c_str(), PrintEntryType(entry).c_str(), path.c_str());
121 path.c_str(), operation.c_str(),
122 PrintEntryType(entry).c_str(), entry.
size());
133 if (ignore_timediff_) {
134 diff = diff & ~catalog::DirectoryEntryBase::Difference::kMtime;
139 diff = diff & ~catalog::DirectoryEntryBase::Difference::kSize;
144 std::string type_from = PrintEntryType(entry_from);
145 std::string type_to = PrintEntryType(entry_to);
146 std::string
type = type_from;
147 if (type_from != type_to) {
148 type += machine_readable_ ? type_to : (
"->" + type_to);
151 std::string operation = machine_readable_ ?
"M" :
"modify";
152 if (machine_readable_) {
154 PrintDifferences(diff).c_str(), type.c_str(), path.c_str());
157 operation.c_str(), type.c_str(), PrintDifferences(diff).c_str());
163 std::vector<std::string> result_list;
165 result_list.push_back(machine_readable_ ?
"N" :
"name");
167 result_list.push_back(machine_readable_ ?
"I" :
"link-count");
169 result_list.push_back(machine_readable_ ?
"S" :
"size");
171 result_list.push_back(machine_readable_ ?
"M" :
"mode");
173 result_list.push_back(machine_readable_ ?
"T" :
"timestamp");
175 result_list.push_back(machine_readable_ ?
"L" :
"symlink-target");
177 result_list.push_back(machine_readable_ ?
"C" :
"content");
179 result_list.push_back(machine_readable_ ?
"G" :
"hardlink-group");
183 result_list.push_back(machine_readable_ ?
"N" :
"nested-catalog");
186 result_list.push_back(machine_readable_ ?
"P" :
"chunked-file");
188 result_list.push_back(machine_readable_ ?
"X" :
"xattrs");
190 result_list.push_back(machine_readable_ ?
"E" :
"external-file");
192 result_list.push_back(machine_readable_ ?
"B" :
"bind-mountpoint");
194 result_list.push_back(machine_readable_ ?
"H" :
"hidden");
196 result_list.push_back(machine_readable_ ?
"D" :
"direct-io");
198 return machine_readable_ ? (
"[" +
JoinStrings(result_list,
"") +
"]")
203 if (entry.
IsRegular())
return machine_readable_ ?
"F" :
"file";
204 else if (entry.
IsLink())
return machine_readable_ ?
"S" :
"symlink";
205 else if (entry.
IsDirectory())
return machine_readable_ ?
"D" :
"directory";
207 return machine_readable_ ?
"U" :
"unknown";
223 if (options.
Has(
"worktree")) {
226 settings->SetIsSilent(
true);
227 settings->GetTransaction()->SetDryRun(
true);
228 settings->GetTransaction()->SetPrintChangeset(
true);
240 if (options.
Has(
"keychain")) {
245 DiffReporter diff_reporter(options.
Has(
"header"),
246 options.
Has(
"machine-readable"),
247 options.
Has(
"ignore-timediff"));
248 repository.Diff(from, to, &diff_reporter);
SettingsKeychain * GetKeychain()
#define LogCvmfs(source, mask,...)
static const unsigned int kHardlinkGroup
Differences CompareTo(const DirectoryEntry &other) const
std::string GetStringDefault(const std::string &key, const std::string &default_value) const
static const unsigned int kHiddenFlag
SettingsPublisher * CreateSettingsPublisher(const std::string &ident, bool needs_managed=false)
virtual void OnModify(const std::string &path, const catalog::DirectoryEntry &entry_from, const catalog::DirectoryEntry &entry_to)
virtual void OnAdd(const std::string &path, const catalog::DirectoryEntry &entry)
static const unsigned int kChecksum
void SetKeychainDir(const std::string &keychain_dir)
bool Has(const std::string &key) const
std::string GetString(const std::string &key) const
DiffReporter(bool show_header, bool machine_readable, bool ignore_timediff)
string JoinStrings(const vector< string > &strings, const string &joint)
const SettingsPublisher & settings() const
static const unsigned int kDirectIoFlag
std::string PrintDifferences(catalog::DirectoryEntryBase::Differences diff)
const std::vector< Argument > & plain_args() const
virtual void OnInit(const history::History::Tag &from_tag, const history::History::Tag &to_tag)
string StringifyTime(const time_t seconds, const bool utc)
Repository(const SettingsRepository &settings, const bool exists=true)
static const unsigned int kExternalFileFlag
static const unsigned int kHasXattrsFlag
static const unsigned int kName
SettingsRepository CreateSettingsRepository(const std::string &ident)
virtual void OnStats(const catalog::DeltaCounters &delta)
static const unsigned int kNestedCatalogTransitionFlags
static const unsigned int kLinkcount
static const unsigned int kMtime
virtual int Main(const Options &options)
static const unsigned int kChunkedFileFlag
static const unsigned int kSymlink
static const unsigned int kSize
static const unsigned int kMode
Publisher(const SettingsPublisher &settings, const bool exists=true)
static const unsigned int kBindMountpointFlag
std::string PrintEntryType(const catalog::DirectoryEntry &entry)
virtual void OnRemove(const std::string &path, const catalog::DirectoryEntry &entry)