예제 #1
0
def test_old_file_ignored_by_git_not_removed(
    source_tree, preserve_track_obsolete_file_flag
):
    metadata.set_track_obsolete_files(True)

    with metadata.MetadataTrackerAndWriter(source_tree.tmpdir / "synth.metadata"):
        source_tree.write(".bin")

    metadata.reset()
    with metadata.MetadataTrackerAndWriter(source_tree.tmpdir / "synth.metadata"):
        source_tree.write(".gitignore", ".bin")

    # Confirm remove_obsolete_files didn't remove the .bin file.
    assert os.path.exists(".bin")
예제 #2
0
def test_cwd_git_source_in_metadata(source_tree):
    # Instantiate a MetadataTrackerAndWriter to write the metadata.
    with metadata.MetadataTrackerAndWriter(source_tree.tmpdir /
                                           "synth.metadata"):
        pass
    mdata = metadata._read_or_empty(source_tree.tmpdir / "synth.metadata")
    cwd_source = mdata.sources[0].git
    assert cwd_source.name == "."
예제 #3
0
def test_nothing_happens_when_disabled(source_tree, preserve_track_obsolete_file_flag):
    metadata.set_track_obsolete_files(True)

    with metadata.MetadataTrackerAndWriter(source_tree.tmpdir / "synth.metadata"):
        source_tree.write("code/b")
        source_tree.write("code/c")

    metadata.reset()
    time.sleep(1)
    with metadata.MetadataTrackerAndWriter(source_tree.tmpdir / "synth.metadata"):
        source_tree.write("code/c")
        metadata.set_track_obsolete_files(False)

    assert 0 == len(metadata.get().new_files)

    # Confirm no files were deleted.
    assert os.path.exists("code/b")
    assert os.path.exists("code/c")
예제 #4
0
def test_old_file_removed(source_tree, preserve_track_obsolete_file_flag):
    metadata.set_track_obsolete_files(True)

    with metadata.MetadataTrackerAndWriter(source_tree.tmpdir / "synth.metadata"):
        source_tree.write("code/b")
        source_tree.write("code/c")

    metadata.reset()
    time.sleep(1)
    with metadata.MetadataTrackerAndWriter(source_tree.tmpdir / "synth.metadata"):
        source_tree.write("code/c")

    assert 1 == len(metadata.get().new_files)
    assert "code/c" == metadata.get().new_files[0].path

    # Confirm remove_obsolete_files deletes b but not c.
    assert not os.path.exists("code/b")
    assert os.path.exists("code/c")
예제 #5
0
def test_used_to_append_git_log_to_metadata(source_tree):
    """Synthtool used to append the git log for each git source.  But nothing
    consumes the log, and there's no design for anything to consume the log.
    Plus, it cluttered up synth.metadata.
    """
    with metadata.MetadataTrackerAndWriter(source_tree.tmpdir /
                                           "synth.metadata"):
        # Create one commit that will be recorded in the metadata.
        source_tree.write("a")
        source_tree.git_add("a")
        source_tree.git_commit("a")

        hash = subprocess.run(
            [source_tree.git, "log", "-1", "--pretty=format:%H"],
            stdout=subprocess.PIPE,
            universal_newlines=True,
        ).stdout.strip()
        metadata.add_git_source(name="tmp", local_path=os.getcwd(), sha=hash)

    metadata.reset()
    with metadata.MetadataTrackerAndWriter(source_tree.tmpdir /
                                           "synth.metadata"):
        # Create two more commits that should appear in metadata git log.
        source_tree.write("code/b")
        source_tree.git_add("code/b")
        source_tree.git_commit("code/b")

        source_tree.write("code/c")
        source_tree.git_add("code/c")
        source_tree.git_commit("code/c")

        hash = subprocess.run(
            [source_tree.git, "log", "-1", "--pretty=format:%H"],
            stdout=subprocess.PIPE,
            universal_newlines=True,
        ).stdout.strip()
        metadata.add_git_source(name="tmp", local_path=os.getcwd(), sha=hash)

    # Read the metadata that we just wrote.
    mdata = metadata._read_or_empty(source_tree.tmpdir / "synth.metadata")
    # The log should be empty.
    assert "" == mdata.sources[1].git.log
    # Make sure the local path field is not recorded.
    assert not mdata.sources[0].git.local_path is None
예제 #6
0
def test_new_files_found(source_tree, preserve_track_obsolete_file_flag):
    metadata.set_track_obsolete_files(True)
    source_tree.write("a")
    with metadata.MetadataTrackerAndWriter(source_tree.tmpdir /
                                           "synth.metadata"):
        source_tree.write("code/b")

    # Confirm add_new_files found the new files and ignored the old one.
    new_file_paths = [path for path in metadata.get().generated_files]
    assert ["code/b"] == new_file_paths
예제 #7
0
def test_watch_dir_does_not_exist_yet(source_tree):
    new_dir_path = source_tree.tmpdir / "blahblah"
    metadata_path = new_dir_path / "synth.metadata"

    assert not os.path.exists(new_dir_path)

    with metadata.MetadataTrackerAndWriter(metadata_path):
        pass

    assert os.path.exists(new_dir_path)
예제 #8
0
def test_gitignored_files_ignored(source_tree, preserve_track_obsolete_file_flag):
    metadata.set_track_obsolete_files(True)
    with metadata.MetadataTrackerAndWriter(source_tree.tmpdir / "synth.metadata"):
        source_tree.write("code/b")
        source_tree.write("code/c")
        source_tree.write(".gitignore", "code/c\n")

    # Confirm add_new_files found the new files and ignored one.
    new_file_paths = [new_file.path for new_file in metadata.get().new_files]
    assert [".gitignore", "code/b"] == new_file_paths
예제 #9
0
def test_append_git_log_to_metadata(source_tree):
    with metadata.MetadataTrackerAndWriter(source_tree.tmpdir / "synth.metadata"):
        # Create one commit that will be recorded in the metadata.
        source_tree.write("a")
        source_tree.git_add("a")
        source_tree.git_commit("a")

        hash = subprocess.run(
            [source_tree.git, "log", "-1", "--pretty=format:%H"],
            stdout=subprocess.PIPE,
            universal_newlines=True,
        ).stdout.strip()
        metadata.add_git_source(name="tmp", local_path=os.getcwd(), sha=hash)

    metadata.reset()
    with metadata.MetadataTrackerAndWriter(source_tree.tmpdir / "synth.metadata"):
        # Create two more commits that should appear in metadata git log.
        source_tree.write("code/b")
        source_tree.git_add("code/b")
        source_tree.git_commit("code/b")

        source_tree.write("code/c")
        source_tree.git_add("code/c")
        source_tree.git_commit("code/c")

        hash = subprocess.run(
            [source_tree.git, "log", "-1", "--pretty=format:%H"],
            stdout=subprocess.PIPE,
            universal_newlines=True,
        ).stdout.strip()
        metadata.add_git_source(name="tmp", local_path=os.getcwd(), sha=hash)

    # Read the metadata that we just wrote.
    mdata = metadata._read_or_empty(source_tree.tmpdir / "synth.metadata")
    # Match 2 log lines.
    assert re.match(
        r"[0-9A-Fa-f]+\ncode/c\n+[0-9A-Fa-f]+\ncode/b\n+",
        mdata.sources[0].git.log,
        re.MULTILINE,
    )
    # Make sure the local path field is not recorded.
    assert not mdata.sources[0].git.local_path is None
예제 #10
0
def test_excluded_file_not_removed(source_tree,
                                   preserve_track_obsolete_file_flag):
    metadata.set_track_obsolete_files(True)
    _tracked_paths.add(source_tree.tmpdir / "build")

    with metadata.MetadataTrackerAndWriter(source_tree.tmpdir /
                                           "synth.metadata"):
        source_tree.write("code/b")
        source_tree.write("code/c")

    metadata.reset()
    # Create a second source tree and copy it into the first.
    with metadata.MetadataTrackerAndWriter(source_tree.tmpdir /
                                           "synth.metadata"):
        # exclude code/c from being copied should mean it doesn't get deleted.
        transforms.move(source_tree.tmpdir / "build", excludes=["code/c"])

    # Confirm remove_obsolete_files deletes b but not c.
    assert not os.path.exists("code/b")
    assert os.path.exists("code/c")
예제 #11
0
def test_disable_writing_metadata(source_tree: SourceTree):
    metadata_path: pathlib.Path = source_tree.tmpdir / "synth.metadata"
    try:
        with metadata.MetadataTrackerAndWriter(metadata_path):
            metadata.add_generator_source(name="a-generator",
                                          version="1",
                                          docker_image="x")
            metadata.add_generator_source(name="b-generator",
                                          version="2",
                                          docker_image="y")
            metadata.enable_write_metadata(False)
        assert not metadata_path.exists()
    finally:
        metadata.enable_write_metadata(True)
예제 #12
0
def test_nothing_happens_when_exception(source_tree,
                                        preserve_track_obsolete_file_flag):
    metadata.set_track_obsolete_files(True)

    with metadata.MetadataTrackerAndWriter(source_tree.tmpdir /
                                           "synth.metadata"):
        source_tree.write("code/b")
        source_tree.write("code/c")

    metadata.reset()
    try:
        with metadata.MetadataTrackerAndWriter(source_tree.tmpdir /
                                               "synth.metadata"):
            source_tree.write("code/c")
            raise "Exception!"
    except:  # noqa: E722
        pass

    assert 0 == len(metadata.get().new_files)

    # Confirm no files were deleted.
    assert os.path.exists("code/b")
    assert os.path.exists("code/c")
예제 #13
0
def test_git_sources_are_sorted(source_tree: SourceTree):
    metadata_path = source_tree.tmpdir / "synth.metadata"
    with metadata.MetadataTrackerAndWriter(metadata_path):
        metadata.add_generator_source(name="a-generator",
                                      version="1",
                                      docker_image="x")
        metadata.add_generator_source(name="b-generator",
                                      version="2",
                                      docker_image="y")
        metadata.add_template_source(name="a-template",
                                     origin="andromeda",
                                     version="3")
        metadata.add_template_source(name="b-template",
                                     origin="milky way",
                                     version="4")
        metadata.add_git_source(name="a-git", sha="1a")
        metadata.add_git_source(name="b-git", sha="1b")
    m1 = metadata._read_or_empty(metadata_path)
    # Add the same sources in reverse order.
    metadata.reset()
    with metadata.MetadataTrackerAndWriter(metadata_path):
        metadata.add_git_source(name="b-git", sha="1b")
        metadata.add_git_source(name="a-git", sha="1a")
        metadata.add_template_source(name="b-template",
                                     origin="milky way",
                                     version="4")
        metadata.add_template_source(name="a-template",
                                     origin="andromeda",
                                     version="3")
        metadata.add_generator_source(name="b-generator",
                                      version="2",
                                      docker_image="y")
        metadata.add_generator_source(name="a-generator",
                                      version="1",
                                      docker_image="x")
    m2 = metadata._read_or_empty(metadata_path)
    assert m1.sources == m2.sources
예제 #14
0
def test_add_new_files_with_bad_file(source_tree, preserve_track_obsolete_file_flag):
    metadata.set_track_obsolete_files(True)

    metadata.reset()
    tmpdir = source_tree.tmpdir
    dne = "does-not-exist"
    source_tree.git_add(dne)
    time.sleep(1)  # File systems have resolution of about 1 second.

    try:
        os.symlink(tmpdir / dne, tmpdir / "badlink")
    except OSError:
        # On Windows, creating a symlink requires Admin priveleges, which
        # should never be granted to test runners.
        assert "win32" == sys.platform
        return
    # Confirm this doesn't throw an exception.
    with metadata.MetadataTrackerAndWriter(source_tree.tmpdir / "synth.metadata"):
        pass
    # And a bad link does not exist and shouldn't be recorded as a new file.
    assert 0 == len(metadata.get().new_files)