mercurial/cmdutil.py
changeset 37756 e7bf5a73e4e1
parent 37621 5537d8f5e989
child 37762 7269b87f817c
equal deleted inserted replaced
37755:886754323bed 37756:e7bf5a73e4e1
    59 # templates of common command options
    59 # templates of common command options
    60 
    60 
    61 dryrunopts = [
    61 dryrunopts = [
    62     ('n', 'dry-run', None,
    62     ('n', 'dry-run', None,
    63      _('do not perform actions, just print output')),
    63      _('do not perform actions, just print output')),
       
    64 ]
       
    65 
       
    66 confirmopts = [
       
    67     ('', 'confirm', None,
       
    68      _('ask before applying actions')),
    64 ]
    69 ]
    65 
    70 
    66 remoteopts = [
    71 remoteopts = [
    67     ('e', 'ssh', '',
    72     ('e', 'ssh', '',
    68      _('specify ssh command to use'), _('CMD')),
    73      _('specify ssh command to use'), _('CMD')),
  2020     for r in repo.revs('filelog("path:.hgsub")'):
  2025     for r in repo.revs('filelog("path:.hgsub")'):
  2021         ctx = repo[r]
  2026         ctx = repo[r]
  2022         for subpath in ctx.substate:
  2027         for subpath in ctx.substate:
  2023             ctx.sub(subpath).addwebdirpath(serverpath, webconf)
  2028             ctx.sub(subpath).addwebdirpath(serverpath, webconf)
  2024 
  2029 
  2025 def forget(ui, repo, match, prefix, explicitonly, dryrun):
  2030 def forget(ui, repo, match, prefix, explicitonly, dryrun, confirm):
       
  2031     if dryrun and confirm:
       
  2032         raise error.Abort(_("cannot specify both --dry-run and --confirm"))
  2026     join = lambda f: os.path.join(prefix, f)
  2033     join = lambda f: os.path.join(prefix, f)
  2027     bad = []
  2034     bad = []
  2028     badfn = lambda x, y: bad.append(x) or match.bad(x, y)
  2035     badfn = lambda x, y: bad.append(x) or match.bad(x, y)
  2029     wctx = repo[None]
  2036     wctx = repo[None]
  2030     forgot = []
  2037     forgot = []
  2036 
  2043 
  2037     for subpath in sorted(wctx.substate):
  2044     for subpath in sorted(wctx.substate):
  2038         sub = wctx.sub(subpath)
  2045         sub = wctx.sub(subpath)
  2039         try:
  2046         try:
  2040             submatch = matchmod.subdirmatcher(subpath, match)
  2047             submatch = matchmod.subdirmatcher(subpath, match)
  2041             subbad, subforgot = sub.forget(submatch, prefix, dryrun=dryrun)
  2048             subbad, subforgot = sub.forget(submatch, prefix,
       
  2049                                            dryrun=dryrun, confirm=confirm)
  2042             bad.extend([subpath + '/' + f for f in subbad])
  2050             bad.extend([subpath + '/' + f for f in subbad])
  2043             forgot.extend([subpath + '/' + f for f in subforgot])
  2051             forgot.extend([subpath + '/' + f for f in subforgot])
  2044         except error.LookupError:
  2052         except error.LookupError:
  2045             ui.status(_("skipping missing subrepository: %s\n")
  2053             ui.status(_("skipping missing subrepository: %s\n")
  2046                            % join(subpath))
  2054                            % join(subpath))
  2059                         ui.warn(_('not removing %s: '
  2067                         ui.warn(_('not removing %s: '
  2060                                   'file is already untracked\n')
  2068                                   'file is already untracked\n')
  2061                                 % match.rel(f))
  2069                                 % match.rel(f))
  2062                     bad.append(f)
  2070                     bad.append(f)
  2063 
  2071 
       
  2072     if confirm:
       
  2073         responses = _('[Ynsa?]'
       
  2074                       '$$ &Yes, forget this file'
       
  2075                       '$$ &No, skip this file'
       
  2076                       '$$ &Skip remaining files'
       
  2077                       '$$ Include &all remaining files'
       
  2078                       '$$ &? (display help)')
       
  2079         for filename in forget[:]:
       
  2080             r = ui.promptchoice(_('forget %s %s') % (filename, responses))
       
  2081             if r == 4: # ?
       
  2082                 while r == 4:
       
  2083                     for c, t in ui.extractchoices(responses)[1]:
       
  2084                         ui.write('%s - %s\n' % (c, encoding.lower(t)))
       
  2085                     r = ui.promptchoice(_('forget %s %s') % (filename,
       
  2086                                                                  responses))
       
  2087             if r == 0: # yes
       
  2088                 continue
       
  2089             elif r == 1: # no
       
  2090                 forget.remove(filename)
       
  2091             elif r == 2: # Skip
       
  2092                 fnindex = forget.index(filename)
       
  2093                 del forget[fnindex:]
       
  2094                 break
       
  2095             elif r == 3: # All
       
  2096                 break
       
  2097 
  2064     for f in forget:
  2098     for f in forget:
  2065         if ui.verbose or not match.exact(f):
  2099         if ui.verbose or not match.exact(f) or confirm:
  2066             ui.status(_('removing %s\n') % match.rel(f))
  2100             ui.status(_('removing %s\n') % match.rel(f))
  2067 
  2101 
  2068     if not dryrun:
  2102     if not dryrun:
  2069         rejected = wctx.forget(forget, prefix)
  2103         rejected = wctx.forget(forget, prefix)
  2070         bad.extend(f for f in rejected if f in match.files())
  2104         bad.extend(f for f in rejected if f in match.files())