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) { }
45 if (machine_readable_) {
48 "# line descriptor: A - add, R - remove, M - modify, "
49 "S - statistics; modify flags: S - size, M - mode, T - timestamp, "
50 "C - content, L - symlink target; entry types: F - regular file, "
51 "S - symbolic link, D - directory, N - nested catalog");
54 "DELTA: %s/r%" PRIu64
" (%s) --> %s/r%" PRIu64
" (%s)",
64 const std::string operation = machine_readable_ ?
"S " :
"d(";
65 const std::string type_file = machine_readable_ ?
"F" :
"# regular files):";
66 const std::string type_symlink = machine_readable_ ?
"S" :
"# symlinks):";
67 const std::string type_directory =
68 machine_readable_ ?
"D" :
"# directories):";
69 const std::string type_catalog = machine_readable_ ?
"N" :
"# catalogs):";
70 const int64_t diff_file =
71 delta.
self.regular_files + delta.
subtree.regular_files;
72 const int64_t diff_symlink = delta.
self.symlinks + delta.
subtree.symlinks;
73 const int64_t diff_catalog =
74 delta.
self.nested_catalogs + delta.
subtree.nested_catalogs;
76 const int64_t diff_directory =
77 delta.
self.directories + delta.
subtree.directories - diff_catalog;
79 type_file.c_str(), diff_file);
81 type_symlink.c_str(), diff_symlink);
83 type_directory.c_str(), diff_directory);
85 type_catalog.c_str(), diff_catalog);
89 virtual void OnAdd(
const std::string &path,
91 const std::string operation = machine_readable_ ?
"A" :
"add";
92 if (machine_readable_) {
94 operation.c_str(), PrintEntryType(entry).c_str(), path.c_str());
102 path.c_str(), operation.c_str(), PrintEntryType(entry).c_str(),
110 const 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(), PrintEntryType(entry).c_str(),
132 if (ignore_timediff_) {
133 diff = diff & ~catalog::DirectoryEntryBase::Difference::kMtime;
138 diff = diff & ~catalog::DirectoryEntryBase::Difference::kSize;
143 const std::string type_from = PrintEntryType(entry_from);
144 const std::string type_to = PrintEntryType(entry_to);
145 std::string
type = type_from;
146 if (type_from != type_to) {
147 type += machine_readable_ ? type_to : (
"->" + type_to);
150 const std::string operation = machine_readable_ ?
"M" :
"modify";
151 if (machine_readable_) {
153 PrintDifferences(diff).c_str(), type.c_str(), path.c_str());
156 operation.c_str(), type.c_str(), PrintDifferences(diff).c_str());
162 std::vector<std::string> result_list;
164 result_list.push_back(machine_readable_ ?
"N" :
"name");
166 result_list.push_back(machine_readable_ ?
"I" :
"link-count");
168 result_list.push_back(machine_readable_ ?
"S" :
"size");
170 result_list.push_back(machine_readable_ ?
"M" :
"mode");
172 result_list.push_back(machine_readable_ ?
"T" :
"timestamp");
174 result_list.push_back(machine_readable_ ?
"L" :
"symlink-target");
176 result_list.push_back(machine_readable_ ?
"C" :
"content");
178 result_list.push_back(machine_readable_ ?
"G" :
"hardlink-group");
181 kNestedCatalogTransitionFlags) {
182 result_list.push_back(machine_readable_ ?
"N" :
"nested-catalog");
185 result_list.push_back(machine_readable_ ?
"P" :
"chunked-file");
187 result_list.push_back(machine_readable_ ?
"X" :
"xattrs");
189 result_list.push_back(machine_readable_ ?
"E" :
"external-file");
191 result_list.push_back(machine_readable_ ?
"B" :
"bind-mountpoint");
193 result_list.push_back(machine_readable_ ?
"H" :
"hidden");
195 result_list.push_back(machine_readable_ ?
"D" :
"direct-io");
197 result_list.push_back(machine_readable_ ?
"U" :
"uid");
199 result_list.push_back(machine_readable_ ?
"R" :
"gid");
201 return machine_readable_ ? (
"[" +
JoinStrings(result_list,
"") +
"]")
207 return machine_readable_ ?
"F" :
"file";
209 return machine_readable_ ?
"S" :
"symlink";
211 return machine_readable_ ?
"D" :
"directory";
213 return machine_readable_ ?
"U" :
"unknown";
229 if (options.
Has(
"worktree")) {
232 settings->SetIsSilent(
true);
233 settings->GetTransaction()->SetDryRun(
true);
234 settings->GetTransaction()->SetPrintChangeset(
true);
243 const std::string from = options.
GetStringDefault(
"from",
"trunk-previous");
246 if (options.
Has(
"keychain")) {
251 DiffReporter diff_reporter(options.
Has(
"header"),
252 options.
Has(
"machine-readable"),
253 options.
Has(
"ignore-timediff"));
254 repository.Diff(from, to, &diff_reporter);
SettingsKeychain * GetKeychain()
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)
static const unsigned int kGid
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 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)
static const unsigned int kUid
CVMFS_EXPORT void LogCvmfs(const LogSource source, const int mask, const char *format,...)