comparison mercurial/commands.py @ 2400:2e90024e1471

import: allow to import stdin with file name "-"
author Vadim Gelfer <vadim.gelfer@gmail.com>
date Sun, 04 Jun 2006 16:47:46 -0700
parents e9d402506514
children 4593d09e534d
comparison
equal deleted inserted replaced
2399:cc90dcbdf053 2400:2e90024e1471
1678 If a patch looks like a mail message (its first line starts with 1678 If a patch looks like a mail message (its first line starts with
1679 "From " or looks like an RFC822 header), it will not be applied 1679 "From " or looks like an RFC822 header), it will not be applied
1680 unless the -f option is used. The importer neither parses nor 1680 unless the -f option is used. The importer neither parses nor
1681 discards mail headers, so use -f only to override the "mailness" 1681 discards mail headers, so use -f only to override the "mailness"
1682 safety check, not to import a real mail message. 1682 safety check, not to import a real mail message.
1683
1684 To read a patch from standard input, use patch name "-".
1683 """ 1685 """
1684 patches = (patch1,) + patches 1686 patches = (patch1,) + patches
1685 1687
1686 if not opts['force']: 1688 if not opts['force']:
1687 bail_if_changed(repo) 1689 bail_if_changed(repo)
1696 diffre = re.compile(r'(?:Index:[ \t]|diff[ \t]|RCS file: |' + 1698 diffre = re.compile(r'(?:Index:[ \t]|diff[ \t]|RCS file: |' +
1697 'retrieving revision [0-9]+(\.[0-9]+)*$|' + 1699 'retrieving revision [0-9]+(\.[0-9]+)*$|' +
1698 '(---|\*\*\*)[ \t])') 1700 '(---|\*\*\*)[ \t])')
1699 1701
1700 for patch in patches: 1702 for patch in patches:
1701 ui.status(_("applying %s\n") % patch)
1702 pf = os.path.join(d, patch) 1703 pf = os.path.join(d, patch)
1703 1704
1704 message = [] 1705 message = []
1705 user = None 1706 user = None
1706 date = None 1707 date = None
1707 hgpatch = False 1708 hgpatch = False
1708 for line in file(pf): 1709 if pf == '-':
1709 line = line.rstrip() 1710 f = sys.stdin
1710 if (not message and not hgpatch and 1711 fd, tmpname = tempfile.mkstemp(prefix='hg-patch-')
1711 mailre.match(line) and not opts['force']): 1712 pf = tmpname
1712 if len(line) > 35: 1713 tmpfp = os.fdopen(fd, 'w')
1713 line = line[:32] + '...' 1714 ui.status(_("applying patch from stdin\n"))
1714 raise util.Abort(_('first line looks like a ' 1715 else:
1715 'mail header: ') + line) 1716 f = open(pf)
1716 if diffre.match(line): 1717 tmpfp, tmpname = None, None
1717 break 1718 ui.status(_("applying %s\n") % patch)
1718 elif hgpatch: 1719 try:
1719 # parse values when importing the result of an hg export 1720 while True:
1720 if line.startswith("# User "): 1721 line = f.readline()
1721 user = line[7:] 1722 if not line: break
1722 ui.debug(_('User: %s\n') % user) 1723 if tmpfp: tmpfp.write(line)
1723 elif line.startswith("# Date "): 1724 line = line.rstrip()
1724 date = line[7:] 1725 if (not message and not hgpatch and
1725 elif not line.startswith("# ") and line: 1726 mailre.match(line) and not opts['force']):
1727 if len(line) > 35:
1728 line = line[:32] + '...'
1729 raise util.Abort(_('first line looks like a '
1730 'mail header: ') + line)
1731 if diffre.match(line):
1732 if tmpfp:
1733 for chunk in util.filechunkiter(f):
1734 tmpfp.write(chunk)
1735 break
1736 elif hgpatch:
1737 # parse values when importing the result of an hg export
1738 if line.startswith("# User "):
1739 user = line[7:]
1740 ui.debug(_('User: %s\n') % user)
1741 elif line.startswith("# Date "):
1742 date = line[7:]
1743 elif not line.startswith("# ") and line:
1744 message.append(line)
1745 hgpatch = False
1746 elif line == '# HG changeset patch':
1747 hgpatch = True
1748 message = [] # We may have collected garbage
1749 elif message or line:
1726 message.append(line) 1750 message.append(line)
1727 hgpatch = False 1751
1728 elif line == '# HG changeset patch': 1752 # make sure message isn't empty
1729 hgpatch = True 1753 if not message:
1730 message = [] # We may have collected garbage 1754 message = _("imported patch %s\n") % patch
1731 elif message or line: 1755 else:
1732 message.append(line) 1756 message = '\n'.join(message).rstrip()
1733 1757 ui.debug(_('message:\n%s\n') % message)
1734 # make sure message isn't empty 1758
1735 if not message: 1759 if tmpfp: tmpfp.close()
1736 message = _("imported patch %s\n") % patch 1760 files = util.patch(strip, pf, ui)
1737 else: 1761
1738 message = '\n'.join(message).rstrip() 1762 if len(files) > 0:
1739 ui.debug(_('message:\n%s\n') % message) 1763 addremove_lock(ui, repo, files, {})
1740 1764 repo.commit(files, message, user, date)
1741 files = util.patch(strip, pf, ui) 1765 finally:
1742 1766 if tmpname: os.unlink(tmpname)
1743 if len(files) > 0:
1744 addremove_lock(ui, repo, files, {})
1745 repo.commit(files, message, user, date)
1746 1767
1747 def incoming(ui, repo, source="default", **opts): 1768 def incoming(ui, repo, source="default", **opts):
1748 """show new changesets found in source 1769 """show new changesets found in source
1749 1770
1750 Show new changesets found in the specified path/URL or the default 1771 Show new changesets found in the specified path/URL or the default