Example #1
0
    def launch_sidebyside_diff(self):
        """
        Launch diff as a side-by-side comparison using our comparison tool

        """

        action = SVNAction(self.svn, notification=False, run_in_thread=False)

        if self.revision1.kind == "working":
            dest1 = self.path1
        else:
            dest1 = self._build_export_path(1, self.revision1, self.path1)
            action.run_single(self.svn.export, self.path1, dest1,
                              self.revision1)
            action.stop_loader()

        if self.revision2.kind == "working":
            dest2 = self.path2
        else:
            dest2 = self._build_export_path(2, self.revision2, self.path2)
            action.run_single(self.svn.export, self.path2, dest2,
                              self.revision2)
            action.stop_loader()

        helper.launch_diff_tool(dest1, dest2)
Example #2
0
    def launch_unified_diff(self):
        """
        Launch diff as a unified diff in a text editor or .diff viewer
        
        """
        
        action = SVNAction(
            self.svn,
            notification=False,
            run_in_thread=False
        )
        
        diff_text = action.run_single(
            self.svn.diff,
            self.temp_dir,
            self.path1,
            self.revision1,
            self.path2,
            self.revision2
        )
        if diff_text is None:
            diff_text = ""

        fh = tempfile.mkstemp("-rabbitvcs-" + str(self.revision1) + "-" + str(self.revision2) + ".diff")
        os.write(fh[0], diff_text)
        os.close(fh[0])
        rabbitvcs.util.helper.open_item(fh[1])
Example #3
0
    def save(self):
        delete_recurse = self.get_widget("delete_recurse").get_active()

        self.action = SVNAction(
            self.svn,
            notification=False,
            run_in_thread=False
        )

        for row in self.delete_stack:
            self.action.append(
                self.svn.revpropdel,
                self.path,
                row[1],
                self.revision_obj,
                force=True
            )

        for row in self.table.get_items():
            self.action.append(
                self.svn.revpropset,
                row[1],
                row[2],
                self.path,
                self.revision_obj,
                force=True
            )

        self.action.schedule()

        self.close()
Example #4
0
    def load(self):
        from_rev_num = self.get_widget("from").get_text().lower()
        to_rev_num = self.get_widget("to").get_text().lower()
        
        if not from_rev_num.isdigit():
            MessageBox(_("The from revision field must be an integer"))
            return
             
        from_rev = self.svn.revision("number", number=int(from_rev_num))
        
        to_rev = self.svn.revision("head")
        if to_rev_num.isdigit():
            to_rev = self.svn.revision("number", number=int(to_rev_num))
        
        self.action = SVNAction(
            self.svn,
            notification=False
        )    

        self.action.append(
            self.svn.annotate,
            self.path,
            from_rev,
            to_rev
        )
        self.action.append(self.populate_table)
        self.action.append(self.enable_saveas)
        self.action.start()
Example #5
0
 def start(self):
     self.action = SVNAction(self.svn,
                             register_gtk_quit=self.gtk_quit_is_set())
     self.action.append(self.action.set_header, _("Update"))
     self.action.append(self.action.set_status, _("Updating..."))
     self.action.append(self.svn.update, self.paths)
     self.action.append(self.action.set_status, _("Completed Update"))
     self.action.append(self.action.finish)
     self.action.schedule()
Example #6
0
    def start(self):
        self.action = SVNAction(self.svn,
                                register_gtk_quit=self.gtk_quit_is_set())

        self.action.append(self.action.set_header, _("Cleanup"))
        self.action.append(self.action.set_status, _("Cleaning Up..."))
        self.action.append(self.svn.cleanup, self.path)
        self.action.append(self.action.set_status, _("Completed Cleanup"))
        self.action.append(self.action.finish)
        self.action.start()
Example #7
0
    def launch_sidebyside_diff(self):
        """
        Launch diff as a side-by-side comparison using our comparison tool
        
        """

        action = SVNAction(
            self.svn,
            notification=False,
            run_in_thread=False
        )

        if self.revision1.kind == "working":
            dest1 = self.path1
        else:
            dest1 = self._build_export_path(1, self.revision1, self.path1)
            action.run_single(
                self.svn.export, 
                self.path1, 
                dest1, 
                self.revision1,
                silent_fail=True
            )
            action.stop_loader()
            if not os.path.isfile(dest1):
                with open(dest1, 'a'):
                    os.utime(dest1, None)
    
        if self.revision2.kind == "working":
            dest2 = self.path2
        else:
            dest2 = self._build_export_path(2, self.revision2, self.path2)
            action.run_single(
                self.svn.export, 
                self.path2, 
                dest2, 
                self.revision2,
                silent_fail=True
            )
            action.stop_loader()
            if not os.path.isfile(dest2):
                with open(dest2, 'a'):
                    os.utime(dest2, None)
    
        rabbitvcs.util.helper.launch_diff_tool(dest1, dest2)
Example #8
0
    def on_ok_clicked(self, widget):
        url = self.repositories.get_active_text()
        path = self._get_path()
        omit_externals = self.get_widget("omit_externals").get_active()
        recursive = self.get_widget("recursive").get_active()

        if not url or not path:
            MessageBox(_("The repository URL and destination path are both required fields."))
            return
        
        if url.startswith("file://"):
            url = self._parse_path(url)
        
        # Cannot do:
        # url = os.path.normpath(url)
        # ...in general, since it might be eg. an http URL. Doesn't seem to
        # affect pySvn though.
        
        path = os.path.normpath(path)        
        revision = self.revision_selector.get_revision_object()

        self.hide()
        self.action = SVNAction(
            self.svn,
            register_gtk_quit=self.gtk_quit_is_set()
        )
        
        self.action.append(self.action.set_header, _("Export"))
        self.action.append(self.action.set_status, _("Running Export Command..."))
        self.action.append(rabbitvcs.util.helper.save_repository_path, url)
        self.action.append(
            self.svn.export,
            url,
            path,
            force=True,
            recurse=recursive,
            revision=revision,
            ignore_externals=omit_externals
        )
        self.action.append(self.action.set_status, _("Completed Export"))
        self.action.append(self.action.finish)
        self.action.start()
    def load(self, revision):
        revision = revision.lower()
        rev = self.svn.revision("HEAD")
        if revision.isdigit():
            rev = self.svn.revision("number", number=int(revision))

        self.launch_loading()

        self.action = SVNAction(self.svn, notification=False)

        self.action.append(self.svn.annotate, self.path, to_revision=rev)

        if not self.log_by_order:
            self.action.append(self.svn.log, self.path)
            self.action.append(self.set_log)

        self.action.append(self.populate_table)
        self.action.append(self.enable_saveas)
        self.action.schedule()

        self.kill_loading()
    def on_ok_clicked(self, widget):

        from_url = self.get_widget("from_url").get_text()
        to_url = self.get_widget("to_url").get_text()

        if not from_url or not to_url:
            MessageBox(_("The from and to url fields are both required."))
            return

        self.hide()

        self.action = SVNAction(self.svn,
                                register_gtk_quit=self.gtk_quit_is_set())

        self.action.append(self.action.set_header, _("Relocate"))
        self.action.append(self.action.set_status,
                           _("Running Relocate Command..."))
        self.action.append(self.svn.relocate, from_url, to_url, self.path)
        self.action.append(self.action.set_status, _("Completed Relocate"))
        self.action.append(self.action.finish)
        self.action.start()
Example #11
0
    def merge(self, test=False):
        if self.type is None:
            return

        if test:
            startcmd = _("Running Merge Test")
            endcmd = _("Completed Merge Test")
        else:
            startcmd = _("Running Merge Command")
            endcmd = _("Completed Merge")
            self.hide()

        recursive = self.get_widget("mergeoptions_recursive").get_active()
        ignore_ancestry = self.get_widget(
            "mergeoptions_ignore_ancestry").get_active()

        record_only = False
        if self.svn.has_merge2():
            record_only = self.get_widget(
                "mergeoptions_only_record").get_active()

        action = SVNAction(self.svn, register_gtk_quit=(not test))
        action.append(action.set_header, _("Merge"))
        action.append(action.set_status, startcmd)

        args = ()
        kwargs = {}

        if self.type == "range":
            url = self.get_widget("mergerange_from_urls").get_active_text()
            head_revision = self.svn.get_head(self.path)
            revisions = self.get_widget("mergerange_revisions").get_text()
            if revisions == "":
                revisions = "head"
            revisions = revisions.lower().replace("head", str(head_revision))

            ranges = []
            for r in revisions.split(","):
                if r.find("-") != -1:
                    (low, high) = [int(i) for i in r.split("-")]
                    if low < high:
                        low -= 1
                elif r.find(":") != -1:
                    (low, high) = [int(i) for i in r.split(":")]
                    if low < high:
                        low -= 1
                else:
                    high = int(r)
                    low = high - 1

                # Before pysvn v1.6.3, there was a bug that required the ranges
                # tuple to have three elements, even though only two were used
                # Fixed in Pysvn Revision 1114
                if (self.svn.interface == "pysvn"
                        and self.svn.is_version_less_than((1, 6, 3, 0))):
                    ranges.append(
                        (self.svn.revision("number", number=low).primitive(),
                         self.svn.revision("number",
                                           number=high).primitive(), None))
                else:
                    ranges.append((
                        self.svn.revision("number", number=low).primitive(),
                        self.svn.revision("number", number=high).primitive(),
                    ))

            action.append(rabbitvcs.util.helper.save_repository_path, url)

            # Build up args and kwargs because some args are not supported
            # with older versions of pysvn/svn
            args = (self.svn.merge_ranges, url, ranges,
                    self.svn.revision("head"), self.path)
            kwargs = {
                "notice_ancestry": (not ignore_ancestry),
                "dry_run": test
            }
            if record_only:
                kwargs["record_only"] = record_only

        elif self.type == "reintegrate":
            url = self.merge_reintegrate_repos.get_active_text()
            revision = self.merge_reintegrate_revision.get_revision_object()

            action.append(rabbitvcs.util.helper.save_repository_path, url)

            # Build up args and kwargs because some args are not supported
            # with older versions of pysvn/svn
            args = (self.svn.merge_reintegrate, url, revision, self.path)
            kwargs = {"dry_run": test}

        elif self.type == "tree":
            from_url = self.get_widget("mergetree_from_urls").get_active_text()
            from_revision = self.svn.revision("head")
            if self.get_widget(
                    "mergetree_from_revision_number_opt").get_active():
                from_revision = self.svn.revision(
                    "number",
                    number=int(
                        self.get_widget(
                            "mergetree_from_revision_number").get_text()))
            to_url = self.get_widget("mergetree_to_urls").get_active_text()
            to_revision = self.svn.revision("head")
            if self.get_widget(
                    "mergetree_to_revision_number_opt").get_active():
                to_revision = self.svn.revision(
                    "number",
                    number=int(
                        self.get_widget(
                            "mergetree_to_revision_number").get_text()))

            action.append(rabbitvcs.util.helper.save_repository_path, from_url)
            action.append(rabbitvcs.util.helper.save_repository_path, to_url)

            # Build up args and kwargs because some args are not supported
            # with older versions of pysvn/svn
            args = (self.svn.merge_trees, from_url, from_revision, to_url,
                    to_revision, self.path)
            kwargs = {"recurse": recursive, "dry_run": test}

        if len(args) > 0:
            action.append(*args, **kwargs)

        action.append(action.set_status, endcmd)
        action.append(action.finish)
        action.start()
Example #12
0
    def initialize_root_url(self):
        action = SVNAction(self.svn, notification=False, run_in_thread=False)

        self.root_url = action.run_single(self.svn.get_repo_url, self.path)