# # # add_file "mtn-browse.png" # content [015b81c2dde37dcaaa342238356ecc0b2fc3240b] # # patch "mtn-browse" # from [5614bde862182fcdb857be110eefe99653960567] # to [b4a8b034eaf0b66da10a8dea20a3723bd27fd957] # # patch "mtn-browse.glade" # from [a8aaa0db486372c57d0fefd51525db57d2e3a8d9] # to [7bfd4f4265074efd078c8424b6658c838942693b] # # set "mtn-browse.png" # attr "mtn:manual_merge" # value "true" # ============================================================ # mtn-browse.png is binary ============================================================ --- mtn-browse 5614bde862182fcdb857be110eefe99653960567 +++ mtn-browse b4a8b034eaf0b66da10a8dea20a3723bd27fd957 @@ -56,6 +56,7 @@ use Gtk2::Helper; init Gtk2; use Gtk2::GladeXML; use Gtk2::Helper; +use Gtk2::Pango; use Gtk2::SourceView; use IPC::Open3; use Monotone::AutomateStdio; @@ -69,27 +70,31 @@ use Data::Dumper; # Constants used to represent the different groups of widgets. -use constant BRANCH => 0x01; -use constant DIRECTORY => 0x02; -use constant DIRECTORY_VIEW => 0x04; -use constant DISPLAY_OF_FILE => 0x08; -use constant FILE => 0x10; -use constant REVISION => 0x20; -use constant REVISION_LIST => 0x02; +use constant BRANCH => 0x01; +use constant DIRECTORY => 0x02; +use constant DIRECTORY_VIEW => 0x04; +use constant DISPLAY_OF_FILE => 0x08; +use constant FILE => 0x10; +use constant REVISION => 0x20; +use constant REVISION_LIST => 0x02; +use constant REVISION_DETAILS => 0x04; # Constants used to represent the different state changes. Read this as # `what has just been changed' => `what needs to be updated'. -use constant BRANCH_CHANGED => (REVISION | DIRECTORY | DIRECTORY_VIEW - | FILE | DISPLAY_OF_FILE); -use constant DATABASE_CHANGED => 0xff; -use constant DIRECTORY_CHANGED => (DIRECTORY_VIEW | FILE - | DISPLAY_OF_FILE); -use constant DISPLAY_OF_FILE_CHANGED => 0x00; -use constant FILE_CHANGED => (DISPLAY_OF_FILE); -use constant NEW_FIND => 0xff; -use constant REVISION_CHANGED => (DIRECTORY | DIRECTORY_VIEW | FILE - | DISPLAY_OF_FILE); +use constant BRANCH_CHANGED => (REVISION | DIRECTORY + | DIRECTORY_VIEW | FILE + | DISPLAY_OF_FILE); +use constant DATABASE_CHANGED => 0xff; +use constant DIRECTORY_CHANGED => (DIRECTORY_VIEW | FILE + | DISPLAY_OF_FILE); +use constant DISPLAY_OF_FILE_CHANGED => 0x00; +use constant FILE_CHANGED => (DISPLAY_OF_FILE); +use constant NEW_FIND => 0xff; +use constant REVISION_CHANGED => (DIRECTORY | REVISION_LIST + | DIRECTORY_VIEW | FILE + | DISPLAY_OF_FILE); +use constant SELECTED_REVISION_CHANGED => (REVISION_DETAILS); # Constants for the columns within the manifest ListStore widget. @@ -162,10 +167,14 @@ my @browsers; my @browsers; -# The advanced find management record. +# The advanced find window management record. my $advanced_find; +# The pixmap for the application's icon. + +my $app_icon; + # The tooltips widget. my $tooltips; @@ -187,13 +196,16 @@ sub make_busy($$); sub get_revision_ids($$); sub gtk2_update(); sub make_busy($$); -sub manifest_treeview_cursor_changed_cb($$); -sub manifest_treeview_row_activated_cb($$$$); +sub manifest_browser_treeview_cursor_changed_cb($$); +sub manifest_browser_treeview_row_activated_cb($$$$); sub mtn_error_handler($$); sub new_browser_instance(); +sub revisions_treeview_cursor_changed_cb($$); +sub revisions_treeview_row_activated_cb($$$$); sub set_label_value($$); sub setup_sigchld_handler($); sub sigchld_handler(); +sub simple_query_radiobutton_toggled_cb($$); sub update_advanced_find_state($$); sub update_browser_state($$); # @@ -219,6 +231,7 @@ sub update_browser_state($$); \&mtn_error_handler); setup_sigchld_handler(\&sigchld_handler); $tooltips = Gtk2::Tooltips->new(); + $app_icon = Gtk2::Gdk::Pixbuf->new_from_file("../mtn-browse.png"); push(@browsers, new_browser_instance()); # Hand control over to Gtk2. @@ -227,6 +240,15 @@ sub update_browser_state($$); # Cleanup. + if (defined($advanced_find)) + { + $advanced_find->{window}->destroy(); + $advanced_find = undef; + } + foreach my $browser (@browsers) + { + $browser->{window}->destroy(); + } Gnome2::VFS->shutdown(); $SIG{CHLD} = "IGNORE"; @browsers = (); @@ -290,6 +312,7 @@ sub new_browser_instance() # Get the widgets that we are interested in. $browser->{window} = $browser->{glade}->get_widget("main_window"); + $browser->{window}->set_icon($app_icon); $browser->{appbar} = $browser->{glade}->get_widget("appbar"); $browser->{branch_combo} = $browser->{glade}->get_widget("branch_comboboxentry"); @@ -787,7 +810,7 @@ sub directory_up_button_clicked_cb($$) # ############################################################################## # -# Routine - manifest_treeview_cursor_changed_cb +# Routine - manifest_browser_treeview_cursor_changed_cb # # Description - Callback routine called when the user selects an entry in # the manifest treeview. @@ -800,7 +823,7 @@ sub directory_up_button_clicked_cb($$) -sub manifest_treeview_cursor_changed_cb($$) +sub manifest_browser_treeview_cursor_changed_cb($$) { my($widget, $browser) = @_; @@ -824,7 +847,7 @@ sub manifest_treeview_cursor_changed_cb( # If the item is a file then display its contents, otherwise if it is a # directory then just ignore it. - if ($manifest_entry->{type} eq "file") + if (defined($manifest_entry) && $manifest_entry->{type} eq "file") { $browser->{file_being_viewed} = {short_name => $short_name, manifest_entry => $manifest_entry}; @@ -836,7 +859,7 @@ sub manifest_treeview_cursor_changed_cb( # ############################################################################## # -# Routine - manifest_treeview_row_activated_cb +# Routine - manifest_browser_treeview_row_activated_cb # # Description - Callback routine called when the user double clicks on an # entry in the manifest treeview. @@ -854,7 +877,7 @@ sub manifest_treeview_cursor_changed_cb( -sub manifest_treeview_row_activated_cb($$$$) +sub manifest_browser_treeview_row_activated_cb($$$$) { my($widget, $tree_path, $tree_view_column, $browser) = @_; @@ -878,7 +901,7 @@ sub manifest_treeview_row_activated_cb($ # If the item is a directory then change to it, otherwise if it is a file # then just ignore it. - if ($manifest_entry->{type} eq "directory") + if (defined($manifest_entry) && $manifest_entry->{type} eq "directory") { $browser->{directory_combo_details}->{value} = $manifest_entry->{name}; $browser->{directory_combo_details}->{completed} = 1; @@ -892,6 +915,153 @@ sub manifest_treeview_row_activated_cb($ # ############################################################################## # +# Routine - simple_query_radiobutton_toggled_cb +# +# Description - Callback routine called when the user changes the advanced +# find mode radio button. +# +# Data - $widget : The widget object that received the +# signal. +# $advanced_find : The advanced find dialog window instance +# that is associated with this widget. +# +############################################################################## + + + +sub simple_query_radiobutton_toggled_cb($$) +{ + + my($widget, $advanced_find) = @_; + + my($len, + $value); + + return if ($advanced_find->{in_cb}); + local $advanced_find->{in_cb} = 1; + + # Simply enable the relevant find widgets depending upon whether simple or + # advanced mode is selected. + + if ($advanced_find->{simple_query_radiobutton}->get_active()) + { + $advanced_find->{simple_frame}->set_sensitive(TRUE); + $advanced_find->{advanced_frame}->set_sensitive(FALSE); + } + else + { + $advanced_find->{simple_frame}->set_sensitive(FALSE); + $advanced_find->{advanced_frame}->set_sensitive(TRUE); + } + +} +# +############################################################################## +# +# Routine - revisions_treeview_cursor_changed_cb +# +# Description - Callback routine called when the user selects an entry in +# the advanced find's revisions treeview. +# +# Data - $widget : The widget object that received the +# signal. +# $advanced_find : The advanced find dialog window instance +# that is associated with this widget. +# +############################################################################## + + + +sub revisions_treeview_cursor_changed_cb($$) +{ + + my($widget, $advanced_find) = @_; + + my $revision_id; + + return if ($advanced_find->{in_cb}); + local $advanced_find->{in_cb} = 1; + + # Get the selected revision id. + + $widget->get_selection()->selected_foreach + (sub + { + my($model, $path, $iter) = @_; + $revision_id = $model->get($iter, 0); + }); + + if (defined($revision_id)) + { + $advanced_find->{revisions_treeview_details}->{value} = $revision_id; + $advanced_find->{appbar}->clear_stack(); + &{$advanced_find->{update_handler}}($advanced_find, + SELECTED_REVISION_CHANGED); + } + +} +# +############################################################################## +# +# Routine - revisions_treeview_row_activated_cb +# +# Description - Callback routine called when the user double clicks on an +# entry in the advanced find's revisions treeview. +# +# Data - $widget : The widget object that received the +# signal. +# $tree_path : A Gtk2::TreePath object for the +# selected item. +# $tree_view_column : A Gtk2::TreeViewColumn object for the +# selected item. +# $advanced_find : The advanced find dialog window +# instance that is associated with this +# widget. +# +############################################################################## + + + +sub revisions_treeview_row_activated_cb($$$$) +{ + + my($widget, $tree_path, $tree_view_column, $advanced_find) = @_; + + my($manifest_entry, + $short_name); + + return if ($advanced_find->{in_cb}); + local $advanced_find->{in_cb} = 1; + + return; + + # Get the manifest entry details for the item that was double-clicked. + + $widget->get_selection()->selected_foreach + (sub + { + my($model, $path, $iter) = @_; + $short_name = $model->get($iter, MLS_NAME_COLUMN); + $manifest_entry = $model->get($iter, MLS_MANIFEST_ENTRY_COLUMN); + }); + + # If the item is a directory then change to it, otherwise if it is a file + # then just ignore it. + + if ($manifest_entry->{type} eq "directory") + { + $advanced_find->{directory_combo_details}->{value} = $manifest_entry->{name}; + $advanced_find->{directory_combo_details}->{completed} = 1; + $advanced_find->{directory_combo}->child()-> + set_text($manifest_entry->{name}); + $advanced_find->{appbar}->clear_stack(); + &{$advanced_find->{update_handler}}($advanced_find, DIRECTORY_CHANGED); + } + +} +# +############################################################################## +# # Routine - delete_event_cb # # Description - Callback routine called when the used has attempted to @@ -916,7 +1086,14 @@ sub delete_event_cb($$$) my($widget, $event, $browser) = @_; - return FALSE; + if ($browser->{in_cb}) + { + return TRUE; + } + else + { + return FALSE; + } } # @@ -1036,6 +1213,7 @@ sub create_advanced_find_window() { my(@branch_list, + $font, $instance, $renderer, $tv_column); @@ -1062,7 +1240,7 @@ sub create_advanced_find_window() }, $instance); - # Link in the update handler for the browser. + # Link in the update handler for the advanced find window. $instance->{update_handler} = \&update_advanced_find_state; @@ -1070,6 +1248,7 @@ sub create_advanced_find_window() $instance->{window} = $instance->{glade}->get_widget("advanced_find_window"); + $instance->{window}->set_icon($app_icon); $instance->{appbar} = $instance->{glade}->get_widget("appbar"); $instance->{simple_query_radiobutton} = $instance->{glade}->get_widget("simple_query_radiobutton"); @@ -1087,8 +1266,8 @@ sub create_advanced_find_window() $instance->{glade}->get_widget("date_dateedit"); $instance->{revisions_treeview} = $instance->{glade}->get_widget("revisions_treeview"); - $instance->{details_treeview} = - $instance->{glade}->get_widget("details_treeview"); + $instance->{details_textview} = + $instance->{glade}->get_widget("details_textview"); $instance->{details_scrolledwindow} = $instance->{glade}->get_widget("details_scrolledwindow"); $instance->{selected_branch_label} = @@ -1100,7 +1279,9 @@ sub create_advanced_find_window() # Setup the advanced find window deletion handlers. $instance->{window}->signal_connect - ("delete_event", sub { $_[2]->{done} = 1; return TRUE; }, $instance); + ("delete_event", + sub { $_[2]->{done} = 1 unless ($_[2]->{in_cb}); return TRUE; }, + $instance); $instance->{glade}->get_widget("cancel_button")->signal_connect ("clicked", sub { $_[1]->{done} = 1; }, $instance); @@ -1143,43 +1324,16 @@ sub create_advanced_find_window() # Setup the revision details viewer. - $instance->{details_liststore} = Gtk2::ListStore->new("Glib::String", - "Glib::String", - "Glib::String"); - $instance->{details_treeview}->set_model($instance->{details_liststore}); + $instance->{details_buffer} = $instance->{details_textview}->get_buffer(); + $instance->{details_buffer}->create_tag("bold", + weight => PANGO_WEIGHT_BOLD); + $instance->{details_buffer}->create_tag("italics", style => "italic"); + $instance->{details_buffer}->create_tag("bold-italics", + weight => PANGO_WEIGHT_BOLD, + style => "italic"); + $font = Gtk2::Pango::FontDescription->from_string("monospace 10"); + $instance->{details_textview}->modify_font($font) if (defined($font)); - $tv_column = Gtk2::TreeViewColumn->new(); - $tv_column->set_resizable(FALSE); - $tv_column->set_sizing("fixed"); - $tv_column->set_fixed_width(30); - $tv_column->set_sort_column_id(DLS_ICON_COLUMN); - $renderer = Gtk2::CellRendererPixbuf->new(); - $tv_column->pack_start($renderer, TRUE); - $tv_column->set_attributes($renderer, "stock-id" => DLS_ICON_COLUMN); - $instance->{details_treeview}->append_column($tv_column); - - $tv_column = Gtk2::TreeViewColumn->new(); - $tv_column->set_title("Cert Name"); - $tv_column->set_resizable(TRUE); - $tv_column->set_sizing("grow-only"); - $tv_column->set_sort_column_id(DLS_NAME_COLUMN); - $renderer = Gtk2::CellRendererText->new(); - $tv_column->pack_start($renderer, FALSE); - $tv_column->set_attributes($renderer, "text" => DLS_NAME_COLUMN); - $instance->{details_treeview}->append_column($tv_column); - - $tv_column = Gtk2::TreeViewColumn->new(); - $tv_column->set_title("Value"); - $tv_column->set_resizable(TRUE); - $tv_column->set_sizing("grow-only"); - $tv_column->set_sort_column_id(DLS_VALUE_COLUMN); - $renderer = Gtk2::CellRendererText->new(); - $tv_column->pack_start($renderer, FALSE); - $tv_column->set_attributes($renderer, "text" => DLS_VALUE_COLUMN); - $instance->{details_treeview}->append_column($tv_column); - - $instance->{details_treeview}->set_search_column(DLS_VALUE_COLUMN); - return $instance; } @@ -1393,8 +1547,11 @@ sub update_browser_state($$) { $author = $cert->{value} if ($cert->{name} eq "author"); - $change_log = $cert->{value} - if ($cert->{name} eq "changelog"); + if ($cert->{name} eq "changelog") + { + $change_log = $cert->{value}; + $change_log =~ s/\s+$//os; + } } set_label_value($browser->{revision_id_label}, $revision_ids[0]); @@ -1938,6 +2095,7 @@ sub update_advanced_find_state($$) # Reset the revisions tree view. $advanced_find->{revisions_liststore}->clear(); + $advanced_find->{revisions_treeview_details}->{value} = ""; # Get the list of matching revisions. @@ -1970,317 +2128,155 @@ sub update_advanced_find_state($$) } - # The list of displayed revisions has changed. + # The selected revision has changed. - if ($changed && 1 == 0) + if ($changed & REVISION_DETAILS) { - my($author, - @certs_list, - $counter, - @directory_entry_list, - $last_update, - @revision_ids, - @revision_list, - $taking_our_time); - - # Reset the manifest tree view. - - $advanced_find->{revisions_liststore}->clear(); - - # Get the contents of the new directory. - - if ($advanced_find->{directory_combo_details}->{completed} - || $advanced_find->{directory_combo_details}->{value} eq "") + $advanced_find->{details_buffer}->set_text(""); + if ($advanced_find->{revisions_treeview_details}->{value} ne "") { - get_dir_contents($advanced_find->{directory_combo_details}->{value}, - $advanced_find->{manifest}, - address@hidden); - } - # Disable the directory up button if we are already at the top level, - # otherwise make sure it is enabled. + my($buf, + @certs_list, + $change_log, + $manifest_id, + @parent_revision_ids, + %revision_data, + @revision_details, + %seen, + @unique); + my @types = + ("Added", "Removed", "Changed", "Renamed", "Attributes"); - $advanced_find->{directory_up_button}->set_sensitive - (($advanced_find->{directory_combo_details}->{value} eq "") - ? FALSE : TRUE); + # Get all the information about the selected revision. - # Update the directory tree view. + $advanced_find->{mtn}->certs + (address@hidden, + $advanced_find->{revisions_treeview_details}->{value}); + $advanced_find->{mtn}->get_revision + (address@hidden, + $advanced_find->{revisions_treeview_details}->{value}); - $advanced_find->{appbar}->set_status("Populating file details"); - $counter = 1; - $taking_our_time = 0; - get_revision_ids($advanced_find, address@hidden); - foreach my $item (@directory_entry_list) - { + # Pretty print it into the details buffer. - # Get the latest modification time and the author if the entry is a - # file (caching the result in the manifest for future reference if - # we have to work it out). - - if ($item->{manifest_entry}->{type} eq "file") + $buf = $advanced_find->{details_buffer}; + foreach my $cert (@certs_list) { - if (! exists($item->{manifest_entry}->{author})) + if ($cert->{name} eq "changelog") { - $taking_our_time = 1; - $advanced_find->{mtn}->get_content_changed - (address@hidden, - $revision_ids[0], - $item->{manifest_entry}->{name}); - $item->{manifest_entry}->{last_changed_revision} = - $revision_list[0]; - $advanced_find->{mtn}->certs(address@hidden, $revision_list[0]); - $author = $last_update = ""; - foreach my $cert (@certs_list) - { - if ($cert->{name} eq "author") - { - $author = $cert->{value}; - $item->{manifest_entry}->{author} = $author; - } - if ($cert->{name} eq "date") - { - $last_update = $cert->{value}; - $last_update =~ s/T/ /o; - $item->{manifest_entry}->{last_update} = - $last_update; - } - last if ($author ne "" && $last_update ne ""); - } + $change_log = $cert->{value}; + $change_log =~ s/\s+$//os; } else { - $author = $item->{manifest_entry}->{author}; - $last_update = $item->{manifest_entry}->{last_update}; + $cert->{value} =~ s/T/ /o if ($cert->{name} eq "date"); + $buf->insert_with_tags_by_name + ($buf->get_end_iter(), + sprintf("%s:\t", ucfirst($cert->{name})), + "bold"); + $buf->insert($buf->get_end_iter(), + sprintf("%s\n", $cert->{value})); } } - else + $buf->insert_with_tags_by_name + ($buf->get_end_iter(), "\nChange Log:\n", "bold"); + $buf->insert($buf->get_end_iter(), sprintf("%s\n", $change_log)); + $buf->insert_with_tags_by_name + ($buf->get_end_iter(), "\nChanges Made:\n", "bold"); + foreach my $type (@types) { - $author = ""; - $last_update = ""; + $revision_data{$type} = []; } - - # Put the entry into the liststore. - - $advanced_find->{manifest_liststore}-> - set($advanced_find->{manifest_liststore}->append(), - MLS_ICON_COLUMN, - ($item->{manifest_entry}->{type} eq "directory") - ? "gtk-open" : "gtk-file", - MLS_NAME_COLUMN, $item->{name}, - MLS_DATE_COLUMN, $last_update, - MLS_AUTHOR_COLUMN, $author, - MLS_MANIFEST_ENTRY_COLUMN, $item->{manifest_entry}); - - if ($taking_our_time) + foreach my $change (@revision_details) { - $advanced_find->{appbar}->set_progress_percentage - ($counter / scalar(@directory_entry_list)); - gtk2_update(); - } - ++ $counter; - - } - - $advanced_find->{manifest_treeview}->scroll_to_point(0, 0) - if ($advanced_find->{manifest_treeview}->realized()); - - $advanced_find->{appbar}->set_progress_percentage(0); - $advanced_find->{appbar}->set_status(""); - gtk2_update(); - - } - - # The displayed file contents has changed. - - if ($changed & DISPLAY_OF_FILE && 1 == 0) - { - - # Load up the selected file's contents into the file viewer. - - if (exists($advanced_find->{file_being_viewed}->{manifest_entry})) - { - my $manifest_entry; - $manifest_entry = - $advanced_find->{file_being_viewed}->{manifest_entry}; - if ($advanced_find->{file_id_label}->get_text() - ne $manifest_entry->{file_id}) - { - - my($contents, - $lang, - $mime_type, - $scrolled_window); - - # Reset the file view buffer. - - $advanced_find->{file_button_vbox}->set_sensitive(TRUE); - foreach my $widget (@{$advanced_find->{text_file_sensitive_group}}) + if ($change->{type} eq "add_dir") { - $widget->set_sensitive(FALSE); + push(@{$revision_data{"Added"}}, $change->{name} . "/"); } - $advanced_find->{file_view_svbuffer}->set_text(""); - $advanced_find->{file_view_svbuffer}->set("highlight", FALSE); - - # Get contents. - - $manifest_entry = - $advanced_find->{file_being_viewed}->{manifest_entry}; - $advanced_find->{mtn}->get_file(\$contents, - $manifest_entry->{file_id}); - - # Try and work out the mime type, first based on contents and - # then based on the file name extension. - - if (! defined($mime_type = - Gnome2::VFS->get_mime_type_for_data($contents)) - || $mime_type eq "text/plain") + elsif ($change->{type} eq "add_file") { - my $name = $advanced_find->{file_being_viewed}->{short_name}; - foreach my $item (@text_mime_types) - { - if ($name =~ m/$item->{pattern}/) - { - $mime_type = $item->{type}; - last; - } - } + push(@{$revision_data{"Added"}}, $change->{name}); } - - # Override some mis-identified types. - - $mime_type = "image/svg+xml" - if ($mime_type eq "text/xml" - && $advanced_find->{file_being_viewed}->{short_name} - =~ m/.*\.svg$/o); - - # If it's image data then attempt to render it. - - if ($mime_type =~ m/^image\/.+$/o) + elsif ($change->{type} eq "delete") { - eval - { - my $loader = Gtk2::Gdk::PixbufLoader->new(); - $loader->write($contents); - $loader->close(); - $advanced_find->{file_view_svbuffer}->insert_pixbuf - ($advanced_find->{file_view_svbuffer}->get_start_iter(), - $loader->get_pixbuf()); - }; - $advanced_find->{file_view_svbuffer}-> - set_text("<" . $mime_type . ">\n") if ($@ ne ""); + push(@{$revision_data{"Removed"}}, $change->{name}); } - else + elsif ($change->{type} eq "patch") { - - my $ok_to_render = 0; - - # Attempt to syntax highlight the file if it looks safe. - - if ($mime_type =~ m/^application\/.+$/o) - { - my $part; - ($part) = ($mime_type =~ m/^application\/(.+)$/o); - foreach my $item (@text_viewable_app_mime_types) - { - if ($part eq $item) - { - $ok_to_render = 1; - last; - } - } - } - - if ($mime_type =~ m/^text\/.+$/o || $ok_to_render) - { - if (defined($lang = $advanced_find->{file_view_svlangmgr}-> - get_language_from_mime_type($mime_type))) - { - $advanced_find->{file_view_svbuffer}-> - set("highlight", TRUE); - $advanced_find->{file_view_svbuffer}-> - set_language($lang); - } - - # Load in the contents. - - $advanced_find->{file_view_svbuffer}->set_text($contents); - foreach my $widget - (@{$advanced_find->{text_file_sensitive_group}}) - { - $widget->set_sensitive(TRUE); - } - } - else - { - $advanced_find->{file_view_svbuffer}-> - set("highlight", FALSE); - $advanced_find->{file_view_svbuffer}-> - set_text("<" . $mime_type . ">\n"); - } - + push(@{$revision_data{"Changed"}}, $change->{name}); } - - # Scroll back up to the top left. - - if ($advanced_find->{file_view_scrolledwindow}->realized()) + elsif ($change->{type} eq "rename") { - $advanced_find->{file_view_scrolledwindow}-> - get_vadjustment()->set_value(0); - $advanced_find->{file_view_scrolledwindow}-> - get_hadjustment()->set_value(0); + push(@{$revision_data{"Renamed"}}, + $change->{from_name} . " -> " . $change->{to_name}); } - - # Update the file details labels. - - if (! exists($manifest_entry->{last_changed_revision})) + elsif ($change->{type} eq "clear") { - my(@certs_list, - @revision_ids, - @revision_list); - get_revision_ids($advanced_find, address@hidden); - $advanced_find->{mtn}-> - get_content_changed(address@hidden, - $revision_ids[0], - $manifest_entry->{name}); - $manifest_entry->{last_changed_revision} = - $revision_list[0]; - $advanced_find->{mtn}->certs(address@hidden, $revision_list[0]); - foreach my $cert (@certs_list) + push(@{$revision_data{"Attributes"}}, + sprintf("%s: %s was cleared", + $change->{name}, + $change->{attribute})); + } + elsif ($change->{type} eq "clear" || $change->{type} eq "set") + { + push(@{$revision_data{"Attributes"}}, + sprintf("%s: %s = %s", + $change->{name}, + $change->{attribute}, + $change->{value})); + } + elsif ($change->{type} eq "old_revision") + { + push(@parent_revision_ids, $change->{revision_id}); + } + elsif ($change->{type} eq "new_manifest") + { + $manifest_id = $change->{manifest_id}; + } + } + foreach my $type (@types) + { + if (scalar(@{$revision_data{$type}}) > 0) + { + $buf->insert_with_tags_by_name + ($buf->get_end_iter(), + " " . $type . ":\n", "italics"); + %seen = (); + @unique = sort(grep { ! $seen{$_} ++ } + @{$revision_data{$type}}); + foreach my $line (@unique) { - if ($cert->{name} eq "date") - { - my $last_update; - $last_update = $cert->{value}; - $last_update =~ s/T/ /o; - $manifest_entry->{last_update} = $last_update; - last; - } + $buf->insert($buf->get_end_iter(), + "\t" . $line . "\n"); } } - set_label_value($advanced_find->{file_name_label}, - $manifest_entry->{name}); - set_label_value($advanced_find->{file_id_label}, - $manifest_entry->{file_id}); - set_label_value($advanced_find->{last_update_label}, - $manifest_entry->{last_update}); - set_label_value($advanced_find->{file_revision_id_label}, - $manifest_entry->{last_changed_revision}); } + $buf->insert_with_tags_by_name + ($buf->get_end_iter(), "\nParent revision id(s):\t", "bold"); + $buf->insert($buf->get_end_iter(), + join(" ", @parent_revision_ids) . "\n"); + $buf->insert_with_tags_by_name + ($buf->get_end_iter(), "Manifest id:\t\t", "bold"); + $buf->insert($buf->get_end_iter(), $manifest_id); + + # Scroll back up to the top left. + + if ($advanced_find->{details_scrolledwindow}->realized()) + { + $advanced_find->{details_scrolledwindow}->get_vadjustment()-> + set_value(0); + $advanced_find->{details_scrolledwindow}->get_hadjustment()-> + set_value(0); + } + + set_label_value($advanced_find->{selected_revision_label}, + $advanced_find->{revisions_treeview_details}-> + {value}); } else { - - # Reset the file view buffer. - - $advanced_find->{file_button_vbox}->set_sensitive(FALSE); - $advanced_find->{file_view_svbuffer}->set_text(""); - $advanced_find->{file_view_svbuffer}->set("highlight", FALSE); - set_label_value($advanced_find->{file_name_label}, ""); - set_label_value($advanced_find->{file_id_label}, ""); - set_label_value($advanced_find->{last_update_label}, ""); - set_label_value($advanced_find->{file_revision_id_label}, ""); - + set_label_value($advanced_find->{selected_revision_label}, ""); } } ============================================================ --- mtn-browse.glade a8aaa0db486372c57d0fefd51525db57d2e3a8d9 +++ mtn-browse.glade 7bfd4f4265074efd078c8424b6658c838942693b @@ -734,8 +734,6 @@ with another revision - 25 - 25 True Go up one directory level True @@ -786,8 +784,8 @@ with another revision False True True - - + + @@ -2020,6 +2018,8 @@ with another version GTK_WINDOW_TOPLEVEL GTK_WIN_POS_CENTER_ON_PARENT True + 750 + 550 True False True @@ -2658,6 +2658,8 @@ Separator False False True + + @@ -2720,13 +2722,22 @@ Separator GTK_CORNER_TOP_LEFT - + True True - True - False - True - True + False + False + True + GTK_JUSTIFY_LEFT + GTK_WRAP_NONE + True + 0 + 0 + 0 + 0 + 0 + 0 +