mercurial/commands.py
changeset 30918 fec3dbaa7f83
parent 30916 455677a7667f
child 30919 e1fa5fe9f9d4
equal deleted inserted replaced
30917:b35e05103641 30918:fec3dbaa7f83
    11 import errno
    11 import errno
    12 import os
    12 import os
    13 import re
    13 import re
    14 import socket
    14 import socket
    15 import string
    15 import string
    16 import sys
       
    17 import tempfile
       
    18 import time
    16 import time
    19 
    17 
    20 from .i18n import _
    18 from .i18n import _
    21 from .node import (
    19 from .node import (
    22     bin,
    20     bin,
    49     merge as mergemod,
    47     merge as mergemod,
    50     minirst,
    48     minirst,
    51     obsolete,
    49     obsolete,
    52     patch,
    50     patch,
    53     phases,
    51     phases,
    54     policy,
       
    55     pvec,
    52     pvec,
    56     pycompat,
    53     pycompat,
    57     repair,
    54     repair,
    58     revlog,
    55     revlog,
    59     revset,
    56     revset,
    60     scmutil,
    57     scmutil,
    61     server,
    58     server,
    62     smartset,
    59     smartset,
    63     sshserver,
    60     sshserver,
    64     sslutil,
       
    65     streamclone,
    61     streamclone,
    66     templatekw,
    62     templatekw,
    67     templater,
    63     templater,
    68     ui as uimod,
    64     ui as uimod,
    69     util,
    65     util,
  1865     Returns 0 on success, 1 if errors are encountered.
  1861     Returns 0 on success, 1 if errors are encountered.
  1866     """
  1862     """
  1867     with repo.wlock(False):
  1863     with repo.wlock(False):
  1868         return cmdutil.copy(ui, repo, pats, opts)
  1864         return cmdutil.copy(ui, repo, pats, opts)
  1869 
  1865 
  1870 @command('debuginstall', [] + formatteropts, '', norepo=True)
       
  1871 def debuginstall(ui, **opts):
       
  1872     '''test Mercurial installation
       
  1873 
       
  1874     Returns 0 on success.
       
  1875     '''
       
  1876 
       
  1877     def writetemp(contents):
       
  1878         (fd, name) = tempfile.mkstemp(prefix="hg-debuginstall-")
       
  1879         f = os.fdopen(fd, "wb")
       
  1880         f.write(contents)
       
  1881         f.close()
       
  1882         return name
       
  1883 
       
  1884     problems = 0
       
  1885 
       
  1886     fm = ui.formatter('debuginstall', opts)
       
  1887     fm.startitem()
       
  1888 
       
  1889     # encoding
       
  1890     fm.write('encoding', _("checking encoding (%s)...\n"), encoding.encoding)
       
  1891     err = None
       
  1892     try:
       
  1893         encoding.fromlocal("test")
       
  1894     except error.Abort as inst:
       
  1895         err = inst
       
  1896         problems += 1
       
  1897     fm.condwrite(err, 'encodingerror', _(" %s\n"
       
  1898                  " (check that your locale is properly set)\n"), err)
       
  1899 
       
  1900     # Python
       
  1901     fm.write('pythonexe', _("checking Python executable (%s)\n"),
       
  1902              pycompat.sysexecutable)
       
  1903     fm.write('pythonver', _("checking Python version (%s)\n"),
       
  1904              ("%d.%d.%d" % sys.version_info[:3]))
       
  1905     fm.write('pythonlib', _("checking Python lib (%s)...\n"),
       
  1906              os.path.dirname(pycompat.fsencode(os.__file__)))
       
  1907 
       
  1908     security = set(sslutil.supportedprotocols)
       
  1909     if sslutil.hassni:
       
  1910         security.add('sni')
       
  1911 
       
  1912     fm.write('pythonsecurity', _("checking Python security support (%s)\n"),
       
  1913              fm.formatlist(sorted(security), name='protocol',
       
  1914                            fmt='%s', sep=','))
       
  1915 
       
  1916     # These are warnings, not errors. So don't increment problem count. This
       
  1917     # may change in the future.
       
  1918     if 'tls1.2' not in security:
       
  1919         fm.plain(_('  TLS 1.2 not supported by Python install; '
       
  1920                    'network connections lack modern security\n'))
       
  1921     if 'sni' not in security:
       
  1922         fm.plain(_('  SNI not supported by Python install; may have '
       
  1923                    'connectivity issues with some servers\n'))
       
  1924 
       
  1925     # TODO print CA cert info
       
  1926 
       
  1927     # hg version
       
  1928     hgver = util.version()
       
  1929     fm.write('hgver', _("checking Mercurial version (%s)\n"),
       
  1930              hgver.split('+')[0])
       
  1931     fm.write('hgverextra', _("checking Mercurial custom build (%s)\n"),
       
  1932              '+'.join(hgver.split('+')[1:]))
       
  1933 
       
  1934     # compiled modules
       
  1935     fm.write('hgmodulepolicy', _("checking module policy (%s)\n"),
       
  1936              policy.policy)
       
  1937     fm.write('hgmodules', _("checking installed modules (%s)...\n"),
       
  1938              os.path.dirname(__file__))
       
  1939 
       
  1940     err = None
       
  1941     try:
       
  1942         from . import (
       
  1943             base85,
       
  1944             bdiff,
       
  1945             mpatch,
       
  1946             osutil,
       
  1947         )
       
  1948         dir(bdiff), dir(mpatch), dir(base85), dir(osutil) # quiet pyflakes
       
  1949     except Exception as inst:
       
  1950         err = inst
       
  1951         problems += 1
       
  1952     fm.condwrite(err, 'extensionserror', " %s\n", err)
       
  1953 
       
  1954     compengines = util.compengines._engines.values()
       
  1955     fm.write('compengines', _('checking registered compression engines (%s)\n'),
       
  1956              fm.formatlist(sorted(e.name() for e in compengines),
       
  1957                            name='compengine', fmt='%s', sep=', '))
       
  1958     fm.write('compenginesavail', _('checking available compression engines '
       
  1959                                    '(%s)\n'),
       
  1960              fm.formatlist(sorted(e.name() for e in compengines
       
  1961                                   if e.available()),
       
  1962                            name='compengine', fmt='%s', sep=', '))
       
  1963     wirecompengines = util.compengines.supportedwireengines(util.SERVERROLE)
       
  1964     fm.write('compenginesserver', _('checking available compression engines '
       
  1965                                     'for wire protocol (%s)\n'),
       
  1966              fm.formatlist([e.name() for e in wirecompengines
       
  1967                             if e.wireprotosupport()],
       
  1968                            name='compengine', fmt='%s', sep=', '))
       
  1969 
       
  1970     # templates
       
  1971     p = templater.templatepaths()
       
  1972     fm.write('templatedirs', 'checking templates (%s)...\n', ' '.join(p))
       
  1973     fm.condwrite(not p, '', _(" no template directories found\n"))
       
  1974     if p:
       
  1975         m = templater.templatepath("map-cmdline.default")
       
  1976         if m:
       
  1977             # template found, check if it is working
       
  1978             err = None
       
  1979             try:
       
  1980                 templater.templater.frommapfile(m)
       
  1981             except Exception as inst:
       
  1982                 err = inst
       
  1983                 p = None
       
  1984             fm.condwrite(err, 'defaulttemplateerror', " %s\n", err)
       
  1985         else:
       
  1986             p = None
       
  1987         fm.condwrite(p, 'defaulttemplate',
       
  1988                      _("checking default template (%s)\n"), m)
       
  1989         fm.condwrite(not m, 'defaulttemplatenotfound',
       
  1990                      _(" template '%s' not found\n"), "default")
       
  1991     if not p:
       
  1992         problems += 1
       
  1993     fm.condwrite(not p, '',
       
  1994                  _(" (templates seem to have been installed incorrectly)\n"))
       
  1995 
       
  1996     # editor
       
  1997     editor = ui.geteditor()
       
  1998     editor = util.expandpath(editor)
       
  1999     fm.write('editor', _("checking commit editor... (%s)\n"), editor)
       
  2000     cmdpath = util.findexe(pycompat.shlexsplit(editor)[0])
       
  2001     fm.condwrite(not cmdpath and editor == 'vi', 'vinotfound',
       
  2002                  _(" No commit editor set and can't find %s in PATH\n"
       
  2003                    " (specify a commit editor in your configuration"
       
  2004                    " file)\n"), not cmdpath and editor == 'vi' and editor)
       
  2005     fm.condwrite(not cmdpath and editor != 'vi', 'editornotfound',
       
  2006                  _(" Can't find editor '%s' in PATH\n"
       
  2007                    " (specify a commit editor in your configuration"
       
  2008                    " file)\n"), not cmdpath and editor)
       
  2009     if not cmdpath and editor != 'vi':
       
  2010         problems += 1
       
  2011 
       
  2012     # check username
       
  2013     username = None
       
  2014     err = None
       
  2015     try:
       
  2016         username = ui.username()
       
  2017     except error.Abort as e:
       
  2018         err = e
       
  2019         problems += 1
       
  2020 
       
  2021     fm.condwrite(username, 'username',  _("checking username (%s)\n"), username)
       
  2022     fm.condwrite(err, 'usernameerror', _("checking username...\n %s\n"
       
  2023         " (specify a username in your configuration file)\n"), err)
       
  2024 
       
  2025     fm.condwrite(not problems, '',
       
  2026                  _("no problems detected\n"))
       
  2027     if not problems:
       
  2028         fm.data(problems=problems)
       
  2029     fm.condwrite(problems, 'problems',
       
  2030                  _("%d problems detected,"
       
  2031                    " please check your install!\n"), problems)
       
  2032     fm.end()
       
  2033 
       
  2034     return problems
       
  2035 
       
  2036 @command('debugknown', [], _('REPO ID...'), norepo=True)
  1866 @command('debugknown', [], _('REPO ID...'), norepo=True)
  2037 def debugknown(ui, repopath, *ids, **opts):
  1867 def debugknown(ui, repopath, *ids, **opts):
  2038     """test whether node ids are known to a repo
  1868     """test whether node ids are known to a repo
  2039 
  1869 
  2040     Every ID must be a full-length hex node id string. Returns a list of 0s
  1870     Every ID must be a full-length hex node id string. Returns a list of 0s