Mercurial > hg
view tests/test-copy.t @ 52217:96b113d22b34 stable
rust-update: handle SIGINT from long-running update threads
The current code does not respond to ^C until after the Rust bit is finished
doing its work. This is expected, since Rust holds the GIL for the duration
of the call and does not call `PyErr_CheckSignals`. Freeing the GIL to do our
work does not really improve anything since the Rust threads are still going,
and the only way of cancelling a thread is by making it cooperate.
So we do the following:
- remember the SIGINT handler in hg-cpython and reset it after the call
into core (see inline comment in `update.rs` about this)
- make all update threads watch for a global `AtomicBool` being `true`,
and if so stop their work
- reset the global bool and exit early (i.e. before writing the dirstate)
- raise SIGINT from `hg-cpython` if update returns `InterruptReceived`
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Tue, 12 Nov 2024 12:52:13 +0100 |
parents | 2f2682f40ea0 |
children |
line wrap: on
line source
$ mkdir part1 $ cd part1 $ hg init $ echo a > a $ hg add a $ hg commit -m "1" $ hg status $ hg copy a b $ hg --config ui.portablefilenames=abort copy a con.xml abort: filename contains 'con', which is reserved on Windows: con.xml [10] $ hg status A b $ hg sum parent: 0:c19d34741b0a tip 1 branch: default commit: 1 copied update: (current) phases: 1 draft $ hg --debug commit -m "2" committing files: b b: copy a:b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 committing manifest committing changelog updating the branch cache committed changeset 1:93580a2c28a50a56f63526fb305067e6fbf739c4 we should see two history entries $ hg history -v changeset: 1:93580a2c28a5 tag: tip user: test date: Thu Jan 01 00:00:00 1970 +0000 files: b description: 2 changeset: 0:c19d34741b0a user: test date: Thu Jan 01 00:00:00 1970 +0000 files: a description: 1 we should see one log entry for a $ hg log a changeset: 0:c19d34741b0a user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: 1 this should show a revision linked to changeset 0 $ hg debugindex a rev linkrev nodeid p1-nodeid p2-nodeid 0 0 b789fdd96dc2 000000000000 000000000000 we should see one log entry for b $ hg log b changeset: 1:93580a2c28a5 tag: tip user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: 2 this should show a revision linked to changeset 1 $ hg debugindex b rev linkrev nodeid p1-nodeid p2-nodeid 0 1 37d9b5d994ea 000000000000 000000000000 this should show the rename information in the metadata $ hg debugdata b 0 | head -3 | tail -2 copy: a copyrev: b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 #if reporevlogstore $ md5sum.py .hg/store/data/b.i 44913824c8f5890ae218f9829535922e .hg/store/data/b.i #endif $ hg cat b > bsum $ md5sum.py bsum 60b725f10c9c85c70d97880dfe8191b3 bsum $ hg cat a > asum $ md5sum.py asum 60b725f10c9c85c70d97880dfe8191b3 asum $ hg verify -q $ cd .. $ mkdir part2 $ cd part2 $ hg init $ echo foo > foo should fail - foo is not managed $ hg mv foo bar foo: not copying - file is not managed abort: no files to copy (maybe you meant to use --after --at-rev=.) [10] $ hg st -A ? foo respects ui.relative-paths $ mkdir dir $ cd dir $ hg mv ../foo ../bar ../foo: not copying - file is not managed abort: no files to copy (maybe you meant to use --after --at-rev=.) [10] $ hg mv ../foo ../bar --config ui.relative-paths=yes ../foo: not copying - file is not managed abort: no files to copy (maybe you meant to use --after --at-rev=.) [10] $ hg mv ../foo ../bar --config ui.relative-paths=no foo: not copying - file is not managed abort: no files to copy (maybe you meant to use --after --at-rev=.) [10] $ cd .. $ rmdir dir $ hg add foo dry-run; print a warning that this is not a real copy; foo is added $ hg mv --dry-run foo bar foo has not been committed yet, so no copy data will be stored for bar. $ hg st -A A foo should print a warning that this is not a real copy; bar is added $ hg mv foo bar foo has not been committed yet, so no copy data will be stored for bar. $ hg st -A A bar should print a warning that this is not a real copy; foo is added $ hg cp bar foo bar has not been committed yet, so no copy data will be stored for foo. $ hg rm -f bar $ rm bar $ hg st -A A foo $ hg commit -m1 moving a missing file $ rm foo $ hg mv foo foo3 foo: deleted in working directory foo3 does not exist! $ hg up -qC . copy --after to a nonexistent target filename $ hg cp -A foo dummy foo: not recording copy - dummy does not exist [1] dry-run; should show that foo is clean $ hg copy --dry-run foo bar $ hg st -A C foo should show copy $ hg copy foo bar $ hg st -C A bar foo shouldn't show copy $ hg commit -m2 $ hg st -C should match $ hg debugindex foo rev linkrev nodeid p1-nodeid p2-nodeid 0 0 2ed2a3912a0b 000000000000 000000000000 $ hg debugrename bar bar renamed from foo:2ed2a3912a0b24502043eae84ee4b279c18b90dd $ echo bleah > foo $ echo quux > bar $ hg commit -m3 should not be renamed $ hg debugrename bar bar not renamed $ hg copy -f foo bar should show copy $ hg st -C M bar foo XXX: filtering lfilesrepo.status() in 3.3-rc causes the copy source to not be displayed. $ hg st -C --config extensions.largefiles= The fsmonitor extension is incompatible with the largefiles extension and has been disabled. (fsmonitor !) M bar foo $ hg commit -m3 should show no parents for tip $ hg debugindex bar rev linkrev nodeid p1-nodeid p2-nodeid 0 1 7711d36246cc 000000000000 000000000000 1 2 bdf70a2b8d03 7711d36246cc 000000000000 2 3 b2558327ea8d 000000000000 000000000000 should match $ hg debugindex foo rev linkrev nodeid p1-nodeid p2-nodeid 0 0 2ed2a3912a0b 000000000000 000000000000 1 2 dd12c926cf16 2ed2a3912a0b 000000000000 $ hg debugrename bar bar renamed from foo:dd12c926cf165e3eb4cf87b084955cb617221c17 should show no copies $ hg st -C note: since filelog based copy tracing only trace copy for new file, the copy information here is not displayed. $ hg status --copies --change . M bar They are a devel option to walk all file and fine this information anyway. $ hg status --copies --change . --config devel.copy-tracing.trace-all-files=yes M bar foo copy --after on an added file $ cp bar baz $ hg add baz $ hg cp -A bar baz $ hg st -C A baz bar foo was clean: $ hg st -AC foo C foo Trying to copy on top of an existing file fails, $ hg copy -A bar foo foo: not overwriting - file already committed ('hg copy --after --force' to replace the file by recording a copy) [1] same error without the --after, so the user doesn't have to go through two hints: $ hg copy bar foo foo: not overwriting - file already committed ('hg copy --force' to replace the file by recording a copy) [1] but it's considered modified after a copy --after --force $ hg copy -Af bar foo $ hg st -AC foo M foo bar The hint for a file that exists but is not in file history doesn't mention --force: $ touch xyzzy $ hg cp bar xyzzy xyzzy: not overwriting - file exists ('hg copy --after' to record the copy) [1] $ hg co -qC . $ rm baz xyzzy Test unmarking copy/rename of a single file # Set up by creating a copy $ hg cp bar baz # Test unmarking as copy a non-existent file $ hg copy --forget non-existent non-existent: $ENOENT$ $ hg rename --forget non-existent non-existent: $ENOENT$ # Test unmarking as copy an tracked but unrelated file $ hg copy --forget foo foo: not unmarking as copy - file is not marked as copied $ hg rename --forget foo foo: not unmarking as copy - file is not marked as copied # Test unmarking as copy a copy source $ hg copy --forget bar bar: not unmarking as copy - file is not marked as copied $ hg rename --forget bar bar: not unmarking as copy - file is not marked as copied # baz should still be marked as a copy $ hg st -C A baz bar # Test the normal case $ hg copy --forget baz $ hg st -C A baz $ rm bar $ hg rename --after bar baz $ hg st -C A baz bar R bar $ hg rename --forget baz $ hg st -C A baz R bar $ hg revert bar # Test unmarking as copy with matching an non-matching patterns $ hg cp bar baz --after $ hg copy --forget bar baz bar: not unmarking as copy - file is not marked as copied $ hg cp bar baz --after $ hg rename --forget bar baz bar: not unmarking as copy - file is not marked as copied $ hg st -C A baz # Test unmarking as copy with no exact matches $ hg cp bar baz --after $ hg copy --forget . $ hg st -C A baz $ hg cp bar baz --after $ hg st -C A baz bar $ hg rename --forget . $ hg st -C A baz $ hg forget baz $ rm baz Test unmarking copy of a directory $ mkdir dir $ echo foo > dir/foo $ echo bar > dir/bar $ hg add dir adding dir/bar adding dir/foo $ hg ci -m 'add dir/' $ hg cp dir dir2 copying dir/bar to dir2/bar copying dir/foo to dir2/foo $ touch dir2/untracked $ hg copy --forget dir2 $ hg st -C A dir2/bar A dir2/foo ? dir2/untracked # Clean up for next test $ hg forget dir2 removing dir2/bar removing dir2/foo $ rm -r dir2 Test uncopy on committed copies # Commit some copies $ hg cp bar baz $ hg cp bar qux $ hg ci -m copies $ hg st -C --change . A baz bar A qux bar $ base=$(hg log -r '.^' -T '{rev}') $ hg log -G -T '{rev}:{node|short} {desc}\n' -r $base: @ 5:a612dc2edfda copies | o 4:4800b1f1f38e add dir/ | ~ # Add a dirty change on top to show that it's unaffected $ echo dirty >> baz $ hg st M baz $ cat baz bleah dirty $ hg copy --forget --at-rev . baz saved backup bundle to $TESTTMP/part2/.hg/strip-backup/a612dc2edfda-e36b4448-uncopy.hg # The unwanted copy is no longer recorded, but the unrelated one is $ hg st -C --change . A baz A qux bar # The old commit is gone and we have updated to the new commit $ hg log -G -T '{rev}:{node|short} {desc}\n' -r $base: @ 5:c45090e5effe copies | o 4:4800b1f1f38e add dir/ | ~ # Working copy still has the uncommitted change $ hg st M baz $ cat baz bleah dirty $ cd ..