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