comparison mercurial/commands.py @ 30952:85c3c879c43a

debugcommands: move 'debugrevspec' in the new module
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
date Thu, 02 Feb 2017 10:03:31 +0100
parents f44b96aef81b
children 5b09e9bc0902
comparison
equal deleted inserted replaced
30951:f44b96aef81b 30952:85c3c879c43a
47 phases, 47 phases,
48 pycompat, 48 pycompat,
49 revset, 49 revset,
50 scmutil, 50 scmutil,
51 server, 51 server,
52 smartset,
53 sshserver, 52 sshserver,
54 streamclone, 53 streamclone,
55 templatekw, 54 templatekw,
56 templater, 55 templater,
57 ui as uimod, 56 ui as uimod,
1854 Returns 0 on success, 1 if errors are encountered. 1853 Returns 0 on success, 1 if errors are encountered.
1855 """ 1854 """
1856 with repo.wlock(False): 1855 with repo.wlock(False):
1857 return cmdutil.copy(ui, repo, pats, opts) 1856 return cmdutil.copy(ui, repo, pats, opts)
1858 1857
1859 @command('debugrevspec',
1860 [('', 'optimize', None,
1861 _('print parsed tree after optimizing (DEPRECATED)')),
1862 ('p', 'show-stage', [],
1863 _('print parsed tree at the given stage'), _('NAME')),
1864 ('', 'no-optimized', False, _('evaluate tree without optimization')),
1865 ('', 'verify-optimized', False, _('verify optimized result')),
1866 ],
1867 ('REVSPEC'))
1868 def debugrevspec(ui, repo, expr, **opts):
1869 """parse and apply a revision specification
1870
1871 Use -p/--show-stage option to print the parsed tree at the given stages.
1872 Use -p all to print tree at every stage.
1873
1874 Use --verify-optimized to compare the optimized result with the unoptimized
1875 one. Returns 1 if the optimized result differs.
1876 """
1877 stages = [
1878 ('parsed', lambda tree: tree),
1879 ('expanded', lambda tree: revset.expandaliases(ui, tree)),
1880 ('concatenated', revset.foldconcat),
1881 ('analyzed', revset.analyze),
1882 ('optimized', revset.optimize),
1883 ]
1884 if opts['no_optimized']:
1885 stages = stages[:-1]
1886 if opts['verify_optimized'] and opts['no_optimized']:
1887 raise error.Abort(_('cannot use --verify-optimized with '
1888 '--no-optimized'))
1889 stagenames = set(n for n, f in stages)
1890
1891 showalways = set()
1892 showchanged = set()
1893 if ui.verbose and not opts['show_stage']:
1894 # show parsed tree by --verbose (deprecated)
1895 showalways.add('parsed')
1896 showchanged.update(['expanded', 'concatenated'])
1897 if opts['optimize']:
1898 showalways.add('optimized')
1899 if opts['show_stage'] and opts['optimize']:
1900 raise error.Abort(_('cannot use --optimize with --show-stage'))
1901 if opts['show_stage'] == ['all']:
1902 showalways.update(stagenames)
1903 else:
1904 for n in opts['show_stage']:
1905 if n not in stagenames:
1906 raise error.Abort(_('invalid stage name: %s') % n)
1907 showalways.update(opts['show_stage'])
1908
1909 treebystage = {}
1910 printedtree = None
1911 tree = revset.parse(expr, lookup=repo.__contains__)
1912 for n, f in stages:
1913 treebystage[n] = tree = f(tree)
1914 if n in showalways or (n in showchanged and tree != printedtree):
1915 if opts['show_stage'] or n != 'parsed':
1916 ui.write(("* %s:\n") % n)
1917 ui.write(revset.prettyformat(tree), "\n")
1918 printedtree = tree
1919
1920 if opts['verify_optimized']:
1921 arevs = revset.makematcher(treebystage['analyzed'])(repo)
1922 brevs = revset.makematcher(treebystage['optimized'])(repo)
1923 if ui.verbose:
1924 ui.note(("* analyzed set:\n"), smartset.prettyformat(arevs), "\n")
1925 ui.note(("* optimized set:\n"), smartset.prettyformat(brevs), "\n")
1926 arevs = list(arevs)
1927 brevs = list(brevs)
1928 if arevs == brevs:
1929 return 0
1930 ui.write(('--- analyzed\n'), label='diff.file_a')
1931 ui.write(('+++ optimized\n'), label='diff.file_b')
1932 sm = difflib.SequenceMatcher(None, arevs, brevs)
1933 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
1934 if tag in ('delete', 'replace'):
1935 for c in arevs[alo:ahi]:
1936 ui.write('-%s\n' % c, label='diff.deleted')
1937 if tag in ('insert', 'replace'):
1938 for c in brevs[blo:bhi]:
1939 ui.write('+%s\n' % c, label='diff.inserted')
1940 if tag == 'equal':
1941 for c in arevs[alo:ahi]:
1942 ui.write(' %s\n' % c)
1943 return 1
1944
1945 func = revset.makematcher(tree)
1946 revs = func(repo)
1947 if ui.verbose:
1948 ui.note(("* set:\n"), smartset.prettyformat(revs), "\n")
1949 for c in revs:
1950 ui.write("%s\n" % c)
1951
1952 @command('debugsetparents', [], _('REV1 [REV2]')) 1858 @command('debugsetparents', [], _('REV1 [REV2]'))
1953 def debugsetparents(ui, repo, rev1, rev2=None): 1859 def debugsetparents(ui, repo, rev1, rev2=None):
1954 """manually set the parents of the current working directory 1860 """manually set the parents of the current working directory
1955 1861
1956 This is useful for writing repository conversion tools, but should 1862 This is useful for writing repository conversion tools, but should