summaryrefslogtreecommitdiff
path: root/morph
diff options
context:
space:
mode:
Diffstat (limited to 'morph')
-rwxr-xr-xmorph122
1 files changed, 75 insertions, 47 deletions
diff --git a/morph b/morph
index f7994fdb..1b15ea36 100755
--- a/morph
+++ b/morph
@@ -330,7 +330,8 @@ class Morph(cliapp.Application):
while queue:
reponame, ref, filename = queue.popleft()
absref = self._resolveref(lrc, rrc, reponame, ref, update)
- morphology = morph_factory.get_morphology(reponame, absref, filename)
+ morphology = morph_factory.get_morphology(
+ reponame, absref, filename)
visit(reponame, ref, filename, absref, morphology)
if morphology['kind'] == 'system':
queue.extend((reponame, ref, '%s.morph' % s)
@@ -508,57 +509,84 @@ class Morph(cliapp.Application):
tempdir.remove()
def cmd_make_patch(self, args):
- assert os.path.exists(self.settings['cachedir'])
+ '''Create a Trebuchet patch between two system images.'''
- 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()
- 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)
+ logging.debug('cmd_make_patch starting')
+
+ if len(args) != 7:
+ raise cliapp.AppException('make-patch requires arguments: '
+ 'name of output file plus two triplest')
+ output = args[0]
+ repo_name1, ref1, filename1 = args[1:4]
+ repo_name2, ref2, filename2 = args[4:7]
+
+ self.settings.require('cachedir')
+ cachedir = self.settings['cachedir']
+ build_env = morphlib.buildenvironment.BuildEnvironment(self.settings)
+ ckc = morphlib.cachekeycomputer.CacheKeyComputer(build_env)
+ lac = morphlib.localartifactcache.LocalArtifactCache(cachedir)
+ lrc = morphlib.localrepocache.LocalRepoCache(
+ os.path.join(cachedir, 'gits'),
+ self.settings['git-base-url'],
+ bundle_base_url=self.settings['bundle-server'])
+ rrc = None
+
+ def the_one(source, repo_name, ref, filename):
+ return (source.repo_name == repo_name and
+ source.original_ref == ref and
+ source.filename == filename)
+
+ def get_artifact(repo_name, ref, filename):
+ srcpool = self._create_source_pool(lrc, rrc,
+ (repo_name, ref, filename))
+ ar = morphlib.artifactresolver.ArtifactResolver()
+ artifacts = ar.resolve_artifacts(srcpool)
+ for artifact in artifacts:
+ artifact.cache_key = ckc.compute_key(artifact)
+ if the_one(artifact.source, repo_name, ref, filename):
+ return artifact
+
+ artifact1 = get_artifact(repo_name1, ref1, filename1)
+ artifact2 = get_artifact(repo_name2, ref2, filename2)
+
+ image_path_1 = lac.get(artifact1).name
+ image_path_2 = lac.get(artifact2).name
+
+ def setup(path):
+ part = morphlib.fsutils.setup_device_mapping(ex, path)
+ mount_point = tempfile.mkdtemp()
+ morphlib.fsutils.mount(ex, part, mount_point)
+ return mount_point
+
+ def cleanup(path, mount_point):
+ try:
+ morphlib.fsutils.unmount(ex, mount_point)
+ except:
+ pass
+ try:
+ morphlib.fsutils.undo_device_mapping(ex, path)
+ except:
+ pass
+ try:
+ os.rmdir(mount_point)
+ except:
+ pass
+
+ ex = morphlib.execute.Execute('.', logging.debug)
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:
+ mount_point_1 = setup(image_path_1)
+ mount_point_2 = setup(image_path_2)
+
+ ex.runv(['tbdiff-create', output,
+ os.path.join(mount_point_1, 'factory'),
+ os.path.join(mount_point_2, 'factory')])
+ except BaseException:
raise
finally:
- # cleanup
- for name in paths.iterkeys():
- mount_point = tempdir.join('mnt_' + name)
- try:
- morphlib.fsutils.unmount(ex, mount_point)
- except:
- pass
- try:
- morphlib.fsutils.undo_device_mapping(ex, paths[name])
- except:
- pass
- factory.remove_staging()
-
+ cleanup(image_path_1, mount_point_1)
+ cleanup(image_path_2, mount_point_2)
+
def cmd_init(self, args):
'''Initialize a mine.'''