Benjamin Poirier 600ead
#!/usr/bin/python3
Benjamin Poirier 6a71e7
# -*- coding: utf-8 -*-
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
import os
Benjamin Poirier 6a71e7
import os.path
Benjamin Poirier 6a71e7
import shutil
Benjamin Poirier 6a71e7
import subprocess
Benjamin Poirier 6a71e7
import sys
Benjamin Poirier 6a71e7
import tempfile
Benjamin Poirier 6a71e7
import unittest
Benjamin Poirier 6a71e7
Benjamin Poirier 50602b
import pygit2_wrapper as pygit2
Benjamin Poirier 50602b
Benjamin Poirier 6a71e7
import git_sort
Benjamin Poirier 6a71e7
import lib
Benjamin Poirier 39e1be
import tests.support
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
class TestSeriesSort(unittest.TestCase):
Benjamin Poirier 6a71e7
    def setUp(self):
Benjamin Poirier 535548
        self.ss_path = os.path.join(lib.libdir(), "series_sort.py")
Benjamin Poirier 535548
Benjamin Poirier 6a71e7
        os.environ["XDG_CACHE_HOME"] = tempfile.mkdtemp(prefix="gs_cache")
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
        # setup stub linux repository
Benjamin Poirier 6a71e7
        os.environ["LINUX_GIT"] = tempfile.mkdtemp(prefix="gs_repo")
Benjamin Poirier 6a71e7
        self.repo = pygit2.init_repository(os.environ["LINUX_GIT"])
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
        author = pygit2.Signature('Alice Author', 'alice@authors.tld')
Benjamin Poirier 6a71e7
        committer = pygit2.Signature('Cecil Committer', 'cecil@committers.tld')
Benjamin Poirier 6a71e7
        tree = self.repo.TreeBuilder().write()
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
        m0 = self.repo.create_commit(
Benjamin Poirier 6a71e7
            "refs/heads/mainline",
Benjamin Poirier 6a71e7
            author,
Benjamin Poirier 6a71e7
            committer,
Benjamin Poirier 6a71e7
            "mainline 0\n\nlog",
Benjamin Poirier 6a71e7
            tree,
Benjamin Poirier 6a71e7
            []
Benjamin Poirier 6a71e7
        )
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
        n0 = self.repo.create_commit(
Benjamin Poirier 6a71e7
            "refs/heads/net",
Benjamin Poirier 6a71e7
            author,
Benjamin Poirier 6a71e7
            committer,
Benjamin Poirier 6a71e7
            "net 0\n\nlog",
Benjamin Poirier 6a71e7
            tree,
Benjamin Poirier 6a71e7
            [m0]
Benjamin Poirier 6a71e7
        )
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
        self.repo.checkout("refs/heads/mainline")
Benjamin Poirier 6a71e7
        m1 = self.repo.create_commit(
Benjamin Poirier 6a71e7
            "refs/heads/mainline",
Benjamin Poirier 6a71e7
            author,
Benjamin Poirier 6a71e7
            committer,
Benjamin Poirier 6a71e7
            "mainline 1, merge net\n\nlog",
Benjamin Poirier 6a71e7
            tree,
Benjamin Poirier 6a71e7
            [m0, n0]
Benjamin Poirier 6a71e7
        )
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
        m2 = self.repo.create_commit(
Benjamin Poirier 6a71e7
            "refs/heads/mainline",
Benjamin Poirier 6a71e7
            author,
Benjamin Poirier 6a71e7
            committer,
Benjamin Poirier 6a71e7
            "mainline 2\n\nlog",
Benjamin Poirier 6a71e7
            tree,
Benjamin Poirier 6a71e7
            [m1]
Benjamin Poirier 6a71e7
        )
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
        n1 = self.repo.create_commit(
Benjamin Poirier 6a71e7
            "refs/heads/net",
Benjamin Poirier 6a71e7
            author,
Benjamin Poirier 6a71e7
            committer,
Benjamin Poirier 6a71e7
            "net 1\n\nlog",
Benjamin Poirier 6a71e7
            tree,
Benjamin Poirier 6a71e7
            [n0]
Benjamin Poirier 6a71e7
        )
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
        n2 = self.repo.create_commit(
Benjamin Poirier 6a71e7
            "refs/heads/net",
Benjamin Poirier 6a71e7
            author,
Benjamin Poirier 6a71e7
            committer,
Benjamin Poirier 6a71e7
            "net 2\n\nlog",
Benjamin Poirier 6a71e7
            tree,
Benjamin Poirier 6a71e7
            [n1]
Benjamin Poirier 6a71e7
        )
Benjamin Poirier 6a71e7
Benjamin Poirier 39e1be
        oot0 = self.repo.create_commit(
Benjamin Poirier 39e1be
            "refs/heads/oot",
Benjamin Poirier 39e1be
            author,
Benjamin Poirier 39e1be
            committer,
Benjamin Poirier 39e1be
            "oot 0\n\nlog",
Benjamin Poirier 39e1be
            tree,
Benjamin Poirier 39e1be
            [m0]
Benjamin Poirier 39e1be
        )
Benjamin Poirier 39e1be
Benjamin Poirier 39e1be
        oot1 = self.repo.create_commit(
Benjamin Poirier 39e1be
            "refs/heads/oot",
Benjamin Poirier 39e1be
            author,
Benjamin Poirier 39e1be
            committer,
Benjamin Poirier 39e1be
            "oot 1\n\nlog",
Benjamin Poirier 39e1be
            tree,
Benjamin Poirier 39e1be
            [oot0]
Benjamin Poirier 39e1be
        )
Benjamin Poirier 39e1be
Benjamin Poirier 39e1be
        k_org_canon_prefix = "git://git.kernel.org/pub/scm/linux/kernel/git/"
Benjamin Poirier 39e1be
        origin_repo = k_org_canon_prefix + "torvalds/linux.git"
Benjamin Poirier 39e1be
        self.repo.remotes.create("origin", origin_repo)
Benjamin Poirier 6a71e7
        self.repo.references.create("refs/remotes/origin/master", m2)
Benjamin Poirier 6a71e7
Benjamin Poirier 39e1be
        net_repo = k_org_canon_prefix + "davem/net.git"
Benjamin Poirier 39e1be
        self.repo.remotes.create("net", net_repo)
Benjamin Poirier 6a71e7
        self.repo.references.create("refs/remotes/net/master", n2)
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
        self.index = git_sort.SortIndex(self.repo)
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
        # setup stub kernel-source content
Benjamin Poirier 6a71e7
        self.ks_dir = tempfile.mkdtemp(prefix="gs_ks")
Benjamin Poirier 960235
        patch_dir = os.path.join(self.ks_dir, "patches.suse")
Benjamin Poirier 960235
        os.mkdir(patch_dir)
Benjamin Poirier 960235
        os.chdir(patch_dir)
Benjamin Poirier 39e1be
        tests.support.format_patch(self.repo.get(m0), mainline="v3.45-rc6")
Benjamin Poirier 39e1be
        tests.support.format_patch(self.repo.get(n0), mainline="v3.45-rc6")
Benjamin Poirier 39e1be
        tests.support.format_patch(self.repo.get(n1), repo=net_repo)
Benjamin Poirier 39e1be
        tests.support.format_patch(self.repo.get(n2), repo=net_repo)
Benjamin Poirier 39e1be
        tests.support.format_patch(self.repo.get(oot0))
Michal Suchanek 6a7dd9
        tests.support.format_patch(self.repo.get(oot1), mainline="Submitted http://lore.kernel.org/somelist/somemessage")
Benjamin Poirier 535548
        os.chdir(self.ks_dir)
Benjamin Poirier 535548
Benjamin Poirier 960235
Benjamin Poirier 960235
    def tearDown(self):
Benjamin Poirier 960235
        shutil.rmtree(os.environ["XDG_CACHE_HOME"])
Benjamin Poirier 960235
        shutil.rmtree(os.environ["LINUX_GIT"])
Benjamin Poirier 960235
        shutil.rmtree(self.ks_dir)
Benjamin Poirier 960235
Benjamin Poirier 960235
Benjamin Poirier 4f8279
    def test_nofile(self):
Benjamin Poirier 4f8279
        try:
Benjamin Poirier 535548
            subprocess.check_output([self.ss_path, "aaa"],
Benjamin Poirier 535548
                                    stderr=subprocess.STDOUT)
Benjamin Poirier 4f8279
        except subprocess.CalledProcessError as err:
Benjamin Poirier 4f8279
            self.assertEqual(err.returncode, 1)
Benjamin Poirier 4f8279
            self.assertEqual(
Benjamin Poirier 4f8279
                err.output.decode(),
Benjamin Poirier 4f8279
                "Error: [Errno 2] No such file or directory: 'aaa'\n")
Benjamin Poirier 4f8279
        else:
Benjamin Poirier 4f8279
            self.assertTrue(False)
Benjamin Poirier 4f8279
Benjamin Poirier 4f8279
Benjamin Poirier 960235
    def test_absent(self):
Benjamin Poirier 960235
        (tmp, series,) = tempfile.mkstemp(dir=self.ks_dir)
Benjamin Poirier 600ead
        with open(series, mode="w") as f:
Benjamin Poirier 600ead
            f.write(
Benjamin Poirier 960235
"""
Benjamin Poirier 960235
	patches.suse/unsorted-before.patch
Benjamin Poirier 960235
""")
Benjamin Poirier 960235
Benjamin Poirier 960235
        try:
Benjamin Poirier 535548
            subprocess.check_output([self.ss_path, series],
Benjamin Poirier 535548
                                    stderr=subprocess.STDOUT)
Benjamin Poirier 960235
        except subprocess.CalledProcessError as err:
Benjamin Poirier 600ead
            self.assertEqual(err.output.decode(), "Error: Sorted subseries not found.\n")
Benjamin Poirier 3e2b4f
        else:
Benjamin Poirier 3e2b4f
            self.assertTrue(False)
Benjamin Poirier 3e2b4f
Benjamin Poirier 3e2b4f
        os.unlink(series)
Benjamin Poirier 3e2b4f
Benjamin Poirier 3e2b4f
Benjamin Poirier 3e2b4f
    def test_sort_small(self):
Benjamin Poirier 3e2b4f
        (tmp, series,) = tempfile.mkstemp(dir=self.ks_dir)
Benjamin Poirier 600ead
        with open(series, mode="w") as f:
Benjamin Poirier 535548
            f.write(tests.support.format_series((
Benjamin Poirier 535548
                (None, (
Benjamin Poirier 535548
                    "patches.suse/mainline-0.patch",
Benjamin Poirier 535548
                    "patches.suse/net-0.patch",
Benjamin Poirier 535548
                )),
Benjamin Poirier 535548
            )))
Benjamin Poirier 535548
Benjamin Poirier 535548
        subprocess.check_call([self.ss_path, "-c", series])
Benjamin Poirier 600ead
        with open(series) as f:
Benjamin Poirier 600ead
            content1 = f.read()
Benjamin Poirier 535548
        subprocess.check_call([self.ss_path, series])
Benjamin Poirier 600ead
        with open(series) as f:
Benjamin Poirier 600ead
            content2 = f.read()
Benjamin Poirier 600ead
        self.assertEqual(content2, content1)
Benjamin Poirier 960235
Benjamin Poirier 960235
        os.unlink(series)
Benjamin Poirier 960235
Benjamin Poirier 960235
Benjamin Poirier 960235
    def test_sort(self):
Benjamin Poirier 960235
        (tmp, series,) = tempfile.mkstemp(dir=self.ks_dir)
Benjamin Poirier 600ead
        with open(series, mode="w") as f:
Benjamin Poirier 600ead
            f.write(
Benjamin Poirier 6a71e7
"""
Benjamin Poirier 6a71e7
	patches.suse/unsorted-before.patch
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
	########################################################
Benjamin Poirier 6a71e7
	# sorted patches
Benjamin Poirier 6a71e7
	########################################################
Benjamin Poirier 39e1be
	patches.suse/mainline-0.patch
Benjamin Poirier 39e1be
	patches.suse/net-0.patch
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
	# davem/net
Benjamin Poirier 39e1be
	patches.suse/net-1.patch
Benjamin Poirier 39e1be
	patches.suse/net-2.patch
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
	# out-of-tree patches
Benjamin Poirier 39e1be
	patches.suse/oot-0.patch
Benjamin Poirier 39e1be
	patches.suse/oot-1.patch
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
	########################################################
Benjamin Poirier 6a71e7
	# end of sorted patches
Michal Suchanek 06a0c3
	########################################################
Michal Suchanek 06a0c3
Michal Suchanek 06a0c3
	patches.suse/unsorted-after.patch
Michal Suchanek 06a0c3
""")
Michal Suchanek 06a0c3
Michal Suchanek 06a0c3
        subprocess.check_call([self.ss_path, "-c", series])
Michal Suchanek 06a0c3
        with open(series) as f:
Michal Suchanek 06a0c3
            content1 = f.read()
Michal Suchanek 06a0c3
        subprocess.check_call([self.ss_path, series])
Michal Suchanek 06a0c3
        with open(series) as f:
Michal Suchanek 06a0c3
            content2 = f.read()
Michal Suchanek 06a0c3
        self.assertEqual(content2, content1)
Michal Suchanek 06a0c3
Michal Suchanek 06a0c3
        os.unlink(series)
Michal Suchanek 06a0c3
Michal Suchanek 06a0c3
Michal Suchanek 06a0c3
    def test_sort_empty(self):
Michal Suchanek 06a0c3
        (tmp, series,) = tempfile.mkstemp(dir=self.ks_dir)
Michal Suchanek 06a0c3
        with open(series, mode="w") as f:
Michal Suchanek 06a0c3
            f.write(
Michal Suchanek 06a0c3
"""
Michal Suchanek 06a0c3
	patches.suse/unsorted-before.patch
Michal Suchanek 06a0c3
Michal Suchanek 06a0c3
	########################################################
Michal Suchanek 06a0c3
	# sorted patches
Michal Suchanek 06a0c3
	########################################################
Michal Suchanek 06a0c3
Michal Suchanek 06a0c3
	########################################################
Michal Suchanek 06a0c3
	# end of sorted patches
Benjamin Poirier 6a71e7
	########################################################
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
	patches.suse/unsorted-after.patch
Benjamin Poirier 6a71e7
""")
Benjamin Poirier 6a71e7
Benjamin Poirier 535548
        subprocess.check_call([self.ss_path, "-c", series])
Benjamin Poirier 600ead
        with open(series) as f:
Benjamin Poirier 600ead
            content1 = f.read()
Benjamin Poirier 535548
        subprocess.check_call([self.ss_path, series])
Benjamin Poirier 600ead
        with open(series) as f:
Benjamin Poirier 600ead
            content2 = f.read()
Benjamin Poirier 600ead
        self.assertEqual(content2, content1)
Benjamin Poirier 960235
Benjamin Poirier 960235
        os.unlink(series)
Benjamin Poirier 6a71e7
Benjamin Poirier 6a71e7
Benjamin Poirier 535548
class TestFromPatch(unittest.TestCase):
Benjamin Poirier 535548
    """
Benjamin Poirier 535548
    The naming of these tests stems from the following factors which determine
Benjamin Poirier 535548
    how a patch is sorted:
Benjamin Poirier 535548
        * commit found in index
Benjamin Poirier 535548
        * patch's series.conf current_head is indexed (ie. the local repo
Benjamin Poirier 535548
          fetches from that remote)
Benjamin Poirier 535548
        * patch appears to have moved downstream/didn't move/upstream
Benjamin Poirier 535548
        * patch's tag is good ("Git-repo:" == current_head.url)
Benjamin Poirier cb21f8
        * patches may be moved upstream between subsystem sections
Benjamin Poirier 535548
    """
Benjamin Poirier 535548
Benjamin Poirier 535548
    def setUp(self):
Benjamin Poirier 535548
        self.maxDiff = None
Benjamin Poirier 535548
        self.ss_path = os.path.join(lib.libdir(), "series_sort.py")
Benjamin Poirier 535548
Benjamin Poirier 535548
        os.environ["XDG_CACHE_HOME"] = tempfile.mkdtemp(prefix="gs_cache")
Benjamin Poirier 535548
Benjamin Poirier 535548
        # setup stub linux repository
Benjamin Poirier 535548
        os.environ["LINUX_GIT"] = tempfile.mkdtemp(prefix="gs_repo")
Benjamin Poirier 535548
        self.repo = pygit2.init_repository(os.environ["LINUX_GIT"])
Benjamin Poirier 535548
Benjamin Poirier 535548
        author = pygit2.Signature("Alice Author", "alice@authors.tld", time=0,
Benjamin Poirier 535548
                                  offset=0)
Benjamin Poirier 535548
        committer = pygit2.Signature("Cecil Committer", "cecil@committers.tld",
Benjamin Poirier 535548
                                    time=0, offset=0)
Benjamin Poirier 535548
        tree = self.repo.TreeBuilder()
Benjamin Poirier 535548
Benjamin Poirier 535548
        k_org_canon_prefix = "git://git.kernel.org/pub/scm/linux/kernel/git/"
Benjamin Poirier 535548
        self.mainline_repo = k_org_canon_prefix + "torvalds/linux.git"
Benjamin Poirier 535548
        self.repo.remotes.create("origin", self.mainline_repo)
Benjamin Poirier 535548
        self.net_next_repo = k_org_canon_prefix + "davem/net-next.git"
Benjamin Poirier 535548
        self.repo.remotes.create("net-next", self.net_next_repo)
Benjamin Poirier 535548
        self.net_repo = k_org_canon_prefix + "davem/net.git"
Benjamin Poirier 535548
        self.rdma_repo = k_org_canon_prefix + "rdma/rdma.git"
Benjamin Poirier 535548
        self.repo.remotes.create("rdma", self.rdma_repo)
Benjamin Poirier 535548
        self.dledford_repo = k_org_canon_prefix + "dledford/rdma.git"
Benjamin Poirier 535548
        self.repo.remotes.create("dledford/rdma", self.dledford_repo)
Michal Suchanek de2dc4
        self.nf_repo = k_org_canon_prefix + "netfilter/nf.git"
Michal Suchanek de2dc4
        self.repo.remotes.create("netfilter/nf", self.nf_repo)
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.commits = {}
Benjamin Poirier 535548
        self.commits["mainline 0"] = self.repo.create_commit(
Benjamin Poirier 535548
            "refs/heads/mainline",
Benjamin Poirier 535548
            author,
Benjamin Poirier 535548
            committer,
Benjamin Poirier 535548
            "mainline 0\n\nlog",
Benjamin Poirier 535548
            tree.write(),
Benjamin Poirier 535548
            []
Benjamin Poirier 535548
        )
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.commits["net-next 0"] = self.repo.create_commit(
Benjamin Poirier 535548
            "refs/heads/net-next",
Benjamin Poirier 535548
            author,
Benjamin Poirier 535548
            committer,
Benjamin Poirier 535548
            "net-next 0\n\nlog",
Benjamin Poirier 535548
            tree.write(),
Benjamin Poirier 535548
            [self.commits["mainline 0"]]
Benjamin Poirier 535548
        )
Benjamin Poirier 535548
        self.repo.references.create("refs/remotes/net-next/master",
Benjamin Poirier 535548
                                    self.commits["net-next 0"])
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.commits["other 0"] = self.repo.create_commit(
Benjamin Poirier 535548
            "refs/heads/other",
Benjamin Poirier 535548
            author,
Benjamin Poirier 535548
            committer,
Benjamin Poirier 535548
            "other 0\n\nlog",
Benjamin Poirier 535548
            tree.write(),
Benjamin Poirier 535548
            [self.commits["mainline 0"]]
Benjamin Poirier 535548
        )
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.commits["rdma for-next 0"] = self.repo.create_commit(
Benjamin Poirier 535548
            "refs/heads/rdma-next",
Benjamin Poirier 535548
            author,
Benjamin Poirier 535548
            committer,
Benjamin Poirier 535548
            "rdma for-next 0\n\nlog",
Benjamin Poirier 535548
            tree.write(),
Benjamin Poirier 535548
            [self.commits["mainline 0"]]
Benjamin Poirier 535548
        )
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.commits["mainline 1"] = self.repo.create_commit(
Benjamin Poirier 535548
            "refs/heads/mainline",
Benjamin Poirier 535548
            author,
Benjamin Poirier 535548
            committer,
Benjamin Poirier 535548
            "mainline 1, merge rdma\n\nlog",
Benjamin Poirier 535548
            tree.write(),
Benjamin Poirier 535548
            [self.commits["mainline 0"], self.commits["rdma for-next 0"]]
Benjamin Poirier 535548
        )
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.commits["dledford/rdma k.o/for-next 0"] = self.repo.create_commit(
Benjamin Poirier 535548
            "refs/heads/dledford-next",
Benjamin Poirier 535548
            author,
Benjamin Poirier 535548
            committer,
Benjamin Poirier 535548
            "dledford/rdma k.o/for-next 0\n\nlog",
Benjamin Poirier 535548
            tree.write(),
Benjamin Poirier 535548
            [self.commits["rdma for-next 0"]]
Benjamin Poirier 535548
        )
Benjamin Poirier 535548
        self.repo.references.create(
Benjamin Poirier 535548
            "refs/remotes/dledford/rdma/k.o/for-next",
Benjamin Poirier 535548
            self.commits["dledford/rdma k.o/for-next 0"])
Benjamin Poirier 535548
        self.repo.references.create("refs/remotes/rdma/for-next",
Benjamin Poirier 535548
                                    self.commits["dledford/rdma k.o/for-next 0"])
Benjamin Poirier 535548
        self.repo.references.create("refs/remotes/rdma/for-rc",
Benjamin Poirier 535548
                                    self.commits["dledford/rdma k.o/for-next 0"])
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.commits["net 0"] = self.repo.create_commit(
Benjamin Poirier 535548
            "refs/heads/net",
Benjamin Poirier 535548
            author,
Benjamin Poirier 535548
            committer,
Benjamin Poirier 535548
            "net 0\n\nlog",
Benjamin Poirier 535548
            tree.write(),
Benjamin Poirier 535548
            [self.commits["mainline 0"]]
Benjamin Poirier 535548
        )
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.commits["nf 0"] = self.repo.create_commit(
Benjamin Poirier 535548
            "refs/heads/nf",
Benjamin Poirier 535548
            author,
Benjamin Poirier 535548
            committer,
Benjamin Poirier 535548
            "nf 0\n\nlog",
Benjamin Poirier 535548
            tree.write(),
Benjamin Poirier 535548
            [self.commits["mainline 0"]]
Benjamin Poirier 535548
        )
Michal Suchanek de2dc4
        self.repo.references.create("refs/remotes/netfilter/nf/master",
Benjamin Poirier 535548
                                    self.commits["nf 0"])
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.commits["mainline 2"] = self.repo.create_commit(
Benjamin Poirier 535548
            "refs/heads/mainline",
Benjamin Poirier 535548
            author,
Benjamin Poirier 535548
            committer,
Benjamin Poirier 535548
            "mainline 2, merge net\n\nlog",
Benjamin Poirier 535548
            tree.write(),
Benjamin Poirier 535548
            [self.commits["mainline 1"], self.commits["net 0"]]
Benjamin Poirier 535548
        )
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.commits["net 1"] = self.repo.create_commit(
Benjamin Poirier 535548
            "refs/heads/net",
Benjamin Poirier 535548
            author,
Benjamin Poirier 535548
            committer,
Benjamin Poirier 535548
            "net 1\n\nlog",
Benjamin Poirier 535548
            tree.write(),
Benjamin Poirier 535548
            [self.commits["net 0"]]
Benjamin Poirier 535548
        )
Benjamin Poirier 535548
Benjamin Poirier 535548
        tree.insert("README", 
Benjamin Poirier 535548
                    self.repo.create_blob("NAME = v4.1 release\n"),
Benjamin Poirier 535548
                    pygit2.GIT_FILEMODE_BLOB)
Benjamin Poirier 535548
        self.commits["v4.1"] = self.repo.create_commit(
Benjamin Poirier 535548
            "refs/heads/mainline",
Benjamin Poirier 535548
            author,
Benjamin Poirier 535548
            committer,
Benjamin Poirier 535548
            "Linux 4.1",
Benjamin Poirier 535548
            tree.write(),
Benjamin Poirier 535548
            [self.commits["mainline 2"]]
Benjamin Poirier 535548
        )
Benjamin Poirier 535548
        self.repo.references.create("refs/remotes/origin/master",
Benjamin Poirier 535548
                                    self.commits["v4.1"])
Benjamin Poirier 535548
        self.repo.create_tag("v4.1", self.commits["v4.1"], pygit2.GIT_REF_OID,
Benjamin Poirier 535548
                             committer, "Linux 4.1")
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.repo.checkout("refs/heads/mainline")
Benjamin Poirier 535548
Benjamin Poirier 535548
        # setup stub kernel-source content
Benjamin Poirier 535548
        self.ks_dir = tempfile.mkdtemp(prefix="gs_ks")
Benjamin Poirier 535548
        os.chdir(self.ks_dir)
Benjamin Poirier 535548
        self.patch_dir = "patches.suse"
Benjamin Poirier 535548
        os.mkdir(self.patch_dir)
Benjamin Poirier 535548
Benjamin Poirier 535548
Benjamin Poirier 535548
    def tearDown(self):
Benjamin Poirier 535548
        shutil.rmtree(os.environ["XDG_CACHE_HOME"])
Benjamin Poirier 535548
        shutil.rmtree(os.environ["LINUX_GIT"])
Benjamin Poirier 535548
        shutil.rmtree(self.ks_dir)
Benjamin Poirier 535548
Benjamin Poirier 535548
Benjamin Poirier 535548
    def check_tag(self, patch, tag, value):
Benjamin Poirier 535548
        with open(patch) as f:
Benjamin Poirier 535548
            for line in f:
Benjamin Poirier 535548
                if line.startswith(tag):
Benjamin Poirier 535548
                    self.assertEqual(line[len(tag):-1], value)
Benjamin Poirier 535548
Benjamin Poirier 535548
Benjamin Poirier cb21f8
    def _transform_arg(move_upstream):
Benjamin Poirier cb21f8
        if move_upstream is None:
Benjamin Poirier cb21f8
            return [[], ["-u"]]
Benjamin Poirier cb21f8
        elif move_upstream:
Benjamin Poirier cb21f8
            return [["-u"]]
Benjamin Poirier 535548
        else:
Benjamin Poirier cb21f8
            return [[]]
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
    def check_failure(self, msg, move_upstream=None):
Benjamin Poirier cb21f8
        for extra_arg in self.__class__._transform_arg(move_upstream):
Benjamin Poirier cb21f8
            try:
Benjamin Poirier cb21f8
                subprocess.check_output(
Benjamin Poirier cb21f8
                    [self.ss_path] + extra_arg + ["-c", "series.conf"],
Benjamin Poirier cb21f8
                    stderr=subprocess.STDOUT)
Benjamin Poirier cb21f8
            except subprocess.CalledProcessError as err:
Benjamin Poirier cb21f8
                self.assertEqual(err.returncode, 1)
Benjamin Poirier cb21f8
                self.assertTrue(err.output.decode(), msg)
Benjamin Poirier cb21f8
            else:
Benjamin Poirier cb21f8
                self.assertTrue(False)
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
            try:
Benjamin Poirier cb21f8
                subprocess.check_output(
Benjamin Poirier cb21f8
                    [self.ss_path] + extra_arg + ["series.conf"],
Benjamin Poirier cb21f8
                    stderr=subprocess.STDOUT)
Benjamin Poirier cb21f8
            except subprocess.CalledProcessError as err:
Benjamin Poirier cb21f8
                self.assertEqual(err.returncode, 1)
Benjamin Poirier cb21f8
                self.assertEqual(err.output.decode(), msg)
Benjamin Poirier cb21f8
            else:
Benjamin Poirier cb21f8
                self.assertTrue(False)
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
    def check_constant(self, name, move_upstream=None):
Benjamin Poirier cb21f8
        for extra_arg in self.__class__._transform_arg(move_upstream):
Benjamin Poirier cb21f8
            subprocess.check_call(
Benjamin Poirier cb21f8
                [self.ss_path] + extra_arg + ["-c", "series.conf"])
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
            with open("series.conf") as f:
Benjamin Poirier cb21f8
                series1 = f.read()
Benjamin Poirier cb21f8
            with open(name) as f:
Benjamin Poirier cb21f8
                patch1 = f.read()
Benjamin Poirier cb21f8
            subprocess.check_call([self.ss_path] + extra_arg + ["series.conf"])
Benjamin Poirier cb21f8
            with open("series.conf") as f:
Benjamin Poirier cb21f8
                series2 = f.read()
Benjamin Poirier cb21f8
            with open(name) as f:
Benjamin Poirier cb21f8
                patch2 = f.read()
Benjamin Poirier cb21f8
            self.assertEqual(series2, series1)
Benjamin Poirier cb21f8
            self.assertEqual(patch2, patch1)
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
    def check_outdated(self, name, msg, series2, move_upstream=None):
Benjamin Poirier cb21f8
        (tmp, series,) = tempfile.mkstemp(dir=self.ks_dir)
Benjamin Poirier cb21f8
        (tmp, patch,) = tempfile.mkstemp(dir=self.ks_dir)
Benjamin Poirier cb21f8
        shutil.copy(name, patch)
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
        for extra_arg in self.__class__._transform_arg(move_upstream):
Benjamin Poirier cb21f8
            shutil.copy(patch, name)
Benjamin Poirier cb21f8
            try:
Benjamin Poirier cb21f8
                subprocess.check_output(
Benjamin Poirier cb21f8
                    [self.ss_path] + extra_arg + ["-c", "series.conf"],
Benjamin Poirier cb21f8
                    stderr=subprocess.STDOUT)
Benjamin Poirier cb21f8
            except subprocess.CalledProcessError as err:
Benjamin Poirier cb21f8
                self.assertEqual(err.returncode, 2)
Benjamin Poirier cb21f8
                self.assertEqual(err.output.decode(), msg)
Benjamin Poirier cb21f8
            else:
Benjamin Poirier cb21f8
                self.assertTrue(False)
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
            shutil.copy("series.conf", series)
Benjamin Poirier cb21f8
            subprocess.check_call([self.ss_path] + extra_arg + [series])
Benjamin Poirier cb21f8
            with open(series) as f:
Benjamin Poirier cb21f8
                content2 = f.read()
Benjamin Poirier cb21f8
            self.assertEqual(content2, series2)
Benjamin Poirier 535548
Benjamin Poirier cb21f8
        os.unlink(series)
Benjamin Poirier cb21f8
        os.unlink(patch)
Benjamin Poirier 535548
Benjamin Poirier 535548
Benjamin Poirier 535548
    def test_found_indexed_downstream_good(self):
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        patch sorted in mainline, commit found in net-next
Benjamin Poirier 535548
            error, possible causes:
Benjamin Poirier 535548
                mainline repo is outdated
Benjamin Poirier 535548
                    because it was not found in mainline index/appears to have
Benjamin Poirier 535548
                    moved downstream
Benjamin Poirier 535548
                order in remotes is wrong
Benjamin Poirier 535548
                    because it appears to have moved downstream
Benjamin Poirier 535548
                section and Git-repo are wrong
Benjamin Poirier 535548
                    because it appears to have moved downstream and tag is good
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
Benjamin Poirier 535548
        name = tests.support.format_patch(
Benjamin Poirier 535548
            self.repo.get(self.commits["net-next 0"]), mainline="v0",
Benjamin Poirier 535548
            directory=self.patch_dir)
Benjamin Poirier 535548
Benjamin Poirier 535548
        with open("series.conf", mode="w") as f:
Benjamin Poirier 535548
            f.write(tests.support.format_series((
Benjamin Poirier 535548
                (None, (
Benjamin Poirier 535548
                    name,
Benjamin Poirier 535548
                )),
Benjamin Poirier 535548
            )))
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.check_failure(
Benjamin Poirier 535548
"Error: There is a problem with patch \"%s\". The patch is in the wrong section of series.conf or the remote fetching from \"torvalds/linux\" needs to be fetched or the relative order of \"davem/net-next\" and \"torvalds/linux\" in \"remotes\" is incorrect. Manual intervention is required.\n" % (name,))
Benjamin Poirier 535548
Benjamin Poirier 535548
Benjamin Poirier 535548
    def test_found_indexed_downstream_bad(self):
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        patch sorted in mainline, commit found in net-next
Benjamin Poirier 535548
            error, possible causes:
Benjamin Poirier 535548
                mainline repo is outdated
Benjamin Poirier 535548
                    because it was not found in mainline index/appears to have
Benjamin Poirier 535548
                    moved downstream
Benjamin Poirier 535548
                section is wrong or Git-repo is wrong
Benjamin Poirier 535548
                    because it appears to have moved downstream and the two
Benjamin Poirier 535548
                    differ
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        name = tests.support.format_patch(
Benjamin Poirier 535548
            self.repo.get(self.commits["net-next 0"]), repo=self.net_next_repo,
Benjamin Poirier 535548
            directory=self.patch_dir)
Benjamin Poirier 535548
Benjamin Poirier 535548
        with open("series.conf", mode="w") as f:
Benjamin Poirier 535548
            f.write(tests.support.format_series((
Benjamin Poirier 535548
                (None, (
Benjamin Poirier 535548
                    name,
Benjamin Poirier 535548
                )),
Benjamin Poirier 535548
            )))
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.check_failure(
Benjamin Poirier 535548
"Error: There is a problem with patch \"%s\". The patch is in the wrong section of series.conf or the remote fetching from \"torvalds/linux\" needs to be fetched. Manual intervention is required.\n" % (name,))
Benjamin Poirier 535548
Benjamin Poirier 535548
Benjamin Poirier 535548
    def test_found_indexed_nomove_good(self):
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        patch sorted in net-next
Benjamin Poirier 535548
            stays there
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        name = tests.support.format_patch(
Benjamin Poirier 535548
            self.repo.get(self.commits["net-next 0"]), repo=self.net_next_repo,
Benjamin Poirier 535548
            directory=self.patch_dir)
Benjamin Poirier 535548
Benjamin Poirier 535548
        with open("series.conf", mode="w") as f:
Benjamin Poirier 535548
            f.write(tests.support.format_series((
Benjamin Poirier 535548
                ("davem/net-next", (
Benjamin Poirier 535548
                    name,
Benjamin Poirier 535548
                )),
Benjamin Poirier 535548
            )))
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.check_constant(name)
Benjamin Poirier 535548
Benjamin Poirier 535548
Benjamin Poirier 535548
    def test_found_indexed_nomove_bad(self):
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        patch sorted in net-next, tagged with mainline
Benjamin Poirier 535548
            stays there
Benjamin Poirier 535548
            update tag
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        name = tests.support.format_patch(
Benjamin Poirier 535548
            self.repo.get(self.commits["net-next 0"]), repo=self.net_repo,
Benjamin Poirier 535548
            directory=self.patch_dir)
Benjamin Poirier 535548
Benjamin Poirier 535548
        series1 = tests.support.format_series((
Benjamin Poirier 535548
            ("davem/net-next", (
Benjamin Poirier 535548
                name,
Benjamin Poirier 535548
            )),
Benjamin Poirier 535548
        ))
Benjamin Poirier 535548
        with open("series.conf", mode="w") as f:
Benjamin Poirier 535548
            f.write(series1)
Benjamin Poirier 535548
Benjamin Poirier cb21f8
        self.check_outdated(name, "Git-repo tags are outdated.\n", series1)
Benjamin Poirier 535548
        self.check_tag(name, "Git-repo: ", self.net_next_repo)
Benjamin Poirier 535548
Benjamin Poirier 535548
Benjamin Poirier cb21f8
    def prepare_found_indexed_upstream_good(self):
Benjamin Poirier 535548
        name = tests.support.format_patch(
Benjamin Poirier 535548
            self.repo.get(self.commits["rdma for-next 0"]), repo=self.rdma_repo,
Benjamin Poirier 535548
            directory=self.patch_dir)
Benjamin Poirier 535548
Benjamin Poirier 535548
        with open("series.conf", mode="w") as f:
Benjamin Poirier 535548
            f.write(tests.support.format_series((
Benjamin Poirier 535548
                ("rdma/rdma for-next", (
Benjamin Poirier 535548
                    name,
Benjamin Poirier 535548
                )),
Benjamin Poirier 535548
            )))
Benjamin Poirier 535548
Benjamin Poirier 535548
        series2 = tests.support.format_series((
Benjamin Poirier 535548
            (None, (
Benjamin Poirier 535548
                name,
Benjamin Poirier 535548
            )),
Benjamin Poirier 535548
        ))
Benjamin Poirier 535548
Benjamin Poirier cb21f8
        return name, series2
Benjamin Poirier 535548
Benjamin Poirier 535548
Benjamin Poirier cb21f8
    def test_found_indexed_upstream_good_moveupstream(self):
Benjamin Poirier 535548
        """
Benjamin Poirier cb21f8
        patch sorted in rdma for-next, commit found in mainline
Benjamin Poirier cb21f8
            moves to mainline
Benjamin Poirier cb21f8
            tag is updated
Benjamin Poirier cb21f8
        """
Benjamin Poirier cb21f8
        name, series2 = self.prepare_found_indexed_upstream_good()
Benjamin Poirier 535548
Benjamin Poirier cb21f8
        self.check_outdated(name,
Benjamin Poirier cb21f8
            "Input is not sorted.\nGit-repo tags are outdated.\n", series2,
Benjamin Poirier cb21f8
            True)
Benjamin Poirier cb21f8
        self.check_tag(name, "Git-repo: ", self.mainline_repo)
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
    def test_found_indexed_upstream_good_nomoveupstream(self):
Benjamin Poirier 535548
        """
Benjamin Poirier cb21f8
        patch sorted in rdma for-next, commit found in mainline
Benjamin Poirier cb21f8
            stays there
Benjamin Poirier cb21f8
        """
Benjamin Poirier cb21f8
        name, series2 = self.prepare_found_indexed_upstream_good()
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
        self.check_constant(name, False)
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
    def prepare_found_indexed_upstream_bad2(self):
Benjamin Poirier 535548
        alt_repo = self.rdma_repo.replace("git://", "https://")
Benjamin Poirier 535548
Benjamin Poirier 535548
        name = tests.support.format_patch(
Benjamin Poirier 535548
            self.repo.get(self.commits["dledford/rdma k.o/for-next 0"]),
Benjamin Poirier 535548
            repo=alt_repo, directory=self.patch_dir)
Benjamin Poirier 535548
Benjamin Poirier 535548
        with open("series.conf", mode="w") as f:
Benjamin Poirier 535548
            f.write(tests.support.format_series((
Benjamin Poirier 535548
                ("dledford/rdma k.o/for-next", (
Benjamin Poirier 535548
                    name,
Benjamin Poirier 535548
                )),
Benjamin Poirier 535548
            )))
Benjamin Poirier 535548
Benjamin Poirier 535548
        series2 = tests.support.format_series((
Benjamin Poirier 535548
            ("rdma/rdma for-rc", (
Benjamin Poirier 535548
                name,
Benjamin Poirier 535548
            )),
Benjamin Poirier 535548
        ))
Benjamin Poirier 535548
Benjamin Poirier cb21f8
        return name, series2, alt_repo
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
    def test_found_indexed_upstream_bad2_moveupstream(self):
Benjamin Poirier cb21f8
        """
Benjamin Poirier cb21f8
        patch sorted in dledford/rdma k.o/for-next, tagged with rdma/rdma,
Benjamin Poirier cb21f8
        commit found in rdma/rdma for-rc
Benjamin Poirier cb21f8
            moves to rdma/rdma for-rc
Benjamin Poirier cb21f8
            tag is NOT updated
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
        This is a special case. See the log of commit 0ac6457e94e8
Benjamin Poirier cb21f8
        ("scripts/git_sort/lib.py: Rewrite Git-repo only if it differs.")
Benjamin Poirier cb21f8
        """
Benjamin Poirier cb21f8
        name, series2, alt_repo = self.prepare_found_indexed_upstream_bad2()
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
        self.check_outdated(name, "Input is not sorted.\n", series2, True)
Benjamin Poirier 535548
        self.check_tag(name, "Git-repo: ", alt_repo)
Benjamin Poirier 535548
Benjamin Poirier 535548
Benjamin Poirier cb21f8
    def test_found_indexed_upstream_bad2_nomoveupstream(self):
Benjamin Poirier cb21f8
        """
Benjamin Poirier cb21f8
        patch sorted in dledford/rdma k.o/for-next, tagged with rdma/rdma,
Benjamin Poirier cb21f8
        commit found in rdma/rdma for-rc
Benjamin Poirier cb21f8
            error, possible causes:
Benjamin Poirier cb21f8
                section is wrong or Git-repo is wrong
Benjamin Poirier cb21f8
                    because they differ and there is no way to know which head
Benjamin Poirier cb21f8
                    the user intended.
Benjamin Poirier cb21f8
        """
Benjamin Poirier cb21f8
        name, series2, alt_repo = self.prepare_found_indexed_upstream_bad2()
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
        self.check_failure(
Benjamin Poirier cb21f8
"Error: There is a problem with patch \"%s\". The Git-repo tag is incorrect or the patch is in the wrong section of series.conf. Manual intervention is required.\n" % (name,), False)
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
Benjamin Poirier 535548
    def test_found_notindexed_downstream_good(self):
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        patch sorted in net (not fetched), commit found in net-next
Benjamin Poirier 535548
            stays there
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        name = tests.support.format_patch(
Benjamin Poirier 535548
            self.repo.get(self.commits["net-next 0"]), repo=self.net_repo,
Benjamin Poirier 535548
            directory=self.patch_dir)
Benjamin Poirier 535548
Benjamin Poirier 535548
        with open("series.conf", mode="w") as f:
Benjamin Poirier 535548
            f.write(tests.support.format_series((
Benjamin Poirier 535548
                ("davem/net", (
Benjamin Poirier 535548
                    name,
Benjamin Poirier 535548
                )),
Benjamin Poirier 535548
            )))
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.check_constant(name)
Benjamin Poirier 535548
Benjamin Poirier 535548
Benjamin Poirier 535548
    def test_found_notindexed_downstream_bad(self):
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        patch sorted in net (not fetched), commit found in net-next,
Benjamin Poirier 535548
        git-repo tag is bad
Benjamin Poirier 535548
            error, possible causes:
Benjamin Poirier 535548
                section is wrong or Git-repo is wrong
Benjamin Poirier 535548
                    because they differ and there is no (usual) scenario where
Benjamin Poirier 535548
                    commits move downstream
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        name = tests.support.format_patch(
Benjamin Poirier 535548
            self.repo.get(self.commits["net-next 0"]), repo=self.rdma_repo,
Benjamin Poirier 535548
            directory=self.patch_dir)
Benjamin Poirier 535548
Benjamin Poirier 535548
        with open("series.conf", mode="w") as f:
Benjamin Poirier 535548
            f.write(tests.support.format_series((
Benjamin Poirier 535548
                ("davem/net", (
Benjamin Poirier 535548
                    name,
Benjamin Poirier 535548
                )),
Benjamin Poirier 535548
            )))
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.check_failure(
Benjamin Poirier 535548
"Error: There is a problem with patch \"%s\". The Git-repo tag is incorrect or the patch is in the wrong section of series.conf. Manual intervention is required.\n" % (name,))
Benjamin Poirier 535548
Benjamin Poirier 535548
Benjamin Poirier 535548
    # test_found_notindexed_nomove_NA()
Benjamin Poirier 535548
    # cannot be tested (without stubbing some code to return invalid data)
Benjamin Poirier 535548
Benjamin Poirier 535548
Benjamin Poirier cb21f8
    def prepare_found_notindexed_upstream_good(self):
Benjamin Poirier 535548
        name = tests.support.format_patch(
Benjamin Poirier 535548
            self.repo.get(self.commits["net 0"]), repo=self.net_repo,
Benjamin Poirier 535548
            directory=self.patch_dir)
Benjamin Poirier 535548
Benjamin Poirier 535548
        with open("series.conf", mode="w") as f:
Benjamin Poirier 535548
            f.write(tests.support.format_series((
Benjamin Poirier 535548
                ("davem/net", (
Benjamin Poirier 535548
                    name,
Benjamin Poirier 535548
                )),
Benjamin Poirier 535548
            )))
Benjamin Poirier 535548
Benjamin Poirier 535548
        series2 = tests.support.format_series((
Benjamin Poirier 535548
            (None, (
Benjamin Poirier 535548
                name,
Benjamin Poirier 535548
            )),
Benjamin Poirier 535548
        ))
Benjamin Poirier 535548
Benjamin Poirier cb21f8
        return name, series2
Benjamin Poirier 535548
Benjamin Poirier 535548
Benjamin Poirier a59701
    @staticmethod
Benjamin Poirier a59701
    def filter_out_tags(name):
Benjamin Poirier a59701
        with open(name) as f:
Benjamin Poirier a59701
            result = [line
Benjamin Poirier a59701
                      for line in f
Benjamin Poirier a59701
                      if not line.startswith(("Git-repo", "Patch-mainline",))]
Benjamin Poirier a59701
Benjamin Poirier a59701
        return result
Benjamin Poirier a59701
Benjamin Poirier a59701
Benjamin Poirier cb21f8
    def test_found_notindexed_upstream_good_moveupstream(self):
Benjamin Poirier 535548
        """
Benjamin Poirier cb21f8
        patch sorted in net (not fetched), commit found in mainline
Benjamin Poirier cb21f8
            moves to mainline
Benjamin Poirier cb21f8
            tag is updated
Benjamin Poirier cb21f8
        """
Benjamin Poirier cb21f8
        name, series2 = self.prepare_found_notindexed_upstream_good()
Benjamin Poirier a59701
        before = self.filter_out_tags(name)
Benjamin Poirier 535548
Benjamin Poirier cb21f8
        self.check_outdated(name,
Benjamin Poirier cb21f8
            "Input is not sorted.\nGit-repo tags are outdated.\n", series2,
Benjamin Poirier cb21f8
            True)
Benjamin Poirier cb21f8
        self.check_tag(name, "Git-repo: ", self.mainline_repo)
Benjamin Poirier cb21f8
Benjamin Poirier a59701
        # check that only the expected tags changed
Benjamin Poirier a59701
        after = self.filter_out_tags(name)
Benjamin Poirier a59701
        self.assertEqual(before, after)
Benjamin Poirier a59701
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
    def test_found_notindexed_upstream_good_nomoveupstream(self):
Benjamin Poirier 535548
        """
Benjamin Poirier cb21f8
        patch sorted in net (not fetched), commit found in mainline
Benjamin Poirier cb21f8
            stays there
Benjamin Poirier cb21f8
        """
Benjamin Poirier cb21f8
        name, series2 = self.prepare_found_notindexed_upstream_good()
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
        self.check_constant(name, False)
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
    def prepare_found_notindexed_upstream_bad2(self):
Benjamin Poirier 535548
        alt_repo = self.nf_repo.replace("git://", "https://")
Benjamin Poirier 535548
Benjamin Poirier 535548
        name = tests.support.format_patch(
Benjamin Poirier 535548
            self.repo.get(self.commits["nf 0"]), repo=alt_repo,
Benjamin Poirier 535548
            directory=self.patch_dir)
Benjamin Poirier 535548
Benjamin Poirier 535548
        with open("series.conf", mode="w") as f:
Benjamin Poirier 535548
            f.write(tests.support.format_series((
Michal Suchanek de2dc4
                ("netfilter/nf-next", (
Benjamin Poirier 535548
                    name,
Benjamin Poirier 535548
                )),
Benjamin Poirier 535548
            )))
Benjamin Poirier 535548
Benjamin Poirier 535548
        series2 = tests.support.format_series((
Michal Suchanek de2dc4
            ("netfilter/nf", (
Benjamin Poirier 535548
                name,
Benjamin Poirier 535548
            )),
Benjamin Poirier 535548
        ))
Benjamin Poirier 535548
Benjamin Poirier cb21f8
        return name, series2, alt_repo
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
    def test_found_notindexed_upstream_bad2_moveupstream(self):
Benjamin Poirier cb21f8
        """
Michal Suchanek de2dc4
        patch sorted in netfilter nf-next (not fetched), commit found in netfilter nf,
Benjamin Poirier cb21f8
        git-repo tag is bad
Michal Suchanek de2dc4
            moves to netfilter nf
Benjamin Poirier cb21f8
            tag is NOT updated
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
        This is a special case. See the log of commit 0ac6457e94e8
Benjamin Poirier cb21f8
        ("scripts/git_sort/lib.py: Rewrite Git-repo only if it differs.")
Benjamin Poirier cb21f8
        """
Benjamin Poirier cb21f8
        name, series2, alt_repo = self.prepare_found_notindexed_upstream_bad2()
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
        self.check_outdated(name, "Input is not sorted.\n", series2, True)
Benjamin Poirier 535548
        self.check_tag(name, "Git-repo: ", alt_repo)
Benjamin Poirier 535548
Benjamin Poirier 535548
Benjamin Poirier cb21f8
    def test_found_notindexed_upstream_bad2_nomoveupstream(self):
Benjamin Poirier cb21f8
        """
Michal Suchanek de2dc4
        patch sorted in netfilter nf-next (not fetched), commit found in netfilter nf,
Benjamin Poirier cb21f8
        git-repo tag is bad
Benjamin Poirier cb21f8
            error, possible causes:
Benjamin Poirier cb21f8
                section is wrong or Git-repo is wrong
Benjamin Poirier cb21f8
                    because they differ and there is no way to know which head
Benjamin Poirier cb21f8
                    the user intended.
Benjamin Poirier cb21f8
        """
Benjamin Poirier cb21f8
        name, series2, alt_repo = self.prepare_found_notindexed_upstream_bad2()
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
        self.check_failure(
Benjamin Poirier cb21f8
"Error: There is a problem with patch \"%s\". The Git-repo tag is incorrect or the patch is in the wrong section of series.conf. Manual intervention is required.\n" % (name,), False)
Benjamin Poirier cb21f8
Benjamin Poirier cb21f8
Benjamin Poirier 535548
    def test_notfound_indexed_NA_good(self):
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        patch sorted in net-next
Benjamin Poirier 535548
            error, possible causes:
Benjamin Poirier 535548
                net-next repo is outdated
Benjamin Poirier 535548
                Git-commit is wrong
Benjamin Poirier 535548
                section and Git-repo are wrong
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        commit = self.repo.get(self.commits["other 0"])
Benjamin Poirier 535548
        name = tests.support.format_patch(commit, repo=self.net_next_repo,
Benjamin Poirier 535548
                                          directory=self.patch_dir)
Benjamin Poirier 535548
Benjamin Poirier 535548
        with open("series.conf", mode="w") as f:
Benjamin Poirier 535548
            f.write(tests.support.format_series((
Benjamin Poirier 535548
                ("davem/net-next", (
Benjamin Poirier 535548
                    name,
Benjamin Poirier 535548
                )),
Benjamin Poirier 535548
            )))
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.check_failure(
Benjamin Poirier 535548
"Error: There is a problem with patch \"%s\". Commit \"%s\" not found in git-sort index. The remote fetching from \"davem/net-next\" needs to be fetched or the Git-commit tag is incorrect or the patch is in the wrong section of series.conf. Manual intervention is required.\n" % (name, str(commit.id),))
Benjamin Poirier 535548
Benjamin Poirier 535548
Benjamin Poirier 535548
    def test_notfound_indexed_NA_bad(self):
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        patch sorted in net-next, git-repo tag is bad
Benjamin Poirier 535548
            error, possible causes:
Benjamin Poirier 535548
                section or Git-repo are wrong
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        name = tests.support.format_patch(
Benjamin Poirier 535548
            self.repo.get(self.commits["other 0"]), repo=self.rdma_repo,
Benjamin Poirier 535548
            directory=self.patch_dir)
Benjamin Poirier 535548
Benjamin Poirier 535548
        with open("series.conf", mode="w") as f:
Benjamin Poirier 535548
            f.write(tests.support.format_series((
Benjamin Poirier 535548
                ("davem/net-next", (
Benjamin Poirier 535548
                    name,
Benjamin Poirier 535548
                )),
Benjamin Poirier 535548
            )))
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.check_failure(
Benjamin Poirier 535548
"Error: There is a problem with patch \"%s\". The Git-repo tag is incorrect or the patch is in the wrong section of series.conf. Manual intervention is required.\n" % (name,))
Benjamin Poirier 535548
Benjamin Poirier 535548
Benjamin Poirier 535548
    def test_notfound_notindexed_NA_good(self):
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        patch sorted in net
Benjamin Poirier 535548
            stays there
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        name = tests.support.format_patch(
Benjamin Poirier 535548
            self.repo.get(self.commits["net 1"]), repo=self.net_repo,
Benjamin Poirier 535548
            directory=self.patch_dir)
Benjamin Poirier 535548
Benjamin Poirier 535548
        with open("series.conf", mode="w") as f:
Benjamin Poirier 535548
            f.write(tests.support.format_series((
Benjamin Poirier 535548
                ("davem/net", (
Benjamin Poirier 535548
                    name,
Benjamin Poirier 535548
                )),
Benjamin Poirier 535548
            )))
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.check_constant(name)
Benjamin Poirier 535548
Benjamin Poirier 535548
Benjamin Poirier 535548
    def test_notfound_notindexed_NA_bad(self):
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        patch sorted in net, bad git-repo tag
Benjamin Poirier 535548
            error, possible causes:
Benjamin Poirier 535548
                Git-repo is wrong
Benjamin Poirier 535548
                series.conf section is wrong and (git-commit is wrong or the
Benjamin Poirier 535548
                remote is outdated or not available locally
Benjamin Poirier 535548
                Git-repo is not indexed because it's missing in git_sort.py's
Benjamin Poirier 535548
                remote list
Benjamin Poirier 535548
        """
Benjamin Poirier 535548
        name = tests.support.format_patch(
Benjamin Poirier 535548
            self.repo.get(self.commits["net 1"]), repo=self.rdma_repo,
Benjamin Poirier 535548
            directory=self.patch_dir)
Benjamin Poirier 535548
Benjamin Poirier 535548
        with open("series.conf", mode="w") as f:
Benjamin Poirier 535548
            f.write(tests.support.format_series((
Benjamin Poirier 535548
                ("davem/net", (
Benjamin Poirier 535548
                    name,
Benjamin Poirier 535548
                )),
Benjamin Poirier 535548
            )))
Benjamin Poirier 535548
Benjamin Poirier 535548
        self.check_failure(
Benjamin Poirier 535548
"Error: There is a problem with patch \"%s\". The Git-repo tag is incorrect or the patch is in the wrong section of series.conf and (the Git-commit tag is incorrect or the relevant remote is outdated or not available locally) or an entry for this repository is missing from \"remotes\". In the last case, please edit \"remotes\" in \"scripts/git_sort/git_sort.py\" and commit the result. Manual intervention is required.\n" % (name,))
Benjamin Poirier 535548
Benjamin Poirier 535548
Michal Suchanek 24354f
    def test_malformed(self):
Michal Suchanek 24354f
        """
Michal Suchanek 24354f
        Generate a series and destroy the Git-commit tag on one of the patches
Michal Suchanek 24354f
        This should report a specific error so that this situation is not conflated with wrong Patch-mainline tag in out-of-tree section
Michal Suchanek 24354f
        """
Michal Suchanek 24354f
Michal Suchanek 24354f
        name, series2 = self.prepare_found_indexed_upstream_good()
Michal Suchanek 24354f
        subprocess.call(['sed', '-i', '-e', 's/commit/comit/', name])
Michal Suchanek 24354f
        self.check_failure(
Michal Suchanek 24354f
'Error: There is a problem with patch "%s". The Patch-mainline tag "Queued in subsystem maintainer repository" requires Git-commit.\n' % (name))
Michal Suchanek 24354f
Michal Suchanek 24354f
Benjamin Poirier 6a71e7
if __name__ == '__main__':
Benjamin Poirier 6a71e7
    # Run a single testcase
Benjamin Poirier 535548
    suite = unittest.TestLoader().loadTestsFromTestCase(TestFromPatch)
Benjamin Poirier 6a71e7
    unittest.TextTestRunner(verbosity=2).run(suite)