def test_skip_symlink(tmp_path, monkeypatch):
    foo = tmp_path / "foo"
    foo.mkdir()
    (foo / "a.py").touch()
    (foo / "link.py").symlink_to(foo / "a.py")

    monkeypatch.chdir(tmp_path)

    python_language = Language("python")

    assert cmp_path_sets(
        TargetManager.expand_targets([foo], python_language, False),
        {foo / "a.py"},
    )

    assert cmp_path_sets(
        TargetManager.expand_targets([foo / "link.py"], python_language,
                                     False), set())
示例#2
0
def test_delete_git(tmp_path, monkeypatch):
    """
        Check that deleted files are not included in expanded targets
    """
    foo = tmp_path / "foo.py"
    bar = tmp_path / "bar.py"
    foo.touch()
    bar.touch()

    monkeypatch.chdir(tmp_path)
    subprocess.run(["git", "init"])
    subprocess.run(["git", "add", foo])
    subprocess.run(["git", "commit", "-m", "first commit"])

    foo.unlink()
    subprocess.run(["git", "status"])

    assert cmp_path_sets(
        TargetManager.expand_targets([Path(".")], "python", True), {bar})
def test_expand_targets_not_git(tmp_path, monkeypatch):
    """
    Check that directory expansion works with relative paths, absolute paths, paths with ..
    """
    foo = tmp_path / "foo"
    foo.mkdir()
    (foo / "a.go").touch()
    (foo / "b.go").touch()
    (foo / "py").touch()
    foo_a = foo / "a.py"
    foo_a.touch()
    foo_b = foo / "b.py"
    foo_b.touch()

    bar = tmp_path / "bar"
    bar.mkdir()
    bar_a = bar / "a.py"
    bar_a.touch()
    bar_b = bar / "b.py"
    bar_b.touch()

    foo_bar = foo / "bar"
    foo_bar.mkdir()
    foo_bar_a = foo_bar / "a.py"
    foo_bar_a.touch()
    foo_bar_b = foo_bar / "b.py"
    foo_bar_b.touch()

    in_foo_bar = {foo_bar_a, foo_bar_b}
    in_foo = {foo_a, foo_b}.union(in_foo_bar)
    in_bar = {bar_a, bar_b}
    in_all = in_foo.union(in_bar)

    python_language = Language("python")

    monkeypatch.chdir(tmp_path)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path(".")], python_language, False),
        in_all)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("bar")], python_language, False),
        in_bar)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("foo")], python_language, False),
        in_foo)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("foo").resolve()], python_language,
                                     False),
        in_foo,
    )
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("foo/bar")], python_language,
                                     False),
        in_foo_bar,
    )
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("foo/bar").resolve()],
                                     python_language, False),
        in_foo_bar,
    )

    monkeypatch.chdir(foo)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path(".")], python_language, False),
        in_foo)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("./foo")], python_language, False),
        set())
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("bar")], python_language, False),
        in_foo_bar)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("bar")], python_language, False),
        in_foo_bar)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("..")], python_language, False),
        in_all)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("../bar")], python_language, False),
        in_bar)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("../foo/bar")], python_language,
                                     False),
        in_foo_bar,
    )
def test_expand_targets_git(tmp_path, monkeypatch):
    """
    Test TargetManager with visible_to_git_only flag on in a git repository
    with nested .gitignores
    """
    foo = tmp_path / "foo"
    foo.mkdir()
    foo_a_go = foo / "a.go"
    foo_a_go.touch()
    (foo / "b.go").touch()
    (foo / "py").touch()
    foo_a = foo / "a.py"
    foo_a.touch()
    foo_b = foo / "b.py"
    foo_b.touch()

    bar = tmp_path / "bar"
    bar.mkdir()
    bar_a = bar / "a.py"
    bar_a.touch()
    bar_b = bar / "b.py"
    bar_b.touch()

    foo_bar = foo / "bar"
    foo_bar.mkdir()
    foo_bar_a = foo_bar / "a.py"
    foo_bar_a.touch()
    foo_bar_b = foo_bar / "b.py"
    foo_bar_b.touch()

    monkeypatch.chdir(tmp_path)
    subprocess.run(["git", "init"])
    subprocess.run(["git", "add", foo_a])
    subprocess.run(["git", "add", foo_bar_a])
    subprocess.run(["git", "add", foo_bar_b])
    subprocess.run(["git", "add", foo_a_go])
    subprocess.run(["git", "commit", "-m", "first"])

    # Check that all files are visible without a .gitignore
    in_foo_bar = {foo_bar_a, foo_bar_b}
    in_foo = {foo_a, foo_b}.union(in_foo_bar)
    in_bar = {bar_a, bar_b}
    in_all = in_foo.union(in_bar)

    python_language = Language("python")

    monkeypatch.chdir(tmp_path)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path(".")], python_language, True),
        in_all)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("bar")], python_language, True),
        in_bar)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("foo")], python_language, True),
        in_foo)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("foo").resolve()], python_language,
                                     True),
        in_foo,
    )
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("foo/bar")], python_language, True),
        in_foo_bar,
    )
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("foo/bar").resolve()],
                                     python_language, True),
        in_foo_bar,
    )
    monkeypatch.chdir(foo)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path(".")], python_language, True),
        in_foo)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("./foo")], python_language, True),
        set())
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("bar")], python_language, True),
        in_foo_bar)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("bar")], python_language, True),
        in_foo_bar)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("..")], python_language, True),
        in_all)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("../bar")], python_language, True),
        in_bar)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("../foo/bar")], python_language,
                                     True),
        in_foo_bar,
    )

    # Add bar/, foo/bar/a.py, foo/b.py to gitignores
    monkeypatch.chdir(tmp_path)
    (tmp_path / ".gitignore").write_text("bar/\nfoo/bar/a.py")
    (tmp_path / "foo" / ".gitignore").write_text("b.py")

    # Reflect what should now be visible given gitignores
    in_foo_bar = {
        foo_bar_a,
        foo_bar_b,
    }  # foo/bar/a.py is gitignored but is already tracked
    in_foo = {foo_a}.union(
        in_foo_bar)  # foo/b.py is gitignored with a nested gitignore
    in_bar = set()  # bar/ is gitignored
    in_all = in_foo.union(in_bar)

    monkeypatch.chdir(tmp_path)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path(".")], python_language, True),
        in_all)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("bar")], python_language, True),
        in_bar)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("foo")], python_language, True),
        in_foo)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("foo").resolve()], python_language,
                                     True),
        in_foo,
    )
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("foo/bar")], python_language, True),
        in_foo_bar,
    )
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("foo/bar").resolve()],
                                     python_language, True),
        in_foo_bar,
    )
    monkeypatch.chdir(foo)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path(".")], python_language, True),
        in_foo)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("./foo")], python_language, True),
        set())
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("bar")], python_language, True),
        in_foo_bar)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("bar")], python_language, True),
        in_foo_bar)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("..")], python_language, True),
        in_all)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("../bar")], python_language, True),
        in_bar)
    assert cmp_path_sets(
        TargetManager.expand_targets([Path("../foo/bar")], python_language,
                                     True),
        in_foo_bar,
    )