Mercurial > hg4j
annotate src/org/tmatesoft/hg/repo/HgStatusCollector.java @ 691:72fc7774b87e
Fix file.isCopy() for blame/annotate. Refactor status and blame to use newly introduced FileHistory helper that builds file rename history
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Fri, 02 Aug 2013 23:07:23 +0200 | 
| parents | b286222158be | 
| children | 7efabe0cddcf | 
| rev | line source | 
|---|---|
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
1 /* | 
| 
455
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
2 * Copyright (c) 2011-2012 TMate Software Ltd | 
| 
74
 
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 | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
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; | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
18 | 
| 
403
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
19 import static org.tmatesoft.hg.repo.HgRepository.*; | 
| 
68
 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
64 
diff
changeset
 | 
20 | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
21 import java.util.Collection; | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
22 import java.util.Collections; | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
23 import java.util.LinkedHashMap; | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
24 import java.util.LinkedList; | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
25 import java.util.List; | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
26 import java.util.Map; | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
27 import java.util.TreeSet; | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
28 | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
29 import org.tmatesoft.hg.core.Nodeid; | 
| 
691
 
72fc7774b87e
Fix file.isCopy() for blame/annotate. Refactor status and blame to use newly introduced FileHistory helper that builds file rename history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
690 
diff
changeset
 | 
30 import org.tmatesoft.hg.internal.FileRenameHistory; | 
| 
 
72fc7774b87e
Fix file.isCopy() for blame/annotate. Refactor status and blame to use newly introduced FileHistory helper that builds file rename history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
690 
diff
changeset
 | 
31 import org.tmatesoft.hg.internal.FileRenameHistory.Chunk; | 
| 
281
 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
32 import org.tmatesoft.hg.internal.IntMap; | 
| 
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: 
229 
diff
changeset
 | 
33 import org.tmatesoft.hg.internal.ManifestRevision; | 
| 
195
 
c9b305df0b89
Optimization: use ParentWalker to get changeset's parents, if possible. Do not keep duplicating nodeids and strings in manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
34 import org.tmatesoft.hg.internal.Pool; | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
35 import org.tmatesoft.hg.util.CancelSupport; | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
36 import org.tmatesoft.hg.util.CancelledException; | 
| 
431
 
12f668401613
FIXMEs: awkward API refactored, what need to be internal got hidden; public aspects got captured in slim interfaces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
425 
diff
changeset
 | 
37 import org.tmatesoft.hg.util.Convertor; | 
| 
133
 
4a948ec83980
core.Path to util.Path as it's not Hg repo dependant
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
38 import org.tmatesoft.hg.util.Path; | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
39 | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
40 | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
41 /** | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
42 * Collect status information for changes between two repository revisions. | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
43 * | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
44 * @author Artem Tikhomirov | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
45 * @author TMate Software Ltd. | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
46 */ | 
| 
94
 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
93 
diff
changeset
 | 
47 public class HgStatusCollector { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
48 | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
49 private final HgRepository repo; | 
| 
281
 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
50 private final IntMap<ManifestRevision> cache; // sparse array, in fact | 
| 
195
 
c9b305df0b89
Optimization: use ParentWalker to get changeset's parents, if possible. Do not keep duplicating nodeids and strings in manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
51 // with cpython repository, ~70 000 changes, complete Log (direct out, no reverse) output | 
| 
 
c9b305df0b89
Optimization: use ParentWalker to get changeset's parents, if possible. Do not keep duplicating nodeids and strings in manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
52 // no cache limit, no nodeids and fname caching - OOME on changeset 1035 | 
| 
 
c9b305df0b89
Optimization: use ParentWalker to get changeset's parents, if possible. Do not keep duplicating nodeids and strings in manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
53 // no cache limit, but with cached nodeids and filenames - 1730+ | 
| 
 
c9b305df0b89
Optimization: use ParentWalker to get changeset's parents, if possible. Do not keep duplicating nodeids and strings in manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
54 // cache limit 100 - 19+ minutes to process 10000, and still working (too long, stopped) | 
| 
197
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
55 private final int cacheMaxSize = 50; // do not keep too much manifest revisions | 
| 
431
 
12f668401613
FIXMEs: awkward API refactored, what need to be internal got hidden; public aspects got captured in slim interfaces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
425 
diff
changeset
 | 
56 private Convertor<Path> pathPool; | 
| 
195
 
c9b305df0b89
Optimization: use ParentWalker to get changeset's parents, if possible. Do not keep duplicating nodeids and strings in manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
57 private final Pool<Nodeid> cacheNodes; | 
| 
285
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
58 private final Pool<Path> cacheFilenames; | 
| 
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: 
229 
diff
changeset
 | 
59 private final ManifestRevision emptyFakeState; | 
| 
229
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
60 private Path.Matcher scope = new Path.Matcher.Any(); | 
| 
455
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
61 // @see #detectCopies() | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
62 private boolean detectCopies = true; | 
| 
195
 
c9b305df0b89
Optimization: use ParentWalker to get changeset's parents, if possible. Do not keep duplicating nodeids and strings in manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
63 | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
64 | 
| 
94
 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
93 
diff
changeset
 | 
65 public HgStatusCollector(HgRepository hgRepo) { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
66 this.repo = hgRepo; | 
| 
281
 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
67 cache = new IntMap<ManifestRevision>(cacheMaxSize); | 
| 
195
 
c9b305df0b89
Optimization: use ParentWalker to get changeset's parents, if possible. Do not keep duplicating nodeids and strings in manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
68 cacheNodes = new Pool<Nodeid>(); | 
| 
285
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
69 cacheFilenames = new Pool<Path>(); | 
| 
197
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
70 | 
| 
284
 
7232b94f2ae3
HgDirstate shall operate with Path instead of String for file names. Use of Pair instead of array of unspecified length for parents.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
282 
diff
changeset
 | 
71 emptyFakeState = createEmptyManifestRevision(); | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
72 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
73 | 
| 
64
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
74 public HgRepository getRepo() { | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
75 return repo; | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
76 } | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
77 | 
| 
628
 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
471 
diff
changeset
 | 
78 private ManifestRevision get(int rev) throws HgRuntimeException { | 
| 
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: 
229 
diff
changeset
 | 
79 ManifestRevision i = cache.get(rev); | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
80 if (i == null) { | 
| 
405
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
81 if (rev == NO_REVISION) { | 
| 
197
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
82 return emptyFakeState; | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
83 } | 
| 
281
 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
84 ensureCacheSize(); | 
| 
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: 
229 
diff
changeset
 | 
85 i = new ManifestRevision(cacheNodes, cacheFilenames); | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
86 cache.put(rev, i); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
87 repo.getManifest().walk(rev, rev, i); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
88 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
89 return i; | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
90 } | 
| 
197
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
91 | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
92 private boolean cached(int revision) { | 
| 
405
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
93 return cache.containsKey(revision) || revision == NO_REVISION; | 
| 
197
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
94 } | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
95 | 
| 
281
 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
96 private void ensureCacheSize() { | 
| 
 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
97 if (cache.size() > cacheMaxSize) { | 
| 
 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
98 // assume usually we go from oldest to newest, hence remove oldest as most likely to be no longer necessary | 
| 
 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
99 cache.removeFromStart(cache.size() - cacheMaxSize + 1 /* room for new element */); | 
| 
 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
100 } | 
| 
 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
101 } | 
| 
 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
102 | 
| 
628
 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
471 
diff
changeset
 | 
103 private void initCacheRange(int minRev, int maxRev) throws HgRuntimeException { | 
| 
281
 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
248 
diff
changeset
 | 
104 ensureCacheSize(); | 
| 
302
 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
285 
diff
changeset
 | 
105 // In fact, walk(minRev, maxRev) doesn't imply | 
| 
 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
285 
diff
changeset
 | 
106 // there would be maxRev-minRev+1 revisions visited. For example, | 
| 
 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
285 
diff
changeset
 | 
107 // check cpython repo with 'hg log -r 22418:22420 --debug' and admire | 
| 
 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
285 
diff
changeset
 | 
108 // manifest revisions 66650, 21683, 21684. Thus, innocent walk(22418,22420) results in 40k+ revisions and OOME | 
| 
 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
285 
diff
changeset
 | 
109 // Instead, be explicit of what revisions are of interest | 
| 
 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
285 
diff
changeset
 | 
110 assert minRev <= maxRev; | 
| 
 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
285 
diff
changeset
 | 
111 int[] revisionsToCollect = new int[maxRev - minRev + 1]; | 
| 
 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
285 
diff
changeset
 | 
112 for (int x = minRev, i = 0; x <= maxRev; i++, x++) { | 
| 
 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
285 
diff
changeset
 | 
113 revisionsToCollect[i] = x; | 
| 
 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
285 
diff
changeset
 | 
114 } | 
| 
424
 
6437d261048a
Deprecated code removed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
423 
diff
changeset
 | 
115 repo.getManifest().walk(new HgManifest.Inspector() { | 
| 
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: 
229 
diff
changeset
 | 
116 private ManifestRevision delegate; | 
| 
197
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
117 private boolean cacheHit; // range may include revisions we already know about, do not re-create them | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
118 | 
| 
222
 
373e07cd3991
Due to discrepancy in manifest and changelor indexes, wrong manifest revisions got cached and compared
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
221 
diff
changeset
 | 
119 public boolean begin(int manifestRevision, Nodeid nid, int changelogRevision) { | 
| 
197
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
120 assert delegate == null; | 
| 
405
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
121 if (cache.containsKey(changelogRevision)) { // don't need to check emptyFakeState hit as revision never NO_REVISION here | 
| 
197
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
122 cacheHit = true; | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
123 } 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: 
229 
diff
changeset
 | 
124 cache.put(changelogRevision, delegate = new ManifestRevision(cacheNodes, cacheFilenames)); | 
| 
197
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
125 // cache may grow bigger than max size here, but it's ok as present simplistic cache clearing mechanism may | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
126 // otherwise remove entries we just added | 
| 
222
 
373e07cd3991
Due to discrepancy in manifest and changelor indexes, wrong manifest revisions got cached and compared
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
221 
diff
changeset
 | 
127 delegate.begin(manifestRevision, nid, changelogRevision); | 
| 
197
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
128 cacheHit = false; | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
129 } | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
130 return true; | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
131 } | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
132 | 
| 
285
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
133 public boolean next(Nodeid nid, Path fname, HgManifest.Flags flags) { | 
| 
197
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
134 if (!cacheHit) { | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
135 delegate.next(nid, fname, flags); | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
136 } | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
137 return true; | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
138 } | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
139 | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
140 public boolean end(int revision) { | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
141 if (!cacheHit) { | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
142 delegate.end(revision); | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
143 } | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
144 cacheHit = false; | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
145 delegate = null; | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
146 return true; | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
147 } | 
| 
302
 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
285 
diff
changeset
 | 
148 }, revisionsToCollect); | 
| 
197
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
149 } | 
| 
56
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
55 
diff
changeset
 | 
150 | 
| 
284
 
7232b94f2ae3
HgDirstate shall operate with Path instead of String for file names. Use of Pair instead of array of unspecified length for parents.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
282 
diff
changeset
 | 
151 /*package-local*/ static ManifestRevision createEmptyManifestRevision() { | 
| 
 
7232b94f2ae3
HgDirstate shall operate with Path instead of String for file names. Use of Pair instead of array of unspecified length for parents.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
282 
diff
changeset
 | 
152 ManifestRevision fakeEmptyRev = new ManifestRevision(null, null); | 
| 
405
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
153 fakeEmptyRev.begin(NO_REVISION, null, NO_REVISION); | 
| 
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
154 fakeEmptyRev.end(NO_REVISION); | 
| 
284
 
7232b94f2ae3
HgDirstate shall operate with Path instead of String for file names. Use of Pair instead of array of unspecified length for parents.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
282 
diff
changeset
 | 
155 return fakeEmptyRev; | 
| 
 
7232b94f2ae3
HgDirstate shall operate with Path instead of String for file names. Use of Pair instead of array of unspecified length for parents.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
282 
diff
changeset
 | 
156 } | 
| 
 
7232b94f2ae3
HgDirstate shall operate with Path instead of String for file names. Use of Pair instead of array of unspecified length for parents.
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
282 
diff
changeset
 | 
157 | 
| 
405
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
158 /** | 
| 
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
159 * Access specific manifest revision | 
| 
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
160 * @param rev | 
| 
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
161 * @return | 
| 
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
162 * @throws HgInvalidControlFileException | 
| 
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
163 */ | 
| 
628
 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
471 
diff
changeset
 | 
164 /*package-local*/ ManifestRevision raw(int rev) throws HgRuntimeException { | 
| 
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: 
56 
diff
changeset
 | 
165 return get(rev); | 
| 
 
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: 
56 
diff
changeset
 | 
166 } | 
| 
431
 
12f668401613
FIXMEs: awkward API refactored, what need to be internal got hidden; public aspects got captured in slim interfaces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
425 
diff
changeset
 | 
167 /*package-local*/ Convertor<Path> getPathPool() { | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
168 if (pathPool == null) { | 
| 
431
 
12f668401613
FIXMEs: awkward API refactored, what need to be internal got hidden; public aspects got captured in slim interfaces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
425 
diff
changeset
 | 
169 pathPool = cacheFilenames; | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
170 } | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
171 return pathPool; | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
172 } | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
173 | 
| 
142
 
37a34044e6bd
More reasonable use of path normalizer and path.source
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
141 
diff
changeset
 | 
174 /** | 
| 
 
37a34044e6bd
More reasonable use of path normalizer and path.source
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
141 
diff
changeset
 | 
175 * Allows sharing of a common path cache | 
| 
 
37a34044e6bd
More reasonable use of path normalizer and path.source
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
141 
diff
changeset
 | 
176 */ | 
| 
431
 
12f668401613
FIXMEs: awkward API refactored, what need to be internal got hidden; public aspects got captured in slim interfaces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
425 
diff
changeset
 | 
177 public void setPathPool(Convertor<Path> pathConvertor) { | 
| 
 
12f668401613
FIXMEs: awkward API refactored, what need to be internal got hidden; public aspects got captured in slim interfaces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
425 
diff
changeset
 | 
178 pathPool = pathConvertor; | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
179 } | 
| 
229
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
180 | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
181 /** | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
182 * Limit activity of the collector to certain sub-tree of the repository. | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
183 * @param scopeMatcher tells whether collector shall report specific path, can be <code>null</code> | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
184 */ | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
185 public void setScope(Path.Matcher scopeMatcher) { | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
186 // do not assign null, ever | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
187 scope = scopeMatcher == null ? new Path.Matcher.Any() : scopeMatcher; | 
| 
 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
226 
diff
changeset
 | 
188 } | 
| 
455
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
189 | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
190 /** | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
191 * Select whether Collector shall tell "added-new" from "added-by-copy/rename" files. | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
192 * This is analogous to '-C' switch of 'hg status' command. | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
193 * | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
194 * <p>With copy detection turned off, files continue be reported as plain 'added' files. | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
195 * | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
196 * <p>By default, copy detection is <em>on</em>, as it's reasonably cheap. However, | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
197 * in certain scenarios it may be reasonable to turn it off, for example when it's a merge | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
198 * of two very different branches and there are a lot of files added/moved. | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
199 * | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
200 * Another legitimate reason to set detection to off if you're lazy to | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
201 * implement {@link HgStatusInspector#copied(Path, Path)} ;) | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
202 * | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
203 * @param detect <code>true</code> if copies detection is desirable | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
204 */ | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
205 public void detectCopies(boolean detect) { | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
206 // cpython, revision:72161, p1:72159, p2:72160 | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
207 // p2 comes from another branch with 321 file added (looks like copied/moved, however, the isCopy | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
208 // record present only for couple of them). With 2,5 ms per isCopy() operation, almost a second | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
209 // is spent detecting origins (according to Marc, of little use in this scenario, as it's second parent | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
210 // in the merge) - in fact, most of the time of the status operation | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
211 detectCopies = detect; | 
| 
 
281cfb60e2ef
Added option to turn detection of copied files off during status operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
367 
diff
changeset
 | 
212 } | 
| 
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: 
56 
diff
changeset
 | 
213 | 
| 
403
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
214 /** | 
| 
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
215 * 'hg status --change REV' command counterpart. | 
| 
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
216 * | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
217 * @throws CancelledException if operation execution was cancelled | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
218 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 
403
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
219 */ | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
220 public void change(int revisionIndex, HgStatusInspector inspector) throws CancelledException, HgRuntimeException { | 
| 
405
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
221 int p; | 
| 
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
222 if (revisionIndex == 0) { | 
| 
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
223 p = NO_REVISION; | 
| 
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
224 } else { | 
| 
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
225 int[] parents = new int[2]; | 
| 
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
226 repo.getChangelog().parents(revisionIndex, parents, null, null); | 
| 
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
227 // #parents call above is responsible for NO_REVISION | 
| 
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
228 p = parents[0]; // hg --change alsways uses first parent, despite the fact there might be valid (-1, 18) pair of parents | 
| 
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
229 } | 
| 
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
230 walk(p, revisionIndex, inspector); | 
| 
56
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
55 
diff
changeset
 | 
231 } | 
| 
197
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
232 | 
| 
403
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
233 /** | 
| 
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
234 * Parameters <b>rev1</b> and <b>rev2</b> are changelog revision indexes, shall not be the same. Argument order matters. | 
| 
405
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
235 * Either rev1 or rev2 may be {@link HgRepository#NO_REVISION} to indicate comparison to empty repository | 
| 
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
236 * | 
| 
403
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
237 * @param rev1 <em>from</em> changeset index, non-negative or {@link HgRepository#TIP} | 
| 
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
238 * @param rev2 <em>to</em> changeset index, non-negative or {@link HgRepository#TIP} | 
| 
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
239 * @param inspector callback for status information | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
240 * @throws CancelledException if operation execution was cancelled | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
241 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 
403
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
242 * @throws IllegalArgumentException inspector other incorrect argument values | 
| 
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
243 */ | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
244 public void walk(int rev1, int rev2, HgStatusInspector inspector) throws CancelledException, HgRuntimeException, IllegalArgumentException { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
245 if (rev1 == rev2) { | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
246 throw new IllegalArgumentException(); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
247 } | 
| 
64
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
248 if (inspector == null) { | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
249 throw new IllegalArgumentException(); | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
250 } | 
| 
403
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
251 final int lastChangelogRevision = repo.getChangelog().getLastRevision(); | 
| 
68
 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
64 
diff
changeset
 | 
252 if (rev1 == TIP) { | 
| 
403
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
253 rev1 = lastChangelogRevision; | 
| 
68
 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
64 
diff
changeset
 | 
254 } | 
| 
 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
64 
diff
changeset
 | 
255 if (rev2 == TIP) { | 
| 
403
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
256 rev2 = lastChangelogRevision; | 
| 
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
257 } | 
| 
405
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
258 if (rev1 != NO_REVISION && (HgInternals.wrongRevisionIndex(rev1) || rev1 == WORKING_COPY || rev1 == BAD_REVISION || rev1 > lastChangelogRevision)) { | 
| 
403
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
259 throw new HgInvalidRevisionException(rev1); | 
| 
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
260 } | 
| 
405
 
866fc3b597a0
Add an explicit constant instead of -1 to indicate 'no revision' case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
403 
diff
changeset
 | 
261 if (rev2 != NO_REVISION && (HgInternals.wrongRevisionIndex(rev2) || rev2 == WORKING_COPY || rev2 == BAD_REVISION || rev2 > lastChangelogRevision)) { | 
| 
403
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
262 throw new HgInvalidRevisionException(rev2); | 
| 
68
 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
64 
diff
changeset
 | 
263 } | 
| 
282
 
e51dd9a14b6f
Yet another WC status fix, where dirstate parent and base revision are treated right (dirstate parent other than tip and explicit baseRevision are not the same)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
281 
diff
changeset
 | 
264 if (inspector instanceof Record) { | 
| 
 
e51dd9a14b6f
Yet another WC status fix, where dirstate parent and base revision are treated right (dirstate parent other than tip and explicit baseRevision are not the same)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
281 
diff
changeset
 | 
265 ((Record) inspector).init(rev1, rev2, this); | 
| 
 
e51dd9a14b6f
Yet another WC status fix, where dirstate parent and base revision are treated right (dirstate parent other than tip and explicit baseRevision are not the same)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
281 
diff
changeset
 | 
266 } | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
267 // in fact, rev1 and rev2 are often next (or close) to each other, | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
268 // thus, we can optimize Manifest reads here (manifest.walk(rev1, rev2)) | 
| 
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: 
229 
diff
changeset
 | 
269 ManifestRevision r1, r2 ; | 
| 
197
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
270 boolean need1 = !cached(rev1), need2 = !cached(rev2); | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
271 if (need1 || need2) { | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
272 int minRev, maxRev; | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
273 if (need1 && need2 && Math.abs(rev1 - rev2) < 5 /*subjective equivalent of 'close enough'*/) { | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
274 minRev = rev1 < rev2 ? rev1 : rev2; | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
275 maxRev = minRev == rev1 ? rev2 : rev1; | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
276 if (minRev > 0) { | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
277 minRev--; // expand range a bit | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
278 } | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
279 initCacheRange(minRev, maxRev); | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
280 need1 = need2 = false; | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
281 } | 
| 
197
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
282 // either both unknown and far from each other, or just one of them. | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
283 // read with neighbors to save potential subsequent calls for neighboring elements | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
284 // XXX perhaps, if revlog.baseRevision is cheap, shall expand minRev up to baseRevision | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
285 // which going to be read anyway | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
286 if (need1) { | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
287 minRev = rev1; | 
| 
403
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
288 maxRev = rev1 < lastChangelogRevision-5 ? rev1+5 : lastChangelogRevision; | 
| 
197
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
289 initCacheRange(minRev, maxRev); | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
290 } | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
291 if (need2) { | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
292 minRev = rev2; | 
| 
403
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
293 maxRev = rev2 < lastChangelogRevision-5 ? rev2+5 : lastChangelogRevision; | 
| 
197
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
294 initCacheRange(minRev, maxRev); | 
| 
 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
195 
diff
changeset
 | 
295 } | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
296 } | 
| 
89
 
42bcb4bffd17
Refactored to simplify manifest collector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
88 
diff
changeset
 | 
297 r1 = get(rev1); | 
| 
 
42bcb4bffd17
Refactored to simplify manifest collector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
88 
diff
changeset
 | 
298 r2 = get(rev2); | 
| 
 
42bcb4bffd17
Refactored to simplify manifest collector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
88 
diff
changeset
 | 
299 | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
300 final CancelSupport cs = CancelSupport.Factory.get(inspector); | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
301 | 
| 
690
 
b286222158be
Fix file.isCopy() use for status and cat commands
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
689 
diff
changeset
 | 
302 | 
| 
 
b286222158be
Fix file.isCopy() use for status and cat commands
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
689 
diff
changeset
 | 
303 Collection<Path> allBaseFiles = r1.files(); | 
| 
 
b286222158be
Fix file.isCopy() use for status and cat commands
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
689 
diff
changeset
 | 
304 TreeSet<Path> r1Files = new TreeSet<Path>(allBaseFiles); | 
| 
285
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
305 for (Path r2fname : r2.files()) { | 
| 
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
306 if (!scope.accept(r2fname)) { | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
222 
diff
changeset
 | 
307 continue; | 
| 
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
222 
diff
changeset
 | 
308 } | 
| 
285
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
309 if (r1Files.remove(r2fname)) { | 
| 
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
310 Nodeid nidR1 = r1.nodeid(r2fname); | 
| 
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
311 Nodeid nidR2 = r2.nodeid(r2fname); | 
| 
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
312 HgManifest.Flags flagsR1 = r1.flags(r2fname); | 
| 
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
313 HgManifest.Flags flagsR2 = r2.flags(r2fname); | 
| 
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
314 if (nidR1.equals(nidR2) && flagsR2 == flagsR1) { | 
| 
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
315 inspector.clean(r2fname); | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
316 } else { | 
| 
285
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
317 inspector.modified(r2fname); | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
318 } | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
319 cs.checkCancelled(); | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
320 } else { | 
| 
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: 
142 
diff
changeset
 | 
321 try { | 
| 
285
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
322 Path copyTarget = r2fname; | 
| 
690
 
b286222158be
Fix file.isCopy() use for status and cat commands
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
689 
diff
changeset
 | 
323 Path copyOrigin = detectCopies ? getOriginIfCopy(repo, copyTarget, r2.nodeid(copyTarget), allBaseFiles, rev1) : 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: 
142 
diff
changeset
 | 
324 if (copyOrigin != null) { | 
| 
431
 
12f668401613
FIXMEs: awkward API refactored, what need to be internal got hidden; public aspects got captured in slim interfaces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
425 
diff
changeset
 | 
325 inspector.copied(getPathPool().mangle(copyOrigin) /*pipe through pool, just in case*/, copyTarget); | 
| 
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: 
142 
diff
changeset
 | 
326 } else { | 
| 
 
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: 
142 
diff
changeset
 | 
327 inspector.added(copyTarget); | 
| 
 
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: 
142 
diff
changeset
 | 
328 } | 
| 
425
 
48f993aa2f41
FIXMEs: exceptions, javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
424 
diff
changeset
 | 
329 } catch (HgInvalidFileException ex) { | 
| 
360
 
150500515714
Report non-critical errors during status operation to handler/inspector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
330 // record exception to a mediator and continue, | 
| 
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: 
142 
diff
changeset
 | 
331 // for a single file not to be irresolvable obstacle for a status operation | 
| 
360
 
150500515714
Report non-critical errors during status operation to handler/inspector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
332 inspector.invalid(r2fname, ex); | 
| 
88
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
333 } | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
334 cs.checkCancelled(); | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
335 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
336 } | 
| 
285
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
337 for (Path r1fname : r1Files) { | 
| 
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
338 if (scope.accept(r1fname)) { | 
| 
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
339 inspector.removed(r1fname); | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
340 cs.checkCancelled(); | 
| 
226
 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
222 
diff
changeset
 | 
341 } | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
342 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
343 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
344 | 
| 
403
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
345 /** | 
| 
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
346 * Collects status between two revisions, changes from <b>rev1</b> up to <b>rev2</b>. | 
| 
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
347 * | 
| 
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
348 * @param rev1 <em>from</em> changeset index | 
| 
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
349 * @param rev2 <em>to</em> changeset index | 
| 
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
350 * @return information object that describes change between the revisions | 
| 
628
 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
471 
diff
changeset
 | 
351 * @throws HgInvalidRevisionException if any supplied revision doesn't identify changeset revision. <em>Runtime exception</em> | 
| 
 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
471 
diff
changeset
 | 
352 * @throws HgInvalidControlFileException if failed to access revlog index/data entry. <em>Runtime exception</em> | 
| 
 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
471 
diff
changeset
 | 
353 * @throws HgRuntimeException subclass thereof to indicate other issues with the library. <em>Runtime exception</em> | 
| 
403
 
2747b0723867
FIXMEs: work on exceptions and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
396 
diff
changeset
 | 
354 */ | 
| 
628
 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
471 
diff
changeset
 | 
355 public Record status(int rev1, int rev2) throws HgRuntimeException { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
356 Record rv = new Record(); | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
357 try { | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
358 walk(rev1, rev2, rv); | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
359 } catch (CancelledException ex) { | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
360 // can't happen as long our Record class doesn't implement CancelSupport | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
361 HgInvalidStateException t = new HgInvalidStateException("Internal error"); | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
362 t.initCause(ex); | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
363 throw t; | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
364 } | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
365 return rv; | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
366 } | 
| 
90
 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
89 
diff
changeset
 | 
367 | 
| 
690
 
b286222158be
Fix file.isCopy() use for status and cat commands
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
689 
diff
changeset
 | 
368 // originals shall include all names known in base revision, not those not yet consumed | 
| 
 
b286222158be
Fix file.isCopy() use for status and cat commands
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
689 
diff
changeset
 | 
369 // see TestStatus#testDetectRenamesInNonFirstRev and log-renames test repository | 
| 
 
b286222158be
Fix file.isCopy() use for status and cat commands
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
689 
diff
changeset
 | 
370 // where a and d in r5 are compared to a and b in r1, while d is in fact descendant of original a, and a is original b (through c) | 
| 
689
 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
628 
diff
changeset
 | 
371 /*package-local*/static Path getOriginIfCopy(HgRepository hgRepo, Path fname, Nodeid fnameRev, Collection<Path> originals, int originalChangesetIndex) throws HgRuntimeException { | 
| 
90
 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
89 
diff
changeset
 | 
372 HgDataFile df = hgRepo.getFileNode(fname); | 
| 
320
 
678e326fd27c
Issue 15: Exception accessing oddly named file from history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
316 
diff
changeset
 | 
373 if (!df.exists()) { | 
| 
 
678e326fd27c
Issue 15: Exception accessing oddly named file from history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
316 
diff
changeset
 | 
374 String msg = String.format("Didn't find file '%s' in the repo. Perhaps, bad storage name conversion?", fname); | 
| 
689
 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
628 
diff
changeset
 | 
375 throw new HgInvalidFileException(msg, null).setFileName(fname).setRevisionIndex(originalChangesetIndex); | 
| 
320
 
678e326fd27c
Issue 15: Exception accessing oddly named file from history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
316 
diff
changeset
 | 
376 } | 
| 
689
 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
628 
diff
changeset
 | 
377 assert fnameRev != null; | 
| 
 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
628 
diff
changeset
 | 
378 assert !Nodeid.NULL.equals(fnameRev); | 
| 
 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
628 
diff
changeset
 | 
379 int fileRevIndex = fnameRev == null ? 0 : df.getRevisionIndex(fnameRev); | 
| 
691
 
72fc7774b87e
Fix file.isCopy() for blame/annotate. Refactor status and blame to use newly introduced FileHistory helper that builds file rename history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
690 
diff
changeset
 | 
380 FileRenameHistory frh = new FileRenameHistory(originalChangesetIndex, df.getChangesetRevisionIndex(fileRevIndex)); | 
| 
 
72fc7774b87e
Fix file.isCopy() for blame/annotate. Refactor status and blame to use newly introduced FileHistory helper that builds file rename history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
690 
diff
changeset
 | 
381 if (frh.isOutOfRange(df, fileRevIndex)) { | 
| 
 
72fc7774b87e
Fix file.isCopy() for blame/annotate. Refactor status and blame to use newly introduced FileHistory helper that builds file rename history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
690 
diff
changeset
 | 
382 return null; | 
| 
90
 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
89 
diff
changeset
 | 
383 } | 
| 
691
 
72fc7774b87e
Fix file.isCopy() for blame/annotate. Refactor status and blame to use newly introduced FileHistory helper that builds file rename history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
690 
diff
changeset
 | 
384 frh.build(df, fileRevIndex); | 
| 
 
72fc7774b87e
Fix file.isCopy() for blame/annotate. Refactor status and blame to use newly introduced FileHistory helper that builds file rename history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
690 
diff
changeset
 | 
385 Chunk c = frh.chunkAt(originalChangesetIndex); | 
| 
 
72fc7774b87e
Fix file.isCopy() for blame/annotate. Refactor status and blame to use newly introduced FileHistory helper that builds file rename history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
690 
diff
changeset
 | 
386 if (c == null) { | 
| 
 
72fc7774b87e
Fix file.isCopy() for blame/annotate. Refactor status and blame to use newly introduced FileHistory helper that builds file rename history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
690 
diff
changeset
 | 
387 // file rename history doesn't go deep up to changeset of interest | 
| 
 
72fc7774b87e
Fix file.isCopy() for blame/annotate. Refactor status and blame to use newly introduced FileHistory helper that builds file rename history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
690 
diff
changeset
 | 
388 return null; | 
| 
 
72fc7774b87e
Fix file.isCopy() for blame/annotate. Refactor status and blame to use newly introduced FileHistory helper that builds file rename history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
690 
diff
changeset
 | 
389 } | 
| 
 
72fc7774b87e
Fix file.isCopy() for blame/annotate. Refactor status and blame to use newly introduced FileHistory helper that builds file rename history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
690 
diff
changeset
 | 
390 Path nameAtOrigin = c.file().getPath(); | 
| 
 
72fc7774b87e
Fix file.isCopy() for blame/annotate. Refactor status and blame to use newly introduced FileHistory helper that builds file rename history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
690 
diff
changeset
 | 
391 if (originals.contains(nameAtOrigin)) { | 
| 
 
72fc7774b87e
Fix file.isCopy() for blame/annotate. Refactor status and blame to use newly introduced FileHistory helper that builds file rename history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
690 
diff
changeset
 | 
392 return nameAtOrigin; | 
| 
 
72fc7774b87e
Fix file.isCopy() for blame/annotate. Refactor status and blame to use newly introduced FileHistory helper that builds file rename history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
690 
diff
changeset
 | 
393 } | 
| 
 
72fc7774b87e
Fix file.isCopy() for blame/annotate. Refactor status and blame to use newly introduced FileHistory helper that builds file rename history
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
690 
diff
changeset
 | 
394 return null; | 
| 
90
 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
89 
diff
changeset
 | 
395 } | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
396 | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
397 // XXX for r1..r2 status, only modified, added, removed (and perhaps, clean) make sense | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
398 // XXX Need to specify whether copy targets are in added or not (@see Inspector#copied above) | 
| 
316
 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
303 
diff
changeset
 | 
399 /** | 
| 
 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
303 
diff
changeset
 | 
400 * Straightforward {@link HgStatusInspector} implementation that collects all status values. | 
| 
 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
303 
diff
changeset
 | 
401 * | 
| 
 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
303 
diff
changeset
 | 
402 * <p>Naturally, {@link Record Records} originating from {@link HgStatusCollector} would report only <em>modified, added, | 
| 
 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
303 
diff
changeset
 | 
403 * removed</em> and <em>clean</em> values, other are available only when using {@link Record} with {@link HgWorkingCopyStatusCollector}. | 
| 
 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
303 
diff
changeset
 | 
404 * | 
| 
 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
303 
diff
changeset
 | 
405 * <p>Note, this implementation records copied files as added, thus key values in {@link #getCopied()} map are subset of paths | 
| 
 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
303 
diff
changeset
 | 
406 * from {@link #getAdded()}. | 
| 
 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
303 
diff
changeset
 | 
407 */ | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
408 public static class Record implements HgStatusInspector { | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
405 
diff
changeset
 | 
409 // NOTE, shall not implement CancelSupport, or methods that use it and don't expect this exception shall be changed | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
410 private List<Path> modified, added, removed, clean, missing, unknown, ignored; | 
| 
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
411 private Map<Path, Path> copied; | 
| 
360
 
150500515714
Report non-critical errors during status operation to handler/inspector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
412 private Map<Path, Exception> failures; | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
413 | 
| 
64
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
414 private int startRev, endRev; | 
| 
94
 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
93 
diff
changeset
 | 
415 private HgStatusCollector statusHelper; | 
| 
64
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
416 | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
417 // XXX StatusCollector may additionally initialize Record instance to speed lookup of changed file revisions | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
418 // here I need access to ManifestRevisionInspector via #raw(). Perhaps, non-static class (to get | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
419 // implicit reference to StatusCollector) may be better? | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
420 // Since users may want to reuse Record instance we've once created (and initialized), we need to | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
421 // ensure functionality is correct for each/any call (#walk checks instanceof Record and fixes it up) | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
422 // Perhaps, distinct helper (sc.getRevisionHelper().nodeid(fname)) would be better, just not clear | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
423 // how to supply [start..end] values there easily | 
| 
94
 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
93 
diff
changeset
 | 
424 /*package-local*/void init(int startRevision, int endRevision, HgStatusCollector self) { | 
| 
64
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
425 startRev = startRevision; | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
426 endRev = endRevision; | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
427 statusHelper = self; | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
428 } | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
429 | 
| 
628
 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
471 
diff
changeset
 | 
430 public Nodeid nodeidBeforeChange(Path fname) throws HgRuntimeException { | 
| 
68
 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
64 
diff
changeset
 | 
431 if (statusHelper == null || startRev == BAD_REVISION) { | 
| 
 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
64 
diff
changeset
 | 
432 return null; | 
| 
 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
64 
diff
changeset
 | 
433 } | 
| 
64
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
434 if ((modified == null || !modified.contains(fname)) && (removed == null || !removed.contains(fname))) { | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
435 return null; | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
436 } | 
| 
285
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
437 return statusHelper.raw(startRev).nodeid(fname); | 
| 
64
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
438 } | 
| 
628
 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
471 
diff
changeset
 | 
439 public Nodeid nodeidAfterChange(Path fname) throws HgRuntimeException { | 
| 
68
 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
64 
diff
changeset
 | 
440 if (statusHelper == null || endRev == BAD_REVISION) { | 
| 
 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
64 
diff
changeset
 | 
441 return null; | 
| 
 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
64 
diff
changeset
 | 
442 } | 
| 
64
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
443 if ((modified == null || !modified.contains(fname)) && (added == null || !added.contains(fname))) { | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
444 return null; | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
445 } | 
| 
285
 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
284 
diff
changeset
 | 
446 return statusHelper.raw(endRev).nodeid(fname); | 
| 
64
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
447 } | 
| 
 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
59 
diff
changeset
 | 
448 | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
449 public List<Path> getModified() { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
450 return proper(modified); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
451 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
452 | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
453 public List<Path> getAdded() { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
454 return proper(added); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
455 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
456 | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
457 public List<Path> getRemoved() { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
458 return proper(removed); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
459 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
460 | 
| 
316
 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
303 
diff
changeset
 | 
461 /** | 
| 
 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
303 
diff
changeset
 | 
462 * Map files from {@link #getAdded()} to their original filenames, if were copied/moved. | 
| 
 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
303 
diff
changeset
 | 
463 */ | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
464 public Map<Path,Path> getCopied() { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
465 if (copied == null) { | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
466 return Collections.emptyMap(); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
467 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
468 return Collections.unmodifiableMap(copied); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
469 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
470 | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
471 public List<Path> getClean() { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
472 return proper(clean); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
473 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
474 | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
475 public List<Path> getMissing() { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
476 return proper(missing); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
477 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
478 | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
479 public List<Path> getUnknown() { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
480 return proper(unknown); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
481 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
482 | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
483 public List<Path> getIgnored() { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
484 return proper(ignored); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
485 } | 
| 
360
 
150500515714
Report non-critical errors during status operation to handler/inspector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
486 | 
| 
 
150500515714
Report non-critical errors during status operation to handler/inspector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
487 public Map<Path, Exception> getInvalid() { | 
| 
 
150500515714
Report non-critical errors during status operation to handler/inspector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
488 if (failures == null) { | 
| 
 
150500515714
Report non-critical errors during status operation to handler/inspector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
489 return Collections.emptyMap(); | 
| 
 
150500515714
Report non-critical errors during status operation to handler/inspector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
490 } | 
| 
 
150500515714
Report non-critical errors during status operation to handler/inspector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
491 return Collections.unmodifiableMap(failures); | 
| 
 
150500515714
Report non-critical errors during status operation to handler/inspector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
492 } | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
493 | 
| 
316
 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
303 
diff
changeset
 | 
494 private static List<Path> proper(List<Path> l) { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
495 if (l == null) { | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
496 return Collections.emptyList(); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
497 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
498 return Collections.unmodifiableList(l); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
499 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
500 | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
501 // | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
502 // | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
503 | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
504 public void modified(Path fname) { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
505 modified = doAdd(modified, fname); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
506 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
507 | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
508 public void added(Path fname) { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
509 added = doAdd(added, fname); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
510 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
511 | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
512 public void copied(Path fnameOrigin, Path fnameAdded) { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
513 if (copied == null) { | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
514 copied = new LinkedHashMap<Path, Path>(); | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
515 } | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
516 added(fnameAdded); | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
68 
diff
changeset
 | 
517 copied.put(fnameAdded, fnameOrigin); | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
518 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
519 | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
520 public void removed(Path fname) { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
521 removed = doAdd(removed, fname); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
522 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
523 | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
524 public void clean(Path fname) { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
525 clean = doAdd(clean, fname); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
526 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
527 | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
528 public void missing(Path fname) { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
529 missing = doAdd(missing, fname); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
530 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
531 | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
532 public void unknown(Path fname) { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
533 unknown = doAdd(unknown, fname); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
534 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
535 | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
536 public void ignored(Path fname) { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
537 ignored = doAdd(ignored, fname); | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
538 } | 
| 
360
 
150500515714
Report non-critical errors during status operation to handler/inspector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
539 | 
| 
 
150500515714
Report non-critical errors during status operation to handler/inspector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
540 public void invalid(Path fname, Exception ex) { | 
| 
 
150500515714
Report non-critical errors during status operation to handler/inspector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
541 if (failures == null) { | 
| 
 
150500515714
Report non-critical errors during status operation to handler/inspector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
542 failures = new LinkedHashMap<Path, Exception>(); | 
| 
 
150500515714
Report non-critical errors during status operation to handler/inspector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
543 } | 
| 
 
150500515714
Report non-critical errors during status operation to handler/inspector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
544 failures.put(fname, ex); | 
| 
 
150500515714
Report non-critical errors during status operation to handler/inspector
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
545 } | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
546 | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
547 private static List<Path> doAdd(List<Path> l, Path p) { | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
548 if (l == null) { | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
549 l = new LinkedList<Path>(); | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
550 } | 
| 
93
 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
90 
diff
changeset
 | 
551 l.add(p); | 
| 
55
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
552 return l; | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
553 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
554 } | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
555 | 
| 
 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
556 } | 
