Mercurial > hg4j
annotate src/org/tmatesoft/hg/repo/HgDataFile.java @ 91:c2ce1cfaeb9e
ignore file with regex and 'honest' glob support
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Thu, 27 Jan 2011 06:06:42 +0100 | 
| parents | 61eedab3eb3e | 
| children | a3a2e5deb320 | 
| rev | line source | 
|---|---|
| 
17
 
571e1b2cc3f7
Query file for its parents. Demo of recently added ignore and digest support from within cat cmd
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
5 
diff
changeset
 | 
1 /* | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
2 * Copyright (c) 2010-2011 TMate Software Ltd | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
3 * | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
4 * This program is free software; you can redistribute it and/or modify | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
5 * it under the terms of the GNU General Public License as published by | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
6 * the Free Software Foundation; version 2 of the License. | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
7 * | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
8 * This program is distributed in the hope that it will be useful, | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
11 * GNU General Public License for more details. | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
12 * | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
13 * For information on how to redistribute this software under | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
14 * the terms of a license other than GNU General Public License | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
15 * contact TMate Software at support@svnkit.com | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
16 */ | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
17 package org.tmatesoft.hg.repo; | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
18 | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
19 import static org.tmatesoft.hg.repo.HgRepository.TIP; | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
20 | 
| 
78
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
21 import java.util.ArrayList; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
22 import java.util.Collection; | 
| 
79
 
5f9635c01681
TreeMap are more effective when keys are unique
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
78 
diff
changeset
 | 
23 import java.util.TreeMap; | 
| 
78
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
24 | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
25 import org.tmatesoft.hg.core.Nodeid; | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
26 import org.tmatesoft.hg.core.Path; | 
| 
77
 
c677e1593919
Moved RevlogStream implementation into .internal
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
27 import org.tmatesoft.hg.internal.RevlogStream; | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
28 | 
| 
5
 
fc265ddeab26
File content and non-effective, although working, patch application
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
29 | 
| 
17
 
571e1b2cc3f7
Query file for its parents. Demo of recently added ignore and digest support from within cat cmd
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
5 
diff
changeset
 | 
30 | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
31 /** | 
| 
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
32 * ? name:HgFileNode? | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
33 * | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
34 * @author Artem Tikhomirov | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
35 * @author TMate Software Ltd. | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
36 */ | 
| 
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
37 public class HgDataFile extends Revlog { | 
| 
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
38 | 
| 
3
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
39 // absolute from repo root? | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
40 // slashes, unix-style? | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
41 // repo location agnostic, just to give info to user, not to access real storage | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
42 private final Path path; | 
| 
78
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
43 private Metadata metadata; | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
44 | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
45 /*package-local*/HgDataFile(HgRepository hgRepo, Path path, RevlogStream content) { | 
| 
21
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
17 
diff
changeset
 | 
46 super(hgRepo, content); | 
| 
3
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
47 this.path = path; | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
48 } | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
49 | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
50 public boolean exists() { | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
51 return content != null; // XXX need better impl | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
52 } | 
| 
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
53 | 
| 
77
 
c677e1593919
Moved RevlogStream implementation into .internal
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
54 // human-readable (i.e. "COPYING", not "store/data/_c_o_p_y_i_n_g.i") | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
55 public Path getPath() { | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
56 return path; // hgRepo.backresolve(this) -> name? | 
| 
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
57 } | 
| 
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
58 | 
| 
22
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
59 public int length(Nodeid nodeid) { | 
| 
88
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
60 return content.dataLength(getLocalRevision(nodeid)); | 
| 
22
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
61 } | 
| 
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
62 | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
63 public byte[] content() { | 
| 
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
64 return content(TIP); | 
| 
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
65 } | 
| 
22
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
66 | 
| 
78
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
67 // for data files need to check heading of the file content for possible metadata | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
68 // @see http://mercurial.selenic.com/wiki/FileFormats#data.2BAC8- | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
69 @Override | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
70 public byte[] content(int revision) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
71 if (revision == TIP) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
72 revision = content.revisionCount() - 1; // FIXME maxRevision. | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
73 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
74 byte[] data = super.content(revision); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
75 if (data.length < 4 || (data[0] != 1 && data[1] != 10)) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
76 return data; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
77 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
78 int toSkip = 0; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
79 if (metadata == null || !metadata.known(revision)) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
80 int lastEntryStart = 2; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
81 int lastColon = -1; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
82 ArrayList<MetadataEntry> _metadata = new ArrayList<MetadataEntry>(); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
83 String key = null, value = null; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
84 for (int i = 2; i < data.length; i++) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
85 if (data[i] == (int) ':') { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
86 key = new String(data, lastEntryStart, i - lastEntryStart); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
87 lastColon = i; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
88 } else if (data[i] == '\n') { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
89 if (key == null || lastColon == -1 || i <= lastColon) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
90 throw new IllegalStateException(); // FIXME log instead and record null key in the metadata. Ex just to fail fast during dev | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
91 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
92 value = new String(data, lastColon + 1, i - lastColon - 1).trim(); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
93 _metadata.add(new MetadataEntry(key, value)); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
94 key = value = null; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
95 lastColon = -1; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
96 lastEntryStart = i+1; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
97 } else if (data[i] == 1 && i + 1 < data.length && data[i+1] == 10) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
98 if (key != null && lastColon != -1 && i > lastColon) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
99 // just in case last entry didn't end with newline | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
100 value = new String(data, lastColon + 1, i - lastColon - 1); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
101 _metadata.add(new MetadataEntry(key, value)); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
102 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
103 lastEntryStart = i+1; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
104 break; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
105 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
106 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
107 _metadata.trimToSize(); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
108 if (metadata == null) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
109 metadata = new Metadata(); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
110 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
111 metadata.add(revision, lastEntryStart, _metadata); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
112 toSkip = lastEntryStart; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
113 } else { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
114 toSkip = metadata.dataOffset(revision); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
115 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
116 // XXX copy of an array may be memory-hostile, a wrapper with baseOffsetShift(lastEntryStart) would be more convenient | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
117 byte[] rv = new byte[data.length - toSkip]; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
118 System.arraycopy(data, toSkip, rv, 0, rv.length); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
119 return rv; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
120 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
121 | 
| 
3
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
122 public void history(Changeset.Inspector inspector) { | 
| 
48
 
e34f90b9ded1
Limit option for history/log
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
37 
diff
changeset
 | 
123 history(0, content.revisionCount() - 1, inspector); | 
| 
 
e34f90b9ded1
Limit option for history/log
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
37 
diff
changeset
 | 
124 } | 
| 
 
e34f90b9ded1
Limit option for history/log
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
37 
diff
changeset
 | 
125 | 
| 
 
e34f90b9ded1
Limit option for history/log
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
37 
diff
changeset
 | 
126 public void history(int start, int end, Changeset.Inspector inspector) { | 
| 
3
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
127 if (!exists()) { | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
128 throw new IllegalStateException("Can't get history of invalid repository file node"); | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
129 } | 
| 
77
 
c677e1593919
Moved RevlogStream implementation into .internal
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
130 final int last = content.revisionCount() - 1; | 
| 
 
c677e1593919
Moved RevlogStream implementation into .internal
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
131 if (start < 0 || start > last) { | 
| 
 
c677e1593919
Moved RevlogStream implementation into .internal
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
132 throw new IllegalArgumentException(); | 
| 
 
c677e1593919
Moved RevlogStream implementation into .internal
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
133 } | 
| 
 
c677e1593919
Moved RevlogStream implementation into .internal
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
134 if (end == TIP) { | 
| 
 
c677e1593919
Moved RevlogStream implementation into .internal
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
135 end = last; | 
| 
 
c677e1593919
Moved RevlogStream implementation into .internal
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
136 } else if (end < start || end > last) { | 
| 
 
c677e1593919
Moved RevlogStream implementation into .internal
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
137 throw new IllegalArgumentException(); | 
| 
 
c677e1593919
Moved RevlogStream implementation into .internal
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
138 } | 
| 
48
 
e34f90b9ded1
Limit option for history/log
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
37 
diff
changeset
 | 
139 final int[] commitRevisions = new int[end - start + 1]; | 
| 
77
 
c677e1593919
Moved RevlogStream implementation into .internal
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
140 RevlogStream.Inspector insp = new RevlogStream.Inspector() { | 
| 
3
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
141 int count = 0; | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
142 | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
143 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, byte[] data) { | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
144 commitRevisions[count++] = linkRevision; | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
145 } | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
146 }; | 
| 
48
 
e34f90b9ded1
Limit option for history/log
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
37 
diff
changeset
 | 
147 content.iterate(start, end, false, insp); | 
| 
3
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
148 getRepo().getChangelog().range(inspector, commitRevisions); | 
| 
 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
2 
diff
changeset
 | 
149 } | 
| 
88
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
150 | 
| 
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
151 // for a given local revision of the file, find out local revision in the changelog | 
| 
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
152 public int getChangesetLocalRevision(int revision) { | 
| 
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
153 return content.linkRevision(revision); | 
| 
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
154 } | 
| 
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
155 | 
| 
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
156 public Nodeid getChangesetRevision(Nodeid nid) { | 
| 
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
157 int changelogRevision = getChangesetLocalRevision(getLocalRevision(nid)); | 
| 
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
158 return getRepo().getChangelog().getRevision(changelogRevision); | 
| 
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
159 } | 
| 
78
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
160 | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
161 public boolean isCopy() { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
162 if (metadata == null) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
163 content(0); // FIXME expensive way to find out metadata, distinct RevlogStream.Iterator would be better. | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
164 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
165 if (metadata == null || !metadata.known(0)) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
166 return false; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
167 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
168 return metadata.find(0, "copy") != null; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
169 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
170 | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
171 public Path getCopySourceName() { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
172 if (isCopy()) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
173 return Path.create(metadata.find(0, "copy")); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
174 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
175 throw new UnsupportedOperationException(); // XXX REVISIT, think over if Exception is good (clients would check isCopy() anyway, perhaps null is sufficient?) | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
176 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
177 | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
178 public Nodeid getCopySourceRevision() { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
179 if (isCopy()) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
180 return Nodeid.fromAscii(metadata.find(0, "copyrev")); // XXX reuse/cache Nodeid | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
181 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
182 throw new UnsupportedOperationException(); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
183 } | 
| 
88
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
184 | 
| 
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
185 @Override | 
| 
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
186 public String toString() { | 
| 
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
187 StringBuilder sb = new StringBuilder(getClass().getSimpleName()); | 
| 
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
188 sb.append('('); | 
| 
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
189 sb.append(getPath()); | 
| 
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
190 sb.append(')'); | 
| 
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
191 return sb.toString(); | 
| 
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
192 } | 
| 
78
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
193 | 
| 
88
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
79 
diff
changeset
 | 
194 private static final class MetadataEntry { | 
| 
78
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
195 private final String entry; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
196 private final int valueStart; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
197 /*package-local*/MetadataEntry(String key, String value) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
198 entry = key + value; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
199 valueStart = key.length(); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
200 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
201 /*package-local*/boolean matchKey(String key) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
202 return key.length() == valueStart && entry.startsWith(key); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
203 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
204 public String key() { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
205 return entry.substring(0, valueStart); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
206 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
207 public String value() { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
208 return entry.substring(valueStart); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
209 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
210 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
211 | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
212 private static class Metadata { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
213 // XXX sparse array needed | 
| 
79
 
5f9635c01681
TreeMap are more effective when keys are unique
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
78 
diff
changeset
 | 
214 private final TreeMap<Integer, Integer> offsets = new TreeMap<Integer, Integer>(); | 
| 
 
5f9635c01681
TreeMap are more effective when keys are unique
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
78 
diff
changeset
 | 
215 private final TreeMap<Integer, MetadataEntry[]> entries = new TreeMap<Integer, MetadataEntry[]>(); | 
| 
78
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
216 boolean known(int revision) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
217 return offsets.containsKey(revision); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
218 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
219 // since this is internal class, callers are supposed to ensure arg correctness (i.e. ask known() before) | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
220 int dataOffset(int revision) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
221 return offsets.get(revision); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
222 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
223 void add(int revision, int dataOffset, Collection<MetadataEntry> e) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
224 offsets.put(revision, dataOffset); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
225 entries.put(revision, e.toArray(new MetadataEntry[e.size()])); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
226 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
227 String find(int revision, String key) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
228 for (MetadataEntry me : entries.get(revision)) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
229 if (me.matchKey(key)) { | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
230 return me.value(); | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
231 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
232 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
233 return null; | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
234 } | 
| 
 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
235 } | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
236 } | 
