1 /*
  2  * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  */
 23 package org.openjdk.skara.vcs.openjdk.converter;
 24 
 25 import org.openjdk.skara.test.TemporaryDirectory;
 26 import org.openjdk.skara.vcs.*;
 27 import org.openjdk.skara.vcs.openjdk.convert.HgToGitConverter;
 28 
 29 import org.junit.jupiter.api.Test;
 30 
 31 import java.io.IOException;
 32 import java.nio.file.Files;
 33 import java.util.*;
 34 
 35 import static org.junit.jupiter.api.Assertions.assertEquals;
 36 
 37 class HgToGitConverterTests {
 38     @Test
 39     void convertOneCommit() throws IOException {
 40         try (var hgRoot = new TemporaryDirectory();
 41              var gitRoot = new TemporaryDirectory()) {
 42             var hgRepo = Repository.init(hgRoot.path(), VCS.HG);
 43             var readme = hgRoot.path().resolve("README.md");
 44 
 45             Files.writeString(readme, "Hello, world");
 46             hgRepo.add(readme);
 47             hgRepo.commit("1234567: Added README", "foo", "foo@localhost");
 48 
 49             var gitRepo = Repository.init(gitRoot.path(), VCS.GIT);
 50 
 51             var converter = new HgToGitConverter(Map.of(), Map.of(), Set.of(), Set.of(),
 52                                                  Map.of("foo", "Foo Bar <foo@openjdk.java.net>"), Map.of(), Map.of());
 53             var marks = converter.convert(hgRepo, gitRepo);
 54             assertEquals(1, marks.size());
 55 
 56             var gitCommits = gitRepo.commits().asList();
 57             assertEquals(1, gitCommits.size());
 58             var gitCommit = gitCommits.get(0);
 59 
 60             var hgCommits = hgRepo.commits().asList();
 61             assertEquals(1, hgCommits.size());
 62             var hgCommit = hgCommits.get(0);
 63 
 64             assertEquals(gitCommit.author(), new Author("Foo Bar", "foo@openjdk.java.net"));
 65             assertEquals(gitCommit.committer(), new Author("Foo Bar", "foo@openjdk.java.net"));
 66             assertEquals(hgCommit.message(), gitCommit.message());
 67             assertEquals(hgCommit.date(), gitCommit.date());
 68             assertEquals(hgCommit.isInitialCommit(), gitCommit.isInitialCommit());
 69             assertEquals(hgCommit.isMerge(), gitCommit.isMerge());
 70             assertEquals(hgCommit.numParents(), gitCommit.numParents());
 71 
 72             var hgDiffs = hgCommit.parentDiffs();
 73             assertEquals(1, hgDiffs.size());
 74             var hgDiff = hgDiffs.get(0);
 75 
 76             var gitDiffs = gitCommit.parentDiffs();
 77             assertEquals(1, gitDiffs.size());
 78             var gitDiff = gitDiffs.get(0);
 79 
 80             var hgPatches = hgDiff.patches();
 81             assertEquals(1, hgPatches.size());
 82             var hgPatch = hgPatches.get(0).asTextualPatch();
 83 
 84             var gitPatches = gitDiff.patches();
 85             assertEquals(1, gitPatches.size());
 86             var gitPatch = gitPatches.get(0).asTextualPatch();
 87             assertEquals(hgPatch.stats(), gitPatch.stats());
 88 
 89             assertEquals(hgPatch.source().path(), gitPatch.source().path());
 90             assertEquals(hgPatch.source().type(), gitPatch.source().type());
 91 
 92             assertEquals(hgPatch.target().path(), gitPatch.target().path());
 93             assertEquals(hgPatch.target().type(), gitPatch.target().type());
 94 
 95             assertEquals(hgPatch.status(), gitPatch.status());
 96 
 97             var hgHunks = hgPatch.hunks();
 98             assertEquals(1, hgHunks.size());
 99             var hgHunk = hgHunks.get(0);
100 
101             var gitHunks = gitPatch.hunks();
102             assertEquals(1, gitHunks.size());
103             var gitHunk = gitHunks.get(0);
104 
105             assertEquals(hgHunk.source().range(), gitHunk.source().range());
106             assertEquals(hgHunk.source().lines(), gitHunk.source().lines());
107 
108             assertEquals(hgHunk.target().range(), gitHunk.target().range());
109             assertEquals(hgHunk.target().lines(), gitHunk.target().lines());
110 
111             assertEquals(hgHunk.added(), gitHunk.added());
112             assertEquals(hgHunk.removed(), gitHunk.removed());
113             assertEquals(hgHunk.modified(), gitHunk.modified());
114         }
115     }
116 
117     @Test
118     void convertOneSponsoredCommit() throws IOException {
119         try (var hgRoot = new TemporaryDirectory();
120              var gitRoot = new TemporaryDirectory()) {
121             var hgRepo = Repository.init(hgRoot.path(), VCS.HG);
122             var readme = hgRoot.path().resolve("README.md");
123 
124             Files.writeString(readme, "Hello, world");
125             hgRepo.add(readme);
126             var message = List.of("1234567: Added README", "Contributed-by: baz@domain.org");
127             hgRepo.commit(String.join("\n", message), "foo", "foo@host.com");
128 
129             var gitRepo = Repository.init(gitRoot.path(), VCS.GIT);
130 
131             var converter = new HgToGitConverter(Map.of(), Map.of(), Set.of(), Set.of(),
132                                                  Map.of("foo", "Foo Bar <foo@openjdk.java.net>"),
133                                                  Map.of("baz@domain.org", "Baz Bar <baz@domain.org>"),
134                                                  Map.of("foo", List.of("foo@host.com")));
135             var marks = converter.convert(hgRepo, gitRepo);
136             assertEquals(1, marks.size());
137 
138             var gitCommits = gitRepo.commits().asList();
139             assertEquals(1, gitCommits.size());
140             var gitCommit = gitCommits.get(0);
141 
142             var hgCommits = hgRepo.commits().asList();
143             assertEquals(1, hgCommits.size());
144             var hgCommit = hgCommits.get(0);
145 
146             assertEquals(new Author("Baz Bar", "baz@domain.org"), gitCommit.author());
147             assertEquals(new Author("Foo Bar", "foo@openjdk.java.net"), gitCommit.committer());
148             assertEquals(List.of("1234567: Added README"), gitCommit.message());
149         }
150     }
151 
152     @Test
153     void convertOneCoAuthoredCommit() throws IOException {
154         try (var hgRoot = new TemporaryDirectory();
155              var gitRoot = new TemporaryDirectory()) {
156             var hgRepo = Repository.init(hgRoot.path(), VCS.HG);
157             var readme = hgRoot.path().resolve("README.md");
158 
159             Files.writeString(readme, "Hello, world");
160             hgRepo.add(readme);
161             var message = List.of("1234567: Added README", "Contributed-by: baz@domain.org, foo@host.com");
162             hgRepo.commit(String.join("\n", message), "foo", "foo@host.com");
163 
164             var gitRepo = Repository.init(gitRoot.path(), VCS.GIT);
165 
166             var converter = new HgToGitConverter(Map.of(), Map.of(), Set.of(), Set.of(),
167                                                  Map.of("foo", "Foo Bar <foo@openjdk.java.net>"),
168                                                  Map.of("baz@domain.org", "Baz Bar <baz@domain.org>",
169                                                         "foo@host.com", "Foo Bar <foo@host.com>"),
170                                                  Map.of("foo", List.of("foo@host.com")));
171             var marks = converter.convert(hgRepo, gitRepo);
172             assertEquals(1, marks.size());
173 
174             var gitCommits = gitRepo.commits().asList();
175             assertEquals(1, gitCommits.size());
176             var gitCommit = gitCommits.get(0);
177 
178             var hgCommits = hgRepo.commits().asList();
179             assertEquals(1, hgCommits.size());
180             var hgCommit = hgCommits.get(0);
181 
182             assertEquals(new Author("Foo Bar", "foo@openjdk.java.net"), gitCommit.author());
183             assertEquals(new Author("Foo Bar", "foo@openjdk.java.net"), gitCommit.committer());
184             assertEquals(List.of("1234567: Added README", "", "Co-authored-by: Baz Bar <baz@domain.org>"),
185                          gitCommit.message());
186         }
187     }
188 
189     @Test
190     void convertCommitWithSummary() throws IOException {
191         try (var hgRoot = new TemporaryDirectory();
192              var gitRoot = new TemporaryDirectory()) {
193             var hgRepo = Repository.init(hgRoot.path(), VCS.HG);
194             var readme = hgRoot.path().resolve("README.md");
195 
196             Files.writeString(readme, "Hello, world");
197             hgRepo.add(readme);
198             var message = List.of("1234567: Added README", "Summary: additional text", "Contributed-by: baz@domain.org, foo@host.com");
199             hgRepo.commit(String.join("\n", message), "foo", "foo@host.com");
200 
201             var gitRepo = Repository.init(gitRoot.path(), VCS.GIT);
202 
203             var converter = new HgToGitConverter(Map.of(), Map.of(), Set.of(), Set.of(),
204                                                  Map.of("foo", "Foo Bar <foo@openjdk.java.net>"),
205                                                  Map.of("baz@domain.org", "Baz Bar <baz@domain.org>",
206                                                         "foo@host.com", "Foo Bar <foo@host.com>"),
207                                                  Map.of("foo", List.of("foo@host.com")));
208             var marks = converter.convert(hgRepo, gitRepo);
209             assertEquals(1, marks.size());
210 
211             var gitCommits = gitRepo.commits().asList();
212             assertEquals(1, gitCommits.size());
213             var gitCommit = gitCommits.get(0);
214 
215             var hgCommits = hgRepo.commits().asList();
216             assertEquals(1, hgCommits.size());
217             var hgCommit = hgCommits.get(0);
218 
219             assertEquals(new Author("Foo Bar", "foo@openjdk.java.net"), gitCommit.author());
220             assertEquals(new Author("Foo Bar", "foo@openjdk.java.net"), gitCommit.committer());
221             assertEquals(List.of("1234567: Added README", "", "Additional text", "", "Co-authored-by: Baz Bar <baz@domain.org>"),
222                          gitCommit.message());
223         }
224     }
225 }