Mercurial > public > mercurial-scm > hg-stable
diff mercurial/commands.py @ 6346:8e3b651382f5
improved semantics for remove (issue438)
- Added files are never deleted (only removed with --force).
- Modified files can only be removed with --force.
- With --after, only deleted files are removed.
- With --after --force, all files are removed but not deleted.
author | Dirkjan Ochtman <dirkjan@ochtman.nl> |
---|---|
date | Sat, 22 Mar 2008 10:07:49 +0100 |
parents | 4b0c9c674707 |
children | 3b42f7ac6916 |
line wrap: on
line diff
--- a/mercurial/commands.py Fri Mar 21 17:22:47 2008 -0500 +++ b/mercurial/commands.py Sat Mar 22 10:07:49 2008 +0100 @@ -2127,51 +2127,74 @@ Schedule the indicated files for removal from the repository. - This only removes files from the current branch, not from the - entire project history. If the files still exist in the working - directory, they will be deleted from it. If invoked with --after, - files are marked as removed, but not actually unlinked unless --force - is also given. Without exact file names, --after will only mark - files as removed if they are no longer in the working directory. + This only removes files from the current branch, not from the entire + project history. -A can be used to remove only files that have already + been deleted, -f can be used to force deletion, and -Af can be used + to remove files from the next revision without deleting them. + + The following table details the behavior of remove for different file + states (columns) and option combinations (rows). The file states are + Added, Clean, Modified and Missing (as reported by hg status). The + actions are Warn, Remove (from branch) and Delete (from disk). + + A C M ! + none W RD W R + -f R RD RD R + -A W W W R + -Af R R R R This command schedules the files to be removed at the next commit. To undo a remove before that, see hg revert. - - Modified files and added files are not removed by default. To - remove them, use the -f/--force option. """ - if not opts['after'] and not pats: + + after, force = opts.get('after'), opts.get('force') + if not pats and not after: raise util.Abort(_('no files specified')) + files, matchfn, anypats = cmdutil.matchpats(repo, pats, opts) - exact = dict.fromkeys(files) mardu = map(dict.fromkeys, repo.status(files=files, match=matchfn))[:5] modified, added, removed, deleted, unknown = mardu + remove, forget = [], [] for src, abs, rel, exact in cmdutil.walk(repo, pats, opts): + reason = None - if abs in modified and not opts['force']: - reason = _('is modified (use -f to force removal)') + if abs in removed or abs in unknown: + continue + + # last column + elif abs in deleted: + remove.append(abs) + + # rest of the third row + elif after and not force: + reason = _('still exists (use -f to force removal)') + + # rest of the first column elif abs in added: - if opts['force']: + if not force: + reason = _('has been marked for add (use -f to force removal)') + else: forget.append(abs) - continue - reason = _('has been marked for add (use -f to force removal)') - exact = 1 # force the message - elif abs not in repo.dirstate: - reason = _('is not managed') - elif opts['after'] and not exact and abs not in deleted: - continue - elif abs in removed: - continue + + # rest of the third column + elif abs in modified: + if not force: + reason = _('is modified (use -f to force removal)') + else: + remove.append(abs) + + # rest of the second column + elif not reason: + remove.append(abs) + if reason: - if exact: - ui.warn(_('not removing %s: file %s\n') % (rel, reason)) - else: - if ui.verbose or not exact: - ui.status(_('removing %s\n') % rel) - remove.append(abs) + ui.warn(_('not removing %s: file %s\n') % (rel, reason)) + elif ui.verbose or not exact: + ui.status(_('removing %s\n') % rel) + repo.forget(forget) - repo.remove(remove, unlink=opts['force'] or not opts['after']) + repo.remove(remove, unlink=not after) def rename(ui, repo, *pats, **opts): """rename files; equivalent of copy + remove @@ -3125,8 +3148,9 @@ "recover": (recover, [], _('hg recover')), "^remove|rm": (remove, - [('A', 'after', None, _('record remove without deleting')), - ('f', 'force', None, _('remove file even if modified')), + [('A', 'after', None, _('record delete for missing files')), + ('f', 'force', None, + _('remove (and delete) file even if added or modified')), ] + walkopts, _('hg remove [OPTION]... FILE...')), "rename|mv":