diff --git a/kas/plugins/dump.py b/kas/plugins/dump.py index 65f86ab..8d4a990 100644 --- a/kas/plugins/dump.py +++ b/kas/plugins/dump.py @@ -1,6 +1,6 @@ # kas - setup tool for bitbake based projects # -# Copyright (c) Siemens AG, 2017-2022 +# Copyright (c) Siemens AG, 2017-2023 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -30,17 +30,17 @@ configuration. When running with ``--lock``, a locking spec is created which only contains - the exact refspecs of each repository. This can be used to pin the - refspecs of floating branches, while still keeping an easy update path. - When combining with ``--inplace``, a lockfile is created next to the - first file on the kas cmdline. For details on the locking support, see + the exact commit of each repository. This can be used to pin the commit of + floating branches, while still keeping an easy update path. When combining + with ``--inplace``, a lockfile is created next to the first file on the kas + cmdline. For details on the locking support, see :class:`kas.includehandler.IncludeHandler`. Please note: - the dumped config is semantically identical but not bit-by-bit identical - all referenced repositories are checked out to resolve cross-repo configs - - all refspecs are resolved before patches are applied + - all branches are resolved before patches are applied For example, to get a single config representing the final build config of ``kas-project.yml:target-override.yml`` you could run:: @@ -121,8 +121,8 @@ class Dump(Checkout): name = 'dump' helpmsg = ( - 'Expand and dump the final config to stdout. When resolving refspecs, ' - 'these are resolved before patches are applied.' + 'Expand and dump the final config to stdout. When resolving branches, ' + 'this is done before patches are applied.' ) class KasYamlDumper(yaml.Dumper): @@ -196,7 +196,7 @@ class Dump(Checkout): # when locking, only consider repos managed by kas repos = [r for r in repos if not r.operations_disabled] config_expanded['overrides'] = \ - {'repos': {r.name: {'refspec': r.revision} for r in repos}} + {'repos': {r.name: {'commit': r.revision} for r in repos}} if args.lock and args.inplace: lockfile = ctx.config.handler.get_lockfile() @@ -208,7 +208,9 @@ class Dump(Checkout): if args.resolve_refs and not args.lock: for r in repos: - if r.refspec: + if r.commit or r.branch: + config_expanded['repos'][r.name]['commit'] = r.revision + elif r.refspec: config_expanded['repos'][r.name]['refspec'] = r.revision if args.resolve_env and 'env' in config_expanded: diff --git a/kas/repos.py b/kas/repos.py index ca6bcb1..95038c1 100644 --- a/kas/repos.py +++ b/kas/repos.py @@ -177,7 +177,7 @@ class Repo: '"{}". This is only allowed for local ' 'repositories.'.format(name)) if refspec is None: - commit = repo_overrides.get('refspec', commit) + commit = repo_overrides.get('commit', commit) else: if name not in Repo.__legacy_refspec_warned__: logging.warning('Using deprecated refspec for repository ' @@ -188,7 +188,7 @@ class Repo: raise RepoRefError('Unsupported mixture of legacy refspec ' 'and commit/branch for repository "{}"' .format(name)) - refspec = repo_overrides.get('refspec', refspec) + refspec = repo_overrides.get('commit', refspec) path = repo_config.get('path', None) disable_operations = False diff --git a/kas/schema-kas.json b/kas/schema-kas.json index bfadf09..65a3198 100644 --- a/kas/schema-kas.json +++ b/kas/schema-kas.json @@ -102,7 +102,7 @@ "type": "object", "additionalProperties": false, "properties": { - "refspec" : { + "commit": { "type": "string" } } diff --git a/tests/test_commands.py b/tests/test_commands.py index bcd5d1b..9f76598 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -143,6 +143,9 @@ def test_lockfile(changedir, tmpdir, capsys): rawspec = yaml.safe_load(capsys.readouterr().out) assert rawspec['repos']['externalrepo']['refspec'] == 'master' + with open('externalrepo/.git/refs/heads/master') as f: + expected_commit = f.readline().strip() + # create lockfile kas.kas('dump --lock --inplace test.yml'.split()) assert os.path.exists('test.lock.yml') @@ -150,24 +153,24 @@ def test_lockfile(changedir, tmpdir, capsys): # lockfile is considered during import, expect pinned branches kas.kas('dump test.yml'.split()) lockspec = yaml.safe_load(capsys.readouterr().out) - assert lockspec['overrides']['repos']['externalrepo']['refspec'] \ - != 'master' + assert lockspec['overrides']['repos']['externalrepo']['commit'] \ + == expected_commit # insert older refspec into lockfile (kas 3.2 tag) test_refspec = 'dc44638cd87c4d0045ea2ca441e682f3525d8b91' - lockspec['overrides']['repos']['externalrepo']['refspec'] = test_refspec + lockspec['overrides']['repos']['externalrepo']['commit'] = test_refspec with open('test.lock.yml', 'w') as f: yaml.safe_dump(lockspec, f) # check if repo is moved to specified commit kas.kas('dump test.yml'.split()) lockspec = yaml.safe_load(capsys.readouterr().out) - assert lockspec['overrides']['repos']['externalrepo']['refspec'] \ + assert lockspec['overrides']['repos']['externalrepo']['commit'] \ == test_refspec # update lockfile, check if repo is pinned to other commit kas.kas('dump --lock --inplace --update test.yml'.split()) with open('test.lock.yml', 'r') as f: lockspec = yaml.safe_load(f) - assert lockspec['overrides']['repos']['externalrepo']['refspec'] \ + assert lockspec['overrides']['repos']['externalrepo']['commit'] \ != test_refspec