comparison test/org/tmatesoft/hg/test/TestCommit.java @ 586:73c20c648c1f

HgCommitCommand initial support
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Fri, 26 Apr 2013 18:38:41 +0200
parents 78a9e26e670d
children 41218d84842a
comparison
equal deleted inserted replaced
585:b47ef0d2777b 586:73c20c648c1f
16 */ 16 */
17 package org.tmatesoft.hg.test; 17 package org.tmatesoft.hg.test;
18 18
19 import static org.junit.Assert.*; 19 import static org.junit.Assert.*;
20 import static org.tmatesoft.hg.repo.HgRepository.*; 20 import static org.tmatesoft.hg.repo.HgRepository.*;
21 import static org.tmatesoft.hg.repo.HgRepository.DEFAULT_BRANCH_NAME;
22 import static org.tmatesoft.hg.repo.HgRepository.NO_REVISION;
23 21
24 import java.io.File; 22 import java.io.File;
25 import java.io.FileInputStream;
26 import java.io.IOException; 23 import java.io.IOException;
27 import java.nio.ByteBuffer; 24 import java.nio.ByteBuffer;
28 import java.nio.channels.FileChannel;
29 import java.util.List; 25 import java.util.List;
30 26
31 import org.junit.Test; 27 import org.junit.Test;
32 import org.tmatesoft.hg.core.HgAddRemoveCommand; 28 import org.tmatesoft.hg.core.HgAddRemoveCommand;
33 import org.tmatesoft.hg.core.HgCatCommand; 29 import org.tmatesoft.hg.core.HgCatCommand;
34 import org.tmatesoft.hg.core.HgChangeset; 30 import org.tmatesoft.hg.core.HgChangeset;
31 import org.tmatesoft.hg.core.HgCommitCommand;
35 import org.tmatesoft.hg.core.HgLogCommand; 32 import org.tmatesoft.hg.core.HgLogCommand;
33 import org.tmatesoft.hg.core.HgRevertCommand;
34 import org.tmatesoft.hg.core.HgStatus.Kind;
35 import org.tmatesoft.hg.core.HgStatusCommand;
36 import org.tmatesoft.hg.core.Nodeid; 36 import org.tmatesoft.hg.core.Nodeid;
37 import org.tmatesoft.hg.internal.ByteArrayChannel; 37 import org.tmatesoft.hg.internal.ByteArrayChannel;
38 import org.tmatesoft.hg.internal.FileContentSupplier;
38 import org.tmatesoft.hg.repo.CommitFacility; 39 import org.tmatesoft.hg.repo.CommitFacility;
39 import org.tmatesoft.hg.repo.HgDataFile; 40 import org.tmatesoft.hg.repo.HgDataFile;
40 import org.tmatesoft.hg.repo.HgLookup; 41 import org.tmatesoft.hg.repo.HgLookup;
41 import org.tmatesoft.hg.repo.HgRepository; 42 import org.tmatesoft.hg.repo.HgRepository;
43 import org.tmatesoft.hg.util.Outcome;
42 import org.tmatesoft.hg.util.Path; 44 import org.tmatesoft.hg.util.Path;
43 45
44 /** 46 /**
45 * Handy for debug to see patch content: 47 * Handy for debug to see patch content:
46 * ...RevlogDump /tmp/test-commit2non-empty/.hg/ store/data/file1.i dumpData 48 * ...RevlogDump /tmp/test-commit2non-empty/.hg/ store/data/file1.i dumpData
222 assertEquals("SECOND", c2.getComment()); 224 assertEquals("SECOND", c2.getComment());
223 assertEquals("THIRD", c3.getComment()); 225 assertEquals("THIRD", c3.getComment());
224 assertHgVerifyOk(repoLoc); 226 assertHgVerifyOk(repoLoc);
225 } 227 }
226 228
229 @Test
230 public void testCommandBasics() throws Exception {
231 File repoLoc = RepoUtils.cloneRepoToTempLocation("log-1", "test-commit-cmd", false);
232 HgRepository hgRepo = new HgLookup().detect(repoLoc);
233 HgDataFile dfB = hgRepo.getFileNode("b");
234 assertTrue("[sanity]", dfB.exists());
235 File fileB = new File(repoLoc, "b");
236 assertTrue("[sanity]", fileB.canRead());
237 RepoUtils.modifyFileAppend(fileB, " 1 \n");
238
239 HgCommitCommand cmd = new HgCommitCommand(hgRepo);
240 assertFalse(cmd.isMergeCommit());
241 Outcome r = cmd.message("FIRST").execute();
242 assertTrue(r.isOk());
243 Nodeid c1 = cmd.getCommittedRevision();
244
245 hgRepo = new HgLookup().detect(repoLoc);
246 //
247 new HgRevertCommand(hgRepo).file(dfB.getPath()).execute(); // FIXME Hack to emulate dirstate update
248 //
249 TestStatus.StatusCollector status = new TestStatus.StatusCollector();
250 new HgStatusCommand(hgRepo).defaults().execute(status);
251 assertTrue(status.getErrors().isEmpty());
252 assertTrue(status.get(Kind.Modified).isEmpty());
253
254 HgDataFile dfD = hgRepo.getFileNode("d");
255 assertTrue("[sanity]", dfD.exists());
256 File fileD = new File(repoLoc, "d");
257 assertTrue("[sanity]", fileD.canRead());
258 //
259 RepoUtils.modifyFileAppend(fileD, " 1 \n");
260 cmd = new HgCommitCommand(hgRepo);
261 assertFalse(cmd.isMergeCommit());
262 r = cmd.message("SECOND").execute();
263 assertTrue(r.isOk());
264 Nodeid c2 = cmd.getCommittedRevision();
265 //
266 hgRepo = new HgLookup().detect(repoLoc);
267 int lastRev = hgRepo.getChangelog().getLastRevision();
268 List<HgChangeset> csets = new HgLogCommand(hgRepo).range(lastRev-1, lastRev).execute();
269 assertEquals(csets.get(0).getNodeid(), c1);
270 assertEquals(csets.get(1).getNodeid(), c2);
271 assertEquals(csets.get(0).getComment(), "FIRST");
272 assertEquals(csets.get(1).getComment(), "SECOND");
273 assertHgVerifyOk(repoLoc);
274 }
275
227 private void assertHgVerifyOk(File repoLoc) throws InterruptedException, IOException { 276 private void assertHgVerifyOk(File repoLoc) throws InterruptedException, IOException {
228 ExecHelper verifyRun = new ExecHelper(new OutputParser.Stub(), repoLoc); 277 ExecHelper verifyRun = new ExecHelper(new OutputParser.Stub(), repoLoc);
229 verifyRun.run("hg", "verify"); 278 verifyRun.run("hg", "verify");
230 assertEquals("hg verify", 0, verifyRun.getExitValue()); 279 assertEquals("hg verify", 0, verifyRun.getExitValue());
231 } 280 }
273 buf.put(data, pos, count); 322 buf.put(data, pos, count);
274 pos += count; 323 pos += count;
275 return count; 324 return count;
276 } 325 }
277 } 326 }
278
279 static class FileContentSupplier implements CommitFacility.ByteDataSupplier {
280 private final FileChannel channel;
281 private IOException error;
282
283 public FileContentSupplier(File f) throws IOException {
284 if (!f.canRead()) {
285 throw new IOException(String.format("Can't read file %s", f));
286 }
287 channel = new FileInputStream(f).getChannel();
288 }
289
290 public int read(ByteBuffer buf) {
291 if (error != null) {
292 return -1;
293 }
294 try {
295 return channel.read(buf);
296 } catch (IOException ex) {
297 error = ex;
298 }
299 return -1;
300 }
301
302 public void done() throws IOException {
303 channel.close();
304 if (error != null) {
305 throw error;
306 }
307 }
308 }
309 } 327 }