CernVM-FS  2.13.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
repository_diff.cc
Go to the documentation of this file.
1 
6 #include <cassert>
7 #include <string>
8 
9 #include "catalog_counters.h"
10 #include "catalog_diff_tool.h"
11 #include "catalog_mgr_ro.h"
12 #include "crypto/hash.h"
13 #include "file_chunk.h"
14 #include "history_sqlite.h"
15 #include "publish/except.h"
16 #include "publish/repository.h"
17 #include "shortstring.h"
18 #include "statistics.h"
19 #include "xattr.h"
20 
21 namespace {
22 
23 static history::History::Tag GetTag(const std::string &tag_name,
24  const history::History &history) {
25  assert(!tag_name.empty());
26 
28 
29  if (tag_name[0] == publish::Repository::kRawHashSymbol) {
30  tag.name = tag_name.substr(1);
31  tag.root_hash = shash::MkFromHexPtr(shash::HexPtr(tag.name),
33  } else {
34  const bool retval = history.GetByName(tag_name, &tag);
35  if (!retval)
36  throw publish::EPublish("unknown repository tag name: " + tag_name);
37  }
38 
39  return tag;
40 }
41 
42 
43 class DiffForwarder : public CatalogDiffTool<catalog::SimpleCatalogManager> {
44  private:
45  publish::DiffListener *listener_;
46 
47  public:
50  publish::DiffListener *listener)
51  : CatalogDiffTool<catalog::SimpleCatalogManager>(old_mgr, new_mgr)
52  , listener_(listener) { }
53  virtual ~DiffForwarder() { }
54 
55  virtual bool ReportAddition(const PathString &path,
56  const catalog::DirectoryEntry &entry,
57  const XattrList & /* xattrs */,
58  const FileChunkList & /* chunks */) {
59  listener_->OnAdd(path.ToString(), entry);
60  return true;
61  }
62 
63  virtual void ReportRemoval(const PathString &path,
64  const catalog::DirectoryEntry &entry) {
65  listener_->OnRemove(path.ToString(), entry);
66  }
67 
68  virtual bool ReportModification(const PathString &path,
69  const catalog::DirectoryEntry &old_entry,
70  const catalog::DirectoryEntry &new_entry,
71  const XattrList & /*xattrs */,
72  const FileChunkList & /* chunks */) {
73  listener_->OnModify(path.ToString(), old_entry, new_entry);
74  return true;
75  }
76 }; // class DiffForwarder
77 
78 } // anonymous namespace
79 
80 namespace publish {
81 
82 void Repository::Diff(const std::string &from, const std::string &to,
83  DiffListener *diff_listener) {
84  const history::History::Tag from_tag = GetTag(from, *history_);
85  const history::History::Tag to_tag = GetTag(to, *history_);
86  diff_listener->OnInit(from_tag, to_tag);
87 
88  perf::Statistics stats_from;
90  from_tag.root_hash,
91  settings_.url(),
94  &stats_from,
95  true /* manage_catalog_files */);
96  mgr_from->Init();
97 
98  perf::Statistics stats_to;
100  to_tag.root_hash,
101  settings_.url(),
102  settings_.tmp_dir(),
104  &stats_to,
105  true /* manage_catalog_files */);
106  mgr_to->Init();
107 
108  const catalog::Counters counters_from =
109  mgr_from->GetRootCatalog()->GetCounters();
110  const catalog::Counters counters_to = mgr_to->GetRootCatalog()->GetCounters();
111  diff_listener->OnStats(catalog::Counters::Diff(counters_from, counters_to));
112 
113  // DiffTool takes ownership of the catalog managers
114  DiffForwarder diff_forwarder(mgr_from, mgr_to, diff_listener);
115  if (!diff_forwarder.Init())
116  throw EPublish("cannot initialize difference engine");
117  diff_forwarder.Run(PathString());
118 }
119 
120 } // namespace publish
const SettingsRepository settings_
Definition: repository.h:136
const Counters & GetCounters() const
Definition: catalog.h:171
download::DownloadManager * download_mgr_
Definition: repository.h:140
std::string name
Definition: history.h:92
const history::History * history() const
static DeltaCounters Diff(const Counters &from, const Counters &to)
assert((mem||(size==0))&&"Out Of Memory")
virtual bool ReportAddition(const PathString &path, const catalog::DirectoryEntry &entry, const XattrList &, const FileChunkList &)
virtual bool ReportModification(const PathString &path, const catalog::DirectoryEntry &old_entry, const catalog::DirectoryEntry &new_entry, const XattrList &, const FileChunkList &)
const char kSuffixCatalog
Definition: hash.h:54
history::SqliteHistory * history_
Definition: repository.h:148
CatalogT * GetRootCatalog() const
Definition: catalog_mgr.h:319
virtual bool GetByName(const std::string &name, Tag *tag) const =0
std::string ToString() const
Definition: shortstring.h:139
ShortString< kDefaultMaxPath, 0 > PathString
Definition: shortstring.h:213
shash::Any root_hash
Definition: history.h:93
Any MkFromHexPtr(const HexPtr hex, const char suffix)
Definition: hash.cc:82
virtual void ReportRemoval(const PathString &path, const catalog::DirectoryEntry &entry)
std::string url() const
Definition: settings.h:367
static history::History::Tag GetTag(const std::string &tag_name, const history::History &history)
void Diff(const std::string &from, const std::string &to, DiffListener *diff_listener)
std::string tmp_dir() const
Definition: settings.h:369
DiffForwarder(catalog::SimpleCatalogManager *old_mgr, catalog::SimpleCatalogManager *new_mgr, publish::DiffListener *listener)