2187 This command schedules the files to be removed at the next commit. |
2187 This command schedules the files to be removed at the next commit. |
2188 This only removes files from the current branch, not from the |
2188 This only removes files from the current branch, not from the |
2189 entire project history. If the files still exist in the working |
2189 entire project history. If the files still exist in the working |
2190 directory, they will be deleted from it. If invoked with --after, |
2190 directory, they will be deleted from it. If invoked with --after, |
2191 files that have been manually deleted are marked as removed. |
2191 files that have been manually deleted are marked as removed. |
|
2192 |
|
2193 Modified files and added files are not removed by default. To |
|
2194 remove them, use the -f/--force option. |
2192 """ |
2195 """ |
2193 names = [] |
2196 names = [] |
2194 if not opts['after'] and not pats: |
2197 if not opts['after'] and not pats: |
2195 raise util.Abort(_('no files specified')) |
2198 raise util.Abort(_('no files specified')) |
2196 def okaytoremove(abs, rel, exact): |
2199 files, matchfn, anypats = matchpats(repo, pats, opts) |
2197 modified, added, removed, deleted, unknown = repo.changes(files=[abs]) |
2200 exact = dict.fromkeys(files) |
|
2201 mardu = map(dict.fromkeys, repo.changes(files=files, match=matchfn)) |
|
2202 modified, added, removed, deleted, unknown = mardu |
|
2203 remove, forget = [], [] |
|
2204 for src, abs, rel, exact in walk(repo, pats, opts): |
2198 reason = None |
2205 reason = None |
2199 if not deleted and opts['after']: |
2206 if abs not in deleted and opts['after']: |
2200 reason = _('is still present') |
2207 reason = _('is still present') |
2201 elif modified and not opts['force']: |
2208 elif abs in modified and not opts['force']: |
2202 reason = _('is modified') |
2209 reason = _('is modified (use -f to force removal)') |
2203 elif added: |
2210 elif abs in added: |
2204 reason = _('has been marked for add') |
2211 if opts['force']: |
2205 elif unknown: |
2212 forget.append(abs) |
|
2213 continue |
|
2214 reason = _('has been marked for add (use -f to force removal)') |
|
2215 elif abs in unknown: |
2206 reason = _('is not managed') |
2216 reason = _('is not managed') |
2207 elif removed: |
2217 elif abs in removed: |
2208 return False |
2218 continue |
2209 if reason: |
2219 if reason: |
2210 if exact: |
2220 if exact: |
2211 ui.warn(_('not removing %s: file %s\n') % (rel, reason)) |
2221 ui.warn(_('not removing %s: file %s\n') % (rel, reason)) |
2212 else: |
2222 else: |
2213 return True |
|
2214 for src, abs, rel, exact in walk(repo, pats, opts): |
|
2215 if okaytoremove(abs, rel, exact): |
|
2216 if ui.verbose or not exact: |
2223 if ui.verbose or not exact: |
2217 ui.status(_('removing %s\n') % rel) |
2224 ui.status(_('removing %s\n') % rel) |
2218 names.append(abs) |
2225 remove.append(abs) |
2219 repo.remove(names, unlink=not opts['after']) |
2226 repo.forget(forget) |
|
2227 repo.remove(remove, unlink=not opts['after']) |
2220 |
2228 |
2221 def rename(ui, repo, *pats, **opts): |
2229 def rename(ui, repo, *pats, **opts): |
2222 """rename files; equivalent of copy + remove |
2230 """rename files; equivalent of copy + remove |
2223 |
2231 |
2224 Mark dest as copies of sources; mark sources for deletion. If |
2232 Mark dest as copies of sources; mark sources for deletion. If |