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 |