view src/org/tmatesoft/hg/repo/HgIgnore.java @ 83:a5275143664c

Complete path hash calculation of fncache requirement
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Tue, 25 Jan 2011 22:44:14 +0100
parents 6f1b88693d48
children c2ce1cfaeb9e
line wrap: on
line source
/*
 * Copyright (c) 2010-2011 TMate Software Ltd
 *  
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * For information on how to redistribute this software under
 * the terms of a license other than GNU General Public License
 * contact TMate Software at support@svnkit.com
 */
package org.tmatesoft.hg.repo;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Collections;
import java.util.Set;
import java.util.TreeSet;

/**
 *
 * @author Artem Tikhomirov
 * @author TMate Software Ltd.
 */
public class HgIgnore {

	private final HgRepository repo;
	private Set<String> entries;

	public HgIgnore(HgRepository localRepo) {
		this.repo = localRepo;
	}

	private void read() {
		entries = Collections.emptySet();
		File hgignoreFile = new File(repo.getRepositoryRoot().getParentFile(), ".hgignore");
		if (!hgignoreFile.exists()) {
			return;
		}
		entries = new TreeSet<String>();
		try {
			BufferedReader fr = new BufferedReader(new FileReader(hgignoreFile));
			String line;
			while ((line = fr.readLine()) != null) {
				// FIXME need to detect syntax:glob and other parameters
				entries.add(line.trim()); // shall I account for local paths in the file (i.e. back-slashed on windows)?
			}
		} catch (IOException ex) {
			ex.printStackTrace(); // log warn
		}
	}

	public void reset() {
		// FIXME does anyone really need to clear HgIgnore? Perhaps, repo may return new instance each time,
		// which is used throughout invocation and then discarded?
		entries = null;
	}

	public boolean isIgnored(String path) {
		if (entries == null) {
			read();
		}
		if (entries.contains(path)) {
			// easy part
			return true;
		}
		// substrings are memory-friendly 
		int x = 0, i = path.indexOf('/', 0);
		while (i != -1) {
			if (entries.contains(path.substring(x, i))) {
				return true;
			}
			// try one with ending slash
			if (entries.contains(path.substring(x, i+1))) { // even if i is last index, i+1 is safe here
				return true;
			}
			x = i+1;
			i = path.indexOf('/', x);
		}
		return false;
	}
}