diff --git a/src/cmd-build b/src/cmd-build index 25e2c3f7ab..235e9d315a 100755 --- a/src/cmd-build +++ b/src/cmd-build @@ -80,10 +80,9 @@ prepare_build ostree --version rpm-ostree --version -previous_build= -if [ -L "${workdir}"/builds/latest ]; then - previous_build=$(readlink "${workdir}"/builds/latest) - previous_builddir="${workdir}/builds/${previous_build}" +previous_build=$(get_latest_build) +if [ -n "${previous_build}" ]; then + previous_builddir=$(get_build_dir "${previous_build}") echo "Previous build: ${previous_build}" fi @@ -145,7 +144,8 @@ commitmeta_input_json=${PWD}/tmp/commit-metadata-input.json cat > "${commitmeta_input_json}" <= 2: + raise Exception("Builds schema too new; please update cosa") + # for now, since we essentially just support "1.0.0" and "0.0.1", + # just dillute to a bool + self._legacy = (self._version._major < 1) + + def _path(self, path): + if not self._workdir: + return path + return os.path.join(self._workdir, path) + + def has(self, build_id): + if self._legacy: + return build_id in self._data['builds'] + return any([b['id'] == build_id for b in self._data['builds']]) + + def is_empty(self): + return len(self._data['builds']) == 0 + + def get_latest(self): + # just let throw if there are none + if self._legacy: + return self._data['builds'][0] + return self._data['builds'][0]['id'] + + def get_build_archs(self, build_id): + assert not self._legacy + for build in self._data['builds']: + if build['id'] == build_id: + return build['archs'] + assert False, "Build not found!" + + def get_build_dir(self, build_id, basearch=None): + if build_id == 'latest': + build_id = self.get_latest() + if self._legacy: + return self._path(f"builds/{build_id}") + if not basearch: + # just assume caller wants build dir for current arch + basearch = get_basearch() + return self._path(f"builds/{build_id}/{basearch}") + + def insert_build(self, build_id, basearch=None): + if self._legacy: + self._data['builds'].insert(0, build_id) + else: + if not basearch: + basearch = get_basearch() + # for future tooling: allow inserting in an existing build for a + # separate arch + for build in self._data['builds']: + if build['id'] == build_id: + if basearch in build['archs']: + raise "Build {build_id} for {basearch} already exists" + build['archs'] += [basearch] + break + else: + self._data['builds'].insert(0, { + 'id': build_id, + 'archs': [ + basearch + ] + }) + + def bump_timestamp(self): + self._data['timestamp'] = rfc3339_time() + self.flush() + + def is_legacy(self): + return self._legacy + + def raw(self): + return self._data + + def flush(self): + write_json(self._fn, self._data) diff --git a/src/cmdlib.sh b/src/cmdlib.sh index c4cf99254a..712cc771ce 100755 --- a/src/cmdlib.sh +++ b/src/cmdlib.sh @@ -30,6 +30,14 @@ fatal() { echo "fatal: $*" 1>&2; exit 1 } +# Get target base architecture +basearch=$(python3 -c ' +import gi +gi.require_version("RpmOstree", "1.0") +from gi.repository import RpmOstree +print(RpmOstree.get_basearch())') +export basearch + # Get target architecture arch=$(uname -m) export arch @@ -270,7 +278,7 @@ ostree-layers: EOF fi if [[ -n $(ls "${overridesdir}/rpm/"*.rpm 2> /dev/null) ]]; then - (cd "${overridesdir}"/rpm && createrepo_c .) + (cd "${overridesdir}"/rpm && rm -rf .repodata && createrepo_c .) echo "Using RPM overrides from: ${overridesdir}/rpm" cat >> "${override_manifest}" < 0) - for build in builds: + for build in scanned_builds: # skip tagged builds and don't count them towards the limit if build.id in tagged_builds: print(f"Skipping tagged build {build.id}") @@ -161,9 +182,11 @@ else: new_builds.append(build) n = n - 1 -builddata['builds'] = [x.id for x in new_builds] -builddata['timestamp'] = rfc3339_time() -write_json(builds_json, builddata) +builds.raw()['builds'] = [] +for build in reversed(new_builds): + for basearch in build.basearchs: + builds.insert_build(build.id, basearch) +builds.bump_timestamp() # if we're not pruning, then we're done! if skip_pruning: