# # # patch "lib/perl/AdvancedFind.pm" # from [007f51112d0a3c7ddd3d83296e4c20ccc83d787f] # to [7d0fd856253caa4a8695f5146b6f6b6789152f62] # # patch "lib/perl/ChangeLog.pm" # from [7f686b86117a13765a84b848a4214128a1e31619] # to [dcade0e7ee92448a0bfce3fd99d5b07420ce8143] # # patch "lib/perl/ComboAutoCompletion.pm" # from [323da650715093941315ee15bec38e5bff75a3cf] # to [38a470261a5e3c09c65d0338363ffff1b2646964] # # patch "lib/perl/FindText.pm" # from [e18da3120fb9b9a586fd0bde9e3a14cadf5e2771] # to [8217af59aa6902d58032e1067cd2faf23509a628] # # patch "mtn-browse" # from [583eaaeaa5e61aa39763208a3c4ffbb4e98f9cd7] # to [73563a28d9c4762e290caaa6a335f8e50c998fdd] # ============================================================ --- lib/perl/AdvancedFind.pm 007f51112d0a3c7ddd3d83296e4c20ccc83d787f +++ lib/perl/AdvancedFind.pm 7d0fd856253caa4a8695f5146b6f6b6789152f62 @@ -846,7 +846,8 @@ sub update_advanced_find_state($$) $advanced_find->{branch_comboboxentry}->get_model()->clear(); foreach my $branch (@branch_list) { - $advanced_find->{branch_comboboxentry}->append_text($branch); + $advanced_find->{branch_comboboxentry}-> + append_text(decode_utf8($branch)); if (($counter % 10) == 0) { $advanced_find->{appbar}->set_progress_percentage @@ -858,7 +859,8 @@ sub update_advanced_find_state($$) $advanced_find->{appbar}->set_progress_percentage(1); $wm->update_gui(); $advanced_find->{branch_comboboxentry}->child()-> - set_text($advanced_find->{branch_combo_details}->{value}); + set_text(decode_utf8($advanced_find->{branch_combo_details}-> + {value})); $advanced_find->{appbar}->set_progress_percentage(0); $advanced_find->{appbar}->set_status(""); $wm->update_gui(); @@ -910,7 +912,8 @@ sub update_advanced_find_state($$) $advanced_find->{revision_comboboxentry}->get_model()->clear(); foreach my $revision (@revision_list) { - $advanced_find->{revision_comboboxentry}->append_text($revision); + $advanced_find->{revision_comboboxentry}-> + append_text(decode_utf8($revision)); if (($counter % 10) == 0) { $advanced_find->{appbar}->set_progress_percentage @@ -922,7 +925,8 @@ sub update_advanced_find_state($$) $advanced_find->{appbar}->set_progress_percentage(1); $wm->update_gui(); $advanced_find->{revision_comboboxentry}->child()-> - set_text($advanced_find->{revision_combo_details}->{value}); + set_text(decode_utf8($advanced_find->{revision_combo_details}-> + {value})); $advanced_find->{appbar}->set_progress_percentage(0); $advanced_find->{appbar}->set_status(""); $wm->update_gui(); @@ -985,7 +989,8 @@ sub update_advanced_find_state($$) die("Bad query"); }); eval { - $advanced_find->{mtn}->select(address@hidden, $query); + $advanced_find->{mtn}->select(address@hidden, + encode_utf8($query)); $matches = scalar(@revision_ids); }; $err = $@; @@ -1121,9 +1126,9 @@ sub update_advanced_find_state($$) $advanced_find->{revisions_liststore}-> set($advanced_find->{revisions_liststore}->append(), AFLS_REVISION_ID_COLUMN, $item->{revision_id}, - AFLS_BRANCH_COLUMN, $branch, + AFLS_BRANCH_COLUMN, decode_utf8($branch), AFLS_DATE_COLUMN, $item->{date}, - AFLS_AUTHOR_COLUMN, $item->{author}); + AFLS_AUTHOR_COLUMN, decode_utf8($item->{author})); } } ============================================================ --- lib/perl/ChangeLog.pm 7f686b86117a13765a84b848a4214128a1e31619 +++ lib/perl/ChangeLog.pm dcade0e7ee92448a0bfce3fd99d5b07420ce8143 @@ -197,6 +197,9 @@ sub generate_revision_report($$$$;$) # Certs. + # Find the maximum cert name length, for padding purposes (ignoring + # changelog certs as these are handled separately). + $cert_max_len = 0; foreach my $cert (@$certs_list) { @@ -204,35 +207,61 @@ sub generate_revision_report($$$$;$) if ($cert->{name} ne "changelog" && length($cert->{name}) > $cert_max_len); } + + # Process each cert in turn. + foreach my $cert (@$certs_list) { + + # Collect all changelog certs together for output as one collection + # after the other certs. + if ($cert->{name} eq "changelog") { my $change_log = $cert->{value}; $change_log =~ s/\s+$//s; + $change_log = decode_utf8($change_log); push(@change_logs, $change_log) if ($change_log ne ""); } else { + + # All other remaining certs. + + # Format date values so that they look nice. + if ($cert->{name} eq "date") { $cert->{value} =~ s/T/ /; } + + # Otherwise if the cert value contains newline characters then + # indent subsequent lines so as to match the first line. + elsif (index($cert->{value}, "\n") >= 0) { my $padding = sprintf("\n%-*s", $cert_max_len + 2, ""); $cert->{value} =~ s/\n/$padding/g; } + + # Print out the cert's name. + $text_buffer->insert_with_tags_by_name ($text_buffer->get_end_iter(), sprintf("\n%-*s ", - $cert_max_len + 1, ucfirst($cert->{name}) . ":"), + $cert_max_len + 1, + ucfirst(decode_utf8($cert->{name})) . ":"), $bold); + + # Print out the cert's value. + $text_buffer->insert_with_tags_by_name ($text_buffer->get_end_iter(), - sprintf("%s", $cert->{value}), + sprintf("%s", decode_utf8($cert->{value})), $normal); + } + } # Change log(s). @@ -273,39 +302,44 @@ sub generate_revision_report($$$$;$) { if ($change->{type} eq "add_dir") { - push(@{$revision_data{$__added}}, $change->{name} . "/"); + push(@{$revision_data{$__added}}, + decode_utf8($change->{name}) . "/"); } elsif ($change->{type} eq "add_file") { - push(@{$revision_data{$__added}}, $change->{name}); + push(@{$revision_data{$__added}}, + decode_utf8($change->{name})); } elsif ($change->{type} eq "delete") { - push(@{$revision_data{$__removed}}, $change->{name}); + push(@{$revision_data{$__removed}}, + decode_utf8($change->{name})); } elsif ($change->{type} eq "patch") { - push(@{$revision_data{$__changed}}, $change->{name}); + push(@{$revision_data{$__changed}}, + decode_utf8($change->{name})); } elsif ($change->{type} eq "rename") { push(@{$revision_data{$__renamed}}, - $change->{from_name} . " -> " . $change->{to_name}); + decode_utf8($change->{from_name}) . " -> " + . decode_utf8($change->{to_name})); } elsif ($change->{type} eq "clear") { push(@{$revision_data{$__attributes}}, __x("{name}: {attribute} was cleared", - name => $change->{name}, - attribute => $change->{attribute})); + name => decode_utf8($change->{name}), + attribute => decode_utf8($change->{attribute}))); } elsif ($change->{type} eq "set") { push(@{$revision_data{$__attributes}}, sprintf("%s: %s = %s", - $change->{name}, - $change->{attribute}, - $change->{value})); + decode_utf8($change->{name}), + decode_utf8($change->{attribute}), + decode_utf8($change->{value}))); } elsif ($change->{type} eq "old_revision") { ============================================================ --- lib/perl/ComboAutoCompletion.pm 323da650715093941315ee15bec38e5bff75a3cf +++ lib/perl/ComboAutoCompletion.pm 38a470261a5e3c09c65d0338363ffff1b2646964 @@ -110,7 +110,7 @@ sub comboboxentry_changed_cb($$) # So, put simply, only do something inside this callback if the value is a # direct match to one in our list. - $value = $widget->child()->get_text(); + $value = encode_utf8($widget->child()->get_text()); foreach $item (@{$combo_details->{list}}) { if ($value eq $item) @@ -202,7 +202,7 @@ sub comboboxentry_key_release_event_cb($ $complete = 0; $old_complete = $combo_details->{complete}; $old_value = $combo_details->{value}; - $value = $entry->get_text(); + $value = encode_utf8($entry->get_text()); if ($value ne $old_value) { @@ -241,7 +241,7 @@ sub comboboxentry_key_release_event_cb($ { $instance->{appbar}->push(__x("Invalid {name} name `{value}'", name => $name, - value => $value)); + value => decode_utf8($value))); } $value = $completion; $len = length($value); @@ -263,7 +263,7 @@ sub comboboxentry_key_release_event_cb($ $combo->get_model()->clear(); foreach $item (@{$combo_details->{list}}) { - $combo->append_text($item) + $combo->append_text(decode_utf8($item)) if ($value eq substr($item, 0, $len)); # The following check is needed in the case when the user is ============================================================ --- lib/perl/FindText.pm e18da3120fb9b9a586fd0bde9e3a14cadf5e2771 +++ lib/perl/FindText.pm 8217af59aa6902d58032e1067cd2faf23509a628 @@ -373,49 +373,44 @@ sub find_text_button_clicked_cb($$) $use_regexp = $instance->{regular_expression_checkbutton}->get_active(); # Precompile the regular expression based upon the search term. When the - # user themselves is using regular expressions then check for errors. Also - # use the bytes pragma as $search_term could potentially be used against - # binary data. + # user themselves is using regular expressions then check for errors. + if ($use_regexp) { - use bytes; - if ($use_regexp) + eval { - eval + if ($case_sensitive) { - if ($case_sensitive) - { - $expr = qr/$search_term/; - } - else - { - $expr = qr/$search_term/i; - } - }; - if ($@ ne "") + $expr = qr/$search_term/; + } + else { - my $dialog = Gtk2::MessageDialog->new - ($instance->{window}, - ["modal"], - "warning", - "close", - __x("`{pattern}' is an invalid\ncontent search pattern.", - pattern => $search_term)); - $dialog->run(); - $dialog->destroy(); - return; + $expr = qr/$search_term/i; } + }; + if ($@ ne "") + { + my $dialog = Gtk2::MessageDialog->new + ($instance->{window}, + ["modal"], + "warning", + "close", + __x("`{pattern}' is an invalid\ncontent search pattern.", + pattern => $search_term)); + $dialog->run(); + $dialog->destroy(); + return; } + } + else + { + if ($case_sensitive) + { + $expr = qr/\Q$search_term\E/; + } else { - if ($case_sensitive) - { - $expr = qr/\Q$search_term\E/; - } - else - { - $expr = qr/\Q$search_term\E/i; - } + $expr = qr/\Q$search_term\E/i; } } ============================================================ --- mtn-browse 583eaaeaa5e61aa39763208a3c4ffbb4e98f9cd7 +++ mtn-browse 73563a28d9c4762e290caaa6a335f8e50c998fdd @@ -44,10 +44,14 @@ BEGIN BEGIN { - use constant HELP_VIEWER_CMD => "@INST:HELP_VIEWER_CMD@"; - use constant LIB_DIR => "@INST:LIB_DIR@"; - use constant MIME_GLOB_FILE => "@INST:GLOBS_FILE@"; - use constant PREFIX_DIR => "@INST:PREFIX_DIR@"; +# use constant HELP_VIEWER_CMD => "firefox {url}"; + use constant HELP_VIEWER_CMD => ""; +# use constant LIB_DIR => "@INST:LIB_DIR@"; + use constant LIB_DIR => "/home/aecoope/code/monotone.ca/mtn-browse/lib"; +# use constant MIME_GLOB_FILE => "@INST:GLOBS_FILE@"; + use constant MIME_GLOB_FILE => "/usr/share/mime/globs"; +# use constant PREFIX_DIR => "@INST:PREFIX_DIR@"; + use constant PREFIX_DIR => "/home/aecoope/code/monotone.ca/mtn-browse"; } use locale; use strict; @@ -59,6 +63,7 @@ use Data::Dumper; use Cwd qw(getcwd); use Data::Dumper; +use Encode; use File::Basename; use File::Spec; use File::Temp qw(tempdir); @@ -2123,7 +2128,8 @@ sub update_browser_state($$) $browser->{branch_comboboxentry}->get_model()->clear(); foreach my $branch (@branch_list) { - $browser->{branch_comboboxentry}->append_text($branch); + $browser->{branch_comboboxentry}-> + append_text(decode_utf8($branch)); if (($counter % 10) == 0) { $browser->{appbar}->set_progress_percentage @@ -2135,7 +2141,7 @@ sub update_browser_state($$) $browser->{appbar}->set_progress_percentage(1); $wm->update_gui(); $browser->{branch_comboboxentry}->child()-> - set_text($browser->{branch_combo_details}->{value}); + set_text(decode_utf8($browser->{branch_combo_details}->{value})); $browser->{branch_comboboxentry}->child()->set_position(-1); $browser->{appbar}->set_progress_percentage(0); $browser->{appbar}->set_status(""); @@ -2229,7 +2235,8 @@ sub update_browser_state($$) $browser->{revision_comboboxentry}->get_model()->clear(); foreach my $revision (@revision_list) { - $browser->{revision_comboboxentry}->append_text($revision); + $browser->{revision_comboboxentry}-> + append_text(decode_utf8($revision)); if (($counter % 10) == 0) { $browser->{appbar}->set_progress_percentage @@ -2241,7 +2248,13 @@ sub update_browser_state($$) $browser->{appbar}->set_progress_percentage(1); $wm->update_gui(); $browser->{revision_comboboxentry}->child()-> - set_text($browser->{revision_combo_details}->{value}); + set_text(decode_utf8($browser->{revision_combo_details}->{value})); + + +# You really should do this in the MAS class. Give the option to turn off +# utf8 support perhaps. Also use of use bytes I think is wrong in FindText +# and maybe in FindFile (well at least use encode_utf8 instead). + $browser->{appbar}->set_progress_percentage(0); $browser->{appbar}->set_status(""); $wm->update_gui(); @@ -2321,11 +2334,11 @@ sub update_browser_state($$) { if ($cert->{name} eq "author") { - $author = $cert->{value}; + $author = decode_utf8($cert->{value}); } elsif ($cert->{name} eq "changelog") { - $change_log = $cert->{value}; + $change_log = decode_utf8($cert->{value}); $change_log =~ s/\s+$//s; } elsif ($cert->{name} eq "date") @@ -2364,7 +2377,8 @@ sub update_browser_state($$) $browser->{directory_comboboxentry}->get_model()->clear(); foreach my $item (@directory_list) { - $browser->{directory_comboboxentry}->append_text($item); + $browser->{directory_comboboxentry}-> + append_text(decode_utf8($item)); if (($counter % 10) == 0) { $browser->{appbar}->set_progress_percentage @@ -2469,9 +2483,9 @@ sub update_browser_state($$) MLS_ICON_COLUMN, ($item->{manifest_entry}->{type} eq "directory") ? "gtk-open" : "gtk-file", - MLS_NAME_COLUMN, $item->{name}, + MLS_NAME_COLUMN, decode_utf8($item->{name}), MLS_DATE_COLUMN, $last_update, - MLS_AUTHOR_COLUMN, $author, + MLS_AUTHOR_COLUMN, decode_utf8($author), MLS_MANIFEST_ENTRY_COLUMN, $item->{manifest_entry}); if ($browser->{file_being_viewed_preset_value} ne "" @@ -2570,9 +2584,9 @@ sub update_browser_state($$) $last_update = $manifest_entry->{last_update}; $last_update =~ s/T/ /; set_label_value($browser->{file_name_value_label}, - $manifest_entry->{name}); + decode_utf8($manifest_entry->{name})); set_label_value($browser->{file_author_value_label}, - $manifest_entry->{author}); + decode_utf8($manifest_entry->{author})); set_label_value($browser->{last_update_value_label}, $last_update); set_label_value($browser->{file_revision_id_value_label}, @@ -2754,8 +2768,9 @@ sub display_file($$) $browser->{file_view_svbuffer}->set_language($lang); } - # Load in the contents. + # Load in the contents (ensuring UTF-8 encoding). + $contents = decode_utf8($contents); $browser->{file_view_svbuffer}->set_text($contents); }