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