Show More
@@ -1410,12 +1410,15 b' def openrevlog(repo, cmd, file_, opts):' | |||||
1410 |
|
1410 | |||
1411 |
|
1411 | |||
1412 | def copy(ui, repo, pats, opts, rename=False): |
|
1412 | def copy(ui, repo, pats, opts, rename=False): | |
|
1413 | check_incompatible_arguments(opts, b'forget', [b'dry_run']) | |||
|
1414 | ||||
1413 | # called with the repo lock held |
|
1415 | # called with the repo lock held | |
1414 | # |
|
1416 | # | |
1415 | # hgsep => pathname that uses "/" to separate directories |
|
1417 | # hgsep => pathname that uses "/" to separate directories | |
1416 | # ossep => pathname that uses os.sep to separate directories |
|
1418 | # ossep => pathname that uses os.sep to separate directories | |
1417 | cwd = repo.getcwd() |
|
1419 | cwd = repo.getcwd() | |
1418 | targets = {} |
|
1420 | targets = {} | |
|
1421 | forget = opts.get(b"forget") | |||
1419 | after = opts.get(b"after") |
|
1422 | after = opts.get(b"after") | |
1420 | dryrun = opts.get(b"dry_run") |
|
1423 | dryrun = opts.get(b"dry_run") | |
1421 | ctx = repo[None] |
|
1424 | ctx = repo[None] | |
@@ -1423,6 +1426,24 b' def copy(ui, repo, pats, opts, rename=Fa' | |||||
1423 |
|
1426 | |||
1424 | uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True) |
|
1427 | uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True) | |
1425 |
|
1428 | |||
|
1429 | if forget: | |||
|
1430 | match = scmutil.match(wctx, pats, opts) | |||
|
1431 | ||||
|
1432 | current_copies = wctx.p1copies() | |||
|
1433 | current_copies.update(wctx.p2copies()) | |||
|
1434 | ||||
|
1435 | for f in wctx.walk(match): | |||
|
1436 | if f in current_copies: | |||
|
1437 | wctx[f].markcopied(None) | |||
|
1438 | elif match.exact(f): | |||
|
1439 | ui.warn( | |||
|
1440 | _( | |||
|
1441 | b'%s: not unmarking as copy - file is not marked as copied\n' | |||
|
1442 | ) | |||
|
1443 | % uipathfn(f) | |||
|
1444 | ) | |||
|
1445 | return | |||
|
1446 | ||||
1426 | def walkpat(pat): |
|
1447 | def walkpat(pat): | |
1427 | srcs = [] |
|
1448 | srcs = [] | |
1428 | m = scmutil.match(ctx, [pat], opts, globbed=True) |
|
1449 | m = scmutil.match(ctx, [pat], opts, globbed=True) |
@@ -2309,6 +2309,7 b' def continuecmd(ui, repo, **opts):' | |||||
2309 | @command( |
|
2309 | @command( | |
2310 | b'copy|cp', |
|
2310 | b'copy|cp', | |
2311 | [ |
|
2311 | [ | |
|
2312 | (b'', b'forget', None, _(b'unmark a file as copied')), | |||
2312 | (b'A', b'after', None, _(b'record a copy that has already occurred')), |
|
2313 | (b'A', b'after', None, _(b'record a copy that has already occurred')), | |
2313 | ( |
|
2314 | ( | |
2314 | b'f', |
|
2315 | b'f', | |
@@ -2333,8 +2334,11 b' def copy(ui, repo, *pats, **opts):' | |||||
2333 | exist in the working directory. If invoked with -A/--after, the |
|
2334 | exist in the working directory. If invoked with -A/--after, the | |
2334 | operation is recorded, but no copying is performed. |
|
2335 | operation is recorded, but no copying is performed. | |
2335 |
|
2336 | |||
2336 | This command takes effect with the next commit. To undo a copy |
|
2337 | To undo marking a file as copied, use --forget. With that option, | |
2337 | before that, see :hg:`revert`. |
|
2338 | all given (positional) arguments are unmarked as copies. The destination | |
|
2339 | file(s) will be left in place (still tracked). | |||
|
2340 | ||||
|
2341 | This command takes effect with the next commit. | |||
2338 |
|
2342 | |||
2339 | Returns 0 on success, 1 if errors are encountered. |
|
2343 | Returns 0 on success, 1 if errors are encountered. | |
2340 | """ |
|
2344 | """ |
@@ -12,6 +12,8 b'' | |||||
12 | commits that are being merged, when there are conflicts. Also works |
|
12 | commits that are being merged, when there are conflicts. Also works | |
13 | for conflicts caused by e.g. `hg graft`. |
|
13 | for conflicts caused by e.g. `hg graft`. | |
14 |
|
14 | |||
|
15 | * `hg copy --forget` can be used to unmark a file as copied. | |||
|
16 | ||||
15 |
|
17 | |||
16 | == New Experimental Features == |
|
18 | == New Experimental Features == | |
17 |
|
19 |
@@ -257,7 +257,7 b' Show all commands + options' | |||||
257 | commit: addremove, close-branch, amend, secret, edit, force-close-branch, interactive, include, exclude, message, logfile, date, user, subrepos |
|
257 | commit: addremove, close-branch, amend, secret, edit, force-close-branch, interactive, include, exclude, message, logfile, date, user, subrepos | |
258 | config: untrusted, edit, local, global, template |
|
258 | config: untrusted, edit, local, global, template | |
259 | continue: dry-run |
|
259 | continue: dry-run | |
260 | copy: after, force, include, exclude, dry-run |
|
260 | copy: forget, after, force, include, exclude, dry-run | |
261 | debugancestor: |
|
261 | debugancestor: | |
262 | debugapplystreamclonebundle: |
|
262 | debugapplystreamclonebundle: | |
263 | debugbuilddag: mergeable-file, overwritten-file, new-file |
|
263 | debugbuilddag: mergeable-file, overwritten-file, new-file |
@@ -262,5 +262,62 b' mention --force:' | |||||
262 | xyzzy: not overwriting - file exists |
|
262 | xyzzy: not overwriting - file exists | |
263 | ('hg copy --after' to record the copy) |
|
263 | ('hg copy --after' to record the copy) | |
264 | [1] |
|
264 | [1] | |
|
265 | $ hg co -qC . | |||
|
266 | $ rm baz xyzzy | |||
|
267 | ||||
|
268 | ||||
|
269 | Test unmarking copy of a single file | |||
|
270 | ||||
|
271 | # Set up by creating a copy | |||
|
272 | $ hg cp bar baz | |||
|
273 | # Test uncopying a non-existent file | |||
|
274 | $ hg copy --forget non-existent | |||
|
275 | non-existent: $ENOENT$ | |||
|
276 | # Test uncopying an tracked but unrelated file | |||
|
277 | $ hg copy --forget foo | |||
|
278 | foo: not unmarking as copy - file is not marked as copied | |||
|
279 | # Test uncopying a copy source | |||
|
280 | $ hg copy --forget bar | |||
|
281 | bar: not unmarking as copy - file is not marked as copied | |||
|
282 | # baz should still be marked as a copy | |||
|
283 | $ hg st -C | |||
|
284 | A baz | |||
|
285 | bar | |||
|
286 | # Test the normal case | |||
|
287 | $ hg copy --forget baz | |||
|
288 | $ hg st -C | |||
|
289 | A baz | |||
|
290 | # Test uncopy with matching an non-matching patterns | |||
|
291 | $ hg cp bar baz --after | |||
|
292 | $ hg copy --forget bar baz | |||
|
293 | bar: not unmarking as copy - file is not marked as copied | |||
|
294 | $ hg st -C | |||
|
295 | A baz | |||
|
296 | # Test uncopy with no exact matches | |||
|
297 | $ hg cp bar baz --after | |||
|
298 | $ hg copy --forget . | |||
|
299 | $ hg st -C | |||
|
300 | A baz | |||
|
301 | $ hg forget baz | |||
|
302 | $ rm baz | |||
|
303 | ||||
|
304 | Test unmarking copy of a directory | |||
|
305 | ||||
|
306 | $ mkdir dir | |||
|
307 | $ echo foo > dir/foo | |||
|
308 | $ echo bar > dir/bar | |||
|
309 | $ hg add dir | |||
|
310 | adding dir/bar | |||
|
311 | adding dir/foo | |||
|
312 | $ hg ci -m 'add dir/' | |||
|
313 | $ hg cp dir dir2 | |||
|
314 | copying dir/bar to dir2/bar | |||
|
315 | copying dir/foo to dir2/foo | |||
|
316 | $ touch dir2/untracked | |||
|
317 | $ hg copy --forget dir2 | |||
|
318 | $ hg st -C | |||
|
319 | A dir2/bar | |||
|
320 | A dir2/foo | |||
|
321 | ? dir2/untracked | |||
265 |
|
322 | |||
266 |
$ |
|
323 | $ cd .. |
General Comments 0
You need to be logged in to leave comments.
Login now