Mercurial > jhg
annotate src/org/tmatesoft/hg/repo/HgWorkingCopyStatusCollector.java @ 280:35125450c804
Erroneous and slow status for working copies based on non-tip revision
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Fri, 02 Sep 2011 13:40:09 +0200 | 
| parents | 6d1804fe0ed7 | 
| children | e51dd9a14b6f | 
| rev | line source | 
|---|---|
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
1 /* | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
2 * Copyright (c) 2011 TMate Software Ltd | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
3 * | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
4 * This program is free software; you can redistribute it and/or modify | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
5 * it under the terms of the GNU General Public License as published by | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
6 * the Free Software Foundation; version 2 of the License. | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
7 * | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
8 * This program is distributed in the hope that it will be useful, | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
11 * GNU General Public License for more details. | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
12 * | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
13 * For information on how to redistribute this software under | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
14 * the terms of a license other than GNU General Public License | 
| 
102
 
a3a2e5deb320
Updated contact address to support@hg4j.com
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
94 
diff
changeset
 | 
15 * contact TMate Software at support@hg4j.com | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
16 */ | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
17 package org.tmatesoft.hg.repo; | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
18 | 
| 
120
 
b19f0ac5ee62
Check against working copy shall expect non-persistent modifications done by filters and not report such files as modified
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
117 
diff
changeset
 | 
19 import static java.lang.Math.max; | 
| 
117
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
20 import static java.lang.Math.min; | 
| 
218
 
047b1dec7a04
Issue 7: Correctly handle manifest and changelog with different number of (or non-matching) revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
21 import static org.tmatesoft.hg.repo.HgRepository.*; | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
22 | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
23 import java.io.File; | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
24 import java.io.FileInputStream; | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
25 import java.io.IOException; | 
| 
117
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
26 import java.nio.ByteBuffer; | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
27 import java.nio.channels.FileChannel; | 
| 
229
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
28 import java.util.ArrayList; | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
29 import java.util.Collections; | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
30 import java.util.NoSuchElementException; | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
31 import java.util.Set; | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
32 import java.util.TreeSet; | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
33 | 
| 
157
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
34 import org.tmatesoft.hg.core.HgDataStreamException; | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
35 import org.tmatesoft.hg.core.HgException; | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
36 import org.tmatesoft.hg.core.Nodeid; | 
| 
157
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
37 import org.tmatesoft.hg.internal.ByteArrayChannel; | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
38 import org.tmatesoft.hg.internal.Experimental; | 
| 
117
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
39 import org.tmatesoft.hg.internal.FilterByteChannel; | 
| 
248
 
3fbfce107f94
Issue 8: Means to find out information about given file at specific changeset. Inner ManifestRevisionInspector got promoted to ManifestRevision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
246 
diff
changeset
 | 
40 import org.tmatesoft.hg.internal.ManifestRevision; | 
| 
229
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
41 import org.tmatesoft.hg.internal.PathScope; | 
| 
117
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
42 import org.tmatesoft.hg.util.ByteChannel; | 
| 
157
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
43 import org.tmatesoft.hg.util.CancelledException; | 
| 
141
 
8248aae33f7d
Adopt FileIterator moving towards WCStatusCollector parameterizing. Improved path handling, move 'em around
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
133 
diff
changeset
 | 
44 import org.tmatesoft.hg.util.FileIterator; | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
45 import org.tmatesoft.hg.util.FileWalker; | 
| 
133
 
4a948ec83980
core.Path to util.Path as it's not Hg repo dependant
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
120 
diff
changeset
 | 
46 import org.tmatesoft.hg.util.Path; | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
47 import org.tmatesoft.hg.util.PathPool; | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
48 import org.tmatesoft.hg.util.PathRewrite; | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
49 | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
50 /** | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
51 * | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
52 * @author Artem Tikhomirov | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
53 * @author TMate Software Ltd. | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
54 */ | 
| 
94
 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
93 
diff
changeset
 | 
55 public class HgWorkingCopyStatusCollector { | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
56 | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
57 private final HgRepository repo; | 
| 
141
 
8248aae33f7d
Adopt FileIterator moving towards WCStatusCollector parameterizing. Improved path handling, move 'em around
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
133 
diff
changeset
 | 
58 private final FileIterator repoWalker; | 
| 
59
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
59 private HgDirstate dirstate; | 
| 
94
 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
93 
diff
changeset
 | 
60 private HgStatusCollector baseRevisionCollector; | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
61 private PathPool pathPool; | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
62 | 
| 
94
 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
93 
diff
changeset
 | 
63 public HgWorkingCopyStatusCollector(HgRepository hgRepo) { | 
| 
229
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
64 this(hgRepo, new HgInternals(hgRepo).createWorkingDirWalker(null)); | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
65 } | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
66 | 
| 
229
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
67 // FIXME document cons | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
68 public HgWorkingCopyStatusCollector(HgRepository hgRepo, FileIterator hgRepoWalker) { | 
| 
218
 
047b1dec7a04
Issue 7: Correctly handle manifest and changelog with different number of (or non-matching) revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
69 repo = hgRepo; | 
| 
 
047b1dec7a04
Issue 7: Correctly handle manifest and changelog with different number of (or non-matching) revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
70 repoWalker = hgRepoWalker; | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
71 } | 
| 
59
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
72 | 
| 
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
73 /** | 
| 
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
74 * Optionally, supply a collector instance that may cache (or have already cached) base revision | 
| 
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
75 * @param sc may be null | 
| 
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
76 */ | 
| 
94
 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
93 
diff
changeset
 | 
77 public void setBaseRevisionCollector(HgStatusCollector sc) { | 
| 
59
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
78 baseRevisionCollector = sc; | 
| 
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
79 } | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
80 | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
81 /*package-local*/ PathPool getPathPool() { | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
82 if (pathPool == null) { | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
83 if (baseRevisionCollector == null) { | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
84 pathPool = new PathPool(new PathRewrite.Empty()); | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
85 } else { | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
86 return baseRevisionCollector.getPathPool(); | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
87 } | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
88 } | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
89 return pathPool; | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
90 } | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
91 | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
92 public void setPathPool(PathPool pathPool) { | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
93 this.pathPool = pathPool; | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
94 } | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
95 | 
| 
59
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
96 | 
| 
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
97 private HgDirstate getDirstate() { | 
| 
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
98 if (dirstate == null) { | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
99 dirstate = repo.loadDirstate(); | 
| 
59
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
100 } | 
| 
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
101 return dirstate; | 
| 
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
102 } | 
| 
275
 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
103 | 
| 
59
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
104 // may be invoked few times | 
| 
275
 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
105 // NOTE, use of TIP constant requires certain care. TIP here doesn't mean latest cset, but actual working copy parent. | 
| 
 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
106 // XXX this shall be changed, though, and use of TIP throughout code shall be revised - | 
| 
 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
107 // consider case when repository is updated to one of its previous revisions. TIP points to last change, but a lot of | 
| 
 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
108 // commands need to work with revision that is in dirstate now. | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
109 public void walk(int baseRevision, HgStatusInspector inspector) { | 
| 
218
 
047b1dec7a04
Issue 7: Correctly handle manifest and changelog with different number of (or non-matching) revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
110 if (HgInternals.wrongLocalRevision(baseRevision) || baseRevision == BAD_REVISION || baseRevision == WORKING_COPY) { | 
| 
 
047b1dec7a04
Issue 7: Correctly handle manifest and changelog with different number of (or non-matching) revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
111 throw new IllegalArgumentException(String.valueOf(baseRevision)); | 
| 
 
047b1dec7a04
Issue 7: Correctly handle manifest and changelog with different number of (or non-matching) revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
112 } | 
| 
91
 
c2ce1cfaeb9e
ignore file with regex and 'honest' glob support
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
113 final HgIgnore hgIgnore = repo.getIgnore(); | 
| 
59
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
114 TreeSet<String> knownEntries = getDirstate().all(); | 
| 
68
 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
63 
diff
changeset
 | 
115 if (baseRevision == TIP) { | 
| 
275
 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
116 // WC not necessarily points to TIP, but may be result of update to any previous revision. | 
| 
 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
117 // In such case, we need to compare local files not to their TIP content, but to specific version at the time of selected revision | 
| 
 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
118 Nodeid dirstateParentRev = getDirstate().parents()[0]; | 
| 
 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
119 Nodeid lastCsetRev = repo.getChangelog().getRevision(HgRepository.TIP); | 
| 
 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
120 if (lastCsetRev.equals(dirstateParentRev)) { | 
| 
 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
121 baseRevision = repo.getChangelog().getLastRevision(); | 
| 
 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
122 } else { | 
| 
 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
123 // can do it right away, but explicit check above might save few cycles (unless getLocalRevision(Nodeid) is effective) | 
| 
 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
124 baseRevision = repo.getChangelog().getLocalRevision(dirstateParentRev); | 
| 
 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
125 } | 
| 
68
 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
63 
diff
changeset
 | 
126 } | 
| 
275
 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
127 final boolean isTipBase = baseRevision == repo.getChangelog().getLastRevision(); | 
| 
248
 
3fbfce107f94
Issue 8: Means to find out information about given file at specific changeset. Inner ManifestRevisionInspector got promoted to ManifestRevision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
246 
diff
changeset
 | 
128 ManifestRevision collect = null; | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
129 Set<String> baseRevFiles = Collections.emptySet(); // files from base revision not affected by status calculation | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
130 if (!isTipBase) { | 
| 
59
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
131 if (baseRevisionCollector != null) { | 
| 
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
132 collect = baseRevisionCollector.raw(baseRevision); | 
| 
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
133 } else { | 
| 
248
 
3fbfce107f94
Issue 8: Means to find out information about given file at specific changeset. Inner ManifestRevisionInspector got promoted to ManifestRevision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
246 
diff
changeset
 | 
134 collect = new ManifestRevision(null, null); | 
| 
59
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
135 repo.getManifest().walk(baseRevision, baseRevision, collect); | 
| 
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
136 } | 
| 
89
 
42bcb4bffd17
Refactored to simplify manifest collector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
76 
diff
changeset
 | 
137 baseRevFiles = new TreeSet<String>(collect.files()); | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
138 } | 
| 
94
 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
93 
diff
changeset
 | 
139 if (inspector instanceof HgStatusCollector.Record) { | 
| 
 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
93 
diff
changeset
 | 
140 HgStatusCollector sc = baseRevisionCollector == null ? new HgStatusCollector(repo) : baseRevisionCollector; | 
| 
 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
93 
diff
changeset
 | 
141 ((HgStatusCollector.Record) inspector).init(baseRevision, BAD_REVISION, sc); | 
| 
68
 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
63 
diff
changeset
 | 
142 } | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
143 repoWalker.reset(); | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
144 final PathPool pp = getPathPool(); | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
145 while (repoWalker.hasNext()) { | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
146 repoWalker.next(); | 
| 
280
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
147 final Path fname = pp.path(repoWalker.name()); | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
148 File f = repoWalker.file(); | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
149 if (!f.exists()) { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
150 // file coming from iterator doesn't exist. | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
151 if (knownEntries.remove(fname.toString())) { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
152 if (getDirstate().checkRemoved(fname) == null) { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
153 inspector.missing(fname); | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
154 } else { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
155 inspector.removed(fname); | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
156 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
157 // do not report it as removed later | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
158 if (collect != null) { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
159 baseRevFiles.remove(fname.toString()); | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
160 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
161 } else { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
162 // chances are it was known in baseRevision. We may rely | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
163 // that later iteration over baseRevFiles leftovers would yield correct Removed, | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
164 // but it doesn't hurt to be explicit (provided we know fname *is* inScope of the FileIterator | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
165 if (collect != null && baseRevFiles.remove(fname.toString())) { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
166 inspector.removed(fname); | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
167 } else { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
168 // not sure I shall report such files (i.e. arbitrary name coming from FileIterator) | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
169 // as unknown. Command-line HG aborts "system can't find the file specified" | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
170 // in similar case (against wc), or just gives nothing if --change <rev> is specified. | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
171 // however, as it's unlikely to get unexisting files from FileIterator, and | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
172 // its better to see erroneous file status rather than not to see any (which is too easy | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
173 // to overlook), I think unknown() is reasonable approach here | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
174 inspector.unknown(fname); | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
175 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
176 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
177 continue; | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
178 } | 
| 
229
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
179 assert f.isFile(); | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
180 if (knownEntries.remove(fname.toString())) { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
181 // tracked file. | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
182 // modified, added, removed, clean | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
183 if (collect != null) { // need to check against base revision, not FS file | 
| 
90
 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
89 
diff
changeset
 | 
184 checkLocalStatusAgainstBaseRevision(baseRevFiles, collect, baseRevision, fname, f, inspector); | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
185 } else { | 
| 
59
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
186 checkLocalStatusAgainstFile(fname, f, inspector); | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
187 } | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
188 } else { | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
189 if (hgIgnore.isIgnored(fname)) { // hgignore shall be consulted only for non-tracked files | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
190 inspector.ignored(fname); | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
191 } else { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
192 inspector.unknown(fname); | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
193 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
194 // the file is not tracked. Even if it's known at baseRevision, we don't need to remove it | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
195 // from baseRevFiles, it might need to be reported as removed as well (cmdline client does | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
196 // yield two statuses for the same file) | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
197 } | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
198 } | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
199 if (collect != null) { | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
200 for (String r : baseRevFiles) { | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
201 final Path fromBase = pp.path(r); | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
202 if (repoWalker.inScope(fromBase)) { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
203 inspector.removed(fromBase); | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
204 } | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
205 } | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
206 } | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
207 for (String m : knownEntries) { | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
208 if (!repoWalker.inScope(pp.path(m))) { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
209 // do not report as missing/removed those FileIterator doesn't care about. | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
210 continue; | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
211 } | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
212 // missing known file from a working dir | 
| 
59
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
213 if (getDirstate().checkRemoved(m) == null) { | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
214 // not removed from the repository = 'deleted' | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
215 inspector.missing(pp.path(m)); | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
216 } else { | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
217 // removed from the repo | 
| 
76
 
658fa6b3a371
Fixed a defect when a file added and removed past some revision was reported as R for status against that rev
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
218 // if we check against non-tip revision, do not report files that were added past that revision and now removed. | 
| 
 
658fa6b3a371
Fixed a defect when a file added and removed past some revision was reported as R for status against that rev
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
219 if (collect == null || baseRevFiles.contains(m)) { | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
91 
diff
changeset
 | 
220 inspector.removed(pp.path(m)); | 
| 
76
 
658fa6b3a371
Fixed a defect when a file added and removed past some revision was reported as R for status against that rev
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
221 } | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
222 } | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
223 } | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
224 } | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
225 | 
| 
94
 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
93 
diff
changeset
 | 
226 public HgStatusCollector.Record status(int baseRevision) { | 
| 
 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
93 
diff
changeset
 | 
227 HgStatusCollector.Record rv = new HgStatusCollector.Record(); | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
228 walk(baseRevision, rv); | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
229 return rv; | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
230 } | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
231 | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
232 //******************************************** | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
233 | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
234 | 
| 
141
 
8248aae33f7d
Adopt FileIterator moving towards WCStatusCollector parameterizing. Improved path handling, move 'em around
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
133 
diff
changeset
 | 
235 private void checkLocalStatusAgainstFile(Path fname, File f, HgStatusInspector inspector) { | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
236 HgDirstate.Record r; | 
| 
59
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
237 if ((r = getDirstate().checkNormal(fname)) != null) { | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
238 // either clean or modified | 
| 
280
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
239 final boolean timestampEqual = getFileModificationTime(f) == r.time, sizeEqual = r.size == f.length(); | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
240 if (timestampEqual && sizeEqual) { | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
241 inspector.clean(fname); | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
242 } else if (!sizeEqual && r.size >= 0) { | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
243 inspector.modified(fname); | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
244 } else { | 
| 
280
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
245 // size is the same or unknown, and, perhaps, different timestamp | 
| 
120
 
b19f0ac5ee62
Check against working copy shall expect non-persistent modifications done by filters and not report such files as modified
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
117 
diff
changeset
 | 
246 // check actual content to avoid false modified files | 
| 
 
b19f0ac5ee62
Check against working copy shall expect non-persistent modifications done by filters and not report such files as modified
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
117 
diff
changeset
 | 
247 HgDataFile df = repo.getFileNode(fname); | 
| 
157
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
248 if (!areTheSame(f, df, HgRepository.TIP)) { | 
| 
120
 
b19f0ac5ee62
Check against working copy shall expect non-persistent modifications done by filters and not report such files as modified
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
117 
diff
changeset
 | 
249 inspector.modified(df.getPath()); | 
| 
180
 
42fe9a94b9d0
Report files as clean when no difference but timestamp found
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
250 } else { | 
| 
 
42fe9a94b9d0
Report files as clean when no difference but timestamp found
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
251 inspector.clean(df.getPath()); | 
| 
120
 
b19f0ac5ee62
Check against working copy shall expect non-persistent modifications done by filters and not report such files as modified
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
117 
diff
changeset
 | 
252 } | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
253 } | 
| 
59
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
254 } else if ((r = getDirstate().checkAdded(fname)) != null) { | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
255 if (r.name2 == null) { | 
| 
280
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
256 inspector.added(fname); | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
257 } else { | 
| 
280
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
258 inspector.copied(getPathPool().path(r.name2), fname); | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
259 } | 
| 
59
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
260 } else if ((r = getDirstate().checkRemoved(fname)) != null) { | 
| 
280
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
261 inspector.removed(fname); | 
| 
59
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
262 } else if ((r = getDirstate().checkMerged(fname)) != null) { | 
| 
280
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
263 inspector.modified(fname); | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
264 } | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
265 } | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
266 | 
| 
280
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
267 // return mtime analog, directly comparable to dirstate's mtime. | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
268 private static int getFileModificationTime(File f) { | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
269 return (int) (f.lastModified() / 1000); | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
270 } | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
271 | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
272 // XXX refactor checkLocalStatus methods in more OO way | 
| 
248
 
3fbfce107f94
Issue 8: Means to find out information about given file at specific changeset. Inner ManifestRevisionInspector got promoted to ManifestRevision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
246 
diff
changeset
 | 
273 private void checkLocalStatusAgainstBaseRevision(Set<String> baseRevNames, ManifestRevision collect, int baseRevision, Path fname, File f, HgStatusInspector inspector) { | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
274 // fname is in the dirstate, either Normal, Added, Removed or Merged | 
| 
141
 
8248aae33f7d
Adopt FileIterator moving towards WCStatusCollector parameterizing. Improved path handling, move 'em around
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
133 
diff
changeset
 | 
275 Nodeid nid1 = collect.nodeid(fname.toString()); | 
| 
 
8248aae33f7d
Adopt FileIterator moving towards WCStatusCollector parameterizing. Improved path handling, move 'em around
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
133 
diff
changeset
 | 
276 String flags = collect.flags(fname.toString()); | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
277 HgDirstate.Record r; | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
278 if (nid1 == null) { | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
279 // normal: added? | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
280 // added: not known at the time of baseRevision, shall report | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
281 // merged: was not known, report as added? | 
| 
90
 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
89 
diff
changeset
 | 
282 if ((r = getDirstate().checkNormal(fname)) != null) { | 
| 
157
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
283 try { | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
284 Path origin = HgStatusCollector.getOriginIfCopy(repo, fname, baseRevNames, baseRevision); | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
285 if (origin != null) { | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
286 inspector.copied(getPathPool().path(origin), fname); | 
| 
157
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
287 return; | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
288 } | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
289 } catch (HgDataStreamException ex) { | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
290 ex.printStackTrace(); | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
291 // FIXME report to a mediator, continue status collection | 
| 
90
 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
89 
diff
changeset
 | 
292 } | 
| 
 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
89 
diff
changeset
 | 
293 } else if ((r = getDirstate().checkAdded(fname)) != null) { | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
294 if (r.name2 != null && baseRevNames.contains(r.name2)) { | 
| 
90
 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
89 
diff
changeset
 | 
295 baseRevNames.remove(r.name2); // XXX surely I shall not report rename source as Removed? | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
296 inspector.copied(getPathPool().path(r.name2), fname); | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
297 return; | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
298 } | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
299 // fall-through, report as added | 
| 
59
 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
58 
diff
changeset
 | 
300 } else if (getDirstate().checkRemoved(fname) != null) { | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
301 // removed: removed file was not known at the time of baseRevision, and we should not report it as removed | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
302 return; | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
303 } | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
304 inspector.added(fname); | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
305 } else { | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
306 // was known; check whether clean or modified | 
| 
280
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
307 if ((r = getDirstate().checkNormal(fname)) != null) { | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
308 final boolean timestampEqual = getFileModificationTime(f) == r.time, sizeEqual = r.size == f.length(); | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
309 if (timestampEqual && sizeEqual) { | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
310 inspector.clean(fname); | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
311 baseRevNames.remove(fname.toString()); // consumed, processed, handled. | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
312 return; | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
313 } else if (!sizeEqual && r.size >= 0) { | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
314 inspector.modified(fname); | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
315 baseRevNames.remove(fname.toString()); // consumed, processed, handled. | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
316 return; | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
317 } | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
318 // otherwise, shall check actual content (size not the same, or unknown (-1 or -2), or timestamp is different) | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
319 // FALL THROUGH | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
320 } | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
321 if (r != null /*Normal dirstate, but needs extra check*/ || (r = getDirstate().checkMerged(fname)) != null || (r = getDirstate().checkAdded(fname)) != null) { | 
| 
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
322 // when added - seems to be the case of a file added once again, hence need to check if content is different | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
323 // either clean or modified | 
| 
280
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
324 if (r.size != -1 /*XXX what about ==-2?*/&& r.size != f.length() || !todoCheckFlagsEqual(f, flags)) { | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
325 inspector.modified(fname); | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
326 } else { | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
327 // check actual content to see actual changes | 
| 
280
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
328 HgDataFile fileNode = repo.getFileNode(fname); | 
| 
157
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
329 if (areTheSame(f, fileNode, fileNode.getLocalRevision(nid1))) { | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
330 inspector.clean(fname); | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
331 } else { | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
332 inspector.modified(fname); | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
333 } | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
334 } | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
335 baseRevNames.remove(fname.toString()); // consumed, processed, handled. | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
336 } else if (getDirstate().checkRemoved(fname) != null) { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
337 // was known, and now marked as removed, report it right away, do not rely on baseRevNames processing later | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
338 inspector.removed(fname); | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
339 baseRevNames.remove(fname.toString()); // consumed, processed, handled. | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
340 } | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
341 // only those left in baseRevNames after processing are reported as removed | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
342 } | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
343 | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
344 // TODO think over if content comparison may be done more effectively by e.g. calculating nodeid for a local file and comparing it with nodeid from manifest | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
345 // we don't need to tell exact difference, hash should be enough to detect difference, and it doesn't involve reading historical file content, and it's relatively | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
346 // cheap to calc hash on a file (no need to keep it completely in memory). OTOH, if I'm right that the next approach is used for nodeids: | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
347 // changeset nodeid + hash(actual content) => entry (Nodeid) in the next Manifest | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
348 // then it's sufficient to check parents from dirstate, and if they do not match parents from file's baseRevision (non matching parents means different nodeids). | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
349 // The question is whether original Hg treats this case (same content, different parents and hence nodeids) as 'modified' or 'clean' | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
350 } | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
351 | 
| 
157
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
352 private boolean areTheSame(File f, HgDataFile dataFile, int localRevision) { | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
353 // XXX consider adding HgDataDile.compare(File/byte[]/whatever) operation to optimize comparison | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
354 ByteArrayChannel bac = new ByteArrayChannel(); | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
355 boolean ioFailed = false; | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
356 try { | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
357 // need content with metadata striped off - although theoretically chances are metadata may be different, | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
358 // WC doesn't have it anyway | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
359 dataFile.content(localRevision, bac); | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
360 } catch (CancelledException ex) { | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
361 // silently ignore - can't happen, ByteArrayChannel is not cancellable | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
362 } catch (HgException ex) { | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
363 ioFailed = true; | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
364 } | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
365 return !ioFailed && areTheSame(f, bac.toArray(), dataFile.getPath()); | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
366 } | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
148 
diff
changeset
 | 
367 | 
| 
117
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
368 private boolean areTheSame(File f, final byte[] data, Path p) { | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
369 FileInputStream fis = null; | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
370 try { | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
371 try { | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
372 fis = new FileInputStream(f); | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
373 FileChannel fc = fis.getChannel(); | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
374 ByteBuffer fb = ByteBuffer.allocate(min(1 + data.length * 2 /*to fit couple of lines appended; never zero*/, 8192)); | 
| 
219
 
d63583b47bfa
ArrayIndexOutOfBoundsException when file appended. Erroneous 'areTheSame' when trailing were deleted.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
218 
diff
changeset
 | 
375 class Check implements ByteChannel { | 
| 
 
d63583b47bfa
ArrayIndexOutOfBoundsException when file appended. Erroneous 'areTheSame' when trailing were deleted.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
218 
diff
changeset
 | 
376 final boolean debug = false; // XXX may want to add global variable to allow clients to turn | 
| 
 
d63583b47bfa
ArrayIndexOutOfBoundsException when file appended. Erroneous 'areTheSame' when trailing were deleted.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
218 
diff
changeset
 | 
377 boolean sameSoFar = true; | 
| 
117
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
378 int x = 0; | 
| 
219
 
d63583b47bfa
ArrayIndexOutOfBoundsException when file appended. Erroneous 'areTheSame' when trailing were deleted.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
218 
diff
changeset
 | 
379 | 
| 
148
 
1a7a9a20e1f9
Exceptions, javadoc. Initial cancel and progress support
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
142 
diff
changeset
 | 
380 public int write(ByteBuffer buffer) { | 
| 
117
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
381 for (int i = buffer.remaining(); i > 0; i--, x++) { | 
| 
219
 
d63583b47bfa
ArrayIndexOutOfBoundsException when file appended. Erroneous 'areTheSame' when trailing were deleted.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
218 
diff
changeset
 | 
382 if (x >= data.length /*file has been appended*/ || data[x] != buffer.get()) { | 
| 
120
 
b19f0ac5ee62
Check against working copy shall expect non-persistent modifications done by filters and not report such files as modified
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
117 
diff
changeset
 | 
383 if (debug) { | 
| 
 
b19f0ac5ee62
Check against working copy shall expect non-persistent modifications done by filters and not report such files as modified
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
117 
diff
changeset
 | 
384 byte[] xx = new byte[15]; | 
| 
 
b19f0ac5ee62
Check against working copy shall expect non-persistent modifications done by filters and not report such files as modified
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
117 
diff
changeset
 | 
385 if (buffer.position() > 5) { | 
| 
 
b19f0ac5ee62
Check against working copy shall expect non-persistent modifications done by filters and not report such files as modified
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
117 
diff
changeset
 | 
386 buffer.position(buffer.position() - 5); | 
| 
 
b19f0ac5ee62
Check against working copy shall expect non-persistent modifications done by filters and not report such files as modified
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
117 
diff
changeset
 | 
387 } | 
| 
 
b19f0ac5ee62
Check against working copy shall expect non-persistent modifications done by filters and not report such files as modified
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
117 
diff
changeset
 | 
388 buffer.get(xx); | 
| 
 
b19f0ac5ee62
Check against working copy shall expect non-persistent modifications done by filters and not report such files as modified
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
117 
diff
changeset
 | 
389 System.out.print("expected >>" + new String(data, max(0, x - 4), 20) + "<< but got >>"); | 
| 
 
b19f0ac5ee62
Check against working copy shall expect non-persistent modifications done by filters and not report such files as modified
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
117 
diff
changeset
 | 
390 System.out.println(new String(xx) + "<<"); | 
| 
 
b19f0ac5ee62
Check against working copy shall expect non-persistent modifications done by filters and not report such files as modified
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
117 
diff
changeset
 | 
391 } | 
| 
219
 
d63583b47bfa
ArrayIndexOutOfBoundsException when file appended. Erroneous 'areTheSame' when trailing were deleted.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
218 
diff
changeset
 | 
392 sameSoFar = false; | 
| 
117
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
393 break; | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
394 } | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
395 } | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
396 buffer.position(buffer.limit()); // mark as read | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
397 return buffer.limit(); | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
398 } | 
| 
219
 
d63583b47bfa
ArrayIndexOutOfBoundsException when file appended. Erroneous 'areTheSame' when trailing were deleted.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
218 
diff
changeset
 | 
399 | 
| 
 
d63583b47bfa
ArrayIndexOutOfBoundsException when file appended. Erroneous 'areTheSame' when trailing were deleted.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
218 
diff
changeset
 | 
400 public boolean sameSoFar() { | 
| 
 
d63583b47bfa
ArrayIndexOutOfBoundsException when file appended. Erroneous 'areTheSame' when trailing were deleted.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
218 
diff
changeset
 | 
401 return sameSoFar; | 
| 
 
d63583b47bfa
ArrayIndexOutOfBoundsException when file appended. Erroneous 'areTheSame' when trailing were deleted.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
218 
diff
changeset
 | 
402 } | 
| 
 
d63583b47bfa
ArrayIndexOutOfBoundsException when file appended. Erroneous 'areTheSame' when trailing were deleted.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
218 
diff
changeset
 | 
403 public boolean ultimatelyTheSame() { | 
| 
 
d63583b47bfa
ArrayIndexOutOfBoundsException when file appended. Erroneous 'areTheSame' when trailing were deleted.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
218 
diff
changeset
 | 
404 return sameSoFar && x == data.length; | 
| 
 
d63583b47bfa
ArrayIndexOutOfBoundsException when file appended. Erroneous 'areTheSame' when trailing were deleted.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
218 
diff
changeset
 | 
405 } | 
| 
117
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
406 }; | 
| 
219
 
d63583b47bfa
ArrayIndexOutOfBoundsException when file appended. Erroneous 'areTheSame' when trailing were deleted.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
218 
diff
changeset
 | 
407 Check check = new Check(); | 
| 
117
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
408 FilterByteChannel filters = new FilterByteChannel(check, repo.getFiltersFromWorkingDirToRepo(p)); | 
| 
219
 
d63583b47bfa
ArrayIndexOutOfBoundsException when file appended. Erroneous 'areTheSame' when trailing were deleted.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
218 
diff
changeset
 | 
409 while (fc.read(fb) != -1 && check.sameSoFar()) { | 
| 
117
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
410 fb.flip(); | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
411 filters.write(fb); | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
412 fb.compact(); | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
413 } | 
| 
246
 
ff4fdbab4e2d
Close file streams
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
238 
diff
changeset
 | 
414 fis.close(); | 
| 
219
 
d63583b47bfa
ArrayIndexOutOfBoundsException when file appended. Erroneous 'areTheSame' when trailing were deleted.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
218 
diff
changeset
 | 
415 return check.ultimatelyTheSame(); | 
| 
117
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
416 } catch (IOException ex) { | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
417 if (fis != null) { | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
418 fis.close(); | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
419 } | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
420 ex.printStackTrace(); // log warn | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
421 } | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
422 } catch (/*TODO typed*/Exception ex) { | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
423 ex.printStackTrace(); | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
424 } | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
425 return false; | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
426 } | 
| 
 
6c0be854d149
Enable filters for status operation (ToRepo case)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
427 | 
| 
280
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
428 private static boolean todoCheckFlagsEqual(File f, String manifestFlags) { | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
429 // FIXME implement | 
| 
280
 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
275 
diff
changeset
 | 
430 return true; | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
431 } | 
| 
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
432 | 
| 
229
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
433 /** | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
434 * Configure status collector to consider only subset of a working copy tree. Tries to be as effective as possible, and to | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
435 * traverse only relevant part of working copy on the filesystem. | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
436 * | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
437 * @param hgRepo repository | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
438 * @param paths repository-relative files and/or directories. Directories are processed recursively. | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
439 * | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
440 * @return new instance of {@link HgWorkingCopyStatusCollector}, ready to {@link #walk(int, HgStatusInspector) walk} associated working copy | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
441 */ | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
442 @Experimental(reason="Provisional API") | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
443 public static HgWorkingCopyStatusCollector create(HgRepository hgRepo, Path... paths) { | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
444 ArrayList<Path> f = new ArrayList<Path>(5); | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
445 ArrayList<Path> d = new ArrayList<Path>(5); | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
446 for (Path p : paths) { | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
447 if (p.isDirectory()) { | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
448 d.add(p); | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
449 } else { | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
450 f.add(p); | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
451 } | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
452 } | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
453 // final Path[] dirs = f.toArray(new Path[d.size()]); | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
454 if (d.isEmpty()) { | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
455 final Path[] files = f.toArray(new Path[f.size()]); | 
| 
237
 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
229 
diff
changeset
 | 
456 FileIterator fi = new FileListIterator(hgRepo.getWorkingDir(), files); | 
| 
229
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
457 return new HgWorkingCopyStatusCollector(hgRepo, fi); | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
458 } | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
459 // | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
460 | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
461 //FileIterator fi = file.isDirectory() ? new DirFileIterator(hgRepo, file) : new FileListIterator(, file); | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
462 FileIterator fi = new HgInternals(hgRepo).createWorkingDirWalker(new PathScope(true, paths)); | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
463 return new HgWorkingCopyStatusCollector(hgRepo, fi); | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
464 } | 
| 
229
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
465 | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
466 /** | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
467 * Configure collector object to calculate status for matching files only. | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
468 * This method may be less effective than explicit list of files as it iterates over whole repository | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
469 * (thus supplied matcher doesn't need to care if directories to files in question are also in scope, | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
470 * see {@link FileWalker#FileWalker(File, Path.Source, Path.Matcher)}) | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
471 * | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
472 * @return new instance of {@link HgWorkingCopyStatusCollector}, ready to {@link #walk(int, HgStatusInspector) walk} associated working copy | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
473 */ | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
474 @Experimental(reason="Provisional API. May add boolean strict argument for those who write smart matchers that can be used in FileWalker") | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
475 public static HgWorkingCopyStatusCollector create(HgRepository hgRepo, Path.Matcher scope) { | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
476 FileIterator w = new HgInternals(hgRepo).createWorkingDirWalker(null); | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
477 FileIterator wf = (scope == null || scope instanceof Path.Matcher.Any) ? w : new FileIteratorFilter(w, scope); | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
478 // the reason I need to iterate over full repo and apply filter is that I have no idea whatsoever about | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
479 // patterns in the scope. I.e. if scope lists a file (PathGlobMatcher("a/b/c.txt")), FileWalker won't get deep | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
480 // to the file unless matcher would also explicitly include "a/", "a/b/" in scope. Since I can't rely | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
481 // users would write robust matchers, and I don't see a decent way to enforce that (i.e. factory to produce | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
482 // correct matcher from Path is much like what PathScope does, and can be accessed directly with #create(repo, Path...) | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
483 // method above/ | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
484 return new HgWorkingCopyStatusCollector(hgRepo, wf); | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
485 } | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
486 | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
487 private static class FileListIterator implements FileIterator { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
488 private final File dir; | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
489 private final Path[] paths; | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
490 private int index; | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
491 private File nextFile; // cache file() in case it's called more than once | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
492 | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
493 public FileListIterator(File startDir, Path... files) { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
494 dir = startDir; | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
495 paths = files; | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
496 reset(); | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
497 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
498 | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
499 public void reset() { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
500 index = -1; | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
501 nextFile = null; | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
502 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
503 | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
504 public boolean hasNext() { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
505 return paths.length > 0 && index < paths.length-1; | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
506 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
507 | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
508 public void next() { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
509 index++; | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
510 if (index == paths.length) { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
511 throw new NoSuchElementException(); | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
512 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
513 nextFile = new File(dir, paths[index].toString()); | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
514 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
515 | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
516 public Path name() { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
517 return paths[index]; | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
518 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
519 | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
520 public File file() { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
521 return nextFile; | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
522 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
523 | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
524 public boolean inScope(Path file) { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
525 for (int i = 0; i < paths.length; i++) { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
526 if (paths[i].equals(file)) { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
527 return true; | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
528 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
529 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
530 return false; | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
531 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
532 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
533 | 
| 
229
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
534 private static class FileIteratorFilter implements FileIterator { | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
535 private final Path.Matcher filter; | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
536 private final FileIterator walker; | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
537 private boolean didNext = false; | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
538 | 
| 
229
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
539 public FileIteratorFilter(FileIterator fileWalker, Path.Matcher filterMatcher) { | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
540 assert fileWalker != null; | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
541 assert filterMatcher != null; | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
542 filter = filterMatcher; | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
543 walker = fileWalker; | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
544 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
545 | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
546 public void reset() { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
547 walker.reset(); | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
548 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
549 | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
550 public boolean hasNext() { | 
| 
229
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
551 while (walker.hasNext()) { | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
552 walker.next(); | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
553 if (filter.accept(walker.name())) { | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
554 didNext = true; | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
555 return true; | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
556 } | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
557 } | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
558 return false; | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
559 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
560 | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
561 public void next() { | 
| 
229
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
562 if (didNext) { | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
563 didNext = false; | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
564 } else { | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
565 if (!hasNext()) { | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
566 throw new NoSuchElementException(); | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
567 } | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
568 } | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
569 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
570 | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
571 public Path name() { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
572 return walker.name(); | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
573 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
574 | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
575 public File file() { | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
576 return walker.file(); | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
577 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
578 | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
579 public boolean inScope(Path file) { | 
| 
229
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
580 return filter.accept(file); | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
581 } | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
219 
diff
changeset
 | 
582 } | 
| 
58
 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
583 } | 
