Show More
@@ -228,6 +228,12 b' def convert(ui, src, dest=None, revmapfi' | |||||
228 | part of a changeset then the default may not be long enough. |
|
228 | part of a changeset then the default may not be long enough. | |
229 | The default is 60. |
|
229 | The default is 60. | |
230 |
|
230 | |||
|
231 | :convert.cvsps.logencoding: Specify encoding name to be used for | |||
|
232 | transcoding CVS log messages. Multiple encoding names can be | |||
|
233 | specified as a list (see :hg:`help config.Syntax`), but only | |||
|
234 | the first acceptable encoding in the list is used per CVS log | |||
|
235 | entries. This transcoding is executed before cvslog hook below. | |||
|
236 | ||||
231 | :convert.cvsps.mergeto: Specify a regular expression to which |
|
237 | :convert.cvsps.mergeto: Specify a regular expression to which | |
232 | commit log messages are matched. If a match occurs, then the |
|
238 | commit log messages are matched. If a match occurs, then the | |
233 | conversion process will insert a dummy revision merging the |
|
239 | conversion process will insert a dummy revision merging the |
@@ -12,6 +12,7 b' import re' | |||||
12 | from mercurial.i18n import _ |
|
12 | from mercurial.i18n import _ | |
13 | from mercurial import ( |
|
13 | from mercurial import ( | |
14 | encoding, |
|
14 | encoding, | |
|
15 | error, | |||
15 | hook, |
|
16 | hook, | |
16 | pycompat, |
|
17 | pycompat, | |
17 | util, |
|
18 | util, | |
@@ -491,6 +492,35 b' def createlog(ui, directory=None, root="' | |||||
491 |
|
492 | |||
492 | ui.status(_('%d log entries\n') % len(log)) |
|
493 | ui.status(_('%d log entries\n') % len(log)) | |
493 |
|
494 | |||
|
495 | encodings = ui.configlist('convert', 'cvsps.logencoding') | |||
|
496 | if encodings: | |||
|
497 | def revstr(r): | |||
|
498 | # this is needed, because logentry.revision is a tuple of "int" | |||
|
499 | # (e.g. (1, 2) for "1.2") | |||
|
500 | return '.'.join(pycompat.maplist(pycompat.bytestr, r)) | |||
|
501 | ||||
|
502 | for entry in log: | |||
|
503 | comment = entry.comment | |||
|
504 | for e in encodings: | |||
|
505 | try: | |||
|
506 | entry.comment = comment.decode(e).encode('utf-8') | |||
|
507 | if ui.debugflag: | |||
|
508 | ui.debug("transcoding by %s: %s of %s\n" % | |||
|
509 | (e, revstr(entry.revision), entry.file)) | |||
|
510 | break | |||
|
511 | except UnicodeDecodeError: | |||
|
512 | pass # try next encoding | |||
|
513 | except LookupError as inst: # unknown encoding, maybe | |||
|
514 | raise error.Abort(inst, | |||
|
515 | hint=_('check convert.cvsps.logencoding' | |||
|
516 | ' configuration')) | |||
|
517 | else: | |||
|
518 | raise error.Abort(_("no encoding can transcode" | |||
|
519 | " CVS log message for %s of %s") | |||
|
520 | % (revstr(entry.revision), entry.file), | |||
|
521 | hint=_('check convert.cvsps.logencoding' | |||
|
522 | ' configuration')) | |||
|
523 | ||||
494 | hook.hook(ui, None, "cvslog", True, log=log) |
|
524 | hook.hook(ui, None, "cvslog", True, log=log) | |
495 |
|
525 | |||
496 | return log |
|
526 | return log |
@@ -498,3 +498,157 b' update and verify the cvsps cache' | |||||
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 |
@@ -171,6 +171,12 b'' | |||||
171 | single changeset. When very large files were checked in as |
|
171 | single changeset. When very large files were checked in as | |
172 | part of a changeset then the default may not be long enough. |
|
172 | part of a changeset then the default may not be long enough. | |
173 | The default is 60. |
|
173 | The default is 60. | |
|
174 | convert.cvsps.logencoding | |||
|
175 | Specify encoding name to be used for transcoding CVS log | |||
|
176 | messages. Multiple encoding names can be specified as a list | |||
|
177 | (see 'hg help config.Syntax'), but only the first acceptable | |||
|
178 | encoding in the list is used per CVS log entries. This | |||
|
179 | transcoding is executed before cvslog hook below. | |||
174 | convert.cvsps.mergeto |
|
180 | convert.cvsps.mergeto | |
175 | Specify a regular expression to which commit log messages |
|
181 | Specify a regular expression to which commit log messages | |
176 | are matched. If a match occurs, then the conversion process |
|
182 | are matched. If a match occurs, then the conversion process |
General Comments 0
You need to be logged in to leave comments.
Login now