Mercurial > public > mercurial-scm > hg
diff hgext/purge.py @ 39463:7fea205fd5dc
merge: move purge logic from extension
Working directory purging feels like functionality that should be
in core rather than in an extension.
This commit effectively moves the core purging logic from the
purge extension to merge.py.
Code was refactored slightly. Rather than deal with printing in
this function, the function is a generator of paths and the caller
can worry about printing.
Differential Revision: https://phab.mercurial-scm.org/D4477
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Thu, 06 Sep 2018 18:30:12 -0700 |
parents | 5a3f8da663e5 |
children | c303d65d2e34 |
line wrap: on
line diff
--- a/hgext/purge.py Thu Sep 06 23:37:24 2018 -0400 +++ b/hgext/purge.py Thu Sep 06 18:30:12 2018 -0700 @@ -25,16 +25,13 @@ '''command to delete untracked files from the working directory''' from __future__ import absolute_import -import os - from mercurial.i18n import _ from mercurial import ( cmdutil, - error, + merge as mergemod, pycompat, registrar, scmutil, - util, ) cmdtable = {} @@ -86,44 +83,28 @@ option. ''' opts = pycompat.byteskwargs(opts) + act = not opts.get('print') eol = '\n' if opts.get('print0'): eol = '\0' act = False # --print0 implies --print + removefiles = opts.get('files') removedirs = opts.get('dirs') + if not removefiles and not removedirs: removefiles = True removedirs = True - def remove(remove_func, name): - if act: - try: - remove_func(repo.wjoin(name)) - except OSError: - m = _('%s cannot be removed') % name - if opts.get('abort_on_err'): - raise error.Abort(m) - ui.warn(_('warning: %s\n') % m) - else: - ui.write('%s%s' % (name, eol)) + match = scmutil.match(repo[None], dirs, opts) - match = scmutil.match(repo[None], dirs, opts) - if removedirs: - directories = [] - match.explicitdir = match.traversedir = directories.append - status = repo.status(match=match, ignored=opts.get('all'), unknown=True) + paths = mergemod.purge( + repo, match, ignored=opts.get('all', False), + removeemptydirs=removedirs, removefiles=removefiles, + abortonerror=opts.get('abort_on_err'), + noop=not act) - if removefiles: - for f in sorted(status.unknown + status.ignored): - if act: - ui.note(_('removing file %s\n') % f) - remove(util.unlink, f) - - if removedirs: - for f in sorted(directories, reverse=True): - if match(f) and not os.listdir(repo.wjoin(f)): - if act: - ui.note(_('removing directory %s\n') % f) - remove(os.rmdir, f) + for path in paths: + if not act: + ui.write('%s%s' % (path, eol))