tikhomirov@15: /* tikhomirov@74: * Copyright (c) 2010-2011 TMate Software Ltd tikhomirov@74: * tikhomirov@74: * This program is free software; you can redistribute it and/or modify tikhomirov@74: * it under the terms of the GNU General Public License as published by tikhomirov@74: * the Free Software Foundation; version 2 of the License. tikhomirov@74: * tikhomirov@74: * This program is distributed in the hope that it will be useful, tikhomirov@74: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@74: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@74: * GNU General Public License for more details. tikhomirov@74: * tikhomirov@74: * For information on how to redistribute this software under tikhomirov@74: * the terms of a license other than GNU General Public License tikhomirov@74: * contact TMate Software at support@svnkit.com tikhomirov@15: */ tikhomirov@74: package org.tmatesoft.hg.repo; tikhomirov@15: tikhomirov@15: import java.io.BufferedReader; tikhomirov@15: import java.io.File; tikhomirov@15: import java.io.FileReader; tikhomirov@15: import java.io.IOException; tikhomirov@15: import java.util.Collections; tikhomirov@15: import java.util.Set; tikhomirov@15: import java.util.TreeSet; tikhomirov@15: tikhomirov@15: /** tikhomirov@15: * tikhomirov@74: * @author Artem Tikhomirov tikhomirov@74: * @author TMate Software Ltd. tikhomirov@15: */ tikhomirov@15: public class HgIgnore { tikhomirov@15: tikhomirov@74: private final HgRepository repo; tikhomirov@15: private Set entries; tikhomirov@15: tikhomirov@74: public HgIgnore(HgRepository localRepo) { tikhomirov@15: this.repo = localRepo; tikhomirov@15: } tikhomirov@15: tikhomirov@15: private void read() { tikhomirov@15: entries = Collections.emptySet(); tikhomirov@15: File hgignoreFile = new File(repo.getRepositoryRoot().getParentFile(), ".hgignore"); tikhomirov@15: if (!hgignoreFile.exists()) { tikhomirov@15: return; tikhomirov@15: } tikhomirov@15: entries = new TreeSet(); tikhomirov@15: try { tikhomirov@15: BufferedReader fr = new BufferedReader(new FileReader(hgignoreFile)); tikhomirov@15: String line; tikhomirov@15: while ((line = fr.readLine()) != null) { tikhomirov@15: // FIXME need to detect syntax:glob and other parameters tikhomirov@15: entries.add(line.trim()); // shall I account for local paths in the file (i.e. back-slashed on windows)? tikhomirov@15: } tikhomirov@15: } catch (IOException ex) { tikhomirov@15: ex.printStackTrace(); // log warn tikhomirov@15: } tikhomirov@15: } tikhomirov@15: tikhomirov@15: public void reset() { tikhomirov@15: // FIXME does anyone really need to clear HgIgnore? Perhaps, repo may return new instance each time, tikhomirov@15: // which is used throughout invocation and then discarded? tikhomirov@15: entries = null; tikhomirov@15: } tikhomirov@15: tikhomirov@15: public boolean isIgnored(String path) { tikhomirov@15: if (entries == null) { tikhomirov@15: read(); tikhomirov@15: } tikhomirov@15: if (entries.contains(path)) { tikhomirov@15: // easy part tikhomirov@15: return true; tikhomirov@15: } tikhomirov@15: // substrings are memory-friendly tikhomirov@15: int x = 0, i = path.indexOf('/', 0); tikhomirov@15: while (i != -1) { tikhomirov@15: if (entries.contains(path.substring(x, i))) { tikhomirov@15: return true; tikhomirov@15: } tikhomirov@15: // try one with ending slash tikhomirov@15: if (entries.contains(path.substring(x, i+1))) { // even if i is last index, i+1 is safe here tikhomirov@15: return true; tikhomirov@15: } tikhomirov@15: x = i+1; tikhomirov@15: i = path.indexOf('/', x); tikhomirov@15: } tikhomirov@15: return false; tikhomirov@15: } tikhomirov@15: }