Mercurial > hg4j
comparison src/com/tmate/hgkit/ll/HgIgnore.java @ 15:865bf07f381f
Basic hgignore handling
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Mon, 27 Dec 2010 00:50:02 +0100 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 14:442dc6ee647b | 15:865bf07f381f |
|---|---|
| 1 /* | |
| 2 * Copyright (c) 2010 Artem Tikhomirov | |
| 3 */ | |
| 4 package com.tmate.hgkit.ll; | |
| 5 | |
| 6 import java.io.BufferedReader; | |
| 7 import java.io.File; | |
| 8 import java.io.FileReader; | |
| 9 import java.io.IOException; | |
| 10 import java.util.Collections; | |
| 11 import java.util.Set; | |
| 12 import java.util.TreeSet; | |
| 13 | |
| 14 /** | |
| 15 * | |
| 16 * @author artem | |
| 17 */ | |
| 18 public class HgIgnore { | |
| 19 | |
| 20 private final LocalHgRepo repo; | |
| 21 private Set<String> entries; | |
| 22 | |
| 23 public HgIgnore(LocalHgRepo localRepo) { | |
| 24 this.repo = localRepo; | |
| 25 } | |
| 26 | |
| 27 private void read() { | |
| 28 entries = Collections.emptySet(); | |
| 29 File hgignoreFile = new File(repo.getRepositoryRoot().getParentFile(), ".hgignore"); | |
| 30 if (!hgignoreFile.exists()) { | |
| 31 return; | |
| 32 } | |
| 33 entries = new TreeSet<String>(); | |
| 34 try { | |
| 35 BufferedReader fr = new BufferedReader(new FileReader(hgignoreFile)); | |
| 36 String line; | |
| 37 while ((line = fr.readLine()) != null) { | |
| 38 // FIXME need to detect syntax:glob and other parameters | |
| 39 entries.add(line.trim()); // shall I account for local paths in the file (i.e. back-slashed on windows)? | |
| 40 } | |
| 41 } catch (IOException ex) { | |
| 42 ex.printStackTrace(); // log warn | |
| 43 } | |
| 44 } | |
| 45 | |
| 46 public void reset() { | |
| 47 // FIXME does anyone really need to clear HgIgnore? Perhaps, repo may return new instance each time, | |
| 48 // which is used throughout invocation and then discarded? | |
| 49 entries = null; | |
| 50 } | |
| 51 | |
| 52 public boolean isIgnored(String path) { | |
| 53 if (entries == null) { | |
| 54 read(); | |
| 55 } | |
| 56 if (entries.contains(path)) { | |
| 57 // easy part | |
| 58 return true; | |
| 59 } | |
| 60 // substrings are memory-friendly | |
| 61 int x = 0, i = path.indexOf('/', 0); | |
| 62 while (i != -1) { | |
| 63 if (entries.contains(path.substring(x, i))) { | |
| 64 return true; | |
| 65 } | |
| 66 // try one with ending slash | |
| 67 if (entries.contains(path.substring(x, i+1))) { // even if i is last index, i+1 is safe here | |
| 68 return true; | |
| 69 } | |
| 70 x = i+1; | |
| 71 i = path.indexOf('/', x); | |
| 72 } | |
| 73 return false; | |
| 74 } | |
| 75 } |
