4 # |
4 # |
5 # This software may be used and distributed according to the terms |
5 # This software may be used and distributed according to the terms |
6 # of the GNU General Public License, incorporated herein by reference. |
6 # of the GNU General Public License, incorporated herein by reference. |
7 |
7 |
8 import struct, os, util |
8 import struct, os, util |
9 from repo import * |
9 import filelog, manifest, changelog, dirstate, repo |
10 from revlog import * |
10 from node import * |
11 from filelog import * |
|
12 from manifest import * |
|
13 from changelog import * |
|
14 from dirstate import * |
|
15 from demandload import * |
11 from demandload import * |
16 demandload(globals(), "re lock transaction tempfile stat") |
12 demandload(globals(), "re lock transaction tempfile stat mdiff") |
17 |
13 |
18 class localrepository: |
14 class localrepository: |
19 def __init__(self, ui, opener, path=None, create=0): |
15 def __init__(self, ui, opener, path=None, create=0): |
20 self.remote = 0 |
16 self.remote = 0 |
21 if path and path.startswith("http://"): |
17 if path and path.startswith("http://"): |
25 if not path: |
21 if not path: |
26 p = os.getcwd() |
22 p = os.getcwd() |
27 while not os.path.isdir(os.path.join(p, ".hg")): |
23 while not os.path.isdir(os.path.join(p, ".hg")): |
28 oldp = p |
24 oldp = p |
29 p = os.path.dirname(p) |
25 p = os.path.dirname(p) |
30 if p == oldp: raise RepoError("no repo found") |
26 if p == oldp: raise repo.RepoError("no repo found") |
31 path = p |
27 path = p |
32 self.path = os.path.join(path, ".hg") |
28 self.path = os.path.join(path, ".hg") |
33 |
29 |
34 if not create and not os.path.isdir(self.path): |
30 if not create and not os.path.isdir(self.path): |
35 raise RepoError("repository %s not found" % self.path) |
31 raise repo.RepoError("repository %s not found" % self.path) |
36 |
32 |
37 self.root = os.path.abspath(path) |
33 self.root = os.path.abspath(path) |
38 self.ui = ui |
34 self.ui = ui |
39 |
35 |
40 if create: |
36 if create: |
41 os.mkdir(self.path) |
37 os.mkdir(self.path) |
42 os.mkdir(self.join("data")) |
38 os.mkdir(self.join("data")) |
43 |
39 |
44 self.opener = opener(self.path) |
40 self.opener = opener(self.path) |
45 self.wopener = opener(self.root) |
41 self.wopener = opener(self.root) |
46 self.manifest = manifest(self.opener) |
42 self.manifest = manifest.manifest(self.opener) |
47 self.changelog = changelog(self.opener) |
43 self.changelog = changelog.changelog(self.opener) |
48 self.tagscache = None |
44 self.tagscache = None |
49 self.nodetagscache = None |
45 self.nodetagscache = None |
50 |
46 |
51 if not self.remote: |
47 if not self.remote: |
52 self.dirstate = dirstate(self.opener, ui, self.root) |
48 self.dirstate = dirstate.dirstate(self.opener, ui, self.root) |
53 try: |
49 try: |
54 self.ui.readconfig(self.opener("hgrc")) |
50 self.ui.readconfig(self.opener("hgrc")) |
55 except IOError: pass |
51 except IOError: pass |
56 |
52 |
57 def hook(self, name, **args): |
53 def hook(self, name, **args): |
141 return self.tags()[key] |
137 return self.tags()[key] |
142 except KeyError: |
138 except KeyError: |
143 try: |
139 try: |
144 return self.changelog.lookup(key) |
140 return self.changelog.lookup(key) |
145 except: |
141 except: |
146 raise RepoError("unknown revision '%s'" % key) |
142 raise repo.RepoError("unknown revision '%s'" % key) |
147 |
143 |
148 def dev(self): |
144 def dev(self): |
149 if self.remote: return -1 |
145 if self.remote: return -1 |
150 return os.stat(self.path).st_dev |
146 return os.stat(self.path).st_dev |
151 |
147 |
158 def wjoin(self, f): |
154 def wjoin(self, f): |
159 return os.path.join(self.root, f) |
155 return os.path.join(self.root, f) |
160 |
156 |
161 def file(self, f): |
157 def file(self, f): |
162 if f[0] == '/': f = f[1:] |
158 if f[0] == '/': f = f[1:] |
163 return filelog(self.opener, f) |
159 return filelog.filelog(self.opener, f) |
164 |
160 |
165 def getcwd(self): |
161 def getcwd(self): |
166 return self.dirstate.getcwd() |
162 return self.dirstate.getcwd() |
167 |
163 |
168 def wfile(self, f, mode='r'): |
164 def wfile(self, f, mode='r'): |
205 if os.path.exists(self.join("undo")): |
201 if os.path.exists(self.join("undo")): |
206 self.ui.status("rolling back last transaction\n") |
202 self.ui.status("rolling back last transaction\n") |
207 transaction.rollback(self.opener, self.join("undo")) |
203 transaction.rollback(self.opener, self.join("undo")) |
208 self.dirstate = None |
204 self.dirstate = None |
209 util.rename(self.join("undo.dirstate"), self.join("dirstate")) |
205 util.rename(self.join("undo.dirstate"), self.join("dirstate")) |
210 self.dirstate = dirstate(self.opener, self.ui, self.root) |
206 self.dirstate = dirstate.dirstate(self.opener, self.ui, self.root) |
211 else: |
207 else: |
212 self.ui.warn("no undo information available\n") |
208 self.ui.warn("no undo information available\n") |
213 |
209 |
214 def lock(self, wait=1): |
210 def lock(self, wait=1): |
215 try: |
211 try: |
808 p, f = i, f * 2 |
804 p, f = i, f * 2 |
809 |
805 |
810 # sanity check our fetch list |
806 # sanity check our fetch list |
811 for f in fetch.keys(): |
807 for f in fetch.keys(): |
812 if f in m: |
808 if f in m: |
813 raise RepoError("already have changeset " + short(f[:4])) |
809 raise repo.RepoError("already have changeset " + short(f[:4])) |
814 |
810 |
815 if base.keys() == [nullid]: |
811 if base.keys() == [nullid]: |
816 self.ui.warn("warning: pulling from an unrelated repository!\n") |
812 self.ui.warn("warning: pulling from an unrelated repository!\n") |
817 |
813 |
818 self.ui.note("found new changesets starting at " + |
814 self.ui.note("found new changesets starting at " + |