Mercurial > hg
view tests/test-qrecord.t @ 44651:00e0c5c06ed5
pycompat: change argv conversion semantics
Use of os.fsencode() to convert Python's sys.argv back to bytes
was not correct because it isn't the logically inverse operation
from what CPython was doing under the hood.
This commit changes the logic for doing the str -> bytes
conversion. This required a separate implementation for
POSIX and Windows.
The Windows behavior is arguably not ideal. The previous
behavior on Windows was leading to failing tests, such as
test-http-branchmap.t, which defines a utf-8 branch name
via a command argument. Previously, Mercurial's argument
parser looked to be receiving wchar_t bytes in some cases.
After this commit, behavior on Windows is compatible with
Python 2, where CPython did not implement `int wmain()` and
Windows was performing a Unicode to ANSI conversion on the
wchar_t native command line.
Arguably better behavior on Windows would be for Mercurial to
preserve the original Unicode sequence coming from Python and
to wrap this in a bytes-like type so we can round trip safely.
But, this would be new, backwards incompatible behavior. My
goal for this commit was to converge Mercurial behavior on
Python 3 on Windows to fix busted tests. And I believe I was
successful, as this commit fixes 9 tests on my Windows
machine and 14 tests in the AWS CI environment!
Differential Revision: https://phab.mercurial-scm.org/D8337
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Sat, 28 Mar 2020 12:18:58 -0700 |
parents | f802a75da585 |
children | 21733e8c924f |
line wrap: on
line source
Create configuration $ echo "[ui]" >> $HGRCPATH $ echo "interactive=true" >> $HGRCPATH help record (no record) $ hg help record record extension - commands to interactively select changes for commit/qrefresh (DEPRECATED) The feature provided by this extension has been moved into core Mercurial as 'hg commit --interactive'. (use 'hg help extensions' for information on enabling extensions) help qrecord (no record) $ hg help qrecord 'qrecord' is provided by the following extension: record commands to interactively select changes for commit/qrefresh (DEPRECATED) (use 'hg help extensions' for information on enabling extensions) $ echo "[extensions]" >> $HGRCPATH $ echo "record=" >> $HGRCPATH help record (record) $ hg help record hg record [OPTION]... [FILE]... interactively select changes to commit If a list of files is omitted, all changes reported by 'hg status' will be candidates for recording. See 'hg help dates' for a list of formats valid for -d/--date. If using the text interface (see 'hg help config'), you will be prompted for whether to record changes to each modified file, and for files with multiple changes, for each change to use. For each query, the following responses are possible: y - record this change n - skip this change e - edit this change manually s - skip remaining changes to this file f - record remaining changes to this file d - done, skip remaining changes and files a - record all changes to all remaining files q - quit, recording no changes ? - display help This command is not available when committing a merge. (use 'hg help -e record' to show help for the record extension) options ([+] can be repeated): -A --addremove mark new/missing files as added/removed before committing --close-branch mark a branch head as closed --amend amend the parent of the working directory -s --secret use the secret phase for committing -e --edit invoke editor on commit messages -I --include PATTERN [+] include names matching the given patterns -X --exclude PATTERN [+] exclude names matching the given patterns -m --message TEXT use text as commit message -l --logfile FILE read commit message from file -d --date DATE record the specified date as commit date -u --user USER record the specified user as committer -S --subrepos recurse into subrepositories -w --ignore-all-space ignore white space when comparing lines -b --ignore-space-change ignore changes in the amount of white space -B --ignore-blank-lines ignore changes whose lines are all blank -Z --ignore-space-at-eol ignore changes in whitespace at EOL (some details hidden, use --verbose to show complete help) help (no mq, so no qrecord) $ hg help qrecord hg qrecord [OPTION]... PATCH [FILE]... interactively record a new patch See 'hg help qnew' & 'hg help record' for more information and usage. (some details hidden, use --verbose to show complete help) $ hg init a qrecord (mq not present) $ hg -R a qrecord hg qrecord: invalid arguments hg qrecord [OPTION]... PATCH [FILE]... interactively record a new patch (use 'hg qrecord -h' to show more help) [255] qrecord patch (mq not present) $ hg -R a qrecord patch abort: 'mq' extension not loaded [255] help (bad mq) $ echo "mq=nonexistent" >> $HGRCPATH $ hg help qrecord *** failed to import extension mq from nonexistent: [Errno *] * (glob) hg qrecord [OPTION]... PATCH [FILE]... interactively record a new patch See 'hg help qnew' & 'hg help record' for more information and usage. (some details hidden, use --verbose to show complete help) help (mq present) $ sed 's/mq=nonexistent/mq=/' $HGRCPATH > hgrc.tmp $ mv hgrc.tmp $HGRCPATH $ hg help qrecord hg qrecord [OPTION]... PATCH [FILE]... interactively record a new patch See 'hg help qnew' & 'hg help record' for more information and usage. options ([+] can be repeated): -e --edit invoke editor on commit messages -g --git use git extended diff format -U --currentuser add "From: <current user>" to patch -u --user USER add "From: <USER>" to patch -D --currentdate add "Date: <current date>" to patch -d --date DATE add "Date: <DATE>" to patch -I --include PATTERN [+] include names matching the given patterns -X --exclude PATTERN [+] exclude names matching the given patterns -m --message TEXT use text as commit message -l --logfile FILE read commit message from file -w --ignore-all-space ignore white space when comparing lines -b --ignore-space-change ignore changes in the amount of white space -B --ignore-blank-lines ignore changes whose lines are all blank -Z --ignore-space-at-eol ignore changes in whitespace at EOL --mq operate on patch repository (some details hidden, use --verbose to show complete help) $ cd a Base commit $ cat > 1.txt <<EOF > 1 > 2 > 3 > 4 > 5 > EOF $ cat > 2.txt <<EOF > a > b > c > d > e > f > EOF $ mkdir dir $ cat > dir/a.txt <<EOF > hello world > > someone > up > there > loves > me > EOF $ hg add 1.txt 2.txt dir/a.txt $ hg commit -m 'initial checkin' Changing files $ sed -e 's/2/2 2/;s/4/4 4/' 1.txt > 1.txt.new $ sed -e 's/b/b b/' 2.txt > 2.txt.new $ sed -e 's/hello world/hello world!/' dir/a.txt > dir/a.txt.new $ mv -f 1.txt.new 1.txt $ mv -f 2.txt.new 2.txt $ mv -f dir/a.txt.new dir/a.txt Whole diff $ hg diff --nodates diff -r 1057167b20ef 1.txt --- a/1.txt +++ b/1.txt @@ -1,5 +1,5 @@ 1 -2 +2 2 3 -4 +4 4 5 diff -r 1057167b20ef 2.txt --- a/2.txt +++ b/2.txt @@ -1,5 +1,5 @@ a -b +b b c d e diff -r 1057167b20ef dir/a.txt --- a/dir/a.txt +++ b/dir/a.txt @@ -1,4 +1,4 @@ -hello world +hello world! someone up qrecord with bad patch name, should abort before prompting $ hg qrecord .hg abort: patch name cannot begin with ".hg" [255] $ hg qrecord ' foo' abort: patch name cannot begin or end with whitespace [255] $ hg qrecord 'foo ' abort: patch name cannot begin or end with whitespace [255] qrecord a.patch $ hg qrecord -d '0 0' -m aaa a.patch <<EOF > y > y > n > y > y > n > EOF diff --git a/1.txt b/1.txt 2 hunks, 2 lines changed examine changes to '1.txt'? (enter ? for help) [Ynesfdaq?] y @@ -1,3 +1,3 @@ 1 -2 +2 2 3 record change 1/4 to '1.txt'? (enter ? for help) [Ynesfdaq?] y @@ -3,3 +3,3 @@ 3 -4 +4 4 5 record change 2/4 to '1.txt'? (enter ? for help) [Ynesfdaq?] n diff --git a/2.txt b/2.txt 1 hunks, 1 lines changed examine changes to '2.txt'? (enter ? for help) [Ynesfdaq?] y @@ -1,5 +1,5 @@ a -b +b b c d e record change 3/4 to '2.txt'? (enter ? for help) [Ynesfdaq?] y diff --git a/dir/a.txt b/dir/a.txt 1 hunks, 1 lines changed examine changes to 'dir/a.txt'? (enter ? for help) [Ynesfdaq?] n After qrecord a.patch 'tip'" $ hg tip -p changeset: 1:5d1ca63427ee tag: a.patch tag: qbase tag: qtip tag: tip user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: aaa diff -r 1057167b20ef -r 5d1ca63427ee 1.txt --- a/1.txt Thu Jan 01 00:00:00 1970 +0000 +++ b/1.txt Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +1,5 @@ 1 -2 +2 2 3 4 5 diff -r 1057167b20ef -r 5d1ca63427ee 2.txt --- a/2.txt Thu Jan 01 00:00:00 1970 +0000 +++ b/2.txt Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +1,5 @@ a -b +b b c d e After qrecord a.patch 'diff'" $ hg diff --nodates diff -r 5d1ca63427ee 1.txt --- a/1.txt +++ b/1.txt @@ -1,5 +1,5 @@ 1 2 2 3 -4 +4 4 5 diff -r 5d1ca63427ee dir/a.txt --- a/dir/a.txt +++ b/dir/a.txt @@ -1,4 +1,4 @@ -hello world +hello world! someone up qrecord b.patch $ hg qrecord -d '0 0' -m bbb b.patch <<EOF > y > y > y > y > EOF diff --git a/1.txt b/1.txt 1 hunks, 1 lines changed examine changes to '1.txt'? (enter ? for help) [Ynesfdaq?] y @@ -1,5 +1,5 @@ 1 2 2 3 -4 +4 4 5 record change 1/2 to '1.txt'? (enter ? for help) [Ynesfdaq?] y diff --git a/dir/a.txt b/dir/a.txt 1 hunks, 1 lines changed examine changes to 'dir/a.txt'? (enter ? for help) [Ynesfdaq?] y @@ -1,4 +1,4 @@ -hello world +hello world! someone up record change 2/2 to 'dir/a.txt'? (enter ? for help) [Ynesfdaq?] y After qrecord b.patch 'tip' $ hg tip -p changeset: 2:b056198bf878 tag: b.patch tag: qtip tag: tip user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: bbb diff -r 5d1ca63427ee -r b056198bf878 1.txt --- a/1.txt Thu Jan 01 00:00:00 1970 +0000 +++ b/1.txt Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +1,5 @@ 1 2 2 3 -4 +4 4 5 diff -r 5d1ca63427ee -r b056198bf878 dir/a.txt --- a/dir/a.txt Thu Jan 01 00:00:00 1970 +0000 +++ b/dir/a.txt Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +1,4 @@ -hello world +hello world! someone up After qrecord b.patch 'diff' $ hg diff --nodates $ cd .. qrecord should throw an error when histedit in process $ hg init issue5981 $ cd issue5981 $ cat >> $HGRCPATH <<EOF > [extensions] > histedit= > mq= > EOF $ echo > a $ hg ci -Am 'foo bar' adding a $ hg log changeset: 0:ea55e2ae468f tag: tip user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: foo bar $ hg histedit tip --commands - 2>&1 <<EOF > edit ea55e2ae468f foo bar > EOF 0 files updated, 0 files merged, 1 files removed, 0 files unresolved Editing (ea55e2ae468f), you may commit or record as needed now. (hg histedit --continue to resume) [1] $ echo 'foo bar' > a $ hg qrecord -d '0 0' -m aaa a.patch <<EOF > y > y > n > y > y > n > EOF abort: histedit in progress (use 'hg histedit --continue' or 'hg histedit --abort') [255]