Mercurial > hg4j
annotate src/org/tmatesoft/hg/repo/HgWorkingCopyStatusCollector.java @ 94:af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Thu, 27 Jan 2011 21:18:47 +0100 | 
| parents | src/org/tmatesoft/hg/repo/WorkingCopyStatusCollector.java@d55d4eedfc57 | 
| children | a3a2e5deb320 | 
| rev | line source | 
|---|---|
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 1 /* | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
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 | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 15 * contact TMate Software at support@svnkit.com | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 16 */ | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 17 package org.tmatesoft.hg.repo; | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 18 | 
| 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; | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 21 | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 22 import java.io.BufferedInputStream; | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 23 import java.io.File; | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 24 import java.io.FileInputStream; | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 25 import java.io.IOException; | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 26 import java.util.Collections; | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 27 import java.util.Set; | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 28 import java.util.TreeSet; | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 29 | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 30 import org.tmatesoft.hg.core.Nodeid; | 
| 94 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
93diff
changeset | 31 import org.tmatesoft.hg.repo.HgStatusCollector.ManifestRevisionInspector; | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 32 import org.tmatesoft.hg.util.FileWalker; | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 33 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: 
91diff
changeset | 34 import org.tmatesoft.hg.util.PathRewrite; | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 35 | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 36 /** | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 37 * | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 38 * @author Artem Tikhomirov | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 39 * @author TMate Software Ltd. | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 40 */ | 
| 94 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
93diff
changeset | 41 public class HgWorkingCopyStatusCollector { | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 42 | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 43 private final HgRepository repo; | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 44 private final FileWalker repoWalker; | 
| 59 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
58diff
changeset | 45 private HgDirstate dirstate; | 
| 94 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
93diff
changeset | 46 private HgStatusCollector baseRevisionCollector; | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 47 private PathPool pathPool; | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 48 | 
| 94 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
93diff
changeset | 49 public HgWorkingCopyStatusCollector(HgRepository hgRepo) { | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 50 this(hgRepo, hgRepo.createWorkingDirWalker()); | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 51 } | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 52 | 
| 94 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
93diff
changeset | 53 HgWorkingCopyStatusCollector(HgRepository hgRepo, FileWalker hgRepoWalker) { | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 54 this.repo = hgRepo; | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 55 this.repoWalker = hgRepoWalker; | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 56 } | 
| 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: 
58diff
changeset | 57 | 
| 
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: 
58diff
changeset | 58 /** | 
| 
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: 
58diff
changeset | 59 * Optionally, supply a collector instance that may cache (or have already cached) base revision | 
| 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
58diff
changeset | 60 * @param sc may be null | 
| 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
58diff
changeset | 61 */ | 
| 94 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
93diff
changeset | 62 public void setBaseRevisionCollector(HgStatusCollector sc) { | 
| 59 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
58diff
changeset | 63 baseRevisionCollector = sc; | 
| 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
58diff
changeset | 64 } | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 65 | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 66 /*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: 
91diff
changeset | 67 if (pathPool == null) { | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 68 if (baseRevisionCollector == null) { | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 69 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: 
91diff
changeset | 70 } else { | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 71 return baseRevisionCollector.getPathPool(); | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 72 } | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 73 } | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 74 return pathPool; | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 75 } | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 76 | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 77 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: 
91diff
changeset | 78 this.pathPool = pathPool; | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 79 } | 
| 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 80 | 
| 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: 
58diff
changeset | 81 | 
| 
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: 
58diff
changeset | 82 private HgDirstate getDirstate() { | 
| 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
58diff
changeset | 83 if (dirstate == null) { | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 84 dirstate = repo.loadDirstate(); | 
| 59 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
58diff
changeset | 85 } | 
| 
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: 
58diff
changeset | 86 return dirstate; | 
| 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
58diff
changeset | 87 } | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 88 | 
| 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: 
58diff
changeset | 89 // may be invoked few times | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 90 public void walk(int baseRevision, HgStatusInspector inspector) { | 
| 91 
c2ce1cfaeb9e
ignore file with regex and 'honest' glob support
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
90diff
changeset | 91 final HgIgnore hgIgnore = repo.getIgnore(); | 
| 59 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
58diff
changeset | 92 TreeSet<String> knownEntries = getDirstate().all(); | 
| 68 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
63diff
changeset | 93 final boolean isTipBase; | 
| 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
63diff
changeset | 94 if (baseRevision == TIP) { | 
| 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
63diff
changeset | 95 baseRevision = repo.getManifest().getRevisionCount() - 1; | 
| 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
63diff
changeset | 96 isTipBase = true; | 
| 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
63diff
changeset | 97 } else { | 
| 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
63diff
changeset | 98 isTipBase = baseRevision == repo.getManifest().getRevisionCount() - 1; | 
| 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
63diff
changeset | 99 } | 
| 94 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
93diff
changeset | 100 HgStatusCollector.ManifestRevisionInspector collect = null; | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 101 Set<String> baseRevFiles = Collections.emptySet(); | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 102 if (!isTipBase) { | 
| 59 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
58diff
changeset | 103 if (baseRevisionCollector != null) { | 
| 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
58diff
changeset | 104 collect = baseRevisionCollector.raw(baseRevision); | 
| 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
58diff
changeset | 105 } else { | 
| 94 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
93diff
changeset | 106 collect = new HgStatusCollector.ManifestRevisionInspector(); | 
| 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: 
58diff
changeset | 107 repo.getManifest().walk(baseRevision, baseRevision, collect); | 
| 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
58diff
changeset | 108 } | 
| 89 
42bcb4bffd17
Refactored to simplify manifest collector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
76diff
changeset | 109 baseRevFiles = new TreeSet<String>(collect.files()); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 110 } | 
| 94 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
93diff
changeset | 111 if (inspector instanceof HgStatusCollector.Record) { | 
| 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
93diff
changeset | 112 HgStatusCollector sc = baseRevisionCollector == null ? new HgStatusCollector(repo) : baseRevisionCollector; | 
| 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
93diff
changeset | 113 ((HgStatusCollector.Record) inspector).init(baseRevision, BAD_REVISION, sc); | 
| 68 
0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
63diff
changeset | 114 } | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 115 repoWalker.reset(); | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 116 final PathPool pp = getPathPool(); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 117 while (repoWalker.hasNext()) { | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 118 repoWalker.next(); | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 119 String fname = repoWalker.name(); | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 120 File f = repoWalker.file(); | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 121 if (hgIgnore.isIgnored(fname)) { | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 122 inspector.ignored(pp.path(fname)); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 123 } else if (knownEntries.remove(fname)) { | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 124 // modified, added, removed, clean | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 125 if (collect != null) { // need to check against base revision, not FS file | 
| 90 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 126 checkLocalStatusAgainstBaseRevision(baseRevFiles, collect, baseRevision, fname, f, inspector); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 127 baseRevFiles.remove(fname); | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 128 } else { | 
| 59 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
58diff
changeset | 129 checkLocalStatusAgainstFile(fname, f, inspector); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 130 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 131 } else { | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 132 inspector.unknown(pp.path(fname)); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 133 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 134 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 135 if (collect != null) { | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 136 for (String r : baseRevFiles) { | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 137 inspector.removed(pp.path(r)); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 138 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 139 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 140 for (String m : knownEntries) { | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 141 // missing known file from a working dir | 
| 59 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
58diff
changeset | 142 if (getDirstate().checkRemoved(m) == null) { | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 143 // not removed from the repository = 'deleted' | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 144 inspector.missing(pp.path(m)); | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 145 } else { | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
68diff
changeset | 146 // removed from the repo | 
| 76 
658fa6b3a371
Fixed a defect when a file added and removed past some revision was reported as R for status against that rev
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
74diff
changeset | 147 // if we check against non-tip revision, do not report files that were added past that revision and now removed. | 
| 
658fa6b3a371
Fixed a defect when a file added and removed past some revision was reported as R for status against that rev
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
74diff
changeset | 148 if (collect == null || baseRevFiles.contains(m)) { | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 149 inspector.removed(pp.path(m)); | 
| 76 
658fa6b3a371
Fixed a defect when a file added and removed past some revision was reported as R for status against that rev
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
74diff
changeset | 150 } | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 151 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 152 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 153 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 154 | 
| 94 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
93diff
changeset | 155 public HgStatusCollector.Record status(int baseRevision) { | 
| 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
93diff
changeset | 156 HgStatusCollector.Record rv = new HgStatusCollector.Record(); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 157 walk(baseRevision, rv); | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 158 return rv; | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 159 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 160 | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 161 //******************************************** | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 162 | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 163 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 164 private void checkLocalStatusAgainstFile(String fname, File f, HgStatusInspector inspector) { | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 165 HgDirstate.Record r; | 
| 59 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
58diff
changeset | 166 if ((r = getDirstate().checkNormal(fname)) != null) { | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 167 // either clean or modified | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 168 if (f.lastModified() / 1000 == r.time && r.size == f.length()) { | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 169 inspector.clean(getPathPool().path(fname)); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 170 } else { | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 171 // FIXME check actual content to avoid false modified files | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 172 inspector.modified(getPathPool().path(fname)); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 173 } | 
| 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: 
58diff
changeset | 174 } else if ((r = getDirstate().checkAdded(fname)) != null) { | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 175 if (r.name2 == null) { | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 176 inspector.added(getPathPool().path(fname)); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 177 } else { | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 178 inspector.copied(getPathPool().path(r.name2), getPathPool().path(fname)); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 179 } | 
| 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: 
58diff
changeset | 180 } else if ((r = getDirstate().checkRemoved(fname)) != null) { | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 181 inspector.removed(getPathPool().path(fname)); | 
| 59 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
58diff
changeset | 182 } else if ((r = getDirstate().checkMerged(fname)) != null) { | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 183 inspector.modified(getPathPool().path(fname)); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 184 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 185 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 186 | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 187 // XXX refactor checkLocalStatus methods in more OO way | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 188 private void checkLocalStatusAgainstBaseRevision(Set<String> baseRevNames, ManifestRevisionInspector collect, int baseRevision, String fname, File f, HgStatusInspector inspector) { | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 189 // fname is in the dirstate, either Normal, Added, Removed or Merged | 
| 89 
42bcb4bffd17
Refactored to simplify manifest collector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
76diff
changeset | 190 Nodeid nid1 = collect.nodeid(fname); | 
| 
42bcb4bffd17
Refactored to simplify manifest collector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
76diff
changeset | 191 String flags = collect.flags(fname); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 192 HgDirstate.Record r; | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 193 if (nid1 == null) { | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 194 // normal: added? | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 195 // added: not known at the time of baseRevision, shall report | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 196 // merged: was not known, report as added? | 
| 90 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 197 if ((r = getDirstate().checkNormal(fname)) != null) { | 
| 94 
af1f3b78b918
*StatusCollector renamed to Hg*StatusCollector
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
93diff
changeset | 198 String origin = HgStatusCollector.getOriginIfCopy(repo, fname, baseRevNames, baseRevision); | 
| 90 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 199 if (origin != null) { | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 200 inspector.copied(getPathPool().path(origin), getPathPool().path(fname)); | 
| 90 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 201 return; | 
| 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 202 } | 
| 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 203 } else if ((r = getDirstate().checkAdded(fname)) != null) { | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 204 if (r.name2 != null && baseRevNames.contains(r.name2)) { | 
| 90 
a95c700408a9
Correctly report copy/rename events for rev..working copy case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
89diff
changeset | 205 baseRevNames.remove(r.name2); // XXX surely I shall not report rename source as Removed? | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 206 inspector.copied(getPathPool().path(r.name2), getPathPool().path(fname)); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 207 return; | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 208 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 209 // fall-through, report as added | 
| 59 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
58diff
changeset | 210 } else if (getDirstate().checkRemoved(fname) != null) { | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 211 // removed: removed file was not known at the time of baseRevision, and we should not report it as removed | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 212 return; | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 213 } | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 214 inspector.added(getPathPool().path(fname)); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 215 } else { | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 216 // was known; check whether clean or modified | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 217 // when added - seems to be the case of a file added once again, hence need to check if content is different | 
| 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: 
58diff
changeset | 218 if ((r = getDirstate().checkNormal(fname)) != null || (r = getDirstate().checkMerged(fname)) != null || (r = getDirstate().checkAdded(fname)) != null) { | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 219 // either clean or modified | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 220 HgDataFile fileNode = repo.getFileNode(fname); | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 221 final int lengthAtRevision = fileNode.length(nid1); | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 222 if (r.size /* XXX File.length() ?! */ != lengthAtRevision || flags != todoGenerateFlags(fname /*java.io.File*/)) { | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 223 inspector.modified(getPathPool().path(fname)); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 224 } else { | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 225 // check actual content to see actual changes | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 226 // XXX consider adding HgDataDile.compare(File/byte[]/whatever) operation to optimize comparison | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 227 if (areTheSame(f, fileNode.content(nid1))) { | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 228 inspector.clean(getPathPool().path(fname)); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 229 } else { | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
91diff
changeset | 230 inspector.modified(getPathPool().path(fname)); | 
| 58 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 231 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 232 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 233 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 234 // only those left in idsMap after processing are reported as removed | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 235 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 236 | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 237 // TODO think over if content comparison may be done more effectively by e.g. calculating nodeid for a local file and comparing it with nodeid from manifest | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 238 // we don't need to tell exact difference, hash should be enough to detect difference, and it doesn't involve reading historical file content, and it's relatively | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 239 // cheap to calc hash on a file (no need to keep it completely in memory). OTOH, if I'm right that the next approach is used for nodeids: | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 240 // changeset nodeid + hash(actual content) => entry (Nodeid) in the next Manifest | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 241 // then it's sufficient to check parents from dirstate, and if they do not match parents from file's baseRevision (non matching parents means different nodeids). | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 242 // The question is whether original Hg treats this case (same content, different parents and hence nodeids) as 'modified' or 'clean' | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 243 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 244 | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 245 private static String todoGenerateFlags(String fname) { | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 246 // FIXME implement | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 247 return null; | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 248 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 249 private static boolean areTheSame(File f, byte[] data) { | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 250 try { | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 251 BufferedInputStream is = new BufferedInputStream(new FileInputStream(f)); | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 252 int i = 0; | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 253 while (i < data.length && data[i] == is.read()) { | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 254 i++; // increment only for successful match, otherwise won't tell last byte in data was the same as read from the stream | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 255 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 256 return i == data.length && is.read() == -1; // although data length is expected to be the same (see caller), check that we reached EOF, no more data left. | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 257 } catch (IOException ex) { | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 258 ex.printStackTrace(); // log warn | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 259 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 260 return false; | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 261 } | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 262 | 
| 
4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 263 } | 
