예제 #1
0
    def show_edit(self, branch_name):
        self.state = STATE_EDIT
        branch_name = saxutils.unescape(branch_name)
        self.selected_branch = None
        for item in self.branch_list:
            if item.name == branch_name:
                self.selected_branch = item
                break

        self.save_button.set_label(_("Save"))

        if self.selected_branch:
            self.branch_entry.set_text(S(self.selected_branch.name).display())
            self.revision_label.set_text(
                S(self.selected_branch.revision).display())
            self.message_label.set_text(
                S(self.selected_branch.message.rstrip("\n")).display())
            if self.selected_branch.tracking:
                self.checkout_checkbox.set_active(True)
                self.checkout_checkbox.set_sensitive(False)
            else:
                self.checkout_checkbox.set_active(False)
                self.checkout_checkbox.set_sensitive(True)

        self.show_rows(self.view_rows)
        self.get_widget("detail_label").set_markup(_("<b>Branch Detail</b>"))
예제 #2
0
    def _populate_checker_tab(self, report_failure=True, connect=True):
        # This is a limitation of GLADE, and can be removed when we migrate to
        # GTK2 Builder

        checker_service = self.checker_service
        if not checker_service and connect:
            checker_service = self._get_checker_service(report_failure)

        self.get_widget("stop_checker").set_sensitive(bool(checker_service))

        if (checker_service):
            self.get_widget("checker_type").set_text(
                S(checker_service.CheckerType()).display())
            self.get_widget("pid").set_text(S(checker_service.PID()).display())

            memory = checker_service.MemoryUsage()

            if memory:
                self.get_widget("memory_usage").set_text("%s KB" % memory)
            else:
                self.get_widget("memory_usage").set_text(CHECKER_UNKNOWN_INFO)

            self.get_widget("locale").set_text(
                S(".".join(checker_service.SetLocale())).display())

            self._populate_info_table(checker_service.ExtraInformation())

        else:
            self.get_widget("checker_type").set_text(CHECKER_UNKNOWN_INFO)
            self.get_widget("pid").set_text(CHECKER_UNKNOWN_INFO)
            self.get_widget("memory_usage").set_text(CHECKER_UNKNOWN_INFO)
            self.get_widget("locale").set_text(CHECKER_UNKNOWN_INFO)
            self._clear_info_table()
예제 #3
0
 def diff_previous_revision(self, widget, data=None):
     prev = self.caller.previous_revision(self.revisions[0])
     helper.launch_ui_window("diff", [
         "%s@%s" % (self.path, S(prev)),
         "%s@%s" % (self.path, S(self.revisions[0])),
         "--vcs=%s" % self.caller.get_vcs_name()
     ])
예제 #4
0
    def __init__(self, path):
        '''
        Initialises the UI.
        '''
        InterfaceView.__init__(self, "property_editor", "PropertyEditor")

        note = rabbitvcs.ui.wraplabel.WrapLabel(PROP_EDITOR_NOTE)
        note.set_hexpand(True)
        note.set_use_markup(True)

        self.get_widget("note_box").add(note)
        self.get_widget("note_box").show_all()

        self.path = path

        self.get_widget("wc_text").set_text(
            S(self.get_local_path(os.path.realpath(path))).display())

        self.vcs = rabbitvcs.vcs.VCS()
        self.svn = self.vcs.svn()

        if not self.svn.is_versioned(self.path):
            rabbitvcs.ui.dialog.MessageBox(
                _("File is not under version control."))
            self.close()
            return

        self.get_widget("remote_uri_text").set_text(
            S(self.svn.get_repo_url(path)).display())

        self.table = rabbitvcs.ui.widget.Table(
            self.get_widget("table"), [
                GObject.TYPE_STRING, rabbitvcs.ui.widget.TYPE_ELLIPSIZED,
                GObject.TYPE_STRING, rabbitvcs.ui.widget.TYPE_STATUS
            ],
            [_("Name"), _("Value"),
             _("Reserved"), _("Status")],
            filters=[{
                "callback": rabbitvcs.ui.widget.long_text_filter,
                "user_data": {
                    "cols": 0,
                    "column": 1
                }
            }, {
                "callback": rabbitvcs.ui.widget.translate_filter,
                "user_data": {
                    "column": 3
                }
            }],
            callbacks={
                "row-activated": self.on_table_row_activated,
                "mouse-event": self.on_table_mouse_event,
                "key-event": self.on_table_key_event
            })
        self.table.allow_multiple()

        self.refresh()
예제 #5
0
 def real_reply_handler(json_status):
     # Note that this a closure referring to the outer functions callback
     # parameter
     status = self.decoder.decode(json_status)
     path1 = S(path)
     path2 = S(status.path)
     assert path1 == path2, "Status check returned the wrong path "\
                                 "(asked about %s, got back %s)" % \
                                 (path1.display(), path2.display())
     callback(status)
예제 #6
0
 def diff_revisions(self, widget, data=None):
     rev1 = self.revisions[0]
     rev2 = self.revisions[-1]
     if self.caller.compare_revision_order(rev1, rev2) > 0:
         rev1, rev2 = rev2, rev1
     helper.launch_ui_window("diff", [
         "%s@%s" % (self.path, S(rev1)),
         "%s@%s" % (self.path, S(rev2)),
         "--vcs=%s" % self.caller.get_vcs_name()
     ])
예제 #7
0
    def on_more_actions_view_unified_diff(self):
        url1 = self.first_urls.get_active_text()
        rev1 = self.get_first_revision()
        rev2 = self.get_second_revision()
        url2 = self.second_urls.get_active_text()

        helper.launch_ui_window("diff", [
            "%s@%s" % (url1, S(rev1)),
            "%s@%s" % (url2, S(rev2)),
            "--vcs=%s" % self.get_vcs_name()
        ])
예제 #8
0
    def populate_table(self, item_index=0):
        self.list_table.clear()
        self.items = self.action.get_result(item_index)
        self.items.sort(key=self.sort_files_key)

        self.list_table.append([S(".."), "..", 0, 0, "", 0])
        for item, locked in self.items[1:]:
            self.list_table.append([
                S(item.path), item.path, item.created_rev.number, item.size,
                item.last_author, item.time
            ])
예제 #9
0
 def show_revision(self, revision=None, forceload=False):
     if revision is None:
         revision = self.history[self.history_index]
     revision = S(S(revision).strip())
     self.revision.set_text(revision.display())
     if revision.lower() != self.history[self.history_index].lower():
         forceload = True
         self.history_index += 1
         self.history = self.history[:self.history_index] + [revision]
     self.set_history_sensitive()
     if forceload:
         self.load(revision)
예제 #10
0
    def compare_previous_revision(self, widget, data=None):
        prev = self.caller.previous_revision(self.revisions[0])
        path_older = self.path
        if self.vcs_name == rabbitvcs.vcs.VCS_SVN:
            path_older = self.vcs.svn().get_repo_url(self.path)

        helper.launch_ui_window("diff", [
            "-s",
            "%s@%s" % (path_older, S(prev)),
            "%s@%s" % (self.path, S(self.revisions[0])),
            "--vcs=%s" % self.caller.get_vcs_name()
        ])
예제 #11
0
    def file_column_callback(self, filename):
        """
        Determine the node kind (dir or file) from our retrieved items list
        """

        filename = S(filename).unicode()
        if filename == six.u(".."):
            return "dir"

        for item, locked in self.items:
            if S(item.path).unicode() == filename:
                return self.svn.NODE_KINDS_REVERSE[item.kind]
        return None
예제 #12
0
 def compare_revisions(self, widget, data=None):
     rev1 = self.revisions[0]
     rev2 = self.revisions[-1]
     if self.caller.compare_revision_order(rev1, rev2) > 0:
         rev1, rev2 = rev2, rev1
     path_older = self.path
     if self.vcs_name == rabbitvcs.vcs.VCS_SVN:
         path_older = self.vcs.svn().get_repo_url(self.path)
     helper.launch_ui_window("diff", [
         "-s",
         "%s@%s" % (path_older, S(rev1)),
         "%s@%s" % (self.path, S(rev2)),
         "--vcs=%s" % self.caller.get_vcs_name()
     ])
예제 #13
0
    def GenerateMenuConditions(self, paths):
        upaths = []
        for path in paths:
            upaths.append(S(bytearray(path)))

        path_dict = self.status_checker.generate_menu_conditions(upaths)
        return json.dumps(path_dict)
예제 #14
0
    def get_folder_menu_items(self, window, item):
        """
        Menu activated on entering a directory. Builds context menu for File
        menu and for window background.

        @type   window: NautilusNavigationWindow
        @param  window:

        @type   item:   NautilusVFSFile
        @param  item:

        @rtype:         list of MenuItems
        @return:        The context menu entries to add to the menu.

        """

        if not self.valid_uri(item.get_uri()): return
        path = realpath(S(self.get_local_path(item)))
        self.VFSFile_table[path] = item

        # log.debug("get_background_items() called")

        window.base_dir = path

        return ThunarxMainContextMenu(self, path, [path]).get_menu()
예제 #15
0
    def get_file_menu_items(self, window, items):
        """
        Menu activated with items selected. Nautilus also calls this function
        when rendering submenus, even though this is not needed since the entire
        menu has already been returned.

        Note that calling C{nautilusVFSFile.invalidate_extension_info()} will
        also cause get_file_items to be called.

        @type   window: NautilusNavigationWindow
        @param  window:

        @type   items:  list of NautilusVFSFile
        @param  items:

        @rtype:         list of MenuItems
        @return:        The context menu entries to add to the menu.

        """

        paths = []
        for item in items:
            if self.valid_uri(item.get_uri()):
                path = realpath(S(self.get_local_path(item)))
                paths.append(path)
                self.VFSFile_table[path] = item

        if len(paths) == 0: return []

        return ThunarxMainContextMenu(self, window.base_dir, paths).get_menu()
예제 #16
0
    def __init__(self, message):
        InterfaceView.__init__(self, "dialogs/message_box", "MessageBox")
        self.get_widget("messagebox_message").set_text(S(message).display())

        dialog = self.get_widget("MessageBox")
        dialog.run()
        dialog.destroy()
예제 #17
0
    def generate_menu_conditions(self, provider, base_dir, paths, callback):
        def real_reply_handler(obj):
            # Note that this a closure referring to the outer functions callback
            # parameter
            path_dict = json.loads(obj)
            callback(provider, base_dir, paths, path_dict)

        def reply_handler(*args, **kwargs):
            # The callback should be performed as a low priority task, so we
            # keep Nautilus as responsive as possible.
            GLib.idle_add(real_reply_handler, *args, **kwargs)

        def error_handler(dbus_ex):
            log.exception(dbus_ex)
            self._connect_to_checker()
            callback(provider, base_dir, paths, {})

        bpaths = [bytearray(S(p).bytes()) for p in paths]
        try:
            self.status_checker.GenerateMenuConditions(
                bpaths,
                dbus_interface=INTERFACE,
                timeout=TIMEOUT,
                reply_handler=reply_handler,
                error_handler=error_handler)
        except dbus.DBusException as ex:
            log.exception(ex)
            callback(provider, base_dir, paths, {})
            # Try to reconnect
            self._connect_to_checker()
예제 #18
0
    def __init__(self, title=None, label=None, current_text=None):
        InterfaceView.__init__(self, "dialogs/one_line_text_change",
                               "OneLineTextChange")
        if title:
            self.get_widget("OneLineTextChange").set_title(title)

        self.new_text = self.get_widget("new_text")
        self.label = self.get_widget("label")

        if label:
            self.label.set_text(S(label).display())

        if current_text:
            self.new_text.set_text(S(current_text).display())

        self.dialog = self.get_widget("OneLineTextChange")
예제 #19
0
    def __init__(self, paths, base_dir=None, message=None):
        """

        @type  paths:   list of strings
        @param paths:   A list of local paths.

        """
        InterfaceView.__init__(self, "commit", "Commit")

        self.base_dir = base_dir
        self.vcs = rabbitvcs.vcs.VCS()
        self.items = []

        self.files_table = rabbitvcs.ui.widget.Table(
            self.get_widget("files_table"), [
                GObject.TYPE_BOOLEAN, rabbitvcs.ui.widget.TYPE_HIDDEN_OBJECT,
                rabbitvcs.ui.widget.TYPE_PATH, GObject.TYPE_STRING,
                rabbitvcs.ui.widget.TYPE_STATUS, GObject.TYPE_STRING
            ], [
                rabbitvcs.ui.widget.TOGGLE_BUTTON, "",
                _("Path"),
                _("Extension"),
                _("Text Status"),
                _("Property Status")
            ],
            filters=[{
                "callback": rabbitvcs.ui.widget.path_filter,
                "user_data": {
                    "base_dir": base_dir,
                    "column": 2
                }
            }],
            callbacks={
                "row-activated": self.on_files_table_row_activated,
                "mouse-event": self.on_files_table_mouse_event,
                "key-event": self.on_files_table_key_event,
                "row-toggled": self.on_files_table_toggle_event
            },
            flags={
                "sortable": True,
                "sort_on": 2
            })
        self.files_table.allow_multiple()
        self.get_widget("toggle_show_unversioned").set_active(
            self.SHOW_UNVERSIONED)
        if not message:
            message = self.SETTINGS.get_multiline("general",
                                                  "default_commit_message")
        self.message = rabbitvcs.ui.widget.TextView(self.get_widget("message"),
                                                    message)

        self.paths = []
        for path in paths:
            if self.vcs.is_in_a_or_a_working_copy(path):
                self.paths.append(S(path))

        self.commit_and_push = False
        self.repository_selector = None
        self.is_git = False
        self.datetime_format = "%y.%m.%d (%a) %p %I:%M"
예제 #20
0
    def __init__(self):
        InterfaceView.__init__(self, "dialogs/previous_messages",
                               "PreviousMessages")

        self.message = rabbitvcs.ui.widget.TextView(
            self.get_widget("prevmes_message"))

        self.message_table = rabbitvcs.ui.widget.Table(
            self.get_widget("prevmes_table"),
            [GObject.TYPE_STRING, GObject.TYPE_STRING],
            [_("Date"), _("Message")],
            filters=[{
                "callback": rabbitvcs.ui.widget.long_text_filter,
                "user_data": {
                    "column": 1,
                    "cols": 80
                }
            }],
            callbacks={
                "cursor-changed": self.on_prevmes_table_cursor_changed,
                "row-activated": self.on_prevmes_table_row_activated
            })
        self.entries = rabbitvcs.util.helper.get_previous_messages()
        if self.entries is None:
            return None

        for entry in self.entries:
            self.message_table.append([entry[0], entry[1]])

        if len(self.entries) > 0:
            self.message.set_text(S(self.entries[0][1]).display())
예제 #21
0
    def __run(self, command):
        sys.stdout, self.stdout = self.stdout, sys.stdout
        sys.stderr, self.stderr = self.stderr, sys.stderr

        # eval and exec are broken in how they deal with utf8-encoded
        # strings so we have to explicitly decode the command before
        # passing it along
        command = S(command).unicode()
        try:
            try:
                r = eval(command, globals(), self.namespace)
                if not r is None:
                    print(repr(r))
            except SystemExit:
                self.exit()
            except SyntaxError:
                exec(command, globals(), self.namespace)
        except SystemExit:
            self.exit()
        except:
            if hasattr(sys, "last_type") and sys.last_type == SystemExit:
                self.exit()
            else:
                traceback.print_exc()

        sys.stdout, self.stdout = self.stdout, sys.stdout
        sys.stderr, self.stderr = self.stderr, sys.stderr
예제 #22
0
    def __init__(self, path=None, url=None, revision=None):
        InterfaceView.__init__(self, "checkout", "Checkout")

        self.path = path
        self.vcs = rabbitvcs.vcs.VCS()

        self.repositories = rabbitvcs.ui.widget.ComboBox(
            self.get_widget("repositories"),
            helper.get_repository_paths()
        )

        # We must set a signal handler for the Gtk.Entry inside the combobox
        # Because glade will not retain that information
        self.repositories.set_child_signal(
            "key-release-event",
            self.on_repositories_key_released
        )

        self.destination = helper.get_user_path()
        if path is not None:
            self.destination = path
            self.get_widget("destination").set_text(S(path).display())

        if url is not None:
            self.repositories.set_child_text(url)

        self.complete = False
예제 #23
0
 def sort_files_key(self, x):
     """
     Return a key to sort the browser listing so that folders are
     on top and then sort alphabetically.
     """
     kind = self.svn.NODE_KINDS_REVERSE[x[0].kind] != "dir"
     return (kind, locale.strxfrm(S(x[0].repos_path)))
예제 #24
0
    def check_status_now(self,
                         path,
                         recurse=False,
                         invalidate=False,
                         summary=False):

        status = None

        try:
            json_status = self.status_checker.CheckStatus(
                bytearray(S(path).bytes()),
                recurse,
                invalidate,
                summary,
                dbus_interface=INTERFACE,
                timeout=TIMEOUT)
            status = self.decoder.decode(json_status)
            # Test client error problems :)
            # raise dbus.DBusException("Test")
        except dbus.DBusException as ex:
            log.exception(ex)

            status = rabbitvcs.vcs.status.Status.status_error(path)

            # Try to reconnect
            self._connect_to_checker()

        return status
예제 #25
0
    def __init__(self, path, revision):
        """
        @type   path: string
        @param  path: The path to open

        @type   revision: string
        @param  revision: The revision of the file to open

        """

        InterfaceNonView.__init__(self)

        self.vcs = rabbitvcs.vcs.VCS()
        self.git = self.vcs.git(path)

        if revision:
            revision_obj = self.git.revision(revision)
        else:
            revision_obj = self.git.revision("HEAD")

        dest_dir = helper.get_tmp_path("rabbitvcs-" + S(revision))

        self.git.export(path, dest_dir, revision=revision_obj)

        repo_path = self.git.find_repository_path(path)
        relative_path = path
        if path.startswith(repo_path):
            relative_path = path[len(repo_path) + 1:]

        dest_path = "%s/%s" % (dest_dir, relative_path)

        helper.open_item(dest_path)

        raise SystemExit()
예제 #26
0
 def on_external_diff_tool_browse_clicked(self, widget):
     chooser = rabbitvcs.ui.dialog.FileChooser(_("Select a program"),
                                               "/usr/bin")
     path = chooser.run()
     if not path is None:
         path = path.replace("file://", "")
         self.get_widget("diff_tool").set_text(S(path).display())
예제 #27
0
 def populate_files_table(self):
     self.files_table.clear()
     for item in self.items:
         self.files_table.append([
             True,
             S(item.path), item.path,
             helper.get_file_extension(item.path)
         ])
예제 #28
0
 def __setstate__(self, state_dict):
     del state_dict['__type__']
     del state_dict['__module__']
     # Store strings in native str type.
     for key in state_dict:
         if isinstance(state_dict[key], (six.string_types, six.text_type)):
             state_dict[key] = str(S(state_dict[key]))
     self.__dict__ = state_dict
예제 #29
0
 def on_mergetree_prepare(self):
     if not hasattr(self, "mergetree_from_repos"):
         self.mergetree_from_repos = rabbitvcs.ui.widget.ComboBox(
             self.get_widget("mergetree_from_urls"), self.repo_paths)
         self.mergetree_to_repos = rabbitvcs.ui.widget.ComboBox(
             self.get_widget("mergetree_to_urls"), self.repo_paths)
         self.get_widget("mergetree_working_copy").set_text(
             S(self.path).display())
예제 #30
0
    def on_mergerange_prepare(self):
        if not hasattr(self, "mergerange_repos"):
            self.mergerange_repos = rabbitvcs.ui.widget.ComboBox(
                self.get_widget("mergerange_from_urls"), self.repo_paths)
            self.mergerange_repos.set_child_text(self.root_url)
            self.get_widget("mergerange_working_copy").set_text(
                S(self.path).display())

        self.mergerange_check_ready()