changeset 1190:737f9b90c571

Make import command reject patches that resemble email messages. See changeset 120aa5fc7ced1bf765b4f025f5a3a138cd87f49e for an example of why this is a good idea.
author bos@serpentine.internal.keyresearch.com
date Thu, 01 Sep 2005 09:04:18 -0700
parents 4cbcc54695b2
children 77a0c7528c2f
files doc/hg.1.txt mercurial/commands.py
diffstat 2 files changed, 15 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/doc/hg.1.txt	Thu Sep 01 08:01:10 2005 -0700
+++ b/doc/hg.1.txt	Thu Sep 01 09:04:18 2005 -0700
@@ -251,11 +251,18 @@
 import [-p <n> -b <base> -f] <patches>::
     Import a list of patches and commit them individually.
 
+    If a patch looks like a mail message (its first line starts with
+    "From " or looks like an RFC822 header), it will not be applied
+    unless the -m option is used.  The importer neither parses nor
+    discards mail headers, so use -m only to override the "mailness"
+    safety check, not to import a real mail message.
+
     options:
     -p, --strip <n>   directory strip option for patch. This has the same
                       meaning as the corresponding patch option
     -b <path>         base directory to read patches from
     -f, --force	      skip check for outstanding uncommitted changes
+    -m, --mail-like   apply a patch that appears to be a mail message
 
     aliases: patch
 
--- a/mercurial/commands.py	Thu Sep 01 08:01:10 2005 -0700
+++ b/mercurial/commands.py	Thu Sep 01 09:04:18 2005 -0700
@@ -1009,6 +1009,8 @@
     d = opts["base"]
     strip = opts["strip"]
 
+    mailre = re.compile(r'(From |[\w-]+:)')
+
     for patch in patches:
         ui.status("applying %s\n" % patch)
         pf = os.path.join(d, patch)
@@ -1018,6 +1020,10 @@
         hgpatch = False
         for line in file(pf):
             line = line.rstrip()
+            if not message and mailre.match(line) and not opts['mail_like']:
+                if len(line) > 35: line = line[:32] + '...'
+                raise util.Abort('first line looks like a '
+                                 'mail header: ' + line)
             if line.startswith("--- ") or line.startswith("diff -r"):
                 break
             elif hgpatch:
@@ -1662,7 +1668,8 @@
         (import_,
          [('p', 'strip', 1, 'path strip'),
           ('f', 'force', None, 'skip check for outstanding changes'),
-          ('b', 'base', "", 'base path')],
+          ('b', 'base', "", 'base path'),
+          ('m', 'mail-like', None, 'apply a patch that looks like email')],
          "hg import [-f] [-p NUM] [-b BASE] PATCH..."),
     "incoming|in": (incoming, 
          [('p', 'patch', None, 'show patch')],