234 return True |
234 return True |
235 else: |
235 else: |
236 self.ui.warn(_("no interrupted transaction available\n")) |
236 self.ui.warn(_("no interrupted transaction available\n")) |
237 return False |
237 return False |
238 |
238 |
239 def undo(self): |
239 def undo(self, wlock=None): |
240 wlock = self.wlock() |
240 if not wlock: |
|
241 wlock = self.wlock() |
241 lock = self.lock() |
242 lock = self.lock() |
242 if os.path.exists(self.join("undo")): |
243 if os.path.exists(self.join("undo")): |
243 self.ui.status(_("rolling back last transaction\n")) |
244 self.ui.status(_("rolling back last transaction\n")) |
244 transaction.rollback(self.opener, self.join("undo")) |
245 transaction.rollback(self.opener, self.join("undo")) |
245 util.rename(self.join("undo.dirstate"), self.join("dirstate")) |
246 util.rename(self.join("undo.dirstate"), self.join("dirstate")) |
265 self.ui.warn(_("waiting for lock held by %s\n") % inst.args[0]) |
266 self.ui.warn(_("waiting for lock held by %s\n") % inst.args[0]) |
266 wlock = lock.lock(self.join("wlock"), wait, self.dirstate.write) |
267 wlock = lock.lock(self.join("wlock"), wait, self.dirstate.write) |
267 self.dirstate.read() |
268 self.dirstate.read() |
268 return wlock |
269 return wlock |
269 |
270 |
270 def rawcommit(self, files, text, user, date, p1=None, p2=None): |
271 def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None): |
271 orig_parent = self.dirstate.parents()[0] or nullid |
272 orig_parent = self.dirstate.parents()[0] or nullid |
272 p1 = p1 or self.dirstate.parents()[0] or nullid |
273 p1 = p1 or self.dirstate.parents()[0] or nullid |
273 p2 = p2 or self.dirstate.parents()[1] or nullid |
274 p2 = p2 or self.dirstate.parents()[1] or nullid |
274 c1 = self.changelog.read(p1) |
275 c1 = self.changelog.read(p1) |
275 c2 = self.changelog.read(p2) |
276 c2 = self.changelog.read(p2) |
338 tr.close() |
340 tr.close() |
339 if update_dirstate: |
341 if update_dirstate: |
340 self.dirstate.setparents(n, nullid) |
342 self.dirstate.setparents(n, nullid) |
341 |
343 |
342 def commit(self, files=None, text="", user=None, date=None, |
344 def commit(self, files=None, text="", user=None, date=None, |
343 match=util.always, force=False): |
345 match=util.always, force=False, wlock=None): |
344 commit = [] |
346 commit = [] |
345 remove = [] |
347 remove = [] |
346 changed = [] |
348 changed = [] |
347 |
349 |
348 if files: |
350 if files: |
478 util.pathto(self.getcwd(), fn), short(node))) |
481 util.pathto(self.getcwd(), fn), short(node))) |
479 else: |
482 else: |
480 for src, fn in self.dirstate.walk(files, match): |
483 for src, fn in self.dirstate.walk(files, match): |
481 yield src, fn |
484 yield src, fn |
482 |
485 |
483 def changes(self, node1=None, node2=None, files=[], match=util.always): |
486 def changes(self, node1=None, node2=None, files=[], match=util.always, |
|
487 wlock=None): |
484 """return changes between two nodes or node and working directory |
488 """return changes between two nodes or node and working directory |
485 |
489 |
486 If node1 is None, use the first dirstate parent instead. |
490 If node1 is None, use the first dirstate parent instead. |
487 If node2 is None, compare node1 with working directory. |
491 If node2 is None, compare node1 with working directory. |
488 """ |
492 """ |
500 del mf[fn] |
504 del mf[fn] |
501 return mf |
505 return mf |
502 |
506 |
503 # are we comparing the working directory? |
507 # are we comparing the working directory? |
504 if not node2: |
508 if not node2: |
505 try: |
509 if not wlock: |
506 wlock = self.wlock(wait=0) |
510 try: |
507 except lock.LockHeld: |
511 wlock = self.wlock(wait=0) |
508 wlock = None |
512 except lock.LockHeld: |
|
513 wlock = None |
509 lookup, modified, added, removed, deleted, unknown = ( |
514 lookup, modified, added, removed, deleted, unknown = ( |
510 self.dirstate.changes(files, match)) |
515 self.dirstate.changes(files, match)) |
511 |
516 |
512 # are we comparing working dir against its parent? |
517 # are we comparing working dir against its parent? |
513 if not node1: |
518 if not node1: |
552 # sort and return results: |
557 # sort and return results: |
553 for l in modified, added, removed, deleted, unknown: |
558 for l in modified, added, removed, deleted, unknown: |
554 l.sort() |
559 l.sort() |
555 return (modified, added, removed, deleted, unknown) |
560 return (modified, added, removed, deleted, unknown) |
556 |
561 |
557 def add(self, list): |
562 def add(self, list, wlock=None): |
558 wlock = self.wlock() |
563 if not wlock: |
|
564 wlock = self.wlock() |
559 for f in list: |
565 for f in list: |
560 p = self.wjoin(f) |
566 p = self.wjoin(f) |
561 if not os.path.exists(p): |
567 if not os.path.exists(p): |
562 self.ui.warn(_("%s does not exist!\n") % f) |
568 self.ui.warn(_("%s does not exist!\n") % f) |
563 elif not os.path.isfile(p): |
569 elif not os.path.isfile(p): |
566 elif self.dirstate.state(f) in 'an': |
572 elif self.dirstate.state(f) in 'an': |
567 self.ui.warn(_("%s already tracked!\n") % f) |
573 self.ui.warn(_("%s already tracked!\n") % f) |
568 else: |
574 else: |
569 self.dirstate.update([f], "a") |
575 self.dirstate.update([f], "a") |
570 |
576 |
571 def forget(self, list): |
577 def forget(self, list, wlock=None): |
572 wlock = self.wlock() |
578 if not wlock: |
|
579 wlock = self.wlock() |
573 for f in list: |
580 for f in list: |
574 if self.dirstate.state(f) not in 'ai': |
581 if self.dirstate.state(f) not in 'ai': |
575 self.ui.warn(_("%s not added!\n") % f) |
582 self.ui.warn(_("%s not added!\n") % f) |
576 else: |
583 else: |
577 self.dirstate.forget([f]) |
584 self.dirstate.forget([f]) |
578 |
585 |
579 def remove(self, list, unlink=False): |
586 def remove(self, list, unlink=False, wlock=None): |
580 if unlink: |
587 if unlink: |
581 for f in list: |
588 for f in list: |
582 try: |
589 try: |
583 util.unlink(self.wjoin(f)) |
590 util.unlink(self.wjoin(f)) |
584 except OSError, inst: |
591 except OSError, inst: |
585 if inst.errno != errno.ENOENT: |
592 if inst.errno != errno.ENOENT: |
586 raise |
593 raise |
587 wlock = self.wlock() |
594 if not wlock: |
|
595 wlock = self.wlock() |
588 for f in list: |
596 for f in list: |
589 p = self.wjoin(f) |
597 p = self.wjoin(f) |
590 if os.path.exists(p): |
598 if os.path.exists(p): |
591 self.ui.warn(_("%s still exists!\n") % f) |
599 self.ui.warn(_("%s still exists!\n") % f) |
592 elif self.dirstate.state(f) == 'a': |
600 elif self.dirstate.state(f) == 'a': |
595 elif f not in self.dirstate: |
603 elif f not in self.dirstate: |
596 self.ui.warn(_("%s not tracked!\n") % f) |
604 self.ui.warn(_("%s not tracked!\n") % f) |
597 else: |
605 else: |
598 self.dirstate.update([f], "r") |
606 self.dirstate.update([f], "r") |
599 |
607 |
600 def undelete(self, list): |
608 def undelete(self, list, wlock=None): |
601 p = self.dirstate.parents()[0] |
609 p = self.dirstate.parents()[0] |
602 mn = self.changelog.read(p)[0] |
610 mn = self.changelog.read(p)[0] |
603 mf = self.manifest.readflags(mn) |
611 mf = self.manifest.readflags(mn) |
604 m = self.manifest.read(mn) |
612 m = self.manifest.read(mn) |
605 wlock = self.wlock() |
613 if not wlock: |
|
614 wlock = self.wlock() |
606 for f in list: |
615 for f in list: |
607 if self.dirstate.state(f) not in "r": |
616 if self.dirstate.state(f) not in "r": |
608 self.ui.warn("%s not removed!\n" % f) |
617 self.ui.warn("%s not removed!\n" % f) |
609 else: |
618 else: |
610 t = self.file(f).read(m[f]) |
619 t = self.file(f).read(m[f]) |
611 self.wwrite(f, t) |
620 self.wwrite(f, t) |
612 util.set_exec(self.wjoin(f), mf[f]) |
621 util.set_exec(self.wjoin(f), mf[f]) |
613 self.dirstate.update([f], "n") |
622 self.dirstate.update([f], "n") |
614 |
623 |
615 def copy(self, source, dest): |
624 def copy(self, source, dest, wlock=None): |
616 p = self.wjoin(dest) |
625 p = self.wjoin(dest) |
617 if not os.path.exists(p): |
626 if not os.path.exists(p): |
618 self.ui.warn(_("%s does not exist!\n") % dest) |
627 self.ui.warn(_("%s does not exist!\n") % dest) |
619 elif not os.path.isfile(p): |
628 elif not os.path.isfile(p): |
620 self.ui.warn(_("copy failed: %s is not a file\n") % dest) |
629 self.ui.warn(_("copy failed: %s is not a file\n") % dest) |
621 else: |
630 else: |
622 wlock = self.wlock() |
631 if not wlock: |
|
632 wlock = self.wlock() |
623 if self.dirstate.state(dest) == '?': |
633 if self.dirstate.state(dest) == '?': |
624 self.dirstate.update([dest], "a") |
634 self.dirstate.update([dest], "a") |
625 self.dirstate.copy(source, dest) |
635 self.dirstate.copy(source, dest) |
626 |
636 |
627 def heads(self, start=None): |
637 def heads(self, start=None): |
1379 self.hook("commit", node=hex(self.changelog.node(i))) |
1389 self.hook("commit", node=hex(self.changelog.node(i))) |
1380 |
1390 |
1381 return |
1391 return |
1382 |
1392 |
1383 def update(self, node, allow=False, force=False, choose=None, |
1393 def update(self, node, allow=False, force=False, choose=None, |
1384 moddirstate=True, forcemerge=False): |
1394 moddirstate=True, forcemerge=False, wlock=None): |
1385 pl = self.dirstate.parents() |
1395 pl = self.dirstate.parents() |
1386 if not force and pl[1] != nullid: |
1396 if not force and pl[1] != nullid: |
1387 self.ui.warn(_("aborting: outstanding uncommitted merges\n")) |
1397 self.ui.warn(_("aborting: outstanding uncommitted merges\n")) |
1388 return 1 |
1398 return 1 |
1389 |
1399 |