mercurial/commands.py
changeset 2400 2e90024e1471
parent 2397 e9d402506514
child 2405 4593d09e534d
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