annotate src/org/tmatesoft/hg/core/HgFileRevision.java @ 486:d740edfff563

Provisional support for Mercurial lock mechanism
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Fri, 10 Aug 2012 21:03:03 +0200
parents b3b1db9301a2
children 5dcb4581c8ef
rev   line source
231
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
1 /*
396
0ae53c32ecef Straighten out exceptions thrown when file access failed - three is too much
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 367
diff changeset
2 * Copyright (c) 2011-2012 TMate Software Ltd
231
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
3 *
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
4 * This program is free software; you can redistribute it and/or modify
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
5 * it under the terms of the GNU General Public License as published by
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
6 * the Free Software Foundation; version 2 of the License.
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
7 *
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
8 * This program is distributed in the hope that it will be useful,
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
11 * GNU General Public License for more details.
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
12 *
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
13 * For information on how to redistribute this software under
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
14 * the terms of a license other than GNU General Public License
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
15 * contact TMate Software at support@hg4j.com
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
16 */
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
17 package org.tmatesoft.hg.core;
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
18
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
19 import org.tmatesoft.hg.repo.HgDataFile;
415
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
20 import org.tmatesoft.hg.repo.HgManifest;
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
21 import org.tmatesoft.hg.repo.HgManifest.Flags;
231
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
22 import org.tmatesoft.hg.repo.HgRepository;
427
31a89587eb04 FIXMEs: consistent names, throws for commands and their handlers. Use of checked exceptions in hi-level api
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 423
diff changeset
23 import org.tmatesoft.hg.repo.HgRuntimeException;
231
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
24 import org.tmatesoft.hg.util.ByteChannel;
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
25 import org.tmatesoft.hg.util.CancelledException;
345
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
26 import org.tmatesoft.hg.util.Pair;
231
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
27 import org.tmatesoft.hg.util.Path;
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
28
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
29 /**
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
30 * Keeps together information about specific file revision
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
31 *
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
32 * @author Artem Tikhomirov
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
33 * @author TMate Software Ltd.
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
34 */
249
4c3b9f679412 Deprecated HgLogCommand.FileRevision gone, top-level HgFileRevision is bright and shiny replacement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 237
diff changeset
35 public final class HgFileRevision {
231
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
36 private final HgRepository repo;
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
37 private final Nodeid revision;
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
38 private final Path path;
316
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
39 private Path origin;
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
40 private Boolean isCopy = null; // null means not yet known
345
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
41 private Pair<Nodeid, Nodeid> parents;
415
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
42 private Flags flags; // null unless set/extracted
316
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
43
415
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
44 /**
431
12f668401613 FIXMEs: awkward API refactored, what need to be internal got hidden; public aspects got captured in slim interfaces
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 427
diff changeset
45 * New description of a file revision from a specific repository.
12f668401613 FIXMEs: awkward API refactored, what need to be internal got hidden; public aspects got captured in slim interfaces
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 427
diff changeset
46 *
12f668401613 FIXMEs: awkward API refactored, what need to be internal got hidden; public aspects got captured in slim interfaces
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 427
diff changeset
47 * <p>Although this constructor is public, and clients can use it to construct own file revisions to pass e.g. to commands, its use is discouraged.
415
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
48 *
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
49 * @param hgRepo repository
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
50 * @param rev file revision
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
51 * @param manifestEntryFlags file flags at this revision (optional, may be null)
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
52 * @param p path of the file at the given revision
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
53 */
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
54 public HgFileRevision(HgRepository hgRepo, Nodeid rev, HgManifest.Flags manifestEntryFlags, Path p) {
231
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
55 if (hgRepo == null || rev == null || p == null) {
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
56 // since it's package local, it is our code to blame for non validated arguments
316
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
57 throw new IllegalArgumentException();
231
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
58 }
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
59 repo = hgRepo;
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
60 revision = rev;
415
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
61 flags = manifestEntryFlags;
231
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
62 path = p;
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
63 }
316
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
64
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
65 // this cons shall be used when we know whether p was a copy. Perhaps, shall pass Map<Path,Path> instead to stress orig argument is not optional
415
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
66 HgFileRevision(HgRepository hgRepo, Nodeid rev, HgManifest.Flags flags, Path p, Path orig) {
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
67 this(hgRepo, rev, flags, p);
316
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
68 isCopy = Boolean.valueOf(orig == null);
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
69 origin = orig;
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
70 }
231
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
71
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
72 public Path getPath() {
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
73 return path;
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
74 }
364
ac8e1ce67730 Expose errors dealign with Mercurial internals with Exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
75
231
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
76 public Nodeid getRevision() {
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
77 return revision;
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
78 }
415
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
79
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
80 /**
444
b3b1db9301a2 Few comments that emerged while working on examples
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 431
diff changeset
81 * Extract flags of the file as recorded in the manifest for this file revision
b3b1db9301a2 Few comments that emerged while working on examples
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 431
diff changeset
82 * @return whether regular file, executable or a symbolic link
427
31a89587eb04 FIXMEs: consistent names, throws for commands and their handlers. Use of checked exceptions in hi-level api
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 423
diff changeset
83 * @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: 396
diff changeset
84 */
427
31a89587eb04 FIXMEs: consistent names, throws for commands and their handlers. Use of checked exceptions in hi-level api
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 423
diff changeset
85 public HgManifest.Flags getFileFlags() 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: 396
diff changeset
86 if (flags == null) {
444
b3b1db9301a2 Few comments that emerged while working on examples
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 431
diff changeset
87 /*
b3b1db9301a2 Few comments that emerged while working on examples
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 431
diff changeset
88 * Note, for uses other than HgManifestCommand or HgChangesetFileSneaker, when no flags come through the cons,
b3b1db9301a2 Few comments that emerged while working on examples
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 431
diff changeset
89 * it's possible to face next shortcoming:
b3b1db9301a2 Few comments that emerged while working on examples
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 431
diff changeset
90 * Imagine csetA and csetB, with corresponding manifestA and manifestB, the file didn't change (revision/nodeid is the same)
b3b1db9301a2 Few comments that emerged while working on examples
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 431
diff changeset
91 * but flag of the file has changed (e.g. became executable). Since HgFileRevision doesn't keep reference to
b3b1db9301a2 Few comments that emerged while working on examples
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 431
diff changeset
92 * an actual manifest revision, but only file's, and it's likely the flags returned from this method would
b3b1db9301a2 Few comments that emerged while working on examples
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 431
diff changeset
93 * yield result as from manifestA (i.e. no flag change in manifestB ever noticed).
b3b1db9301a2 Few comments that emerged while working on examples
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 431
diff changeset
94 */
415
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
95 HgDataFile df = repo.getFileNode(path);
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
96 int revIdx = df.getRevisionIndex(revision);
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
97 flags = df.getFlags(revIdx);
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
98 }
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
99 return flags;
ee8264d80747 Explicit constant for regular file flags, access to flags for a given file revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
100 }
364
ac8e1ce67730 Expose errors dealign with Mercurial internals with Exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
101
ac8e1ce67730 Expose errors dealign with Mercurial internals with Exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
102 public boolean wasCopied() throws HgException {
316
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
103 if (isCopy == null) {
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
104 checkCopy();
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
105 }
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
106 return isCopy.booleanValue();
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
107 }
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
108 /**
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
109 * @return <code>null</code> if {@link #wasCopied()} is <code>false</code>, name of the copy source otherwise.
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
110 */
364
ac8e1ce67730 Expose errors dealign with Mercurial internals with Exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
111 public Path getOriginIfCopy() throws HgException {
316
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
112 if (wasCopied()) {
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
113 return origin;
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
114 }
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
115 return null;
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
116 }
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
117
345
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
118 /**
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
119 * Access revisions this file revision originates from.
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
120 * Note, these revisions are records in the file history, not that of the whole repository (aka changeset revisions)
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
121 * In most cases, only one parent revision would be present, only for merge revisions one can expect both.
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
122 *
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
123 * @return parent revisions of this file revision, with {@link Nodeid#NULL} for missing values.
427
31a89587eb04 FIXMEs: consistent names, throws for commands and their handlers. Use of checked exceptions in hi-level api
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 423
diff changeset
124 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em>
345
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
125 */
427
31a89587eb04 FIXMEs: consistent names, throws for commands and their handlers. Use of checked exceptions in hi-level api
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 423
diff changeset
126 public Pair<Nodeid, Nodeid> getParents() throws HgRuntimeException {
345
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
127 if (parents == null) {
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
128 HgDataFile fn = repo.getFileNode(path);
367
2fadf8695f8a Use 'revision index' instead of the vague 'local revision number' concept in the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 364
diff changeset
129 int revisionIndex = fn.getRevisionIndex(revision);
345
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
130 int[] pr = new int[2];
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
131 byte[] p1 = new byte[20], p2 = new byte[20];
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
132 // XXX Revlog#parents is not the best method to use here
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
133 // need smth that gives Nodeids (piped through Pool<Nodeid> from repo's context)
367
2fadf8695f8a Use 'revision index' instead of the vague 'local revision number' concept in the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 364
diff changeset
134 fn.parents(revisionIndex, pr, p1, p2);
345
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
135 parents = new Pair<Nodeid, Nodeid>(Nodeid.fromBinary(p1, 0), Nodeid.fromBinary(p2, 0));
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
136 }
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
137 return parents;
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
138 }
58725dd511b3 Provide access to revision's origins
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 316
diff changeset
139
396
0ae53c32ecef Straighten out exceptions thrown when file access failed - three is too much
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 367
diff changeset
140 public void putContentTo(ByteChannel sink) throws HgException, CancelledException {
231
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
141 HgDataFile fn = repo.getFileNode(path);
367
2fadf8695f8a Use 'revision index' instead of the vague 'local revision number' concept in the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 364
diff changeset
142 int revisionIndex = fn.getRevisionIndex(revision);
2fadf8695f8a Use 'revision index' instead of the vague 'local revision number' concept in the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 364
diff changeset
143 fn.contentWithFilters(revisionIndex, sink);
231
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
144 }
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
145
396
0ae53c32ecef Straighten out exceptions thrown when file access failed - three is too much
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 367
diff changeset
146 private void checkCopy() throws HgException {
316
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
147 HgDataFile fn = repo.getFileNode(path);
364
ac8e1ce67730 Expose errors dealign with Mercurial internals with Exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
148 if (fn.isCopy()) {
ac8e1ce67730 Expose errors dealign with Mercurial internals with Exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
149 if (fn.getRevision(0).equals(revision)) {
ac8e1ce67730 Expose errors dealign with Mercurial internals with Exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
150 // this HgFileRevision represents first revision of the copy
ac8e1ce67730 Expose errors dealign with Mercurial internals with Exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
151 isCopy = Boolean.TRUE;
ac8e1ce67730 Expose errors dealign with Mercurial internals with Exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
152 origin = fn.getCopySourceName();
ac8e1ce67730 Expose errors dealign with Mercurial internals with Exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 354
diff changeset
153 return;
316
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
154 }
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
155 }
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
156 isCopy = Boolean.FALSE;
ee6b467c1a5f Supply HGFileRevision with copy information when possible, calculate it otherwise
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 249
diff changeset
157 }
231
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
158 }