comparison mercurial/debugcommands.py @ 30938:fec3dbaa7f83

debugcommands: extract debuginstall in the debugcommands module
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
date Wed, 01 Feb 2017 17:31:05 +0100
parents 513d68a90398
children e1fa5fe9f9d4
comparison
equal deleted inserted replaced
30937:b35e05103641 30938:fec3dbaa7f83
8 from __future__ import absolute_import 8 from __future__ import absolute_import
9 9
10 import operator 10 import operator
11 import os 11 import os
12 import random 12 import random
13 import sys
14 import tempfile
13 15
14 from .i18n import _ 16 from .i18n import _
15 from .node import ( 17 from .node import (
16 bin, 18 bin,
17 hex, 19 hex,
24 cmdutil, 26 cmdutil,
25 commands, 27 commands,
26 context, 28 context,
27 dagparser, 29 dagparser,
28 dagutil, 30 dagutil,
31 encoding,
29 error, 32 error,
30 exchange, 33 exchange,
31 extensions, 34 extensions,
32 fileset, 35 fileset,
33 hg, 36 hg,
34 localrepo, 37 localrepo,
35 lock as lockmod, 38 lock as lockmod,
39 policy,
36 pycompat, 40 pycompat,
37 repair, 41 repair,
38 revlog, 42 revlog,
39 scmutil, 43 scmutil,
40 setdiscovery, 44 setdiscovery,
41 simplemerge, 45 simplemerge,
46 sslutil,
42 streamclone, 47 streamclone,
48 templater,
43 treediscovery, 49 treediscovery,
44 util, 50 util,
45 ) 51 )
46 52
47 release = lockmod.release 53 release = lockmod.release
849 ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i)) 855 ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i))
850 if pp[1] != nullid: 856 if pp[1] != nullid:
851 ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i)) 857 ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i))
852 ui.write("}\n") 858 ui.write("}\n")
853 859
860 @command('debuginstall', [] + commands.formatteropts, '', norepo=True)
861 def debuginstall(ui, **opts):
862 '''test Mercurial installation
863
864 Returns 0 on success.
865 '''
866
867 def writetemp(contents):
868 (fd, name) = tempfile.mkstemp(prefix="hg-debuginstall-")
869 f = os.fdopen(fd, "wb")
870 f.write(contents)
871 f.close()
872 return name
873
874 problems = 0
875
876 fm = ui.formatter('debuginstall', opts)
877 fm.startitem()
878
879 # encoding
880 fm.write('encoding', _("checking encoding (%s)...\n"), encoding.encoding)
881 err = None
882 try:
883 encoding.fromlocal("test")
884 except error.Abort as inst:
885 err = inst
886 problems += 1
887 fm.condwrite(err, 'encodingerror', _(" %s\n"
888 " (check that your locale is properly set)\n"), err)
889
890 # Python
891 fm.write('pythonexe', _("checking Python executable (%s)\n"),
892 pycompat.sysexecutable)
893 fm.write('pythonver', _("checking Python version (%s)\n"),
894 ("%d.%d.%d" % sys.version_info[:3]))
895 fm.write('pythonlib', _("checking Python lib (%s)...\n"),
896 os.path.dirname(pycompat.fsencode(os.__file__)))
897
898 security = set(sslutil.supportedprotocols)
899 if sslutil.hassni:
900 security.add('sni')
901
902 fm.write('pythonsecurity', _("checking Python security support (%s)\n"),
903 fm.formatlist(sorted(security), name='protocol',
904 fmt='%s', sep=','))
905
906 # These are warnings, not errors. So don't increment problem count. This
907 # may change in the future.
908 if 'tls1.2' not in security:
909 fm.plain(_(' TLS 1.2 not supported by Python install; '
910 'network connections lack modern security\n'))
911 if 'sni' not in security:
912 fm.plain(_(' SNI not supported by Python install; may have '
913 'connectivity issues with some servers\n'))
914
915 # TODO print CA cert info
916
917 # hg version
918 hgver = util.version()
919 fm.write('hgver', _("checking Mercurial version (%s)\n"),
920 hgver.split('+')[0])
921 fm.write('hgverextra', _("checking Mercurial custom build (%s)\n"),
922 '+'.join(hgver.split('+')[1:]))
923
924 # compiled modules
925 fm.write('hgmodulepolicy', _("checking module policy (%s)\n"),
926 policy.policy)
927 fm.write('hgmodules', _("checking installed modules (%s)...\n"),
928 os.path.dirname(__file__))
929
930 err = None
931 try:
932 from . import (
933 base85,
934 bdiff,
935 mpatch,
936 osutil,
937 )
938 dir(bdiff), dir(mpatch), dir(base85), dir(osutil) # quiet pyflakes
939 except Exception as inst:
940 err = inst
941 problems += 1
942 fm.condwrite(err, 'extensionserror', " %s\n", err)
943
944 compengines = util.compengines._engines.values()
945 fm.write('compengines', _('checking registered compression engines (%s)\n'),
946 fm.formatlist(sorted(e.name() for e in compengines),
947 name='compengine', fmt='%s', sep=', '))
948 fm.write('compenginesavail', _('checking available compression engines '
949 '(%s)\n'),
950 fm.formatlist(sorted(e.name() for e in compengines
951 if e.available()),
952 name='compengine', fmt='%s', sep=', '))
953 wirecompengines = util.compengines.supportedwireengines(util.SERVERROLE)
954 fm.write('compenginesserver', _('checking available compression engines '
955 'for wire protocol (%s)\n'),
956 fm.formatlist([e.name() for e in wirecompengines
957 if e.wireprotosupport()],
958 name='compengine', fmt='%s', sep=', '))
959
960 # templates
961 p = templater.templatepaths()
962 fm.write('templatedirs', 'checking templates (%s)...\n', ' '.join(p))
963 fm.condwrite(not p, '', _(" no template directories found\n"))
964 if p:
965 m = templater.templatepath("map-cmdline.default")
966 if m:
967 # template found, check if it is working
968 err = None
969 try:
970 templater.templater.frommapfile(m)
971 except Exception as inst:
972 err = inst
973 p = None
974 fm.condwrite(err, 'defaulttemplateerror', " %s\n", err)
975 else:
976 p = None
977 fm.condwrite(p, 'defaulttemplate',
978 _("checking default template (%s)\n"), m)
979 fm.condwrite(not m, 'defaulttemplatenotfound',
980 _(" template '%s' not found\n"), "default")
981 if not p:
982 problems += 1
983 fm.condwrite(not p, '',
984 _(" (templates seem to have been installed incorrectly)\n"))
985
986 # editor
987 editor = ui.geteditor()
988 editor = util.expandpath(editor)
989 fm.write('editor', _("checking commit editor... (%s)\n"), editor)
990 cmdpath = util.findexe(pycompat.shlexsplit(editor)[0])
991 fm.condwrite(not cmdpath and editor == 'vi', 'vinotfound',
992 _(" No commit editor set and can't find %s in PATH\n"
993 " (specify a commit editor in your configuration"
994 " file)\n"), not cmdpath and editor == 'vi' and editor)
995 fm.condwrite(not cmdpath and editor != 'vi', 'editornotfound',
996 _(" Can't find editor '%s' in PATH\n"
997 " (specify a commit editor in your configuration"
998 " file)\n"), not cmdpath and editor)
999 if not cmdpath and editor != 'vi':
1000 problems += 1
1001
1002 # check username
1003 username = None
1004 err = None
1005 try:
1006 username = ui.username()
1007 except error.Abort as e:
1008 err = e
1009 problems += 1
1010
1011 fm.condwrite(username, 'username', _("checking username (%s)\n"), username)
1012 fm.condwrite(err, 'usernameerror', _("checking username...\n %s\n"
1013 " (specify a username in your configuration file)\n"), err)
1014
1015 fm.condwrite(not problems, '',
1016 _("no problems detected\n"))
1017 if not problems:
1018 fm.data(problems=problems)
1019 fm.condwrite(problems, 'problems',
1020 _("%d problems detected,"
1021 " please check your install!\n"), problems)
1022 fm.end()
1023
1024 return problems
1025
854 @command('debugupgraderepo', [ 1026 @command('debugupgraderepo', [
855 ('o', 'optimize', [], _('extra optimization to perform'), _('NAME')), 1027 ('o', 'optimize', [], _('extra optimization to perform'), _('NAME')),
856 ('', 'run', False, _('performs an upgrade')), 1028 ('', 'run', False, _('performs an upgrade')),
857 ]) 1029 ])
858 def debugupgraderepo(ui, repo, run=False, optimize=None): 1030 def debugupgraderepo(ui, repo, run=False, optimize=None):