Mercurial > jhg
annotate src/org/tmatesoft/hg/repo/HgStatusCollector.java @ 355:f2c11fe7f3e9
Newline filter shall respect whole stream when deciding whether to process line terminators, hence added stream preview functionality
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Tue, 06 Dec 2011 12:57:21 +0100 | 
| parents | 5f9073eabf06 | 
| children | 150500515714 | 
| rev | line source | 
|---|---|
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 1 /* | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 2 * Copyright (c) 2011 TMate Software Ltd | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 3 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
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: 
68diff
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: 
68diff
changeset | 6 * the Free Software Foundation; version 2 of the License. | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 7 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
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: 
68diff
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: 
68diff
changeset | 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 11 * GNU General Public License for more details. | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 12 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 13 * For information on how to redistribute this software under | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
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: 
94diff
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: 
68diff
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 | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 19 import static org.tmatesoft.hg.repo.HgRepository.BAD_REVISION; | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 20 import static org.tmatesoft.hg.repo.HgRepository.TIP; | 
| 68 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
64diff
changeset | 21 | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 22 import java.util.Collection; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 23 import java.util.Collections; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 24 import java.util.LinkedHashMap; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 25 import java.util.LinkedList; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 26 import java.util.List; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 27 import java.util.Map; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 28 import java.util.TreeSet; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 29 | 
| 285 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 30 import org.tmatesoft.hg.core.HgBadStateException; | 
| 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: 
142diff
changeset | 31 import org.tmatesoft.hg.core.HgDataStreamException; | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
320diff
changeset | 32 import org.tmatesoft.hg.core.HgException; | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
320diff
changeset | 33 import org.tmatesoft.hg.core.HgInvalidControlFileException; | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 34 import org.tmatesoft.hg.core.Nodeid; | 
| 281 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
248diff
changeset | 35 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: 
229diff
changeset | 36 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: 
157diff
changeset | 37 import org.tmatesoft.hg.internal.Pool; | 
| 133 
4a948ec83980
core.Path to util.Path as it's not Hg repo dependant
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 38 import org.tmatesoft.hg.util.Path; | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 39 import org.tmatesoft.hg.util.PathPool; | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 40 import org.tmatesoft.hg.util.PathRewrite; | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 41 | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 42 | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 43 /** | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 44 * RevisionWalker? | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 45 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 46 * @author Artem Tikhomirov | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 47 * @author TMate Software Ltd. | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 48 */ | 
| 94 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
93diff
changeset | 49 public class HgStatusCollector { | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 50 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 51 private final HgRepository repo; | 
| 281 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
248diff
changeset | 52 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: 
157diff
changeset | 53 // 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: 
157diff
changeset | 54 // 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: 
157diff
changeset | 55 // 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: 
157diff
changeset | 56 // 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: 
195diff
changeset | 57 private final int cacheMaxSize = 50; // do not keep too much manifest revisions | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 58 private PathPool 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: 
157diff
changeset | 59 private final Pool<Nodeid> cacheNodes; | 
| 285 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 60 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: 
229diff
changeset | 61 private final ManifestRevision emptyFakeState; | 
| 229 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
226diff
changeset | 62 private Path.Matcher scope = new Path.Matcher.Any(); | 
| 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: 
157diff
changeset | 63 | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 64 | 
| 94 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
93diff
changeset | 65 public HgStatusCollector(HgRepository hgRepo) { | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 66 this.repo = hgRepo; | 
| 281 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
248diff
changeset | 67 cache = new IntMap<ManifestRevision>(cacheMaxSize); | 
| 195 
c9b305df0b89
Optimization: use ParentWalker to get changeset's parents, if possible. Do not keep duplicating nodeids and strings in manifest revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
157diff
changeset | 68 cacheNodes = new Pool<Nodeid>(); | 
| 285 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 69 cacheFilenames = new Pool<Path>(); | 
| 197 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
195diff
changeset | 70 | 
| 284 
7232b94f2ae3
HgDirstate shall operate with Path instead of String for file names. Use of Pair instead of array of unspecified length for parents.
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
282diff
changeset | 71 emptyFakeState = createEmptyManifestRevision(); | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 72 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 73 | 
| 64 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 74 public HgRepository getRepo() { | 
| 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 75 return repo; | 
| 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 76 } | 
| 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 77 | 
| 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: 
229diff
changeset | 78 private ManifestRevision get(int rev) { | 
| 
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: 
229diff
changeset | 79 ManifestRevision i = cache.get(rev); | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 80 if (i == null) { | 
| 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: 
195diff
changeset | 81 if (rev == -1) { | 
| 
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: 
195diff
changeset | 82 return emptyFakeState; | 
| 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
195diff
changeset | 83 } | 
| 281 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
248diff
changeset | 84 ensureCacheSize(); | 
| 248 
3fbfce107f94
Issue 8: Means to find out information about given file at specific changeset. Inner ManifestRevisionInspector got promoted to ManifestRevision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
229diff
changeset | 85 i = new ManifestRevision(cacheNodes, cacheFilenames); | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 86 cache.put(rev, i); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 87 repo.getManifest().walk(rev, rev, i); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 88 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 89 return i; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 90 } | 
| 197 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
195diff
changeset | 91 | 
| 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
195diff
changeset | 92 private boolean cached(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: 
195diff
changeset | 93 return cache.containsKey(revision) || revision == -1; | 
| 
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: 
195diff
changeset | 94 } | 
| 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
195diff
changeset | 95 | 
| 281 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
248diff
changeset | 96 private void ensureCacheSize() { | 
| 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
248diff
changeset | 97 if (cache.size() > cacheMaxSize) { | 
| 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
248diff
changeset | 98 // assume usually we go from oldest to newest, hence remove oldest as most likely to be no longer necessary | 
| 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
248diff
changeset | 99 cache.removeFromStart(cache.size() - cacheMaxSize + 1 /* room for new element */); | 
| 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
248diff
changeset | 100 } | 
| 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
248diff
changeset | 101 } | 
| 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
248diff
changeset | 102 | 
| 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: 
195diff
changeset | 103 private void initCacheRange(int minRev, int maxRev) { | 
| 281 
81e9a3c9bafe
Utilize IntMap when caching manifest revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
248diff
changeset | 104 ensureCacheSize(); | 
| 302 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
285diff
changeset | 105 // In fact, walk(minRev, maxRev) doesn't imply | 
| 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
285diff
changeset | 106 // there would be maxRev-minRev+1 revisions visited. For example, | 
| 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
285diff
changeset | 107 // check cpython repo with 'hg log -r 22418:22420 --debug' and admire | 
| 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
285diff
changeset | 108 // manifest revisions 66650, 21683, 21684. Thus, innocent walk(22418,22420) results in 40k+ revisions and OOME | 
| 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
285diff
changeset | 109 // Instead, be explicit of what revisions are of interest | 
| 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
285diff
changeset | 110 assert minRev <= maxRev; | 
| 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
285diff
changeset | 111 int[] revisionsToCollect = new int[maxRev - minRev + 1]; | 
| 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
285diff
changeset | 112 for (int x = minRev, i = 0; x <= maxRev; i++, x++) { | 
| 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
285diff
changeset | 113 revisionsToCollect[i] = x; | 
| 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
285diff
changeset | 114 } | 
| 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
285diff
changeset | 115 repo.getManifest().walk(new HgManifest.Inspector2() { | 
| 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: 
229diff
changeset | 116 private ManifestRevision delegate; | 
| 197 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
195diff
changeset | 117 private boolean cacheHit; // range may include revisions we already know about, do not re-create them | 
| 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
195diff
changeset | 118 | 
| 222 
373e07cd3991
Due to discrepancy in manifest and changelor indexes, wrong manifest revisions got cached and compared
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
221diff
changeset | 119 public boolean begin(int manifestRevision, Nodeid nid, int changelogRevision) { | 
| 197 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
195diff
changeset | 120 assert delegate == null; | 
| 222 
373e07cd3991
Due to discrepancy in manifest and changelor indexes, wrong manifest revisions got cached and compared
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
221diff
changeset | 121 if (cache.containsKey(changelogRevision)) { // don't need to check emptyFakeState hit as revision never -1 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: 
195diff
changeset | 122 cacheHit = true; | 
| 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
195diff
changeset | 123 } else { | 
| 248 
3fbfce107f94
Issue 8: Means to find out information about given file at specific changeset. Inner ManifestRevisionInspector got promoted to ManifestRevision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
229diff
changeset | 124 cache.put(changelogRevision, delegate = new ManifestRevision(cacheNodes, cacheFilenames)); | 
| 197 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
195diff
changeset | 125 // cache may grow bigger than max size here, but it's ok as present simplistic cache clearing mechanism may | 
| 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
195diff
changeset | 126 // otherwise remove entries we just added | 
| 222 
373e07cd3991
Due to discrepancy in manifest and changelor indexes, wrong manifest revisions got cached and compared
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
221diff
changeset | 127 delegate.begin(manifestRevision, nid, changelogRevision); | 
| 197 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
195diff
changeset | 128 cacheHit = false; | 
| 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
195diff
changeset | 129 } | 
| 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
195diff
changeset | 130 return true; | 
| 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
195diff
changeset | 131 } | 
| 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
195diff
changeset | 132 | 
| 
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: 
195diff
changeset | 133 public boolean next(Nodeid nid, String fname, String flags) { | 
| 285 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 134 throw new HgBadStateException(HgManifest.Inspector2.class.getName()); | 
| 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 135 } | 
| 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 136 | 
| 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 137 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: 
195diff
changeset | 138 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: 
195diff
changeset | 139 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: 
195diff
changeset | 140 } | 
| 
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: 
195diff
changeset | 141 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: 
195diff
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: 
195diff
changeset | 143 | 
| 
3a7696fb457c
Investigate optimization options to allow fast processing of huge repositories. Fix defect in StatusCollector that lead to wrong result comparing first revision to empty repo (-1 to 0), due to same TIP constant value
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
195diff
changeset | 144 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: 
195diff
changeset | 145 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: 
195diff
changeset | 146 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: 
195diff
changeset | 147 } | 
| 
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: 
195diff
changeset | 148 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: 
195diff
changeset | 149 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: 
195diff
changeset | 150 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: 
195diff
changeset | 151 } | 
| 302 
a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
285diff
changeset | 152 }, 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: 
195diff
changeset | 153 } | 
| 56 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 154 | 
| 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: 
282diff
changeset | 155 /*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: 
282diff
changeset | 156 ManifestRevision fakeEmptyRev = new ManifestRevision(null, null); | 
| 
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: 
282diff
changeset | 157 fakeEmptyRev.begin(-1, null, -1); | 
| 
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: 
282diff
changeset | 158 fakeEmptyRev.end(-1); | 
| 
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: 
282diff
changeset | 159 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: 
282diff
changeset | 160 } | 
| 
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: 
282diff
changeset | 161 | 
| 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: 
229diff
changeset | 162 /*package-local*/ ManifestRevision raw(int rev) { | 
| 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: 
56diff
changeset | 163 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: 
56diff
changeset | 164 } | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 165 /*package-local*/ PathPool getPathPool() { | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 166 if (pathPool == null) { | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 167 pathPool = new PathPool(new PathRewrite.Empty()); | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 168 } | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 169 return pathPool; | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 170 } | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 171 | 
| 142 
37a34044e6bd
More reasonable use of path normalizer and path.source
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
141diff
changeset | 172 /** | 
| 
37a34044e6bd
More reasonable use of path normalizer and path.source
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
141diff
changeset | 173 * Allows sharing of a common path cache | 
| 
37a34044e6bd
More reasonable use of path normalizer and path.source
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
141diff
changeset | 174 */ | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 175 public void setPathPool(PathPool pathPool) { | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 176 this.pathPool = pathPool; | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 177 } | 
| 229 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
226diff
changeset | 178 | 
| 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
226diff
changeset | 179 /** | 
| 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
226diff
changeset | 180 * 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: 
226diff
changeset | 181 * @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: 
226diff
changeset | 182 */ | 
| 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
226diff
changeset | 183 public void setScope(Path.Matcher scopeMatcher) { | 
| 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
226diff
changeset | 184 // do not assign null, ever | 
| 
1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
226diff
changeset | 185 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: 
226diff
changeset | 186 } | 
| 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: 
56diff
changeset | 187 | 
| 56 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 188 // hg status --change <rev> | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 189 public void change(int rev, HgStatusInspector inspector) { | 
| 56 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 190 int[] parents = new int[2]; | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 191 repo.getChangelog().parents(rev, parents, null, null); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 192 walk(parents[0], rev, inspector); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 193 } | 
| 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: 
195diff
changeset | 194 | 
| 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: 
281diff
changeset | 195 // rev1 and rev2 are changelog revision numbers, argument order matters. | 
| 
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: 
281diff
changeset | 196 // Either rev1 or rev2 may be -1 to indicate comparison to empty repository (XXX this is due to use of | 
| 
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: 
281diff
changeset | 197 // parents in #change(), I believe. Perhaps, need a constant for this? Otherwise this hidden knowledge gets | 
| 
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: 
281diff
changeset | 198 // exposed to e.g. Record | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 199 public void walk(int rev1, int rev2, HgStatusInspector inspector) { | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 200 if (rev1 == rev2) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 201 throw new IllegalArgumentException(); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 202 } | 
| 64 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 203 if (inspector == null) { | 
| 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 204 throw new IllegalArgumentException(); | 
| 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 205 } | 
| 218 
047b1dec7a04
Issue 7: Correctly handle manifest and changelog with different number of (or non-matching) revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
197diff
changeset | 206 final int lastManifestRevision = repo.getChangelog().getLastRevision(); | 
| 68 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
64diff
changeset | 207 if (rev1 == TIP) { | 
| 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: 
195diff
changeset | 208 rev1 = lastManifestRevision; | 
| 68 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
64diff
changeset | 209 } | 
| 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
64diff
changeset | 210 if (rev2 == TIP) { | 
| 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: 
195diff
changeset | 211 rev2 = lastManifestRevision; | 
| 68 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
64diff
changeset | 212 } | 
| 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: 
281diff
changeset | 213 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: 
281diff
changeset | 214 ((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: 
281diff
changeset | 215 } | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 216 // 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 | 217 // 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: 
229diff
changeset | 218 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: 
195diff
changeset | 219 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: 
195diff
changeset | 220 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: 
195diff
changeset | 221 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: 
195diff
changeset | 222 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: 
195diff
changeset | 223 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: 
195diff
changeset | 224 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: 
195diff
changeset | 225 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: 
195diff
changeset | 226 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: 
195diff
changeset | 227 } | 
| 
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: 
195diff
changeset | 228 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: 
195diff
changeset | 229 need1 = need2 = false; | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 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: 
195diff
changeset | 231 // 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: 
195diff
changeset | 232 // 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: 
195diff
changeset | 233 // 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: 
195diff
changeset | 234 // 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: 
195diff
changeset | 235 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: 
195diff
changeset | 236 minRev = 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: 
195diff
changeset | 237 maxRev = rev1 < lastManifestRevision-5 ? rev1+5 : lastManifestRevision; | 
| 
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: 
195diff
changeset | 238 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: 
195diff
changeset | 239 } | 
| 
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: 
195diff
changeset | 240 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: 
195diff
changeset | 241 minRev = 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: 
195diff
changeset | 242 maxRev = rev2 < lastManifestRevision-5 ? rev2+5 : lastManifestRevision; | 
| 
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: 
195diff
changeset | 243 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: 
195diff
changeset | 244 } | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 245 } | 
| 89 
42bcb4bffd17
Refactored to simplify manifest collector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
88diff
changeset | 246 r1 = get(rev1); | 
| 
42bcb4bffd17
Refactored to simplify manifest collector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
88diff
changeset | 247 r2 = get(rev2); | 
| 
42bcb4bffd17
Refactored to simplify manifest collector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
88diff
changeset | 248 | 
| 285 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 249 TreeSet<Path> r1Files = new TreeSet<Path>(r1.files()); | 
| 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 250 for (Path r2fname : r2.files()) { | 
| 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 251 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: 
222diff
changeset | 252 continue; | 
| 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
222diff
changeset | 253 } | 
| 285 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 254 if (r1Files.remove(r2fname)) { | 
| 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 255 Nodeid nidR1 = r1.nodeid(r2fname); | 
| 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 256 Nodeid nidR2 = r2.nodeid(r2fname); | 
| 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 257 HgManifest.Flags flagsR1 = r1.flags(r2fname); | 
| 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 258 HgManifest.Flags flagsR2 = r2.flags(r2fname); | 
| 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 259 if (nidR1.equals(nidR2) && flagsR2 == flagsR1) { | 
| 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 260 inspector.clean(r2fname); | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 261 } else { | 
| 285 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 262 inspector.modified(r2fname); | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 263 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 264 } 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: 
142diff
changeset | 265 try { | 
| 285 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 266 Path copyTarget = r2fname; | 
| 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: 
142diff
changeset | 267 Path copyOrigin = getOriginIfCopy(repo, copyTarget, r1Files, rev1); | 
| 
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: 
142diff
changeset | 268 if (copyOrigin != null) { | 
| 285 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 269 inspector.copied(getPathPool().path(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: 
142diff
changeset | 270 } 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: 
142diff
changeset | 271 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: 
142diff
changeset | 272 } | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
320diff
changeset | 273 } catch (HgException ex) { | 
| 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: 
142diff
changeset | 274 ex.printStackTrace(); | 
| 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
142diff
changeset | 275 // FIXME perhaps, shall record this exception to dedicated mediator and continue | 
| 
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: 
142diff
changeset | 276 // for a single file not to be irresolvable obstacle for a status operation | 
| 88 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
74diff
changeset | 277 } | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 278 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 279 } | 
| 285 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 280 for (Path r1fname : r1Files) { | 
| 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 281 if (scope.accept(r1fname)) { | 
| 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 282 inspector.removed(r1fname); | 
| 226 
26ad7827a62d
Support status query for a single file or a subdirectory of a repository
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
222diff
changeset | 283 } | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 284 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 285 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 286 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 287 public Record status(int rev1, int rev2) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 288 Record rv = new Record(); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 289 walk(rev1, rev2, rv); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 290 return rv; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 291 } | 
| 90 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 292 | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
320diff
changeset | 293 /*package-local*/static Path getOriginIfCopy(HgRepository hgRepo, Path fname, Collection<Path> originals, int originalChangelogRevision) throws HgDataStreamException, HgInvalidControlFileException { | 
| 90 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 294 HgDataFile df = hgRepo.getFileNode(fname); | 
| 320 
678e326fd27c
Issue 15: Exception accessing oddly named file from history
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
316diff
changeset | 295 if (!df.exists()) { | 
| 
678e326fd27c
Issue 15: Exception accessing oddly named file from history
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
316diff
changeset | 296 String msg = String.format("Didn't find file '%s' in the repo. Perhaps, bad storage name conversion?", fname); | 
| 
678e326fd27c
Issue 15: Exception accessing oddly named file from history
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
316diff
changeset | 297 throw new HgDataStreamException(fname, msg, null).setRevisionNumber(originalChangelogRevision); | 
| 
678e326fd27c
Issue 15: Exception accessing oddly named file from history
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
316diff
changeset | 298 } | 
| 90 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 299 while (df.isCopy()) { | 
| 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 300 Path original = df.getCopySourceName(); | 
| 285 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 301 if (originals.contains(original)) { | 
| 90 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 302 df = hgRepo.getFileNode(original); | 
| 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 303 int changelogRevision = df.getChangesetLocalRevision(0); | 
| 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 304 if (changelogRevision <= originalChangelogRevision) { | 
| 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 305 // 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: 
89diff
changeset | 306 // (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: 
89diff
changeset | 307 // 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: 
89diff
changeset | 308 // might get removed somewhere in between (changelogRevision < R < rev1) | 
| 141 
8248aae33f7d
Adopt FileIterator moving towards WCStatusCollector parameterizing. Improved path handling, move 'em around
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
135diff
changeset | 309 return original; | 
| 90 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 310 } | 
| 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 311 break; // copy/rename done later | 
| 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 312 } | 
| 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 313 df = hgRepo.getFileNode(original); // try more steps away | 
| 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 314 } | 
| 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 315 return null; | 
| 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 316 } | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 317 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 318 // 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: 
68diff
changeset | 319 // 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: 
303diff
changeset | 320 /** | 
| 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
303diff
changeset | 321 * 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: 
303diff
changeset | 322 * | 
| 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
303diff
changeset | 323 * <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: 
303diff
changeset | 324 * 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: 
303diff
changeset | 325 * | 
| 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
303diff
changeset | 326 * <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: 
303diff
changeset | 327 * from {@link #getAdded()}. | 
| 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
303diff
changeset | 328 */ | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 329 public static class Record implements HgStatusInspector { | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 330 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: 
90diff
changeset | 331 private Map<Path, Path> copied; | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 332 | 
| 64 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 333 private int startRev, endRev; | 
| 94 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
93diff
changeset | 334 private HgStatusCollector statusHelper; | 
| 64 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 335 | 
| 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 336 // 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: 
59diff
changeset | 337 // 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: 
59diff
changeset | 338 // 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: 
59diff
changeset | 339 // 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: 
59diff
changeset | 340 // 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: 
59diff
changeset | 341 // 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: 
59diff
changeset | 342 // how to supply [start..end] values there easily | 
| 94 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
93diff
changeset | 343 /*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: 
59diff
changeset | 344 startRev = startRevision; | 
| 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 345 endRev = endRevision; | 
| 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 346 statusHelper = self; | 
| 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 347 } | 
| 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 348 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 349 public Nodeid nodeidBeforeChange(Path fname) { | 
| 68 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
64diff
changeset | 350 if (statusHelper == null || startRev == BAD_REVISION) { | 
| 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
64diff
changeset | 351 return null; | 
| 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
64diff
changeset | 352 } | 
| 64 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 353 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: 
59diff
changeset | 354 return null; | 
| 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 355 } | 
| 285 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 356 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: 
59diff
changeset | 357 } | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 358 public Nodeid nodeidAfterChange(Path fname) { | 
| 68 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
64diff
changeset | 359 if (statusHelper == null || endRev == BAD_REVISION) { | 
| 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
64diff
changeset | 360 return null; | 
| 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
64diff
changeset | 361 } | 
| 64 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 362 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: 
59diff
changeset | 363 return null; | 
| 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 364 } | 
| 285 
6dbbc53fc46d
Use Path instead of plain String for manifest file names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 365 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: 
59diff
changeset | 366 } | 
| 
19e9e220bf68
Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 367 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 368 public List<Path> getModified() { | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 369 return proper(modified); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 370 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 371 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 372 public List<Path> getAdded() { | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 373 return proper(added); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 374 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 375 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 376 public List<Path> getRemoved() { | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 377 return proper(removed); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 378 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 379 | 
| 316 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
303diff
changeset | 380 /** | 
| 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
303diff
changeset | 381 * 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: 
303diff
changeset | 382 */ | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 383 public Map<Path,Path> getCopied() { | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 384 if (copied == null) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 385 return Collections.emptyMap(); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 386 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 387 return Collections.unmodifiableMap(copied); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 388 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 389 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 390 public List<Path> getClean() { | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 391 return proper(clean); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 392 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 393 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 394 public List<Path> getMissing() { | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 395 return proper(missing); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 396 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 397 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 398 public List<Path> getUnknown() { | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 399 return proper(unknown); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 400 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 401 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 402 public List<Path> getIgnored() { | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 403 return proper(ignored); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 404 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 405 | 
| 316 
ee6b467c1a5f
Supply HGFileRevision with copy information when possible, calculate it otherwise
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
303diff
changeset | 406 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 | 407 if (l == null) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 408 return Collections.emptyList(); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 409 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 410 return Collections.unmodifiableList(l); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 411 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 412 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 413 // | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 414 // | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 415 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 416 public void modified(Path fname) { | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 417 modified = doAdd(modified, fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 418 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 419 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 420 public void added(Path fname) { | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 421 added = doAdd(added, fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 422 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 423 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 424 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 | 425 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: 
90diff
changeset | 426 copied = new LinkedHashMap<Path, Path>(); | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 427 } | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 428 added(fnameAdded); | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 429 copied.put(fnameAdded, fnameOrigin); | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 430 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 431 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 432 public void removed(Path fname) { | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 433 removed = doAdd(removed, fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 434 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 435 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 436 public void clean(Path fname) { | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 437 clean = doAdd(clean, fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 438 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 439 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 440 public void missing(Path fname) { | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 441 missing = doAdd(missing, fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 442 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 443 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 444 public void unknown(Path fname) { | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 445 unknown = doAdd(unknown, fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 446 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 447 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 448 public void ignored(Path fname) { | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 449 ignored = doAdd(ignored, fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 450 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 451 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 452 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 | 453 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: 
90diff
changeset | 454 l = new LinkedList<Path>(); | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 455 } | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 456 l.add(p); | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 457 return l; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 458 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 459 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 460 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 461 } | 
