Show More
@@ -6,6 +6,7 b'' | |||||
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 | from node import hex, nullid, nullrev, short |
|
8 | from node import hex, nullid, nullrev, short | |
|
9 | from lock import release | |||
9 | from i18n import _, gettext |
|
10 | from i18n import _, gettext | |
10 | import os, re, sys, textwrap |
|
11 | import os, re, sys, textwrap | |
11 | import hg, util, revlog, bundlerepo, extensions, copies, context, error |
|
12 | import hg, util, revlog, bundlerepo, extensions, copies, context, error | |
@@ -684,7 +685,7 b' def copy(ui, repo, *pats, **opts):' | |||||
684 | try: |
|
685 | try: | |
685 | return cmdutil.copy(ui, repo, pats, opts) |
|
686 | return cmdutil.copy(ui, repo, pats, opts) | |
686 | finally: |
|
687 | finally: | |
687 |
|
|
688 | wlock.release() | |
688 |
|
689 | |||
689 | def debugancestor(ui, repo, *args): |
|
690 | def debugancestor(ui, repo, *args): | |
690 | """find the ancestor revision of two revisions in a given index""" |
|
691 | """find the ancestor revision of two revisions in a given index""" | |
@@ -747,7 +748,7 b' def debugrebuildstate(ui, repo, rev="tip' | |||||
747 | try: |
|
748 | try: | |
748 | repo.dirstate.rebuild(ctx.node(), ctx.manifest()) |
|
749 | repo.dirstate.rebuild(ctx.node(), ctx.manifest()) | |
749 | finally: |
|
750 | finally: | |
750 |
|
|
751 | wlock.release() | |
751 |
|
752 | |||
752 | def debugcheckstate(ui, repo): |
|
753 | def debugcheckstate(ui, repo): | |
753 | """validate the correctness of the current dirstate""" |
|
754 | """validate the correctness of the current dirstate""" | |
@@ -816,7 +817,7 b' def debugsetparents(ui, repo, rev1, rev2' | |||||
816 | try: |
|
817 | try: | |
817 | repo.dirstate.setparents(repo.lookup(rev1), repo.lookup(rev2)) |
|
818 | repo.dirstate.setparents(repo.lookup(rev1), repo.lookup(rev2)) | |
818 | finally: |
|
819 | finally: | |
819 |
|
|
820 | wlock.release() | |
820 |
|
821 | |||
821 | def debugstate(ui, repo, nodates=None): |
|
822 | def debugstate(ui, repo, nodates=None): | |
822 | """show the contents of the current dirstate""" |
|
823 | """show the contents of the current dirstate""" | |
@@ -1743,7 +1744,7 b' def import_(ui, repo, patch1, *patches, ' | |||||
1743 | finally: |
|
1744 | finally: | |
1744 | os.unlink(tmpname) |
|
1745 | os.unlink(tmpname) | |
1745 | finally: |
|
1746 | finally: | |
1746 |
|
|
1747 | release(lock, wlock) | |
1747 |
|
1748 | |||
1748 | def incoming(ui, repo, source="default", **opts): |
|
1749 | def incoming(ui, repo, source="default", **opts): | |
1749 | """show new changesets found in source |
|
1750 | """show new changesets found in source | |
@@ -2355,7 +2356,7 b' def rename(ui, repo, *pats, **opts):' | |||||
2355 | try: |
|
2356 | try: | |
2356 | return cmdutil.copy(ui, repo, pats, opts, rename=True) |
|
2357 | return cmdutil.copy(ui, repo, pats, opts, rename=True) | |
2357 | finally: |
|
2358 | finally: | |
2358 |
|
|
2359 | wlock.release() | |
2359 |
|
2360 | |||
2360 | def resolve(ui, repo, *pats, **opts): |
|
2361 | def resolve(ui, repo, *pats, **opts): | |
2361 | """retry file merges from a merge or update |
|
2362 | """retry file merges from a merge or update | |
@@ -2627,7 +2628,7 b' def revert(ui, repo, *pats, **opts):' | |||||
2627 | normal(f) |
|
2628 | normal(f) | |
2628 |
|
2629 | |||
2629 | finally: |
|
2630 | finally: | |
2630 |
|
|
2631 | wlock.release() | |
2631 |
|
2632 | |||
2632 | def rollback(ui, repo): |
|
2633 | def rollback(ui, repo): | |
2633 | """roll back the last transaction |
|
2634 | """roll back the last transaction | |
@@ -2919,15 +2920,14 b' def unbundle(ui, repo, fname1, *fnames, ' | |||||
2919 | """ |
|
2920 | """ | |
2920 | fnames = (fname1,) + fnames |
|
2921 | fnames = (fname1,) + fnames | |
2921 |
|
2922 | |||
2922 |
lock = |
|
2923 | lock = repo.lock() | |
2923 | try: |
|
2924 | try: | |
2924 | lock = repo.lock() |
|
|||
2925 | for fname in fnames: |
|
2925 | for fname in fnames: | |
2926 | f = url.open(ui, fname) |
|
2926 | f = url.open(ui, fname) | |
2927 | gen = changegroup.readbundle(f, fname) |
|
2927 | gen = changegroup.readbundle(f, fname) | |
2928 | modheads = repo.addchangegroup(gen, 'unbundle', 'bundle:' + fname) |
|
2928 | modheads = repo.addchangegroup(gen, 'unbundle', 'bundle:' + fname) | |
2929 | finally: |
|
2929 | finally: | |
2930 |
|
|
2930 | lock.release() | |
2931 |
|
2931 | |||
2932 | return postincoming(ui, repo, modheads, opts.get('update'), None) |
|
2932 | return postincoming(ui, repo, modheads, opts.get('update'), None) | |
2933 |
|
2933 |
@@ -140,5 +140,5 b' def save_state(repo, state):' | |||||
140 | f.write("%s %s\n" % (kind, hex(node))) |
|
140 | f.write("%s %s\n" % (kind, hex(node))) | |
141 | f.rename() |
|
141 | f.rename() | |
142 | finally: |
|
142 | finally: | |
143 |
|
|
143 | wlock.release() | |
144 |
|
144 |
@@ -7,6 +7,7 b'' | |||||
7 | # of the GNU General Public License, incorporated herein by reference. |
|
7 | # of the GNU General Public License, incorporated herein by reference. | |
8 |
|
8 | |||
9 | from i18n import _ |
|
9 | from i18n import _ | |
|
10 | from lock import release | |||
10 | import localrepo, bundlerepo, httprepo, sshrepo, statichttprepo |
|
11 | import localrepo, bundlerepo, httprepo, sshrepo, statichttprepo | |
11 | import errno, lock, os, shutil, util, extensions, error |
|
12 | import errno, lock, os, shutil, util, extensions, error | |
12 | import merge as _merge |
|
13 | import merge as _merge | |
@@ -249,7 +250,8 b' def clone(ui, source, dest=None, pull=Fa' | |||||
249 |
|
250 | |||
250 | return src_repo, dest_repo |
|
251 | return src_repo, dest_repo | |
251 | finally: |
|
252 | finally: | |
252 |
|
|
253 | release(src_lock, dest_lock) | |
|
254 | del dir_cleanup | |||
253 |
|
255 | |||
254 | def _showstats(repo, stats): |
|
256 | def _showstats(repo, stats): | |
255 | stats = ((stats[0], _("updated")), |
|
257 | stats = ((stats[0], _("updated")), |
@@ -163,7 +163,7 b' def unbundle(repo, req):' | |||||
163 | req.respond(HTTP_OK, HGTYPE) |
|
163 | req.respond(HTTP_OK, HGTYPE) | |
164 | return '%d\n%s' % (ret, val), |
|
164 | return '%d\n%s' % (ret, val), | |
165 | finally: |
|
165 | finally: | |
166 |
|
|
166 | lock.release() | |
167 | except ValueError, inst: |
|
167 | except ValueError, inst: | |
168 | raise ErrorResponse(HTTP_OK, inst) |
|
168 | raise ErrorResponse(HTTP_OK, inst) | |
169 | except (OSError, IOError), inst: |
|
169 | except (OSError, IOError), inst: |
@@ -14,6 +14,8 b' import os, time, util, extensions, hook,' | |||||
14 | import match as match_ |
|
14 | import match as match_ | |
15 | import merge as merge_ |
|
15 | import merge as merge_ | |
16 |
|
16 | |||
|
17 | from lock import release | |||
|
18 | ||||
17 | class localrepository(repo.repository): |
|
19 | class localrepository(repo.repository): | |
18 | capabilities = util.set(('lookup', 'changegroupsubset')) |
|
20 | capabilities = util.set(('lookup', 'changegroupsubset')) | |
19 | supported = ('revlogv1', 'store', 'fncache') |
|
21 | supported = ('revlogv1', 'store', 'fncache') | |
@@ -620,7 +622,7 b' class localrepository(repo.repository):' | |||||
620 | return tr |
|
622 | return tr | |
621 |
|
623 | |||
622 | def recover(self): |
|
624 | def recover(self): | |
623 | l = self.lock() |
|
625 | lock = self.lock() | |
624 | try: |
|
626 | try: | |
625 | if os.path.exists(self.sjoin("journal")): |
|
627 | if os.path.exists(self.sjoin("journal")): | |
626 | self.ui.status(_("rolling back interrupted transaction\n")) |
|
628 | self.ui.status(_("rolling back interrupted transaction\n")) | |
@@ -631,7 +633,7 b' class localrepository(repo.repository):' | |||||
631 | self.ui.warn(_("no interrupted transaction available\n")) |
|
633 | self.ui.warn(_("no interrupted transaction available\n")) | |
632 | return False |
|
634 | return False | |
633 | finally: |
|
635 | finally: | |
634 |
|
|
636 | lock.release() | |
635 |
|
637 | |||
636 | def rollback(self): |
|
638 | def rollback(self): | |
637 | wlock = lock = None |
|
639 | wlock = lock = None | |
@@ -654,7 +656,7 b' class localrepository(repo.repository):' | |||||
654 | else: |
|
656 | else: | |
655 | self.ui.warn(_("no rollback information available\n")) |
|
657 | self.ui.warn(_("no rollback information available\n")) | |
656 | finally: |
|
658 | finally: | |
657 |
|
|
659 | release(lock, wlock) | |
658 |
|
660 | |||
659 | def invalidate(self): |
|
661 | def invalidate(self): | |
660 | for a in "changelog manifest".split(): |
|
662 | for a in "changelog manifest".split(): | |
@@ -835,7 +837,7 b' class localrepository(repo.repository):' | |||||
835 | return r |
|
837 | return r | |
836 |
|
838 | |||
837 | finally: |
|
839 | finally: | |
838 |
|
|
840 | release(lock, wlock) | |
839 |
|
841 | |||
840 | def commitctx(self, ctx): |
|
842 | def commitctx(self, ctx): | |
841 | """Add a new revision to current repository. |
|
843 | """Add a new revision to current repository. | |
@@ -851,7 +853,7 b' class localrepository(repo.repository):' | |||||
851 | empty_ok=True, use_dirstate=False, |
|
853 | empty_ok=True, use_dirstate=False, | |
852 | update_dirstate=False) |
|
854 | update_dirstate=False) | |
853 | finally: |
|
855 | finally: | |
854 |
|
|
856 | release(lock, wlock) | |
855 |
|
857 | |||
856 | def _commitctx(self, wctx, force=False, force_editor=False, empty_ok=False, |
|
858 | def _commitctx(self, wctx, force=False, force_editor=False, empty_ok=False, | |
857 | use_dirstate=True, update_dirstate=True): |
|
859 | use_dirstate=True, update_dirstate=True): | |
@@ -1072,7 +1074,7 b' class localrepository(repo.repository):' | |||||
1072 | except error.LockError: |
|
1074 | except error.LockError: | |
1073 | pass |
|
1075 | pass | |
1074 | finally: |
|
1076 | finally: | |
1075 |
|
|
1077 | release(wlock) | |
1076 |
|
1078 | |||
1077 | if not parentworking: |
|
1079 | if not parentworking: | |
1078 | mf1 = mfmatches(ctx1) |
|
1080 | mf1 = mfmatches(ctx1) | |
@@ -1138,7 +1140,7 b' class localrepository(repo.repository):' | |||||
1138 | self.dirstate.add(f) |
|
1140 | self.dirstate.add(f) | |
1139 | return rejected |
|
1141 | return rejected | |
1140 | finally: |
|
1142 | finally: | |
1141 |
|
|
1143 | wlock.release() | |
1142 |
|
1144 | |||
1143 | def forget(self, list): |
|
1145 | def forget(self, list): | |
1144 | wlock = self.wlock() |
|
1146 | wlock = self.wlock() | |
@@ -1149,7 +1151,7 b' class localrepository(repo.repository):' | |||||
1149 | else: |
|
1151 | else: | |
1150 | self.dirstate.forget(f) |
|
1152 | self.dirstate.forget(f) | |
1151 | finally: |
|
1153 | finally: | |
1152 |
|
|
1154 | wlock.release() | |
1153 |
|
1155 | |||
1154 | def remove(self, list, unlink=False): |
|
1156 | def remove(self, list, unlink=False): | |
1155 | wlock = None |
|
1157 | wlock = None | |
@@ -1172,14 +1174,13 b' class localrepository(repo.repository):' | |||||
1172 | else: |
|
1174 | else: | |
1173 | self.dirstate.remove(f) |
|
1175 | self.dirstate.remove(f) | |
1174 | finally: |
|
1176 | finally: | |
1175 |
|
|
1177 | release(wlock) | |
1176 |
|
1178 | |||
1177 | def undelete(self, list): |
|
1179 | def undelete(self, list): | |
1178 | wlock = None |
|
1180 | manifests = [self.manifest.read(self.changelog.read(p)[0]) | |
|
1181 | for p in self.dirstate.parents() if p != nullid] | |||
|
1182 | wlock = self.wlock() | |||
1179 | try: |
|
1183 | try: | |
1180 | manifests = [self.manifest.read(self.changelog.read(p)[0]) |
|
|||
1181 | for p in self.dirstate.parents() if p != nullid] |
|
|||
1182 | wlock = self.wlock() |
|
|||
1183 | for f in list: |
|
1184 | for f in list: | |
1184 | if self.dirstate[f] != 'r': |
|
1185 | if self.dirstate[f] != 'r': | |
1185 | self.ui.warn(_("%s not removed!\n") % f) |
|
1186 | self.ui.warn(_("%s not removed!\n") % f) | |
@@ -1189,24 +1190,23 b' class localrepository(repo.repository):' | |||||
1189 | self.wwrite(f, t, m.flags(f)) |
|
1190 | self.wwrite(f, t, m.flags(f)) | |
1190 | self.dirstate.normal(f) |
|
1191 | self.dirstate.normal(f) | |
1191 | finally: |
|
1192 | finally: | |
1192 |
|
|
1193 | wlock.release() | |
1193 |
|
1194 | |||
1194 | def copy(self, source, dest): |
|
1195 | def copy(self, source, dest): | |
1195 | wlock = None |
|
1196 | p = self.wjoin(dest) | |
1196 | try: |
|
1197 | if not (os.path.exists(p) or os.path.islink(p)): | |
1197 | p = self.wjoin(dest) |
|
1198 | self.ui.warn(_("%s does not exist!\n") % dest) | |
1198 |
|
|
1199 | elif not (os.path.isfile(p) or os.path.islink(p)): | |
1199 |
|
|
1200 | self.ui.warn(_("copy failed: %s is not a file or a " | |
1200 | elif not (os.path.isfile(p) or os.path.islink(p)): |
|
1201 | "symbolic link\n") % dest) | |
1201 | self.ui.warn(_("copy failed: %s is not a file or a " |
|
1202 | else: | |
1202 | "symbolic link\n") % dest) |
|
1203 | wlock = self.wlock() | |
1203 |
|
|
1204 | try: | |
1204 | wlock = self.wlock() |
|
|||
1205 | if self.dirstate[dest] in '?r': |
|
1205 | if self.dirstate[dest] in '?r': | |
1206 | self.dirstate.add(dest) |
|
1206 | self.dirstate.add(dest) | |
1207 | self.dirstate.copy(source, dest) |
|
1207 | self.dirstate.copy(source, dest) | |
1208 | finally: |
|
1208 | finally: | |
1209 |
|
|
1209 | wlock.release() | |
1210 |
|
1210 | |||
1211 | def heads(self, start=None, closed=True): |
|
1211 | def heads(self, start=None, closed=True): | |
1212 | heads = self.changelog.heads(start) |
|
1212 | heads = self.changelog.heads(start) | |
@@ -1500,7 +1500,7 b' class localrepository(repo.repository):' | |||||
1500 | cg = remote.changegroupsubset(fetch, heads, 'pull') |
|
1500 | cg = remote.changegroupsubset(fetch, heads, 'pull') | |
1501 | return self.addchangegroup(cg, 'pull', remote.url()) |
|
1501 | return self.addchangegroup(cg, 'pull', remote.url()) | |
1502 | finally: |
|
1502 | finally: | |
1503 |
|
|
1503 | lock.release() | |
1504 |
|
1504 | |||
1505 | def push(self, remote, force=False, revs=None): |
|
1505 | def push(self, remote, force=False, revs=None): | |
1506 | # there are two ways to push to remote repo: |
|
1506 | # there are two ways to push to remote repo: | |
@@ -1581,7 +1581,7 b' class localrepository(repo.repository):' | |||||
1581 | return remote.addchangegroup(cg, 'push', self.url()) |
|
1581 | return remote.addchangegroup(cg, 'push', self.url()) | |
1582 | return ret[1] |
|
1582 | return ret[1] | |
1583 | finally: |
|
1583 | finally: | |
1584 |
|
|
1584 | lock.release() | |
1585 |
|
1585 | |||
1586 | def push_unbundle(self, remote, force, revs): |
|
1586 | def push_unbundle(self, remote, force, revs): | |
1587 | # local repo finds heads on server, finds out what revs it |
|
1587 | # local repo finds heads on server, finds out what revs it |
@@ -504,4 +504,4 b' def update(repo, node, branchmerge, forc' | |||||
504 |
|
504 | |||
505 | return stats |
|
505 | return stats | |
506 | finally: |
|
506 | finally: | |
507 |
|
|
507 | wlock.release() |
@@ -37,7 +37,11 b' class sshserver(object):' | |||||
37 | self.fout.flush() |
|
37 | self.fout.flush() | |
38 |
|
38 | |||
39 | def serve_forever(self): |
|
39 | def serve_forever(self): | |
40 | while self.serve_one(): pass |
|
40 | try: | |
|
41 | while self.serve_one(): pass | |||
|
42 | finally: | |||
|
43 | if self.lock is not None: | |||
|
44 | self.lock.release() | |||
41 | sys.exit(0) |
|
45 | sys.exit(0) | |
42 |
|
46 | |||
43 | def serve_one(self): |
|
47 | def serve_one(self): |
@@ -41,16 +41,15 b' def stream_out(repo, untrusted=False):' | |||||
41 | entries = [] |
|
41 | entries = [] | |
42 | total_bytes = 0 |
|
42 | total_bytes = 0 | |
43 | try: |
|
43 | try: | |
44 | l = None |
|
44 | # get consistent snapshot of repo, lock during scan | |
|
45 | lock = repo.lock() | |||
45 | try: |
|
46 | try: | |
46 | repo.ui.debug(_('scanning\n')) |
|
47 | repo.ui.debug(_('scanning\n')) | |
47 | # get consistent snapshot of repo, lock during scan |
|
|||
48 | l = repo.lock() |
|
|||
49 | for name, ename, size in repo.store.walk(): |
|
48 | for name, ename, size in repo.store.walk(): | |
50 | entries.append((name, size)) |
|
49 | entries.append((name, size)) | |
51 | total_bytes += size |
|
50 | total_bytes += size | |
52 | finally: |
|
51 | finally: | |
53 |
|
|
52 | lock.release() | |
54 | except error.LockError: |
|
53 | except error.LockError: | |
55 | raise StreamException(2) |
|
54 | raise StreamException(2) | |
56 |
|
55 |
General Comments 0
You need to be logged in to leave comments.
Login now