tikhomirov@477: /* tikhomirov@477: * Copyright (c) 2012 TMate Software Ltd tikhomirov@477: * tikhomirov@477: * This program is free software; you can redistribute it and/or modify tikhomirov@477: * it under the terms of the GNU General Public License as published by tikhomirov@477: * the Free Software Foundation; version 2 of the License. tikhomirov@477: * tikhomirov@477: * This program is distributed in the hope that it will be useful, tikhomirov@477: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@477: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@477: * GNU General Public License for more details. tikhomirov@477: * tikhomirov@477: * For information on how to redistribute this software under tikhomirov@477: * the terms of a license other than GNU General Public License tikhomirov@477: * contact TMate Software at support@hg4j.com tikhomirov@477: */ tikhomirov@477: package org.tmatesoft.hg.test; tikhomirov@477: tikhomirov@477: import static org.junit.Assert.*; tikhomirov@477: import static org.tmatesoft.hg.repo.HgRepository.TIP; tikhomirov@477: tikhomirov@477: import java.io.File; tikhomirov@477: tikhomirov@477: import org.junit.After; tikhomirov@477: import org.junit.Before; tikhomirov@477: import org.junit.Rule; tikhomirov@477: import org.junit.Test; tikhomirov@477: import org.tmatesoft.hg.internal.Internals; tikhomirov@477: import org.tmatesoft.hg.internal.RelativePathRewrite; tikhomirov@477: import org.tmatesoft.hg.repo.HgDataFile; tikhomirov@477: import org.tmatesoft.hg.repo.HgManifest.Flags; tikhomirov@477: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@477: import org.tmatesoft.hg.util.FileInfo; tikhomirov@477: import org.tmatesoft.hg.util.FileWalker; tikhomirov@477: import org.tmatesoft.hg.util.Path; tikhomirov@477: import org.tmatesoft.hg.util.PathRewrite; tikhomirov@477: tikhomirov@477: /** tikhomirov@477: * {junit-test-repos}/test-flags/ tikhomirov@477: * tikhomirov@477: *

Node, JAR can't keep symlinks. Solution would be to keep tikhomirov@477: * repo without WC and perform an `hg co -C` before use if we tikhomirov@477: * need files from working copy. tikhomirov@477: * tikhomirov@477: * @author Artem Tikhomirov tikhomirov@477: * @author TMate Software Ltd. tikhomirov@477: */ tikhomirov@477: public class TestFileFlags { tikhomirov@477: @Rule tikhomirov@477: public ErrorCollectorExt errorCollector = new ErrorCollectorExt(); tikhomirov@477: tikhomirov@477: private HgRepository repo; tikhomirov@477: tikhomirov@477: @Test tikhomirov@477: public void testFlagsInManifest() { tikhomirov@477: HgDataFile link = repo.getFileNode("file-link"); tikhomirov@477: HgDataFile exec = repo.getFileNode("file-exec"); tikhomirov@477: HgDataFile file = repo.getFileNode("regular-file"); tikhomirov@477: assertEquals(Flags.Link, link.getFlags(TIP)); tikhomirov@477: assertEquals(Flags.Exec, exec.getFlags(TIP)); tikhomirov@477: assertEquals(Flags.RegularFile, file.getFlags(TIP)); tikhomirov@477: } tikhomirov@477: tikhomirov@477: @Test tikhomirov@477: public void testFlagsInWorkingCopy() throws Exception { tikhomirov@477: File repoRoot = repo.getWorkingDir(); tikhomirov@477: Path.Source pathSrc = new Path.SimpleSource(new PathRewrite.Composite(new RelativePathRewrite(repoRoot), repo.getToRepoPathHelper())); tikhomirov@608: FileWalker fw = new FileWalker(repo, repoRoot, pathSrc, null); tikhomirov@477: tikhomirov@477: if (Internals.runningOnWindows()) { tikhomirov@477: System.out.println("Executing tests on Windows, no actual file flags in working area are checked"); tikhomirov@477: assertFalse(fw.supportsExecFlag()); tikhomirov@477: assertFalse(fw.supportsLinkFlag()); tikhomirov@477: return; tikhomirov@477: } else { tikhomirov@477: assertTrue(fw.supportsExecFlag()); tikhomirov@477: assertTrue(fw.supportsLinkFlag()); tikhomirov@477: } tikhomirov@479: ExecHelper eh = new ExecHelper(new OutputParser.Stub(false), repo.getWorkingDir()); tikhomirov@477: eh.run("hg", "checkout", "-C"); tikhomirov@477: tikhomirov@477: boolean exec, link, file; tikhomirov@477: exec = link = file = false; tikhomirov@477: while (fw.hasNext()) { tikhomirov@477: fw.next(); tikhomirov@477: FileInfo fi = fw.file(); tikhomirov@477: String fn = fw.name().toString(); tikhomirov@477: if (fn.equals("file-link")) { tikhomirov@477: link = true; tikhomirov@477: errorCollector.assertTrue("Symlink shall exist despite the fact it points to nowhere", fi.exists()); tikhomirov@477: errorCollector.assertFalse(fi.isExecutable()); tikhomirov@477: errorCollector.assertTrue(fi.isSymlink()); tikhomirov@477: } else if (fn.equals("file-exec")) { tikhomirov@477: exec = true; tikhomirov@477: errorCollector.assertTrue(fi.isExecutable()); tikhomirov@477: errorCollector.assertFalse(fi.isSymlink()); tikhomirov@477: } else if (fn.equals("regular-file")) { tikhomirov@477: file = true; tikhomirov@477: errorCollector.assertFalse(fi.isExecutable()); tikhomirov@477: errorCollector.assertFalse(fi.isSymlink()); tikhomirov@477: } tikhomirov@477: } tikhomirov@477: errorCollector.assertTrue("Missing executable file in WC", exec); tikhomirov@477: errorCollector.assertTrue("Missing symlink in WC", link); tikhomirov@477: errorCollector.assertTrue("Missing regular file in WC", file); tikhomirov@477: } tikhomirov@477: tikhomirov@477: @Before tikhomirov@477: public void assignRepo() throws Exception { tikhomirov@477: repo = Configuration.get().find("test-flags"); tikhomirov@477: } tikhomirov@477: tikhomirov@477: @After tikhomirov@477: public void cleanFiles() { tikhomirov@477: File link = new File(repo.getWorkingDir(), "file-link"); tikhomirov@477: File exec = new File(repo.getWorkingDir(), "file-exec"); tikhomirov@477: File file = new File(repo.getWorkingDir(), "regular-file"); tikhomirov@477: if (link.exists()) { tikhomirov@477: link.deleteOnExit(); tikhomirov@477: } tikhomirov@477: if (exec.exists()) { tikhomirov@477: exec.deleteOnExit(); tikhomirov@477: } tikhomirov@477: if (file.exists()) { tikhomirov@477: file.deleteOnExit(); tikhomirov@477: } tikhomirov@477: } tikhomirov@477: }