Mercurial > jhg
diff src/org/tmatesoft/hg/internal/PathScope.java @ 229:1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Tue, 31 May 2011 05:23:07 +0200 |
parents | |
children | 072b5f3ed0c8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/tmatesoft/hg/internal/PathScope.java Tue May 31 05:23:07 2011 +0200 @@ -0,0 +1,84 @@ +/* + * Copyright (c) 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@hg4j.com + */ +package org.tmatesoft.hg.internal; + +import java.util.ArrayList; + +import org.tmatesoft.hg.util.Path; + +/** + * @author Artem Tikhomirov + * @author TMate Software Ltd. + */ +public class PathScope implements Path.Matcher { + private final Path[] files; + private final Path[] dirs; + private final boolean recursiveDirs; + + public PathScope(boolean recursiveDirs, Path... paths) { + if (paths == null) { + throw new IllegalArgumentException(); + } + this.recursiveDirs = recursiveDirs; + ArrayList<Path> f = new ArrayList<Path>(5); + ArrayList<Path> d = new ArrayList<Path>(5); + for (Path p : paths) { + if (p.isDirectory()) { + d.add(p); + } else { + f.add(p); + } + } + files = f.toArray(new Path[f.size()]); + dirs = d.toArray(new Path[d.size()]); + } + + public boolean accept(Path path) { + if (path.isDirectory()) { + // either equals to or parent of a directory we know about. + // If recursiveDirs, accept also if nested to one of our directories. + // If one of configured files is nested under the path, accept. + for (Path d : dirs) { + switch(d.compareWith(path)) { + case Same : return true; + case Nested : return true; + case Parent : return recursiveDirs; + } + } + for (Path f : files) { + if (f.compareWith(path) == Path.CompareResult.Nested) { + return true; + } + } + } else { + for (Path d : dirs) { + if (d.compareWith(path) == Path.CompareResult.Parent) { + return true; + } + } + for (Path f : files) { + if (f.equals(path)) { + return true; + } + } + // either lives in a directory in out scope + // or there's a file that matches the path + } + // TODO Auto-generated method stub + return false; + } +} \ No newline at end of file