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)
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])
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()
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()
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()
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()
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)
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()
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()
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)