Mercurial > jhg
annotate src/org/tmatesoft/hg/repo/HgDirstate.java @ 335:3d41dc148d14
Do not fail with exception on syntax errors in .hgignore
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Thu, 10 Nov 2011 05:44:12 +0100 | 
| parents | 72c6eda838a6 | 
| children | a0864b2892cd | 
| rev | line source | 
|---|---|
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 1 /* | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 2 * Copyright (c) 2010-2011 TMate Software Ltd | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 3 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
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: 
59diff
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: 
59diff
changeset | 6 * the Free Software Foundation; version 2 of the License. | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 7 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
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: 
59diff
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: 
59diff
changeset | 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 11 * GNU General Public License for more details. | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 12 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 13 * For information on how to redistribute this software under | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
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: 
93diff
changeset | 15 * contact TMate Software at support@hg4j.com | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 16 */ | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 17 package org.tmatesoft.hg.repo; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 18 | 
| 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: 
280diff
changeset | 19 import static org.tmatesoft.hg.core.Nodeid.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: 
280diff
changeset | 20 | 
| 252 
a6d19adc2636
HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
231diff
changeset | 21 import java.io.BufferedReader; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 22 import java.io.File; | 
| 252 
a6d19adc2636
HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
231diff
changeset | 23 import java.io.FileReader; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 24 import java.io.IOException; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 25 import java.util.Collections; | 
| 293 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 26 import java.util.HashMap; | 
| 18 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 27 import java.util.LinkedHashMap; | 
| 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 28 import java.util.Map; | 
| 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 29 import java.util.TreeSet; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 30 | 
| 231 
1792b37650f2
Introduced access to conflict resolution information (merge state)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
227diff
changeset | 31 import org.tmatesoft.hg.core.HgBadStateException; | 
| 
1792b37650f2
Introduced access to conflict resolution information (merge state)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
227diff
changeset | 32 import org.tmatesoft.hg.core.Nodeid; | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 33 import org.tmatesoft.hg.internal.DataAccess; | 
| 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: 
280diff
changeset | 34 import org.tmatesoft.hg.util.Pair; | 
| 141 
8248aae33f7d
Adopt FileIterator moving towards WCStatusCollector parameterizing. Improved path handling, move 'em around
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 35 import org.tmatesoft.hg.util.Path; | 
| 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: 
280diff
changeset | 36 import org.tmatesoft.hg.util.PathPool; | 
| 291 
1483e57541ef
Refactor PathRewrite to accept any char sequence, not only string
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
290diff
changeset | 37 import org.tmatesoft.hg.util.PathRewrite; | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 38 | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 39 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 40 /** | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 41 * @see http://mercurial.selenic.com/wiki/DirState | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 42 * @see http://mercurial.selenic.com/wiki/FileFormats#dirstate | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 43 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 44 * @author Artem Tikhomirov | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
59diff
changeset | 45 * @author TMate Software Ltd. | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 46 */ | 
| 290 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 47 public final class HgDirstate /* XXX RepoChangeListener */{ | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 48 | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 49 public enum EntryKind { | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 50 Normal, Added, Removed, Merged, // order is being used in code of this class, don't change unless any use is checked | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 51 } | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 52 | 
| 252 
a6d19adc2636
HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
231diff
changeset | 53 private final HgRepository repo; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 54 private final File dirstateFile; | 
| 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: 
280diff
changeset | 55 private final PathPool pathPool; | 
| 291 
1483e57541ef
Refactor PathRewrite to accept any char sequence, not only string
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
290diff
changeset | 56 private final PathRewrite canonicalPathRewrite; | 
| 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: 
280diff
changeset | 57 private Map<Path, Record> normal; | 
| 
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: 
280diff
changeset | 58 private Map<Path, Record> added; | 
| 
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: 
280diff
changeset | 59 private Map<Path, Record> removed; | 
| 
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: 
280diff
changeset | 60 private Map<Path, Record> merged; | 
| 293 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 61 /* map of canonicalized file names to their originals from dirstate file. | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 62 * Note, only those canonical names that differ from their dirstate counterpart are recorded here | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 63 */ | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 64 private Map<Path, Path> canonical2dirstateName; | 
| 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: 
280diff
changeset | 65 private Pair<Nodeid, Nodeid> parents; | 
| 252 
a6d19adc2636
HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
231diff
changeset | 66 private String currentBranch; | 
| 
a6d19adc2636
HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
231diff
changeset | 67 | 
| 291 
1483e57541ef
Refactor PathRewrite to accept any char sequence, not only string
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
290diff
changeset | 68 // canonicalPath may be null if we don't need to check for names other than in dirstate | 
| 
1483e57541ef
Refactor PathRewrite to accept any char sequence, not only string
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
290diff
changeset | 69 /*package-local*/ HgDirstate(HgRepository hgRepo, File dirstate, PathPool pathPool, PathRewrite canonicalPath) { | 
| 252 
a6d19adc2636
HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
231diff
changeset | 70 repo = hgRepo; | 
| 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: 
280diff
changeset | 71 dirstateFile = dirstate; // XXX decide whether file names shall be kept local to reader (see #branches()) or passed from outside | 
| 
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: 
280diff
changeset | 72 this.pathPool = pathPool; | 
| 291 
1483e57541ef
Refactor PathRewrite to accept any char sequence, not only string
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
290diff
changeset | 73 canonicalPathRewrite = canonicalPath; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 74 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 75 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 76 private void read() { | 
| 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: 
280diff
changeset | 77 normal = added = removed = merged = Collections.<Path, Record>emptyMap(); | 
| 332 
72c6eda838a6
NPE in HgDirstate.known() when no dirstate file present
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 78 if (canonicalPathRewrite != null) { | 
| 
72c6eda838a6
NPE in HgDirstate.known() when no dirstate file present
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 79 canonical2dirstateName = new HashMap<Path,Path>(); | 
| 
72c6eda838a6
NPE in HgDirstate.known() when no dirstate file present
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 80 } else { | 
| 
72c6eda838a6
NPE in HgDirstate.known() when no dirstate file present
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 81 canonical2dirstateName = Collections.emptyMap(); | 
| 
72c6eda838a6
NPE in HgDirstate.known() when no dirstate file present
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 82 } | 
| 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: 
18diff
changeset | 83 if (dirstateFile == null || !dirstateFile.exists()) { | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 84 return; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 85 } | 
| 252 
a6d19adc2636
HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
231diff
changeset | 86 DataAccess da = repo.getDataAccess().create(dirstateFile); | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 87 if (da.isEmpty()) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 88 return; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 89 } | 
| 18 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 90 // not sure linked is really needed here, just for ease of debug | 
| 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: 
280diff
changeset | 91 normal = new LinkedHashMap<Path, Record>(); | 
| 
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: 
280diff
changeset | 92 added = new LinkedHashMap<Path, Record>(); | 
| 
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: 
280diff
changeset | 93 removed = new LinkedHashMap<Path, Record>(); | 
| 
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: 
280diff
changeset | 94 merged = new LinkedHashMap<Path, Record>(); | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 95 try { | 
| 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: 
280diff
changeset | 96 parents = internalReadParents(da); | 
| 227 
0fd10e5016dd
IOException on empty repository with 40-byte dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
141diff
changeset | 97 // hg init; hg up produces an empty repository where dirstate has parents (40 bytes) only | 
| 
0fd10e5016dd
IOException on empty repository with 40-byte dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
141diff
changeset | 98 while (!da.isEmpty()) { | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 99 final byte state = da.readByte(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 100 final int fmode = da.readInt(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 101 final int size = da.readInt(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 102 final int time = da.readInt(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 103 final int nameLen = da.readInt(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 104 String fn1 = null, fn2 = null; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 105 byte[] name = new byte[nameLen]; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 106 da.readBytes(name, 0, nameLen); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 107 for (int i = 0; i < nameLen; i++) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 108 if (name[i] == 0) { | 
| 11 
d46773d89a19
Boundary error in dirstate entry, explicit encoding to face troubles (if any) asap.
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 109 fn1 = new String(name, 0, i, "UTF-8"); // XXX unclear from documentation what encoding is used there | 
| 
d46773d89a19
Boundary error in dirstate entry, explicit encoding to face troubles (if any) asap.
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 110 fn2 = new String(name, i+1, nameLen - i - 1, "UTF-8"); // need to check with different system codepages | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 111 break; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 112 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 113 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 114 if (fn1 == null) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 115 fn1 = new String(name); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 116 } | 
| 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: 
280diff
changeset | 117 Record r = new Record(fmode, size, time, pathPool.path(fn1), fn2 == null ? null : pathPool.path(fn2)); | 
| 293 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 118 if (canonicalPathRewrite != null) { | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 119 Path canonicalPath = pathPool.path(canonicalPathRewrite.rewrite(fn1).toString()); | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 120 if (canonicalPath != r.name()) { // == as they come from the same pool | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 121 assert !canonical2dirstateName.containsKey(canonicalPath); // otherwise there's already a file with same canonical name | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 122 // which can't happen for case-insensitive file system (or there's erroneous PathRewrite, perhaps doing smth else) | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 123 canonical2dirstateName.put(canonicalPath, r.name()); | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 124 } | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 125 if (fn2 != null) { | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 126 // not sure I need copy origin in the map, I don't seem to use it anywhere, | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 127 // but I guess I'll have to use it some day. | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 128 canonicalPath = pathPool.path(canonicalPathRewrite.rewrite(fn2).toString()); | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 129 if (canonicalPath != r.copySource()) { | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 130 canonical2dirstateName.put(canonicalPath, r.copySource()); | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 131 } | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 132 } | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 133 } | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 134 if (state == 'n') { | 
| 18 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 135 normal.put(r.name1, r); | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 136 } else if (state == 'a') { | 
| 18 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 137 added.put(r.name1, r); | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 138 } else if (state == 'r') { | 
| 18 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 139 removed.put(r.name1, r); | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 140 } else if (state == 'm') { | 
| 18 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 141 merged.put(r.name1, r); | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 142 } else { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 143 // FIXME log error? | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 144 } | 
| 227 
0fd10e5016dd
IOException on empty repository with 40-byte dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
141diff
changeset | 145 } | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 146 } catch (IOException ex) { | 
| 295 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
293diff
changeset | 147 repo.getContext().getLog().error(getClass(), ex, null); | 
| 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
293diff
changeset | 148 // FIXME clean dirstate? | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 149 } finally { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 150 da.done(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 151 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 152 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 153 | 
| 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: 
280diff
changeset | 154 private static Pair<Nodeid, Nodeid> internalReadParents(DataAccess da) throws IOException { | 
| 
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: 
280diff
changeset | 155 byte[] parents = new byte[40]; | 
| 
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: 
280diff
changeset | 156 da.readBytes(parents, 0, 40); | 
| 
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: 
280diff
changeset | 157 Nodeid n1 = Nodeid.fromBinary(parents, 0); | 
| 
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: 
280diff
changeset | 158 Nodeid n2 = Nodeid.fromBinary(parents, 20); | 
| 
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: 
280diff
changeset | 159 parents = 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: 
280diff
changeset | 160 return new Pair<Nodeid, Nodeid>(n1, n2); | 
| 
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: 
280diff
changeset | 161 } | 
| 
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: 
280diff
changeset | 162 | 
| 
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: 
280diff
changeset | 163 /** | 
| 290 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 164 * @return pair of working copy parents, with {@link Nodeid#NULL} for missing values. | 
| 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: 
280diff
changeset | 165 */ | 
| 
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: 
280diff
changeset | 166 public Pair<Nodeid,Nodeid> parents() { | 
| 
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: 
280diff
changeset | 167 if (parents == 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: 
280diff
changeset | 168 parents = readParents(repo, dirstateFile); | 
| 
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: 
280diff
changeset | 169 } | 
| 
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: 
280diff
changeset | 170 return parents; | 
| 
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: 
280diff
changeset | 171 } | 
| 
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: 
280diff
changeset | 172 | 
| 
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: 
280diff
changeset | 173 /** | 
| 
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: 
280diff
changeset | 174 * @return pair of parents, both {@link Nodeid#NULL} if dirstate is not available | 
| 
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: 
280diff
changeset | 175 */ | 
| 290 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 176 /*package-local*/ static Pair<Nodeid, Nodeid> readParents(HgRepository repo, File dirstateFile) { | 
| 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: 
280diff
changeset | 177 // do not read whole dirstate if all we need is WC parent information | 
| 231 
1792b37650f2
Introduced access to conflict resolution information (merge state)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
227diff
changeset | 178 if (dirstateFile == null || !dirstateFile.exists()) { | 
| 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: 
280diff
changeset | 179 return new Pair<Nodeid,Nodeid>(NULL, NULL); | 
| 231 
1792b37650f2
Introduced access to conflict resolution information (merge state)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
227diff
changeset | 180 } | 
| 252 
a6d19adc2636
HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
231diff
changeset | 181 DataAccess da = repo.getDataAccess().create(dirstateFile); | 
| 231 
1792b37650f2
Introduced access to conflict resolution information (merge state)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
227diff
changeset | 182 if (da.isEmpty()) { | 
| 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: 
280diff
changeset | 183 return new Pair<Nodeid,Nodeid>(NULL, NULL); | 
| 231 
1792b37650f2
Introduced access to conflict resolution information (merge state)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
227diff
changeset | 184 } | 
| 
1792b37650f2
Introduced access to conflict resolution information (merge state)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
227diff
changeset | 185 try { | 
| 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: 
280diff
changeset | 186 return internalReadParents(da); | 
| 231 
1792b37650f2
Introduced access to conflict resolution information (merge state)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
227diff
changeset | 187 } catch (IOException ex) { | 
| 
1792b37650f2
Introduced access to conflict resolution information (merge state)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
227diff
changeset | 188 throw new HgBadStateException(ex); // XXX in fact, our exception is not the best solution here. | 
| 
1792b37650f2
Introduced access to conflict resolution information (merge state)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
227diff
changeset | 189 } finally { | 
| 
1792b37650f2
Introduced access to conflict resolution information (merge state)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
227diff
changeset | 190 da.done(); | 
| 
1792b37650f2
Introduced access to conflict resolution information (merge state)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
227diff
changeset | 191 } | 
| 
1792b37650f2
Introduced access to conflict resolution information (merge state)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
227diff
changeset | 192 } | 
| 
1792b37650f2
Introduced access to conflict resolution information (merge state)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
227diff
changeset | 193 | 
| 
1792b37650f2
Introduced access to conflict resolution information (merge state)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
227diff
changeset | 194 /** | 
| 252 
a6d19adc2636
HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
231diff
changeset | 195 * @return branch associated with the working directory | 
| 
a6d19adc2636
HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
231diff
changeset | 196 */ | 
| 
a6d19adc2636
HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
231diff
changeset | 197 public String branch() { | 
| 290 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 198 // XXX is it really proper place for the method? | 
| 252 
a6d19adc2636
HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
231diff
changeset | 199 if (currentBranch == null) { | 
| 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: 
280diff
changeset | 200 currentBranch = readBranch(repo); | 
| 252 
a6d19adc2636
HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
231diff
changeset | 201 } | 
| 
a6d19adc2636
HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
231diff
changeset | 202 return currentBranch; | 
| 
a6d19adc2636
HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
231diff
changeset | 203 } | 
| 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: 
280diff
changeset | 204 | 
| 
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: 
280diff
changeset | 205 /** | 
| 
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: 
280diff
changeset | 206 * XXX is it really proper place for the method? | 
| 
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: 
280diff
changeset | 207 * @return branch associated with the working directory | 
| 
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: 
280diff
changeset | 208 */ | 
| 290 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 209 /*package-local*/ static String readBranch(HgRepository repo) { | 
| 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: 
280diff
changeset | 210 String branch = HgRepository.DEFAULT_BRANCH_NAME; | 
| 
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: 
280diff
changeset | 211 File branchFile = new File(repo.getRepositoryRoot(), "branch"); | 
| 
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: 
280diff
changeset | 212 if (branchFile.exists()) { | 
| 
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: 
280diff
changeset | 213 try { | 
| 
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: 
280diff
changeset | 214 BufferedReader r = new BufferedReader(new FileReader(branchFile)); | 
| 
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: 
280diff
changeset | 215 String b = r.readLine(); | 
| 
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: 
280diff
changeset | 216 if (b != 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: 
280diff
changeset | 217 b = b.trim().intern(); | 
| 
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: 
280diff
changeset | 218 } | 
| 
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: 
280diff
changeset | 219 branch = b == null || b.length() == 0 ? HgRepository.DEFAULT_BRANCH_NAME : b; | 
| 
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: 
280diff
changeset | 220 r.close(); | 
| 
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: 
280diff
changeset | 221 } catch (IOException ex) { | 
| 295 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
293diff
changeset | 222 repo.getContext().getLog().debug(HgDirstate.class, ex, null); // log verbose debug, exception might be legal here (i.e. FileNotFound) | 
| 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: 
280diff
changeset | 223 // IGNORE | 
| 
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: 
280diff
changeset | 224 } | 
| 
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: 
280diff
changeset | 225 } | 
| 
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: 
280diff
changeset | 226 return branch; | 
| 
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: 
280diff
changeset | 227 } | 
| 231 
1792b37650f2
Introduced access to conflict resolution information (merge state)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
227diff
changeset | 228 | 
| 18 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 229 // new, modifiable collection | 
| 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: 
280diff
changeset | 230 /*package-local*/ TreeSet<Path> all() { | 
| 290 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 231 if (normal == null) { | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 232 read(); | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 233 } | 
| 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: 
280diff
changeset | 234 TreeSet<Path> rv = new TreeSet<Path>(); | 
| 18 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 235 @SuppressWarnings("unchecked") | 
| 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: 
280diff
changeset | 236 Map<Path, Record>[] all = new Map[] { normal, added, removed, merged }; | 
| 18 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 237 for (int i = 0; i < all.length; i++) { | 
| 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 238 for (Record r : all[i].values()) { | 
| 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 239 rv.add(r.name1); | 
| 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 240 } | 
| 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 241 } | 
| 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 242 return rv; | 
| 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 243 } | 
| 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 244 | 
| 141 
8248aae33f7d
Adopt FileIterator moving towards WCStatusCollector parameterizing. Improved path handling, move 'em around
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 245 /*package-local*/ Record checkNormal(Path fname) { | 
| 293 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 246 return internalCheck(normal, fname); | 
| 18 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 247 } | 
| 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 248 | 
| 141 
8248aae33f7d
Adopt FileIterator moving towards WCStatusCollector parameterizing. Improved path handling, move 'em around
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 249 /*package-local*/ Record checkAdded(Path fname) { | 
| 293 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 250 return internalCheck(added, fname); | 
| 141 
8248aae33f7d
Adopt FileIterator moving towards WCStatusCollector parameterizing. Improved path handling, move 'em around
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 251 } | 
| 
8248aae33f7d
Adopt FileIterator moving towards WCStatusCollector parameterizing. Improved path handling, move 'em around
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 252 /*package-local*/ Record checkRemoved(Path fname) { | 
| 293 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 253 return internalCheck(removed, fname); | 
| 18 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 254 } | 
| 141 
8248aae33f7d
Adopt FileIterator moving towards WCStatusCollector parameterizing. Improved path handling, move 'em around
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 255 /*package-local*/ Record checkMerged(Path fname) { | 
| 293 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 256 return internalCheck(merged, fname); | 
| 18 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 257 } | 
| 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 258 | 
| 293 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 259 | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 260 // return non-null if fname is known, either as is, or its canonical form. in latter case, this canonical form is return value | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 261 /*package-local*/ Path known(Path fname) { | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 262 Path fnameCanonical = null; | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 263 if (canonicalPathRewrite != null) { | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 264 fnameCanonical = pathPool.path(canonicalPathRewrite.rewrite(fname).toString()); | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 265 if (fnameCanonical != fname && canonical2dirstateName.containsKey(fnameCanonical)) { | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 266 // we know right away there's name in dirstate with alternative canonical form | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 267 return canonical2dirstateName.get(fnameCanonical); | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 268 } | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 269 } | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 270 @SuppressWarnings("unchecked") | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 271 Map<Path, Record>[] all = new Map[] { normal, added, removed, merged }; | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 272 for (int i = 0; i < all.length; i++) { | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 273 if (all[i].containsKey(fname)) { | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 274 return fname; | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 275 } | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 276 if (fnameCanonical != null && all[i].containsKey(fnameCanonical)) { | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 277 return fnameCanonical; | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 278 } | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 279 } | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 280 return null; | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 281 } | 
| 18 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 282 | 
| 293 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 283 private Record internalCheck(Map<Path, Record> map, Path fname) { | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 284 Record rv = map.get(fname); | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 285 if (rv != null || canonicalPathRewrite == null) { | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 286 return rv; | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 287 } | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 288 Path fnameCanonical = pathPool.path(canonicalPathRewrite.rewrite(fname).toString()); | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 289 if (fnameCanonical != fname) { | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 290 // case when fname = /a/B/c, and dirstate is /a/b/C | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 291 if (canonical2dirstateName.containsKey(fnameCanonical)) { | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 292 return map.get(canonical2dirstateName.get(fnameCanonical)); | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 293 } | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 294 // try canonical directly, fname = /a/B/C, dirstate has /a/b/c | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 295 if ((rv = map.get(fnameCanonical)) != null) { | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 296 return rv; | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 297 } | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 298 } | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 299 return null; | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 300 } | 
| 18 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 301 | 
| 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 302 | 
| 93 
d55d4eedfc57
Switch to Path instead of String in filenames returned by various status operations
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
74diff
changeset | 303 /*package-local*/ void dump() { | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 304 read(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 305 @SuppressWarnings("unchecked") | 
| 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: 
280diff
changeset | 306 Map<Path, Record>[] all = new Map[] { normal, added, removed, merged }; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 307 char[] x = new char[] {'n', 'a', 'r', 'm' }; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 308 for (int i = 0; i < all.length; i++) { | 
| 18 
02ee376bee79
status operation against current working directory
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
14diff
changeset | 309 for (Record r : all[i].values()) { | 
| 14 
442dc6ee647b
Show correct time
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
12diff
changeset | 310 System.out.printf("%c %3o%6d %30tc\t\t%s", x[i], r.mode, r.size, (long) r.time * 1000, r.name1); | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 311 if (r.name2 != null) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 312 System.out.printf(" --> %s", r.name2); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 313 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 314 System.out.println(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 315 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 316 System.out.println(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 317 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 318 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 319 | 
| 290 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 320 public void walk(Inspector inspector) { | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 321 if (normal == null) { | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 322 read(); | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 323 } | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 324 @SuppressWarnings("unchecked") | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 325 Map<Path, Record>[] all = new Map[] { normal, added, removed, merged }; | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 326 for (int i = 0; i < all.length; i++) { | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 327 EntryKind k = EntryKind.values()[i]; | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 328 for (Record r : all[i].values()) { | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 329 if (!inspector.next(k, r)) { | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 330 return; | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 331 } | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 332 } | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 333 } | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 334 } | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 335 | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 336 public interface Inspector { | 
| 293 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 337 /** | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 338 * Invoked for each entry in the directory state file | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 339 * @param kind file record kind | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 340 * @param entry file record. Note, do not cache instance as it may be reused between the calls | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 341 * @return <code>true</code> to indicate further records are still of interest, <code>false</code> to stop iteration | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 342 */ | 
| 290 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 343 boolean next(EntryKind kind, Record entry); | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 344 } | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 345 | 
| 293 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 346 public static final class Record implements Cloneable { | 
| 290 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 347 private final int mode, size, time; | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 348 // Dirstate keeps local file size (i.e. that with any filters already applied). | 
| 280 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
252diff
changeset | 349 // Thus, can't compare directly to HgDataFile.length() | 
| 290 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 350 private final Path name1, name2; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 351 | 
| 290 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 352 /*package-local*/ Record(int fmode, int fsize, int ftime, Path name1, Path name2) { | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 353 mode = fmode; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 354 size = fsize; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 355 time = ftime; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 356 this.name1 = name1; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 357 this.name2 = name2; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 358 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 359 } | 
| 290 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 360 | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 361 public Path name() { | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 362 return name1; | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 363 } | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 364 | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 365 /** | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 366 * @return non-<code>null</code> for copy/move | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 367 */ | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 368 public Path copySource() { | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 369 return name2; | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 370 } | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 371 | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 372 public int modificationTime() { | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 373 return time; | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 374 } | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 375 | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 376 public int size() { | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 377 return size; | 
| 
8faad08c709b
Expose dirstate to allow pre-configuration of FileIterators for status collection in particular
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
284diff
changeset | 378 } | 
| 293 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 379 | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 380 @Override | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 381 public Record clone() { | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 382 try { | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 383 return (Record) super.clone(); | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 384 } catch (CloneNotSupportedException ex) { | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 385 throw new InternalError(ex.toString()); | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 386 } | 
| 
9774f47d904d
Issue 13: Status reports filenames with case other than in dirstate incorrectly
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
291diff
changeset | 387 } | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 388 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 389 } | 
