Applying Patches¶
Patches can be applied to the source code for particular snapshots via the
patch() method provided by client. Patches are represented by
the Patch class and can be constructed by providing unified-format diffs
to Patch.from_unidiff().
from bugzoo import Patch, Client
def example_patch_application(client: Client, container: Container) -> None:
# first, we build a Patch object using a unified-format diff
unidiff = """
diff --git a/ArduCopter/control_auto.cpp b/ArduCopter/control_auto.cpp
index 0798efc..8109d2a 100644
--- a/ArduCopter/control_auto.cpp
+++ b/ArduCopter/control_auto.cpp
@@ -119,10 +119,6 @@ void Copter::auto_takeoff_start(const Location& dest_loc)
alt_target = current_loc.alt + dest.alt;
}
- // sanity check target
- if (alt_target < current_loc.alt) {
- dest.set_alt_cm(current_loc.alt, Location_Class::ALT_FRAME_ABOVE_HOME);
- }
// Note: if taking off from below home this could cause a climb to an unexpectedly high altitude
if (alt_target < 100) {
dest.set_alt_cm(100, Location_Class::ALT_FRAME_ABOVE_HOME);
""".strip()
patch = Patch.from_unidiff(unidiff)
# we then attempt to apply the patch to the source code
client.containers.patch(container, patch)
# finally, we rebuild the program inside the container
client.containers.build(container)
This ability to apply patches can be used to, for example, evaluate candidate
repairs when performing automated program repair, or to apply source-code
mutations when conducting mutation testing. In the case of the latter,
client.containers.persist() can be used to persist the state of the
mutated container as a Docker image.
