summaryrefslogtreecommitdiff
path: root/morph
diff options
context:
space:
mode:
Diffstat (limited to 'morph')
-rwxr-xr-xmorph47
1 files changed, 47 insertions, 0 deletions
diff --git a/morph b/morph
index e44d4427..754f3b8e 100755
--- a/morph
+++ b/morph
@@ -356,6 +356,53 @@ class Morph(cliapp.Application):
tempdir.remove()
+ def cmd_make_patch(self, args):
+ assert os.path.exists(self.settings['cachedir'])
+
+ tempdir = morphlib.tempdir.Tempdir(self.settings['tempdir'])
+ morph_loader = MorphologyLoader(self.settings)
+ src_manager = morphlib.sourcemanager.SourceManager(self, update=False)
+ factory = morphlib.builder.Factory(tempdir)
+ factory.create_staging()
+ builder = morphlib.builder.Builder(tempdir, self, morph_loader,
+ src_manager, factory)
+ #cachedir = morphlib.cachedir.CacheDir(self.settings['cachedir'])
+ ex = morphlib.execute.Execute('.', self.msg)
+
+ outpath = args[0]
+ args = args[1:]
+ trip_iter = self._itertriplets(args)
+ paths = {}
+ for name in ('source', 'target'):
+ repo, ref, filename = trip_iter.next()
+ print repo, ref, filename
+ treeish = src_manager.get_treeish(repo, ref)
+ morph = morph_loader.load(treeish, filename)
+ blob = morphlib.blobs.Blob.create_blob(morph)
+ blob_builder = builder.create_blob_builder(blob)
+ paths[name] = blob_builder.filename(morph.name)
+
+ try:
+ for name in paths.iterkeys():
+ # mount the system images
+ part = morphlib.fsutils.setup_device_mapping(ex, paths[name])
+ mount_point = tempdir.join('mnt_' + name)
+ morphlib.fsutils.mount(ex, part, mount_point)
+
+ # make a diff
+ ex.runv(['tbdiff-create', outpath,
+ os.path.join(tempdir.join('mnt_source'), 'factory'),
+ os.path.join(tempdir.join('mnt_target'), 'factory')])
+ except Exception:
+ raise
+ finally:
+ # cleanup
+ for name in paths.iterkeys():
+ mount_point = tempdir.join('mnt_' + name)
+ morphlib.fsutils.unmount(ex, mount_point)
+ morphlib.fsutils.undo_device_mapping(ex, paths[name])
+ factory.remove_staging()
+
def cmd_init(self, args):
'''Initialize a mine.'''