mercurial/commands.py
changeset 30939 9e39d196cdf5
parent 30938 23c801570449
child 30940 c8081ea63591
equal deleted inserted replaced
30938:23c801570449 30939:9e39d196cdf5
    14 import string
    14 import string
    15 import time
    15 import time
    16 
    16 
    17 from .i18n import _
    17 from .i18n import _
    18 from .node import (
    18 from .node import (
    19     bin,
       
    20     hex,
    19     hex,
    21     nullid,
    20     nullid,
    22     nullrev,
    21     nullrev,
    23     short,
    22     short,
    24 )
    23 )
  1859     Returns 0 on success, 1 if errors are encountered.
  1858     Returns 0 on success, 1 if errors are encountered.
  1860     """
  1859     """
  1861     with repo.wlock(False):
  1860     with repo.wlock(False):
  1862         return cmdutil.copy(ui, repo, pats, opts)
  1861         return cmdutil.copy(ui, repo, pats, opts)
  1863 
  1862 
  1864 @command('debugobsolete',
       
  1865         [('', 'flags', 0, _('markers flag')),
       
  1866          ('', 'record-parents', False,
       
  1867           _('record parent information for the precursor')),
       
  1868          ('r', 'rev', [], _('display markers relevant to REV')),
       
  1869          ('', 'index', False, _('display index of the marker')),
       
  1870          ('', 'delete', [], _('delete markers specified by indices')),
       
  1871         ] + commitopts2 + formatteropts,
       
  1872          _('[OBSOLETED [REPLACEMENT ...]]'))
       
  1873 def debugobsolete(ui, repo, precursor=None, *successors, **opts):
       
  1874     """create arbitrary obsolete marker
       
  1875 
       
  1876     With no arguments, displays the list of obsolescence markers."""
       
  1877 
       
  1878     def parsenodeid(s):
       
  1879         try:
       
  1880             # We do not use revsingle/revrange functions here to accept
       
  1881             # arbitrary node identifiers, possibly not present in the
       
  1882             # local repository.
       
  1883             n = bin(s)
       
  1884             if len(n) != len(nullid):
       
  1885                 raise TypeError()
       
  1886             return n
       
  1887         except TypeError:
       
  1888             raise error.Abort('changeset references must be full hexadecimal '
       
  1889                              'node identifiers')
       
  1890 
       
  1891     if opts.get('delete'):
       
  1892         indices = []
       
  1893         for v in opts.get('delete'):
       
  1894             try:
       
  1895                 indices.append(int(v))
       
  1896             except ValueError:
       
  1897                 raise error.Abort(_('invalid index value: %r') % v,
       
  1898                                   hint=_('use integers for indices'))
       
  1899 
       
  1900         if repo.currenttransaction():
       
  1901             raise error.Abort(_('cannot delete obsmarkers in the middle '
       
  1902                                 'of transaction.'))
       
  1903 
       
  1904         with repo.lock():
       
  1905             n = repair.deleteobsmarkers(repo.obsstore, indices)
       
  1906             ui.write(_('deleted %i obsolescence markers\n') % n)
       
  1907 
       
  1908         return
       
  1909 
       
  1910     if precursor is not None:
       
  1911         if opts['rev']:
       
  1912             raise error.Abort('cannot select revision when creating marker')
       
  1913         metadata = {}
       
  1914         metadata['user'] = opts['user'] or ui.username()
       
  1915         succs = tuple(parsenodeid(succ) for succ in successors)
       
  1916         l = repo.lock()
       
  1917         try:
       
  1918             tr = repo.transaction('debugobsolete')
       
  1919             try:
       
  1920                 date = opts.get('date')
       
  1921                 if date:
       
  1922                     date = util.parsedate(date)
       
  1923                 else:
       
  1924                     date = None
       
  1925                 prec = parsenodeid(precursor)
       
  1926                 parents = None
       
  1927                 if opts['record_parents']:
       
  1928                     if prec not in repo.unfiltered():
       
  1929                         raise error.Abort('cannot used --record-parents on '
       
  1930                                          'unknown changesets')
       
  1931                     parents = repo.unfiltered()[prec].parents()
       
  1932                     parents = tuple(p.node() for p in parents)
       
  1933                 repo.obsstore.create(tr, prec, succs, opts['flags'],
       
  1934                                      parents=parents, date=date,
       
  1935                                      metadata=metadata)
       
  1936                 tr.close()
       
  1937             except ValueError as exc:
       
  1938                 raise error.Abort(_('bad obsmarker input: %s') % exc)
       
  1939             finally:
       
  1940                 tr.release()
       
  1941         finally:
       
  1942             l.release()
       
  1943     else:
       
  1944         if opts['rev']:
       
  1945             revs = scmutil.revrange(repo, opts['rev'])
       
  1946             nodes = [repo[r].node() for r in revs]
       
  1947             markers = list(obsolete.getmarkers(repo, nodes=nodes))
       
  1948             markers.sort(key=lambda x: x._data)
       
  1949         else:
       
  1950             markers = obsolete.getmarkers(repo)
       
  1951 
       
  1952         markerstoiter = markers
       
  1953         isrelevant = lambda m: True
       
  1954         if opts.get('rev') and opts.get('index'):
       
  1955             markerstoiter = obsolete.getmarkers(repo)
       
  1956             markerset = set(markers)
       
  1957             isrelevant = lambda m: m in markerset
       
  1958 
       
  1959         fm = ui.formatter('debugobsolete', opts)
       
  1960         for i, m in enumerate(markerstoiter):
       
  1961             if not isrelevant(m):
       
  1962                 # marker can be irrelevant when we're iterating over a set
       
  1963                 # of markers (markerstoiter) which is bigger than the set
       
  1964                 # of markers we want to display (markers)
       
  1965                 # this can happen if both --index and --rev options are
       
  1966                 # provided and thus we need to iterate over all of the markers
       
  1967                 # to get the correct indices, but only display the ones that
       
  1968                 # are relevant to --rev value
       
  1969                 continue
       
  1970             fm.startitem()
       
  1971             ind = i if opts.get('index') else None
       
  1972             cmdutil.showmarker(fm, m, index=ind)
       
  1973         fm.end()
       
  1974 
       
  1975 @command('debugpathcomplete',
  1863 @command('debugpathcomplete',
  1976          [('f', 'full', None, _('complete an entire path')),
  1864          [('f', 'full', None, _('complete an entire path')),
  1977           ('n', 'normal', None, _('show only normal files')),
  1865           ('n', 'normal', None, _('show only normal files')),
  1978           ('a', 'added', None, _('show only added files')),
  1866           ('a', 'added', None, _('show only added files')),
  1979           ('r', 'removed', None, _('show only removed files'))],
  1867           ('r', 'removed', None, _('show only removed files'))],