@Test
  public void simple_replace() throws ParseException, NoSuchAlgorithmException {
    final String newFileContent = "No content.\n";

    Predicate<Node> predicate =
        n ->
            n.getRevision().get().getNumber() == 1
                && n.getHeaders().get(NodeHeader.PATH).equals("README.txt");
    FileContentReplace fileContentReplace =
        new FileContentReplace(predicate, n -> new ContentChunkImpl(newFileContent.getBytes()));

    RepositoryInMemory inMemory = new RepositoryInMemory();
    fileContentReplace.continueTo(inMemory);

    SvnDumpParser.consume(TestUtil.openResource("dumps/add_file.dump"), fileContentReplace);

    assertThat(inMemory.getRepo().getRevisions().size(), is(2));
    Revision r1 = inMemory.getRepo().getRevisions().get(1);
    assertThat(r1.getNodes().size(), is(1));
    Node node = r1.getNodes().get(0);
    assertThat(new String(node.getContent().get(0).getContent()), is(equalTo(newFileContent)));
    assertThat(node.get(NodeHeader.TEXT_CONTENT_LENGTH), is(equalTo("12")));
    assertThat(node.get(NodeHeader.CONTENT_LENGTH), is(equalTo("22")));
    assertThat(node.get(NodeHeader.MD5), is(equalTo(new Md5().hash(newFileContent.getBytes()))));
    assertThat(node.get(NodeHeader.SHA1), is(equalTo(new Sha1().hash(newFileContent.getBytes()))));
  }
  @Test(expected = NullPointerException.class)
  public void does_not_allow_null_chunk() throws ParseException {
    Predicate<Node> predicate = n -> true;
    FileContentReplace fileContentReplace = new FileContentReplace(predicate, n -> null);

    ByteArrayOutputStream newDump = new ByteArrayOutputStream();
    RepositoryWriter svnDumpWriter = new SvnDumpWriter();
    svnDumpWriter.writeTo(newDump);

    fileContentReplace.continueTo(svnDumpWriter);

    SvnDumpParser.consume(TestUtil.openResource("dumps/add_file.dump"), fileContentReplace);
  }
  @Test
  public void if_no_match_then_no_change() throws ParseException, IOException {
    Predicate<Node> predicate = n -> false;
    FileContentReplace fileContentReplace = new FileContentReplace(predicate, n -> null);

    ByteArrayOutputStream newDump = new ByteArrayOutputStream();
    RepositoryWriter svnDumpWriter = new SvnDumpWriter();
    svnDumpWriter.writeTo(newDump);

    fileContentReplace.continueTo(svnDumpWriter);

    SvnDumpParser.consume(TestUtil.openResource("dumps/add_file.dump"), fileContentReplace);

    TestUtil.assertEqualStreams(
        TestUtil.openResource("dumps/add_file.dump"),
        new ByteArrayInputStream(newDump.toByteArray()));
  }
  @Test
  public void tracks_copied_file_across_one_copy() throws ParseException, IOException {
    Predicate<Node> nodeMatcher =
        n -> n.getRevision().get().getNumber() == 1 && "README.txt".equals(n.get(NodeHeader.PATH));
    FileContentReplace fileContentReplace =
        new FileContentReplace(nodeMatcher, n -> new ContentChunkImpl("new content\n".getBytes()));

    ByteArrayOutputStream newDumpStream = new ByteArrayOutputStream();
    RepositoryWriter svnDumpWriter = new SvnDumpWriter();
    svnDumpWriter.writeTo(newDumpStream);

    fileContentReplace.continueTo(svnDumpWriter);

    SvnDumpParser.consume(TestUtil.openResource("dumps/svn_copy_file.dump"), fileContentReplace);

    TestUtil.assertEqualStreams(
        TestUtil.openResource("dumps/svn_copy_file_new_content.dump"),
        new ByteArrayInputStream(newDumpStream.toByteArray()));
  }
  @Test
  public void handle_multiple_matches_across_simple_copies() throws ParseException, IOException {
    Predicate<Node> nodeMatcher = n -> n.get(NodeHeader.PATH).endsWith("README.txt");
    FileContentReplace fileContentReplace =
        new FileContentReplace(
            nodeMatcher, FileContentReplace.chunkFromString("this text is different\n"));

    ByteArrayOutputStream newDumpStream = new ByteArrayOutputStream();
    RepositoryWriter svnDumpWriter = new SvnDumpWriter();
    svnDumpWriter.writeTo(newDumpStream);

    fileContentReplace.continueTo(svnDumpWriter);

    SvnDumpParser.consume(TestUtil.openResource("dumps/simple_copy.dump"), fileContentReplace);

    TestUtil.assertEqualStreams(
        TestUtil.openResource("dumps/simple_copy2.dump"),
        new ByteArrayInputStream(newDumpStream.toByteArray()));
  }
  @Test
  public void tracks_copied_file_across_many_copies() throws ParseException, IOException {
    FileContentReplace fileContentReplace =
        FileContentReplace.createFCR(
            1, "add", "README.txt", n -> new ContentChunkImpl("new content\n".getBytes()));

    ByteArrayOutputStream newDumpStream = new ByteArrayOutputStream();
    RepositoryWriter svnDumpWriter = new SvnDumpWriter();
    svnDumpWriter.writeTo(newDumpStream);

    fileContentReplace.continueTo(svnDumpWriter);

    SvnDumpParser.consume(
        TestUtil.openResource("dumps/svn_copy_file_many_times.dump"), fileContentReplace);

    TestUtil.assertEqualStreams(
        TestUtil.openResource("dumps/svn_copy_file_many_times_new_content.dump"),
        new ByteArrayInputStream(newDumpStream.toByteArray()));
  }
  @Test
  public void does_not_change_a_change_and_copied_file() throws ParseException, IOException {
    Predicate<Node> nodeMatcher = n -> false;
    FileContentReplace fileContentReplace =
        new FileContentReplace(
            nodeMatcher, n -> new ContentChunkImpl("i replaced the content\n".getBytes()));

    ByteArrayOutputStream newDumpStream = new ByteArrayOutputStream();
    RepositoryWriter svnDumpWriter = new SvnDumpWriter();
    svnDumpWriter.writeTo(newDumpStream);

    fileContentReplace.continueTo(svnDumpWriter);

    SvnDumpParser.consume(
        TestUtil.openResource("dumps/add_and_change_copy_delete.dump"), fileContentReplace);

    TestUtil.assertEqualStreams(
        TestUtil.openResource("dumps/add_and_change_copy_delete.dump"),
        new ByteArrayInputStream(newDumpStream.toByteArray()));
  }
  @Test
  public void tracks_node_in_directory_external_tok() throws ParseException, IOException {
    FileContentReplace fileContentReplace =
        FileContentReplace.createFCR(
            2,
            "add",
            "dir1/dir2/dir3/README.txt",
            n -> new ContentChunkImpl("new content\n".getBytes()));

    ByteArrayOutputStream newDumpStream = new ByteArrayOutputStream();
    RepositoryWriter svnDumpWriter = new SvnDumpWriter();
    svnDumpWriter.writeTo(newDumpStream);

    fileContentReplace.continueTo(svnDumpWriter);

    SvnDumpParser.consume(
        TestUtil.openResource("dumps/add_file_in_directory.before.dump"), fileContentReplace);

    InputStream dumpWithNewContent =
        TestUtil.openResource("dumps/add_file_in_directory.after.dump");
    InputStream dumpCreatedByFileContentReplace =
        new ByteArrayInputStream(newDumpStream.toByteArray());
    TestUtil.assertEqualStreams(dumpWithNewContent, dumpCreatedByFileContentReplace);
  }
  @Test
  public void tracks_node_in_directory() throws ParseException, IOException {
    Predicate<Node> nodeMatcher =
        n ->
            n.getRevision().get().getNumber() == 2
                && "dir1/dir2/dir3/README.txt".equals(n.get(NodeHeader.PATH));
    FileContentReplace fileContentReplace =
        new FileContentReplace(nodeMatcher, n -> new ContentChunkImpl("new content\n".getBytes()));

    ByteArrayOutputStream newDumpStream = new ByteArrayOutputStream();
    RepositoryWriter svnDumpWriter = new SvnDumpWriter();
    svnDumpWriter.writeTo(newDumpStream);

    fileContentReplace.continueTo(svnDumpWriter);

    SvnDumpParser.consume(
        TestUtil.openResource("dumps/add_file_in_directory.before.dump"), fileContentReplace);

    InputStream dumpWithNewContent =
        TestUtil.openResource("dumps/add_file_in_directory.after.dump");
    InputStream dumpCreatedByFileContentReplace =
        new ByteArrayInputStream(newDumpStream.toByteArray());
    TestUtil.assertEqualStreams(dumpWithNewContent, dumpCreatedByFileContentReplace);
  }
示例#10
0
  @Test
  public void node_property_should_be_changed_and_dump_should_be_unchanged() throws ParseException {
    RepositoryConsumer propChange =
        new PropertyChange(
            "svn:mergeinfo"::equals, new MergeInfoReplaceRevision("/branches/mybranch", 2, 1));

    RepositoryInMemory inMemoryDump = new RepositoryInMemory();
    propChange.continueTo(inMemoryDump);

    final InputStream s =
        Thread.currentThread()
            .getContextClassLoader()
            .getResourceAsStream("dumps/simple_branch_and_merge.dump");

    SvnDumpParser.consume(s, propChange);

    Repository dump = inMemoryDump.getRepo();

    assertThat(dump.getRevisions().size(), is(6));
    Revision r4 = dump.getRevisions().get(4);
    assertThat(r4.getNodes().size(), is(2));
    assertThat(
        r4.getNodes().get(0).getProperties().get(Property.MERGEINFO), is("/branches/mybranch:1-3"));
  }