Mercurial > jhg
annotate src/org/tmatesoft/hg/repo/HgDataFile.java @ 709:497e697636fc
Report merged lines as changed block if possible, not as a sequence of added/deleted blocks. To facilitate access to merge parent lines AddBlock got mergeLineAt() method that reports index of the line in the second parent (if any), while insertedAt() has been changed to report index in the first parent always
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Wed, 21 Aug 2013 16:23:27 +0200 | 
| parents | 7efabe0cddcf | 
| children | 
| 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: 
5diff
changeset | 1 /* | 
| 603 
707b5c7c6fa4
Refactor HgBlameFacility: relevant action methods moved to proper home (HgDataFile), as facility doesn't provide anything but packaging of relevant methods/interfaces
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
602diff
changeset | 2 * Copyright (c) 2010-2013 TMate Software Ltd | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 3 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
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: 
56diff
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: 
56diff
changeset | 6 * the Free Software Foundation; version 2 of the License. | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 7 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
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: 
56diff
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: 
56diff
changeset | 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 11 * GNU General Public License for more details. | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 12 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 13 * For information on how to redistribute this software under | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 14 * the terms of a license other than GNU General Public License | 
| 102 
a3a2e5deb320
Updated contact address to support@hg4j.com
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
88diff
changeset | 15 * contact TMate Software at support@hg4j.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: 
56diff
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 | 
| 367 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 19 import static org.tmatesoft.hg.repo.HgInternals.wrongRevisionIndex; | 
| 148 
1a7a9a20e1f9
Exceptions, javadoc. Initial cancel and progress support
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
135diff
changeset | 20 import static org.tmatesoft.hg.repo.HgRepository.*; | 
| 602 
e3717fc7d26f
Refactor metadata parsing in HgDataFile, moved to standalone class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
600diff
changeset | 21 import static org.tmatesoft.hg.util.LogFacility.Severity.Info; | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 22 | 
| 237 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 23 import java.io.File; | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 24 import java.io.FileInputStream; | 
| 148 
1a7a9a20e1f9
Exceptions, javadoc. Initial cancel and progress support
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
135diff
changeset | 25 import java.io.IOException; | 
| 115 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 26 import java.nio.ByteBuffer; | 
| 237 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 27 import java.nio.channels.FileChannel; | 
| 240 
29231022fec8
Do not expect file history to be ordered
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
237diff
changeset | 28 import java.util.Arrays; | 
| 78 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 29 | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 30 import org.tmatesoft.hg.core.HgChangesetFileSneaker; | 
| 689 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 31 import org.tmatesoft.hg.core.HgFileRevision; | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 32 import org.tmatesoft.hg.core.Nodeid; | 
| 157 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 33 import org.tmatesoft.hg.internal.DataAccess; | 
| 619 
868b2ffdcd5c
Close FIS, not FileChannel, to clear both references to FileDescriptor right away
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
608diff
changeset | 34 import org.tmatesoft.hg.internal.FileUtils; | 
| 121 
b1d6208fb517
Conditionally apply filters to file content
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
115diff
changeset | 35 import org.tmatesoft.hg.internal.FilterByteChannel; | 
| 277 
74e7493a042a
Favor delegation over generalization
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
276diff
changeset | 36 import org.tmatesoft.hg.internal.FilterDataAccess; | 
| 420 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
417diff
changeset | 37 import org.tmatesoft.hg.internal.Internals; | 
| 602 
e3717fc7d26f
Refactor metadata parsing in HgDataFile, moved to standalone class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
600diff
changeset | 38 import org.tmatesoft.hg.internal.Metadata; | 
| 77 
c677e1593919
Moved RevlogStream implementation into .internal
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
74diff
changeset | 39 import org.tmatesoft.hg.internal.RevlogStream; | 
| 115 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 40 import org.tmatesoft.hg.util.ByteChannel; | 
| 237 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 41 import org.tmatesoft.hg.util.CancelSupport; | 
| 148 
1a7a9a20e1f9
Exceptions, javadoc. Initial cancel and progress support
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
135diff
changeset | 42 import org.tmatesoft.hg.util.CancelledException; | 
| 388 
b015f3918120
Work on FIXME: correct HgDataFile#workingCopy with tests; BasicSessionContext with property override; platform-specific options to internals
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
383diff
changeset | 43 import org.tmatesoft.hg.util.LogFacility; | 
| 305 
ae8d116f4ee2
Experimental code to build file history
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
300diff
changeset | 44 import org.tmatesoft.hg.util.Pair; | 
| 133 
4a948ec83980
core.Path to util.Path as it's not Hg repo dependant
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
129diff
changeset | 45 import org.tmatesoft.hg.util.Path; | 
| 237 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 46 import org.tmatesoft.hg.util.ProgressSupport; | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 47 | 
| 5 
fc265ddeab26
File content and non-effective, although working, patch application
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
3diff
changeset | 48 | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 49 /** | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 50 * Regular user data file stored in the repository. | 
| 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 51 * | 
| 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 52 * <p> Note, most methods accept index in the file's revision history, not that of changelog. Easy way to obtain | 
| 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 53 * changeset revision index from file's is to use {@link #getChangesetRevisionIndex(int)}. To obtain file's revision | 
| 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 54 * index for a given changeset, {@link HgManifest#getFileRevision(int, Path)} or {@link HgChangesetFileSneaker} may | 
| 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 55 * come handy. | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 56 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 57 * @author Artem Tikhomirov | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 58 * @author TMate Software Ltd. | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 59 */ | 
| 426 
063b0663495a
HgManifest#getFileRevisions refactored into #walkFileRevisions to match pattern throught rest of the library
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
425diff
changeset | 60 public final class HgDataFile extends Revlog { | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 61 | 
| 3 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 62 // absolute from repo root? | 
| 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 63 // slashes, unix-style? | 
| 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 64 // 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: 
56diff
changeset | 65 private final Path path; | 
| 694 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 66 /* | 
| 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 67 * Get initialized on first access to file content. | 
| 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 68 * We read metadata starting from rev 0 always, so that Metadata#lastRevisionRead() | 
| 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 69 * shows the region of file history [0..lastRevisionRead] we know metadata for | 
| 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 70 */ | 
| 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 71 private Metadata metadata; | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 72 | 
| 115 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 73 /*package-local*/HgDataFile(HgRepository hgRepo, Path filePath, RevlogStream content) { | 
| 600 
46f29b73e51e
Utilize RevisionLookup to speed-up getRevisionIndex of both manifest and changelog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
571diff
changeset | 74 super(hgRepo, content, false); | 
| 115 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 75 path = filePath; | 
| 3 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 76 } | 
| 115 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 77 | 
| 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 78 // exists is not the best name possible. now it means no file with such name was ever known to the repo. | 
| 426 
063b0663495a
HgManifest#getFileRevisions refactored into #walkFileRevisions to match pattern throught rest of the library
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
425diff
changeset | 79 // it might be confused with files existed before but lately removed. TODO HgFileNode.exists makes more sense. | 
| 
063b0663495a
HgManifest#getFileRevisions refactored into #walkFileRevisions to match pattern throught rest of the library
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
425diff
changeset | 80 // or HgDataFile.known() | 
| 3 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 81 public boolean exists() { | 
| 621 
99ad1e3a4e4d
RevlogStream: be aware of existence (not HgDataFile), facilitate use of an added HgDataFile over a commit; Rollback: be more sensitive about file changes (file size is not enough: write/rollback leaves it intact); tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
619diff
changeset | 82 return content.exists(); | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 83 } | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 84 | 
| 426 
063b0663495a
HgManifest#getFileRevisions refactored into #walkFileRevisions to match pattern throught rest of the library
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
425diff
changeset | 85 /** | 
| 
063b0663495a
HgManifest#getFileRevisions refactored into #walkFileRevisions to match pattern throught rest of the library
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
425diff
changeset | 86 * Human-readable file name, i.e. "COPYING", not "store/data/_c_o_p_y_i_n_g.i" | 
| 
063b0663495a
HgManifest#getFileRevisions refactored into #walkFileRevisions to match pattern throught rest of the library
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
425diff
changeset | 87 */ | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 88 public Path getPath() { | 
| 157 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 89 return path; // hgRepo.backresolve(this) -> name? In this case, what about hashed long names? | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 90 } | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 91 | 
| 275 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
245diff
changeset | 92 /** | 
| 416 
d30083c80d52
Better names - non-confusing and aligned with the rest of API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
415diff
changeset | 93 * Handy shorthand for {@link #getLength(int) length(getRevisionIndex(nodeid))} | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 94 * | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 95 * @param nodeid revision of the file | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 96 * | 
| 275 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
245diff
changeset | 97 * @return size of the file content at the given revision | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 98 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 275 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
245diff
changeset | 99 */ | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 100 public int getLength(Nodeid nodeid) throws HgRuntimeException { | 
| 396 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 101 try { | 
| 416 
d30083c80d52
Better names - non-confusing and aligned with the rest of API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
415diff
changeset | 102 return getLength(getRevisionIndex(nodeid)); | 
| 396 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 103 } catch (HgInvalidControlFileException ex) { | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 104 throw ex.isRevisionSet() ? ex : ex.setRevision(nodeid); | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 105 } catch (HgInvalidRevisionException ex) { | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 106 throw ex.isRevisionSet() ? ex : ex.setRevision(nodeid); | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 107 } | 
| 275 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
245diff
changeset | 108 } | 
| 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
245diff
changeset | 109 | 
| 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
245diff
changeset | 110 /** | 
| 368 
8107b95f4280
Update Javadoc with 'revision index'
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
367diff
changeset | 111 * @param fileRevisionIndex - revision local index, non-negative. From predefined constants, only {@link HgRepository#TIP} makes sense. | 
| 275 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
245diff
changeset | 112 * @return size of the file content at the revision identified by local revision number. | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 113 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 275 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
245diff
changeset | 114 */ | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 115 public int getLength(int fileRevisionIndex) throws HgRuntimeException { | 
| 401 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 116 if (wrongRevisionIndex(fileRevisionIndex) || fileRevisionIndex == BAD_REVISION) { | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 117 throw new HgInvalidRevisionException(fileRevisionIndex); | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 118 } | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 119 if (fileRevisionIndex == TIP) { | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 120 fileRevisionIndex = getLastRevision(); | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 121 } else if (fileRevisionIndex == WORKING_COPY) { | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 122 File f = getRepo().getFile(this); | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 123 if (f.exists()) { | 
| 420 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
417diff
changeset | 124 // single revision can't be greater than 2^32, shall be safe to cast to int | 
| 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
417diff
changeset | 125 return Internals.ltoi(f.length()); | 
| 401 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 126 } | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 127 Nodeid fileRev = getWorkingCopyRevision(); | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 128 if (fileRev == null) { | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 129 throw new HgInvalidRevisionException(String.format("File %s is not part of working copy", getPath()), null, fileRevisionIndex); | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 130 } | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 131 fileRevisionIndex = getRevisionIndex(fileRev); | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 132 } | 
| 367 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 133 if (metadata == null || !metadata.checked(fileRevisionIndex)) { | 
| 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 134 checkAndRecordMetadata(fileRevisionIndex); | 
| 275 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
245diff
changeset | 135 } | 
| 367 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 136 final int dataLen = content.dataLength(fileRevisionIndex); | 
| 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 137 if (metadata.known(fileRevisionIndex)) { | 
| 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 138 return dataLen - metadata.dataOffset(fileRevisionIndex); | 
| 275 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
245diff
changeset | 139 } | 
| 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
245diff
changeset | 140 return dataLen; | 
| 22 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
21diff
changeset | 141 } | 
| 416 
d30083c80d52
Better names - non-confusing and aligned with the rest of API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
415diff
changeset | 142 | 
| 
d30083c80d52
Better names - non-confusing and aligned with the rest of API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
415diff
changeset | 143 /** | 
| 237 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 144 * Reads content of the file from working directory. If file present in the working directory, its actual content without | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 145 * any filters is supplied through the sink. If file does not exist in the working dir, this method provides content of a file | 
| 401 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 146 * as if it would be refreshed in the working copy, i.e. its corresponding revision (according to dirstate) is read from the | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 147 * repository, and filters repo -> working copy get applied. | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 148 * | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 149 * NOTE, if file is missing from the working directory and is not part of the dirstate (but otherwise legal repository file, | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 150 * e.g. from another branch), no content would be supplied. | 
| 237 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 151 * | 
| 396 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 152 * @param sink content consumer | 
| 380 
9517df1ef7ec
Comments/javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
368diff
changeset | 153 * @throws CancelledException if execution of the operation was cancelled | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 154 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 237 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 155 */ | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 156 public void workingCopy(ByteChannel sink) throws CancelledException, HgRuntimeException { | 
| 237 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 157 File f = getRepo().getFile(this); | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 158 if (f.exists()) { | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 159 final CancelSupport cs = CancelSupport.Factory.get(sink); | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 160 final ProgressSupport progress = ProgressSupport.Factory.get(sink); | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 161 final long flength = f.length(); | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 162 final int bsize = (int) Math.min(flength, 32*1024); | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 163 progress.start((int) (flength > Integer.MAX_VALUE ? flength >>> 15 /*32 kb buf size*/ : flength)); | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 164 ByteBuffer buf = ByteBuffer.allocate(bsize); | 
| 619 
868b2ffdcd5c
Close FIS, not FileChannel, to clear both references to FileDescriptor right away
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
608diff
changeset | 165 FileInputStream fis = null; | 
| 237 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 166 try { | 
| 619 
868b2ffdcd5c
Close FIS, not FileChannel, to clear both references to FileDescriptor right away
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
608diff
changeset | 167 fis = new FileInputStream(f); | 
| 
868b2ffdcd5c
Close FIS, not FileChannel, to clear both references to FileDescriptor right away
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
608diff
changeset | 168 FileChannel fc = fis.getChannel(); | 
| 237 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 169 while (fc.read(buf) != -1) { | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 170 cs.checkCancelled(); | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 171 buf.flip(); | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 172 int consumed = sink.write(buf); | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 173 progress.worked(flength > Integer.MAX_VALUE ? 1 : consumed); | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 174 buf.compact(); | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 175 } | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 176 } catch (IOException ex) { | 
| 396 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 177 throw new HgInvalidFileException("Working copy read failed", ex, f); | 
| 237 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 178 } finally { | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 179 progress.done(); | 
| 619 
868b2ffdcd5c
Close FIS, not FileChannel, to clear both references to FileDescriptor right away
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
608diff
changeset | 180 if (fis != null) { | 
| 654 
12a4f60ea972
1) Console push tool. 2) Pass class to blame into FileUtils
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
640diff
changeset | 181 new FileUtils(getRepo().getSessionContext().getLog(), this).closeQuietly(fis); | 
| 237 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 182 } | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 183 } | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 184 } else { | 
| 401 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 185 Nodeid fileRev = getWorkingCopyRevision(); | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 186 if (fileRev == null) { | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 187 // no content for this data file in the working copy - it is not part of the actual working state. | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 188 // XXX perhaps, shall report this to caller somehow, not silently pass no data? | 
| 388 
b015f3918120
Work on FIXME: correct HgDataFile#workingCopy with tests; BasicSessionContext with property override; platform-specific options to internals
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
383diff
changeset | 189 return; | 
| 
b015f3918120
Work on FIXME: correct HgDataFile#workingCopy with tests; BasicSessionContext with property override; platform-specific options to internals
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
383diff
changeset | 190 } | 
| 401 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 191 final int fileRevIndex = getRevisionIndex(fileRev); | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 192 contentWithFilters(fileRevIndex, sink); | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 193 } | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 194 } | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 195 | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 196 /** | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 197 * @return file revision as recorded in repository manifest for dirstate parent, or <code>null</code> if no file revision can be found | 
| 628 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
625diff
changeset | 198 * @throws HgInvalidControlFileException if failed to access revlog index/data entry. <em>Runtime exception</em> | 
| 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
625diff
changeset | 199 * @throws HgRuntimeException subclass thereof to indicate other issues with the library. <em>Runtime exception</em> | 
| 401 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 200 */ | 
| 628 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
625diff
changeset | 201 private Nodeid getWorkingCopyRevision() throws HgRuntimeException { | 
| 401 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 202 final Pair<Nodeid, Nodeid> wcParents = getRepo().getWorkingCopyParents(); | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 203 Nodeid p = wcParents.first().isNull() ? wcParents.second() : wcParents.first(); | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 204 final HgChangelog clog = getRepo().getChangelog(); | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 205 final int csetRevIndex; | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 206 if (p.isNull()) { | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 207 // no dirstate parents | 
| 490 
b3c16d1aede0
Refactoring: move HgRepository's implementation aspects to Internals (which is now its imlementation counterpart and primary repository class to be used by other parts of the library)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
456diff
changeset | 208 getRepo().getSessionContext().getLog().dump(getClass(), Info, "No dirstate parents, resort to TIP", getPath()); | 
| 401 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 209 // if it's a repository with no dirstate, use TIP then | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 210 csetRevIndex = clog.getLastRevision(); | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 211 if (csetRevIndex == -1) { | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 212 // shall not happen provided there's .i for this data file (hence at least one cset) | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 213 // and perhaps exception is better here. However, null as "can't find" indication seems reasonable. | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 214 return null; | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 215 } | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 216 } else { | 
| 388 
b015f3918120
Work on FIXME: correct HgDataFile#workingCopy with tests; BasicSessionContext with property override; platform-specific options to internals
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
383diff
changeset | 217 // common case to avoid searching complete changelog for nodeid match | 
| 
b015f3918120
Work on FIXME: correct HgDataFile#workingCopy with tests; BasicSessionContext with property override; platform-specific options to internals
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
383diff
changeset | 218 final Nodeid tipRev = clog.getRevision(TIP); | 
| 
b015f3918120
Work on FIXME: correct HgDataFile#workingCopy with tests; BasicSessionContext with property override; platform-specific options to internals
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
383diff
changeset | 219 if (tipRev.equals(p)) { | 
| 
b015f3918120
Work on FIXME: correct HgDataFile#workingCopy with tests; BasicSessionContext with property override; platform-specific options to internals
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
383diff
changeset | 220 csetRevIndex = clog.getLastRevision(); | 
| 
b015f3918120
Work on FIXME: correct HgDataFile#workingCopy with tests; BasicSessionContext with property override; platform-specific options to internals
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
383diff
changeset | 221 } else { | 
| 
b015f3918120
Work on FIXME: correct HgDataFile#workingCopy with tests; BasicSessionContext with property override; platform-specific options to internals
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
383diff
changeset | 222 // bad luck, need to search honestly | 
| 628 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
625diff
changeset | 223 csetRevIndex = clog.getRevisionIndex(p); | 
| 388 
b015f3918120
Work on FIXME: correct HgDataFile#workingCopy with tests; BasicSessionContext with property override; platform-specific options to internals
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
383diff
changeset | 224 } | 
| 237 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 225 } | 
| 401 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 226 Nodeid fileRev = getRepo().getManifest().getFileRevision(csetRevIndex, getPath()); | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 227 // it's possible for a file to be in working dir and have store/.i but to belong e.g. to a different | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 228 // branch than the one from dirstate. Thus it's possible to get null fileRev | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 229 // which would serve as an indication this data file is not part of working copy | 
| 
a57a21aa4190
Support WORKING_COPY constant for dataFile.length() operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
396diff
changeset | 230 return fileRev; | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 231 } | 
| 115 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 232 | 
| 396 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 233 /** | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 234 * Access content of a file revision | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 235 * XXX not sure distinct method contentWithFilters() is the best way to do, perhaps, callers shall add filters themselves? | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 236 * | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 237 * @param fileRevisionIndex - revision local index, non-negative. From predefined constants, {@link HgRepository#TIP} and {@link HgRepository#WORKING_COPY} make sense. | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 238 * @param sink content consumer | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 239 * | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 240 * @throws CancelledException if execution of the operation was cancelled | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 241 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 396 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 242 */ | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 243 public void contentWithFilters(int fileRevisionIndex, ByteChannel sink) throws CancelledException, HgRuntimeException { | 
| 396 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 244 if (fileRevisionIndex == WORKING_COPY) { | 
| 237 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 245 workingCopy(sink); // pass un-mangled sink | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 246 } else { | 
| 396 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 247 content(fileRevisionIndex, new FilterByteChannel(sink, getRepo().getFiltersFromRepoToWorkingDir(getPath()))); | 
| 237 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 248 } | 
| 115 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 249 } | 
| 22 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
21diff
changeset | 250 | 
| 367 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 251 /** | 
| 396 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 252 * Retrieve content of specific revision. Content is provided as is, without any filters (e.g. keywords, eol, etc.) applied. | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 253 * For filtered content, use {@link #contentWithFilters(int, ByteChannel)}. | 
| 367 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 254 * | 
| 368 
8107b95f4280
Update Javadoc with 'revision index'
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
367diff
changeset | 255 * @param fileRevisionIndex - revision local index, non-negative. From predefined constants, {@link HgRepository#TIP} and {@link HgRepository#WORKING_COPY} make sense. | 
| 396 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 256 * @param sink content consumer | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 257 * | 
| 380 
9517df1ef7ec
Comments/javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
368diff
changeset | 258 * @throws CancelledException if execution of the operation was cancelled | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 259 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 367 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 260 */ | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 261 public void content(int fileRevisionIndex, ByteChannel sink) throws CancelledException, HgRuntimeException { | 
| 367 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 262 // for data files need to check heading of the file content for possible metadata | 
| 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 263 // @see http://mercurial.selenic.com/wiki/FileFormats#data.2BAC8- | 
| 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 264 if (fileRevisionIndex == TIP) { | 
| 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 265 fileRevisionIndex = getLastRevision(); | 
| 78 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 266 } | 
| 367 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 267 if (fileRevisionIndex == WORKING_COPY) { | 
| 237 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 268 // sink is supposed to come into workingCopy without filters | 
| 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 269 // thus we shall not get here (into #content) from #contentWithFilters(WC) | 
| 157 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 270 workingCopy(sink); | 
| 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 271 return; | 
| 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 272 } | 
| 367 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 273 if (wrongRevisionIndex(fileRevisionIndex) || fileRevisionIndex == BAD_REVISION) { | 
| 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 274 throw new HgInvalidRevisionException(fileRevisionIndex); | 
| 148 
1a7a9a20e1f9
Exceptions, javadoc. Initial cancel and progress support
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
135diff
changeset | 275 } | 
| 157 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 276 if (sink == null) { | 
| 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 277 throw new IllegalArgumentException(); | 
| 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 278 } | 
| 134 
afac8ddc5dd2
Keep record if we tried and found no metadata for a given revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
133diff
changeset | 279 if (metadata == null) { | 
| 602 
e3717fc7d26f
Refactor metadata parsing in HgDataFile, moved to standalone class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
600diff
changeset | 280 metadata = new Metadata(getRepo()); | 
| 134 
afac8ddc5dd2
Keep record if we tried and found no metadata for a given revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
133diff
changeset | 281 } | 
| 277 
74e7493a042a
Favor delegation over generalization
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
276diff
changeset | 282 ErrorHandlingInspector insp; | 
| 490 
b3c16d1aede0
Refactoring: move HgRepository's implementation aspects to Internals (which is now its imlementation counterpart and primary repository class to be used by other parts of the library)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
456diff
changeset | 283 final LogFacility lf = getRepo().getSessionContext().getLog(); | 
| 367 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 284 if (metadata.none(fileRevisionIndex)) { | 
| 388 
b015f3918120
Work on FIXME: correct HgDataFile#workingCopy with tests; BasicSessionContext with property override; platform-specific options to internals
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
383diff
changeset | 285 insp = new ContentPipe(sink, 0, lf); | 
| 367 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 286 } else if (metadata.known(fileRevisionIndex)) { | 
| 388 
b015f3918120
Work on FIXME: correct HgDataFile#workingCopy with tests; BasicSessionContext with property override; platform-specific options to internals
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
383diff
changeset | 287 insp = new ContentPipe(sink, metadata.dataOffset(fileRevisionIndex), lf); | 
| 157 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 288 } else { | 
| 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 289 // do not know if there's metadata | 
| 602 
e3717fc7d26f
Refactor metadata parsing in HgDataFile, moved to standalone class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
600diff
changeset | 290 insp = new MetadataInspector(metadata, new ContentPipe(sink, 0, lf)); | 
| 78 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 291 } | 
| 157 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 292 insp.checkCancelled(); | 
| 367 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 293 super.content.iterate(fileRevisionIndex, fileRevisionIndex, true, insp); | 
| 157 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 294 try { | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 295 insp.checkFailed(); | 
| 396 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 296 } catch (HgInvalidControlFileException ex) { | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 297 ex = ex.setFileName(getPath()); | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 298 throw ex.isRevisionIndexSet() ? ex : ex.setRevisionIndex(fileRevisionIndex); | 
| 237 
6e1373b54e9b
Allow access to working copy content through HgDataFile. Give access to repository's working dir
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
233diff
changeset | 299 } catch (IOException ex) { | 
| 396 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 300 HgInvalidControlFileException e = new HgInvalidControlFileException("Revision content access failed", ex, null); | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 301 throw content.initWithIndexFile(e).setFileName(getPath()).setRevisionIndex(fileRevisionIndex); | 
| 78 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 302 } | 
| 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 303 } | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 304 | 
| 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 305 /** | 
| 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 306 * Walk complete change history of the file. | 
| 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 307 * @param inspector callback to visit changesets | 
| 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 308 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 309 */ | 
| 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 310 public void history(HgChangelog.Inspector inspector) throws HgRuntimeException { | 
| 135 
3959bffb14e9
explicit op name instead math op to get last rev number
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
134diff
changeset | 311 history(0, getLastRevision(), inspector); | 
| 48 
e34f90b9ded1
Limit option for history/log
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
37diff
changeset | 312 } | 
| 
e34f90b9ded1
Limit option for history/log
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
37diff
changeset | 313 | 
| 417 
ccd7d25e5aea
New and better name for HgFileInformer - HgChangesetFileSneaker. Explain (comments) ties between HgManifest, HgDataFile, HgChangesetFileSneaker and reasons for method placement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
416diff
changeset | 314 /** | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 315 * Walk subset of the file's change history. | 
| 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 316 * @param start revision local index, inclusive; non-negative or {@link HgRepository#TIP} | 
| 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 317 * @param end revision local index, inclusive; non-negative or {@link HgRepository#TIP} | 
| 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 318 * @param inspector callback to visit changesets | 
| 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 319 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 417 
ccd7d25e5aea
New and better name for HgFileInformer - HgChangesetFileSneaker. Explain (comments) ties between HgManifest, HgDataFile, HgChangesetFileSneaker and reasons for method placement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
416diff
changeset | 320 */ | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 321 public void history(int start, int end, HgChangelog.Inspector inspector) throws HgRuntimeException { | 
| 3 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 322 if (!exists()) { | 
| 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 323 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: 
2diff
changeset | 324 } | 
| 135 
3959bffb14e9
explicit op name instead math op to get last rev number
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
134diff
changeset | 325 final int last = getLastRevision(); | 
| 77 
c677e1593919
Moved RevlogStream implementation into .internal
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
74diff
changeset | 326 if (end == TIP) { | 
| 
c677e1593919
Moved RevlogStream implementation into .internal
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
74diff
changeset | 327 end = last; | 
| 
c677e1593919
Moved RevlogStream implementation into .internal
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
74diff
changeset | 328 } | 
| 300 
650b45d290b1
Share range check code
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 329 if (start == TIP) { | 
| 
650b45d290b1
Share range check code
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 330 start = last; | 
| 
650b45d290b1
Share range check code
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 331 } | 
| 
650b45d290b1
Share range check code
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 332 HgInternals.checkRevlogRange(start, end, last); | 
| 
650b45d290b1
Share range check code
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 333 | 
| 48 
e34f90b9ded1
Limit option for history/log
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
37diff
changeset | 334 final int[] commitRevisions = new int[end - start + 1]; | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
240diff
changeset | 335 final boolean[] needsSorting = { false }; | 
| 77 
c677e1593919
Moved RevlogStream implementation into .internal
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
74diff
changeset | 336 RevlogStream.Inspector insp = new RevlogStream.Inspector() { | 
| 3 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 337 int count = 0; | 
| 51 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 338 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess data) { | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
240diff
changeset | 339 if (count > 0) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
240diff
changeset | 340 if (commitRevisions[count -1] > linkRevision) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
240diff
changeset | 341 needsSorting[0] = true; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
240diff
changeset | 342 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
240diff
changeset | 343 } | 
| 3 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 344 commitRevisions[count++] = linkRevision; | 
| 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 345 } | 
| 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 346 }; | 
| 48 
e34f90b9ded1
Limit option for history/log
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
37diff
changeset | 347 content.iterate(start, end, false, insp); | 
| 233 
1d389c0cb0a5
Optimize file history walk not to iterat over whole changelog for sparse and distant revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
215diff
changeset | 348 final HgChangelog changelog = getRepo().getChangelog(); | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
240diff
changeset | 349 if (needsSorting[0]) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
240diff
changeset | 350 // automatic tools (svnmerge?) produce unnatural file history | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
240diff
changeset | 351 // (e.g. cpython/Lib/doctest.py, revision 164 points to cset 63509, 165 - to 38453) | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
240diff
changeset | 352 Arrays.sort(commitRevisions); | 
| 233 
1d389c0cb0a5
Optimize file history walk not to iterat over whole changelog for sparse and distant revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
215diff
changeset | 353 } | 
| 245 
2fb439375ddc
Avoid sorting revision range twice
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
242diff
changeset | 354 changelog.rangeInternal(inspector, commitRevisions); | 
| 3 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 355 } | 
| 88 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
79diff
changeset | 356 | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 357 /** | 
| 367 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 358 * For a given revision of the file (identified with revision index), find out index of the corresponding changeset. | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 359 * | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 360 * @return changeset revision index | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 361 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 362 */ | 
| 437 
32184ddcf46d
Better argument names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
426diff
changeset | 363 public int getChangesetRevisionIndex(int fileRevisionIndex) throws HgRuntimeException { | 
| 
32184ddcf46d
Better argument names
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
426diff
changeset | 364 return content.linkRevision(fileRevisionIndex); | 
| 367 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 365 } | 
| 88 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
79diff
changeset | 366 | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 367 /** | 
| 367 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 368 * Complements {@link #getChangesetRevisionIndex(int)} to get changeset revision that corresponds to supplied file revision | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 369 * | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 370 * @param nid revision of the file | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 371 * @return changeset revision | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 372 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 373 */ | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 374 public Nodeid getChangesetRevision(Nodeid nid) throws HgRuntimeException { | 
| 367 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 375 int changelogRevision = getChangesetRevisionIndex(getRevisionIndex(nid)); | 
| 88 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
79diff
changeset | 376 return getRepo().getChangelog().getRevision(changelogRevision); | 
| 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
79diff
changeset | 377 } | 
| 78 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 378 | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 379 /** | 
| 689 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 380 * Tells whether first revision of this file originates from another repository file. | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 381 * This method is shorthand for {@link #isCopy(int) isCopy(0)} and it's advised to use {@link #isCopy(int)} instead. | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 382 * | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 383 * @return <code>true</code> if first revision of this file is a copy of some other from the repository | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 384 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 385 */ | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 386 public boolean isCopy() throws HgRuntimeException { | 
| 689 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 387 return isCopy(0); | 
| 78 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 388 } | 
| 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 389 | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 390 /** | 
| 689 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 391 * Get name of the file first revision of this one was copied from. | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 392 * Note, it's better to use {@link #getCopySource(int)} instead. | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 393 * | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 394 * @return name of the file origin | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 395 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 396 */ | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 397 public Path getCopySourceName() throws HgRuntimeException { | 
| 78 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 398 if (isCopy()) { | 
| 571 
e4ee4bf4c7d0
Let session context control creation of Path instances
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
495diff
changeset | 399 Path.Source ps = getRepo().getSessionContext().getPathFactory(); | 
| 
e4ee4bf4c7d0
Let session context control creation of Path instances
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
495diff
changeset | 400 return ps.path(metadata.find(0, "copy")); | 
| 78 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 401 } | 
| 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 402 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: 
77diff
changeset | 403 } | 
| 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 404 | 
| 415 
ee8264d80747
Explicit constant for regular file flags, access to flags for a given file revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
401diff
changeset | 405 /** | 
| 689 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 406 * Use {@link #getCopySource(int)} instead | 
| 415 
ee8264d80747
Explicit constant for regular file flags, access to flags for a given file revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
401diff
changeset | 407 * @return revision this file was copied from | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 408 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 415 
ee8264d80747
Explicit constant for regular file flags, access to flags for a given file revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
401diff
changeset | 409 */ | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 410 public Nodeid getCopySourceRevision() throws HgRuntimeException { | 
| 78 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 411 if (isCopy()) { | 
| 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 412 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: 
77diff
changeset | 413 } | 
| 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 414 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: 
77diff
changeset | 415 } | 
| 689 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 416 | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 417 /** | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 418 * Tell if specified file revision was created by copying or renaming another file | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 419 * | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 420 * @param fileRevisionIndex index of file revision to check | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 421 * @return <code>true</code> if this revision originates (as a result of copy/rename) from another file | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 422 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 423 * @since 1.2 | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 424 */ | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 425 public boolean isCopy(int fileRevisionIndex) throws HgRuntimeException { | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 426 if (fileRevisionIndex == TIP) { | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 427 fileRevisionIndex = getLastRevision(); | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 428 } | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 429 if (wrongRevisionIndex(fileRevisionIndex) || fileRevisionIndex == BAD_REVISION || fileRevisionIndex == WORKING_COPY || fileRevisionIndex == NO_REVISION) { | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 430 throw new HgInvalidRevisionException(fileRevisionIndex); | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 431 } | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 432 | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 433 if (metadata == null || !metadata.checked(fileRevisionIndex)) { | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 434 checkAndRecordMetadata(fileRevisionIndex); | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 435 } | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 436 if (!metadata.known(fileRevisionIndex)) { | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 437 return false; | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 438 } | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 439 return metadata.find(fileRevisionIndex, "copy") != null; | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 440 } | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 441 | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 442 /** | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 443 * Find out which file and which revision of that file given revision originates from | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 444 * | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 445 * @param fileRevisionIndex file revision index of interest, it's assumed {@link #isCopy(int)} for the same revision is <code>true</code> | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 446 * @return origin revision descriptor | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 447 * @throws HgRuntimeException | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 448 * @throws UnsupportedOperationException if specified revision is not a {@link #isCopy(int) copy} revision | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 449 * @since 1.2 | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 450 */ | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 451 public HgFileRevision getCopySource(int fileRevisionIndex) throws HgRuntimeException { | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 452 if (fileRevisionIndex == TIP) { | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 453 fileRevisionIndex = getLastRevision(); | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 454 } | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 455 if (!isCopy(fileRevisionIndex)) { | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 456 throw new UnsupportedOperationException(); | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 457 } | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 458 Path.Source ps = getRepo().getSessionContext().getPathFactory(); | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 459 Path origin = ps.path(metadata.find(fileRevisionIndex, "copy")); | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 460 Nodeid originRev = Nodeid.fromAscii(metadata.find(fileRevisionIndex, "copyrev")); // XXX reuse/cache Nodeid | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 461 return new HgFileRevision(getRepo(), originRev, null, origin); | 
| 
5050ee565bd1
Issue 44: Renames/copies other than for the very first revision of a file are not recognized
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
654diff
changeset | 462 } | 
| 417 
ccd7d25e5aea
New and better name for HgFileInformer - HgChangesetFileSneaker. Explain (comments) ties between HgManifest, HgDataFile, HgChangesetFileSneaker and reasons for method placement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
416diff
changeset | 463 | 
| 415 
ee8264d80747
Explicit constant for regular file flags, access to flags for a given file revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
401diff
changeset | 464 /** | 
| 417 
ccd7d25e5aea
New and better name for HgFileInformer - HgChangesetFileSneaker. Explain (comments) ties between HgManifest, HgDataFile, HgChangesetFileSneaker and reasons for method placement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
416diff
changeset | 465 * Get file flags recorded in the manifest | 
| 416 
d30083c80d52
Better names - non-confusing and aligned with the rest of API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
415diff
changeset | 466 * @param fileRevisionIndex - revision local index, non-negative, or {@link HgRepository#TIP}. | 
| 417 
ccd7d25e5aea
New and better name for HgFileInformer - HgChangesetFileSneaker. Explain (comments) ties between HgManifest, HgDataFile, HgChangesetFileSneaker and reasons for method placement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
416diff
changeset | 467 * @see HgManifest#getFileFlags(int, Path) | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 468 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 415 
ee8264d80747
Explicit constant for regular file flags, access to flags for a given file revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
401diff
changeset | 469 */ | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 470 public HgManifest.Flags getFlags(int fileRevisionIndex) throws HgRuntimeException { | 
| 415 
ee8264d80747
Explicit constant for regular file flags, access to flags for a given file revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
401diff
changeset | 471 int changesetRevIndex = getChangesetRevisionIndex(fileRevisionIndex); | 
| 417 
ccd7d25e5aea
New and better name for HgFileInformer - HgChangesetFileSneaker. Explain (comments) ties between HgManifest, HgDataFile, HgChangesetFileSneaker and reasons for method placement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
416diff
changeset | 472 return getRepo().getManifest().getFileFlags(changesetRevIndex, getPath()); | 
| 415 
ee8264d80747
Explicit constant for regular file flags, access to flags for a given file revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
401diff
changeset | 473 } | 
| 629 
5f52074707b2
Diff/blame methods as command, their residence in HgDataFile was a mistake
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
628diff
changeset | 474 | 
| 88 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
79diff
changeset | 475 @Override | 
| 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
79diff
changeset | 476 public String toString() { | 
| 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
79diff
changeset | 477 StringBuilder sb = new StringBuilder(getClass().getSimpleName()); | 
| 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
79diff
changeset | 478 sb.append('('); | 
| 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
79diff
changeset | 479 sb.append(getPath()); | 
| 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
79diff
changeset | 480 sb.append(')'); | 
| 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
79diff
changeset | 481 return sb.toString(); | 
| 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
79diff
changeset | 482 } | 
| 275 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
245diff
changeset | 483 | 
| 628 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
625diff
changeset | 484 private void checkAndRecordMetadata(int localRev) throws HgRuntimeException { | 
| 694 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 485 int startRev; | 
| 495 
abfbe81154b5
Do not use exception when only metadata processing is needed. For hg4j repo, status 0:-1 changed from 500 to 60 ms
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
490diff
changeset | 486 if (metadata == null) { | 
| 602 
e3717fc7d26f
Refactor metadata parsing in HgDataFile, moved to standalone class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
600diff
changeset | 487 metadata = new Metadata(getRepo()); | 
| 694 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 488 startRev = 0; // read from the very beginning with one shot - likely isCopy(localRev-i) will be of interest, too | 
| 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 489 } else { | 
| 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 490 startRev = metadata.lastRevisionRead() + 1; | 
| 275 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
245diff
changeset | 491 } | 
| 694 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 492 assert localRev >= startRev; // callers of this method ensure that metadata has been checked beforehand | 
| 495 
abfbe81154b5
Do not use exception when only metadata processing is needed. For hg4j repo, status 0:-1 changed from 500 to 60 ms
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
490diff
changeset | 493 // use MetadataInspector without delegate to process metadata only | 
| 602 
e3717fc7d26f
Refactor metadata parsing in HgDataFile, moved to standalone class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
600diff
changeset | 494 RevlogStream.Inspector insp = new MetadataInspector(metadata, null); | 
| 694 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 495 super.content.iterate(startRev, localRev, true, insp); | 
| 275 
6d1804fe0ed7
Issue 10: Report file content length with respect of metadata. Respect dirstate parents for WC's status. Exceptions to keep useful attributes of the location
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
245diff
changeset | 496 } | 
| 78 
c25c5c348d1b
Skip metadata in the beginning of a file content. Parse metadata, recognize copies/renames
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 497 | 
| 277 
74e7493a042a
Favor delegation over generalization
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
276diff
changeset | 498 private static class MetadataInspector extends ErrorHandlingInspector implements RevlogStream.Inspector { | 
| 157 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 499 private final Metadata metadata; | 
| 277 
74e7493a042a
Favor delegation over generalization
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
276diff
changeset | 500 private final RevlogStream.Inspector delegate; | 
| 157 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 501 | 
| 495 
abfbe81154b5
Do not use exception when only metadata processing is needed. For hg4j repo, status 0:-1 changed from 500 to 60 ms
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
490diff
changeset | 502 /** | 
| 
abfbe81154b5
Do not use exception when only metadata processing is needed. For hg4j repo, status 0:-1 changed from 500 to 60 ms
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
490diff
changeset | 503 * @param _metadata never <code>null</code> | 
| 
abfbe81154b5
Do not use exception when only metadata processing is needed. For hg4j repo, status 0:-1 changed from 500 to 60 ms
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
490diff
changeset | 504 * @param chain <code>null</code> if no further data processing other than metadata is desired | 
| 
abfbe81154b5
Do not use exception when only metadata processing is needed. For hg4j repo, status 0:-1 changed from 500 to 60 ms
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
490diff
changeset | 505 */ | 
| 602 
e3717fc7d26f
Refactor metadata parsing in HgDataFile, moved to standalone class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
600diff
changeset | 506 public MetadataInspector(Metadata _metadata, RevlogStream.Inspector chain) { | 
| 157 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 507 metadata = _metadata; | 
| 277 
74e7493a042a
Favor delegation over generalization
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
276diff
changeset | 508 delegate = chain; | 
| 
74e7493a042a
Favor delegation over generalization
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
276diff
changeset | 509 setCancelSupport(CancelSupport.Factory.get(chain)); | 
| 157 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 510 } | 
| 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 511 | 
| 628 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
625diff
changeset | 512 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess data) throws HgRuntimeException { | 
| 277 
74e7493a042a
Favor delegation over generalization
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
276diff
changeset | 513 try { | 
| 694 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 514 final boolean gotMetadata = metadata.tryRead(revisionNumber, data); | 
| 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 515 if (delegate != null) { | 
| 277 
74e7493a042a
Favor delegation over generalization
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
276diff
changeset | 516 data.reset(); | 
| 694 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 517 if (gotMetadata) { | 
| 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 518 // da is in prepared state (i.e. we consumed all bytes up to metadata end). | 
| 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 519 // However, it's not safe to assume delegate won't call da.reset() for some reason, | 
| 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 520 // and we need to ensure predictable result. | 
| 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 521 int offset = metadata.dataOffset(revisionNumber); | 
| 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 522 data = new FilterDataAccess(data, offset, data.length() - offset); | 
| 
7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
689diff
changeset | 523 } | 
| 277 
74e7493a042a
Favor delegation over generalization
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
276diff
changeset | 524 delegate.next(revisionNumber, actualLen, baseRevision, linkRevision, parent1Revision, parent2Revision, nodeid, data); | 
| 
74e7493a042a
Favor delegation over generalization
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
276diff
changeset | 525 } | 
| 
74e7493a042a
Favor delegation over generalization
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
276diff
changeset | 526 } catch (IOException ex) { | 
| 
74e7493a042a
Favor delegation over generalization
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
276diff
changeset | 527 recordFailure(ex); | 
| 396 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 528 } catch (HgInvalidControlFileException ex) { | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 529 recordFailure(ex.isRevisionIndexSet() ? ex : ex.setRevisionIndex(revisionNumber)); | 
| 157 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 530 } | 
| 277 
74e7493a042a
Favor delegation over generalization
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
276diff
changeset | 531 } | 
| 
74e7493a042a
Favor delegation over generalization
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
276diff
changeset | 532 | 
| 322 
d68dcb3b5f49
Propagate command's CancelSupport to low-level API. CancelSupport from context got priority over one from command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
317diff
changeset | 533 @Override | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 534 public void checkFailed() throws HgRuntimeException, IOException, CancelledException { | 
| 322 
d68dcb3b5f49
Propagate command's CancelSupport to low-level API. CancelSupport from context got priority over one from command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
317diff
changeset | 535 super.checkFailed(); | 
| 
d68dcb3b5f49
Propagate command's CancelSupport to low-level API. CancelSupport from context got priority over one from command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
317diff
changeset | 536 if (delegate instanceof ErrorHandlingInspector) { | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
424diff
changeset | 537 // TODO need to add ErrorDestination (ErrorTarget/Acceptor?) and pass it around (much like CancelSupport get passed) | 
| 322 
d68dcb3b5f49
Propagate command's CancelSupport to low-level API. CancelSupport from context got priority over one from command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
317diff
changeset | 538 // so that delegate would be able report its failures directly to caller without this hack | 
| 
d68dcb3b5f49
Propagate command's CancelSupport to low-level API. CancelSupport from context got priority over one from command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
317diff
changeset | 539 ((ErrorHandlingInspector) delegate).checkFailed(); | 
| 
d68dcb3b5f49
Propagate command's CancelSupport to low-level API. CancelSupport from context got priority over one from command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
317diff
changeset | 540 } | 
| 
d68dcb3b5f49
Propagate command's CancelSupport to low-level API. CancelSupport from context got priority over one from command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
317diff
changeset | 541 } | 
| 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: 
5diff
changeset | 542 } | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 543 } | 
