Show More
@@ -2052,21 +2052,44 b' def forget(ui, repo, match, prefix, expl' | |||
|
2052 | 2052 | forgot.extend(forget) |
|
2053 | 2053 | return bad, forgot |
|
2054 | 2054 | |
|
2055 | def remove(ui, repo, m, after, force): | |
|
2055 | def remove(ui, repo, m, prefix, after, force, subrepos): | |
|
2056 | join = lambda f: os.path.join(prefix, f) | |
|
2056 | 2057 | ret = 0 |
|
2057 | 2058 | s = repo.status(match=m, clean=True) |
|
2058 | 2059 | modified, added, deleted, clean = s[0], s[1], s[3], s[6] |
|
2059 | 2060 | |
|
2061 | wctx = repo[None] | |
|
2062 | ||
|
2063 | if subrepos: | |
|
2064 | for subpath in sorted(wctx.substate): | |
|
2065 | sub = wctx.sub(subpath) | |
|
2066 | try: | |
|
2067 | submatch = matchmod.narrowmatcher(subpath, m) | |
|
2068 | if sub.removefiles(ui, submatch, prefix, after, force, | |
|
2069 | subrepos): | |
|
2070 | ret = 1 | |
|
2071 | except error.LookupError: | |
|
2072 | ui.status(_("skipping missing subrepository: %s\n") | |
|
2073 | % join(subpath)) | |
|
2074 | ||
|
2060 | 2075 | # warn about failure to delete explicit files/dirs |
|
2061 | wctx = repo[None] | |
|
2062 | 2076 | for f in m.files(): |
|
2063 | if f in repo.dirstate or f in wctx.dirs(): | |
|
2077 | def insubrepo(): | |
|
2078 | for subpath in wctx.substate: | |
|
2079 | if f.startswith(subpath): | |
|
2080 | return True | |
|
2081 | return False | |
|
2082 | ||
|
2083 | if f in repo.dirstate or f in wctx.dirs() or (subrepos and insubrepo()): | |
|
2064 | 2084 | continue |
|
2065 | if os.path.exists(m.rel(f)): | |
|
2066 |
|
|
|
2067 | ui.warn(_('not removing %s: no tracked files\n') % m.rel(f)) | |
|
2085 | ||
|
2086 | if os.path.exists(m.rel(join(f))): | |
|
2087 | if os.path.isdir(m.rel(join(f))): | |
|
2088 | ui.warn(_('not removing %s: no tracked files\n') | |
|
2089 | % m.rel(join(f))) | |
|
2068 | 2090 | else: |
|
2069 |
ui.warn(_('not removing %s: file is untracked\n') |
|
|
2091 | ui.warn(_('not removing %s: file is untracked\n') | |
|
2092 | % m.rel(join(f))) | |
|
2070 | 2093 | # missing files will generate a warning elsewhere |
|
2071 | 2094 | ret = 1 |
|
2072 | 2095 | |
@@ -2075,22 +2098,22 b' def remove(ui, repo, m, after, force):' | |||
|
2075 | 2098 | elif after: |
|
2076 | 2099 | list = deleted |
|
2077 | 2100 | for f in modified + added + clean: |
|
2078 | ui.warn(_('not removing %s: file still exists\n') % m.rel(f)) | |
|
2101 | ui.warn(_('not removing %s: file still exists\n') % m.rel(join(f))) | |
|
2079 | 2102 | ret = 1 |
|
2080 | 2103 | else: |
|
2081 | 2104 | list = deleted + clean |
|
2082 | 2105 | for f in modified: |
|
2083 | 2106 | ui.warn(_('not removing %s: file is modified (use -f' |
|
2084 | ' to force removal)\n') % m.rel(f)) | |
|
2107 | ' to force removal)\n') % m.rel(join(f))) | |
|
2085 | 2108 | ret = 1 |
|
2086 | 2109 | for f in added: |
|
2087 | 2110 | ui.warn(_('not removing %s: file has been marked for add' |
|
2088 | ' (use forget to undo)\n') % m.rel(f)) | |
|
2111 | ' (use forget to undo)\n') % m.rel(join(f))) | |
|
2089 | 2112 | ret = 1 |
|
2090 | 2113 | |
|
2091 | 2114 | for f in sorted(list): |
|
2092 | 2115 | if ui.verbose or not m.exact(f): |
|
2093 | ui.status(_('removing %s\n') % m.rel(f)) | |
|
2116 | ui.status(_('removing %s\n') % m.rel(join(f))) | |
|
2094 | 2117 | |
|
2095 | 2118 | wlock = repo.wlock() |
|
2096 | 2119 | try: |
@@ -5086,7 +5086,7 b' def recover(ui, repo):' | |||
|
5086 | 5086 | [('A', 'after', None, _('record delete for missing files')), |
|
5087 | 5087 | ('f', 'force', None, |
|
5088 | 5088 | _('remove (and delete) file even if added or modified')), |
|
5089 | ] + walkopts, | |
|
5089 | ] + subrepoopts + walkopts, | |
|
5090 | 5090 | _('[OPTION]... FILE...'), |
|
5091 | 5091 | inferrepo=True) |
|
5092 | 5092 | def remove(ui, repo, *pats, **opts): |
@@ -5131,7 +5131,8 b' def remove(ui, repo, *pats, **opts):' | |||
|
5131 | 5131 | raise util.Abort(_('no files specified')) |
|
5132 | 5132 | |
|
5133 | 5133 | m = scmutil.match(repo[None], pats, opts) |
|
5134 | return cmdutil.remove(ui, repo, m, after, force) | |
|
5134 | subrepos = opts.get('subrepos') | |
|
5135 | return cmdutil.remove(ui, repo, m, "", after, force, subrepos) | |
|
5135 | 5136 | |
|
5136 | 5137 | @command('rename|move|mv', |
|
5137 | 5138 | [('A', 'after', None, _('record a rename that has already occurred')), |
@@ -129,6 +129,10 b' Interaction with Mercurial Commands' | |||
|
129 | 129 | elements. Subversion subrepositories are currently silently |
|
130 | 130 | ignored. |
|
131 | 131 | |
|
132 | :remove: remove does not recurse into subrepositories unless | |
|
133 | -S/--subrepos is specified. Git and Subversion subrepositories | |
|
134 | are currently silently ignored. | |
|
135 | ||
|
132 | 136 | :update: update restores the subrepos in the state they were |
|
133 | 137 | originally committed in target changeset. If the recorded |
|
134 | 138 | changeset is not available in the current subrepository, Mercurial |
@@ -501,6 +501,13 b' class abstractsubrepo(object):' | |||
|
501 | 501 | def forget(self, ui, match, prefix): |
|
502 | 502 | return ([], []) |
|
503 | 503 | |
|
504 | def removefiles(self, ui, matcher, prefix, after, force, subrepos): | |
|
505 | """remove the matched files from the subrepository and the filesystem, | |
|
506 | possibly by force and/or after the file has been removed from the | |
|
507 | filesystem. Return 0 on success, 1 on any warning. | |
|
508 | """ | |
|
509 | return 1 | |
|
510 | ||
|
504 | 511 | def revert(self, ui, substate, *pats, **opts): |
|
505 | 512 | ui.warn('%s: reverting %s subrepos is unsupported\n' \ |
|
506 | 513 | % (substate[0], substate[2])) |
@@ -854,6 +861,12 b' class hgsubrepo(abstractsubrepo):' | |||
|
854 | 861 | os.path.join(prefix, self._path), True) |
|
855 | 862 | |
|
856 | 863 | @annotatesubrepoerror |
|
864 | def removefiles(self, ui, matcher, prefix, after, force, subrepos): | |
|
865 | return cmdutil.remove(ui, self._repo, matcher, | |
|
866 | os.path.join(prefix, self._path), after, force, | |
|
867 | subrepos) | |
|
868 | ||
|
869 | @annotatesubrepoerror | |
|
857 | 870 | def revert(self, ui, substate, *pats, **opts): |
|
858 | 871 | # reverting a subrepo is a 2 step process: |
|
859 | 872 | # 1. if the no_backup is not set, revert all modified |
@@ -210,7 +210,7 b' Show all commands + options' | |||
|
210 | 210 | merge: force, rev, preview, tool |
|
211 | 211 | pull: update, force, rev, bookmark, branch, ssh, remotecmd, insecure |
|
212 | 212 | push: force, rev, bookmark, branch, new-branch, ssh, remotecmd, insecure |
|
213 | remove: after, force, include, exclude | |
|
213 | remove: after, force, subrepos, include, exclude | |
|
214 | 214 | serve: accesslog, daemon, daemon-pipefds, errorlog, port, address, prefix, name, web-conf, webdir-conf, pid-file, stdio, cmdserver, templates, style, ipv6, certificate |
|
215 | 215 | status: all, modified, added, removed, deleted, clean, unknown, ignored, no-status, copies, print0, rev, change, include, exclude, subrepos, template |
|
216 | 216 | summary: remote |
@@ -1944,6 +1944,9 b' Dish up an empty repo; serve it cold.' | |||
|
1944 | 1944 | <tr><td>-f</td> |
|
1945 | 1945 | <td>--force</td> |
|
1946 | 1946 | <td>remove (and delete) file even if added or modified</td></tr> |
|
1947 | <tr><td>-S</td> | |
|
1948 | <td>--subrepos</td> | |
|
1949 | <td>recurse into subrepositories</td></tr> | |
|
1947 | 1950 | <tr><td>-I</td> |
|
1948 | 1951 | <td>--include PATTERN [+]</td> |
|
1949 | 1952 | <td>include names matching the given patterns</td></tr> |
@@ -110,6 +110,17 b' Check that deep archiving works' | |||
|
110 | 110 | $ hg ci -Sm "add test.txt" |
|
111 | 111 | committing subrepository sub1 |
|
112 | 112 | committing subrepository sub1/sub2 (glob) |
|
113 | ||
|
114 | .. but first take a detour through some deep removal testing | |
|
115 | ||
|
116 | $ hg remove -S -I 're:.*.txt' sub1 | |
|
117 | removing sub1/sub2/folder/test.txt (glob) | |
|
118 | removing sub1/sub2/test.txt (glob) | |
|
119 | $ hg status -S | |
|
120 | R sub1/sub2/folder/test.txt | |
|
121 | R sub1/sub2/test.txt | |
|
122 | $ hg update -Cq | |
|
123 | ||
|
113 | 124 | $ hg --config extensions.largefiles=! archive -S ../archive_all |
|
114 | 125 | $ find ../archive_all | sort |
|
115 | 126 | ../archive_all |
General Comments 0
You need to be logged in to leave comments.
Login now