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 } | 
