Mercurial > hg
comparison tests/test-convert-cvs.t @ 33388:0823f0983eaa
convert: transcode CVS log messages by specified encoding (issue5597)
Converting from CVS to Mercurial assumes that CVS log messages in "cvs
rlog" output are encoded in UTF-8 (or basic Latin-1). But cvs itself
is usually unaware of encoding of log messages, in practice.
Therefore, if there are commits, of which log message is encoded in
other than UTF-8, log message of corresponded revisions in the
converted repository will be broken.
To avoid such broken log messages, this patch transcodes CVS log
messages by encoding specified via "convert.cvsps.logencoding"
configuration.
This patch accepts multiple encoding for convenience, because
"multiple encoding mixed in a repository" easily occurs. For example,
UTF-8 (recent POSIX), cp932 (Windows), and EUC-JP (legacy POSIX) are
well known encoding for Japanese.
author | FUJIWARA Katsunori <foozy@lares.dti.ne.jp> |
---|---|
date | Tue, 11 Jul 2017 02:10:04 +0900 |
parents | 75e29fcc5a71 |
children | 24849d53697d |
comparison
equal
deleted
inserted
replaced
33387:68e9762a357b | 33388:0823f0983eaa |
---|---|
496 a:1.2->1.3 | 496 a:1.2->1.3 |
497 b/c:1.3->1.4(DEAD) | 497 b/c:1.3->1.4(DEAD) |
498 | 498 |
499 | 499 |
500 $ cd .. | 500 $ cd .. |
501 | |
502 Test transcoding CVS log messages (issue5597) | |
503 ============================================= | |
504 | |
505 To emulate commit messages in (non-ascii) multiple encodings portably, | |
506 this test scenario writes CVS history file (*,v file) directly via | |
507 python code. | |
508 | |
509 Commit messages of version 1.2 - 1.4 use u3042 in 3 encodings below. | |
510 | |
511 |encoding |byte sequence | decodable as: | | |
512 | | | utf-8 euc-jp cp932 | | |
513 +----------+--------------+--------------------+ | |
514 |utf-8 |\xe3\x81\x82 | o x x | | |
515 |euc-jp |\xa4\xa2 | x o o | | |
516 |cp932 |\x82\xa0 | x x o | | |
517 | |
518 $ mkdir -p cvsrepo/transcoding | |
519 $ python <<EOF | |
520 > fp = open('cvsrepo/transcoding/file,v', 'w') | |
521 > fp.write((''' | |
522 > head 1.4; | |
523 > access; | |
524 > symbols | |
525 > start:1.1.1.1 INITIAL:1.1.1; | |
526 > locks; strict; | |
527 > comment @# @; | |
528 > | |
529 > | |
530 > 1.4 | |
531 > date 2017.07.10.00.00.04; author nobody; state Exp; | |
532 > branches; | |
533 > next 1.3; | |
534 > commitid 10059635D016A510FFA; | |
535 > | |
536 > 1.3 | |
537 > date 2017.07.10.00.00.03; author nobody; state Exp; | |
538 > branches; | |
539 > next 1.2; | |
540 > commitid 10059635CFF6A4FF34E; | |
541 > | |
542 > 1.2 | |
543 > date 2017.07.10.00.00.02; author nobody; state Exp; | |
544 > branches; | |
545 > next 1.1; | |
546 > commitid 10059635CFD6A4D5095; | |
547 > | |
548 > 1.1 | |
549 > date 2017.07.10.00.00.01; author nobody; state Exp; | |
550 > branches | |
551 > 1.1.1.1; | |
552 > next ; | |
553 > commitid 10059635CFB6A4A3C33; | |
554 > | |
555 > 1.1.1.1 | |
556 > date 2017.07.10.00.00.01; author nobody; state Exp; | |
557 > branches; | |
558 > next ; | |
559 > commitid 10059635CFB6A4A3C33; | |
560 > | |
561 > | |
562 > desc | |
563 > @@ | |
564 > | |
565 > | |
566 > 1.4 | |
567 > log | |
568 > @''' + u'\u3042'.encode('cp932') + ''' (cp932) | |
569 > @ | |
570 > text | |
571 > @1 | |
572 > 2 | |
573 > 3 | |
574 > 4 | |
575 > @ | |
576 > | |
577 > | |
578 > 1.3 | |
579 > log | |
580 > @''' + u'\u3042'.encode('euc-jp') + ''' (euc-jp) | |
581 > @ | |
582 > text | |
583 > @d4 1 | |
584 > @ | |
585 > | |
586 > | |
587 > 1.2 | |
588 > log | |
589 > @''' + u'\u3042'.encode('utf-8') + ''' (utf-8) | |
590 > @ | |
591 > text | |
592 > @d3 1 | |
593 > @ | |
594 > | |
595 > | |
596 > 1.1 | |
597 > log | |
598 > @Initial revision | |
599 > @ | |
600 > text | |
601 > @d2 1 | |
602 > @ | |
603 > | |
604 > | |
605 > 1.1.1.1 | |
606 > log | |
607 > @import | |
608 > @ | |
609 > text | |
610 > @@ | |
611 > ''').lstrip()) | |
612 > EOF | |
613 | |
614 $ cvscall -q checkout transcoding | |
615 U transcoding/file | |
616 | |
617 Test converting in normal case | |
618 ------------------------------ | |
619 | |
620 (filtering by grep in order to check only form of debug messages) | |
621 | |
622 $ hg convert --config convert.cvsps.logencoding=utf-8,euc-jp,cp932 -q --debug transcoding transcoding-hg | grep 'transcoding by' | |
623 transcoding by utf-8: 1.1 of file | |
624 transcoding by utf-8: 1.1.1.1 of file | |
625 transcoding by utf-8: 1.2 of file | |
626 transcoding by euc-jp: 1.3 of file | |
627 transcoding by cp932: 1.4 of file | |
628 $ hg -R transcoding-hg --encoding utf-8 log -T "{rev}: {desc}\n" | |
629 5: update tags | |
630 4: import | |
631 3: \xe3\x81\x82 (cp932) (esc) | |
632 2: \xe3\x81\x82 (euc-jp) (esc) | |
633 1: \xe3\x81\x82 (utf-8) (esc) | |
634 0: Initial revision | |
635 $ rm -rf transcoding-hg | |
636 | |
637 Test converting in error cases | |
638 ------------------------------ | |
639 | |
640 unknown encoding in convert.cvsps.logencoding | |
641 | |
642 $ hg convert --config convert.cvsps.logencoding=foobar -q transcoding transcoding-hg | |
643 abort: unknown encoding: foobar | |
644 (check convert.cvsps.logencoding configuration) | |
645 [255] | |
646 $ rm -rf transcoding-hg | |
647 | |
648 no acceptable encoding in convert.cvsps.logencoding | |
649 | |
650 $ hg convert --config convert.cvsps.logencoding=utf-8,euc-jp -q transcoding transcoding-hg | |
651 abort: no encoding can transcode CVS log message for 1.4 of file | |
652 (check convert.cvsps.logencoding configuration) | |
653 [255] | |
654 $ rm -rf transcoding-hg |