annotate src/org/tmatesoft/hg/repo/HgRepository.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 ae4d6604debd
children db48a77ec8ff
rev   line source
10
382cfe9463db Dirstate parsing. DataAccess refactored to allow reuse and control over constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 9
diff changeset
1 /*
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: 367
diff changeset
2 * Copyright (c) 2010-2012 TMate Software Ltd
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
3 *
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
4 * This program is free software; you can redistribute it and/or modify
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
5 * it under the terms of the GNU General Public License as published by
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
6 * the Free Software Foundation; version 2 of the License.
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
7 *
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
8 * This program is distributed in the hope that it will be useful,
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
11 * GNU General Public License for more details.
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
12 *
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
13 * For information on how to redistribute this software under
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff 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: 97
diff changeset
15 * contact TMate Software at support@hg4j.com
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
16 */
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
17 package org.tmatesoft.hg.repo;
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
18
482
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
19 import static org.tmatesoft.hg.repo.HgRepositoryFiles.*;
456
909306e412e2 Refactor LogFacility and SessionContext, better API for both
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 431
diff changeset
20 import static org.tmatesoft.hg.util.LogFacility.Severity.*;
909306e412e2 Refactor LogFacility and SessionContext, better API for both
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 431
diff changeset
21
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
22 import java.io.File;
481
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
23 import java.io.FileReader;
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
24 import java.io.IOException;
234
b2cfbe46f9b6 HgTags got TagInfo to access tags. Tags are read from all branches/revisions now, not only working copy
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 231
diff changeset
25 import java.io.StringReader;
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
26 import java.lang.ref.SoftReference;
481
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
27 import java.nio.CharBuffer;
114
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
28 import java.util.ArrayList;
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
29 import java.util.Collections;
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
30 import java.util.HashMap;
114
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
31 import java.util.List;
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
32
235
fd845a53f53d Experimental access to working dir parents
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 234
diff changeset
33 import org.tmatesoft.hg.core.Nodeid;
295
981f9f50bb6c Issue 11: Error log facility. SessionContext to share common facilities
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 292
diff changeset
34 import org.tmatesoft.hg.core.SessionContext;
234
b2cfbe46f9b6 HgTags got TagInfo to access tags. Tags are read from all branches/revisions now, not only working copy
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 231
diff changeset
35 import org.tmatesoft.hg.internal.ByteArrayChannel;
114
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
36 import org.tmatesoft.hg.internal.ConfigFile;
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
37 import org.tmatesoft.hg.internal.DataAccessProvider;
486
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
38 import org.tmatesoft.hg.internal.Experimental;
114
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
39 import org.tmatesoft.hg.internal.Filter;
407
30922c728341 Better multiline log printout; options to tune default log output
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 388
diff changeset
40 import org.tmatesoft.hg.internal.Internals;
486
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
41 import org.tmatesoft.hg.internal.Lock;
77
c677e1593919 Moved RevlogStream implementation into .internal
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 74
diff changeset
42 import org.tmatesoft.hg.internal.RevlogStream;
239
df9d2854d3d6 Initial access to subrepositories
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 237
diff changeset
43 import org.tmatesoft.hg.internal.SubrepoManager;
234
b2cfbe46f9b6 HgTags got TagInfo to access tags. Tags are read from all branches/revisions now, not only working copy
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 231
diff changeset
44 import org.tmatesoft.hg.util.CancelledException;
235
fd845a53f53d Experimental access to working dir parents
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 234
diff changeset
45 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: 115
diff changeset
46 import org.tmatesoft.hg.util.Path;
64
19e9e220bf68 Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 55
diff changeset
47 import org.tmatesoft.hg.util.PathRewrite;
220
8de327242aa0 Basic information about branches
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 202
diff changeset
48 import org.tmatesoft.hg.util.ProgressSupport;
64
19e9e220bf68 Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 55
diff changeset
49
1
a3576694a4d1 Repository detection from local/specified directory
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
50
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
51
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
52 /**
64
19e9e220bf68 Convenient commands constitute hi-level API. org.tmatesoft namespace, GPL2 statement
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 55
diff changeset
53 * Shall be as state-less as possible, all the caching happens outside the repo, in commands/walkers
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
54 *
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
55 * @author Artem Tikhomirov
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
56 * @author TMate Software Ltd.
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
57 */
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
58 public final class HgRepository {
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
59
405
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
60 // IMPORTANT: if new constants added, consider fixing HgInternals#wrongRevisionIndex and HgInvalidRevisionException#getMessage
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
61
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
62 /**
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
63 * Revision index constant to indicate most recent revision
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
64 */
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
65 public static final int TIP = -3; // XXX TIP_REVISION?
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
66
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
67 /**
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
68 * Revision index constant to indicate invalid revision index value.
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
69 * Primary use is default/uninitialized values where user input is expected and as return value where
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
70 * an exception (e.g. {@link HgInvalidRevisionException}) is not desired
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
71 */
403
2747b0723867 FIXMEs: work on exceptions and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 396
diff changeset
72 public static final int BAD_REVISION = Integer.MIN_VALUE; // XXX INVALID_REVISION?
405
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
73
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
74 /**
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
75 * Revision index constant to indicate working copy
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
76 */
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
77 public static final int WORKING_COPY = -2; // XXX WORKING_COPY_REVISION?
252
a6d19adc2636 HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 239
diff changeset
78
405
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
79 /**
423
9c9c442b5f2e Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 421
diff changeset
80 * Constant ({@value #NO_REVISION}) to indicate revision absence or a fictitious revision of an empty repository.
9c9c442b5f2e Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 421
diff changeset
81 *
9c9c442b5f2e Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 421
diff changeset
82 * <p>Revision absence is vital e.g. for missing parent from {@link HgChangelog#parents(int, int[], byte[], byte[])} call and
9c9c442b5f2e Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 421
diff changeset
83 * to report cases when changeset records no corresponding manifest
9c9c442b5f2e Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 421
diff changeset
84 * revision {@link HgManifest#walk(int, int, org.tmatesoft.hg.repo.HgManifest.Inspector)}.
9c9c442b5f2e Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 421
diff changeset
85 *
9c9c442b5f2e Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 421
diff changeset
86 * <p> Use as imaginary revision/empty repository is handy as an argument (contrary to {@link #BAD_REVISION})
9c9c442b5f2e Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 421
diff changeset
87 * e.g in a status operation to visit changes from the very beginning of a repository.
405
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
88 */
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
89 public static final int NO_REVISION = -1;
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
90
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
91 /**
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
92 * Name of the primary branch, "default".
866fc3b597a0 Add an explicit constant instead of -1 to indicate 'no revision' case
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 403
diff changeset
93 */
252
a6d19adc2636 HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 239
diff changeset
94 public static final String DEFAULT_BRANCH_NAME = "default";
5
fc265ddeab26 File content and non-effective, although working, patch application
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 3
diff changeset
95
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 1
diff changeset
96 // temp aux marker method
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 1
diff changeset
97 public static IllegalStateException notImplemented() {
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 1
diff changeset
98 return new IllegalStateException("Not implemented");
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 1
diff changeset
99 }
148
1a7a9a20e1f9 Exceptions, javadoc. Initial cancel and progress support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 145
diff changeset
100
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
101 private final File repoDir; // .hg folder
237
6e1373b54e9b Allow access to working copy content through HgDataFile. Give access to repository's working dir
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 235
diff changeset
102 private final File workingDir; // .hg/../
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
103 private final String repoLocation;
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
104 private final DataAccessProvider dataAccess;
445
d0e5dc3cae6e Support for phases functionality from Mercurial 2.1
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 412
diff changeset
105 private final PathRewrite normalizePath; // normalized slashes but otherwise regular file names
d0e5dc3cae6e Support for phases functionality from Mercurial 2.1
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 412
diff changeset
106 private final PathRewrite dataPathHelper; // access to file storage area (usually under .hg/store/data/), with filenames mangled
d0e5dc3cae6e Support for phases functionality from Mercurial 2.1
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 412
diff changeset
107 private final PathRewrite repoPathHelper; // access to system files
295
981f9f50bb6c Issue 11: Error log facility. SessionContext to share common facilities
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 292
diff changeset
108 private final SessionContext sessionContext;
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
109
97
ee2c750b036d Changelog to HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 91
diff changeset
110 private HgChangelog changelog;
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 1
diff changeset
111 private HgManifest manifest;
50
f1db8610da62 Log to consult (placeholder, for now) class to find out associated tags
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 45
diff changeset
112 private HgTags tags;
220
8de327242aa0 Basic information about branches
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 202
diff changeset
113 private HgBranches branches;
231
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 229
diff changeset
114 private HgMergeState mergeState;
239
df9d2854d3d6 Initial access to subrepositories
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 237
diff changeset
115 private SubrepoManager subRepos;
484
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
116 private HgBookmarks bookmarks;
220
8de327242aa0 Basic information about branches
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 202
diff changeset
117
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
118 // XXX perhaps, shall enable caching explicitly
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
119 private final HashMap<Path, SoftReference<RevlogStream>> streamsCache = new HashMap<Path, SoftReference<RevlogStream>>();
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
120
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: 367
diff changeset
121 private final org.tmatesoft.hg.internal.Internals impl;
91
c2ce1cfaeb9e ignore file with regex and 'honest' glob support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 77
diff changeset
122 private HgIgnore ignore;
331
a37ce7145c3f Access to repository configuration
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 318
diff changeset
123 private HgRepoConfig repoConfig;
220
8de327242aa0 Basic information about branches
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 202
diff changeset
124
430
d280759c2a3f branch information is not directly related to dirstate, clean API from this dependency
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 425
diff changeset
125 /*
d280759c2a3f branch information is not directly related to dirstate, clean API from this dependency
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 425
diff changeset
126 * TODO [post-1.0] move to a better place, e.g. WorkingCopy container that tracks both dirstate and branches
d280759c2a3f branch information is not directly related to dirstate, clean API from this dependency
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 425
diff changeset
127 * (and, perhaps, undo, lastcommit and other similar information), and is change listener so that we don't need to
d280759c2a3f branch information is not directly related to dirstate, clean API from this dependency
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 425
diff changeset
128 * worry about this cached value become stale
d280759c2a3f branch information is not directly related to dirstate, clean API from this dependency
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 425
diff changeset
129 */
d280759c2a3f branch information is not directly related to dirstate, clean API from this dependency
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 425
diff changeset
130 private String wcBranch;
d280759c2a3f branch information is not directly related to dirstate, clean API from this dependency
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 425
diff changeset
131
d280759c2a3f branch information is not directly related to dirstate, clean API from this dependency
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 425
diff changeset
132
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
133 HgRepository(String repositoryPath) {
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
134 repoDir = 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: 235
diff changeset
135 workingDir = null;
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
136 repoLocation = repositoryPath;
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
137 dataAccess = null;
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
138 dataPathHelper = repoPathHelper = null;
142
37a34044e6bd More reasonable use of path normalizer and path.source
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 141
diff changeset
139 normalizePath = null;
295
981f9f50bb6c Issue 11: Error log facility. SessionContext to share common facilities
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 292
diff changeset
140 sessionContext = null;
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: 367
diff changeset
141 impl = null;
1
a3576694a4d1 Repository detection from local/specified directory
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
142 }
a3576694a4d1 Repository detection from local/specified directory
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
143
425
48f993aa2f41 FIXMEs: exceptions, javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 423
diff changeset
144 /**
48f993aa2f41 FIXMEs: exceptions, javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 423
diff changeset
145 * @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: 423
diff changeset
146 */
48f993aa2f41 FIXMEs: exceptions, javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 423
diff changeset
147 HgRepository(SessionContext ctx, String repositoryPath, File repositoryRoot) throws HgRuntimeException {
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
148 assert ".hg".equals(repositoryRoot.getName()) && repositoryRoot.isDirectory();
148
1a7a9a20e1f9 Exceptions, javadoc. Initial cancel and progress support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 145
diff changeset
149 assert repositoryPath != null;
1a7a9a20e1f9 Exceptions, javadoc. Initial cancel and progress support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 145
diff changeset
150 assert repositoryRoot != null;
295
981f9f50bb6c Issue 11: Error log facility. SessionContext to share common facilities
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 292
diff changeset
151 assert ctx != null;
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
152 repoDir = repositoryRoot;
237
6e1373b54e9b Allow access to working copy content through HgDataFile. Give access to repository's working dir
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 235
diff changeset
153 workingDir = repoDir.getParentFile();
6e1373b54e9b Allow access to working copy content through HgDataFile. Give access to repository's working dir
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 235
diff changeset
154 if (workingDir == null) {
6e1373b54e9b Allow access to working copy content through HgDataFile. Give access to repository's working dir
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 235
diff changeset
155 throw new IllegalArgumentException(repoDir.toString());
6e1373b54e9b Allow access to working copy content through HgDataFile. Give access to repository's working dir
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 235
diff changeset
156 }
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: 367
diff changeset
157 impl = new org.tmatesoft.hg.internal.Internals(ctx);
148
1a7a9a20e1f9 Exceptions, javadoc. Initial cancel and progress support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 145
diff changeset
158 repoLocation = repositoryPath;
295
981f9f50bb6c Issue 11: Error log facility. SessionContext to share common facilities
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 292
diff changeset
159 sessionContext = ctx;
981f9f50bb6c Issue 11: Error log facility. SessionContext to share common facilities
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 292
diff changeset
160 dataAccess = new DataAccessProvider(ctx);
981f9f50bb6c Issue 11: Error log facility. SessionContext to share common facilities
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 292
diff changeset
161 impl.parseRequires(this, new File(repoDir, "requires"));
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: 367
diff changeset
162 normalizePath = impl.buildNormalizePathRewrite();
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
163 dataPathHelper = impl.buildDataFilesHelper();
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
164 repoPathHelper = impl.buildRepositoryFilesHelper();
1
a3576694a4d1 Repository detection from local/specified directory
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
165 }
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
166
145
acc6151b1b7a toString for friendly debug
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 142
diff changeset
167 @Override
acc6151b1b7a toString for friendly debug
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 142
diff changeset
168 public String toString() {
acc6151b1b7a toString for friendly debug
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 142
diff changeset
169 return getClass().getSimpleName() + "[" + getLocation() + (isInvalid() ? "(BAD)" : "") + "]";
acc6151b1b7a toString for friendly debug
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 142
diff changeset
170 }
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
171
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
172 public String getLocation() {
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
173 return repoLocation;
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
174 }
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
175
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
176 public boolean isInvalid() {
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
177 return repoDir == null || !repoDir.exists() || !repoDir.isDirectory();
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
178 }
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
179
97
ee2c750b036d Changelog to HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 91
diff changeset
180 public HgChangelog getChangelog() {
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: 367
diff changeset
181 if (changelog == null) {
292
a415fe296a50 Refactor PathRewrite to accept any char sequence, not only string
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 289
diff changeset
182 CharSequence storagePath = repoPathHelper.rewrite("00changelog.i");
202
706bcc7cfee4 Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 197
diff changeset
183 RevlogStream content = resolve(Path.create(storagePath), true);
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: 367
diff changeset
184 changelog = new HgChangelog(this, content);
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
185 }
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: 367
diff changeset
186 return changelog;
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
187 }
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 1
diff changeset
188
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
189 public HgManifest getManifest() {
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: 367
diff changeset
190 if (manifest == null) {
202
706bcc7cfee4 Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 197
diff changeset
191 RevlogStream content = resolve(Path.create(repoPathHelper.rewrite("00manifest.i")), true);
412
63c5a9d7ca3f Follow-up for Issue 29: unify path translation for manifest and dirstate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 409
diff changeset
192 manifest = new HgManifest(this, content, impl.buildFileNameEncodingHelper());
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 1
diff changeset
193 }
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: 367
diff changeset
194 return manifest;
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 1
diff changeset
195 }
50
f1db8610da62 Log to consult (placeholder, for now) class to find out associated tags
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 45
diff changeset
196
482
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
197 /**
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
198 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em>
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
199 */
318
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
200 public HgTags getTags() throws HgInvalidControlFileException {
50
f1db8610da62 Log to consult (placeholder, for now) class to find out associated tags
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 45
diff changeset
201 if (tags == null) {
234
b2cfbe46f9b6 HgTags got TagInfo to access tags. Tags are read from all branches/revisions now, not only working copy
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 231
diff changeset
202 tags = new HgTags(this);
482
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
203 HgDataFile hgTags = getFileNode(HgTags.getPath());
318
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
204 if (hgTags.exists()) {
418
528b6780a8bd A bit of FIXME cleanup (mostly degraded to TODO post 1.0), comments and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 414
diff changeset
205 for (int i = 0; i <= hgTags.getLastRevision(); i++) { // TODO post-1.0 in fact, would be handy to have walk(start,end)
318
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
206 // method for data files as well, though it looks odd.
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
207 try {
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
208 ByteArrayChannel sink = new ByteArrayChannel();
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
209 hgTags.content(i, sink);
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
210 final String content = new String(sink.toArray(), "UTF8");
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
211 tags.readGlobal(new StringReader(content));
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
212 } catch (CancelledException ex) {
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
213 // IGNORE, can't happen, we did not configure cancellation
456
909306e412e2 Refactor LogFacility and SessionContext, better API for both
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 431
diff changeset
214 getContext().getLog().dump(getClass(), Debug, ex, null);
318
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
215 } catch (IOException ex) {
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
216 // UnsupportedEncodingException can't happen (UTF8)
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
217 // only from readGlobal. Need to reconsider exceptions thrown from there:
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
218 // BufferedReader wraps String and unlikely to throw IOException, perhaps, log is enough?
456
909306e412e2 Refactor LogFacility and SessionContext, better API for both
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 431
diff changeset
219 getContext().getLog().dump(getClass(), Error, ex, null);
318
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
220 // XXX need to decide what to do this. failure to read single revision shall not break complete cycle
234
b2cfbe46f9b6 HgTags got TagInfo to access tags. Tags are read from all branches/revisions now, not only working copy
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 231
diff changeset
221 }
b2cfbe46f9b6 HgTags got TagInfo to access tags. Tags are read from all branches/revisions now, not only working copy
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 231
diff changeset
222 }
318
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
223 }
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
224 File file2read = null;
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
225 try {
482
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
226 file2read = new File(getWorkingDir(), HgTags.getPath());
318
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
227 tags.readGlobal(file2read); // XXX replace with HgDataFile.workingCopy
482
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
228 file2read = new File(repoDir, HgLocalTags.getName());
318
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
229 tags.readLocal(file2read);
104
54562de502f7 Preliminary tags implementation
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
230 } catch (IOException ex) {
456
909306e412e2 Refactor LogFacility and SessionContext, better API for both
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 431
diff changeset
231 getContext().getLog().dump(getClass(), Error, ex, null);
318
c3d2233ba842 Shall propagate errors to clients, not work around them silently
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 295
diff changeset
232 throw new HgInvalidControlFileException("Failed to read tags", ex, file2read);
104
54562de502f7 Preliminary tags implementation
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
233 }
50
f1db8610da62 Log to consult (placeholder, for now) class to find out associated tags
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 45
diff changeset
234 }
f1db8610da62 Log to consult (placeholder, for now) class to find out associated tags
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 45
diff changeset
235 return tags;
f1db8610da62 Log to consult (placeholder, for now) class to find out associated tags
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 45
diff changeset
236 }
f1db8610da62 Log to consult (placeholder, for now) class to find out associated tags
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 45
diff changeset
237
482
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
238 /**
484
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
239 * Access branch information
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
240 * @return branch manager instance, never <code>null</code>
482
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
241 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em>
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
242 */
366
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 348
diff changeset
243 public HgBranches getBranches() throws HgInvalidControlFileException {
220
8de327242aa0 Basic information about branches
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 202
diff changeset
244 if (branches == null) {
8de327242aa0 Basic information about branches
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 202
diff changeset
245 branches = new HgBranches(this);
8de327242aa0 Basic information about branches
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 202
diff changeset
246 branches.collect(ProgressSupport.Factory.get(null));
8de327242aa0 Basic information about branches
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 202
diff changeset
247 }
8de327242aa0 Basic information about branches
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 202
diff changeset
248 return branches;
8de327242aa0 Basic information about branches
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 202
diff changeset
249 }
231
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 229
diff changeset
250
484
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
251 /**
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
252 * Access state of the recent merge
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
253 * @return merge state facility, never <code>null</code>
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
254 */
231
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 229
diff changeset
255 public HgMergeState getMergeState() {
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 229
diff changeset
256 if (mergeState == null) {
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 229
diff changeset
257 mergeState = new HgMergeState(this);
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 229
diff changeset
258 }
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 229
diff changeset
259 return mergeState;
1792b37650f2 Introduced access to conflict resolution information (merge state)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 229
diff changeset
260 }
220
8de327242aa0 Basic information about branches
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 202
diff changeset
261
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
262 public HgDataFile getFileNode(String path) {
292
a415fe296a50 Refactor PathRewrite to accept any char sequence, not only string
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 289
diff changeset
263 CharSequence nPath = normalizePath.rewrite(path);
a415fe296a50 Refactor PathRewrite to accept any char sequence, not only string
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 289
diff changeset
264 CharSequence storagePath = dataPathHelper.rewrite(nPath);
202
706bcc7cfee4 Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 197
diff changeset
265 RevlogStream content = resolve(Path.create(storagePath), false);
115
c0cc2535462c Introduced channels to pipeline (and easily filter) data streams
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 114
diff changeset
266 Path p = Path.create(nPath);
c0cc2535462c Introduced channels to pipeline (and easily filter) data streams
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 114
diff changeset
267 if (content == null) {
c0cc2535462c Introduced channels to pipeline (and easily filter) data streams
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 114
diff changeset
268 return new HgDataFile(this, p);
c0cc2535462c Introduced channels to pipeline (and easily filter) data streams
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 114
diff changeset
269 }
c0cc2535462c Introduced channels to pipeline (and easily filter) data streams
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 114
diff changeset
270 return new HgDataFile(this, p, content);
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
271 }
1
a3576694a4d1 Repository detection from local/specified directory
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
272
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
273 public HgDataFile getFileNode(Path path) {
292
a415fe296a50 Refactor PathRewrite to accept any char sequence, not only string
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 289
diff changeset
274 CharSequence storagePath = dataPathHelper.rewrite(path.toString());
202
706bcc7cfee4 Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 197
diff changeset
275 RevlogStream content = resolve(Path.create(storagePath), false);
115
c0cc2535462c Introduced channels to pipeline (and easily filter) data streams
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 114
diff changeset
276 // XXX no content when no file? or HgDataFile.exists() to detect that?
c0cc2535462c Introduced channels to pipeline (and easily filter) data streams
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 114
diff changeset
277 if (content == null) {
c0cc2535462c Introduced channels to pipeline (and easily filter) data streams
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 114
diff changeset
278 return new HgDataFile(this, path);
c0cc2535462c Introduced channels to pipeline (and easily filter) data streams
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 114
diff changeset
279 }
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
280 return new HgDataFile(this, path, content);
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
281 }
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 1
diff changeset
282
142
37a34044e6bd More reasonable use of path normalizer and path.source
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 141
diff changeset
283 /* clients need to rewrite path from their FS to a repository-friendly paths, and, perhaps, vice versa*/
37a34044e6bd More reasonable use of path normalizer and path.source
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 141
diff changeset
284 public PathRewrite getToRepoPathHelper() {
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
285 return normalizePath;
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
286 }
284
7232b94f2ae3 HgDirstate shall operate with Path instead of String for file names. Use of Pair instead of array of unspecified length for parents.
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 280
diff changeset
287
7232b94f2ae3 HgDirstate shall operate with Path instead of String for file names. Use of Pair instead of array of unspecified length for parents.
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 280
diff changeset
288 /**
348
a0864b2892cd Expose errors reading mercurial control files with exception
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 337
diff changeset
289 * @return pair of values, {@link Pair#first()} and {@link Pair#second()} are respective parents, never <code>null</code>.
a0864b2892cd Expose errors reading mercurial control files with exception
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 337
diff changeset
290 * @throws HgInvalidControlFileException if attempt to read information about working copy parents from dirstate failed
284
7232b94f2ae3 HgDirstate shall operate with Path instead of String for file names. Use of Pair instead of array of unspecified length for parents.
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 280
diff changeset
291 */
348
a0864b2892cd Expose errors reading mercurial control files with exception
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 337
diff changeset
292 public Pair<Nodeid,Nodeid> getWorkingCopyParents() throws HgInvalidControlFileException {
482
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
293 return HgDirstate.readParents(this, new File(repoDir, Dirstate.getName()));
235
fd845a53f53d Experimental access to working dir parents
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 234
diff changeset
294 }
252
a6d19adc2636 HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 239
diff changeset
295
a6d19adc2636 HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 239
diff changeset
296 /**
a6d19adc2636 HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 239
diff changeset
297 * @return name of the branch associated with working directory, never <code>null</code>.
348
a0864b2892cd Expose errors reading mercurial control files with exception
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 337
diff changeset
298 * @throws HgInvalidControlFileException if attempt to read branch name failed.
252
a6d19adc2636 HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 239
diff changeset
299 */
348
a0864b2892cd Expose errors reading mercurial control files with exception
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 337
diff changeset
300 public String getWorkingCopyBranchName() throws HgInvalidControlFileException {
430
d280759c2a3f branch information is not directly related to dirstate, clean API from this dependency
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 425
diff changeset
301 if (wcBranch == null) {
d280759c2a3f branch information is not directly related to dirstate, clean API from this dependency
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 425
diff changeset
302 wcBranch = HgDirstate.readBranch(this, new File(repoDir, "branch"));
d280759c2a3f branch information is not directly related to dirstate, clean API from this dependency
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 425
diff changeset
303 }
d280759c2a3f branch information is not directly related to dirstate, clean API from this dependency
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 425
diff changeset
304 return wcBranch;
252
a6d19adc2636 HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 239
diff changeset
305 }
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 1
diff changeset
306
237
6e1373b54e9b Allow access to working copy content through HgDataFile. Give access to repository's working dir
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 235
diff changeset
307 /**
6e1373b54e9b Allow access to working copy content through HgDataFile. Give access to repository's working dir
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 235
diff changeset
308 * @return location where user files (shall) reside
6e1373b54e9b Allow access to working copy content through HgDataFile. Give access to repository's working dir
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 235
diff changeset
309 */
6e1373b54e9b Allow access to working copy content through HgDataFile. Give access to repository's working dir
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 235
diff changeset
310 public File getWorkingDir() {
6e1373b54e9b Allow access to working copy content through HgDataFile. Give access to repository's working dir
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 235
diff changeset
311 return workingDir;
6e1373b54e9b Allow access to working copy content through HgDataFile. Give access to repository's working dir
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 235
diff changeset
312 }
239
df9d2854d3d6 Initial access to subrepositories
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 237
diff changeset
313
df9d2854d3d6 Initial access to subrepositories
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 237
diff changeset
314 /**
df9d2854d3d6 Initial access to subrepositories
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 237
diff changeset
315 * Provides access to sub-repositories defined in this repository. Enumerated sub-repositories are those directly
df9d2854d3d6 Initial access to subrepositories
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 237
diff changeset
316 * known, not recursive collection of all nested sub-repositories.
df9d2854d3d6 Initial access to subrepositories
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 237
diff changeset
317 * @return list of all known sub-repositories in this repository, or empty list if none found.
482
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
318 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em>
239
df9d2854d3d6 Initial access to subrepositories
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 237
diff changeset
319 */
348
a0864b2892cd Expose errors reading mercurial control files with exception
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 337
diff changeset
320 public List<HgSubrepoLocation> getSubrepositories() throws HgInvalidControlFileException {
239
df9d2854d3d6 Initial access to subrepositories
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 237
diff changeset
321 if (subRepos == null) {
df9d2854d3d6 Initial access to subrepositories
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 237
diff changeset
322 subRepos = new SubrepoManager(this);
348
a0864b2892cd Expose errors reading mercurial control files with exception
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 337
diff changeset
323 subRepos.read();
239
df9d2854d3d6 Initial access to subrepositories
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 237
diff changeset
324 }
df9d2854d3d6 Initial access to subrepositories
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 237
diff changeset
325 return subRepos.all();
df9d2854d3d6 Initial access to subrepositories
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 237
diff changeset
326 }
237
6e1373b54e9b Allow access to working copy content through HgDataFile. Give access to repository's working dir
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 235
diff changeset
327
331
a37ce7145c3f Access to repository configuration
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 318
diff changeset
328
a37ce7145c3f Access to repository configuration
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 318
diff changeset
329 public HgRepoConfig getConfiguration() /* XXX throws HgInvalidControlFileException? Description of the exception suggests it is only for files under ./hg/*/ {
a37ce7145c3f Access to repository configuration
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 318
diff changeset
330 if (repoConfig == null) {
a37ce7145c3f Access to repository configuration
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 318
diff changeset
331 try {
a37ce7145c3f Access to repository configuration
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 318
diff changeset
332 ConfigFile configFile = impl.readConfiguration(this, getRepositoryRoot());
a37ce7145c3f Access to repository configuration
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 318
diff changeset
333 repoConfig = new HgRepoConfig(configFile);
a37ce7145c3f Access to repository configuration
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 318
diff changeset
334 } catch (IOException ex) {
a37ce7145c3f Access to repository configuration
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 318
diff changeset
335 String m = "Errors while reading user configuration file";
456
909306e412e2 Refactor LogFacility and SessionContext, better API for both
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 431
diff changeset
336 getContext().getLog().dump(getClass(), Warn, ex, m);
483
e31e85cf4d4c Handle include and unset directives in config files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 482
diff changeset
337 return new HgRepoConfig(new ConfigFile(getContext())); // empty config, do not cache, allow to try once again
331
a37ce7145c3f Access to repository configuration
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 318
diff changeset
338 //throw new HgInvalidControlFileException(m, ex, null);
a37ce7145c3f Access to repository configuration
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 318
diff changeset
339 }
a37ce7145c3f Access to repository configuration
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 318
diff changeset
340 }
a37ce7145c3f Access to repository configuration
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 318
diff changeset
341 return repoConfig;
a37ce7145c3f Access to repository configuration
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 318
diff changeset
342 }
a37ce7145c3f Access to repository configuration
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 318
diff changeset
343
237
6e1373b54e9b Allow access to working copy content through HgDataFile. Give access to repository's working dir
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 235
diff changeset
344 // shall be of use only for internal classes
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
345 /*package-local*/ File getRepositoryRoot() {
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
346 return repoDir;
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
347 }
337
f377f833b780 Issue 17: temporary code to nail down the problem
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 335
diff changeset
348
f377f833b780 Issue 17: temporary code to nail down the problem
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 335
diff changeset
349 /*package-local, debug*/String getStoragePath(HgDataFile df) {
418
528b6780a8bd A bit of FIXME cleanup (mostly degraded to TODO post 1.0), comments and javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 414
diff changeset
350 // may come handy for debug
337
f377f833b780 Issue 17: temporary code to nail down the problem
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 335
diff changeset
351 return dataPathHelper.rewrite(df.getPath().toString()).toString();
f377f833b780 Issue 17: temporary code to nail down the problem
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 335
diff changeset
352 }
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
353
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
354 // XXX package-local, unless there are cases when required from outside (guess, working dir/revision walkers may hide dirstate access and no public visibility needed)
280
35125450c804 Erroneous and slow status for working copies based on non-tip revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
355 // XXX consider passing Path pool or factory to produce (shared) Path instead of Strings
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: 430
diff changeset
356 /*package-local*/ final HgDirstate loadDirstate(Path.Source pathFactory) throws HgInvalidControlFileException {
292
a415fe296a50 Refactor PathRewrite to accept any char sequence, not only string
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 289
diff changeset
357 PathRewrite canonicalPath = null;
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: 367
diff changeset
358 if (!impl.isCaseSensitiveFileSystem()) {
292
a415fe296a50 Refactor PathRewrite to accept any char sequence, not only string
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 289
diff changeset
359 canonicalPath = new PathRewrite() {
a415fe296a50 Refactor PathRewrite to accept any char sequence, not only string
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 289
diff changeset
360
a415fe296a50 Refactor PathRewrite to accept any char sequence, not only string
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 289
diff changeset
361 public CharSequence rewrite(CharSequence path) {
a415fe296a50 Refactor PathRewrite to accept any char sequence, not only string
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 289
diff changeset
362 return path.toString().toLowerCase();
a415fe296a50 Refactor PathRewrite to accept any char sequence, not only string
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 289
diff changeset
363 }
a415fe296a50 Refactor PathRewrite to accept any char sequence, not only string
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 289
diff changeset
364 };
a415fe296a50 Refactor PathRewrite to accept any char sequence, not only string
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 289
diff changeset
365 }
482
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
366 File dirstateFile = new File(repoDir, Dirstate.getName());
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
367 HgDirstate ds = new HgDirstate(this, dirstateFile, pathFactory, canonicalPath);
412
63c5a9d7ca3f Follow-up for Issue 29: unify path translation for manifest and dirstate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 409
diff changeset
368 ds.read(impl.buildFileNameEncodingHelper());
348
a0864b2892cd Expose errors reading mercurial control files with exception
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 337
diff changeset
369 return ds;
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
370 }
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
371
289
086a326f181f Provide public access to ignored files configuration to use in alternative file walkers
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 284
diff changeset
372 /**
086a326f181f Provide public access to ignored files configuration to use in alternative file walkers
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 284
diff changeset
373 * Access to configured set of ignored files.
086a326f181f Provide public access to ignored files configuration to use in alternative file walkers
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 284
diff changeset
374 * @see HgIgnore#isIgnored(Path)
482
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
375 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em>
289
086a326f181f Provide public access to ignored files configuration to use in alternative file walkers
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 284
diff changeset
376 */
482
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
377 public HgIgnore getIgnore() throws HgInvalidControlFileException {
91
c2ce1cfaeb9e ignore file with regex and 'honest' glob support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 77
diff changeset
378 // TODO read config for additional locations
c2ce1cfaeb9e ignore file with regex and 'honest' glob support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 77
diff changeset
379 if (ignore == null) {
409
0f5696623512 Support glob path pattern rewrite to facilitate use of globs with Windows path separator
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 407
diff changeset
380 ignore = new HgIgnore(getToRepoPathHelper());
482
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
381 File ignoreFile = new File(getWorkingDir(), HgIgnore.getPath());
91
c2ce1cfaeb9e ignore file with regex and 'honest' glob support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 77
diff changeset
382 try {
335
3d41dc148d14 Do not fail with exception on syntax errors in .hgignore
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 331
diff changeset
383 final List<String> errors = ignore.read(ignoreFile);
3d41dc148d14 Do not fail with exception on syntax errors in .hgignore
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 331
diff changeset
384 if (errors != null) {
481
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
385 getContext().getLog().dump(getClass(), Warn, "Syntax errors parsing %s:\n%s", ignoreFile.getName(), Internals.join(errors, ",\n"));
335
3d41dc148d14 Do not fail with exception on syntax errors in .hgignore
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 331
diff changeset
386 }
91
c2ce1cfaeb9e ignore file with regex and 'honest' glob support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 77
diff changeset
387 } catch (IOException ex) {
482
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
388 final String m = String.format("Error reading %s file", ignoreFile);
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
389 throw new HgInvalidControlFileException(m, ex, ignoreFile);
91
c2ce1cfaeb9e ignore file with regex and 'honest' glob support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 77
diff changeset
390 }
c2ce1cfaeb9e ignore file with regex and 'honest' glob support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 77
diff changeset
391 }
c2ce1cfaeb9e ignore file with regex and 'honest' glob support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 77
diff changeset
392 return ignore;
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
393 }
482
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
394
481
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
395 /**
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
396 * Mercurial saves message user has supplied for a commit to facilitate message re-use in case commit fails.
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
397 * This method provides this saved message.
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
398 *
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
399 * @return message used for last commit attempt, or <code>null</code> if none
482
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
400 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em>
481
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
401 */
482
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
402 public String getCommitLastMessage() throws HgInvalidControlFileException {
6c67debed07e Distinguish files in wc from files under repo root, use these constants
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 481
diff changeset
403 File lastMessage = new File(repoDir, LastMessage.getPath());
481
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
404 if (!lastMessage.canRead()) {
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
405 return null;
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
406 }
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
407 FileReader fr = null;
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
408 try {
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
409 fr = new FileReader(lastMessage);
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
410 CharBuffer cb = CharBuffer.allocate(Internals.ltoi(lastMessage.length()));
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
411 fr.read(cb);
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
412 return cb.flip().toString();
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
413 } catch (IOException ex) {
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
414 throw new HgInvalidControlFileException("Can't retrieve message of last commit attempt", ex, lastMessage);
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
415 } finally {
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
416 if (fr != null) {
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
417 try {
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
418 fr.close();
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
419 } catch (IOException ex) {
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
420 getContext().getLog().dump(getClass(), Warn, "Failed to close %s after read", lastMessage);
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
421 }
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
422 }
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
423 }
a458f9fb00ce Access to user-supplied message of last commit
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
424 }
486
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
425
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
426 private Lock wdLock, storeLock;
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
427
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
428 /**
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
429 * PROVISIONAL CODE, DO NOT USE
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
430 *
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
431 * Access repository lock that covers non-store parts of the repository (dirstate, branches, etc -
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
432 * everything that has to do with working directory state).
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
433 *
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
434 * Note, the lock object returned merely gives access to lock mechanism. NO ACTUAL LOCKING IS DONE.
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
435 * Use {@link Lock#acquire()} to actually lock the repository.
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
436 *
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
437 * @return lock object, never <code>null</code>
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
438 */
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
439 @Experimental(reason="WORK IN PROGRESS")
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
440 public Lock getWorkingDirLock() {
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
441 if (wdLock == null) {
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
442 synchronized (this) {
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
443 if (wdLock == null) {
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
444 wdLock = new Lock(new File(repoPathHelper.rewrite("wlock").toString()));
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
445 }
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
446 }
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
447 }
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
448 return wdLock;
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
449 }
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
450
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
451 @Experimental(reason="WORK IN PROGRESS")
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
452 public Lock getStoreLock() {
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
453 if (storeLock == null) {
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
454 synchronized (this) {
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
455 if (storeLock == null) {
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
456 storeLock = new Lock(new File(repoPathHelper.rewrite("store/lock").toString()));
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
457 }
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
458 }
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
459 }
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
460 return storeLock;
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
461 }
d740edfff563 Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 484
diff changeset
462
484
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
463 /**
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
464 * Access bookmarks-related functionality
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
465 * @return facility to manage bookmarks, never <code>null</code>
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
466 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em>
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
467 */
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
468 public HgBookmarks getBookmarks() throws HgInvalidControlFileException {
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
469 if (bookmarks == null) {
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
470 bookmarks = new HgBookmarks(this);
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
471 bookmarks.read();
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
472 }
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
473 return bookmarks;
ae4d6604debd Bookmarks support added
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 483
diff changeset
474 }
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
475
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
476 /*package-local*/ DataAccessProvider getDataAccess() {
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
477 return dataAccess;
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
478 }
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
479
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 1
diff changeset
480 /**
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 1
diff changeset
481 * Perhaps, should be separate interface, like ContentLookup
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
482 * path - repository storage path (i.e. one usually with .i or .d)
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 1
diff changeset
483 */
202
706bcc7cfee4 Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 197
diff changeset
484 /*package-local*/ RevlogStream resolve(Path path, boolean shallFakeNonExistent) {
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
485 final SoftReference<RevlogStream> ref = streamsCache.get(path);
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
486 RevlogStream cached = ref == null ? null : ref.get();
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
487 if (cached != null) {
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
488 return cached;
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
489 }
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
490 File f = new File(repoDir, path.toString());
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
491 if (f.exists()) {
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
492 RevlogStream s = new RevlogStream(dataAccess, f);
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: 367
diff changeset
493 if (impl.shallCacheRevlogs()) {
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: 367
diff changeset
494 streamsCache.put(path, new SoftReference<RevlogStream>(s));
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: 367
diff changeset
495 }
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
496 return s;
202
706bcc7cfee4 Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 197
diff changeset
497 } else {
706bcc7cfee4 Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 197
diff changeset
498 if (shallFakeNonExistent) {
706bcc7cfee4 Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 197
diff changeset
499 try {
706bcc7cfee4 Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 197
diff changeset
500 File fake = File.createTempFile(f.getName(), null);
706bcc7cfee4 Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 197
diff changeset
501 fake.deleteOnExit();
706bcc7cfee4 Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 197
diff changeset
502 return new RevlogStream(dataAccess, fake);
706bcc7cfee4 Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 197
diff changeset
503 } catch (IOException ex) {
456
909306e412e2 Refactor LogFacility and SessionContext, better API for both
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 431
diff changeset
504 getContext().getLog().dump(getClass(), Info, ex, null);
202
706bcc7cfee4 Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 197
diff changeset
505 }
706bcc7cfee4 Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 197
diff changeset
506 }
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
507 }
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
508 return null; // XXX empty stream instead?
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 68
diff changeset
509 }
114
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
510
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
511 /*package-local*/ List<Filter> getFiltersFromRepoToWorkingDir(Path p) {
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
512 return instantiateFilters(p, new Filter.Options(Filter.Direction.FromRepo));
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
513 }
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
514
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
515 /*package-local*/ List<Filter> getFiltersFromWorkingDirToRepo(Path p) {
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
516 return instantiateFilters(p, new Filter.Options(Filter.Direction.ToRepo));
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
517 }
237
6e1373b54e9b Allow access to working copy content through HgDataFile. Give access to repository's working dir
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 235
diff changeset
518
6e1373b54e9b Allow access to working copy content through HgDataFile. Give access to repository's working dir
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 235
diff changeset
519 /*package-local*/ File getFile(HgDataFile dataFile) {
6e1373b54e9b Allow access to working copy content through HgDataFile. Give access to repository's working dir
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 235
diff changeset
520 return new File(getWorkingDir(), dataFile.getPath().toString());
6e1373b54e9b Allow access to working copy content through HgDataFile. Give access to repository's working dir
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 235
diff changeset
521 }
295
981f9f50bb6c Issue 11: Error log facility. SessionContext to share common facilities
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 292
diff changeset
522
981f9f50bb6c Issue 11: Error log facility. SessionContext to share common facilities
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 292
diff changeset
523 /*package-local*/ SessionContext getContext() {
981f9f50bb6c Issue 11: Error log facility. SessionContext to share common facilities
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 292
diff changeset
524 return sessionContext;
981f9f50bb6c Issue 11: Error log facility. SessionContext to share common facilities
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 292
diff changeset
525 }
412
63c5a9d7ca3f Follow-up for Issue 29: unify path translation for manifest and dirstate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 409
diff changeset
526
63c5a9d7ca3f Follow-up for Issue 29: unify path translation for manifest and dirstate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 409
diff changeset
527 /*package-local*/ Internals getImplHelper() {
63c5a9d7ca3f Follow-up for Issue 29: unify path translation for manifest and dirstate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 409
diff changeset
528 return impl;
63c5a9d7ca3f Follow-up for Issue 29: unify path translation for manifest and dirstate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 409
diff changeset
529 }
114
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
530
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
531 private List<Filter> instantiateFilters(Path p, Filter.Options opts) {
331
a37ce7145c3f Access to repository configuration
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 318
diff changeset
532 List<Filter.Factory> factories = impl.getFilters(this);
114
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
533 if (factories.isEmpty()) {
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
534 return Collections.emptyList();
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
535 }
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
536 ArrayList<Filter> rv = new ArrayList<Filter>(factories.size());
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
537 for (Filter.Factory ff : factories) {
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
538 Filter f = ff.create(p, opts);
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
539 if (f != null) {
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
540 rv.add(f);
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
541 }
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
542 }
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
543 return rv;
46291ec605a0 Filters to read and initialize according to configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 104
diff changeset
544 }
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
545 }