1# Copyright (C) 2009 Scott Chacon <schacon@gmail.com> 2# Copyright (C) 2009-2018 Jelmer Vernooij <jelmer@jelmer.uk> 3 4# This program is free software; you can redistribute it and/or modify 5# it under the terms of the GNU General Public License as published by 6# the Free Software Foundation; either version 2 of the License, or 7# (at your option) any later version. 8# 9# This program is distributed in the hope that it will be useful, 10# but WITHOUT ANY WARRANTY; without even the implied warranty of 11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12# GNU General Public License for more details. 13# 14# You should have received a copy of the GNU General Public License 15# along with this program; if not, write to the Free Software 16# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 18"""Compatibility for hg-git.""" 19 20import urllib 21 22 23def format_hg_metadata(renames, branch, extra): 24 """Construct a tail with hg-git metadata. 25 26 :param renames: List of (oldpath, newpath) tuples with file renames 27 :param branch: Branch name 28 :param extra: Dictionary with extra data 29 :return: Tail for commit message 30 """ 31 extra_message = '' 32 if branch != 'default': 33 extra_message += "branch : " + branch + "\n" 34 35 if renames: 36 for oldfile, newfile in renames: 37 extra_message += "rename : " + oldfile + " => " + newfile + "\n" 38 39 for key, value in extra.iteritems(): 40 if key in ('author', 'committer', 'encoding', 'message', 'branch', 41 'hg-git'): 42 continue 43 else: 44 extra_message += "extra : " + key + \ 45 " : " + urllib.quote(value) + "\n" 46 47 if extra_message: 48 return "\n--HG--\n" + extra_message 49 else: 50 return "" 51 52 53def extract_hg_metadata(message): 54 """Extract Mercurial metadata from a commit message. 55 56 :param message: Commit message to extract from 57 :return: Tuple with original commit message, renames, branch and 58 extra data. 59 """ 60 split = message.split("\n--HG--\n", 1) 61 renames = {} 62 extra = {} 63 branch = None 64 if len(split) == 2: 65 message, meta = split 66 lines = meta.split("\n") 67 for line in lines: 68 if line == '': 69 continue 70 command, data = line.split(" : ", 1) 71 if command == 'rename': 72 before, after = data.split(" => ", 1) 73 renames[after] = before 74 elif command == 'branch': 75 branch = data 76 elif command == 'extra': 77 before, after = data.split(" : ", 1) 78 extra[before] = urllib.unquote(after) 79 else: 80 raise KeyError("unknown hg-git metadata command %s" % command) 81 return (message, renames, branch, extra) 82