ostbuild: More work on partial builds

This commit is contained in:
Colin Walters 2012-05-12 10:42:23 -04:00
parent eae69513a7
commit 92244c80cc
3 changed files with 58 additions and 53 deletions

View File

@ -40,7 +40,7 @@ def parse_src_key(srckey):
if idx < 0:
raise ValueError("Invalid SRC uri=%s" % (srckey, ))
keytype = srckey[:idx]
if keytype not in ['git', 'dirty-git']:
if keytype not in ['git', 'local']:
raise ValueError("Unsupported SRC uri=%s" % (srckey, ))
uri = srckey[idx+1:]
return (keytype, uri)

View File

@ -68,7 +68,7 @@ class OstbuildBuildComponents(builtins.Builtin):
name = '%s/%s' % (basename, architecture)
buildname = 'components/%s' % (name, )
current_vcs_version = component['revision']
current_vcs_version = component.get('revision')
# TODO - deduplicate this with chroot_compile_one
current_meta_io = StringIO()
@ -88,7 +88,8 @@ class OstbuildBuildComponents(builtins.Builtin):
'rev-parse', buildname],
stderr=open('/dev/null', 'w'),
none_on_error=True)
if previous_build_version is not None:
if (current_vcs_version is not None
and previous_build_version is not None):
log("Previous build of '%s' is %s" % (name, previous_build_version))
previous_metadata_text = run_sync_get_output(['ostree', '--repo=' + self.repo,
@ -103,7 +104,6 @@ class OstbuildBuildComponents(builtins.Builtin):
log("Metadata is unchanged from previous")
return False
else:
current_vcs_version = component['revision']
previous_metadata = json.loads(previous_metadata_text)
previous_vcs_version = previous_metadata['revision']
if current_vcs_version == previous_vcs_version:
@ -123,7 +123,8 @@ class OstbuildBuildComponents(builtins.Builtin):
fileutil.ensure_dir(checkoutdir)
component_src = os.path.join(checkoutdir, basename)
run_sync(['ostbuild', 'checkout', '--snapshot=' + self.snapshot_path,
'--clean', '--overwrite', basename], cwd=checkoutdir)
'--checkoutdir=' + component_src,
'--clean', '--overwrite', basename])
artifact_meta = dict(component)
@ -207,10 +208,10 @@ class OstbuildBuildComponents(builtins.Builtin):
if len(component_refs_to_resolve) > 0:
resolved_refs = self._resolve_refs(component_refs_to_resolve)
for name,rev in zip(components.iterkeys(), resolved_refs):
for architecture in component_architectures[name]:
archname = '%s/%s' % (name, architecture)
component_revisions[archname] = rev
for name,rev in zip(component_refs_to_resolve, resolved_refs):
assert name.startswith('components/')
archname = name[len('components/'):]
component_revisions[archname] = rev
bin_snapshot['component-revisions'] = component_revisions

View File

@ -42,35 +42,32 @@ class OstbuildCheckout(builtins.Builtin):
parser.add_argument('--overwrite', action='store_true')
parser.add_argument('--prefix')
parser.add_argument('--snapshot')
parser.add_argument('--checkoutdir')
parser.add_argument('-a', '--active-tree', action='store_true')
parser.add_argument('--clean', action='store_true')
parser.add_argument('components', nargs='*')
parser.add_argument('component')
args = parser.parse_args(argv)
self.args = args
self.parse_config()
if len(args.components) > 0:
checkout_components = args.components
else:
checkout_components = [os.path.basename(os.getcwd())]
if args.active_tree:
self.parse_active_branch()
else:
self.parse_snapshot(args.prefix, args.snapshot)
for component_name in checkout_components:
found = False
component = self.get_component_meta(component_name)
(keytype, uri) = buildutil.parse_src_key(component['src'])
checkoutdir = os.path.join(os.getcwd(), component_name)
fileutil.ensure_parent_dir(checkoutdir)
component_name = args.component
is_dirty = (keytype == 'dirty-git')
found = False
component = self.get_component_meta(component_name)
(keytype, uri) = buildutil.parse_src_key(component['src'])
if is_dirty:
is_local = (keytype == 'local')
if is_local:
if args.checkoutdir:
checkoutdir = args.checkoutdir
# Kind of a hack, but...
if os.path.islink(checkoutdir):
os.unlink(checkoutdir)
@ -78,42 +75,49 @@ class OstbuildCheckout(builtins.Builtin):
shutil.rmtree(checkoutdir)
os.symlink(uri, checkoutdir)
else:
checkoutdir = uri
else:
if args.checkoutdir:
checkoutdir = args.checkoutdir
else:
checkoutdir = os.path.join(os.getcwd(), component_name)
fileutil.ensure_parent_dir(checkoutdir)
vcs.get_vcs_checkout(self.mirrordir, keytype, uri, checkoutdir,
component['revision'],
overwrite=args.overwrite)
if args.clean:
if is_dirty:
log("note: ignoring --clean argument due to \"dirty-git:\" specification")
else:
vcs.clean(keytype, checkoutdir)
patches = component.get('patches')
if patches is not None:
(patches_keytype, patches_uri) = buildutil.parse_src_key(patches['src'])
if patches_keytype == 'git':
patches_mirror = buildutil.get_mirrordir(self.mirrordir, patches_keytype, patches_uri)
vcs.get_vcs_checkout(self.mirrordir, patches_keytype, patches_uri,
self.patchdir, patches['branch'],
overwrite=True)
patchdir = self.patchdir
else:
patchdir = patches_uri
if args.clean:
if is_local:
log("note: ignoring --clean argument due to \"local:\" specification")
else:
vcs.clean(keytype, checkoutdir)
patch_subdir = patches.get('subdir', None)
if patch_subdir is not None:
patchdir = os.path.join(patchdir, patch_subdir)
else:
patchdir = self.patchdir
for patch in patches['files']:
patch_path = os.path.join(patchdir, patch)
run_sync(['git', 'am', '--ignore-date', '-3', patch_path], cwd=checkoutdir)
patches = component.get('patches')
if patches is not None:
(patches_keytype, patches_uri) = buildutil.parse_src_key(patches['src'])
if patches_keytype == 'git':
patches_mirror = buildutil.get_mirrordir(self.mirrordir, patches_keytype, patches_uri)
vcs.get_vcs_checkout(self.mirrordir, patches_keytype, patches_uri,
self.patchdir, patches['branch'],
overwrite=True)
patchdir = self.patchdir
else:
patchdir = patches_uri
metadata_path = os.path.join(checkoutdir, '_ostbuild-meta.json')
f = open(metadata_path, 'w')
json.dump(component, f, indent=4, sort_keys=True)
f.close()
patch_subdir = patches.get('subdir', None)
if patch_subdir is not None:
patchdir = os.path.join(patchdir, patch_subdir)
else:
patchdir = self.patchdir
for patch in patches['files']:
patch_path = os.path.join(patchdir, patch)
run_sync(['git', 'am', '--ignore-date', '-3', patch_path], cwd=checkoutdir)
metadata_path = os.path.join(checkoutdir, '_ostbuild-meta.json')
f = open(metadata_path, 'w')
json.dump(component, f, indent=4, sort_keys=True)
f.close()
log("Checked out: %r" % (checkoutdir, ))
log("Checked out: %r" % (checkoutdir, ))
builtins.register(OstbuildCheckout)