combo-layer: dummy "update with history"

When setting "history = True" in combo-layer.conf consistently for the
components involved in an update or using "update" together with the
"--history" command line flag, a new mode for updating will be used
that does not rely on exporting/importing patches.

A config setting is used because it should be used consistently by
everyone using the same config, without having to remember to use an
additional command line parameter.

There are no real global settings, so the setting is checked
separately for each component although the setting has to be set
consistently. This restriction could be removed later.

In practice, putting "history" into the "[DEFAULT]" section is the
easiest approach for configuring it.

The actual code changes split up action_update and the
combo-layer.conf handling in preparation for this new mode, without
implementing the mode itself.

(From OE-Core rev: c9dab31f5f6dc225f5c2c2ca3ec9aeab2ff655d5)

Signed-off-by: Patrick Ohly <patrick.ohly@intel.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Patrick Ohly 2016-05-02 15:27:26 +02:00 committed by Richard Purdie
parent eb0ab04149
commit aa4de3c8c5

View File

@ -73,7 +73,7 @@ class Configuration(object):
else: else:
# Apply special type transformations for some properties. # Apply special type transformations for some properties.
# Type matches the RawConfigParser.get*() methods. # Type matches the RawConfigParser.get*() methods.
types = {'signoff': 'boolean', 'update': 'boolean'} types = {'signoff': 'boolean', 'update': 'boolean', 'history': 'boolean'}
if name in types: if name in types:
value = getattr(parser, 'get' + types[name])(section, name) value = getattr(parser, 'get' + types[name])(section, name)
self.repos[repo][name] = value self.repos[repo][name] = value
@ -610,8 +610,12 @@ def action_pull(conf, args):
def action_update(conf, args): def action_update(conf, args):
""" """
update the component repos update the component repos
generate the patch list either:
apply the generated patches generate the patch list
apply the generated patches
or:
re-creates the entire component history and merges them
into the current branch with a merge commit
""" """
components = [arg.split(':')[0] for arg in args[1:]] components = [arg.split(':')[0] for arg in args[1:]]
revisions = {} revisions = {}
@ -624,10 +628,23 @@ def action_update(conf, args):
# make sure combo repo is clean # make sure combo repo is clean
check_repo_clean(os.getcwd()) check_repo_clean(os.getcwd())
import uuid # Check whether we keep the component histories. Must be
patch_dir = "patch-%s" % uuid.uuid4() # set either via --history command line parameter or consistently
if not os.path.exists(patch_dir): # in combo-layer.conf. Mixing modes is (currently, and probably
os.mkdir(patch_dir) # permanently because it would be complicated) not supported.
if conf.history:
history = True
else:
history = None
for name in repos:
repo = conf.repos[name]
repo_history = repo.get('history', True)
logger.error('%s: %s' % (name, repo_history))
if history is None:
history = repo_history
elif history != repo_history:
logger.error("'history' property is set inconsistently")
sys.exit(1)
# Step 1: update the component repos # Step 1: update the component repos
if conf.nopull: if conf.nopull:
@ -635,6 +652,18 @@ def action_update(conf, args):
else: else:
action_pull(conf, ['arg0'] + components) action_pull(conf, ['arg0'] + components)
if history:
logger.error("update with history not implemented yet")
sys.exit(1)
else:
update_with_patches(conf, components, revisions, repos)
def update_with_patches(conf, components, revisions, repos):
import uuid
patch_dir = "patch-%s" % uuid.uuid4()
if not os.path.exists(patch_dir):
os.mkdir(patch_dir)
for name in repos: for name in repos:
revision = revisions.get(name, None) revision = revisions.get(name, None)
repo = conf.repos[name] repo = conf.repos[name]
@ -711,6 +740,21 @@ def action_update(conf, args):
runcmd("rm -rf %s" % patch_dir) runcmd("rm -rf %s" % patch_dir)
# Step 7: commit the updated config file if it's being tracked # Step 7: commit the updated config file if it's being tracked
commit_conf_file(conf, components)
def conf_commit_msg(conf, components):
# create the "components" string
component_str = "all components"
if len(components) > 0:
# otherwise tell which components were actually changed
component_str = ", ".join(components)
# expand the template with known values
template = Template(conf.commit_msg_template)
msg = template.substitute(components = component_str)
return msg
def commit_conf_file(conf, components, commit=True):
relpath = os.path.relpath(conf.conffile) relpath = os.path.relpath(conf.conffile)
try: try:
output = runcmd("git status --porcelain %s" % relpath, printerr=False) output = runcmd("git status --porcelain %s" % relpath, printerr=False)
@ -718,23 +762,15 @@ def action_update(conf, args):
# Outside the repository # Outside the repository
output = None output = None
if output: if output:
logger.info("Committing updated configuration file")
if output.lstrip().startswith("M"): if output.lstrip().startswith("M"):
logger.info("Committing updated configuration file")
# create the "components" string if commit:
component_str = "all components" msg = conf_commit_msg(conf, components)
if len(components) > 0: runcmd('git commit -m'.split() + [msg, relpath])
# otherwise tell which components were actually changed else:
component_str = ", ".join(components) runcmd('git add %s' % relpath)
return True
# expand the template with known values return False
template = Template(conf.commit_msg_template)
raw_msg = template.substitute(components = component_str)
# sanitize the string before using it in command line
msg = raw_msg.replace('"', '\\"')
runcmd('git commit -m "%s" %s' % (msg, relpath))
def apply_patchlist(conf, repos): def apply_patchlist(conf, repos):
""" """