mirror of
git://git.yoctoproject.org/poky.git
synced 2025-07-19 12:59:02 +02:00

e9cff55e73
has switched tag listing from bare "git tag" to "git ls-remote" to make sure not to miss remote tags which are not fetched locally. This mechanism first checks for configured remote repository, next for possibly passed url, and then fails if none worked. However there are still cases where no remote repository is configured and no url is provided (for instance: buildperf tests use an empty git directory to store tests). Fix those cases by putting back the old behavior (local tags check) as last resort, with at least a warning for future diagnostics if we still encounter tagging issues Fixes:e9cff55e73
("oeqa/utils/gitarchive: fix tag computation when creating archive") (From OE-Core rev: 34e1f845687d2f7169f5d6c1bb54e1a7ab5412c4) Signed-off-by: Alexis Lothoré <alexis.lothore@bootlin.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
137 lines
5.7 KiB
Python
137 lines
5.7 KiB
Python
#
|
|
# Copyright OpenEmbedded Contributors
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
#
|
|
|
|
import os
|
|
import sys
|
|
basepath = os.path.abspath(os.path.dirname(__file__) + '/../../../../../')
|
|
lib_path = basepath + '/scripts/lib'
|
|
sys.path = sys.path + [lib_path]
|
|
import oeqa.utils.gitarchive as ga
|
|
from oeqa.utils.git import GitError
|
|
import tempfile
|
|
import shutil
|
|
import scriptutils
|
|
import logging
|
|
from oeqa.selftest.case import OESelftestTestCase
|
|
|
|
logger = scriptutils.logger_create('resulttool')
|
|
|
|
def create_fake_repository(commit, tag_list=[], add_remote=True):
|
|
""" Create a testing git directory
|
|
|
|
Initialize a simple git repository with one initial commit, and as many
|
|
tags on this commit as listed in tag_list
|
|
Returns both git directory path and gitarchive git object
|
|
If commit is true, fake data will be commited, otherwise it will stay in staging area
|
|
If commit is true and tag_lsit is non empty, all tags in tag_list will be
|
|
created on the initial commit
|
|
Fake remote will also be added to make git ls-remote work
|
|
"""
|
|
fake_data_file = "fake_data.txt"
|
|
tempdir = tempfile.mkdtemp(prefix='fake_results.')
|
|
repo = ga.init_git_repo(tempdir, False, False, logger)
|
|
if add_remote:
|
|
repo.run_cmd(["remote", "add", "origin", "."])
|
|
with open(os.path.join(tempdir, fake_data_file), "w") as fake_data:
|
|
fake_data.write("Fake data")
|
|
if commit:
|
|
repo.run_cmd(["add", fake_data_file])
|
|
repo.run_cmd(["commit", "-m", "\"Add fake data\""])
|
|
for tag in tag_list:
|
|
repo.run_cmd(["tag", tag])
|
|
|
|
return tempdir, repo
|
|
|
|
def delete_fake_repository(path):
|
|
shutil.rmtree(path)
|
|
|
|
def tag_exists(git_obj, target_tag):
|
|
for tag in git_obj.run_cmd(["tag"]).splitlines():
|
|
if target_tag == tag:
|
|
return True
|
|
return False
|
|
|
|
class GitArchiveTests(OESelftestTestCase):
|
|
TEST_BRANCH="main"
|
|
TEST_COMMIT="0f7d5df"
|
|
TEST_COMMIT_COUNT="42"
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
cls.log = logging.getLogger('gitarchivetests')
|
|
cls.log.setLevel(logging.DEBUG)
|
|
|
|
def test_create_first_test_tag(self):
|
|
path, git_obj = create_fake_repository(False)
|
|
keywords = {'commit': self.TEST_COMMIT, 'branch': self.TEST_BRANCH, "commit_count": self.TEST_COMMIT_COUNT}
|
|
target_tag = f"{self.TEST_BRANCH}/{self.TEST_COMMIT_COUNT}-g{self.TEST_COMMIT}/0"
|
|
|
|
ga.gitarchive(path, path, True, False,
|
|
"Results of {branch}:{commit}", "branch: {branch}\ncommit: {commit}", "{branch}",
|
|
False, "{branch}/{commit_count}-g{commit}/{tag_number}",
|
|
'Test run #{tag_number} of {branch}:{commit}', '',
|
|
[], [], False, keywords, logger)
|
|
self.assertTrue(tag_exists(git_obj, target_tag), msg=f"Tag {target_tag} has not been created")
|
|
delete_fake_repository(path)
|
|
|
|
def test_create_second_test_tag(self):
|
|
first_tag = f"{self.TEST_BRANCH}/{self.TEST_COMMIT_COUNT}-g{self.TEST_COMMIT}/0"
|
|
second_tag = f"{self.TEST_BRANCH}/{self.TEST_COMMIT_COUNT}-g{self.TEST_COMMIT}/1"
|
|
keywords = {'commit': self.TEST_COMMIT, 'branch': self.TEST_BRANCH, "commit_count": self.TEST_COMMIT_COUNT}
|
|
|
|
path, git_obj = create_fake_repository(True, [first_tag])
|
|
ga.gitarchive(path, path, True, False,
|
|
"Results of {branch}:{commit}", "branch: {branch}\ncommit: {commit}", "{branch}",
|
|
False, "{branch}/{commit_count}-g{commit}/{tag_number}",
|
|
'Test run #{tag_number} of {branch}:{commit}', '',
|
|
[], [], False, keywords, logger)
|
|
self.assertTrue(tag_exists(git_obj, second_tag), msg=f"Second tag {second_tag} has not been created")
|
|
delete_fake_repository(path)
|
|
|
|
def test_get_revs_on_branch(self):
|
|
fake_tags_list=["main/10-g0f7d5df/0", "main/10-g0f7d5df/1", "foo/20-g2468f5d/0"]
|
|
tag_name = "{branch}/{commit_number}-g{commit}/{tag_number}"
|
|
|
|
path, git_obj = create_fake_repository(True, fake_tags_list)
|
|
revs = ga.get_test_revs(logger, git_obj, tag_name, branch="main")
|
|
self.assertEqual(len(revs), 1)
|
|
self.assertEqual(revs[0].commit, "0f7d5df")
|
|
self.assertEqual(len(revs[0].tags), 2)
|
|
self.assertEqual(revs[0].tags, ['main/10-g0f7d5df/0', 'main/10-g0f7d5df/1'])
|
|
delete_fake_repository(path)
|
|
|
|
def test_get_tags_without_valid_remote(self):
|
|
url = 'git://git.yoctoproject.org/poky'
|
|
path, git_obj = create_fake_repository(False, None, False)
|
|
|
|
tags = ga.get_tags(git_obj, self.log, pattern="yocto-*", url=url)
|
|
"""Test for some well established tags (released tags)"""
|
|
self.assertIn("yocto-4.0", tags)
|
|
self.assertIn("yocto-4.1", tags)
|
|
self.assertIn("yocto-4.2", tags)
|
|
delete_fake_repository(path)
|
|
|
|
def test_get_tags_with_only_local_tag(self):
|
|
fake_tags_list=["main/10-g0f7d5df/0", "main/10-g0f7d5df/1", "foo/20-g2468f5d/0"]
|
|
path, git_obj = create_fake_repository(True, fake_tags_list, False)
|
|
|
|
"""No remote is configured and no url is passed: get_tags must fall
|
|
back to local tags
|
|
"""
|
|
tags = ga.get_tags(git_obj, self.log)
|
|
self.assertCountEqual(tags, fake_tags_list)
|
|
delete_fake_repository(path)
|
|
|
|
def test_get_tags_without_valid_remote_and_wrong_url(self):
|
|
url = 'git://git.foo.org/bar'
|
|
path, git_obj = create_fake_repository(False, None, False)
|
|
|
|
"""Test for some well established tags (released tags)"""
|
|
with self.assertRaises(GitError):
|
|
tags = ga.get_tags(git_obj, self.log, pattern="yocto-*", url=url)
|
|
delete_fake_repository(path)
|