230 else: |
230 else: |
231 self.ui.warn(_("no interrupted transaction available\n")) |
231 self.ui.warn(_("no interrupted transaction available\n")) |
232 return False |
232 return False |
233 |
233 |
234 def undo(self): |
234 def undo(self): |
|
235 wlock = self.wlock() |
235 lock = self.lock() |
236 lock = self.lock() |
236 if os.path.exists(self.join("undo")): |
237 if os.path.exists(self.join("undo")): |
237 self.ui.status(_("rolling back last transaction\n")) |
238 self.ui.status(_("rolling back last transaction\n")) |
238 transaction.rollback(self.opener, self.join("undo")) |
239 transaction.rollback(self.opener, self.join("undo")) |
239 self.dirstate = None |
|
240 util.rename(self.join("undo.dirstate"), self.join("dirstate")) |
240 util.rename(self.join("undo.dirstate"), self.join("dirstate")) |
241 self.dirstate = dirstate.dirstate(self.opener, self.ui, self.root) |
241 self.dirstate.read() |
242 else: |
242 else: |
243 self.ui.warn(_("no undo information available\n")) |
243 self.ui.warn(_("no undo information available\n")) |
244 |
244 |
245 def lock(self, wait=1): |
245 def lock(self, wait=1): |
246 try: |
246 try: |
248 except lock.LockHeld, inst: |
248 except lock.LockHeld, inst: |
249 if wait: |
249 if wait: |
250 self.ui.warn(_("waiting for lock held by %s\n") % inst.args[0]) |
250 self.ui.warn(_("waiting for lock held by %s\n") % inst.args[0]) |
251 return lock.lock(self.join("lock"), wait) |
251 return lock.lock(self.join("lock"), wait) |
252 raise inst |
252 raise inst |
|
253 |
|
254 def wlock(self, wait=1): |
|
255 try: |
|
256 wlock = lock.lock(self.join("wlock"), 0, self.dirstate.write) |
|
257 except lock.LockHeld, inst: |
|
258 if not wait: |
|
259 raise inst |
|
260 self.ui.warn(_("waiting for lock held by %s\n") % inst.args[0]) |
|
261 wlock = lock.lock(self.join("wlock"), wait, self.dirstate.write) |
|
262 self.dirstate.read() |
|
263 return wlock |
253 |
264 |
254 def rawcommit(self, files, text, user, date, p1=None, p2=None): |
265 def rawcommit(self, files, text, user, date, p1=None, p2=None): |
255 orig_parent = self.dirstate.parents()[0] or nullid |
266 orig_parent = self.dirstate.parents()[0] or nullid |
256 p1 = p1 or self.dirstate.parents()[0] or nullid |
267 p1 = p1 or self.dirstate.parents()[0] or nullid |
257 p2 = p2 or self.dirstate.parents()[1] or nullid |
268 p2 = p2 or self.dirstate.parents()[1] or nullid |
536 self.ui.warn(_("%s already tracked!\n") % f) |
551 self.ui.warn(_("%s already tracked!\n") % f) |
537 else: |
552 else: |
538 self.dirstate.update([f], "a") |
553 self.dirstate.update([f], "a") |
539 |
554 |
540 def forget(self, list): |
555 def forget(self, list): |
|
556 wlock = self.wlock() |
541 for f in list: |
557 for f in list: |
542 if self.dirstate.state(f) not in 'ai': |
558 if self.dirstate.state(f) not in 'ai': |
543 self.ui.warn(_("%s not added!\n") % f) |
559 self.ui.warn(_("%s not added!\n") % f) |
544 else: |
560 else: |
545 self.dirstate.forget([f]) |
561 self.dirstate.forget([f]) |
549 for f in list: |
565 for f in list: |
550 try: |
566 try: |
551 util.unlink(self.wjoin(f)) |
567 util.unlink(self.wjoin(f)) |
552 except OSError, inst: |
568 except OSError, inst: |
553 if inst.errno != errno.ENOENT: raise |
569 if inst.errno != errno.ENOENT: raise |
|
570 wlock = self.wlock() |
554 for f in list: |
571 for f in list: |
555 p = self.wjoin(f) |
572 p = self.wjoin(f) |
556 if os.path.exists(p): |
573 if os.path.exists(p): |
557 self.ui.warn(_("%s still exists!\n") % f) |
574 self.ui.warn(_("%s still exists!\n") % f) |
558 elif self.dirstate.state(f) == 'a': |
575 elif self.dirstate.state(f) == 'a': |
566 def undelete(self, list): |
583 def undelete(self, list): |
567 p = self.dirstate.parents()[0] |
584 p = self.dirstate.parents()[0] |
568 mn = self.changelog.read(p)[0] |
585 mn = self.changelog.read(p)[0] |
569 mf = self.manifest.readflags(mn) |
586 mf = self.manifest.readflags(mn) |
570 m = self.manifest.read(mn) |
587 m = self.manifest.read(mn) |
|
588 wlock = self.wlock() |
571 for f in list: |
589 for f in list: |
572 if self.dirstate.state(f) not in "r": |
590 if self.dirstate.state(f) not in "r": |
573 self.ui.warn("%s not removed!\n" % f) |
591 self.ui.warn("%s not removed!\n" % f) |
574 else: |
592 else: |
575 t = self.file(f).read(m[f]) |
593 t = self.file(f).read(m[f]) |
582 if not os.path.exists(p): |
600 if not os.path.exists(p): |
583 self.ui.warn(_("%s does not exist!\n") % dest) |
601 self.ui.warn(_("%s does not exist!\n") % dest) |
584 elif not os.path.isfile(p): |
602 elif not os.path.isfile(p): |
585 self.ui.warn(_("copy failed: %s is not a file\n") % dest) |
603 self.ui.warn(_("copy failed: %s is not a file\n") % dest) |
586 else: |
604 else: |
|
605 wlock = self.wlock() |
587 if self.dirstate.state(dest) == '?': |
606 if self.dirstate.state(dest) == '?': |
588 self.dirstate.update([dest], "a") |
607 self.dirstate.update([dest], "a") |
589 self.dirstate.copy(source, dest) |
608 self.dirstate.copy(source, dest) |
590 |
609 |
591 def heads(self): |
610 def heads(self): |
1372 |
1391 |
1373 for f in a + c + u: |
1392 for f in a + c + u: |
1374 mw[f] = "" |
1393 mw[f] = "" |
1375 mfw[f] = util.is_exec(self.wjoin(f), mfw.get(f, False)) |
1394 mfw[f] = util.is_exec(self.wjoin(f), mfw.get(f, False)) |
1376 |
1395 |
|
1396 if moddirstate: |
|
1397 wlock = self.wlock() |
|
1398 |
1377 for f in d: |
1399 for f in d: |
1378 if f in mw: del mw[f] |
1400 if f in mw: del mw[f] |
1379 |
1401 |
1380 # If we're jumping between revisions (as opposed to merging), |
1402 # If we're jumping between revisions (as opposed to merging), |
1381 # and if neither the working directory nor the target rev has |
1403 # and if neither the working directory nor the target rev has |