annotate src/org/tmatesoft/hg/repo/HgStatusCollector.java @ 690:b286222158be

Fix file.isCopy() use for status and cat commands
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Thu, 01 Aug 2013 21:45:47 +0200
parents 5050ee565bd1
children 72fc7774b87e
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
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
29 import org.tmatesoft.hg.core.HgFileRevision;
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
30 import org.tmatesoft.hg.core.Nodeid;
281
81e9a3c9bafe Utilize IntMap when caching manifest revisions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 248
diff changeset
31 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
32 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
33 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
34 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
35 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
36 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
37 import org.tmatesoft.hg.util.Path;
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
38
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
39
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
40 /**
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
41 * 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
42 *
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
43 * @author Artem Tikhomirov
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
44 * @author TMate Software Ltd.
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
45 */
94
af1f3b78b918 *StatusCollector renamed to Hg*StatusCollector
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 93
diff changeset
46 public class HgStatusCollector {
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
47
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
48 private final HgRepository repo;
281
81e9a3c9bafe Utilize IntMap when caching manifest revisions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 248
diff changeset
49 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
50 // 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
51 // 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
52 // 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
53 // 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
54 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
55 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
56 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
57 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
58 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
59 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
60 // @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
61 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
62
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
63
94
af1f3b78b918 *StatusCollector renamed to Hg*StatusCollector
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 93
diff changeset
64 public HgStatusCollector(HgRepository hgRepo) {
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
65 this.repo = hgRepo;
281
81e9a3c9bafe Utilize IntMap when caching manifest revisions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 248
diff changeset
66 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
67 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
68 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
69
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
70 emptyFakeState = createEmptyManifestRevision();
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
71 }
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
72
64
19e9e220bf68 Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 59
diff changeset
73 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
74 return repo;
19e9e220bf68 Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 59
diff changeset
75 }
19e9e220bf68 Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 59
diff changeset
76
628
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
77 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
78 ManifestRevision i = cache.get(rev);
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
79 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
80 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
81 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
82 }
281
81e9a3c9bafe Utilize IntMap when caching manifest revisions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 248
diff changeset
83 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
84 i = new ManifestRevision(cacheNodes, cacheFilenames);
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
85 cache.put(rev, i);
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
86 repo.getManifest().walk(rev, rev, i);
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
87 }
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
88 return i;
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
89 }
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
90
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 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
92 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
93 }
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
281
81e9a3c9bafe Utilize IntMap when caching manifest revisions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 248
diff changeset
95 private void ensureCacheSize() {
81e9a3c9bafe Utilize IntMap when caching manifest revisions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 248
diff changeset
96 if (cache.size() > cacheMaxSize) {
81e9a3c9bafe Utilize IntMap when caching manifest revisions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 248
diff changeset
97 // 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
98 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
99 }
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
628
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
102 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
103 ensureCacheSize();
302
a7a3395a519e Walk explicit revisions to avoid troubles with unnatural repositories
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 285
diff changeset
104 // 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
105 // 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
106 // 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
107 // 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
108 // 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
109 assert minRev <= maxRev;
a7a3395a519e Walk explicit revisions to avoid troubles with unnatural repositories
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 285
diff changeset
110 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
111 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
112 revisionsToCollect[i] = x;
a7a3395a519e Walk explicit revisions to avoid troubles with unnatural repositories
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 285
diff changeset
113 }
424
6437d261048a Deprecated code removed
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 423
diff changeset
114 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
115 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
116 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
117
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
118 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
119 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
120 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
121 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
122 } 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
123 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
124 // 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
125 // 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
126 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
127 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
128 }
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 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
130 }
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
285
6dbbc53fc46d Use Path instead of plain String for manifest file names
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 284
diff changeset
132 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
133 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
134 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
135 }
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 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
137 }
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 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
140 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
141 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
142 }
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 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
144 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
145 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
146 }
302
a7a3395a519e Walk explicit revisions to avoid troubles with unnatural repositories
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 285
diff changeset
147 }, 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
148 }
56
576d6e8a09f6 Analog of 'hg status --change' command
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 55
diff changeset
149
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
150 /*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
151 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
152 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
153 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
154 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
155 }
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
405
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
157 /**
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
158 * 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
159 * @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
160 * @return
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
161 * @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
162 */
628
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
163 /*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
164 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
165 }
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
166 /*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
167 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
168 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
169 }
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 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
171 }
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
142
37a34044e6bd More reasonable use of path normalizer and path.source
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 141
diff changeset
173 /**
37a34044e6bd More reasonable use of path normalizer and path.source
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 141
diff changeset
174 * 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
175 */
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
176 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
177 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
178 }
229
1ec6b327a6ac Scope for status reworked: explicit files or a general matcher
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 226
diff changeset
179
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 * 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
182 * @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
183 */
1ec6b327a6ac Scope for status reworked: explicit files or a general matcher
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 226
diff changeset
184 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
185 // 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
186 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
187 }
455
281cfb60e2ef Added option to turn detection of copied files off during status operation
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 367
diff changeset
188
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 * 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
191 * 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
192 *
281cfb60e2ef Added option to turn detection of copied files off during status operation
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 367
diff changeset
193 * <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
194 *
281cfb60e2ef Added option to turn detection of copied files off during status operation
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 367
diff changeset
195 * <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
196 * 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
197 * 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
198 *
281cfb60e2ef Added option to turn detection of copied files off during status operation
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 367
diff changeset
199 * 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
200 * 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
201 *
281cfb60e2ef Added option to turn detection of copied files off during status operation
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 367
diff changeset
202 * @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
203 */
281cfb60e2ef Added option to turn detection of copied files off during status operation
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 367
diff changeset
204 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
205 // 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
206 // 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
207 // 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
208 // 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
209 // 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
210 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
211 }
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
212
403
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
213 /**
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
214 * 'hg status --change REV' command counterpart.
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
215 *
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
216 * @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
217 * @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
218 */
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
219 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
220 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
221 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
222 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
223 } else {
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
224 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
225 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
226 // #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
227 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
228 }
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
229 walk(p, revisionIndex, inspector);
56
576d6e8a09f6 Analog of 'hg status --change' command
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 55
diff changeset
230 }
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
231
403
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
232 /**
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
233 * 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
234 * 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
235 *
403
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
236 * @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
237 * @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
238 * @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
239 * @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
240 * @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
241 * @throws IllegalArgumentException inspector other incorrect argument values
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
242 */
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
243 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
244 if (rev1 == rev2) {
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
245 throw new IllegalArgumentException();
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
246 }
64
19e9e220bf68 Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 59
diff changeset
247 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
248 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
249 }
403
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
250 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
251 if (rev1 == TIP) {
403
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
252 rev1 = lastChangelogRevision;
68
0e499fed9b3d StatusCommand with tests. Extra constants to indicate common revision cases
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 64
diff changeset
253 }
0e499fed9b3d StatusCommand with tests. Extra constants to indicate common revision cases
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 64
diff changeset
254 if (rev2 == TIP) {
403
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
255 rev2 = lastChangelogRevision;
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
256 }
405
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
257 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
258 throw new HgInvalidRevisionException(rev1);
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
259 }
405
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
260 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
261 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
262 }
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
263 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
264 ((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
265 }
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
266 // 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
267 // 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
268 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
269 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
270 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
271 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
272 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
273 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
274 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
275 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
276 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
277 }
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 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
279 need1 = need2 = false;
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
280 }
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
281 // 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
282 // 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
283 // 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
284 // 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
285 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
286 minRev = rev1;
403
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
287 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
288 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
289 }
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 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
291 minRev = rev2;
403
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
292 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
293 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
294 }
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
295 }
89
42bcb4bffd17 Refactored to simplify manifest collector
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 88
diff changeset
296 r1 = get(rev1);
42bcb4bffd17 Refactored to simplify manifest collector
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 88
diff changeset
297 r2 = get(rev2);
42bcb4bffd17 Refactored to simplify manifest collector
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 88
diff changeset
298
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
299 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
300
690
b286222158be Fix file.isCopy() use for status and cat commands
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 689
diff changeset
301
b286222158be Fix file.isCopy() use for status and cat commands
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 689
diff changeset
302 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
303 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
304 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
305 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
306 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
307 }
285
6dbbc53fc46d Use Path instead of plain String for manifest file names
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 284
diff changeset
308 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
309 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
310 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
311 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
312 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
313 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
314 inspector.clean(r2fname);
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
315 } else {
285
6dbbc53fc46d Use Path instead of plain String for manifest file names
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 284
diff changeset
316 inspector.modified(r2fname);
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
317 }
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
318 cs.checkCancelled();
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
319 } 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
320 try {
285
6dbbc53fc46d Use Path instead of plain String for manifest file names
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 284
diff changeset
321 Path copyTarget = r2fname;
690
b286222158be Fix file.isCopy() use for status and cat commands
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 689
diff changeset
322 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
323 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
324 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
325 } 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
326 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
327 }
425
48f993aa2f41 FIXMEs: exceptions, javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 424
diff changeset
328 } 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
329 // 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
330 // 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
331 inspector.invalid(r2fname, ex);
88
61eedab3eb3e Status between two revisions to recognize copy/rename
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 74
diff changeset
332 }
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
333 cs.checkCancelled();
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
334 }
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
335 }
285
6dbbc53fc46d Use Path instead of plain String for manifest file names
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 284
diff changeset
336 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
337 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
338 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
339 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
340 }
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
341 }
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
403
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
344 /**
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
345 * 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
346 *
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
347 * @param rev1 <em>from</em> changeset index
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
348 * @param rev2 <em>to</em> changeset index
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
349 * @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
350 * @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
351 * @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
352 * @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
353 */
628
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
354 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
355 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
356 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
357 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
358 } 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
359 // 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
360 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
361 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
362 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
363 }
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
364 return rv;
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
365 }
90
a95c700408a9 Correctly report copy/rename events for rev..working copy case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 89
diff changeset
366
690
b286222158be Fix file.isCopy() use for status and cat commands
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 689
diff changeset
367 // 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
368 // 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
369 // 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
370 /*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
371 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
372 if (!df.exists()) {
678e326fd27c Issue 15: Exception accessing oddly named file from history
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
373 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
374 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
375 }
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
376 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
377 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
378 int fileRevIndex = fnameRev == null ? 0 : df.getRevisionIndex(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 Path lastOriginFound = 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
380 while(fileRevIndex >=0) {
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
381 if (!df.isCopy(fileRevIndex)) {
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
382 fileRevIndex--;
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
383 continue;
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
384 }
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
385 int csetRevIndex = df.getChangesetRevisionIndex(fileRevIndex);
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
386 if (csetRevIndex <= originalChangesetIndex) {
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
387 // we've walked past originalChangelogRevIndex and no chances we'll find origin
690
b286222158be Fix file.isCopy() use for status and cat commands
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 689
diff changeset
388 // if we get here, it means either fname's origin is not from the base revision
b286222158be Fix file.isCopy() use for status and cat commands
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 689
diff changeset
389 // or the last found rename is still valid
b286222158be Fix file.isCopy() use for status and cat commands
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 689
diff changeset
390 return lastOriginFound;
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
391 }
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
392 HgFileRevision origin = df.getCopySource(fileRevIndex);
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
393 // prepare for the next step, df(copyFromFileRev) would point to copy origin and its revision
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
394 df = hgRepo.getFileNode(origin.getPath());
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
395 int copyFromFileRevIndex = df.getRevisionIndex(origin.getRevision());
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
396 if (originals.contains(origin.getPath())) {
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
397 int copyFromCsetIndex = df.getChangesetRevisionIndex(copyFromFileRevIndex);
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
398 if (copyFromCsetIndex <= originalChangesetIndex) {
90
a95c700408a9 Correctly report copy/rename events for rev..working copy case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 89
diff changeset
399 // copy/rename source was known prior to rev1
a95c700408a9 Correctly report copy/rename events for rev..working copy case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 89
diff changeset
400 // (both r1Files.contains is true and original was created earlier than rev1)
a95c700408a9 Correctly report copy/rename events for rev..working copy case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 89
diff changeset
401 // without r1Files.contains changelogRevision <= rev1 won't suffice as the file
a95c700408a9 Correctly report copy/rename events for rev..working copy case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 89
diff changeset
402 // might get removed somewhere in between (changelogRevision < R < rev1)
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
403 return origin.getPath();
90
a95c700408a9 Correctly report copy/rename events for rev..working copy case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 89
diff changeset
404 }
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
405 // copy/rename happened in [copyFromCsetIndex..target], let's see if
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
406 // origin wasn't renamed once more in [originalChangesetIndex..copyFromCsetIndex]
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
407 lastOriginFound = origin.getPath();
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
408 // FALL-THROUGH
690
b286222158be Fix file.isCopy() use for status and cat commands
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 689
diff changeset
409 } else {
b286222158be Fix file.isCopy() use for status and cat commands
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 689
diff changeset
410 // clear last known origin if the file was renamed once again to something we don't have in base
b286222158be Fix file.isCopy() use for status and cat commands
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 689
diff changeset
411 lastOriginFound = null;
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
412 }
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
413 // try more steps away
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
414 // copyFromFileRev or one of its predecessors might be copies as well
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
415 fileRevIndex = copyFromFileRevIndex; // df is already origin file
90
a95c700408a9 Correctly report copy/rename events for rev..working copy case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 89
diff changeset
416 }
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
417 return lastOriginFound;
90
a95c700408a9 Correctly report copy/rename events for rev..working copy case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 89
diff changeset
418 }
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
419
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
420 // 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
421 // 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
422 /**
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 303
diff changeset
423 * 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
424 *
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 303
diff changeset
425 * <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
426 * 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
427 *
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 303
diff changeset
428 * <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
429 * from {@link #getAdded()}.
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 303
diff changeset
430 */
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
431 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
432 // 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
433 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
434 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
435 private Map<Path, Exception> failures;
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
436
64
19e9e220bf68 Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 59
diff changeset
437 private int startRev, endRev;
94
af1f3b78b918 *StatusCollector renamed to Hg*StatusCollector
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 93
diff changeset
438 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
439
19e9e220bf68 Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 59
diff changeset
440 // 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
441 // 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
442 // 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
443 // 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
444 // 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
445 // 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
446 // 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
447 /*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
448 startRev = startRevision;
19e9e220bf68 Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 59
diff changeset
449 endRev = endRevision;
19e9e220bf68 Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 59
diff changeset
450 statusHelper = self;
19e9e220bf68 Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 59
diff changeset
451 }
19e9e220bf68 Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 59
diff changeset
452
628
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
453 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
454 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
455 return null;
0e499fed9b3d StatusCommand with tests. Extra constants to indicate common revision cases
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 64
diff changeset
456 }
64
19e9e220bf68 Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 59
diff changeset
457 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
458 return null;
19e9e220bf68 Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 59
diff changeset
459 }
285
6dbbc53fc46d Use Path instead of plain String for manifest file names
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 284
diff changeset
460 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
461 }
628
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
462 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
463 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
464 return null;
0e499fed9b3d StatusCommand with tests. Extra constants to indicate common revision cases
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 64
diff changeset
465 }
64
19e9e220bf68 Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 59
diff changeset
466 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
467 return null;
19e9e220bf68 Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 59
diff changeset
468 }
285
6dbbc53fc46d Use Path instead of plain String for manifest file names
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 284
diff changeset
469 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
470 }
19e9e220bf68 Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 59
diff changeset
471
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
472 public List<Path> getModified() {
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
473 return proper(modified);
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
474 }
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
475
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
476 public List<Path> getAdded() {
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
477 return proper(added);
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
478 }
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
479
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
480 public List<Path> getRemoved() {
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
481 return proper(removed);
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
482 }
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
483
316
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 303
diff changeset
484 /**
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 303
diff changeset
485 * 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
486 */
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
487 public Map<Path,Path> getCopied() {
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
488 if (copied == null) {
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
489 return Collections.emptyMap();
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
490 }
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
491 return Collections.unmodifiableMap(copied);
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
492 }
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
493
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
494 public List<Path> getClean() {
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
495 return proper(clean);
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
496 }
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
497
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
498 public List<Path> getMissing() {
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
499 return proper(missing);
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
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
502 public List<Path> getUnknown() {
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
503 return proper(unknown);
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
504 }
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
505
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
506 public List<Path> getIgnored() {
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
507 return proper(ignored);
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
508 }
360
150500515714 Report non-critical errors during status operation to handler/inspector
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
509
150500515714 Report non-critical errors during status operation to handler/inspector
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
510 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
511 if (failures == null) {
150500515714 Report non-critical errors during status operation to handler/inspector
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
512 return Collections.emptyMap();
150500515714 Report non-critical errors during status operation to handler/inspector
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
513 }
150500515714 Report non-critical errors during status operation to handler/inspector
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
514 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
515 }
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
516
316
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 303
diff changeset
517 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
518 if (l == null) {
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
519 return Collections.emptyList();
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
520 }
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
521 return Collections.unmodifiableList(l);
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
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
524 //
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
525 //
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
526
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
527 public void modified(Path fname) {
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
528 modified = doAdd(modified, fname);
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
529 }
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
530
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
531 public void added(Path fname) {
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
532 added = doAdd(added, fname);
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
533 }
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
534
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
535 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
536 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
537 copied = new LinkedHashMap<Path, Path>();
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
538 }
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
539 added(fnameAdded);
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
540 copied.put(fnameAdded, fnameOrigin);
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
541 }
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
542
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
543 public void removed(Path fname) {
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
544 removed = doAdd(removed, fname);
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
545 }
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 public void clean(Path fname) {
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
548 clean = doAdd(clean, fname);
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
549 }
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 public void missing(Path fname) {
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
552 missing = doAdd(missing, fname);
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
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
555 public void unknown(Path fname) {
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
556 unknown = doAdd(unknown, fname);
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
557 }
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
558
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
559 public void ignored(Path fname) {
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
560 ignored = doAdd(ignored, fname);
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
561 }
360
150500515714 Report non-critical errors during status operation to handler/inspector
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
562
150500515714 Report non-critical errors during status operation to handler/inspector
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
563 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
564 if (failures == null) {
150500515714 Report non-critical errors during status operation to handler/inspector
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
565 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
566 }
150500515714 Report non-critical errors during status operation to handler/inspector
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
567 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
568 }
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
569
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
570 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
571 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
572 l = new LinkedList<Path>();
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
573 }
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
574 l.add(p);
55
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
575 return l;
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
576 }
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
577 }
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
578
05829a70b30b Status operation extracted into separate, cache-friendly class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
579 }