Mercurial > hg4j
annotate src/com/tmate/hgkit/ll/LocalHgRepo.java @ 48:e34f90b9ded1
Limit option for history/log
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Fri, 14 Jan 2011 23:22:20 +0100 | 
| parents | d4fdd1845b3f | 
| children | f1db8610da62 | 
| rev | line source | 
|---|---|
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
9 
diff
changeset
 | 
1 /* | 
| 
20
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
2 * Copyright (c) 2010, 2011 Artem Tikhomirov | 
| 
1
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
3 */ | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
4 package com.tmate.hgkit.ll; | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
5 | 
| 
22
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
6 import java.io.BufferedInputStream; | 
| 
8
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
7 import java.io.BufferedReader; | 
| 
1
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
8 import java.io.File; | 
| 
8
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
9 import java.io.FileInputStream; | 
| 
1
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
10 import java.io.IOException; | 
| 
8
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
11 import java.io.InputStreamReader; | 
| 
3
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
12 import java.lang.ref.SoftReference; | 
| 
8
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
13 import java.util.Arrays; | 
| 
3
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
14 import java.util.HashMap; | 
| 
18
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
15 import java.util.LinkedList; | 
| 
8
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
16 import java.util.TreeSet; | 
| 
1
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
17 | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
9 
diff
changeset
 | 
18 import com.tmate.hgkit.fs.DataAccessProvider; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
9 
diff
changeset
 | 
19 | 
| 
1
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
20 /** | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
21 * @author artem | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
22 */ | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
23 public class LocalHgRepo extends HgRepository { | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
24 | 
| 
8
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
25 private File repoDir; // .hg folder | 
| 
1
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
26 private final String repoLocation; | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
9 
diff
changeset
 | 
27 private final DataAccessProvider dataAccess; | 
| 
1
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
28 | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
29 public LocalHgRepo(String repositoryPath) { | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
30 setInvalid(true); | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
31 repoLocation = repositoryPath; | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
9 
diff
changeset
 | 
32 dataAccess = null; | 
| 
1
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
33 } | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
34 | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
35 public LocalHgRepo(File repositoryRoot) throws IOException { | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
36 assert ".hg".equals(repositoryRoot.getName()) && repositoryRoot.isDirectory(); | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
37 setInvalid(false); | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
38 repoDir = repositoryRoot; | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
39 repoLocation = repositoryRoot.getParentFile().getCanonicalPath(); | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
9 
diff
changeset
 | 
40 dataAccess = new DataAccessProvider(); | 
| 
8
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
41 parseRequires(); | 
| 
1
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
42 } | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
43 | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
44 @Override | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
45 public String getLocation() { | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
46 return repoLocation; | 
| 
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
47 } | 
| 
18
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
48 | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
49 @Override | 
| 
20
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
50 public void status(int rev1, int rev2, final StatusInspector inspector) { | 
| 
21
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
51 final ManifestRevisionCollector collect = new ManifestRevisionCollector(); | 
| 
20
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
52 getManifest().walk(rev1, rev1, collect); | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
53 | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
54 HgManifest.Inspector compare = new HgManifest.Inspector() { | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
55 | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
56 public boolean begin(int revision, Nodeid nid) { | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
57 return true; | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
58 } | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
59 | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
60 public boolean next(Nodeid nid, String fname, String flags) { | 
| 
21
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
61 Nodeid nidR1 = collect.idsMap.remove(fname); | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
62 String flagsR1 = collect.flagsMap.remove(fname); | 
| 
20
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
63 if (nidR1 == null) { | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
64 inspector.added(fname); | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
65 } else { | 
| 
24
 
d4fdd1845b3f
Nodeid with array of exactly 20 bytes
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
22 
diff
changeset
 | 
66 if (nidR1.equals(nid) && ((flags == null && flagsR1 == null) || flags.equals(flagsR1))) { | 
| 
20
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
67 inspector.clean(fname); | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
68 } else { | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
69 inspector.modified(fname); | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
70 } | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
71 } | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
72 return true; | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
73 } | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
74 | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
75 public boolean end(int revision) { | 
| 
21
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
76 for (String fname : collect.idsMap.keySet()) { | 
| 
20
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
77 inspector.removed(fname); | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
78 } | 
| 
21
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
79 if (collect.idsMap.size() != collect.flagsMap.size()) { | 
| 
20
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
80 throw new IllegalStateException(); | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
81 } | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
82 return false; | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
83 } | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
84 }; | 
| 
 
11cfabe692b3
Status operation for two repository revisions (no local dir involved)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
18 
diff
changeset
 | 
85 getManifest().walk(rev2, rev2, compare); | 
| 
18
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
86 } | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
87 | 
| 
21
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
88 public void statusLocal(int baseRevision, StatusInspector inspector) { | 
| 
18
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
89 LinkedList<File> folders = new LinkedList<File>(); | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
90 final File rootDir = repoDir.getParentFile(); | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
91 folders.add(rootDir); | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
92 final HgDirstate dirstate = loadDirstate(); | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
93 final HgIgnore hgignore = loadIgnore(); | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
94 TreeSet<String> knownEntries = dirstate.all(); | 
| 
22
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
95 final boolean isTipBase = baseRevision == TIP || baseRevision == getManifest().getRevisionCount(); | 
| 
21
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
96 final ManifestRevisionCollector collect = isTipBase ? null : new ManifestRevisionCollector(); | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
97 if (!isTipBase) { | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
98 getManifest().walk(baseRevision, baseRevision, collect); | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
99 } | 
| 
18
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
100 do { | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
101 File d = folders.removeFirst(); | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
102 for (File f : d.listFiles()) { | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
103 if (f.isDirectory()) { | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
104 if (!".hg".equals(f.getName())) { | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
105 folders.addLast(f); | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
106 } | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
107 } else { | 
| 
22
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
108 // FIXME path relative to rootDir - need more robust approach | 
| 
18
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
109 String fname = normalize(f.getPath().substring(rootDir.getPath().length() + 1)); | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
110 if (hgignore.isIgnored(fname)) { | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
111 inspector.ignored(fname); | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
112 } else { | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
113 if (knownEntries.remove(fname)) { | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
114 // modified, added, removed, clean | 
| 
22
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
115 if (collect != null) { // need to check against base revision, not FS file | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
116 checkLocalStatusAgainstBaseRevision(collect, fname, f, dirstate, inspector); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
117 } else { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
118 checkLocalStatusAgainstFile(fname, f, dirstate, inspector); | 
| 
18
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
119 } | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
120 } else { | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
121 inspector.unknown(fname); | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
122 } | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
123 } | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
124 } | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
125 } | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
126 } while (!folders.isEmpty()); | 
| 
22
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
127 if (collect != null) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
128 for (String r : collect.idsMap.keySet()) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
129 inspector.removed(r); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
130 } | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
131 } | 
| 
18
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
132 for (String m : knownEntries) { | 
| 
22
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
133 // removed from the repository and missing from working dir shall not be reported as 'deleted' | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
134 if (dirstate.checkRemoved(m) == null) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
135 inspector.missing(m); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
136 } | 
| 
18
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
137 } | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
138 } | 
| 
 
02ee376bee79
status operation against current working directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
15 
diff
changeset
 | 
139 | 
| 
22
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
140 private static void checkLocalStatusAgainstFile(String fname, File f, HgDirstate dirstate, StatusInspector inspector) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
141 HgDirstate.Record r; | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
142 if ((r = dirstate.checkNormal(fname)) != null) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
143 // either clean or modified | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
144 if (f.lastModified() / 1000 == r.time && r.size == f.length()) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
145 inspector.clean(fname); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
146 } else { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
147 // FIXME check actual content to avoid false modified files | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
148 inspector.modified(fname); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
149 } | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
150 } else if ((r = dirstate.checkAdded(fname)) != null) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
151 if (r.name2 == null) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
152 inspector.added(fname); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
153 } else { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
154 inspector.copied(fname, r.name2); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
155 } | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
156 } else if ((r = dirstate.checkRemoved(fname)) != null) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
157 inspector.removed(fname); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
158 } else if ((r = dirstate.checkMerged(fname)) != null) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
159 inspector.modified(fname); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
160 } | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
161 } | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
162 | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
163 // XXX refactor checkLocalStatus methods in more OO way | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
164 private void checkLocalStatusAgainstBaseRevision(ManifestRevisionCollector collect, String fname, File f, HgDirstate dirstate, StatusInspector inspector) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
165 // fname is in the dirstate, either Normal, Added, Removed or Merged | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
166 Nodeid nid1 = collect.idsMap.remove(fname); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
167 String flags = collect.flagsMap.remove(fname); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
168 HgDirstate.Record r; | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
169 if (nid1 == null) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
170 // normal: added? | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
171 // added: not known at the time of baseRevision, shall report | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
172 // merged: was not known, report as added? | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
173 if ((r = dirstate.checkAdded(fname)) != null) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
174 if (r.name2 != null && collect.idsMap.containsKey(r.name2)) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
175 collect.idsMap.remove(r.name2); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
176 collect.idsMap.remove(r.name2); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
177 inspector.copied(r.name2, fname); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
178 return; | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
179 } | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
180 // fall-through, report as added | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
181 } else if (dirstate.checkRemoved(fname) != null) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
182 // removed: removed file was not known at the time of baseRevision, and we should not report it as removed | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
183 return; | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
184 } | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
185 inspector.added(fname); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
186 } else { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
187 // was known; check whether clean or modified | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
188 // when added - seems to be the case of a file added once again, hence need to check if content is different | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
189 if ((r = dirstate.checkNormal(fname)) != null || (r = dirstate.checkMerged(fname)) != null || (r = dirstate.checkAdded(fname)) != null) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
190 // either clean or modified | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
191 HgDataFile fileNode = getFileNode(fname); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
192 final int lengthAtRevision = fileNode.length(nid1); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
193 if (r.size /* XXX File.length() ?! */ != lengthAtRevision || flags != todoGenerateFlags(fname /*java.io.File*/)) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
194 inspector.modified(fname); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
195 } else { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
196 // check actual content to see actual changes | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
197 // XXX consider adding HgDataDile.compare(File/byte[]/whatever) operation to optimize comparison | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
198 if (areTheSame(f, fileNode.content(nid1))) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
199 inspector.clean(fname); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
200 } else { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
201 inspector.modified(fname); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
202 } | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
203 } | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
204 } | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
205 // only those left in idsMap after processing are reported as removed | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
206 } | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
207 | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
208 // 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 | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
209 // 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 | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
210 // 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: | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
211 // changeset nodeid + hash(actual content) => entry (Nodeid) in the next Manifest | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
212 // 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). | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
213 // The question is whether original Hg treats this case (same content, different parents and hence nodeids) as 'modified' or 'clean' | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
214 } | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
215 | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
216 private static String todoGenerateFlags(String fname) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
217 // FIXME implement | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
218 return null; | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
219 } | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
220 private static boolean areTheSame(File f, byte[] data) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
221 try { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
222 BufferedInputStream is = new BufferedInputStream(new FileInputStream(f)); | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
223 int i = 0; | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
224 while (i < data.length && data[i] == is.read()) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
225 i++; // increment only for successful match, otherwise won't tell last byte in data was the same as read from the stream | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
226 } | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
227 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. | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
228 } catch (IOException ex) { | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
229 ex.printStackTrace(); // log warn | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
230 } | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
231 return false; | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
232 } | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
233 | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
9 
diff
changeset
 | 
234 // XXX package-local, unless there are cases when required from outside (guess, working dir/revision walkers may hide dirstate access and no public visibility needed) | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
9 
diff
changeset
 | 
235 public final HgDirstate loadDirstate() { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
9 
diff
changeset
 | 
236 // XXX may cache in SoftReference if creation is expensive | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
9 
diff
changeset
 | 
237 return new HgDirstate(this, new File(repoDir, "dirstate")); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
9 
diff
changeset
 | 
238 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
9 
diff
changeset
 | 
239 | 
| 
15
 
865bf07f381f
Basic hgignore handling
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
10 
diff
changeset
 | 
240 // package-local, see comment for loadDirstate | 
| 
 
865bf07f381f
Basic hgignore handling
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
10 
diff
changeset
 | 
241 public final HgIgnore loadIgnore() { | 
| 
 
865bf07f381f
Basic hgignore handling
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
10 
diff
changeset
 | 
242 return new HgIgnore(this); | 
| 
 
865bf07f381f
Basic hgignore handling
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
10 
diff
changeset
 | 
243 } | 
| 
 
865bf07f381f
Basic hgignore handling
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
10 
diff
changeset
 | 
244 | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
9 
diff
changeset
 | 
245 /*package-local*/ DataAccessProvider getDataAccess() { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
9 
diff
changeset
 | 
246 return dataAccess; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
9 
diff
changeset
 | 
247 } | 
| 
15
 
865bf07f381f
Basic hgignore handling
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
10 
diff
changeset
 | 
248 | 
| 
 
865bf07f381f
Basic hgignore handling
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
10 
diff
changeset
 | 
249 /*package-local*/ File getRepositoryRoot() { | 
| 
 
865bf07f381f
Basic hgignore handling
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
10 
diff
changeset
 | 
250 return repoDir; | 
| 
 
865bf07f381f
Basic hgignore handling
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
10 
diff
changeset
 | 
251 } | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
9 
diff
changeset
 | 
252 | 
| 
3
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
253 private final HashMap<String, SoftReference<RevlogStream>> streamsCache = new HashMap<String, SoftReference<RevlogStream>>(); | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
254 | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
255 /** | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
256 * path - repository storage path (i.e. one usually with .i or .d) | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
257 */ | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
258 @Override | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
259 protected RevlogStream resolve(String path) { | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
260 final SoftReference<RevlogStream> ref = streamsCache.get(path); | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
261 RevlogStream cached = ref == null ? null : ref.get(); | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
262 if (cached != null) { | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
263 return cached; | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
264 } | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
265 File f = new File(repoDir, path); | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
266 if (f.exists()) { | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
9 
diff
changeset
 | 
267 RevlogStream s = new RevlogStream(dataAccess, f); | 
| 
3
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
268 streamsCache.put(path, new SoftReference<RevlogStream>(s)); | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
269 return s; | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
270 } | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
271 return null; | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
272 } | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
273 | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
274 @Override | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
275 public HgDataFile getFileNode(String path) { | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
276 String nPath = normalize(path); | 
| 
8
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
277 String storagePath = toStoragePath(nPath, true); | 
| 
3
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
278 RevlogStream content = resolve(storagePath); | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
279 // XXX no content when no file? or HgDataFile.exists() to detect that? How about files that were removed in previous releases? | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
280 return new HgDataFile(this, nPath, content); | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
281 } | 
| 
8
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
282 | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
283 private boolean revlogv1; | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
284 private boolean store; | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
285 private boolean fncache; | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
286 private boolean dotencode; | 
| 
3
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
287 | 
| 
8
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
288 | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
289 private void parseRequires() { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
290 File requiresFile = new File(repoDir, "requires"); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
291 if (!requiresFile.exists()) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
292 return; | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
293 } | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
294 try { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
295 BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(requiresFile))); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
296 String line; | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
297 while ((line = br.readLine()) != null) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
298 revlogv1 |= "revlogv1".equals(line); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
299 store |= "store".equals(line); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
300 fncache |= "fncache".equals(line); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
301 dotencode |= "dotencode".equals(line); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
302 } | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
303 } catch (IOException ex) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
304 ex.printStackTrace(); // FIXME log | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
305 } | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
306 } | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
307 | 
| 
9
 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
8 
diff
changeset
 | 
308 // FIXME document what path argument is, whether it includes .i or .d, and whether it's 'normalized' (slashes) or not. | 
| 
 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
8 
diff
changeset
 | 
309 // since .hg/store keeps both .i files and files without extension (e.g. fncache), guees, for data == false | 
| 
 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
8 
diff
changeset
 | 
310 // we shall assume path has extension | 
| 
3
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
311 // FIXME much more to be done, see store.py:_hybridencode | 
| 
8
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
312 // @see http://mercurial.selenic.com/wiki/CaseFoldingPlan | 
| 
9
 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
8 
diff
changeset
 | 
313 @Override | 
| 
8
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
314 protected String toStoragePath(String path, boolean data) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
315 path = normalize(path); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
316 final String STR_STORE = "store/"; | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
317 final String STR_DATA = "data/"; | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
318 final String STR_DH = "dh/"; | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
319 if (!data) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
320 return this.store ? STR_STORE + path : path; | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
321 } | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
322 path = path.replace(".hg/", ".hg.hg/").replace(".i/", ".i.hg/").replace(".d/", ".d.hg/"); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
323 StringBuilder sb = new StringBuilder(path.length() << 1); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
324 if (store || fncache) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
325 // encodefilename | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
326 final String reservedChars = "\\:*?\"<>|"; | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
327 // in fact, \\ is unlikely to match, ever - we've replaced all of them already, above. Just regards to store.py | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
328 int x; | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
329 char[] hexByte = new char[2]; | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
330 for (int i = 0; i < path.length(); i++) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
331 final char ch = path.charAt(i); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
332 if (ch >= 'a' && ch <= 'z') { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
333 sb.append(ch); // POIRAE | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
334 } else if (ch >= 'A' && ch <= 'Z') { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
335 sb.append('_'); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
336 sb.append(Character.toLowerCase(ch)); // Perhaps, (char) (((int) ch) + 32)? Even better, |= 0x20? | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
337 } else if ( (x = reservedChars.indexOf(ch)) != -1) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
338 sb.append('~'); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
339 sb.append(toHexByte(reservedChars.charAt(x), hexByte)); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
340 } else if ((ch >= '~' /*126*/ && ch <= 255) || ch < ' ' /*32*/) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
341 sb.append('~'); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
342 sb.append(toHexByte(ch, hexByte)); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
343 } else if (ch == '_') { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
344 // note, encoding from store.py:_buildencodefun and :_build_lower_encodefun | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
345 // differ in the way they process '_' (latter doesn't escape it) | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
346 sb.append('_'); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
347 sb.append('_'); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
348 } else { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
349 sb.append(ch); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
350 } | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
351 } | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
352 // auxencode | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
353 if (fncache) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
354 x = 0; // last segment start | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
355 final TreeSet<String> windowsReservedFilenames = new TreeSet<String>(); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
356 windowsReservedFilenames.addAll(Arrays.asList("con prn aux nul com1 com2 com3 com4 com5 com6 com7 com8 com9 lpt1 lpt2 lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9".split(" "))); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
357 do { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
358 int i = sb.indexOf("/", x); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
359 if (i == -1) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
360 i = sb.length(); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
361 } | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
362 // windows reserved filenames are at least of length 3 | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
363 if (i - x >= 3) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
364 boolean found = false; | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
365 if (i-x == 3) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
366 found = windowsReservedFilenames.contains(sb.subSequence(x, i)); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
367 } else if (sb.charAt(x+3) == '.') { // implicit i-x > 3 | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
368 found = windowsReservedFilenames.contains(sb.subSequence(x, x+3)); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
369 } else if (i-x > 4 && sb.charAt(x+4) == '.') { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
370 found = windowsReservedFilenames.contains(sb.subSequence(x, x+4)); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
371 } | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
372 if (found) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
373 sb.setCharAt(x, '~'); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
374 sb.insert(x+1, toHexByte(sb.charAt(x+2), hexByte)); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
375 i += 2; | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
376 } | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
377 } | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
378 if (dotencode && (sb.charAt(x) == '.' || sb.charAt(x) == ' ')) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
379 sb.insert(x+1, toHexByte(sb.charAt(x), hexByte)); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
380 sb.setCharAt(x, '~'); // setChar *after* charAt/insert to get ~2e, not ~7e for '.' | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
381 i += 2; | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
382 } | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
383 x = i+1; | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
384 } while (x < sb.length()); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
385 } | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
386 } | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
387 final int MAX_PATH_LEN_IN_HGSTORE = 120; | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
388 if (fncache && (sb.length() + STR_DATA.length() > MAX_PATH_LEN_IN_HGSTORE)) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
389 throw HgRepository.notImplemented(); // FIXME digest and fncache use | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
390 } | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
391 if (this.store) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
392 sb.insert(0, STR_STORE + STR_DATA); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
393 } | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
394 sb.append(".i"); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
395 return sb.toString(); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
396 } | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
397 | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
398 private static char[] toHexByte(int ch, char[] buf) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
399 assert buf.length > 1; | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
400 final String hexDigits = "0123456789abcdef"; | 
| 
9
 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
8 
diff
changeset
 | 
401 buf[0] = hexDigits.charAt((ch & 0x00F0) >>> 4); | 
| 
8
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
402 buf[1] = hexDigits.charAt(ch & 0x0F); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
403 return buf; | 
| 
3
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
404 } | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
405 | 
| 
9
 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
8 
diff
changeset
 | 
406 // TODO handle . and .. (although unlikely to face them from GUI client) | 
| 
3
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
407 private static String normalize(String path) { | 
| 
8
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
408 path = path.replace('\\', '/').replace("//", "/"); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
409 if (path.startsWith("/")) { | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
410 path = path.substring(1); | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
411 } | 
| 
 
a78c980749e3
Filename mangling according to requires options of the store (fncache incomplete for long names)
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
412 return path; | 
| 
3
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
1 
diff
changeset
 | 
413 } | 
| 
21
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
414 | 
| 
22
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
415 // XXX idsMap is being modified from outside. It's better to let outer (modifying) code to create these maps instead | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
416 private static final class ManifestRevisionCollector implements HgManifest.Inspector { | 
| 
21
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
417 final HashMap<String, Nodeid> idsMap = new HashMap<String, Nodeid>(); | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
418 final HashMap<String, String> flagsMap = new HashMap<String, String>(); | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
419 | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
420 public boolean next(Nodeid nid, String fname, String flags) { | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
421 idsMap.put(fname, nid); | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
422 flagsMap.put(fname, flags); | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
423 return true; | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
424 } | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
425 | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
426 public boolean end(int revision) { | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
427 return false; | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
428 } | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
429 | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
430 public boolean begin(int revision, Nodeid nid) { | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
431 return true; | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
432 } | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
20 
diff
changeset
 | 
433 } | 
| 
1
 
a3576694a4d1
Repository detection from local/specified directory
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
434 } | 
