commit: a8fcba31e0eada1048d69d0f8c507e6362614af2 Author: Zac Medico <zmedico <AT> gentoo <DOT> org> AuthorDate: Wed Oct 22 12:10:53 2014 +0000 Commit: Zac Medico <zmedico <AT> gentoo <DOT> org> CommitDate: Wed Oct 22 12:10:53 2014 +0000 URL: http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=a8fcba31
Test sync with rsync and git, using file:// uri --- pym/portage/tests/sync/__init__.py | 2 + pym/portage/tests/sync/__test__.py | 0 pym/portage/tests/sync/test_sync_local.py | 186 ++++++++++++++++++++++++++++++ 3 files changed, 188 insertions(+) diff --git a/pym/portage/tests/sync/__init__.py b/pym/portage/tests/sync/__init__.py new file mode 100644 index 0000000..7cd880e --- /dev/null +++ b/pym/portage/tests/sync/__init__.py @@ -0,0 +1,2 @@ +# Copyright 2014 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 diff --git a/pym/portage/tests/sync/__test__.py b/pym/portage/tests/sync/__test__.py new file mode 100644 index 0000000..e69de29 diff --git a/pym/portage/tests/sync/test_sync_local.py b/pym/portage/tests/sync/test_sync_local.py new file mode 100644 index 0000000..ace3918 --- /dev/null +++ b/pym/portage/tests/sync/test_sync_local.py @@ -0,0 +1,186 @@ +# Copyright 2014 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +import subprocess +import sys +import textwrap +import time + +import portage +from portage import os, shutil +from portage import _unicode_decode +from portage.const import PORTAGE_PYM_PATH, TIMESTAMP_FORMAT +from portage.process import find_binary +from portage.tests import TestCase +from portage.tests.resolver.ResolverPlayground import ResolverPlayground +from portage.util import ensure_dirs + +class SyncLocalTestCase(TestCase): + """ + Test sync with rsync and git, using file:// sync-uri. + """ + + def _must_skip(self): + if find_binary("rsync") is None: + return "rsync: command not found" + if find_binary("git") is None: + return "git: command not found" + + def testSyncLocal(self): + debug = False + + skip_reason = self._must_skip() + if skip_reason: + self.portage_skip = skip_reason + self.assertFalse(True, skip_reason) + return + + repos_conf = textwrap.dedent(""" + [test_repo] + location = %(EPREFIX)s/var/repositories/test_repo + sync-type = %(sync-type)s + sync-uri = file:/%(EPREFIX)s/var/repositories/test_repo_sync + auto-sync = yes + """) + + profile = { + "eapi": ("5",), + "package.use.stable.mask": ("dev-libs/A flag",) + } + + ebuilds = { + "dev-libs/A-0": {} + } + + playground = ResolverPlayground(ebuilds=ebuilds, + profile=profile, user_config={}, debug=debug) + settings = playground.settings + eprefix = settings["EPREFIX"] + eroot = settings["EROOT"] + homedir = os.path.join(eroot, "home") + distdir = os.path.join(eprefix, "distdir") + repo = settings.repositories["test_repo"] + metadata_dir = os.path.join(repo.location, "metadata") + + cmds = {} + for cmd in ("emerge", "emaint"): + cmds[cmd] = (portage._python_interpreter, + "-b", "-Wd", os.path.join(self.bindir, cmd)) + + git_binary = find_binary("git") + git_cmd = (git_binary,) + + committer_name = "Gentoo Dev" + committer_email = "gentoo-...@gentoo.org" + + def change_sync_type(sync_type): + env["PORTAGE_REPOSITORIES"] = repos_conf % \ + {"EPREFIX": eprefix, "sync-type": sync_type} + + sync_cmds = ( + (homedir, cmds["emerge"] + ("--sync",)), + (homedir, cmds["emaint"] + ("sync", "-A")), + ) + + rename_repo = ( + (homedir, lambda: os.rename(repo.location, + repo.location + "_sync")), + ) + + delete_sync_repo = ( + (homedir, lambda: shutil.rmtree( + repo.location + "_sync")), + ) + + git_repo_create = ( + (repo.location, git_cmd + + ("config", "--global", "user.name", committer_name,)), + (repo.location, git_cmd + + ("config", "--global", "user.email", committer_email,)), + (repo.location, git_cmd + ("init-db",)), + (repo.location, git_cmd + ("add", ".")), + (repo.location, git_cmd + + ("commit", "-a", "-m", "add whole repo")), + ) + + sync_type_git = ( + (homedir, lambda: change_sync_type("git")), + ) + + pythonpath = os.environ.get("PYTHONPATH") + if pythonpath is not None and not pythonpath.strip(): + pythonpath = None + if pythonpath is not None and \ + pythonpath.split(":")[0] == PORTAGE_PYM_PATH: + pass + else: + if pythonpath is None: + pythonpath = "" + else: + pythonpath = ":" + pythonpath + pythonpath = PORTAGE_PYM_PATH + pythonpath + + env = { + "PORTAGE_OVERRIDE_EPREFIX" : eprefix, + "DISTDIR" : distdir, + "GENTOO_COMMITTER_NAME" : committer_name, + "GENTOO_COMMITTER_EMAIL" : committer_email, + "HOME" : homedir, + "PATH" : os.environ["PATH"], + "PORTAGE_GRPNAME" : os.environ["PORTAGE_GRPNAME"], + "PORTAGE_USERNAME" : os.environ["PORTAGE_USERNAME"], + "PORTAGE_REPOSITORIES" : repos_conf % + {"EPREFIX": eprefix, "sync-type": "rsync"}, + "PYTHONPATH" : pythonpath, + } + + if os.environ.get("SANDBOX_ON") == "1": + # avoid problems from nested sandbox instances + env["FEATURES"] = "-sandbox -usersandbox" + + dirs = [homedir, metadata_dir] + try: + for d in dirs: + ensure_dirs(d) + + timestamp_path = os.path.join(metadata_dir, 'timestamp.chk') + with open(timestamp_path, 'w') as f: + f.write(time.strftime('%s\n' % TIMESTAMP_FORMAT, time.gmtime())) + + if debug: + # The subprocess inherits both stdout and stderr, for + # debugging purposes. + stdout = None + else: + # The subprocess inherits stderr so that any warnings + # triggered by python -Wd will be visible. + stdout = subprocess.PIPE + + for cwd, cmd in rename_repo + sync_cmds + \ + delete_sync_repo + git_repo_create + sync_type_git + \ + rename_repo + sync_cmds: + + if hasattr(cmd, '__call__'): + cmd() + continue + + abs_cwd = os.path.join(repo.location, cwd) + proc = subprocess.Popen(cmd, + cwd=abs_cwd, env=env, stdout=stdout) + + if debug: + proc.wait() + else: + output = proc.stdout.readlines() + proc.wait() + proc.stdout.close() + if proc.returncode != os.EX_OK: + for line in output: + sys.stderr.write(_unicode_decode(line)) + + self.assertEqual(os.EX_OK, proc.returncode, + "%s failed in %s" % (cmd, cwd,)) + + + finally: + playground.cleanup()