gitview: Move the console error messages to message dialog
[git.git] / contrib / gitview / gitview
index 4e3847d..b836047 100755 (executable)
@@ -162,7 +162,7 @@ class CellRendererGraph(gtk.GenericCellRenderer):
                        for item in names:
                                names_len += len(item)
 
                        for item in names:
                                names_len += len(item)
 
-               width = box_size * (cols + 1 ) + names_len 
+               width = box_size * (cols + 1 ) + names_len
                height = box_size
 
                # FIXME I have no idea how to use cell_area properly
                height = box_size
 
                # FIXME I have no idea how to use cell_area properly
@@ -239,20 +239,23 @@ class CellRendererGraph(gtk.GenericCellRenderer):
                                box_size / 4, 0, 2 * math.pi)
 
 
                                box_size / 4, 0, 2 * math.pi)
 
 
+               self.set_colour(ctx, colour, 0.0, 0.5)
+               ctx.stroke_preserve()
+
+               self.set_colour(ctx, colour, 0.5, 1.0)
+               ctx.fill_preserve()
+
                if (len(names) != 0):
                        name = " "
                        for item in names:
                                name = name + item + " "
 
                if (len(names) != 0):
                        name = " "
                        for item in names:
                                name = name + item + " "
 
-                       ctx.select_font_face("Monospace")
                        ctx.set_font_size(13)
                        ctx.set_font_size(13)
-                       ctx.text_path(name)
-
-               self.set_colour(ctx, colour, 0.0, 0.5)
-               ctx.stroke_preserve()
-
-               self.set_colour(ctx, colour, 0.5, 1.0)
-               ctx.fill()
+                       if (flags & 1):
+                               self.set_colour(ctx, colour, 0.5, 1.0)
+                       else:
+                               self.set_colour(ctx, colour, 0.0, 0.5)
+                       ctx.show_text(name)
 
 class Commit:
        """ This represent a commit object obtained after parsing the git-rev-list
 
 class Commit:
        """ This represent a commit object obtained after parsing the git-rev-list
@@ -261,11 +264,11 @@ class Commit:
        children_sha1 = {}
 
        def __init__(self, commit_lines):
        children_sha1 = {}
 
        def __init__(self, commit_lines):
-               self.message            = ""
+               self.message            = ""
                self.author             = ""
                self.author             = ""
-               self.date               = ""
-               self.committer          = ""
-               self.commit_date        = ""
+               self.date               = ""
+               self.committer          = ""
+               self.commit_date        = ""
                self.commit_sha1        = ""
                self.parent_sha1        = [ ]
                self.parse_commit(commit_lines)
                self.commit_sha1        = ""
                self.parent_sha1        = [ ]
                self.parse_commit(commit_lines)
@@ -365,7 +368,7 @@ class DiffWindow:
                save_menu.connect("activate", self.save_menu_response, "save")
                save_menu.show()
                menu_bar.append(save_menu)
                save_menu.connect("activate", self.save_menu_response, "save")
                save_menu.show()
                menu_bar.append(save_menu)
-               vbox.pack_start(menu_bar, False, False, 2)
+               vbox.pack_start(menu_bar, expand=False, fill=True)
                menu_bar.show()
 
                scrollwin = gtk.ScrolledWindow()
                menu_bar.show()
 
                scrollwin = gtk.ScrolledWindow()
@@ -391,7 +394,7 @@ class DiffWindow:
                sourceview.show()
 
 
                sourceview.show()
 
 
-       def set_diff(self, commit_sha1, parent_sha1):
+       def set_diff(self, commit_sha1, parent_sha1, encoding):
                """Set the differences showed by this window.
                Compares the two trees and populates the window with the
                differences.
                """Set the differences showed by this window.
                Compares the two trees and populates the window with the
                differences.
@@ -401,7 +404,7 @@ class DiffWindow:
                        return
 
                fp = os.popen("git diff-tree -p " + parent_sha1 + " " + commit_sha1)
                        return
 
                fp = os.popen("git diff-tree -p " + parent_sha1 + " " + commit_sha1)
-               self.buffer.set_text(fp.read())
+               self.buffer.set_text(unicode(fp.read(), encoding).encode('utf-8'))
                fp.close()
                self.window.show()
 
                fp.close()
                self.window.show()
 
@@ -422,14 +425,15 @@ class DiffWindow:
 class GitView:
        """ This is the main class
        """
 class GitView:
        """ This is the main class
        """
-       version = "0.7"
+       version = "0.8"
 
        def __init__(self, with_diff=0):
                self.with_diff = with_diff
 
        def __init__(self, with_diff=0):
                self.with_diff = with_diff
-               self.window =   gtk.Window(gtk.WINDOW_TOPLEVEL)
+               self.window =   gtk.Window(gtk.WINDOW_TOPLEVEL)
                self.window.set_border_width(0)
                self.window.set_title("Git repository browser")
 
                self.window.set_border_width(0)
                self.window.set_title("Git repository browser")
 
+               self.get_encoding()
                self.get_bt_sha1()
 
                # Use three-quarters of the screen by default
                self.get_bt_sha1()
 
                # Use three-quarters of the screen by default
@@ -445,8 +449,17 @@ class GitView:
 
                self.accel_group = gtk.AccelGroup()
                self.window.add_accel_group(self.accel_group)
 
                self.accel_group = gtk.AccelGroup()
                self.window.add_accel_group(self.accel_group)
+               self.accel_group.connect_group(0xffc2, 0, gtk.ACCEL_LOCKED, self.refresh);
 
 
-               self.construct()
+               self.window.add(self.construct())
+
+       def refresh(self, widget, event=None, *arguments, **keywords):
+               self.get_encoding()
+               self.get_bt_sha1()
+               Commit.children_sha1 = {}
+               self.set_branch(sys.argv[without_diff:])
+               self.window.show()
+               return True
 
        def get_bt_sha1(self):
                """ Update the bt_sha1 dictionary with the
 
        def get_bt_sha1(self):
                """ Update the bt_sha1 dictionary with the
@@ -468,22 +481,20 @@ class GitView:
                        self.bt_sha1[sha1].append(name)
                fp.close()
 
                        self.bt_sha1[sha1].append(name)
                fp.close()
 
+       def get_encoding(self):
+               fp = os.popen("git repo-config --get i18n.commitencoding")
+               self.encoding=string.strip(fp.readline())
+               fp.close()
+               if (self.encoding == ""):
+                       self.encoding = "utf-8"
+
 
        def construct(self):
                """Construct the window contents."""
 
        def construct(self):
                """Construct the window contents."""
+               vbox = gtk.VBox()
                paned = gtk.VPaned()
                paned.pack1(self.construct_top(), resize=False, shrink=True)
                paned.pack2(self.construct_bottom(), resize=False, shrink=True)
                paned = gtk.VPaned()
                paned.pack1(self.construct_top(), resize=False, shrink=True)
                paned.pack2(self.construct_bottom(), resize=False, shrink=True)
-               self.window.add(paned)
-               paned.show()
-
-
-       def construct_top(self):
-               """Construct the top-half of the window."""
-               vbox = gtk.VBox(spacing=6)
-               vbox.set_border_width(12)
-               vbox.show()
-
                menu_bar = gtk.MenuBar()
                menu_bar.set_pack_direction(gtk.PACK_DIRECTION_RTL)
                help_menu = gtk.MenuItem("Help")
                menu_bar = gtk.MenuBar()
                menu_bar.set_pack_direction(gtk.PACK_DIRECTION_RTL)
                help_menu = gtk.MenuItem("Help")
@@ -495,11 +506,23 @@ class GitView:
                help_menu.set_submenu(menu)
                help_menu.show()
                menu_bar.append(help_menu)
                help_menu.set_submenu(menu)
                help_menu.show()
                menu_bar.append(help_menu)
-               vbox.pack_start(menu_bar, False, False, 2)
                menu_bar.show()
                menu_bar.show()
+               vbox.pack_start(menu_bar, expand=False, fill=True)
+               vbox.pack_start(paned, expand=True, fill=True)
+               paned.show()
+               vbox.show()
+               return vbox
+
+
+       def construct_top(self):
+               """Construct the top-half of the window."""
+               vbox = gtk.VBox(spacing=6)
+               vbox.set_border_width(12)
+               vbox.show()
+
 
                scrollwin = gtk.ScrolledWindow()
 
                scrollwin = gtk.ScrolledWindow()
-               scrollwin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
+               scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
                scrollwin.set_shadow_type(gtk.SHADOW_IN)
                vbox.pack_start(scrollwin, expand=True, fill=True)
                scrollwin.show()
                scrollwin.set_shadow_type(gtk.SHADOW_IN)
                vbox.pack_start(scrollwin, expand=True, fill=True)
                scrollwin.show()
@@ -683,7 +706,7 @@ class GitView:
                self.revid_label.set_text(revid_label)
                self.committer_label.set_text(committer)
                self.timestamp_label.set_text(timestamp)
                self.revid_label.set_text(revid_label)
                self.committer_label.set_text(committer)
                self.timestamp_label.set_text(timestamp)
-               self.message_buffer.set_text(message)
+               self.message_buffer.set_text(unicode(message, self.encoding).encode('utf-8'))
 
                for widget in self.parents_widgets:
                        self.table.remove(widget)
 
                for widget in self.parents_widgets:
                        self.table.remove(widget)
@@ -728,7 +751,7 @@ class GitView:
                        button.set_relief(gtk.RELIEF_NONE)
                        button.set_sensitive(True)
                        button.connect("clicked", self._show_clicked_cb,
                        button.set_relief(gtk.RELIEF_NONE)
                        button.set_sensitive(True)
                        button.connect("clicked", self._show_clicked_cb,
-                                       commit.commit_sha1, parent_id)
+                                       commit.commit_sha1, parent_id, self.encoding)
                        hbox.pack_start(button, expand=False, fill=True)
                        button.show()
 
                        hbox.pack_start(button, expand=False, fill=True)
                        button.show()
 
@@ -784,7 +807,7 @@ class GitView:
                        button.set_relief(gtk.RELIEF_NONE)
                        button.set_sensitive(True)
                        button.connect("clicked", self._show_clicked_cb,
                        button.set_relief(gtk.RELIEF_NONE)
                        button.set_sensitive(True)
                        button.connect("clicked", self._show_clicked_cb,
-                                       child_id, commit.commit_sha1)
+                                       child_id, commit.commit_sha1, self.encoding)
                        hbox.pack_start(button, expand=False, fill=True)
                        button.show()
 
                        hbox.pack_start(button, expand=False, fill=True)
                        button.show()
 
@@ -870,15 +893,15 @@ class GitView:
 
                # Reset nodepostion
                if (last_nodepos > 5):
 
                # Reset nodepostion
                if (last_nodepos > 5):
-                       last_nodepos = -1 
+                       last_nodepos = -1
 
                # Add the incomplete lines of the last cell in this
                try:
                        colour = self.colours[commit.commit_sha1]
                except KeyError:
                        self.colours[commit.commit_sha1] = last_colour+1
 
                # Add the incomplete lines of the last cell in this
                try:
                        colour = self.colours[commit.commit_sha1]
                except KeyError:
                        self.colours[commit.commit_sha1] = last_colour+1
-                       last_colour = self.colours[commit.commit_sha1] 
-                       colour =   self.colours[commit.commit_sha1] 
+                       last_colour = self.colours[commit.commit_sha1]
+                       colour =   self.colours[commit.commit_sha1]
 
                try:
                        node_pos = self.nodepos[commit.commit_sha1]
 
                try:
                        node_pos = self.nodepos[commit.commit_sha1]
@@ -910,7 +933,7 @@ class GitView:
                                self.colours[parent_id] = last_colour+1
                                last_colour = self.colours[parent_id]
                                self.nodepos[parent_id] = last_nodepos+1
                                self.colours[parent_id] = last_colour+1
                                last_colour = self.colours[parent_id]
                                self.nodepos[parent_id] = last_nodepos+1
-                               last_nodepos = self.nodepos[parent_id] 
+                               last_nodepos = self.nodepos[parent_id]
 
                        in_line.append((node_pos, self.nodepos[parent_id],
                                                self.colours[parent_id]))
 
                        in_line.append((node_pos, self.nodepos[parent_id],
                                                self.colours[parent_id]))
@@ -946,7 +969,7 @@ class GitView:
                        try:
                                next_commit = self.commits[index+1]
                                if (next_commit.commit_sha1 == sha1 and pos != int(pos)):
                        try:
                                next_commit = self.commits[index+1]
                                if (next_commit.commit_sha1 == sha1 and pos != int(pos)):
-                               # join the line back to the node point 
+                               # join the line back to the node point
                                # This need to be done only if we modified it
                                        in_line.append((pos, pos-0.5, self.colours[sha1]))
                                        continue;
                                # This need to be done only if we modified it
                                        in_line.append((pos, pos-0.5, self.colours[sha1]))
                                        continue;
@@ -960,21 +983,26 @@ class GitView:
                try:
                        self.treeview.set_cursor(self.index[revid])
                except KeyError:
                try:
                        self.treeview.set_cursor(self.index[revid])
                except KeyError:
-                       print "Revision %s not present in the list" % revid
+                       dialog = gtk.MessageDialog(parent=None, flags=0,
+                                       type=gtk.MESSAGE_WARNING, buttons=gtk.BUTTONS_CLOSE,
+                                       message_format=None)
+                       dialog.set_markup("Revision <b>%s</b> not present in the list" % revid)
                        # revid == 0 is the parent of the first commit
                        if (revid != 0 ):
                        # revid == 0 is the parent of the first commit
                        if (revid != 0 ):
-                               print "Try running gitview without any options"
+                               dialog.format_secondary_text("Try running gitview without any options")
+                       dialog.run()
+                       dialog.destroy()
 
                self.treeview.grab_focus()
 
 
                self.treeview.grab_focus()
 
-       def _show_clicked_cb(self, widget,  commit_sha1, parent_sha1):
+       def _show_clicked_cb(self, widget,  commit_sha1, parent_sha1, encoding):
                """Callback for when the show button for a parent is clicked."""
                window = DiffWindow()
                """Callback for when the show button for a parent is clicked."""
                window = DiffWindow()
-               window.set_diff(commit_sha1, parent_sha1)
+               window.set_diff(commit_sha1, parent_sha1, encoding)
                self.treeview.grab_focus()
 
                self.treeview.grab_focus()
 
+without_diff = 0
 if __name__ == "__main__":
 if __name__ == "__main__":
-       without_diff = 0
 
        if (len(sys.argv) > 1 ):
                if (sys.argv[1] == "--without-diff"):
 
        if (len(sys.argv) > 1 ):
                if (sys.argv[1] == "--without-diff"):