contrib/darcs2hg.py
changeset 2352 61909dfb316d
parent 2349 88c881bda888
child 2585 5ec2dded1bda
equal deleted inserted replaced
2351:075d2ddc4639 2352:61909dfb316d
    11 #             26-May-2006 - Updated
    11 #             26-May-2006 - Updated
    12 #             24-May-2006 - First implementation
    12 #             24-May-2006 - First implementation
    13 # -----------------------------------------------------------------------------
    13 # -----------------------------------------------------------------------------
    14 
    14 
    15 import os, sys
    15 import os, sys
       
    16 import tempfile
    16 import xml.dom.minidom as xml_dom
    17 import xml.dom.minidom as xml_dom
       
    18 from time import strptime, mktime
    17 
    19 
    18 DARCS_REPO = None
    20 DARCS_REPO = None
    19 HG_REPO    = None
    21 HG_REPO    = None
    20 
    22 
    21 USAGE = """\
    23 USAGE = """\
    23 
    25 
    24     Converts the given Darcs repository to a new Mercurial repository. The given
    26     Converts the given Darcs repository to a new Mercurial repository. The given
    25     HGREPO must not exist, as it will be created and filled up (this will avoid
    27     HGREPO must not exist, as it will be created and filled up (this will avoid
    26     overwriting valuable data.
    28     overwriting valuable data.
    27 
    29 
    28 """ % (os.path.basename(__file__))
    30 """ % (os.path.basename(sys.argv[0]))
    29 
    31 
    30 # ------------------------------------------------------------------------------
    32 # ------------------------------------------------------------------------------
    31 #
    33 #
    32 # Utilities
    34 # Utilities
    33 #
    35 #
    68 		comm = filter(lambda n:n.nodeName == "comment", patch_node.childNodes)
    70 		comm = filter(lambda n:n.nodeName == "comment", patch_node.childNodes)
    69 		if not name:continue
    71 		if not name:continue
    70 		else: name = name[0].childNodes[0].data
    72 		else: name = name[0].childNodes[0].data
    71 		if not comm: comm = ""
    73 		if not comm: comm = ""
    72 		else: comm = comm[0].childNodes[0].data
    74 		else: comm = comm[0].childNodes[0].data
    73 		res.append([name, comm])
    75 		author = patch_node.getAttribute("author")
    74 	return res
    76 		date = patch_node.getAttribute("date")
       
    77 		yield author, date, name, comm
    75 
    78 
    76 def darcs_pull(hg_repo, darcs_repo, change):
    79 def darcs_pull(hg_repo, darcs_repo, change):
    77 	cmd("darcs pull '%s' --all --patches='%s'" % (darcs_repo, change), hg_repo)
    80 	cmd("darcs pull '%s' --all --patches='%s'" % (darcs_repo, change), hg_repo)
    78 
    81 
    79 # ------------------------------------------------------------------------------
    82 # ------------------------------------------------------------------------------
    80 #
    83 #
    81 # Mercurial interface
    84 # Mercurial interface
    82 #
    85 #
    83 # ------------------------------------------------------------------------------
    86 # ------------------------------------------------------------------------------
    84 
    87 
    85 def hg_commit( hg_repo, text ):
    88 def hg_commit( hg_repo, text, author, date ):
    86 	writefile("/tmp/msg", text)
    89 	fd, tmpfile = tempfile.mkstemp(prefix="darcs2hg_")
    87 	cmd("hg add -X _darcs *", hg_repo)
    90 	writefile(tmpfile, text)
    88 	cmd("hg commit -l /tmp/msg", hg_repo)
    91 	cmd("hg add -X _darcs", hg_repo)
    89 	os.unlink("/tmp/msg")
    92 	cmd("hg remove -X _darcs --after", hg_repo)
       
    93 	cmd("hg commit -l %s -u '%s' -d '%s 0'"  % (tmpfile, author, date), hg_repo)
       
    94 	os.unlink(tmpfile)
    90 
    95 
    91 # ------------------------------------------------------------------------------
    96 # ------------------------------------------------------------------------------
    92 #
    97 #
    93 # Main
    98 # Main
    94 #
    99 #
   113 		print "Given HG repository must not exist. It will be created"
   118 		print "Given HG repository must not exist. It will be created"
   114 		sys.exit(-1)
   119 		sys.exit(-1)
   115 	cmd("hg init '%s'" % (hg_repo))
   120 	cmd("hg init '%s'" % (hg_repo))
   116 	cmd("darcs initialize", hg_repo)
   121 	cmd("darcs initialize", hg_repo)
   117 	# Get the changes from the Darcs repository
   122 	# Get the changes from the Darcs repository
   118 	for summary, description in darcs_changes(darcs_repo):
   123 	for author, date, summary, description in darcs_changes(darcs_repo):
   119 		text = summary + "\n" + description
   124 		text = summary + "\n" + description
   120 		darcs_pull(hg_repo, darcs_repo, summary)
   125 		darcs_pull(hg_repo, darcs_repo, summary)
   121 		hg_commit(hg_repo, text)
   126 		epoch = int(mktime(strptime(date, '%Y%m%d%H%M%S')))
       
   127 		hg_commit(hg_repo, text, author, epoch)
   122 
   128 
   123 # EOF
   129 # EOF
   124 
   130