annotate mercurial/localrepo.py @ 1460:40d08cf1c544

Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
author Eric Hopper <hopper@omnifarious.org>
date Fri, 07 Oct 2005 19:49:25 -0700 (2005-10-08)
parents 1033892bbb87
children 02099220ad49
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1089
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents: 1072
diff changeset
1 # localrepo.py - read/write repository class for mercurial
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
2 #
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
3 # Copyright 2005 Matt Mackall <mpm@selenic.com>
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
4 #
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
5 # This software may be used and distributed according to the terms
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
6 # of the GNU General Public License, incorporated herein by reference.
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
7
1097
1f89ccbab6ce localrepo: adjust some imports, remove sys dependency
mpm@selenic.com
parents: 1089
diff changeset
8 import struct, os, util
1100
d6b6a15cc7c6 localrepo: more import/namespace tidying
mpm@selenic.com
parents: 1097
diff changeset
9 import filelog, manifest, changelog, dirstate, repo
d6b6a15cc7c6 localrepo: more import/namespace tidying
mpm@selenic.com
parents: 1097
diff changeset
10 from node import *
262
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 256
diff changeset
11 from demandload import *
1353
a0c68981a5f4 Fix misleading abort message when permissions are bad.
Eric Hopper <hopper@omnifarious.org>
parents: 1349
diff changeset
12 demandload(globals(), "re lock transaction tempfile stat mdiff errno")
499
81c563a254be Add exception class for repository errors
mpm@selenic.com
parents: 495
diff changeset
13
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
14 class localrepository:
1102
c81d264cd17d localrepo: minor opener usage restructuring
mpm@selenic.com
parents: 1101
diff changeset
15 def __init__(self, ui, path=None, create=0):
1101
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents: 1100
diff changeset
16 if not path:
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents: 1100
diff changeset
17 p = os.getcwd()
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents: 1100
diff changeset
18 while not os.path.isdir(os.path.join(p, ".hg")):
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents: 1100
diff changeset
19 oldp = p
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents: 1100
diff changeset
20 p = os.path.dirname(p)
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents: 1100
diff changeset
21 if p == oldp: raise repo.RepoError("no repo found")
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents: 1100
diff changeset
22 path = p
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents: 1100
diff changeset
23 self.path = os.path.join(path, ".hg")
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
24
1101
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents: 1100
diff changeset
25 if not create and not os.path.isdir(self.path):
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents: 1100
diff changeset
26 raise repo.RepoError("repository %s not found" % self.path)
405
99470ae6b424 Check if repository exists
mpm@selenic.com
parents: 402
diff changeset
27
933
9c43d68ad59f Fixed --repository option when handling relative path
tksoh@users.sf.net
parents: 926
diff changeset
28 self.root = os.path.abspath(path)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
29 self.ui = ui
1102
c81d264cd17d localrepo: minor opener usage restructuring
mpm@selenic.com
parents: 1101
diff changeset
30 self.opener = util.opener(self.path)
c81d264cd17d localrepo: minor opener usage restructuring
mpm@selenic.com
parents: 1101
diff changeset
31 self.wopener = util.opener(self.root)
1100
d6b6a15cc7c6 localrepo: more import/namespace tidying
mpm@selenic.com
parents: 1097
diff changeset
32 self.manifest = manifest.manifest(self.opener)
d6b6a15cc7c6 localrepo: more import/namespace tidying
mpm@selenic.com
parents: 1097
diff changeset
33 self.changelog = changelog.changelog(self.opener)
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
34 self.tagscache = None
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
35 self.nodetagscache = None
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
36 self.encodepats = None
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
37 self.decodepats = None
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
38
1133
899b619a7eb2 Create [web] section with short username as contact on hg init and hg clone.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1117
diff changeset
39 if create:
899b619a7eb2 Create [web] section with short username as contact on hg init and hg clone.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1117
diff changeset
40 os.mkdir(self.path)
899b619a7eb2 Create [web] section with short username as contact on hg init and hg clone.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1117
diff changeset
41 os.mkdir(self.join("data"))
899b619a7eb2 Create [web] section with short username as contact on hg init and hg clone.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1117
diff changeset
42
1101
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents: 1100
diff changeset
43 self.dirstate = dirstate.dirstate(self.opener, ui, self.root)
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents: 1100
diff changeset
44 try:
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents: 1100
diff changeset
45 self.ui.readconfig(self.opener("hgrc"))
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents: 1100
diff changeset
46 except IOError: pass
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
47
487
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
48 def hook(self, name, **args):
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
49 s = self.ui.config("hooks", name)
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
50 if s:
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
51 self.ui.note("running hook %s: %s\n" % (name, s))
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
52 old = {}
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
53 for k, v in args.items():
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
54 k = k.upper()
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
55 old[k] = os.environ.get(k, None)
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
56 os.environ[k] = v
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
57
1346
88a9c75dc76a Execute hooks in the repository root
mpm@selenic.com
parents: 1316
diff changeset
58 # Hooks run in the repository root
88a9c75dc76a Execute hooks in the repository root
mpm@selenic.com
parents: 1316
diff changeset
59 olddir = os.getcwd()
88a9c75dc76a Execute hooks in the repository root
mpm@selenic.com
parents: 1316
diff changeset
60 os.chdir(self.root)
487
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
61 r = os.system(s)
1346
88a9c75dc76a Execute hooks in the repository root
mpm@selenic.com
parents: 1316
diff changeset
62 os.chdir(olddir)
487
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
63
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
64 for k, v in old.items():
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
65 if v != None:
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
66 os.environ[k] = v
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
67 else:
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
68 del os.environ[k]
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
69
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
70 if r:
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
71 self.ui.warn("abort: %s hook failed with status %d!\n" %
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
72 (name, r))
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
73 return False
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
74 return True
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
75
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
76 def tags(self):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
77 '''return a mapping of tag to node'''
477
520540fd6b64 Handle errors in .hgtags or hgrc [tags] section more gracefully.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 471
diff changeset
78 if not self.tagscache:
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
79 self.tagscache = {}
609
2acf1f5df2e6 [PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents: 608
diff changeset
80 def addtag(self, k, n):
2acf1f5df2e6 [PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents: 608
diff changeset
81 try:
2acf1f5df2e6 [PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents: 608
diff changeset
82 bin_n = bin(n)
2acf1f5df2e6 [PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents: 608
diff changeset
83 except TypeError:
2acf1f5df2e6 [PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents: 608
diff changeset
84 bin_n = ''
2acf1f5df2e6 [PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents: 608
diff changeset
85 self.tagscache[k.strip()] = bin_n
659
3662e3d6b690 Whitespace cleanup
Matt Mackall <mpm@selenic.com>
parents: 658
diff changeset
86
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
87 try:
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
88 # read each head of the tags file, ending with the tip
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
89 # and add each tag found to the map, with "newer" ones
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
90 # taking precedence
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
91 fl = self.file(".hgtags")
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
92 h = fl.heads()
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
93 h.reverse()
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
94 for r in h:
994
88c15682d9b0 Fix callers to file.revision to use file.read
mpm@selenic.com
parents: 993
diff changeset
95 for l in fl.read(r).splitlines():
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
96 if l:
385
e9e1efd5291c Fixed problems with extra spaces around tags in .hgtags
Thomas Arendsen Hein <thomas@intevation.de>
parents: 383
diff changeset
97 n, k = l.split(" ", 1)
609
2acf1f5df2e6 [PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents: 608
diff changeset
98 addtag(self, k, n)
477
520540fd6b64 Handle errors in .hgtags or hgrc [tags] section more gracefully.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 471
diff changeset
99 except KeyError:
520540fd6b64 Handle errors in .hgtags or hgrc [tags] section more gracefully.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 471
diff changeset
100 pass
659
3662e3d6b690 Whitespace cleanup
Matt Mackall <mpm@selenic.com>
parents: 658
diff changeset
101
609
2acf1f5df2e6 [PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents: 608
diff changeset
102 try:
2acf1f5df2e6 [PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents: 608
diff changeset
103 f = self.opener("localtags")
2acf1f5df2e6 [PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents: 608
diff changeset
104 for l in f:
2acf1f5df2e6 [PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents: 608
diff changeset
105 n, k = l.split(" ", 1)
2acf1f5df2e6 [PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents: 608
diff changeset
106 addtag(self, k, n)
2acf1f5df2e6 [PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents: 608
diff changeset
107 except IOError:
2acf1f5df2e6 [PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents: 608
diff changeset
108 pass
659
3662e3d6b690 Whitespace cleanup
Matt Mackall <mpm@selenic.com>
parents: 658
diff changeset
109
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
110 self.tagscache['tip'] = self.changelog.tip()
659
3662e3d6b690 Whitespace cleanup
Matt Mackall <mpm@selenic.com>
parents: 658
diff changeset
111
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
112 return self.tagscache
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
113
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
114 def tagslist(self):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
115 '''return a list of tags ordered by revision'''
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
116 l = []
477
520540fd6b64 Handle errors in .hgtags or hgrc [tags] section more gracefully.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 471
diff changeset
117 for t, n in self.tags().items():
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
118 try:
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
119 r = self.changelog.rev(n)
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
120 except:
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
121 r = -2 # sort to the beginning of the list if unknown
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
122 l.append((r,t,n))
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
123 l.sort()
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
124 return [(t,n) for r,t,n in l]
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
125
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
126 def nodetags(self, node):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
127 '''return the tags associated with a node'''
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
128 if not self.nodetagscache:
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
129 self.nodetagscache = {}
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
130 for t,n in self.tags().items():
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
131 self.nodetagscache.setdefault(n,[]).append(t)
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
132 return self.nodetagscache.get(node, [])
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
133
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
134 def lookup(self, key):
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
135 try:
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
136 return self.tags()[key]
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
137 except KeyError:
658
f8098ae9f5b6 Generate a friendlier except for failed lookups
Matt Mackall <mpm@selenic.com>
parents: 657
diff changeset
138 try:
f8098ae9f5b6 Generate a friendlier except for failed lookups
Matt Mackall <mpm@selenic.com>
parents: 657
diff changeset
139 return self.changelog.lookup(key)
f8098ae9f5b6 Generate a friendlier except for failed lookups
Matt Mackall <mpm@selenic.com>
parents: 657
diff changeset
140 except:
1100
d6b6a15cc7c6 localrepo: more import/namespace tidying
mpm@selenic.com
parents: 1097
diff changeset
141 raise repo.RepoError("unknown revision '%s'" % key)
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
142
634
da5378d39269 Add a repo method to report repo device
Matt Mackall <mpm@selenic.com>
parents: 627
diff changeset
143 def dev(self):
da5378d39269 Add a repo method to report repo device
Matt Mackall <mpm@selenic.com>
parents: 627
diff changeset
144 return os.stat(self.path).st_dev
da5378d39269 Add a repo method to report repo device
Matt Mackall <mpm@selenic.com>
parents: 627
diff changeset
145
926
b765e970c9ff Add a local() method to repository classes
mpm@selenic.com
parents: 923
diff changeset
146 def local(self):
1101
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents: 1100
diff changeset
147 return True
926
b765e970c9ff Add a local() method to repository classes
mpm@selenic.com
parents: 923
diff changeset
148
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
149 def join(self, f):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
150 return os.path.join(self.path, f)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
151
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
152 def wjoin(self, f):
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
153 return os.path.join(self.root, f)
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
154
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
155 def file(self, f):
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
156 if f[0] == '/': f = f[1:]
1100
d6b6a15cc7c6 localrepo: more import/namespace tidying
mpm@selenic.com
parents: 1097
diff changeset
157 return filelog.filelog(self.opener, f)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
158
627
b6c42714d900 Add locate command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 624
diff changeset
159 def getcwd(self):
870
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
160 return self.dirstate.getcwd()
627
b6c42714d900 Add locate command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 624
diff changeset
161
291
2c4f2be05587 Add wopener for opening files in the working directory
mpm@selenic.com
parents: 288
diff changeset
162 def wfile(self, f, mode='r'):
2c4f2be05587 Add wopener for opening files in the working directory
mpm@selenic.com
parents: 288
diff changeset
163 return self.wopener(f, mode)
2c4f2be05587 Add wopener for opening files in the working directory
mpm@selenic.com
parents: 288
diff changeset
164
1019
a9cca981c423 Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents: 1013
diff changeset
165 def wread(self, filename):
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
166 if self.encodepats == None:
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
167 l = []
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
168 for pat, cmd in self.ui.configitems("encode"):
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
169 mf = util.matcher("", "/", [pat], [], [])[1]
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
170 l.append((mf, cmd))
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
171 self.encodepats = l
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
172
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
173 data = self.wopener(filename, 'r').read()
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
174
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
175 for mf, cmd in self.encodepats:
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
176 if mf(filename):
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
177 self.ui.debug("filtering %s through %s\n" % (filename, cmd))
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
178 data = util.filter(data, cmd)
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
179 break
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
180
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
181 return data
1019
a9cca981c423 Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents: 1013
diff changeset
182
a9cca981c423 Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents: 1013
diff changeset
183 def wwrite(self, filename, data, fd=None):
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
184 if self.decodepats == None:
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
185 l = []
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
186 for pat, cmd in self.ui.configitems("decode"):
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
187 mf = util.matcher("", "/", [pat], [], [])[1]
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
188 l.append((mf, cmd))
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
189 self.decodepats = l
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
190
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
191 for mf, cmd in self.decodepats:
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
192 if mf(filename):
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
193 self.ui.debug("filtering %s through %s\n" % (filename, cmd))
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
194 data = util.filter(data, cmd)
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
195 break
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
196
1019
a9cca981c423 Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents: 1013
diff changeset
197 if fd:
a9cca981c423 Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents: 1013
diff changeset
198 return fd.write(data)
a9cca981c423 Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents: 1013
diff changeset
199 return self.wopener(filename, 'w').write(data)
a9cca981c423 Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents: 1013
diff changeset
200
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
201 def transaction(self):
251
3fd8fc14b12f backup dirstate for undo
mpm@selenic.com
parents: 249
diff changeset
202 # save dirstate for undo
263
e8eb427c6d71 Fix empty repository transaction bug
mpm@selenic.com
parents: 262
diff changeset
203 try:
e8eb427c6d71 Fix empty repository transaction bug
mpm@selenic.com
parents: 262
diff changeset
204 ds = self.opener("dirstate").read()
e8eb427c6d71 Fix empty repository transaction bug
mpm@selenic.com
parents: 262
diff changeset
205 except IOError:
e8eb427c6d71 Fix empty repository transaction bug
mpm@selenic.com
parents: 262
diff changeset
206 ds = ""
785
46a8dd3145cc Fix undo after aborted commit bug
mpm@selenic.com
parents: 781
diff changeset
207 self.opener("journal.dirstate", "w").write(ds)
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 514
diff changeset
208
785
46a8dd3145cc Fix undo after aborted commit bug
mpm@selenic.com
parents: 781
diff changeset
209 def after():
46a8dd3145cc Fix undo after aborted commit bug
mpm@selenic.com
parents: 781
diff changeset
210 util.rename(self.join("journal"), self.join("undo"))
46a8dd3145cc Fix undo after aborted commit bug
mpm@selenic.com
parents: 781
diff changeset
211 util.rename(self.join("journal.dirstate"),
46a8dd3145cc Fix undo after aborted commit bug
mpm@selenic.com
parents: 781
diff changeset
212 self.join("undo.dirstate"))
46a8dd3145cc Fix undo after aborted commit bug
mpm@selenic.com
parents: 781
diff changeset
213
46a8dd3145cc Fix undo after aborted commit bug
mpm@selenic.com
parents: 781
diff changeset
214 return transaction.transaction(self.ui.warn, self.opener,
46a8dd3145cc Fix undo after aborted commit bug
mpm@selenic.com
parents: 781
diff changeset
215 self.join("journal"), after)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
216
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
217 def recover(self):
225
1651a3e61925 fix repo locking
mpm@selenic.com
parents: 224
diff changeset
218 lock = self.lock()
557
b9fee419a1bd recover: the journal is named 'journal'
mpm@selenic.com
parents: 556
diff changeset
219 if os.path.exists(self.join("journal")):
501
7ea1c88792bf Better messages for rollback and undo
mpm@selenic.com
parents: 499
diff changeset
220 self.ui.status("rolling back interrupted transaction\n")
557
b9fee419a1bd recover: the journal is named 'journal'
mpm@selenic.com
parents: 556
diff changeset
221 return transaction.rollback(self.opener, self.join("journal"))
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
222 else:
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
223 self.ui.warn("no interrupted transaction available\n")
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
224
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
225 def undo(self):
225
1651a3e61925 fix repo locking
mpm@selenic.com
parents: 224
diff changeset
226 lock = self.lock()
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
227 if os.path.exists(self.join("undo")):
501
7ea1c88792bf Better messages for rollback and undo
mpm@selenic.com
parents: 499
diff changeset
228 self.ui.status("rolling back last transaction\n")
262
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 256
diff changeset
229 transaction.rollback(self.opener, self.join("undo"))
251
3fd8fc14b12f backup dirstate for undo
mpm@selenic.com
parents: 249
diff changeset
230 self.dirstate = None
421
43b8da7420a9 [PATCH] rename under the other OS
mpm@selenic.com
parents: 420
diff changeset
231 util.rename(self.join("undo.dirstate"), self.join("dirstate"))
1100
d6b6a15cc7c6 localrepo: more import/namespace tidying
mpm@selenic.com
parents: 1097
diff changeset
232 self.dirstate = dirstate.dirstate(self.opener, self.ui, self.root)
163
f38c90953c2c Make undo and recover friendlier
mpm@selenic.com
parents: 162
diff changeset
233 else:
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
234 self.ui.warn("no undo information available\n")
162
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 161
diff changeset
235
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1040
diff changeset
236 def lock(self, wait=1):
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
237 try:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
238 return lock.lock(self.join("lock"), 0)
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
239 except lock.LockHeld, inst:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
240 if wait:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
241 self.ui.warn("waiting for lock held by %s\n" % inst.args[0])
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
242 return lock.lock(self.join("lock"), wait)
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
243 raise inst
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
244
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
245 def rawcommit(self, files, text, user, date, p1=None, p2=None):
442
3e2aee6c5500 rawcommit dirstate tweak
mpm@selenic.com
parents: 441
diff changeset
246 orig_parent = self.dirstate.parents()[0] or nullid
452
a1e91c24dab5 rawcommit: do lookup of parents at the appropriate layer
mpm@selenic.com
parents: 442
diff changeset
247 p1 = p1 or self.dirstate.parents()[0] or nullid
a1e91c24dab5 rawcommit: do lookup of parents at the appropriate layer
mpm@selenic.com
parents: 442
diff changeset
248 p2 = p2 or self.dirstate.parents()[1] or nullid
302
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
249 c1 = self.changelog.read(p1)
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
250 c2 = self.changelog.read(p2)
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
251 m1 = self.manifest.read(c1[0])
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
252 mf1 = self.manifest.readflags(c1[0])
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
253 m2 = self.manifest.read(c2[0])
992
f859e9cba1b9 Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents: 991
diff changeset
254 changed = []
302
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
255
442
3e2aee6c5500 rawcommit dirstate tweak
mpm@selenic.com
parents: 441
diff changeset
256 if orig_parent == p1:
3e2aee6c5500 rawcommit dirstate tweak
mpm@selenic.com
parents: 441
diff changeset
257 update_dirstate = 1
3e2aee6c5500 rawcommit dirstate tweak
mpm@selenic.com
parents: 441
diff changeset
258 else:
3e2aee6c5500 rawcommit dirstate tweak
mpm@selenic.com
parents: 441
diff changeset
259 update_dirstate = 0
3e2aee6c5500 rawcommit dirstate tweak
mpm@selenic.com
parents: 441
diff changeset
260
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
261 tr = self.transaction()
302
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
262 mm = m1.copy()
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
263 mfm = mf1.copy()
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
264 linkrev = self.changelog.count()
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
265 for f in files:
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
266 try:
1019
a9cca981c423 Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents: 1013
diff changeset
267 t = self.wread(f)
441
e8af362cfb01 Permission handling for the other OS
mpm@selenic.com
parents: 436
diff changeset
268 tm = util.is_exec(self.wjoin(f), mfm.get(f, False))
302
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
269 r = self.file(f)
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
270 mfm[f] = tm
990
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
271
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
272 fp1 = m1.get(f, nullid)
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
273 fp2 = m2.get(f, nullid)
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
274
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
275 # is the same revision on two branches of a merge?
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
276 if fp2 == fp1:
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
277 fp2 = nullid
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
278
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
279 if fp2 != nullid:
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
280 # is one parent an ancestor of the other?
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
281 fpa = r.ancestor(fp1, fp2)
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
282 if fpa == fp1:
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
283 fp1, fp2 = fp2, nullid
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
284 elif fpa == fp2:
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
285 fp2 = nullid
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
286
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
287 # is the file unmodified from the parent?
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
288 if t == r.read(fp1):
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
289 # record the proper existing parent in manifest
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
290 # no need to add a revision
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
291 mm[f] = fp1
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
292 continue
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
293
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
294 mm[f] = r.add(t, {}, tr, linkrev, fp1, fp2)
992
f859e9cba1b9 Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents: 991
diff changeset
295 changed.append(f)
442
3e2aee6c5500 rawcommit dirstate tweak
mpm@selenic.com
parents: 441
diff changeset
296 if update_dirstate:
3e2aee6c5500 rawcommit dirstate tweak
mpm@selenic.com
parents: 441
diff changeset
297 self.dirstate.update([f], "n")
203
0b486b5e0796 hg rawcommit command