comparison mercurial/commands.py @ 3846:18855084b922

Make debuginstall actually attempt to use external patch and merge This will catch some tricky problems with tools and setup.
author Matt Mackall <mpm@selenic.com>
date Sun, 10 Dec 2006 00:44:52 -0600
parents 3ba82c3f4bc3
children 8cbf060f637e
comparison
equal deleted inserted replaced
3845:8958417abf62 3846:18855084b922
8 from demandload import demandload 8 from demandload import demandload
9 from node import * 9 from node import *
10 from i18n import gettext as _ 10 from i18n import gettext as _
11 demandload(globals(), "bisect os re sys signal imp urllib pdb shlex stat") 11 demandload(globals(), "bisect os re sys signal imp urllib pdb shlex stat")
12 demandload(globals(), "fancyopts ui hg util lock revlog bundlerepo") 12 demandload(globals(), "fancyopts ui hg util lock revlog bundlerepo")
13 demandload(globals(), "difflib patch time help") 13 demandload(globals(), "difflib patch time help mdiff tempfile")
14 demandload(globals(), "traceback errno version atexit") 14 demandload(globals(), "traceback errno version atexit")
15 demandload(globals(), "archival changegroup cmdutil hgweb.server sshserver") 15 demandload(globals(), "archival changegroup cmdutil hgweb.server sshserver")
16 16
17 class UnknownCommand(Exception): 17 class UnknownCommand(Exception):
18 """Exception raised if command is not in the command table.""" 18 """Exception raised if command is not in the command table."""
828 ui.write("}\n") 828 ui.write("}\n")
829 829
830 def debuginstall(ui): 830 def debuginstall(ui):
831 '''test Mercurial installation''' 831 '''test Mercurial installation'''
832 832
833 def writetemp(contents):
834 (fd, name) = tempfile.mkstemp()
835 f = os.fdopen(fd, "wb")
836 f.write(contents)
837 f.close()
838 return name
839
833 problems = 0 840 problems = 0
834 841
835 # encoding 842 # encoding
836 ui.status(_("Checking encoding (%s)...\n") % util._encoding) 843 ui.status(_("Checking encoding (%s)...\n") % util._encoding)
837 try: 844 try:
865 patcher = util.find_in_path('gpatch', path, 872 patcher = util.find_in_path('gpatch', path,
866 util.find_in_path('patch', path, None)) 873 util.find_in_path('patch', path, None))
867 if not patcher: 874 if not patcher:
868 ui.write(_(" Can't find patch or gpatch in PATH\n")) 875 ui.write(_(" Can't find patch or gpatch in PATH\n"))
869 problems += 1 876 problems += 1
870 # should actually attempt a patch here 877 else:
878 # actually attempt a patch here
879 a = "1\n2\n3\n4\n"
880 b = "1\n2\n3\ninsert\n4\n"
881 d = mdiff.unidiff(a, None, b, None, "a")
882 fa = writetemp(a)
883 fd = writetemp(d)
884 fp = os.popen('%s %s %s' % (patcher, fa, fd))
885 files = []
886 output = ""
887 for line in fp:
888 output += line
889 if line.startswith('patching file '):
890 pf = util.parse_patch_output(line.rstrip())
891 files.append(pf)
892 if files != [fa]:
893 ui.write(_(" unexpected patch output!"))
894 ui.write(data)
895 problems += 1
896 a = file(fa).read()
897 if a != b:
898 ui.write(_(" patch test failed!"))
899 problems += 1
900 os.unlink(fa)
901 os.unlink(fd)
871 902
872 # merge helper 903 # merge helper
873 ui.status(_("Checking merge helper...\n")) 904 ui.status(_("Checking merge helper...\n"))
874 cmd = (os.environ.get("HGMERGE") or ui.config("ui", "merge") 905 cmd = (os.environ.get("HGMERGE") or ui.config("ui", "merge")
875 or "hgmerge") 906 or "hgmerge")
881 ui.write(_(" No merge helper set and can't find default" 912 ui.write(_(" No merge helper set and can't find default"
882 " hgmerge script in PATH\n")) 913 " hgmerge script in PATH\n"))
883 else: 914 else:
884 ui.write(_(" Can't find merge helper '%s' in PATH\n") % cmd) 915 ui.write(_(" Can't find merge helper '%s' in PATH\n") % cmd)
885 problems += 1 916 problems += 1
886 # should attempt a non-conflicting merge here 917 else:
918 # actually attempt a patch here
919 fa = writetemp("1\n2\n3\n4\n")
920 fl = writetemp("1\n2\n3\ninsert\n4\n")
921 fr = writetemp("begin\n1\n2\n3\n4\n")
922 r = os.system('%s %s %s %s' % (cmd, fl, fa, fr))
923 if r:
924 ui.write(_(" got unexpected merge error %d!") % r)
925 problems += 1
926 m = file(fl).read()
927 if m != "begin\n1\n2\n3\ninsert\n4\n":
928 ui.write(_(" got unexpected merge results!") % r)
929 ui.write(m)
930 os.unlink(fa)
931 os.unlink(fl)
932 os.unlink(fr)
887 933
888 # editor 934 # editor
889 ui.status(_("Checking commit editor...\n")) 935 ui.status(_("Checking commit editor...\n"))
890 editor = (os.environ.get("HGEDITOR") or 936 editor = (os.environ.get("HGEDITOR") or
891 ui.config("ui", "editor") or 937 ui.config("ui", "editor") or