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
示例#2
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)
         ])
示例#3
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()
 def __getstate__(self):
     attrs = self.__dict__.copy()
     # Force strings to Unicode to avoid json implicit conversion.
     for key in attrs:
         if isinstance(attrs[key], (six.string_types, six.text_type)):
             attrs[key] = S(attrs[key]).unicode()
     attrs['__type__'] = type(self).__name__
     attrs['__module__'] = type(self).__module__
     return attrs
    def show_add(self):
        self.state = STATE_ADD

        revision = "HEAD"
        if self.revision:
            active_branch = self.git.get_active_branch()
            if active_branch:
                revision = S(active_branch.name)

        self.items_treeview.unselect_all()
        self.branch_entry.set_text("")
        self.save_button.set_label(_("Add"))
        self.start_point_entry.set_text(S(revision).display())
        self.track_checkbox.set_active(True)
        self.checkout_checkbox.set_sensitive(True)
        self.checkout_checkbox.set_active(False)
        self.show_rows(self.add_rows)
        self.get_widget("detail_label").set_markup(_("<b>Add Branch</b>"))
示例#6
0
    def __init__(self, path, vcs=None, claim_domain=True):
        rabbitvcs.ui.GtkBuilderWidgetWrapper.__init__(self,
                                                 claim_domain=claim_domain)

        self.path = path
        self.vcs = vcs or rabbitvcs.vcs.VCS()
        self.checker = StatusChecker()

        self.get_widget("file_name").set_text(S(os.path.basename(path)).display())

        self.status = self.checker.check_status(path,
                                                recurse = False,
                                                invalidate = False,
                                                summary = False)

        self.get_widget("vcs_type").set_text(S(self.status.vcs_type).display())

        self.get_widget("content_status").set_text(S(self.status.simple_content_status()).display())
        self.get_widget("prop_status").set_text(S(self.status.simple_metadata_status()).display())


        self.set_icon_from_status(self.get_widget("content_status_icon"),
                                                  self.status.simple_content_status())

        self.set_icon_from_status(self.get_widget("prop_status_icon"),
                                                  self.status.simple_metadata_status())



        self.set_icon_from_status(self.get_widget("vcs_icon"),
                                  self.status.single, Gtk.IconSize.DIALOG)

        additional_info = self.get_additional_info()
        if additional_info:
            additional_props_table = rabbitvcs.ui.widget.KeyValueTable(
                                        additional_info)
            additional_props_table.show()

            file_info_table = rabbitvcs.ui.widget.Box(self.get_widget("file_info_table"), vertical = True)
            file_info_table.pack_start(additional_props_table,
                                       expand=False,
                                       fill=False,
                                       padding=0)
    def view_selected_diff(self, sidebyside=False):
        for row in self.selected_rows:
            url1 = self.changes_table.get_row(row)[0]
            url2 = url1
            if url1 == ".":
                url1 = ""
                url2 = ""

            url1 = helper.url_join(self.first_urls.get_active_text(), url1)
            url2 = helper.url_join(self.second_urls.get_active_text(), url2)
            rev1 = self.get_first_revision()
            rev2 = self.get_second_revision()

            helper.launch_ui_window("diff", [
                "%s@%s" % (url1, S(rev1)),
                "%s@%s" % (url2, S(rev2)),
                "%s" % (sidebyside and "-s" or ""),
                "--vcs=%s" % self.get_vcs_name()
            ])
    def compare_working_copy(self, widget, data=None):
        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(self.revisions[0])), self.path,
            "--vcs=%s" % self.caller.get_vcs_name()
        ])
 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),
             item.simple_content_status(),
             item.simple_metadata_status()
         ])
示例#10
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))
示例#11
0
    def compare(self, widget, data=None):
        for row in self.caller.selected_rows:
            url1 = self.caller.changes_table.get_row(row)[0]
            url2 = url1
            if url1 == ".":
                url1 = ""
                url2 = ""

            url1 = helper.url_join(self.caller.first_urls.get_active_text(),
                                   url1)
            url2 = helper.url_join(self.caller.second_urls.get_active_text(),
                                   url2)
            rev1 = self.caller.get_first_revision()
            rev2 = self.caller.get_second_revision()

            helper.launch_ui_window("diff", [
                "%s@%s" % (url1, S(rev1)),
                "%s@%s" % (url2, S(rev2)), "-s",
                "--vcs=%s" % self.caller.get_vcs_name()
            ])
    def __init__(self, str=None):
        Gtk.Label.__init__(self)

        self.__wrap_width = 0
        self.layout = self.get_layout()
        self.layout.set_wrap(Pango.WrapMode.WORD_CHAR)

        if str != None:
            self.set_text(S(str).display())

        self.set_alignment(0.0, 0.0)
示例#13
0
    def __init__(self, paths, base_dir=None, message=None):
        Commit.__init__(self, paths, base_dir, message)

        self.get_widget("commit_to_box").show()

        self.get_widget("to").set_text(
            S(self.vcs.svn().get_repo_url(self.base_dir)).display())

        self.items = None
        if len(self.paths):
            self.initialize_items()
示例#14
0
    def should_item_be_activated(self, item):
        """
        Determines if a file should be activated or not
        """

        if (S(item.path) in self.paths
                or item.is_versioned() and item.simple_content_status() !=
                rabbitvcs.vcs.status.status_missing):
            return True

        return False
示例#15
0
    def show_detail(self, tag_name):
        self.selected_tag = None
        for item in self.tag_list:
            if S(item.name) == tag_name:
                self.selected_tag = item
                break

        self.save_button.set_label(_("Save"))
        if self.selected_tag:
            self.tag_entry.set_text(S(self.selected_tag.name).display())
            self.revision_label.set_text(S(self.selected_tag.sha).display())
            self.message_label.set_text(
                S(self.selected_tag.message).display().rstrip("\n"))
            self.tagger_label.set_text(S(self.selected_tag.tagger).display())
            self.date_label.set_text(
                helper.format_datetime(
                    datetime.fromtimestamp(self.selected_tag.tag_time),
                    self.datetime_format))

            self.show_rows(self.view_rows)
            self.get_widget("detail_label").set_markup(_("<b>Tag Detail</b>"))
示例#16
0
    def open_second(self, widget, data=None):
        path = self.caller.changes_table.get_row(
            self.caller.selected_rows[0])[0]
        if path == ".":
            path = ""

        url = helper.url_join(self.caller.second_urls.get_active_text(), path)
        rev = self.caller.get_second_revision()
        helper.launch_ui_window(
            "open",
            ["--vcs=%s" % self.caller.get_vcs_name(), url,
             "-r%s" % S(rev)])
示例#17
0
 def on_show_log(self, widget, *args):
     path = []
     if widget.get_label() == self.get_widget("cur_log").get_label():
         path.append(self.paths[0])
     else:
         path_to_check = S(self.paths[0])
         while path_to_check != "/" and path_to_check != "":
             if os.path.isdir(os.path.join(path_to_check, ".svn")):
                 path.append(path_to_check)
                 break
             path_to_check = os.path.split(path_to_check)[0]
     helper.launch_ui_window("log", path)
示例#18
0
    def on_repositories_changed(self, widget, data=None):
        url = self.repositories.get_active_text()
        tmp = [x.strip() for x in url.split("/") if x.strip()]
        if tmp and tmp[0].lower() in ("http:", "https:", "file:", "git:"):
            del tmp[0]
        append = tmp[-1] if tmp else ""
        if append.endswith(".git"):
            append = append[:-4]

        helper.run_in_main_thread(
            self.get_widget("destination").set_text,
            S(os.path.join(self.destination, append)).display())
        self.check_form()
示例#19
0
    def update_branch_info(self):
        from_branch = self.from_branches.get_revision_object()

        if from_branch.value:
            log = self.git.log(self.path,
                               limit=1,
                               revision=from_branch,
                               showtype="branch")
            if log:
                from_info = log[0]
                self.info['from']['author'].set_text(
                    S(from_info.author).display())
                self.info['from']['date'].set_text(
                    helper.format_datetime(from_info.date,
                                           self.datetime_format))
                self.info['from']['revision'].set_text(
                    S(from_info.revision).display()[0:7])
                self.info['from']['message'].set_text(
                    S(
                        helper.html_escape(
                            helper.format_long_text(from_info.message,
                                                    500))).display())
示例#20
0
    def populate_files_table(self):
        for item in self.items:

            locked = ""
            if self.svn.is_locked(item.path):
                locked = _("Yes")
            if not self.svn.is_versioned(item.path):
                continue

            self.files_table.append([
                True,
                S(item.path), item.path,
                helper.get_file_extension(item.path), locked
            ])
示例#21
0
    def date_filter(self, row, column, user_data=None):
        """
        Table filter to convert the item date to something readable
        """

        if row[0] == "..":
            return ""

        if row[column]:
            change_time = datetime.fromtimestamp(float(row[column]))
            return str(
                S(helper.format_datetime(change_time, self.datetime_format)))

        return str(row[column])
示例#22
0
    def get_background_items_profile(self, window, item):
        import cProfile

        path = S(gnomevfs.get_local_path_from_uri(item.get_uri())).replace(
            "/", ":")

        profile_data_file = os.path.join(get_home_folder(),
                                         "checkerservice_%s.stats" % path)

        prof = cProfile.Profile()
        retval = prof.runcall(self.get_background_items_real, window, item)
        prof.dump_stats(profile_data_file)
        log.debug("Dumped: %s" % profile_data_file)
        return retval
    def __init__(self, path, revision=None):
        PropertiesBase.__init__(self, path)

        self.svn = self.vcs.svn()

        if not self.svn.is_path_repository_url(path):
            self.path = self.svn.get_repo_url(path)
            self.get_widget("path").set_text(S(self.path).display())

        self.revision = revision
        self.revision_obj = None
        if revision is not None:
            self.revision_obj = self.svn.revision("number", revision)

        self.load()
示例#24
0
    def on_merge_reintegrate_prepare(self):
        if not hasattr(self, "merge_reintegrate_repos"):
            self.merge_reintegrate_repos = rabbitvcs.ui.widget.ComboBox(
                self.get_widget("merge_reintegrate_repos"), self.repo_paths)
            self.merge_reintegrate_repos.cb.connect(
                "changed", self.on_merge_reintegrate_from_urls_changed)
            self.get_widget("merge_reintegrate_working_copy").set_text(
                S(self.path).display())

        if not hasattr(self, "merge_reintegrate_revision"):
            self.merge_reintegrate_revision = rabbitvcs.ui.widget.RevisionSelector(
                self.get_widget("revision_container"),
                self.svn,
                url_combobox=self.merge_reintegrate_repos,
                expand=True)
示例#25
0
    def CheckStatus(self,
                    path,
                    recurse=False,
                    invalidate=False,
                    summary=False):
        """ Requests a status check from the underlying status checker.
            Path is given as an array of bytes instead of a string because
            dbus does not support strings with invalid characters.
        """
        status = self.status_checker.check_status(S(bytearray(path)),
                                                  recurse=recurse,
                                                  summary=summary,
                                                  invalidate=invalidate)

        return self.encoder.encode(status)
示例#26
0
    def set_status(self, message):
        """
        Set the current status of the VCS action.  Currently, this method
        is called at the beginning and end of each action, to display what is
        going on.  Currently, it just appends the status message to the
        notification window.  In the future, I may set up a progress bar
        and put the status message there.

        @type   message: string
        @param  message: A status message.
        """

        if message is not None:
            self.notification.get_widget("status").set_text(
                S(message).display())
示例#27
0
    def save_diff_to_file(self, path, data):
        dirname = os.path.dirname(path)
        if not os.path.isdir(dirname):
            os.makedirs(dirname)

        if not data:
            data = ""

        file = open(path, "wb")
        try:
            try:
                file.write(S(data).bytes())
            except Exception as e:
                log.exception(e)
        finally:
            file.close()
 def set_log(self):
     self.log_by_order = self.action.get_result(1)
     self.log_by_order.reverse()
     self.log_by_revision = {}
     self.author_background = {}
     for n, log in enumerate(self.log_by_order):
         setattr(log, "n", n)
         c = self.randomHSL()
         c = helper.HSLtoRGB(*c)
         setattr(log, "background", helper.html_color(*c))
         self.log_by_revision[self.short_revision(log.revision)] = log
         author = S(log.author.strip())
         if author:
             c = self.randomHSL()
             c = helper.HSLtoRGB(*c)
             self.author_background[author] = helper.html_color(*c)
示例#29
0
    def __init__(self, paths, base_dir=None, message=None):
        Commit.__init__(self, paths, base_dir, message)

        self.git = self.vcs.git(paths[0])

        self.get_widget("commit_to_box").show()

        active_branch = self.git.get_active_branch()
        if active_branch:
            self.get_widget("to").set_text(S(active_branch.name).display())
        else:
            self.get_widget("to").set_text("No active branch")

        self.items = None
        if len(self.paths):
            self.initialize_items()
示例#30
0
    def launch_unified_diff(self):
        """
        Launch diff as a unified diff in a text editor or .diff viewer

        """

        action = GitAction(self.git, notification=False, run_in_thread=False)

        diff_text = action.run_single(self.git.diff, self.path1,
                                      self.revision1, self.path2,
                                      self.revision2)
        if diff_text is None:
            diff_text = ""

        fh = tempfile.mkstemp("-rabbitvcs-" + str(self.revision1)[:5] + "-" +
                              str(self.revision2)[:5] + ".diff")
        os.write(fh[0], S(diff_text).bytes())
        os.close(fh[0])
        helper.open_item(fh[1])