Mercurial > public > mercurial-scm > hg
annotate mercurial/scmutil.py @ 14067:e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
The ui.portablefilenames config handling is generally useful for notifying the
user of various portability problems.
author | Kevin Gessner <kevin@kevingessner.com> |
---|---|
date | Sat, 30 Apr 2011 11:08:24 +0200 |
parents | 9c374cf76b7d |
children | 04ce8fa1015d |
rev | line source |
---|---|
13962
8b252e826c68
add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
1 # scmutil.py - Mercurial core utility functions |
8b252e826c68
add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
2 # |
8b252e826c68
add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
3 # Copyright Matt Mackall <mpm@selenic.com> |
8b252e826c68
add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
4 # |
8b252e826c68
add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
8b252e826c68
add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
6 # GNU General Public License version 2 or any later version. |
8b252e826c68
add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
7 |
8b252e826c68
add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
8 from i18n import _ |
13984
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
9 import util, error, osutil |
13986
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
10 import os, errno, stat, sys |
13962
8b252e826c68
add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
11 |
13974
23f2736abce3
move checkfilename from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13973
diff
changeset
|
12 def checkfilename(f): |
23f2736abce3
move checkfilename from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13973
diff
changeset
|
13 '''Check that the filename f is an acceptable filename for a tracked file''' |
23f2736abce3
move checkfilename from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13973
diff
changeset
|
14 if '\r' in f or '\n' in f: |
23f2736abce3
move checkfilename from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13973
diff
changeset
|
15 raise util.Abort(_("'\\n' and '\\r' disallowed in filenames: %r") % f) |
23f2736abce3
move checkfilename from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13973
diff
changeset
|
16 |
13962
8b252e826c68
add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
17 def checkportable(ui, f): |
8b252e826c68
add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
18 '''Check if filename f is portable and warn or abort depending on config''' |
13974
23f2736abce3
move checkfilename from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13973
diff
changeset
|
19 checkfilename(f) |
14067
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
20 if showportabilityalert(ui): |
13962
8b252e826c68
add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
21 msg = util.checkwinfilename(f) |
8b252e826c68
add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
22 if msg: |
14067
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
23 portabilityalert(ui, "%s: %r" % (msg, f)) |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
24 |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
25 def checkportabilityalert(ui): |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
26 '''check if the user's config requests nothing, a warning, or abort for |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
27 non-portable filenames''' |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
28 val = ui.config('ui', 'portablefilenames', 'warn') |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
29 lval = val.lower() |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
30 bval = util.parsebool(val) |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
31 abort = os.name == 'nt' or lval == 'abort' |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
32 warn = bval or lval == 'warn' |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
33 if bval is None and not (warn or abort or lval == 'ignore'): |
13962
8b252e826c68
add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
34 raise error.ConfigError( |
8b252e826c68
add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
35 _("ui.portablefilenames value is invalid ('%s')") % val) |
14067
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
36 return abort, warn |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
37 |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
38 def showportabilityalert(ui): |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
39 '''check if the user wants any notification of portability problems''' |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
40 abort, warn = checkportabilityalert(ui) |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
41 return abort or warn |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
42 |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
43 def portabilityalert(ui, msg): |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
44 if not msg: |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
45 return |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
46 abort, warn = checkportabilityalert(ui) |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
47 if abort: |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
48 raise util.Abort("%s" % msg) |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
49 elif warn: |
e88a4958a6b7
scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents:
13986
diff
changeset
|
50 ui.warn(_("warning: %s\n") % msg) |
13970
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
51 |
13972
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
52 class path_auditor(object): |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
53 '''ensure that a filesystem path contains no banned components. |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
54 the following properties of a path are checked: |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
55 |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
56 - ends with a directory separator |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
57 - under top-level .hg |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
58 - starts at the root of a windows drive |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
59 - contains ".." |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
60 - traverses a symlink (e.g. a/symlink_here/b) |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
61 - inside a nested repository (a callback can be used to approve |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
62 some nested repositories, e.g., subrepositories) |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
63 ''' |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
64 |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
65 def __init__(self, root, callback=None): |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
66 self.audited = set() |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
67 self.auditeddir = set() |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
68 self.root = root |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
69 self.callback = callback |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
70 |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
71 def __call__(self, path): |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
72 '''Check the relative path. |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
73 path may contain a pattern (e.g. foodir/**.txt)''' |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
74 |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
75 if path in self.audited: |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
76 return |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
77 # AIX ignores "/" at end of path, others raise EISDIR. |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
78 if util.endswithsep(path): |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
79 raise util.Abort(_("path ends in directory separator: %s") % path) |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
80 normpath = os.path.normcase(path) |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
81 parts = util.splitpath(normpath) |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
82 if (os.path.splitdrive(path)[0] |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
83 or parts[0].lower() in ('.hg', '.hg.', '') |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
84 or os.pardir in parts): |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
85 raise util.Abort(_("path contains illegal component: %s") % path) |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
86 if '.hg' in path.lower(): |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
87 lparts = [p.lower() for p in parts] |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
88 for p in '.hg', '.hg.': |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
89 if p in lparts[1:]: |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
90 pos = lparts.index(p) |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
91 base = os.path.join(*parts[:pos]) |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
92 raise util.Abort(_('path %r is inside nested repo %r') |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
93 % (path, base)) |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
94 |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
95 parts.pop() |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
96 prefixes = [] |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
97 while parts: |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
98 prefix = os.sep.join(parts) |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
99 if prefix in self.auditeddir: |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
100 break |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
101 curpath = os.path.join(self.root, prefix) |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
102 try: |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
103 st = os.lstat(curpath) |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
104 except OSError, err: |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
105 # EINVAL can be raised as invalid path syntax under win32. |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
106 # They must be ignored for patterns can be checked too. |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
107 if err.errno not in (errno.ENOENT, errno.ENOTDIR, errno.EINVAL): |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
108 raise |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
109 else: |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
110 if stat.S_ISLNK(st.st_mode): |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
111 raise util.Abort( |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
112 _('path %r traverses symbolic link %r') |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
113 % (path, prefix)) |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
114 elif (stat.S_ISDIR(st.st_mode) and |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
115 os.path.isdir(os.path.join(curpath, '.hg'))): |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
116 if not self.callback or not self.callback(curpath): |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
117 raise util.Abort(_('path %r is inside nested repo %r') % |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
118 (path, prefix)) |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
119 prefixes.append(prefix) |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
120 parts.pop() |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
121 |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
122 self.audited.add(path) |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
123 # only add prefixes to the cache after checking everything: we don't |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
124 # want to add "foo/bar/baz" before checking if there's a "foo/.hg" |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
125 self.auditeddir.update(prefixes) |
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
126 |
13970
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
127 class opener(object): |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
128 '''Open files relative to a base directory |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
129 |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
130 This class is used to hide the details of COW semantics and |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
131 remote file access from higher level code. |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
132 ''' |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
133 def __init__(self, base, audit=True): |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
134 self.base = base |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
135 if audit: |
13972
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
136 self.auditor = path_auditor(base) |
13970
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
137 else: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
138 self.auditor = util.always |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
139 self.createmode = None |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
140 self._trustnlink = None |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
141 |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
142 @util.propertycache |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
143 def _can_symlink(self): |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
144 return util.checklink(self.base) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
145 |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
146 def _fixfilemode(self, name): |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
147 if self.createmode is None: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
148 return |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
149 os.chmod(name, self.createmode & 0666) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
150 |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
151 def __call__(self, path, mode="r", text=False, atomictemp=False): |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
152 r = util.checkosfilename(path) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
153 if r: |
13973
366fa83f9820
scmutil: fix erroneous Abort call
Adrian Buehlmann <adrian@cadifra.com>
parents:
13972
diff
changeset
|
154 raise util.Abort("%s: %r" % (r, path)) |
13970
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
155 self.auditor(path) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
156 f = os.path.join(self.base, path) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
157 |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
158 if not text and "b" not in mode: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
159 mode += "b" # for that other OS |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
160 |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
161 nlink = -1 |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
162 dirname, basename = os.path.split(f) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
163 # If basename is empty, then the path is malformed because it points |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
164 # to a directory. Let the posixfile() call below raise IOError. |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
165 if basename and mode not in ('r', 'rb'): |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
166 if atomictemp: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
167 if not os.path.isdir(dirname): |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
168 util.makedirs(dirname, self.createmode) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
169 return util.atomictempfile(f, mode, self.createmode) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
170 try: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
171 if 'w' in mode: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
172 util.unlink(f) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
173 nlink = 0 |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
174 else: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
175 # nlinks() may behave differently for files on Windows |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
176 # shares if the file is open. |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
177 fd = util.posixfile(f) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
178 nlink = util.nlinks(f) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
179 if nlink < 1: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
180 nlink = 2 # force mktempcopy (issue1922) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
181 fd.close() |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
182 except (OSError, IOError), e: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
183 if e.errno != errno.ENOENT: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
184 raise |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
185 nlink = 0 |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
186 if not os.path.isdir(dirname): |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
187 util.makedirs(dirname, self.createmode) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
188 if nlink > 0: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
189 if self._trustnlink is None: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
190 self._trustnlink = nlink > 1 or util.checknlink(f) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
191 if nlink > 1 or not self._trustnlink: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
192 util.rename(util.mktempcopy(f), f) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
193 fp = util.posixfile(f, mode) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
194 if nlink == 0: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
195 self._fixfilemode(f) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
196 return fp |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
197 |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
198 def symlink(self, src, dst): |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
199 self.auditor(dst) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
200 linkname = os.path.join(self.base, dst) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
201 try: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
202 os.unlink(linkname) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
203 except OSError: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
204 pass |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
205 |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
206 dirname = os.path.dirname(linkname) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
207 if not os.path.exists(dirname): |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
208 util.makedirs(dirname, self.createmode) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
209 |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
210 if self._can_symlink: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
211 try: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
212 os.symlink(src, linkname) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
213 except OSError, err: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
214 raise OSError(err.errno, _('could not symlink to %r: %s') % |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
215 (src, err.strerror), linkname) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
216 else: |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
217 f = self(dst, "w") |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
218 f.write(src) |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
219 f.close() |
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13962
diff
changeset
|
220 self._fixfilemode(dst) |
13971
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
221 |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
222 def canonpath(root, cwd, myname, auditor=None): |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
223 '''return the canonical path of myname, given cwd and root''' |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
224 if util.endswithsep(root): |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
225 rootsep = root |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
226 else: |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
227 rootsep = root + os.sep |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
228 name = myname |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
229 if not os.path.isabs(name): |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
230 name = os.path.join(root, cwd, name) |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
231 name = os.path.normpath(name) |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
232 if auditor is None: |
13972
d1f4e7fd970a
move path_auditor from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13971
diff
changeset
|
233 auditor = path_auditor(root) |
13971
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
234 if name != rootsep and name.startswith(rootsep): |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
235 name = name[len(rootsep):] |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
236 auditor(name) |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
237 return util.pconvert(name) |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
238 elif name == root: |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
239 return '' |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
240 else: |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
241 # Determine whether `name' is in the hierarchy at or beneath `root', |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
242 # by iterating name=dirname(name) until that causes no change (can't |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
243 # check name == '/', because that doesn't work on windows). For each |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
244 # `name', compare dev/inode numbers. If they match, the list `rel' |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
245 # holds the reversed list of components making up the relative file |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
246 # name we want. |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
247 root_st = os.stat(root) |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
248 rel = [] |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
249 while True: |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
250 try: |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
251 name_st = os.stat(name) |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
252 except OSError: |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
253 break |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
254 if util.samestat(name_st, root_st): |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
255 if not rel: |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
256 # name was actually the same as root (maybe a symlink) |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
257 return '' |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
258 rel.reverse() |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
259 name = os.path.join(*rel) |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
260 auditor(name) |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
261 return util.pconvert(name) |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
262 dirname, basename = os.path.split(name) |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
263 rel.append(basename) |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
264 if dirname == name: |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
265 break |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
266 name = dirname |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
267 |
bfeaa88b875d
move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13970
diff
changeset
|
268 raise util.Abort('%s not under root' % myname) |
13975
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
269 |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
270 def walkrepos(path, followsym=False, seen_dirs=None, recurse=False): |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
271 '''yield every hg repository under path, recursively.''' |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
272 def errhandler(err): |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
273 if err.filename == path: |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
274 raise err |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
275 if followsym and hasattr(os.path, 'samestat'): |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
276 def _add_dir_if_not_there(dirlst, dirname): |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
277 match = False |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
278 samestat = os.path.samestat |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
279 dirstat = os.stat(dirname) |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
280 for lstdirstat in dirlst: |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
281 if samestat(dirstat, lstdirstat): |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
282 match = True |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
283 break |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
284 if not match: |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
285 dirlst.append(dirstat) |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
286 return not match |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
287 else: |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
288 followsym = False |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
289 |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
290 if (seen_dirs is None) and followsym: |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
291 seen_dirs = [] |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
292 _add_dir_if_not_there(seen_dirs, path) |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
293 for root, dirs, files in os.walk(path, topdown=True, onerror=errhandler): |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
294 dirs.sort() |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
295 if '.hg' in dirs: |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
296 yield root # found a repository |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
297 qroot = os.path.join(root, '.hg', 'patches') |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
298 if os.path.isdir(os.path.join(qroot, '.hg')): |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
299 yield qroot # we have a patch queue repo here |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
300 if recurse: |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
301 # avoid recursing inside the .hg directory |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
302 dirs.remove('.hg') |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
303 else: |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
304 dirs[:] = [] # don't descend further |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
305 elif followsym: |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
306 newdirs = [] |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
307 for d in dirs: |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
308 fname = os.path.join(root, d) |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
309 if _add_dir_if_not_there(seen_dirs, fname): |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
310 if os.path.islink(fname): |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
311 for hgname in walkrepos(fname, True, seen_dirs): |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
312 yield hgname |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
313 else: |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
314 newdirs.append(d) |
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13974
diff
changeset
|
315 dirs[:] = newdirs |
13984
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
316 |
13985
26335a817dd0
move os_rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13984
diff
changeset
|
317 def os_rcpath(): |
26335a817dd0
move os_rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13984
diff
changeset
|
318 '''return default os-specific hgrc search path''' |
13986
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
319 path = system_rcpath() |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
320 path.extend(user_rcpath()) |
13985
26335a817dd0
move os_rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13984
diff
changeset
|
321 path = [os.path.normpath(f) for f in path] |
26335a817dd0
move os_rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13984
diff
changeset
|
322 return path |
26335a817dd0
move os_rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13984
diff
changeset
|
323 |
13984
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
324 _rcpath = None |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
325 |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
326 def rcpath(): |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
327 '''return hgrc search path. if env var HGRCPATH is set, use it. |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
328 for each item in path, if directory, use files ending in .rc, |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
329 else use item. |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
330 make HGRCPATH empty to only look in .hg/hgrc of current repo. |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
331 if no HGRCPATH, use default os-specific path.''' |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
332 global _rcpath |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
333 if _rcpath is None: |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
334 if 'HGRCPATH' in os.environ: |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
335 _rcpath = [] |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
336 for p in os.environ['HGRCPATH'].split(os.pathsep): |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
337 if not p: |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
338 continue |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
339 p = util.expandpath(p) |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
340 if os.path.isdir(p): |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
341 for f, kind in osutil.listdir(p): |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
342 if f.endswith('.rc'): |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
343 _rcpath.append(os.path.join(p, f)) |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
344 else: |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
345 _rcpath.append(p) |
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
346 else: |
13985
26335a817dd0
move os_rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13984
diff
changeset
|
347 _rcpath = os_rcpath() |
13984
af60153b5e3b
move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13975
diff
changeset
|
348 return _rcpath |
13986
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
349 |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
350 if os.name != 'nt': |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
351 |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
352 def rcfiles(path): |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
353 rcs = [os.path.join(path, 'hgrc')] |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
354 rcdir = os.path.join(path, 'hgrc.d') |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
355 try: |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
356 rcs.extend([os.path.join(rcdir, f) |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
357 for f, kind in osutil.listdir(rcdir) |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
358 if f.endswith(".rc")]) |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
359 except OSError: |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
360 pass |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
361 return rcs |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
362 |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
363 def system_rcpath(): |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
364 path = [] |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
365 # old mod_python does not set sys.argv |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
366 if len(getattr(sys, 'argv', [])) > 0: |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
367 path.extend(rcfiles(os.path.dirname(sys.argv[0]) + |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
368 '/../etc/mercurial')) |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
369 path.extend(rcfiles('/etc/mercurial')) |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
370 return path |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
371 |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
372 def user_rcpath(): |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
373 return [os.path.expanduser('~/.hgrc')] |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
374 |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
375 else: |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
376 |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
377 _HKEY_LOCAL_MACHINE = 0x80000002L |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
378 |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
379 def system_rcpath(): |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
380 '''return default os-specific hgrc search path''' |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
381 rcpath = [] |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
382 filename = util.executable_path() |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
383 # Use mercurial.ini found in directory with hg.exe |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
384 progrc = os.path.join(os.path.dirname(filename), 'mercurial.ini') |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
385 if os.path.isfile(progrc): |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
386 rcpath.append(progrc) |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
387 return rcpath |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
388 # Use hgrc.d found in directory with hg.exe |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
389 progrcd = os.path.join(os.path.dirname(filename), 'hgrc.d') |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
390 if os.path.isdir(progrcd): |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
391 for f, kind in osutil.listdir(progrcd): |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
392 if f.endswith('.rc'): |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
393 rcpath.append(os.path.join(progrcd, f)) |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
394 return rcpath |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
395 # else look for a system rcpath in the registry |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
396 value = util.lookup_reg('SOFTWARE\\Mercurial', None, |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
397 _HKEY_LOCAL_MACHINE) |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
398 if not isinstance(value, str) or not value: |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
399 return rcpath |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
400 value = value.replace('/', os.sep) |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
401 for p in value.split(os.pathsep): |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
402 if p.lower().endswith('mercurial.ini'): |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
403 rcpath.append(p) |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
404 elif os.path.isdir(p): |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
405 for f, kind in osutil.listdir(p): |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
406 if f.endswith('.rc'): |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
407 rcpath.append(os.path.join(p, f)) |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
408 return rcpath |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
409 |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
410 def user_rcpath(): |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
411 '''return os-specific hgrc search path to the user dir''' |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
412 home = os.path.expanduser('~') |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
413 path = [os.path.join(home, 'mercurial.ini'), |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
414 os.path.join(home, '.hgrc')] |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
415 userprofile = os.environ.get('USERPROFILE') |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
416 if userprofile: |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
417 path.append(os.path.join(userprofile, 'mercurial.ini')) |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
418 path.append(os.path.join(userprofile, '.hgrc')) |
9c374cf76b7d
move system_rcpath and user_rcpath to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13985
diff
changeset
|
419 return path |