diff options
author | Samuel Huang <huangs@chromium.org> | 2018-04-30 22:47:52 +0000 |
---|---|---|
committer | Edward Lesmes <ehmaldonado@google.com> | 2021-07-23 22:17:29 +0000 |
commit | 6951a286379338eaa10a712989541ca77c0c2a9c (patch) | |
tree | 2b4b9f8addfe9aa37804bb52929a235a10b23239 /zucchini_gen.cc | |
parent | 93ffc913ec7d369818a109b9ca6de7adb278e163 (diff) | |
download | zucchini-6951a286379338eaa10a712989541ca77c0c2a9c.tar.gz |
[Zucchini] Introduce Imposed Ensemble Matcher.
Previously Zucchini-gen uses built-in heuristics to perform element
matching for ensemble patch generation. This CL adds an option
(accessible via the -impose parameter) to specify elements in "old"
and "new", and how they match. This allows the default heuristics to be
overridden, and enables external applications (who perhaps have better
ideas of element matching, e.g., have access to archiving programs) to
better use Zucchini to patch archives.
Zucchini-match is updated to prints the -impose command line to repeat
its results. Also, ElementMatch::ToString() is added.
Change-Id: I541b64722904c2fcd19ed75246d87e0268fbf86c
Reviewed-on: https://chromium-review.googlesource.com/1027191
Reviewed-by: Samuel Huang <huangs@chromium.org>
Reviewed-by: Greg Thompson <grt@chromium.org>
Commit-Queue: Samuel Huang <huangs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#554909}
NOKEYCHECK=True
GitOrigin-RevId: 73a64ffde3f3b64df576aa1f2b5baebf7ec964ba
Diffstat (limited to 'zucchini_gen.cc')
-rw-r--r-- | zucchini_gen.cc | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/zucchini_gen.cc b/zucchini_gen.cc index e88d37b..29be814 100644 --- a/zucchini_gen.cc +++ b/zucchini_gen.cc @@ -10,6 +10,7 @@ #include <algorithm> #include <map> #include <memory> +#include <string> #include <utility> #include "base/logging.h" @@ -21,6 +22,7 @@ #include "components/zucchini/equivalence_map.h" #include "components/zucchini/heuristic_ensemble_matcher.h" #include "components/zucchini/image_index.h" +#include "components/zucchini/imposed_ensemble_matcher.h" #include "components/zucchini/patch_writer.h" #include "components/zucchini/reference_bytes_mixer.h" #include "components/zucchini/suffix_array.h" @@ -317,13 +319,10 @@ bool GenerateExecutableElement(ExecutableType exe_type, reference_bytes_mixer.get(), patch_writer); } -/******** Exported Functions ********/ - -status::Code GenerateEnsemble(ConstBufferView old_image, - ConstBufferView new_image, - EnsemblePatchWriter* patch_writer) { - std::unique_ptr<EnsembleMatcher> matcher = - std::make_unique<HeuristicEnsembleMatcher>(nullptr); +status::Code GenerateEnsembleCommon(ConstBufferView old_image, + ConstBufferView new_image, + std::unique_ptr<EnsembleMatcher> matcher, + EnsemblePatchWriter* patch_writer) { if (!matcher->RunMatch(old_image, new_image)) { LOG(INFO) << "RunMatch() failed, generating raw patch."; return GenerateRaw(old_image, new_image, patch_writer); @@ -420,6 +419,29 @@ status::Code GenerateEnsemble(ConstBufferView old_image, return status::kStatusSuccess; } +/******** Exported Functions ********/ + +status::Code GenerateEnsemble(ConstBufferView old_image, + ConstBufferView new_image, + EnsemblePatchWriter* patch_writer) { + return GenerateEnsembleCommon( + old_image, new_image, std::make_unique<HeuristicEnsembleMatcher>(nullptr), + patch_writer); +} + +status::Code GenerateEnsembleWithImposedMatches( + ConstBufferView old_image, + ConstBufferView new_image, + std::string imposed_matches, + EnsemblePatchWriter* patch_writer) { + if (imposed_matches.empty()) + return GenerateEnsemble(old_image, new_image, patch_writer); + + return GenerateEnsembleCommon( + old_image, new_image, + std::make_unique<ImposedEnsembleMatcher>(imposed_matches), patch_writer); +} + status::Code GenerateRaw(ConstBufferView old_image, ConstBufferView new_image, EnsemblePatchWriter* patch_writer) { |