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 |