Update pungi-make-ostree to supourt sub-command 'tree', which is just as the original feature of pungi-make-ostree to compose OSTree tree. With the change we can add other sub commands later to build other OSTree artifacts, like the installer image. Inaddtional to the change, now the the 'tree' command can accept an optional '--extra-config' parameter to update the original tree configuration with extra configurations specified in a json file before composing the OSTree tree. Example: pungi-make-ostree tree --repo=/ostree --treefile=/path/to/treefile \ --log-dir=/path/to/log --extra-config=/path/to/extra-config.json The extra-config file can contains the same configuration as OSTree phase, the difference is it doesn't understand variant UID as source repo since it's not ran in the chain of phases. A valid configuration can be like: { "source_repo_from": "http://example.com/repo/x86_64/Server", "extra_source_repos": [ { "name": "optional", "baseurl": "http://example.com/repo/x86_64/optional", "exclude": "systemd-container", "gpgcheck": False }, { "name": "extra", "baseurl": "http://example.com/repo/x86_64/extra", } ], "keep_original_sources": True } The OSTree phase is updated to move out the task of updating treefile, instead of that, it writes the extra configurations to a json file, then 'pungi-make-ostree tree' will take it by option '--extra-config'. Signed-off-by: Qixiang Wan <qwan@redhat.com>
94 lines
3.0 KiB
Python
94 lines
3.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; version 2 of the License.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU Library General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, see <https://gnu.org/licenses/>.
|
|
|
|
|
|
import datetime
|
|
import json
|
|
import os
|
|
|
|
from pungi.util import makedirs
|
|
|
|
|
|
def make_log_file(log_dir, filename):
|
|
"""Return path to log file with given name, if log_dir is set."""
|
|
if not log_dir:
|
|
return None
|
|
makedirs(log_dir)
|
|
return os.path.join(log_dir, '%s.log' % filename)
|
|
|
|
|
|
def get_ref_from_treefile(treefile):
|
|
"""Return ref name by parsing the tree config file"""
|
|
ref = None
|
|
if os.path.isfile(treefile):
|
|
with open(treefile, 'r') as f:
|
|
try:
|
|
parsed = json.loads(f.read())
|
|
ref = parsed['ref']
|
|
except Exception:
|
|
pass
|
|
return ref
|
|
|
|
|
|
def get_commitid_from_commitid_file(commitid_file):
|
|
"""Return commit id which is read from the commitid file"""
|
|
commitid = None
|
|
if os.path.isfile(commitid_file):
|
|
with open(commitid_file, 'r') as f:
|
|
commitid = f.read().replace('\n', '')
|
|
return commitid
|
|
|
|
|
|
def tweak_treeconf(treeconf, source_repos=None, keep_original_sources=False):
|
|
"""
|
|
Update tree config file by adding new repos, and remove existing repos
|
|
from the tree config file if 'keep_original_sources' is not enabled.
|
|
"""
|
|
# add this timestamp to repo name to get unique repo filename and repo name
|
|
# should be safe enough
|
|
time = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
|
|
|
|
treeconf_dir = os.path.dirname(treeconf)
|
|
with open(treeconf, 'r') as f:
|
|
treeconf_content = json.load(f)
|
|
|
|
# backup the old tree config
|
|
os.rename(treeconf, '%s.%s.bak' % (treeconf, time))
|
|
|
|
repos = []
|
|
if source_repos:
|
|
for repo in source_repos:
|
|
name = "%s-%s" % (repo['name'], time)
|
|
with open("%s/%s.repo" % (treeconf_dir, name), 'w') as f:
|
|
f.write("[%s]\n" % name)
|
|
f.write("name=%s\n" % name)
|
|
f.write("baseurl=%s\n" % repo['baseurl'])
|
|
exclude = repo.get('exclude', None)
|
|
if exclude:
|
|
f.write("exclude=%s\n" % exclude)
|
|
gpgcheck = '1' if repo.get('gpgcheck', False) else '0'
|
|
f.write("gpgcheck=%s\n" % gpgcheck)
|
|
repos.append(name)
|
|
|
|
original_repos = treeconf_content.get('repos', [])
|
|
if keep_original_sources:
|
|
treeconf_content['repos'] = original_repos + repos
|
|
else:
|
|
treeconf_content['repos'] = repos
|
|
|
|
# update tree config to add new repos
|
|
with open(treeconf, 'w') as f:
|
|
json.dump(treeconf_content, f, indent=4)
|