changeset 43097:27c4f93d07a9

import: read X-Mercurial-Node email header to determine nodeid This would be useful to import and obsolete patches sent using 'hg email --plain', using evolve's --obsolete option of 'hg import'. If email body contains Mercurial patch header ('# HG changeset patch' block), nodeid parsed from X-Mercurial-Node header will still be overridden by respective value found in body.
author Denis Laxalde <denis@laxalde.org>
date Sun, 06 Oct 2019 13:06:19 +0200
parents 813aa8cc55d4
children 9691fc764bdc
files mercurial/patch.py tests/test-import.t
diffstat 2 files changed, 47 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/patch.py	Wed Oct 02 07:35:22 2019 +0900
+++ b/mercurial/patch.py	Sun Oct 06 13:06:19 2019 +0200
@@ -256,6 +256,11 @@
     # should try to parse msg['Date']
     parents = []
 
+    nodeid = msg[r'X-Mercurial-Node']
+    if nodeid:
+        data[b'nodeid'] = nodeid = mail.headdecode(nodeid)
+        ui.debug(b'Node ID: %s\n' % nodeid)
+
     if subject:
         if subject.startswith(b'[PATCH'):
             pend = subject.find(b']')
--- a/tests/test-import.t	Wed Oct 02 07:35:22 2019 +0900
+++ b/tests/test-import.t	Sun Oct 06 13:06:19 2019 +0200
@@ -237,7 +237,6 @@
   [255]
   $ rm -r b
 
-
 hg -R repo import
 put the clone in a subdir - having a directory named "a"
 used to hide a bug.
@@ -396,6 +395,48 @@
   summary:     second change
   $ rm -r b
 
+hg email --plain, should read X-Mercurial-Node header
+
+  $ cat >> a/.hg/hgrc << EOF
+  > [extensions]
+  > patchbomb =
+  > [email]
+  > from = foo
+  > cc = foo
+  > to = bar
+  > EOF
+  $ hg --cwd a email -m ../tip-plain.mbox --plain --date '1970-1-1 0:1' tip
+  this patch series consists of 1 patches.
+  
+  
+  sending [PATCH] second change ...
+
+  $ hg clone -r0 a b -q
+  $ hg --cwd b import --debug ../tip-plain.mbox
+  applying ../tip-plain.mbox
+  Node ID: 1d4bd90af0e43687763d158dfa83ff2a4b6c0c32
+  Subject: second change
+  From: foo
+  Content-Type: text/plain
+  found patch at byte 0
+  message:
+  second change
+  patching file a
+  committing files:
+  a
+  committing manifest
+  committing changelog
+  created de620f6fe949
+  updating the branch cache
+  $ hg --cwd b tip
+  changeset:   1:de620f6fe949
+  tag:         tip
+  user:        foo
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     second change
+  
+  $ rm -r b
+
 
 subject: duplicate detection, removal of [PATCH]
 The '---' tests the gitsendmail handling without proper mail headers