1516 (branch and self.branch() != self.p1().branch()) or |
1517 (branch and self.branch() != self.p1().branch()) or |
1517 self.modified() or self.added() or self.removed() or |
1518 self.modified() or self.added() or self.removed() or |
1518 (missing and self.deleted())) |
1519 (missing and self.deleted())) |
1519 |
1520 |
1520 def add(self, list, prefix=""): |
1521 def add(self, list, prefix=""): |
1521 join = lambda f: os.path.join(prefix, f) |
|
1522 with self._repo.wlock(): |
1522 with self._repo.wlock(): |
1523 ui, ds = self._repo.ui, self._repo.dirstate |
1523 ui, ds = self._repo.ui, self._repo.dirstate |
|
1524 uipath = lambda f: ds.pathto(pathutil.join(prefix, f)) |
1524 rejected = [] |
1525 rejected = [] |
1525 lstat = self._repo.wvfs.lstat |
1526 lstat = self._repo.wvfs.lstat |
1526 for f in list: |
1527 for f in list: |
1527 scmutil.checkportable(ui, join(f)) |
1528 # ds.pathto() returns an absolute file when this is invoked from |
|
1529 # the keyword extension. That gets flagged as non-portable on |
|
1530 # Windows, since it contains the drive letter and colon. |
|
1531 scmutil.checkportable(ui, os.path.join(prefix, f)) |
1528 try: |
1532 try: |
1529 st = lstat(f) |
1533 st = lstat(f) |
1530 except OSError: |
1534 except OSError: |
1531 ui.warn(_("%s does not exist!\n") % join(f)) |
1535 ui.warn(_("%s does not exist!\n") % uipath(f)) |
1532 rejected.append(f) |
1536 rejected.append(f) |
1533 continue |
1537 continue |
1534 if st.st_size > 10000000: |
1538 if st.st_size > 10000000: |
1535 ui.warn(_("%s: up to %d MB of RAM may be required " |
1539 ui.warn(_("%s: up to %d MB of RAM may be required " |
1536 "to manage this file\n" |
1540 "to manage this file\n" |
1537 "(use 'hg revert %s' to cancel the " |
1541 "(use 'hg revert %s' to cancel the " |
1538 "pending addition)\n") |
1542 "pending addition)\n") |
1539 % (f, 3 * st.st_size // 1000000, join(f))) |
1543 % (f, 3 * st.st_size // 1000000, uipath(f))) |
1540 if not (stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode)): |
1544 if not (stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode)): |
1541 ui.warn(_("%s not added: only files and symlinks " |
1545 ui.warn(_("%s not added: only files and symlinks " |
1542 "supported currently\n") % join(f)) |
1546 "supported currently\n") % uipath(f)) |
1543 rejected.append(f) |
1547 rejected.append(f) |
1544 elif ds[f] in 'amn': |
1548 elif ds[f] in 'amn': |
1545 ui.warn(_("%s already tracked!\n") % join(f)) |
1549 ui.warn(_("%s already tracked!\n") % uipath(f)) |
1546 elif ds[f] == 'r': |
1550 elif ds[f] == 'r': |
1547 ds.normallookup(f) |
1551 ds.normallookup(f) |
1548 else: |
1552 else: |
1549 ds.add(f) |
1553 ds.add(f) |
1550 return rejected |
1554 return rejected |
1551 |
1555 |
1552 def forget(self, files, prefix=""): |
1556 def forget(self, files, prefix=""): |
1553 join = lambda f: os.path.join(prefix, f) |
|
1554 with self._repo.wlock(): |
1557 with self._repo.wlock(): |
|
1558 ds = self._repo.dirstate |
|
1559 uipath = lambda f: ds.pathto(pathutil.join(prefix, f)) |
1555 rejected = [] |
1560 rejected = [] |
1556 for f in files: |
1561 for f in files: |
1557 if f not in self._repo.dirstate: |
1562 if f not in self._repo.dirstate: |
1558 self._repo.ui.warn(_("%s not tracked!\n") % join(f)) |
1563 self._repo.ui.warn(_("%s not tracked!\n") % uipath(f)) |
1559 rejected.append(f) |
1564 rejected.append(f) |
1560 elif self._repo.dirstate[f] != 'a': |
1565 elif self._repo.dirstate[f] != 'a': |
1561 self._repo.dirstate.remove(f) |
1566 self._repo.dirstate.remove(f) |
1562 else: |
1567 else: |
1563 self._repo.dirstate.drop(f) |
1568 self._repo.dirstate.drop(f) |
1564 return rejected |
1569 return rejected |
1565 |
1570 |
1566 def undelete(self, list): |
1571 def undelete(self, list): |
1567 pctxs = self.parents() |
1572 pctxs = self.parents() |
1568 with self._repo.wlock(): |
1573 with self._repo.wlock(): |
|
1574 ds = self._repo.dirstate |
1569 for f in list: |
1575 for f in list: |
1570 if self._repo.dirstate[f] != 'r': |
1576 if self._repo.dirstate[f] != 'r': |
1571 self._repo.ui.warn(_("%s not removed!\n") % f) |
1577 self._repo.ui.warn(_("%s not removed!\n") % ds.pathto(f)) |
1572 else: |
1578 else: |
1573 fctx = f in pctxs[0] and pctxs[0][f] or pctxs[1][f] |
1579 fctx = f in pctxs[0] and pctxs[0][f] or pctxs[1][f] |
1574 t = fctx.data() |
1580 t = fctx.data() |
1575 self._repo.wwrite(f, t, fctx.flags()) |
1581 self._repo.wwrite(f, t, fctx.flags()) |
1576 self._repo.dirstate.normal(f) |
1582 self._repo.dirstate.normal(f) |
1579 try: |
1585 try: |
1580 st = self._repo.wvfs.lstat(dest) |
1586 st = self._repo.wvfs.lstat(dest) |
1581 except OSError as err: |
1587 except OSError as err: |
1582 if err.errno != errno.ENOENT: |
1588 if err.errno != errno.ENOENT: |
1583 raise |
1589 raise |
1584 self._repo.ui.warn(_("%s does not exist!\n") % dest) |
1590 self._repo.ui.warn(_("%s does not exist!\n") |
|
1591 % self._repo.dirstate.pathto(dest)) |
1585 return |
1592 return |
1586 if not (stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode)): |
1593 if not (stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode)): |
1587 self._repo.ui.warn(_("copy failed: %s is not a file or a " |
1594 self._repo.ui.warn(_("copy failed: %s is not a file or a " |
1588 "symbolic link\n") % dest) |
1595 "symbolic link\n") |
|
1596 % self._repo.dirstate.pathto(dest)) |
1589 else: |
1597 else: |
1590 with self._repo.wlock(): |
1598 with self._repo.wlock(): |
1591 if self._repo.dirstate[dest] in '?': |
1599 if self._repo.dirstate[dest] in '?': |
1592 self._repo.dirstate.add(dest) |
1600 self._repo.dirstate.add(dest) |
1593 elif self._repo.dirstate[dest] in 'r': |
1601 elif self._repo.dirstate[dest] in 'r': |