Mercurial > hg4j
annotate src/org/tmatesoft/hg/internal/Internals.java @ 478:e74580e24feb
Test for subprogress
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Thu, 12 Jul 2012 19:11:12 +0200 | 
| parents | 909306e412e2 | 
| children | e31e85cf4d4c | 
| rev | line source | 
|---|---|
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 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: 
382diff
changeset | 2 * Copyright (c) 2011-2012 TMate Software Ltd | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 3 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 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: 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: 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: diff
changeset | 7 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 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: 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: 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: diff
changeset | 11 * GNU General Public License for more details. | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 12 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 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: 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: 
83diff
changeset | 15 * contact TMate Software at support@hg4j.com | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 16 */ | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 17 package org.tmatesoft.hg.internal; | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 18 | 
| 114 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 19 import static org.tmatesoft.hg.internal.RequiresFile.*; | 
| 456 
909306e412e2
Refactor LogFacility and SessionContext, better API for both
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
425diff
changeset | 20 import static org.tmatesoft.hg.util.LogFacility.Severity.Error; | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 21 | 
| 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: 
150diff
changeset | 22 import java.io.File; | 
| 
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: 
150diff
changeset | 23 import java.io.FileOutputStream; | 
| 
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: 
150diff
changeset | 24 import java.io.IOException; | 
| 411 
464b4404e75d
Issue 29: Bad storage path translation - translate Unicode chars to filesystem encoding
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
409diff
changeset | 25 import java.nio.charset.Charset; | 
| 114 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 26 import java.util.ArrayList; | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 27 import java.util.Arrays; | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 28 import java.util.Collections; | 
| 407 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 29 import java.util.Iterator; | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 30 import java.util.LinkedHashSet; | 
| 114 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 31 import java.util.List; | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 32 import java.util.StringTokenizer; | 
| 114 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 33 | 
| 382 
82336b7c54f4
Per-repository UpdateConfigCommand completed. Access to system properties through SessionContext to ease alternation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
379diff
changeset | 34 import org.tmatesoft.hg.core.SessionContext; | 
| 295 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
292diff
changeset | 35 import org.tmatesoft.hg.repo.HgInternals; | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
421diff
changeset | 36 import org.tmatesoft.hg.repo.HgInvalidControlFileException; | 
| 331 
a37ce7145c3f
Access to repository configuration
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 37 import org.tmatesoft.hg.repo.HgRepoConfig.ExtensionsSection; | 
| 114 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 38 import org.tmatesoft.hg.repo.HgRepository; | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 39 import org.tmatesoft.hg.util.PathRewrite; | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 40 | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 41 /** | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 42 * Fields/members that shall not be visible | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 43 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 44 * @author Artem Tikhomirov | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 45 * @author TMate Software Ltd. | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 46 */ | 
| 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: 
382diff
changeset | 47 public final class Internals { | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 48 | 
| 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: 
382diff
changeset | 49 /** | 
| 
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: 
382diff
changeset | 50 * Allows to specify Mercurial installation directory to detect installation-wide configurations. | 
| 
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: 
382diff
changeset | 51 * Without this property set, hg4j would attempt to deduce this value locating hg executable. | 
| 
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: 
382diff
changeset | 52 */ | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 53 public static final String CFG_PROPERTY_HG_INSTALL_ROOT = "hg4j.hg.install_root"; | 
| 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: 
382diff
changeset | 54 | 
| 
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: 
382diff
changeset | 55 /** | 
| 
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: 
382diff
changeset | 56 * Tells repository not to cache files/revlogs | 
| 
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: 
382diff
changeset | 57 * XXX perhaps, need to respect this property not only for data files, but for manifest and changelog as well? | 
| 
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: 
382diff
changeset | 58 * (@see HgRepository#getChangelog and #getManifest()) | 
| 
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: 
382diff
changeset | 59 */ | 
| 
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: 
382diff
changeset | 60 public static final String CFG_PROPERTY_REVLOG_STREAM_CACHE = "hg4j.repo.disable_revlog_cache"; | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 61 | 
| 411 
464b4404e75d
Issue 29: Bad storage path translation - translate Unicode chars to filesystem encoding
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
409diff
changeset | 62 /** | 
| 
464b4404e75d
Issue 29: Bad storage path translation - translate Unicode chars to filesystem encoding
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
409diff
changeset | 63 * Name of charset to use when translating Unicode filenames to Mercurial storage paths, string, | 
| 
464b4404e75d
Issue 29: Bad storage path translation - translate Unicode chars to filesystem encoding
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
409diff
changeset | 64 * to resolve with {@link Charset#forName(String)}. | 
| 
464b4404e75d
Issue 29: Bad storage path translation - translate Unicode chars to filesystem encoding
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
409diff
changeset | 65 * E.g. <code>"cp1251"</code> or <code>"Latin-1"</code>. | 
| 
464b4404e75d
Issue 29: Bad storage path translation - translate Unicode chars to filesystem encoding
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
409diff
changeset | 66 * | 
| 
464b4404e75d
Issue 29: Bad storage path translation - translate Unicode chars to filesystem encoding
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
409diff
changeset | 67 * <p>Mercurial uses system encoding when mangling storage paths. Default value | 
| 
464b4404e75d
Issue 29: Bad storage path translation - translate Unicode chars to filesystem encoding
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
409diff
changeset | 68 * based on 'file.encoding' Java system property is usually fine here, however | 
| 
464b4404e75d
Issue 29: Bad storage path translation - translate Unicode chars to filesystem encoding
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
409diff
changeset | 69 * in certain scenarios it may be desirable to force a different one, and this | 
| 
464b4404e75d
Issue 29: Bad storage path translation - translate Unicode chars to filesystem encoding
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
409diff
changeset | 70 * property is exactly for this purpose. | 
| 
464b4404e75d
Issue 29: Bad storage path translation - translate Unicode chars to filesystem encoding
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
409diff
changeset | 71 * | 
| 
464b4404e75d
Issue 29: Bad storage path translation - translate Unicode chars to filesystem encoding
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
409diff
changeset | 72 * <p>E.g. Eclipse defaults to project encoding (Launch config, Common page) when launching an application, | 
| 
464b4404e75d
Issue 29: Bad storage path translation - translate Unicode chars to filesystem encoding
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
409diff
changeset | 73 * and if your project happen to use anything but filesystem default (say, UTF8 on cp1251 system), | 
| 
464b4404e75d
Issue 29: Bad storage path translation - translate Unicode chars to filesystem encoding
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
409diff
changeset | 74 * native storage paths won't match | 
| 
464b4404e75d
Issue 29: Bad storage path translation - translate Unicode chars to filesystem encoding
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
409diff
changeset | 75 */ | 
| 412 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 76 public static final String CFG_PROPERTY_FS_FILENAME_ENCODING = "hg.fs.filename.encoding"; | 
| 411 
464b4404e75d
Issue 29: Bad storage path translation - translate Unicode chars to filesystem encoding
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
409diff
changeset | 77 | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 78 private int requiresFlags = 0; | 
| 114 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 79 private List<Filter.Factory> filterFactories; | 
| 411 
464b4404e75d
Issue 29: Bad storage path translation - translate Unicode chars to filesystem encoding
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
409diff
changeset | 80 private final SessionContext sessionContext; | 
| 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: 
382diff
changeset | 81 private final boolean isCaseSensitiveFileSystem; | 
| 
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: 
382diff
changeset | 82 private final boolean shallCacheRevlogsInRepo; | 
| 114 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 83 | 
| 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: 
382diff
changeset | 84 public Internals(SessionContext ctx) { | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
421diff
changeset | 85 sessionContext = ctx; | 
| 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: 
382diff
changeset | 86 isCaseSensitiveFileSystem = !runningOnWindows(); | 
| 456 
909306e412e2
Refactor LogFacility and SessionContext, better API for both
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
425diff
changeset | 87 shallCacheRevlogsInRepo = new PropertyMarshal(ctx).getBoolean(CFG_PROPERTY_REVLOG_STREAM_CACHE, true); | 
| 114 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 88 } | 
| 295 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
292diff
changeset | 89 | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
421diff
changeset | 90 public void parseRequires(HgRepository hgRepo, File requiresFile) throws HgInvalidControlFileException { | 
| 295 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
292diff
changeset | 91 try { | 
| 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
292diff
changeset | 92 new RequiresFile().parse(this, requiresFile); | 
| 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
292diff
changeset | 93 } catch (IOException ex) { | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
421diff
changeset | 94 throw new HgInvalidControlFileException("Parse failed", ex, requiresFile); | 
| 295 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
292diff
changeset | 95 } | 
| 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
292diff
changeset | 96 } | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 97 | 
| 83 
a5275143664c
Complete path hash calculation of fncache requirement
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
74diff
changeset | 98 public/*for tests, otherwise pkg*/ void setStorageConfig(int version, int flags) { | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 99 requiresFlags = flags; | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 100 } | 
| 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: 
382diff
changeset | 101 | 
| 
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: 
382diff
changeset | 102 public PathRewrite buildNormalizePathRewrite() { | 
| 
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: 
382diff
changeset | 103 if (runningOnWindows()) { | 
| 409 
0f5696623512
Support glob path pattern rewrite to facilitate use of globs with Windows path separator
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
407diff
changeset | 104 return new WinToNixPathRewrite(); | 
| 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: 
382diff
changeset | 105 } else { | 
| 
b015f3918120
Work on FIXME: correct HgDataFile#workingCopy with tests; BasicSessionContext with property override; platform-specific options to internals
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
382diff
changeset | 106 return new PathRewrite.Empty(); // or strip leading slash, perhaps? | 
| 
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: 
382diff
changeset | 107 } | 
| 
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: 
382diff
changeset | 108 } | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 109 | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 110 // XXX perhaps, should keep both fields right here, not in the HgRepository | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 111 public PathRewrite buildDataFilesHelper() { | 
| 412 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 112 // Note, tests in TestStorePath depend on the encoding not being cached | 
| 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 113 Charset cs = getFileEncoding(); | 
| 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 114 // StoragePathHelper needs fine-grained control over char encoding, hence doesn't use EncodingHelper | 
| 411 
464b4404e75d
Issue 29: Bad storage path translation - translate Unicode chars to filesystem encoding
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
409diff
changeset | 115 return new StoragePathHelper((requiresFlags & STORE) != 0, (requiresFlags & FNCACHE) != 0, (requiresFlags & DOTENCODE) != 0, cs); | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 116 } | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 117 | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 118 public PathRewrite buildRepositoryFilesHelper() { | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 119 if ((requiresFlags & STORE) != 0) { | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 120 return new PathRewrite() { | 
| 292 
a415fe296a50
Refactor PathRewrite to accept any char sequence, not only string
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
202diff
changeset | 121 public CharSequence rewrite(CharSequence path) { | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 122 return "store/" + path; | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 123 } | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 124 }; | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 125 } else { | 
| 292 
a415fe296a50
Refactor PathRewrite to accept any char sequence, not only string
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
202diff
changeset | 126 return new PathRewrite.Empty(); | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 127 } | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 128 } | 
| 114 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 129 | 
| 331 
a37ce7145c3f
Access to repository configuration
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 130 public List<Filter.Factory> getFilters(HgRepository hgRepo) { | 
| 114 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 131 if (filterFactories == null) { | 
| 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 132 filterFactories = new ArrayList<Filter.Factory>(); | 
| 331 
a37ce7145c3f
Access to repository configuration
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 133 ExtensionsSection cfg = hgRepo.getConfiguration().getExtensions(); | 
| 
a37ce7145c3f
Access to repository configuration
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 134 if (cfg.isEnabled("eol")) { | 
| 114 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 135 NewlineFilter.Factory ff = new NewlineFilter.Factory(); | 
| 331 
a37ce7145c3f
Access to repository configuration
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 136 ff.initialize(hgRepo); | 
| 114 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 137 filterFactories.add(ff); | 
| 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 138 } | 
| 331 
a37ce7145c3f
Access to repository configuration
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 139 if (cfg.isEnabled("keyword")) { | 
| 114 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 140 KeywordFilter.Factory ff = new KeywordFilter.Factory(); | 
| 331 
a37ce7145c3f
Access to repository configuration
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 141 ff.initialize(hgRepo); | 
| 114 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 142 filterFactories.add(ff); | 
| 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 143 } | 
| 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 144 } | 
| 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 145 return filterFactories; | 
| 
46291ec605a0
Filters to read and initialize according to configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
102diff
changeset | 146 } | 
| 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: 
150diff
changeset | 147 | 
| 
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: 
150diff
changeset | 148 public void initEmptyRepository(File hgDir) throws IOException { | 
| 
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: 
150diff
changeset | 149 hgDir.mkdir(); | 
| 
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: 
150diff
changeset | 150 FileOutputStream requiresFile = new FileOutputStream(new File(hgDir, "requires")); | 
| 
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: 
150diff
changeset | 151 StringBuilder sb = new StringBuilder(40); | 
| 
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: 
150diff
changeset | 152 sb.append("revlogv1\n"); | 
| 
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: 
150diff
changeset | 153 if ((requiresFlags & STORE) != 0) { | 
| 
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: 
150diff
changeset | 154 sb.append("store\n"); | 
| 
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: 
150diff
changeset | 155 } | 
| 
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: 
150diff
changeset | 156 if ((requiresFlags & FNCACHE) != 0) { | 
| 
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: 
150diff
changeset | 157 sb.append("fncache\n"); | 
| 
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: 
150diff
changeset | 158 } | 
| 
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: 
150diff
changeset | 159 if ((requiresFlags & DOTENCODE) != 0) { | 
| 
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: 
150diff
changeset | 160 sb.append("dotencode\n"); | 
| 
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: 
150diff
changeset | 161 } | 
| 
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: 
150diff
changeset | 162 requiresFile.write(sb.toString().getBytes()); | 
| 
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: 
150diff
changeset | 163 requiresFile.close(); | 
| 
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: 
150diff
changeset | 164 new File(hgDir, "store").mkdir(); // with that, hg verify says ok. | 
| 
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: 
150diff
changeset | 165 } | 
| 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: 
382diff
changeset | 166 | 
| 
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: 
382diff
changeset | 167 public boolean isCaseSensitiveFileSystem() { | 
| 
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: 
382diff
changeset | 168 return isCaseSensitiveFileSystem; | 
| 
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: 
382diff
changeset | 169 } | 
| 412 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 170 | 
| 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 171 public EncodingHelper buildFileNameEncodingHelper() { | 
| 415 
ee8264d80747
Explicit constant for regular file flags, access to flags for a given file revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
414diff
changeset | 172 return new EncodingHelper(getFileEncoding(), sessionContext); | 
| 412 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 173 } | 
| 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 174 | 
| 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 175 private Charset getFileEncoding() { | 
| 456 
909306e412e2
Refactor LogFacility and SessionContext, better API for both
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
425diff
changeset | 176 Object altEncoding = sessionContext.getConfigurationProperty(CFG_PROPERTY_FS_FILENAME_ENCODING, null); | 
| 412 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 177 Charset cs; | 
| 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 178 if (altEncoding == null) { | 
| 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 179 cs = Charset.defaultCharset(); | 
| 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 180 } else { | 
| 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 181 try { | 
| 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 182 cs = Charset.forName(altEncoding.toString()); | 
| 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 183 } catch (IllegalArgumentException ex) { | 
| 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 184 // both IllegalCharsetNameException and UnsupportedCharsetException are subclasses of IAE, too | 
| 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 185 // not severe enough to throw an exception, imo. Just record the fact it's bad ad we ignore it | 
| 456 
909306e412e2
Refactor LogFacility and SessionContext, better API for both
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
425diff
changeset | 186 sessionContext.getLog().dump(Internals.class, Error, ex, String.format("Bad configuration value for filename encoding %s", altEncoding)); | 
| 412 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 187 cs = Charset.defaultCharset(); | 
| 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 188 } | 
| 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 189 } | 
| 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 190 return cs; | 
| 
63c5a9d7ca3f
Follow-up for Issue 29: unify path translation for manifest and dirstate
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
411diff
changeset | 191 } | 
| 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: 
150diff
changeset | 192 | 
| 292 
a415fe296a50
Refactor PathRewrite to accept any char sequence, not only string
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
202diff
changeset | 193 public static boolean runningOnWindows() { | 
| 
a415fe296a50
Refactor PathRewrite to accept any char sequence, not only string
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
202diff
changeset | 194 return System.getProperty("os.name").indexOf("Windows") != -1; | 
| 
a415fe296a50
Refactor PathRewrite to accept any char sequence, not only string
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
202diff
changeset | 195 } | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 196 | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 197 /** | 
| 419 
7f136a3fa671
Clean javadoc to fix obvious warnings
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
418diff
changeset | 198 * @param fsHint optional hint pointing to filesystem of interest (generally, it's possible to mount | 
| 413 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 199 * filesystems with different capabilities and repository's capabilities would depend on which fs it resides) | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 200 * @return <code>true</code> if executable files deserve tailored handling | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 201 */ | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 202 public static boolean checkSupportsExecutables(File fsHint) { | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 203 // *.exe are not executables for Mercurial | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 204 return !runningOnWindows(); | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 205 } | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 206 | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 207 /** | 
| 419 
7f136a3fa671
Clean javadoc to fix obvious warnings
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
418diff
changeset | 208 * @param fsHint optional hint pointing to filesystem of interest (generally, it's possible to mount | 
| 413 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 209 * filesystems with different capabilities and repository's capabilities would depend on which fs it resides) | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 210 * @return <code>true</code> if filesystem knows what symbolic links are | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 211 */ | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 212 public static boolean checkSupportsSymlinks(File fsHint) { | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 213 // Windows supports soft symbolic links starting from Vista | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 214 // However, as of Mercurial 2.1.1, no support for this functionality | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 215 // XXX perhaps, makes sense to override with a property a) to speed up when no links are in use b) investigate how this runs windows | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 216 return !runningOnWindows(); | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 217 } | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 218 | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 219 | 
| 
7f27122011c3
Support and respect for symbolic links and executable flag, with /bin/ls backed implementation to discover these
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 220 /** | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 221 * For Unix, returns installation root, which is the parent directory of the hg executable (or symlink) being run. | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 222 * For Windows, it's Mercurial installation directory itself | 
| 382 
82336b7c54f4
Per-repository UpdateConfigCommand completed. Access to system properties through SessionContext to ease alternation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
379diff
changeset | 223 * @param ctx | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 224 */ | 
| 382 
82336b7c54f4
Per-repository UpdateConfigCommand completed. Access to system properties through SessionContext to ease alternation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
379diff
changeset | 225 private static File findHgInstallRoot(SessionContext ctx) { | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 226 // let clients to override Hg install location | 
| 456 
909306e412e2
Refactor LogFacility and SessionContext, better API for both
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
425diff
changeset | 227 String p = (String) ctx.getConfigurationProperty(CFG_PROPERTY_HG_INSTALL_ROOT, null); | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 228 if (p != null) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 229 return new File(p); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 230 } | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 231 StringTokenizer st = new StringTokenizer(System.getenv("PATH"), System.getProperty("path.separator"), false); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 232 final boolean runsOnWin = runningOnWindows(); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 233 while (st.hasMoreTokens()) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 234 String pe = st.nextToken(); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 235 File execCandidate = new File(pe, runsOnWin ? "hg.exe" : "hg"); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 236 if (execCandidate.exists() && execCandidate.isFile()) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 237 File execDir = execCandidate.getParentFile(); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 238 // e.g. on Unix runs "/shared/tools/bin/hg", directory of interest is "/shared/tools/" | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 239 return runsOnWin ? execDir : execDir.getParentFile(); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 240 } | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 241 } | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 242 return null; | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 243 } | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 244 | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 245 /** | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 246 * @see http://www.selenic.com/mercurial/hgrc.5.html | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 247 */ | 
| 331 
a37ce7145c3f
Access to repository configuration
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 248 public ConfigFile readConfiguration(HgRepository hgRepo, File repoRoot) throws IOException { | 
| 
a37ce7145c3f
Access to repository configuration
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 249 ConfigFile configFile = new ConfigFile(); | 
| 382 
82336b7c54f4
Per-repository UpdateConfigCommand completed. Access to system properties through SessionContext to ease alternation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
379diff
changeset | 250 File hgInstallRoot = findHgInstallRoot(HgInternals.getContext(hgRepo)); // may be null | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 251 // | 
| 351 
5abba41751e6
Read extra predefined locations with mercurial configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
331diff
changeset | 252 if (runningOnWindows()) { | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 253 if (hgInstallRoot != null) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 254 for (File f : getWindowsConfigFilesPerInstall(hgInstallRoot)) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 255 configFile.addLocation(f); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 256 } | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 257 } | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 258 LinkedHashSet<String> locations = new LinkedHashSet<String>(); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 259 locations.add(System.getenv("USERPROFILE")); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 260 locations.add(System.getenv("HOME")); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 261 locations.remove(null); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 262 for (String loc : locations) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 263 File location = new File(loc); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 264 configFile.addLocation(new File(location, "Mercurial.ini")); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 265 configFile.addLocation(new File(location, ".hgrc")); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 266 } | 
| 351 
5abba41751e6
Read extra predefined locations with mercurial configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
331diff
changeset | 267 } else { | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 268 if (hgInstallRoot != null) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 269 File d = new File(hgInstallRoot, "etc/mercurial/hgrc.d/"); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 270 if (d.isDirectory() && d.canRead()) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 271 for (File f : listConfigFiles(d)) { | 
| 351 
5abba41751e6
Read extra predefined locations with mercurial configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
331diff
changeset | 272 configFile.addLocation(f); | 
| 
5abba41751e6
Read extra predefined locations with mercurial configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
331diff
changeset | 273 } | 
| 
5abba41751e6
Read extra predefined locations with mercurial configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
331diff
changeset | 274 } | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 275 configFile.addLocation(new File(hgInstallRoot, "etc/mercurial/hgrc")); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 276 } | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 277 // same, but with absolute paths | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 278 File d = new File("/etc/mercurial/hgrc.d/"); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 279 if (d.isDirectory() && d.canRead()) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 280 for (File f : listConfigFiles(d)) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 281 configFile.addLocation(f); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 282 } | 
| 351 
5abba41751e6
Read extra predefined locations with mercurial configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
331diff
changeset | 283 } | 
| 
5abba41751e6
Read extra predefined locations with mercurial configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
331diff
changeset | 284 configFile.addLocation(new File("/etc/mercurial/hgrc")); | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 285 configFile.addLocation(new File(System.getenv("HOME"), ".hgrc")); | 
| 351 
5abba41751e6
Read extra predefined locations with mercurial configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
331diff
changeset | 286 } | 
| 331 
a37ce7145c3f
Access to repository configuration
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 287 // last one, overrides anything else | 
| 
a37ce7145c3f
Access to repository configuration
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 288 // <repo>/.hg/hgrc | 
| 
a37ce7145c3f
Access to repository configuration
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 289 configFile.addLocation(new File(repoRoot, "hgrc")); | 
| 
a37ce7145c3f
Access to repository configuration
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 290 return configFile; | 
| 
a37ce7145c3f
Access to repository configuration
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
295diff
changeset | 291 } | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 292 | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 293 private static List<File> getWindowsConfigFilesPerInstall(File hgInstallDir) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 294 File f = new File(hgInstallDir, "Mercurial.ini"); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 295 if (f.exists()) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 296 return Collections.singletonList(f); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 297 } | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 298 f = new File(hgInstallDir, "hgrc.d/"); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 299 if (f.canRead() && f.isDirectory()) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 300 return listConfigFiles(f); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 301 } | 
| 418 
528b6780a8bd
A bit of FIXME cleanup (mostly degraded to TODO post 1.0), comments and javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
415diff
changeset | 302 // TODO post-1.0 query registry, e.g. with | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 303 // Runtime.exec("reg query HKLM\Software\Mercurial") | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 304 // | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 305 f = new File("C:\\Mercurial\\Mercurial.ini"); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 306 if (f.exists()) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 307 return Collections.singletonList(f); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 308 } | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 309 return Collections.emptyList(); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 310 } | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 311 | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 312 private static List<File> listConfigFiles(File dir) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 313 assert dir.canRead(); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 314 assert dir.isDirectory(); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 315 final File[] allFiles = dir.listFiles(); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 316 // File is Comparable, lexicographically by default | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 317 Arrays.sort(allFiles); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 318 ArrayList<File> rv = new ArrayList<File>(allFiles.length); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 319 for (File f : allFiles) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 320 if (f.getName().endsWith(".rc")) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 321 rv.add(f); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 322 } | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 323 } | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 324 return rv; | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 325 } | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 326 | 
| 382 
82336b7c54f4
Per-repository UpdateConfigCommand completed. Access to system properties through SessionContext to ease alternation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
379diff
changeset | 327 public static File getInstallationConfigurationFileToWrite(SessionContext ctx) { | 
| 
82336b7c54f4
Per-repository UpdateConfigCommand completed. Access to system properties through SessionContext to ease alternation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
379diff
changeset | 328 File hgInstallRoot = findHgInstallRoot(ctx); // may be null | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 329 // choice of which hgrc to pick here is according to my own pure discretion | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 330 if (hgInstallRoot != null) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 331 // use this location only if it's writable | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 332 File cfg = new File(hgInstallRoot, runningOnWindows() ? "Mercurial.ini" : "etc/mercurial/hgrc"); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 333 if (cfg.canWrite() || cfg.getParentFile().canWrite()) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 334 return cfg; | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 335 } | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 336 } | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 337 // fallback | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 338 if (runningOnWindows()) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 339 if (hgInstallRoot == null) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 340 return new File("C:\\Mercurial\\Mercurial.ini"); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 341 } else { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 342 // yes, we tried this file already (above) and found it non-writable | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 343 // let caller fail with can't write | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 344 return new File(hgInstallRoot, "Mercurial.ini"); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 345 } | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 346 } else { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 347 return new File("/etc/mercurial/hgrc"); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 348 } | 
| 378 
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
351diff
changeset | 349 } | 
| 
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
351diff
changeset | 350 | 
| 382 
82336b7c54f4
Per-repository UpdateConfigCommand completed. Access to system properties through SessionContext to ease alternation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
379diff
changeset | 351 public static File getUserConfigurationFileToWrite(SessionContext ctx) { | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 352 LinkedHashSet<String> locations = new LinkedHashSet<String>(); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 353 final boolean runsOnWindows = runningOnWindows(); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 354 if (runsOnWindows) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 355 locations.add(System.getenv("USERPROFILE")); | 
| 378 
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
351diff
changeset | 356 } | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 357 locations.add(System.getenv("HOME")); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 358 locations.remove(null); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 359 for (String loc : locations) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 360 File location = new File(loc); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 361 File rv = new File(location, ".hgrc"); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 362 if (rv.exists() && rv.canWrite()) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 363 return rv; | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 364 } | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 365 if (runsOnWindows) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 366 rv = new File(location, "Mercurial.ini"); | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 367 if (rv.exists() && rv.canWrite()) { | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 368 return rv; | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 369 } | 
| 378 
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
351diff
changeset | 370 } | 
| 
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
351diff
changeset | 371 } | 
| 379 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 372 // fallback to default, let calling code fail with Exception if can't write | 
| 
fa2be7a05af6
Implement discovery of mercurial installation, use it to read/write configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
378diff
changeset | 373 return new File(System.getProperty("user.home"), ".hgrc"); | 
| 378 
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
351diff
changeset | 374 } | 
| 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: 
382diff
changeset | 375 | 
| 
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: 
382diff
changeset | 376 public boolean 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: 
382diff
changeset | 377 return shallCacheRevlogsInRepo; | 
| 
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: 
382diff
changeset | 378 } | 
| 407 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 379 | 
| 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 380 public static <T> CharSequence join(Iterable<T> col, CharSequence separator) { | 
| 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 381 if (col == null) { | 
| 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 382 return String.valueOf(col); | 
| 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 383 } | 
| 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 384 Iterator<T> it = col.iterator(); | 
| 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 385 if (!it.hasNext()) { | 
| 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 386 return "[]"; | 
| 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 387 } | 
| 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 388 String v = String.valueOf(it.next()); | 
| 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 389 StringBuilder sb = new StringBuilder(v); | 
| 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 390 while (it.hasNext()) { | 
| 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 391 sb.append(separator); | 
| 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 392 v = String.valueOf(it.next()); | 
| 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 393 sb.append(v); | 
| 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 394 } | 
| 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 395 return sb; | 
| 
30922c728341
Better multiline log printout; options to tune default log output
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
388diff
changeset | 396 } | 
| 420 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
419diff
changeset | 397 | 
| 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
419diff
changeset | 398 /** | 
| 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
419diff
changeset | 399 * keep an eye on all long to int downcasts to get a chance notice the lost of data | 
| 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
419diff
changeset | 400 * Use if there's even subtle chance there might be loss | 
| 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
419diff
changeset | 401 * (ok not to use if there's no way for l to be greater than int) | 
| 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
419diff
changeset | 402 */ | 
| 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
419diff
changeset | 403 public static int ltoi(long l) { | 
| 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
419diff
changeset | 404 int i = (int) l; | 
| 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
419diff
changeset | 405 assert ((long) i) == l : "Loss of data!"; | 
| 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
419diff
changeset | 406 return i; | 
| 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
419diff
changeset | 407 } | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 408 } | 
