diff -Nru qbzr-0.18.6/AUTHORS.txt qbzr-0.19/AUTHORS.txt --- qbzr-0.18.6/AUTHORS.txt 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/AUTHORS.txt 2010-08-05 09:10:37.000000000 -0400 @@ -11,12 +11,14 @@ * Eugene Tarasenko * Gary van der Merwe * Goffredo Baroncelli + * Gordon Tyler * HAYASHI Kentaro * Ian Clatworthy * INADA Naoki * Javier Derderian * John Arbash Meinel * John Szakmeister + * Luis Arias * Lukáš Lalinský * Mario del Pozo * Mark Hammond @@ -27,6 +29,7 @@ * Ohad Kammar * Robert Widhopf-Fenk * Simon Kersey + * Toshio Kuratomi * Vincent Ladeuil Binary files /tmp/wEVcCvihcm/qbzr-0.18.6/data/22x22/document-properties.png and /tmp/NXqwHxNER2/qbzr-0.19/data/22x22/document-properties.png differ Binary files /tmp/wEVcCvihcm/qbzr-0.18.6/data/22x22/edit-find.png and /tmp/NXqwHxNER2/qbzr-0.19/data/22x22/edit-find.png differ Binary files /tmp/wEVcCvihcm/qbzr-0.18.6/data/22x22/go-jump.png and /tmp/NXqwHxNER2/qbzr-0.19/data/22x22/go-jump.png differ Binary files /tmp/wEVcCvihcm/qbzr-0.18.6/data/22x22/go-next.png and /tmp/NXqwHxNER2/qbzr-0.19/data/22x22/go-next.png differ Binary files /tmp/wEVcCvihcm/qbzr-0.18.6/data/22x22/go-previous.png and /tmp/NXqwHxNER2/qbzr-0.19/data/22x22/go-previous.png differ diff -Nru qbzr-0.18.6/data/qbzr.qrc qbzr-0.19/data/qbzr.qrc --- qbzr-0.18.6/data/qbzr.qrc 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/data/qbzr.qrc 2010-08-05 09:10:37.000000000 -0400 @@ -26,7 +26,12 @@ 16x16/folder-modified.png 16x16/folder-conflict.png 16x16/process-working.gif - 16x16/missing.png + + 22x22/document-properties.png + 22x22/edit-find.png + 22x22/go-jump.png + 22x22/go-next.png + 22x22/go-previous.png \ No newline at end of file diff -Nru qbzr-0.18.6/debian/changelog qbzr-0.19/debian/changelog --- qbzr-0.18.6/debian/changelog 2010-06-24 15:54:20.000000000 -0400 +++ qbzr-0.19/debian/changelog 2010-08-13 00:06:42.000000000 -0400 @@ -1,3 +1,9 @@ +qbzr (0.19-0ubuntu1) maverick; urgency=low + + * New upstream release. + + -- Andrew Starr-Bochicchio Fri, 13 Aug 2010 00:05:56 -0400 + qbzr (0.18.6-1ubuntu1) maverick; urgency=low * Merge from debian unstable. Remaining changes: diff -Nru qbzr-0.18.6/docs/exception_reporting.txt qbzr-0.19/docs/exception_reporting.txt --- qbzr-0.18.6/docs/exception_reporting.txt 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/docs/exception_reporting.txt 2010-08-05 09:10:37.000000000 -0400 @@ -14,21 +14,21 @@ MAIN_LOAD_METHOD ---------------- -The behaviour of this mode depends on wether the window is in ui_mode or not. +The behaviour of this mode depends on whether the window is in ui_mode or not. If in ui_mode, the window is closed, and the report is written to the console. If not in ui mode, the report is displayed in a dialog. This dialog only has one button - "Close", which closes both this dialog, and the window. -This mode should be used for initial window loding methods, where if the method +This mode should be used for initial window loading methods, where if the method fail, then the dialog would be useless, and hence gets closed every time. SUB_LOAD_METHOD --------------- +--------------- The behaviour of this mode is to show the report in a dialog, with just a close button. When the close button is clicked, the report dialog is closed, but not the window. -The mode should be used for methods where you are executing and action, or +The mode should be used for methods where you are executing an action, or loading data from user input provided in the gui, e.g. when you open a branch, and the location is from a text edit. In these cases, you need to tell the user that there was an error, but allow the user to continue working. @@ -37,10 +37,10 @@ -------------------- The behaviour of this mode is to show the report in a dialog, with just a close and a ignore button. When the close button is clicked, the report dialog and the -window are closed. If the ignor button is pressed, just the report dialog is +window are closed. If the ignore button is pressed, just the report dialog is closed. -If no mode it specifed by the method below, then the global exception handler +If no mode it specified by the method below, then the global exception handler uses this as the default, and hence covers alot of unexpected errors. It gives the user the option to ignore a minor error, and continue working. @@ -49,17 +49,17 @@ You can either decorate your method with @reports_exception, which wraps your method in a try..except for every time is is called. Or you can have your own try..except, and call report_exception in the except. Both of these except a -type paramater, with MAIN_LOAD_METHOD as the default. +type parameter, with MAIN_LOAD_METHOD as the default. -E.g.: +E.g.:: -@reports_exception() -def load(self): - -@reports_exception(type=SUB_LOAD_METHOD) -def refresh(self): - -try: - self.tree.add(paths) -except Exception: - report_exception(type=SUB_LOAD_METHOD, window=self.window()) \ No newline at end of file + @reports_exception() + def load(self): + + @reports_exception(type=SUB_LOAD_METHOD) + def refresh(self): + + try: + self.tree.add(paths) + except Exception: + report_exception(type=SUB_LOAD_METHOD, window=self.window()) diff -Nru qbzr-0.18.6/docs/index.txt qbzr-0.19/docs/index.txt --- qbzr-0.18.6/docs/index.txt 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/docs/index.txt 2010-08-05 09:10:37.000000000 -0400 @@ -5,6 +5,7 @@ * `Gettext usage in QBzr `_ * `Mini-tutorial on slots and signals`__ +* `Exception reporting in QBzr `_ __ slot-signal-mini-tutorial/slot-signal-mini-tutorial.html diff -Nru qbzr-0.18.6/docs/Makefile qbzr-0.19/docs/Makefile --- qbzr-0.18.6/docs/Makefile 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/docs/Makefile 2010-08-05 09:10:37.000000000 -0400 @@ -11,4 +11,5 @@ $(rst2html) $< $@ html: index.html gettext_usage.html make_release.html \ - slot-signal-mini-tutorial/slot-signal-mini-tutorial.html + slot-signal-mini-tutorial/slot-signal-mini-tutorial.html \ + exception_reporting.html diff -Nru qbzr-0.18.6/docs/make_release.txt qbzr-0.19/docs/make_release.txt --- qbzr-0.18.6/docs/make_release.txt 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/docs/make_release.txt 2010-08-05 09:10:37.000000000 -0400 @@ -86,7 +86,7 @@ 1. Update QBzr page at Bazaar wiki with corresponding NEWS entry, update links to tarball and installers. - http://bazaar-vcs.org/QBzr + http://wiki.bazaar.canonical.com/QBzr Make announcement diff -Nru qbzr-0.18.6/extras/build_mo.py qbzr-0.19/extras/build_mo.py --- qbzr-0.18.6/extras/build_mo.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/extras/build_mo.py 2010-08-05 09:10:37.000000000 -0400 @@ -28,6 +28,8 @@ import os import re +from en_po import regenerate_en + class build_mo(Command): """Subcommand of build command: build_mo""" @@ -94,16 +96,7 @@ else: log.info('Creating English PO file...') pot = (self.prj_name or 'messages') + '.pot' - if self.prj_name: - en_po = '%s-en.po' % self.prj_name - else: - en_po = 'en.po' - self.spawn(['msginit', - '--no-translator', - '-l', 'en', - '-i', os.path.join(self.source_dir, pot), - '-o', os.path.join(self.source_dir, en_po), - ]) + regenerate_en(self.prj_name, self.source_dir, pot, self.spawn) basename = self.output_base if not basename.endswith('.mo'): diff -Nru qbzr-0.18.6/extras/build_pot.py qbzr-0.19/extras/build_pot.py --- qbzr-0.18.6/extras/build_pot.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/extras/build_pot.py 2010-08-05 09:10:37.000000000 -0400 @@ -25,6 +25,8 @@ from distutils.core import Command from distutils.errors import DistutilsOptionError +from en_po import regenerate_en + class build_pot(Command): """Distutils command build_pot""" @@ -101,16 +103,7 @@ # regenerate english PO if self.english: log.info('Regenerating English PO file...') - if prj_name: - en_po = prj_name + '-' + 'en.po' - else: - en_po = 'en.po' - self.spawn(['msginit', - '--no-translator', - '-l', 'en', - '-i', os.path.join(self.build_dir, self.output), - '-o', os.path.join(self.build_dir, en_po), - ]) + regenerate_en(prj_name, self.build_dir, self.output, self.spawn) # search and update all po-files if self.no_lang: return diff -Nru qbzr-0.18.6/extras/en_po.py qbzr-0.19/extras/en_po.py --- qbzr-0.18.6/extras/en_po.py 1969-12-31 19:00:00.000000000 -0500 +++ qbzr-0.19/extras/en_po.py 2010-08-05 09:10:37.000000000 -0400 @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# +# QBzr - Qt frontend to Bazaar commands +# Copyright (C) 2010 Alexander Belchenko +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""Regenerate English en.po file from POT file.""" + +import os + + +def regenerate_en(prj_name, po_dir, pot_file, spawn): + if prj_name and prj_name != 'messages': + en_po = '%s-en.po' % prj_name + else: + en_po = 'en.po' + en_po_path = os.path.join(po_dir, en_po) + spawn(['msginit', + '--no-translator', + '-l', 'en', + '-i', os.path.join(po_dir, pot_file), + '-o', en_po_path, + ]) + # normalize line-endings in en.po file (to LF) + f = open(en_po_path, 'rU') + s = f.read() + f.close() + f = open(en_po_path, 'wb') + f.write(s) + f.close() diff -Nru qbzr-0.18.6/extras/import_po.py qbzr-0.19/extras/import_po.py --- qbzr-0.18.6/extras/import_po.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/extras/import_po.py 2010-08-05 09:10:37.000000000 -0400 @@ -23,6 +23,8 @@ from distutils.core import Command from distutils.spawn import find_executable +from en_po import regenerate_en + class import_po(Command): """Distutils command for import PO files.""" @@ -90,14 +92,5 @@ else: log.info('Re-creating English PO file...') prj_name = os.path.splitext(pot_file)[0] - if prj_name != 'messages': - en_po = '%s-en.po' % prj_name - else: - en_po = 'en.po' - self.spawn(['msginit', - '--no-translator', - '-l', 'en', - '-i', os.path.join(self.output_dir, pot_file), - '-o', os.path.join(self.output_dir, en_po), - ]) + regenerate_en(prj_name, self.output_dir, pot_file, self.spawn) log.info('Done.') diff -Nru qbzr-0.18.6/__init__.py qbzr-0.19/__init__.py --- qbzr-0.18.6/__init__.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/__init__.py 2010-08-05 09:10:37.000000000 -0400 @@ -2,6 +2,7 @@ # # QBzr - Qt frontend to Bazaar commands # Copyright (C) 2008 Lukáš Lalinský +# Copyright (C) 2009, 2010 QBzr Developers # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -69,7 +70,7 @@ * bug-url - print full URL to a specific bug, or open it in your browser. """ -version_info = (0, 18, 6, 'final', 0) +version_info = (0, 19, 0, 'final', 0) __version__ = '.'.join(map(str, version_info)) @@ -95,7 +96,7 @@ raise IncompatibleAPI(object_with_api, wanted_mimimum_api, minimum, current) -require_mimimum_api(bzrlib, (1, 17, 0)) +require_mimimum_api(bzrlib, (2, 1, 0)) from bzrlib.commands import plugin_cmds diff -Nru qbzr-0.18.6/installer/qbzr-setup.iss qbzr-0.19/installer/qbzr-setup.iss --- qbzr-0.18.6/installer/qbzr-setup.iss 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/installer/qbzr-setup.iss 2010-08-05 09:10:37.000000000 -0400 @@ -8,8 +8,8 @@ AppId=QBzr AppName= QBzr -AppVerName= QBzr 0.18.6 -OutputBaseFilename=qbzr-setup-0.18.6 +AppVerName= QBzr 0.19 +OutputBaseFilename=qbzr-setup-0.19 SourceDir="..\" OutputDir="." diff -Nru qbzr-0.18.6/lib/add.py qbzr-0.19/lib/add.py --- qbzr-0.18.6/lib/add.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/add.py 2010-08-05 09:10:37.000000000 -0400 @@ -60,10 +60,12 @@ self.filelist = TreeWidget(groupbox) self.filelist.throbber = self.throbber self.filelist.tree_model.is_item_in_select_all = lambda item: ( + # Is in select all. - Not versioned, and not Ignored item.change is not None and item.change.is_ignored() is None and not item.change.is_versioned(), + # look at children. - Not ignored item.change is not None and item.change.is_ignored() is None or item.change is None ) diff -Nru qbzr-0.18.6/lib/annotate.py qbzr-0.19/lib/annotate.py --- qbzr-0.18.6/lib/annotate.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/annotate.py 2010-08-05 09:10:37.000000000 -0400 @@ -24,32 +24,37 @@ import sys, time from PyQt4 import QtCore, QtGui -from bzrlib.workingtree import WorkingTree -from bzrlib.revisiontree import RevisionTree -from bzrlib.revision import CURRENT_REVISION from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.util import ( BTN_CLOSE, QBzrWindow, - ThrobberWidget, + ToolBarThrobberWidget, get_apparent_author_name, get_set_encoding, runs_in_loading_queue, + get_icon, + FindToolbar, ) -from bzrlib.plugins.qbzr.lib.revisionmessagebrowser import LogListRevisionMessageBrowser from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget from bzrlib.plugins.qbzr.lib.trace import reports_exception from bzrlib.plugins.qbzr.lib.logwidget import LogList -from bzrlib.plugins.qbzr.lib.logmodel import COL_DATE, RevIdRole from bzrlib.plugins.qbzr.lib.lazycachedrevloader import (load_revisions, cached_revisions) -from bzrlib.plugins.qbzr.lib.encoding_selector import EncodingSelector -from bzrlib.plugins.qbzr.lib.syntaxhighlighter import highlight_document from bzrlib.plugins.qbzr.lib.texteditannotate import (AnnotateBarBase, AnnotateEditerFrameBase) +from bzrlib.lazy_import import lazy_import +lazy_import(globals(), ''' +from bzrlib.workingtree import WorkingTree +from bzrlib.revisiontree import RevisionTree +from bzrlib.revision import CURRENT_REVISION +from bzrlib.plugins.qbzr.lib.revisionmessagebrowser import LogListRevisionMessageBrowser +from bzrlib.plugins.qbzr.lib.encoding_selector import EncodingMenuSelector +from bzrlib.plugins.qbzr.lib.syntaxhighlighter import highlight_document from bzrlib.plugins.qbzr.lib.revtreeview import paint_revno, get_text_color - +from bzrlib.plugins.qbzr.lib import logmodel +from bzrlib.patiencediff import PatienceSequenceMatcher as SequenceMatcher +''') class AnnotateBar(AnnotateBarBase): @@ -189,6 +194,36 @@ block = block.next() del painter QtGui.QPlainTextEdit.paintEvent(self, event) + + def get_positions(self): + """Returns the charator positons for the selection start, + selection end, center of the viewport, an the number of lines from + the top of the viewport to the center of the viewport.""" + old_cursor = self.textCursor() + old_center = self.cursorForPosition(QtCore.QPoint(0, self.height() / 2)) + lines_to_center = (old_center.block().blockNumber() - + self.verticalScrollBar().value()) + + return (old_cursor.selectionStart(), + old_cursor.selectionEnd(), + old_center.position()) , lines_to_center + + def set_positions(self, new_positions, lines_to_center): + new_start, new_end, new_center = new_positions + if new_center: + new_center_cursor = QtGui.QTextCursor(self.document()) + new_center_cursor.setPosition(new_center) + new_scroll = new_center_cursor.block().blockNumber() - lines_to_center + self.verticalScrollBar().setValue(new_scroll) + + new_selection_cursor = QtGui.QTextCursor(self.document()) + new_selection_cursor.movePosition(QtGui.QTextCursor.Right, + QtGui.QTextCursor.MoveAnchor, + new_start) + new_selection_cursor.movePosition(QtGui.QTextCursor.Right, + QtGui.QTextCursor.KeepAnchor, + new_end - new_start) + self.setTextCursor(new_selection_cursor) class AnnotateWindow(QBzrWindow): @@ -208,6 +243,7 @@ self.working_tree = tree else: self.working_tree = None + self.old_lines = None self.fileId = fileId self.path = path @@ -215,7 +251,7 @@ self.loader_func = loader self.loader_args = loader_args - self.throbber = ThrobberWidget(self) + self.throbber = ToolBarThrobberWidget(self) self.text_edit_frame = AnnotateEditerFrameBase(self) self.text_edit = AnnotatedTextEdit(self) @@ -223,6 +259,7 @@ self.text_edit.setTextInteractionFlags( QtCore.Qt.TextSelectableByMouse| QtCore.Qt.TextSelectableByKeyboard) + self.text_edit.setLineWrapMode(QtGui.QPlainTextEdit.NoWrap) self.text_edit.document().setDefaultFont( QtGui.QFont("Courier New,courier", @@ -243,7 +280,8 @@ self.edit_cursorPositionChanged) self.log_list = AnnotateLogList(self.processEvents, self.throbber, no_graph, self) - self.log_list.header().hideSection(COL_DATE) + self.log_list.header().hideSection(logmodel.COL_DATE) + self.log_list.parent_annotate_window = self self.log_branch_loaded = False self.connect(self.log_list.selectionModel(), @@ -252,8 +290,8 @@ self.message = LogListRevisionMessageBrowser(self.log_list, self) - self.encoding_selector = EncodingSelector(self.encoding, - gettext("Encoding:"), + self.encoding_selector = EncodingMenuSelector(self.encoding, + gettext("Encoding"), self._on_encoding_changed) hsplitter = QtGui.QSplitter(QtCore.Qt.Horizontal) @@ -270,17 +308,64 @@ splitter.setStretchFactor(0, 5) splitter.setStretchFactor(1, 2) - buttonbox = self.create_button_box(BTN_CLOSE) - vbox = QtGui.QVBoxLayout(self.centralwidget) - vbox.addWidget(self.throbber) + #vbox.addWidget(self.toolbar) vbox.addWidget(splitter) - hbox = QtGui.QHBoxLayout() - hbox.addWidget(self.encoding_selector) - hbox.addWidget(buttonbox) - vbox.addLayout(hbox) self.text_edit.setFocus() + self.show_find = QtGui.QAction(get_icon("edit-find"), gettext("Find"), self) + self.show_find.setShortcuts(QtGui.QKeySequence.Find) + self.show_find.setCheckable(True) + + self.show_goto_line = QtGui.QAction(get_icon("go-jump"), gettext("Goto Line"), self) + self.show_goto_line.setShortcuts((QtCore.Qt.CTRL + QtCore.Qt.Key_L,)) + self.show_goto_line.setCheckable(True) + + show_view_menu = QtGui.QAction(get_icon("document-properties"), gettext("&View Options"), self) + view_menu = QtGui.QMenu(gettext('View Options'), self) + show_view_menu.setMenu(view_menu) + + word_wrap = QtGui.QAction(gettext("Word Wrap"), self) + word_wrap.setCheckable(True) + self.connect(word_wrap, + QtCore.SIGNAL("toggled (bool)"), + self.word_wrap_toggle) + + view_menu.addMenu(self.encoding_selector) + view_menu.addAction(word_wrap) + + toolbar = self.addToolBar(gettext("Annotate")) + toolbar.setMovable (False) + toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) + + #self.toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) + toolbar.addAction(self.show_find) + toolbar.addAction(self.show_goto_line) + toolbar.addAction(show_view_menu) + toolbar.widgetForAction(show_view_menu).setPopupMode(QtGui.QToolButton.InstantPopup) + + spacer = QtGui.QWidget() + spacer.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) + toolbar.addWidget(spacer) + toolbar.addWidget(self.throbber) + + self.addToolBarBreak() + + self.find_toolbar = FindToolbar(self, self.text_edit, self.show_find) + self.find_toolbar.hide() + self.addToolBar(self.find_toolbar) + self.connect(self.show_find, + QtCore.SIGNAL("toggled (bool)"), + self.show_find_toggle) + + self.goto_line_toolbar = GotoLineToolbar(self, self.show_goto_line) + self.goto_line_toolbar.hide() + self.addToolBar(self.goto_line_toolbar) + + self.connect(self.show_goto_line, + QtCore.SIGNAL("toggled (bool)"), + self.show_goto_line_toggle ) + def show(self): QBzrWindow.show(self) QtCore.QTimer.singleShot(0, self.initial_load) @@ -336,6 +421,8 @@ lines = [] annotate = [] ordered_revids = [] + + self.processEvents() for revid, text in tree.annotate_iter(fileId): text = text.decode(self.encoding, 'replace') @@ -355,8 +442,20 @@ if len(annotate) % 100 == 0: self.processEvents() annotate.append((None, False)) # because the view has one more line - + + new_positions = None + if self.old_lines: + # Try keep the scroll, and selection stable. + old_positions, lines_to_center = self.text_edit.get_positions() + new_positions = self.translate_positions( + self.old_lines, lines, old_positions) + + self.text_edit.annotate = None self.text_edit.setPlainText("".join(lines)) + if new_positions: + self.text_edit.set_positions(new_positions, lines_to_center) + + self.old_lines = lines self.annotate_bar.adjustWidth(len(lines), 999) self.annotate_bar.annotate = annotate self.text_edit.annotate = annotate @@ -369,10 +468,6 @@ self.log_branch_loaded = True self.log_list.load_branch(self.branch, [self.fileId], tree) - self.log_list.context_menu.addAction( - gettext("&Annotate this revision"), - self.set_annotate_revision) - just_loaded_log = True # Show the revisions the we know about now. @@ -415,6 +510,38 @@ revids[start:start + chunk_size]) gp.load_filter_file_id_chunk_finished() + def translate_positions(self, old_lines, new_lines, old_positions): + sm = SequenceMatcher(None, old_lines, new_lines) + opcodes = sm.get_opcodes() + new_positions = [None for x in range(len(old_positions))] + opcode_len = lambda start, end, lines: sum( + [len(l) for l in lines[start:end]]) + for i, old_pos in enumerate(old_positions): + old_char_start = 0 + new_char_start = 0 + for code, old_start, old_end, new_start, new_end in opcodes: + old_len = opcode_len(old_start, old_end, old_lines) + new_len = opcode_len(new_start, new_end, new_lines) + if (old_pos >= old_char_start and + old_pos < old_char_start + old_len): + if code == 'delete': + new_pos = new_char_start + elif (code == 'replace' and len(opcodes)>1): + # XXX This should cache the opcodes if we do the same + # block more than once. + new_inner_pos = self.translate_positions( + ''.join(old_lines[old_start:old_end]), + ''.join(new_lines[new_start:new_end]), + [old_pos - old_char_start])[0] + new_pos = new_char_start + new_inner_pos + else: + new_pos = new_char_start + (old_pos - old_char_start) + new_positions[i] = new_pos + break + old_char_start += old_len + new_char_start += new_len + return new_positions + def revisions_loaded(self, revisions, last_call): for rev in revisions.itervalues(): author_name = get_apparent_author_name(rev) @@ -454,7 +581,7 @@ try: self.branch.lock_read() try: - revid = str(self.log_list.currentIndex().data(RevIdRole).toString()) + revid = str(self.log_list.currentIndex().data(logmodel.RevIdRole).toString()) if revid == CURRENT_REVISION: self.tree = self.working_tree else: @@ -486,10 +613,103 @@ revids = self.log_list.get_selection_and_merged_revids() self.annotate_bar.highlight_revids = revids self.annotate_bar.update() + + def show_find_toggle(self, state): + if state: + self.show_goto_line.setChecked(False) + + def show_goto_line_toggle(self, state): + self.goto_line_toolbar.setVisible(state) + if state: + self.goto_line_toolbar.line_edit.setFocus() + self.show_find.setChecked(False) + else: + self.goto_line_toolbar.line_edit.setText('') + + def word_wrap_toggle(self, state): + if state: + self.text_edit.setLineWrapMode(QtGui.QPlainTextEdit.WidgetWidth) + else: + self.text_edit.setLineWrapMode(QtGui.QPlainTextEdit.NoWrap) + +# QIntValidator did not work on vila's setup, so this is a workaround. +class IntValidator(QtGui.QValidator): + def validate (self, input, pos): + if input == '': + return (QtGui.QValidator.Intermediate, pos) + try: + i = int(input) + except ValueError: + return (QtGui.QValidator.Invalid, pos) + if i > 0: + return (QtGui.QValidator.Acceptable, pos) + else: + return (QtGui.QValidator.Invalid, pos) + +class GotoLineToolbar(QtGui.QToolBar): + + def __init__(self, anotate_window, show_action): + QtGui.QToolBar.__init__(self, gettext("Goto Line"), anotate_window) + self.anotate_window = anotate_window + if 0: self.anotate_window = AnnotateWindow() + self.show_action = show_action + + self.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) + self.setMovable (False) + + label = QtGui.QLabel(gettext("Goto Line: "), self) + self.addWidget(label) + + self.line_edit = QtGui.QLineEdit(self) + self.line_edit.setValidator(IntValidator(self.line_edit)) + self.addWidget(self.line_edit) + label.setBuddy(self.line_edit) + + go = self.addAction(get_icon("go-next"), gettext("Go")) + + spacer = QtGui.QWidget() + spacer.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) + self.addWidget(spacer) + + close = QtGui.QAction(self) + close.setIcon(self.style().standardIcon( + QtGui.QStyle.SP_DialogCloseButton)) + self.addAction(close) + close.setShortcut((QtCore.Qt.Key_Escape)) + close.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) + close.setStatusTip(gettext("Close Goto Line")) + self.connect(close, + QtCore.SIGNAL("triggered(bool)"), + self.close_triggered) + self.connect(go, + QtCore.SIGNAL("triggered(bool)"), + self.go_triggered) + self.connect(self.line_edit, + QtCore.SIGNAL("returnPressed()"), + self.go_triggered) + + def close_triggered(self, state): + self.show_action.setChecked(False) + + def go_triggered(self, state=True): + try: + line = int(str(self.line_edit.text()))-1 + except ValueError: + pass + else: + doc = self.anotate_window.text_edit.document() + cursor = QtGui.QTextCursor(doc) + cursor.setPosition(doc.findBlockByNumber(line).position()) + self.anotate_window.text_edit.setTextCursor(cursor) + + self.show_action.setChecked(False) -class AnnotateLogList(LogList): +class AnnotateLogList(LogList): + + parent_annotate_window = None + def load(self): self.graph_provider.lock_read_branches() try: @@ -499,3 +719,17 @@ self._adjust_revno_column() finally: self.graph_provider.unlock_branches() + + def create_context_menu(self): + LogList.create_context_menu(self, diff_is_default_action=False) + set_rev_action = QtGui.QAction(gettext("&Annotate this revision"), + self.context_menu) + self.connect(set_rev_action, QtCore.SIGNAL('triggered()'), + self.parent_annotate_window.set_annotate_revision) + self.context_menu.insertAction( + self.context_menu.actions()[0], + set_rev_action) + self.context_menu.setDefaultAction(set_rev_action) + + def default_action(self, index=None): + self.parent_annotate_window.set_annotate_revision() diff -Nru qbzr-0.18.6/lib/browse.py qbzr-0.19/lib/browse.py --- qbzr-0.18.6/lib/browse.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/browse.py 2010-08-05 09:10:37.000000000 -0400 @@ -18,15 +18,6 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore, QtGui -from bzrlib import ( - osutils, - errors, - ) -from bzrlib.bzrdir import BzrDir -from bzrlib.revisionspec import RevisionSpec - -from bzrlib.plugins.qbzr.lib.i18n import gettext -from bzrlib.plugins.qbzr.lib.treewidget import TreeWidget, TreeFilterMenu from bzrlib.plugins.qbzr.lib.util import ( BTN_CLOSE, BTN_REFRESH, @@ -38,9 +29,20 @@ ) from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget from bzrlib.plugins.qbzr.lib.trace import reports_exception -from bzrlib.plugins.qbzr.lib.diff import DiffButtons +from bzrlib.lazy_import import lazy_import +lazy_import(globals(), ''' +from bzrlib import ( + osutils, + errors, + ) +from bzrlib.bzrdir import BzrDir +from bzrlib.revisionspec import RevisionSpec +from bzrlib.plugins.qbzr.lib.i18n import gettext +from bzrlib.plugins.qbzr.lib.treewidget import TreeWidget, TreeFilterMenu +from bzrlib.plugins.qbzr.lib.diff import DiffButtons +''') class BrowseWindow(QBzrWindow): def __init__(self, branch=None, location=None, revision=None, diff -Nru qbzr-0.18.6/lib/commands.py qbzr-0.19/lib/commands.py --- qbzr-0.18.6/lib/commands.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/commands.py 2010-08-05 09:10:37.000000000 -0400 @@ -182,7 +182,11 @@ ui.ui_factory = std_ui_factory -ui_mode_option = Option("ui-mode", help="Causes dialogs to wait after the operation is complete.") +ui_mode_option = Option("ui-mode", + help="Causes dialogs to wait after the operation is complete.") +execute_option = Option("execute", short_name='e', + help="Causes dialogs to start the underlying action immediately without " + "waiting for user input.") # A special option so 'revision' can be passed as a simple string, when we do # *not* wan't bzrlib's feature of parsing the revision string before passing it. @@ -288,7 +292,7 @@ def _qbzr_run(self, selected_list=None, ui_mode=False): tree, selected_list = builtins.tree_files(selected_list) if selected_list == ['']: - selected_list = [] + selected_list = None self.main_window = AddWindow(tree, selected_list, dialog=False, ui_mode=ui_mode) self.main_window.show() self._application.exec_() @@ -302,7 +306,7 @@ def _qbzr_run(self, selected_list=None, ui_mode=False, no_backup=False): tree, selected_list = builtins.tree_files(selected_list) if selected_list == ['']: - selected_list = [] + selected_list = None self.main_window = RevertWindow(tree, selected_list, dialog=False, ui_mode=ui_mode, backup=not no_backup) @@ -351,7 +355,7 @@ def _qbzr_run(self, selected_list=None, message=None, local=False, ui_mode=False): tree, selected_list = builtins.tree_files(selected_list) if selected_list == ['']: - selected_list = [] + selected_list = None self.main_window = CommitWindow(tree, selected_list, dialog=False, message=message, local=local, ui_mode=ui_mode) self.main_window.show() @@ -378,48 +382,23 @@ takes_options.append('change') aliases = ['qdi'] - def get_diff_window_args(self, processEvents): + def get_diff_window_args(self, processEvents, add_cleanup): try: - from bzrlib.diff import get_trees_and_branches_to_diff - has_get_trees_and_branches_to_diff = True + from bzrlib.diff import get_trees_and_branches_to_diff_locked except ImportError: - from bzrlib.diff import _get_trees_to_diff - has_get_trees_and_branches_to_diff = False - - if has_get_trees_and_branches_to_diff: + from bzrlib.diff import get_trees_and_branches_to_diff (old_tree, new_tree, old_branch, new_branch, specific_files, extra_trees) = \ - get_trees_and_branches_to_diff(self.file_list, self.revision, - self.old, self.new) + get_trees_and_branches_to_diff( + self.file_list, self.revision, self.old, self.new) else: - old_tree, new_tree, specific_files, extra_trees = \ - _get_trees_to_diff(self.file_list, self.revision, - self.old, self.new) - processEvents() - - if self.file_list: - default_location = self.file_list[0] - else: - # If no path is given, the current working tree is used - default_location = CUR_DIR - - self_old = self.old - if self_old is None: - self_old = default_location - wt, old_branch, rp = \ - BzrDir.open_containing_tree_or_branch(self_old) - processEvents() - self_new = self.new - if self_new is None: - self_new = default_location - if self_new != self_old : - wt, new_branch, rp = \ - BzrDir.open_containing_tree_or_branch(self_new) - else: - new_branch = old_branch - processEvents() - + (old_tree, new_tree, + old_branch, new_branch, + specific_files, extra_trees) = \ + get_trees_and_branches_to_diff_locked( + self.file_list, self.revision, self.old, self.new, + add_cleanup) return old_tree, new_tree, old_branch, new_branch, specific_files def get_ext_diff_args(self, processEvents): @@ -710,7 +689,7 @@ del kw['encoding'] return bzrlib.builtins.cmd_merge.run(self, *args, **kw) - def get_diff_window_args(self, processEvents): + def get_diff_window_args(self, processEvents, add_cleanup): tree_merger = self.merger.make_merger() self.tt = tree_merger.make_preview_transform() result_tree = self.tt.get_preview_tree() @@ -792,16 +771,16 @@ """Fetches external changes into the working tree.""" takes_args = ['location?'] - takes_options = [ui_mode_option] + takes_options = [ui_mode_option, execute_option] aliases = ['qgetu', 'qgetup'] - def _qbzr_run(self, location=CUR_DIR, ui_mode=False): + def _qbzr_run(self, location=CUR_DIR, ui_mode=False, execute=False): branch, relpath = Branch.open_containing(location) tb = TreeBranch.open_containing(location, ui_mode=ui_mode) if tb is None: return errors.EXIT_ERROR if tb.is_light_co(): - window = QBzrUpdateWindow(tb.tree, ui_mode) + window = QBzrUpdateWindow(tb.tree, ui_mode, execute=execute) elif tb.is_bound(): window = UpdateCheckoutWindow(tb.branch, ui_mode=ui_mode) else: @@ -922,13 +901,13 @@ """Update working tree with latest changes in the branch.""" aliases = ['qup'] takes_args = ['directory?'] - takes_options = [ui_mode_option] + takes_options = [ui_mode_option, execute_option] - def _qbzr_run(self, directory=None, ui_mode=False): + def _qbzr_run(self, directory=None, ui_mode=False, execute=False): tree = open_tree(directory, ui_mode) if tree is None: return - self.main_window = QBzrUpdateWindow(tree, ui_mode) + self.main_window = QBzrUpdateWindow(tree, ui_mode, execute) self.main_window.show() self._application.exec_() @@ -964,16 +943,16 @@ class cmd_qunbind(QBzrCommand): """Convert the current checkout into a regular branch.""" - takes_options = [ui_mode_option] + takes_options = [ui_mode_option, execute_option] - def _qbzr_run(self, ui_mode=False): + def _qbzr_run(self, ui_mode=False, execute=False): from bzrlib.plugins.qbzr.lib.unbind import QBzrUnbindDialog branch = Branch.open_containing(CUR_DIR)[0] if branch.get_bound_location() == None: raise errors.BzrCommandError("This branch is not bound.") - self.main_window = QBzrUnbindDialog(branch, ui_mode) + self.main_window = QBzrUnbindDialog(branch, ui_mode, execute) self.main_window.show() self._application.exec_() @@ -1043,10 +1022,7 @@ help='Initial category selection.', type=unicode, ), - Option('execute', - help="Validate and run the supplied command immediately.", - short_name='e' - ), + execute_option, ] aliases = ['qcmd'] diff -Nru qbzr-0.18.6/lib/commit.py qbzr-0.19/lib/commit.py --- qbzr-0.18.6/lib/commit.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/commit.py 2010-08-05 09:10:37.000000000 -0400 @@ -22,16 +22,6 @@ import os.path from PyQt4 import QtCore, QtGui -from bzrlib import errors -from bzrlib.plugins.qbzr.lib.spellcheck import SpellCheckHighlighter, SpellChecker -from bzrlib.plugins.qbzr.lib.autocomplete import get_wordlist_builder -from bzrlib.plugins.qbzr.lib.commit_data import QBzrCommitData -from bzrlib.plugins.qbzr.lib.diff import ( - DiffButtons, - show_diff, - InternalWTDiffArgProvider, - ) -from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.subprocess import SubProcessDialog from bzrlib.plugins.qbzr.lib.util import ( BTN_REFRESH, @@ -41,19 +31,35 @@ ThrobberWidget, runs_in_loading_queue, StandardButton, + InfoWidget, ) from bzrlib.plugins.qbzr.lib.logwidget import LogList -from bzrlib.plugins.qbzr.lib import logmodel from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget +from bzrlib.plugins.qbzr.lib.trace import reports_exception + +from bzrlib.lazy_import import lazy_import +lazy_import(globals(), ''' + +from bzrlib import errors +from bzrlib.plugins.qbzr.lib.spellcheck import SpellCheckHighlighter, SpellChecker +from bzrlib.plugins.qbzr.lib.autocomplete import get_wordlist_builder +from bzrlib.plugins.qbzr.lib.commit_data import QBzrCommitData +from bzrlib.plugins.qbzr.lib.diff import ( + DiffButtons, + show_diff, + InternalWTDiffArgProvider, + ) +from bzrlib.plugins.qbzr.lib.i18n import gettext +from bzrlib.plugins.qbzr.lib import logmodel from bzrlib.plugins.qbzr.lib.treewidget import ( TreeWidget, SelectAllCheckBox, ) -from bzrlib.plugins.qbzr.lib.trace import reports_exception from bzrlib.plugins.qbzr.lib.revisionview import RevisionView +from bzrlib.plugins.qbzr.lib.update import QBzrUpdateWindow - +''') MAX_AUTOCOMPLETE_FILES = 20 @@ -66,6 +72,10 @@ self.eow = QtCore.QString("~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-=") self.main_window = main_window + def inputMethodEvent(self, e): + self.completer.popup().hide() + QtGui.QTextEdit.inputMethodEvent(self, e) + def keyPressEvent(self, e): c = self.completer e_key = e.key() @@ -231,7 +241,7 @@ self.initial_selected_list = selected_list self.connect(self.process_widget, - QtCore.SIGNAL("failed()"), + QtCore.SIGNAL("failed(QString)"), self.on_failed) self.throbber = ThrobberWidget(self) @@ -246,7 +256,7 @@ master_branch = url_for_display(tree.branch.get_bound_location()) if not master_branch: self.branch_location.setText(branch_base) - branch_layout.addWidget(self.branch_location) + branch_layout.addWidget(self.branch_location, 0, 0, 1, 2) else: self.local_checkbox = QtGui.QCheckBox(gettext( "&Local commit")) @@ -267,7 +277,36 @@ if local: self.local_checkbox.setChecked(True) self.update_branch_groupbox() + + self.not_uptodate_errors = { + 'BoundBranchOutOfDate': gettext( + 'Local branch is out of date with master branch.\n' + 'To commit to master branch, update the local branch.\n' + 'You can also pass select local to commit to continue working disconnected.'), + 'OutOfDateTree': gettext( + 'Working tree is out of date. To commit, update the working tree.') + } + self.not_uptodate_info = InfoWidget(branch_groupbox) + not_uptodate_layout = QtGui.QHBoxLayout(self.not_uptodate_info) + + # XXX this is to big. Resize + not_uptodate_icon = QtGui.QLabel() + not_uptodate_icon.setPixmap(self.style().standardPixmap( + QtGui.QStyle.SP_MessageBoxWarning)) + not_uptodate_layout.addWidget(not_uptodate_icon) + + self.not_uptodate_label = QtGui.QLabel('error message goes here') + not_uptodate_layout.addWidget(self.not_uptodate_label, 2) + + update_button = QtGui.QPushButton(gettext('Update')) + self.connect(update_button, QtCore.SIGNAL("clicked(bool)"), + self.open_update_win) + not_uptodate_layout.addWidget(update_button) + + self.not_uptodate_info.hide() + branch_layout.addWidget(self.not_uptodate_info, 3, 0, 1, 2) + splitter = QtGui.QSplitter(QtCore.Qt.Vertical, self) message_groupbox = QtGui.QGroupBox(gettext("Message"), splitter) @@ -289,8 +328,8 @@ QtCore.SIGNAL("dataChanged(QModelIndex, QModelIndex)"), self.on_filelist_data_changed) - selectall_checkbox = SelectAllCheckBox(self.filelist, self) - selectall_checkbox.setCheckState(QtCore.Qt.Checked) + self.selectall_checkbox = SelectAllCheckBox(self.filelist, self) + self.selectall_checkbox.setCheckState(QtCore.Qt.Checked) language = get_global_config().get_user_option('spellcheck_language') or 'en' spell_checker = SpellChecker(language) @@ -349,12 +388,12 @@ self.connect(self.show_nonversioned_checkbox, QtCore.SIGNAL("toggled(bool)"), self.show_nonversioned) vbox.addWidget(self.show_nonversioned_checkbox) - vbox.addWidget(selectall_checkbox) + vbox.addWidget(self.selectall_checkbox) # Display a list of pending merges if self.has_pending_merges: - selectall_checkbox.setCheckState(QtCore.Qt.Checked) - selectall_checkbox.setEnabled(False) + self.selectall_checkbox.setCheckState(QtCore.Qt.Checked) + self.selectall_checkbox.setEnabled(False) self.pending_merges_list = PendingMergesList( self.processEvents, self.throbber, False, self) @@ -590,7 +629,7 @@ gettext("You should provide a commit message."), gettext('&OK')) # don't commit, but don't close the window either - self.on_failed() + self.on_failed('NoCommitMessage') self.message.setFocus() return @@ -617,7 +656,7 @@ "QBzr - " + gettext("Commit"), gettext("No changes to commit."), QtGui.QMessageBox.Ok) - self.on_failed() + self.on_failed('PointlessCommit') return else: # bzr >= 1.6 @@ -627,7 +666,7 @@ "Do you want to commit anyway?"), QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) if button == QtGui.QMessageBox.No: - self.on_failed() + self.on_failed('PointlessCommit') return else: # Possible [rare] problems: @@ -744,3 +783,19 @@ self.tree.basis_tree().get_revision_id(), self.tree, self.tree.branch, self.tree.branch) show_diff(arg_provider, ext_diff=ext_diff, parent_window = self) + + def on_failed(self, error): + SubProcessDialog.on_failed(self, error) + error = str(error) + if error in self.not_uptodate_errors: + self.not_uptodate_label.setText(self.not_uptodate_errors[error]) + self.not_uptodate_info.show() + + def open_update_win(self, b): + update_window = QBzrUpdateWindow(self.tree) + self.windows.append(update_window) + update_window.show() + QtCore.QObject.connect(update_window, + QtCore.SIGNAL("subprocessFinished(bool)"), + self.not_uptodate_info, + QtCore.SLOT("setHidden(bool)")) diff -Nru qbzr-0.18.6/lib/conflicts.py qbzr-0.19/lib/conflicts.py --- qbzr-0.18.6/lib/conflicts.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/conflicts.py 2010-08-05 09:10:37.000000000 -0400 @@ -29,6 +29,11 @@ StandardButton, ) +try: + from bzrlib.cmdline import split as cmdline_split +except ImportError: + from bzrlib.commands import shlex_split_unicode as cmdline_split + class ConflictsWindow(QBzrWindow): @@ -218,7 +223,7 @@ if self.program_extmerge_default_button.isChecked(): bzr_config = GlobalConfig() extmerge_tool = bzr_config.get_user_option("external_merge") - args = extmerge_tool.split(" ") + args = cmdline_split(extmerge_tool) new_args = args[1:len(args)] i = 0 while i < len(new_args): diff -Nru qbzr-0.18.6/lib/diff_arg.py qbzr-0.19/lib/diff_arg.py --- qbzr-0.18.6/lib/diff_arg.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/diff_arg.py 2010-08-05 09:10:37.000000000 -0400 @@ -28,7 +28,7 @@ """Contract class to pass arguments to either builtin diff window, or external diffs""" - def get_diff_window_args(self, processEvents): + def get_diff_window_args(self, processEvents, add_cleanup): """Returns the arguments for the builtin diff window. :return: (tree1, tree2, branch1, branch2, specific_files) @@ -80,7 +80,7 @@ finally: self.new_tree.unlock() - def get_diff_window_args(self, processEvents): + def get_diff_window_args(self, processEvents, add_cleanup): self.load_old_tree() processEvents() self.load_new_tree_and_paths() @@ -158,7 +158,7 @@ else: InternalDiffArgProvider.load_old_tree(self) - def get_diff_window_args(self, processEvents): + def get_diff_window_args(self, processEvents, add_cleanup): self.load_old_tree() processEvents() diff -Nru qbzr-0.18.6/lib/diffview.py qbzr-0.19/lib/diffview.py --- qbzr-0.18.6/lib/diffview.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/diffview.py 2010-08-05 09:10:37.000000000 -0400 @@ -26,13 +26,14 @@ from bzrlib.plugins.qbzr.lib.util import ( file_extension, format_timestamp, - split_tokens_at_lines, - CachedTTypeFormater, QBzrGlobalConfig, QBzrConfig, ) from bzrlib.trace import mutter - +from bzrlib.plugins.qbzr.lib.syntaxhighlighter import ( + CachedTTypeFormater, + split_tokens_at_lines, + ) have_pygments = True try: diff -Nru qbzr-0.18.6/lib/diffwindow.py qbzr-0.19/lib/diffwindow.py --- qbzr-0.18.6/lib/diffwindow.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/diffwindow.py 2010-08-05 09:10:37.000000000 -0400 @@ -33,6 +33,7 @@ from bzrlib.workingtree import WorkingTree from bzrlib.workingtree_4 import DirStateRevisionTree from bzrlib import trace +from bzrlib import cleanup from bzrlib.plugins.qbzr.lib.diffview import ( SidebySideDiffView, @@ -228,27 +229,29 @@ throbber window, then loads the branches etc if they weren't specified in our constructor. """ - # we only open the branch using the throbber + op = cleanup.OperationWithCleanups(self._initial_load) self.throbber.show() - try: - self.load_branch_info() - self.load_diff() - finally: - self.throbber.hide() - - def load_branch_info(self): + op.add_cleanup(self.throbber.hide) + op.run() + + def _initial_load(self, op): (tree1, tree2, branch1, branch2, - specific_files) = self.arg_provider.get_diff_window_args(self.processEvents) + specific_files) = self.arg_provider.get_diff_window_args( + self.processEvents, op.add_cleanup) self.trees = (tree1, tree2) self.branches = (branch1, branch2) self.specific_files = specific_files + self.load_branch_info() + self.load_diff() + + def load_branch_info(self): self.set_diff_title() - self.encoding_selector_left.encoding = get_set_encoding(self.encoding, branch1) - self.encoding_selector_right.encoding = get_set_encoding(self.encoding, branch2) + self.encoding_selector_left.encoding = get_set_encoding(self.encoding, self.branches[0]) + self.encoding_selector_right.encoding = get_set_encoding(self.encoding, self.branches[1]) self.processEvents() def set_diff_title(self): diff -Nru qbzr-0.18.6/lib/encoding_selector.py qbzr-0.19/lib/encoding_selector.py --- qbzr-0.18.6/lib/encoding_selector.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/encoding_selector.py 2010-08-05 09:10:37.000000000 -0400 @@ -47,19 +47,9 @@ return iter(self._data) -class EncodingSelector(QtGui.QWidget): - """Widget to control encoding of text.""" - - def __init__(self, initial_encoding=None, label_text=None, onChanged=None, - *args): - """Create widget: label + combobox. - @param initial_encoding: initially selected encoding (default: utf-8). - @param label_text: text for label (default: "Encoding:"). - @param onChanged: callback to processing encoding change. - @param args: additional arguments to initialize QWidget. - """ - QtGui.QWidget.__init__(self, *args) +class BaseEncodingSelector(object): + def init_encodings(self, initial_encoding=None): _encodings = UniqueList() if initial_encoding: _encodings.append(initial_encoding) @@ -75,6 +65,46 @@ initial_encoding = 'utf-8' self._encoding = initial_encoding + def _encodingChanged(self, encoding): + try: + encoding = str(encoding) # may raise UnicodeError + codecs.lookup(encoding) # may raise LookupError + self._encoding = encoding + self.onChanged(encoding) + except (UnicodeError, LookupError): + QtGui.QMessageBox.critical(self, + gettext("Wrong encoding"), + gettext('Encoding "%s" is invalid or not supported.') % + unicode(encoding)) + self.setEncoding(self._encoding) + + def getEncoding(self): + return self._encoding + + def setEncoding(self, encoding): + if is_valid_encoding(encoding): + self._encoding = encoding + self._setEncoding(encoding) + + def _setEncoding(self, encoding): + pass + + encoding = property(getEncoding, setEncoding) + + +class EncodingSelector(QtGui.QWidget, BaseEncodingSelector): + """Widget to control encoding of text.""" + + def __init__(self, initial_encoding=None, label_text=None, onChanged=None, + *args): + """Create widget: label + combobox. + @param initial_encoding: initially selected encoding (default: utf-8). + @param label_text: text for label (default: "Encoding:"). + @param onChanged: callback to processing encoding change. + @param args: additional arguments to initialize QWidget. + """ + QtGui.QWidget.__init__(self, *args) + self.init_encodings(initial_encoding) self.onChanged = onChanged if onChanged is None: self.onChanged = lambda encoding: None @@ -89,7 +119,7 @@ self.chooser = QtGui.QComboBox() self.chooser.addItems(self.encodings) self.chooser.setEditable(True) - self.chooser.setEditText(QtCore.QString(initial_encoding)) + self.chooser.setEditText(QtCore.QString(self.encoding)) self.connect(self.chooser, QtCore.SIGNAL("currentIndexChanged(QString)"), self._encodingChanged) self.chooser.focusOutEvent = self._focusOut @@ -103,38 +133,68 @@ self._encodingChanged(encoding) QtGui.QComboBox.focusOutEvent(self.chooser, ev) - def _encodingChanged(self, encoding): - try: - encoding = str(encoding) # may raise UnicodeError - codecs.lookup(encoding) # may raise LookupError - self._encoding = encoding - self.onChanged(encoding) - except (UnicodeError, LookupError): - QtGui.QMessageBox.critical(self, - gettext("Wrong encoding"), - gettext('Encoding "%s" is invalid or not supported.') % - unicode(encoding)) - self.setEncoding(self._encoding) + def _setEncoding(self, encoding): + self.chooser.setEditText(QtCore.QString(encoding)) - def getEncoding(self): - return self._encoding + def getLabel(self): + return unicode(self._label.text()) - def setEncoding(self, encoding): - if is_valid_encoding(encoding): - self._encoding = encoding - self.chooser.setEditText(QtCore.QString(encoding)) + def setLabel(self, new_label): + self._label.setText(new_label) - encoding = property(getEncoding, setEncoding) + label = property(getLabel, setLabel) + +class EncodingMenuSelector(QtGui.QMenu, BaseEncodingSelector): + """Menu to control encoding of text.""" + + def __init__(self, initial_encoding=None, label_text=None, onChanged=None, + *args): + """Create widget: label + combobox. + @param initial_encoding: initially selected encoding (default: utf-8). + @param label_text: text for label (default: "Encoding:"). + @param onChanged: callback to processing encoding change. + @param args: additional arguments to initialize QWidget. + """ + QtGui.QMenu.__init__(self, *args) + self.init_encodings(initial_encoding) + self.onChanged = onChanged + if onChanged is None: + self.onChanged = lambda encoding: None + + self.setTitle(label_text) + + self.action_group = QtGui.QActionGroup(self) + + self.encoding_actions = {} + for encoding in self.encodings: + action = QtGui.QAction(encoding, self.action_group) + action.setCheckable(True) + action.setData(QtCore.QVariant(encoding)) + self.addAction(action) + self.encoding_actions[encoding] = action + + self._setEncoding(self.encoding) + self.connect(self, QtCore.SIGNAL("triggered(QAction *)"), + self.triggered) + + def triggered(self, action): + encoding = unicode(action.data().toString()) + self._encodingChanged(encoding) + + def _setEncoding(self, encoding): + if encoding in self.encoding_actions: + self.encoding_actions[encoding].setChecked(True) def getLabel(self): - return unicode(self._label.text()) + return unicode(self.title()) def setLabel(self, new_label): - self._label.setText(new_label) + self.setTitle(new_label) label = property(getLabel, setLabel) + # human encodings found in standard Python encodings package. python_encodings = """ utf_8 diff -Nru qbzr-0.18.6/lib/i18n.py qbzr-0.19/lib/i18n.py --- qbzr-0.18.6/lib/i18n.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/i18n.py 2010-08-05 09:10:37.000000000 -0400 @@ -18,7 +18,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -"""I18N and L10N support for QBzr""" +"""I18N and L10N support""" import gettext as _gettext import os @@ -40,6 +40,11 @@ def install(): global _translation + if not os.environ.get('LANGUAGE'): + from bzrlib import config + lang = config.GlobalConfig().get_user_option('language') + if lang: + os.environ['LANGUAGE'] = lang if sys.platform == 'win32': _check_win32_locale() _translation = _gettext.translation('qbzr', localedir=_get_locale_dir(), fallback=True) @@ -51,8 +56,11 @@ def _get_locale_dir(): - return os.path.join(os.path.realpath(os.path.dirname(__file__)), '..', 'locale') - + localedir = os.path.join(os.path.realpath(os.path.dirname(__file__)), '..', 'locale') + if sys.platform.startswith('linux'): + if not os.access(localedir, os.R_OK | os.X_OK): + localedir = '/usr/share/locale' + return localedir def _check_win32_locale(): for i in ('LANGUAGE','LC_ALL','LC_MESSAGES','LANG'): diff -Nru qbzr-0.18.6/lib/init.py qbzr-0.19/lib/init.py --- qbzr-0.18.6/lib/init.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/init.py 2010-08-05 09:10:37.000000000 -0400 @@ -71,7 +71,7 @@ if not location: self.process_widget.logMessage(gettext("You must specify a location"), error=True) - self.on_failed() + self.on_failed('NoLocation') return if self.ui.but_init.isChecked(): @@ -117,7 +117,7 @@ user_data = QtCore.QVariant(help or '') combo.addItem(name, user_data) if name == default: - default_index = i - 1 + default_index = combo.count() - 1 if desc_widget is not None: combo.parentWidget().connect(combo, QtCore.SIGNAL("currentIndexChanged(int)"), diff -Nru qbzr-0.18.6/lib/loggraphprovider.py qbzr-0.19/lib/loggraphprovider.py --- qbzr-0.18.6/lib/loggraphprovider.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/loggraphprovider.py 2010-08-05 09:10:37.000000000 -0400 @@ -18,14 +18,15 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import fnmatch +import gc import re from time import clock from bzrlib import errors from bzrlib.transport.local import LocalTransport from bzrlib.revision import NULL_REVISION, CURRENT_REVISION -from bzrlib.tsort import merge_sort -from bzrlib.graph import (Graph, StackedParentsProvider) +from bzrlib.graph import (Graph, StackedParentsProvider, KnownGraph) +from bzrlib.urlutils import determine_relative_path, join, split from bzrlib.bzrdir import BzrDir from bzrlib.workingtree import WorkingTree @@ -37,7 +38,7 @@ try: from bzrlib.plugins.search import errors as search_errors from bzrlib.plugins.search import index as search_index -except ImportError: +except (ImportError, errors.IncompatibleAPI): have_search = False class BranchInfo(object): @@ -45,8 +46,8 @@ # Instance of this object are typicaly named "bi". - __slots__ = ["tree", "branch", "index"] - def __init__ (self, tree, branch, index): + def __init__ (self, label, tree, branch, index=None): + self.label = label self.tree = tree self.branch = branch self.index = index @@ -64,12 +65,10 @@ # Instance of this object are typicaly named "rev". - __slots__ = ["index", "revid", "merge_depth", "revno_sequence", - "end_of_merge", "branch_id", "_revno_str", "filter_cache", + __slots__ = ["index", "_merge_sort_node", "branch_id", "_revno_str", "filter_cache", "merges", "merged_by", "f_index", "color", "col_index", "lines", "twisty_state", "twisty_branch_ids"] - - def __init__ (self, index, revid, merge_depth, revno_sequence, end_of_merge): + def __init__ (self, index, _merge_sort_node): self.index = index """Index in LogGraphProvider.revisions""" self.f_index = None @@ -77,10 +76,7 @@ If None, then this revision is not visible """ - self.revid = revid - self.merge_depth = merge_depth - self.revno_sequence = revno_sequence - self.end_of_merge = end_of_merge + self._merge_sort_node = _merge_sort_node self.branch_id = self.revno_sequence[0:-1] self._revno_str = None self.filter_cache = True @@ -108,11 +104,16 @@ visible, and we need to show a -. """ self.twisty_branch_ids = [] - """Branches that will be expanded/colapsed when the twisty is + """Branches that will be expanded/collapsed when the twisty is clicked on. """ + revid = property(lambda self: self._merge_sort_node.key) + merge_depth = property(lambda self: self._merge_sort_node.merge_depth) + revno_sequence = property(lambda self: self._merge_sort_node.revno) + end_of_merge = property(lambda self: self._merge_sort_node.end_of_merge) + def get_revno_str(self): if self._revno_str is None: self._revno_str = ".".join(["%d" % (revno) @@ -126,6 +127,14 @@ return "%s <%s %s>" % (self.__class__.__name__, self.revno_str, self.revid) +class GhostRevisionError(errors.InternalBzrError): + + _fmt = "{%(revision_id)s} is a ghost." + + def __init__(self, revision_id): + errors.BzrError.__init__(self) + self.revision_id = revision_id + paths_and_branches_err = "It is not possible to specify different file paths and different branches at the same time." class BranchLine(object): @@ -145,13 +154,12 @@ def __repr__(self): return "%s <%s>" % (self.__class__.__name__, self.branch_id) - class LogGraphProvider(object): """Loads and computes revision and graph data for GUI log widgets.""" # Most list/dicts related to revisions are unfiltered. When we do a graph # layout, we filter these revisions. A revision may be filter out because: - # * It's branch is hidden (or colapsed). + # * It's branch is hidden (or collapsed). # * We have a sepcified file_id(s), and the revision does not touch the # file_id(s). # * We have a search, and the revision does not match the search. @@ -189,11 +197,12 @@ tag, is_branch_last_revision) """ - self.branch_tags = {} + self.branch_labels = {} """Dict of revid to a list of branch tags. Depends on which revisions are visible.""" self.trunk_branch = None + self.ghosts = set() self.revisions = [] """List of RevisionInfo from merge_sort.""" @@ -237,8 +246,8 @@ if local_copy: self.local_repo_copies.append(repo.base) - def append_branch(self, tree, branch): - bi = BranchInfo(tree, branch, None) + def append_branch(self, label, tree, branch): + bi = BranchInfo(label, tree, branch) if bi not in self.branches: bi.index = self.open_search_index(branch) self.branches.append(bi) @@ -247,11 +256,48 @@ if have_search: try: return search_index.open_index_branch(branch) - except search_errors.NoSearchIndex: + except (search_errors.NoSearchIndex, errors.IncompatibleAPI): return None else: return None + no_usefull_info_in_location_re = re.compile(r'^[.:/\\]*$') + def branch_label(self, location, branch, + shared_repo_location=None, shared_repo=None): + # We should rather use QFontMetrics.elidedText. How do we decide on the + # width. + def elided_text(text, length=20): + if len(text)>length+3: + return text[:length]+'...' + return text + + def elided_path(path): + if len(path)>23: + dir, name = split(path) + dir = elided_text(dir, 10) + name = elided_text(name) + return join(dir, name) + return path + + if shared_repo_location and shared_repo and not location: + # Once we depend on bzrlib 2.2, this can become .user_url + branch_rel = determine_relative_path( + shared_repo.bzrdir.root_transport.base, + branch.bzrdir.root_transport.base) + location = join(shared_repo_location, branch_rel) + if location is None: + return elided_text(branch.nick) + + append_nick = ( + location.startswith(':') or + bool(self.no_usefull_info_in_location_re.match(location)) or + branch.get_config().has_explicit_nickname() + ) + if append_nick: + return '%s (%s)' % (elided_path(location), branch.nick) + + return elided_text(location) + def open_branch(self, branch, file_ids=None, tree=None): """Open branch and fileids to be loaded. """ @@ -265,7 +311,8 @@ except errors.NoWorkingTree: pass self.append_repo(repo) - self.append_branch(tree, branch) + label = self.branch_label(None, branch) + self.append_branch(label, tree, branch) if file_ids: self.fileids.extend(file_ids) @@ -278,7 +325,12 @@ of locations strings, inputed by the user (such as at the command line.) """ - for location in locations: + if locations is not None: + _locations = locations + else: + _locations = [u'.'] + + for location in _locations: tree, br, repo, fp = \ BzrDir.open_containing_tree_branch_or_repository(location) self.update_ui() @@ -293,26 +345,21 @@ tree = br.bzrdir.open_workingtree() except errors.NoWorkingTree: tree = None - self.append_branch(tree, br) + label = self.branch_label(None, br, location, repo) + self.append_branch(label, tree, br) self.append_repo(br.repository) self.update_ui() else: self.append_repo(repo) - self.append_branch(tree, br) + label = self.branch_label(location, br) + self.append_branch(label, tree, br) if len(self.branches)==1 and self.trunk_branch == None: self.trunk_branch = br # If no locations were sepecified, don't do fileids # Otherwise it gives you the history for the dir if you are # in a sub dir. - # - # XXX - There is a case where this does not behave correctly. - # If we are in subdir and we do "bzr qlog ." then we should filter - # on subdir. but if we do "bzr qlog" then we should not. To be able - # to do this, we need to move the implication the no location - # argument means '.' down in to the method, rather than where it is - # now. - GaryvdM 29 May 2009 - if fp != '' and locations == [u"."]: + if fp != '' and locations is None: fp = '' if fp != '' : @@ -352,14 +399,14 @@ # for repo in self.repos.itervalues(): # repo.unlock() - def append_head_info(self, revid, branch, tag, is_branch_last_revision): + def append_head_info(self, revid, branch_info, tag, is_branch_last_revision): if not revid==NULL_REVISION: if not revid in self.head_revids: self.head_revids.append(revid) self.revid_head_info[revid] = ([],[]) - self.revid_head_info[revid][0].append ((branch, tag, + self.revid_head_info[revid][0].append ((branch_info, tag, is_branch_last_revision)) - self.revid_branch[revid] = branch + self.revid_branch_info[revid] = branch_info def load_branch_heads(self): """Load the tips, tips of the pending merges, and revision of the @@ -367,18 +414,16 @@ self.revid_head_info = {} self.head_revids = [] - self.revid_branch = {} + self.revid_branch_info = {} for bi in self.branches: - - if len(self.branches) == 1: - tag = None + if len(self.branches)>0: + label = bi.label else: - tag = bi.branch.nick - if len(tag) > 20: - tag = tag[:20]+'...' + label = None branch_last_revision = bi.branch.last_revision() - self.append_head_info(branch_last_revision, bi.branch, tag, True) + self.append_head_info(branch_last_revision, bi, + bi.label, True) self.update_ui() if bi.tree: @@ -388,19 +433,19 @@ revid = parent_ids[0] if revid != branch_last_revision: # working tree is out of date - if tag: - self.append_head_info(revid, bi.branch, - "%s - Working Tree" % tag, False) + if label: + self.append_head_info(revid, bi, + "%s - Working Tree" % label, False) else: - self.append_head_info(revid, bi.branch, + self.append_head_info(revid, bi, "Working Tree", False) # other parents are pending merges for revid in parent_ids[1:]: - if tag: - self.append_head_info(revid, bi.branch, - "%s - Pending Merge" % tag, False) + if label: + self.append_head_info(revid, bi, + "%s - Pending Merge" % label, False) else: - self.append_head_info(revid, bi.branch, + self.append_head_info(revid, bi, "Pending Merge", False) self.update_ui() @@ -461,9 +506,7 @@ for repo in self.repos_sorted_local_first()] self.graph = Graph(StackedParentsProvider(parents_providers)) - self.process_graph_parents(self.graph.iter_ancestry(self.head_revids)) - - self.compute_loaded_graph() + self._load_graph(self.graph.iter_ancestry(self.head_revids)) def load_graph_all_revisions_for_annotate(self): if not len(self.branches) == 1: @@ -472,7 +515,7 @@ self.revid_head_info = {} self.head_revids = [] - self.revid_branch = {} + self.revid_branch_info = {} bi = self.branches[0] self.trunk_branch = bi.branch @@ -501,9 +544,7 @@ for p in self.graph.iter_ancestry(heads): yield p - self.process_graph_parents(parents()) - - self.compute_loaded_graph() + self._load_graph(parents()) def load_graph_pending_merges(self): if not len(self.branches) == 1 or not len(self.repos) == 1: @@ -522,7 +563,7 @@ self.revid_head_info = {} self.head_revids = ["root:",] - self.revid_branch = {} + self.revid_branch_info = {} pending_merges = [] for head in tree_heads[1:]: @@ -545,47 +586,75 @@ new_parents.append("root:") graph_parents[revid] = tuple(new_parents) - self.process_graph_parents(graph_parents.items()) - self.compute_loaded_graph() + self._load_graph(graph_parents.items()) - def process_graph_parents(self, graph_parents): - self.graph_parents = {} - self.graph_children = {} - ghosts = set() + def _load_graph(self, graph_parents_iter): + graph_parents = {} + self.ghosts = set() - for (revid, parent_revids) \ - in graph_parents: - if parent_revids is None: - ghosts.add(revid) + for (revid, parent_revids) in graph_parents_iter: + if revid == NULL_REVISION: continue - if parent_revids == (NULL_REVISION,): - self.graph_parents[revid] = () + if parent_revids is None: + #Ghost + graph_parents[revid] = () + self.ghosts.add(revid) + elif parent_revids == (NULL_REVISION,): + graph_parents[revid] = () else: - self.graph_parents[revid] = parent_revids - for parent in parent_revids: - self.graph_children.setdefault(parent, []).append(revid) - self.graph_children.setdefault(revid, []) - if len(self.graph_parents) % 100 == 0 : + graph_parents[revid] = parent_revids + if len(graph_parents) % 100 == 0 : self.update_ui() - for ghost in ghosts: - for ghost_child in self.graph_children[ghost]: - self.graph_parents[ghost_child] = [p - for p in self.graph_parents[ghost_child] if p not in ghosts] - - def compute_loaded_graph(self): - self.graph_parents["top:"] = self.head_revids - - if len(self.graph_parents)>0: - merge_sorted_revisions = merge_sort(self.graph_parents, - "top:", - generate_revno=True) - assert merge_sorted_revisions[0][1] == "top:" - self.revisions = \ - [RevisionInfo(index, revid, merge_depth, - revno_sequence, end_of_merge) - for (index, (seq, revid, merge_depth, - revno_sequence, end_of_merge)) in - enumerate(merge_sorted_revisions[1:])] + + graph_parents["top:"] = self.head_revids + + + if len(graph_parents)>0: + enabled = gc.isenabled() + if enabled: + gc.disable() + + def make_kg(): + return KnownGraph(graph_parents) + self.known_graph = make_kg() + + merge_sorted_revisions = self.known_graph.merge_sort('top:') + # So far, we are a bit faster than the pure-python code. But the + # last step hurts. Specifically, we take + # 377ms KnownGraph(self.graph_parents) + # 263ms kg.merge_sort() [640ms combined] + # 1322ms self.revisions = [...] + # vs + # 1152ms tsort.merge_sort(self.graph_parents) + # 691ms self.revisions = [...] + # + # It is a gc thing... :( + # Adding gc.disable() / gc.enable() around this whole loop changes + # things to be: + # 100ms KnownGraph(self.graph_parents) + # 77ms kg.merge_sort() [177ms combined] + # 174ms self.revisions = [...] + # vs + # 639ms tsort.merge_sort(self.graph_parents) + # 150ms self.revisions = [...] + # Also known as "wow that's a lot faster". This is because KG() + # creates a bunch of Python objects, then merge_sort() creates a + # bunch more. And then self.revisions() creates another whole set. + # And all of these are moderately long lived, so you have a *lot* + # of allocations without removals (which triggers the gc checker + # over and over again.) And they probably don't live in cycles + # anyway, so you can skip it for now, and just run at the end. + + # self.revisions *is* a little bit slower. Probably because pyrex + # MergeSortNodes use long integers rather than PyIntObject and thus + # create them on-the-fly. + + # Get rid of the 'top:' revision + merge_sorted_revisions.pop(0) + self.revisions = [RevisionInfo(index, node) + for index, node in enumerate(merge_sorted_revisions)] + if enabled: + gc.enable() else: self.revisions = () @@ -705,8 +774,8 @@ for rev in self.revisions: - parents = [self.revid_rev[parent] - for parent in self.graph_parents[rev.revid]] + parents = [self.revid_rev[parent] for parent in + self.known_graph.get_parent_keys(rev.revid)] if len(parents) > 0: if rev.branch_id == parents[0].branch_id: @@ -727,17 +796,21 @@ return map if len(self.branches) > 1: - head_revid_branch = sorted([(revid, branch) \ + head_revid_branch_info = sorted([(revid, branch_info) \ for revid, (head_info, ur) in \ self.revid_head_info.iteritems() - for (branch, tag, lr) in head_info], + for (branch_info, tag, lr) in head_info], cmp = self.repos_cmp_local_higher, - key = lambda x: x[1].repository) - self.revid_branch = get_revid_head(head_revid_branch) + key = lambda x: x[1].branch.repository) + self.revid_branch_info = get_revid_head(head_revid_branch_info) else: - self.revid_branch = {} + self.revid_branch_info = {} + + head_count = 0 + for head_info, ur in self.revid_head_info.itervalues(): + head_count += len(head_info) - if len(self.revid_head_info) > 1: + if head_count > 1: # Populate unique revisions for heads for revid, (head_info, ur) in self.revid_head_info.iteritems(): rev = None @@ -753,7 +826,7 @@ # if revid == c,then we want other_revids = [b] merged_by_revid = self.revisions[rev.merged_by].revid - other_revids = [self.graph_parents[merged_by_revid][0]] + other_revids = [self.known_graph.get_parent_keys(merged_by_revid)[0]] else: other_revids = [other_revid for other_revid \ in self.revid_head_info.iterkeys() \ @@ -784,11 +857,15 @@ if tree is None: tree = bi.branch.basis_tree() - self.has_dir = False - for fileid in self.fileids: - if tree.kind(fileid) in ('directory', 'tree-reference'): - self.has_dir = True - break + tree.lock_read() + try: + self.has_dir = False + for fileid in self.fileids: + if tree.kind(fileid) in ('directory', 'tree-reference'): + self.has_dir = True + break + finally: + tree.unlock() self.filter_file_id = [False for i in xrange(len(self.revisions))] @@ -1175,8 +1252,8 @@ # Find parents that are currently visible rev_visible_parents = [] # List of (parent_rev, is_direct) - parents = [self.revid_rev[parent_revid] - for parent_revid in self.graph_parents[rev.revid]] + parents = [self.revid_rev[parent_revid] for parent_revid in + self.known_graph.get_parent_keys(rev.revid)] # Don't include left hand parents (unless this is the last # revision of the branch.) All of these parents in the # branch can be drawn with one line. @@ -1231,7 +1308,7 @@ if not parent.branch_id == branch_id: has_seen_different_branch = True # find grand parent. - g_parent_ids = self.graph_parents[parent.revid] + g_parent_ids = self.known_graph.get_parent_keys(parent.revid) if len(g_parent_ids) == 0: parent = None @@ -1389,7 +1466,7 @@ parent.color, direct)) - self.branch_tags = {} + self.branch_labels = {} for (revid, (head_info, unique_revids)) in self.revid_head_info.iteritems(): top_visible_revid = None @@ -1400,11 +1477,8 @@ top_visible_revid = unique_revid break - tags = [tag for (branch, - tag, - is_branch_last_revision) in head_info] if top_visible_revid: - self.branch_tags[top_visible_revid] = tags + self.branch_labels[top_visible_revid] = head_info def set_branch_visible(self, branch_id, visible, has_change): if not self.branch_lines[branch_id].visible == visible: @@ -1430,7 +1504,7 @@ return True return False - def colapse_expand_rev(self, revid, visible): + def collapse_expand_rev(self, revid, visible): rev = self.revid_rev[revid] #if rev.f_index is not None: return branch_ids = zip(rev.twisty_branch_ids, @@ -1573,13 +1647,19 @@ before_batch_load = before_batch_load, revisions_loaded = revisions_loaded) + def get_revid_branch_info(self, revid): + if revid in self.ghosts: + raise GhostRevisionError(revid) + + if len(self.branches)==1 or revid not in self.revid_branch_info: + return self.branches[0] + return self.revid_branch_info[revid] + def get_revid_branch(self, revid): - if len(self.branches)==1 and revid not in self.revid_branch: - return self.branches[0].branch - return self.revid_branch[revid] + return self.get_revid_branch_info(revid).branch def get_revid_repo(self, revid): - return self.get_revid_branch(revid).repository + return self.get_revid_branch_info(revid).branch.repository def get_repo_revids(self, revids): """Returns list of typle of (repo, revids)""" @@ -1593,8 +1673,12 @@ repo_revids[local_repo_copy].append(revid) for revid in revids: - repo = self.get_revid_repo(revid) - repo_revids[repo.base].append(revid) + try: + repo = self.get_revid_repo(revid) + except GhostRevisionError: + pass + else: + repo_revids[repo.base].append(revid) return [(repo, repo_revids[repo.base]) for repo in self.repos_sorted_local_first()] diff -Nru qbzr-0.18.6/lib/logmodel.py qbzr-0.19/lib/logmodel.py --- qbzr-0.18.6/lib/logmodel.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/logmodel.py 2010-08-05 09:10:37.000000000 -0400 @@ -121,7 +121,7 @@ COL_MESSAGE, QtCore.QModelIndex())) self.emit(QtCore.SIGNAL("linesUpdated()")) - def colapse_expand_rev(self, revid, visible): + def collapse_expand_rev(self, revid, visible): self.clicked_row = self.graph_provider.revid_rev[revid].index clicked_row_index = self.createIndex (self.clicked_row, COL_MESSAGE, @@ -131,7 +131,7 @@ clicked_row_index) self.graph_provider.update_ui() self.clicked_row = None - has_change = self.graph_provider.colapse_expand_rev(revid, visible) + has_change = self.graph_provider.collapse_expand_rev(revid, visible) if has_change: self.compute_lines() @@ -216,11 +216,24 @@ return QtCore.QVariant(QtCore.QStringList(tags)) if role == BranchTagsRole: - tags = [] - if rev_info.revid in gp.branch_tags: - tags = [tag for tag \ - in gp.branch_tags[rev_info.revid] if tag] - return QtCore.QVariant(QtCore.QStringList(tags)) + labels = [] + if rev_info.revid in gp.branch_labels: + labels = [label for (branch, + label, + is_branch_last_revision) + in gp.branch_labels[rev_info.revid] + if label] + return QtCore.QVariant(QtCore.QStringList(labels)) + + if role == QtCore.Qt.ToolTipRole and index.column() == COL_MESSAGE: + urls = [] + if rev_info.revid in gp.branch_labels: + urls = [branch_info.branch.base for (branch_info, + label, + is_branch_last_revision) + in gp.branch_labels[rev_info.revid] + if label] + return QtCore.QVariant('\n'.join(urls)) if role == RevIdRole: return QtCore.QVariant(QtCore.QByteArray(rev_info.revid)) diff -Nru qbzr-0.18.6/lib/log.py qbzr-0.19/lib/log.py --- qbzr-0.18.6/lib/log.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/log.py 2010-08-05 09:10:37.000000000 -0400 @@ -18,15 +18,6 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore, QtGui -from bzrlib.branch import Branch -from bzrlib import osutils -from bzrlib.plugins.qbzr.lib.logwidget import LogList -from bzrlib.plugins.qbzr.lib.diff import ( - has_ext_diff, - ExtDiffMenu, - DiffButtons, - ) -from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.util import ( BTN_CLOSE, BTN_REFRESH, @@ -37,17 +28,24 @@ runs_in_loading_queue, get_set_encoding, ) -from bzrlib.plugins.qbzr.lib.revisionmessagebrowser import LogListRevisionMessageBrowser from bzrlib.plugins.qbzr.lib.trace import reports_exception, SUB_LOAD_METHOD from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget + +from bzrlib.lazy_import import lazy_import +lazy_import(globals(), ''' +from bzrlib.branch import Branch +from bzrlib import osutils +from bzrlib.plugins.qbzr.lib.logwidget import LogList +from bzrlib.plugins.qbzr.lib.diff import ( + has_ext_diff, + ExtDiffMenu, + DiffButtons, + ) +from bzrlib.plugins.qbzr.lib.i18n import gettext +from bzrlib.plugins.qbzr.lib.revisionmessagebrowser import LogListRevisionMessageBrowser from bzrlib.plugins.qbzr.lib.cat import QBzrCatWindow from bzrlib.plugins.qbzr.lib.annotate import AnnotateWindow - -try: - from bzrlib.plugins.svn.repository import SvnRepository - has_svn = True -except ImportError: - has_svn = False +''') PathRole = QtCore.Qt.UserRole + 1 @@ -107,8 +105,8 @@ else: self.branch = None self.locations = locations - if self.locations is None: - self.locations = [u"."] + #if self.locations is None: + # self.locations = [u"."] assert specific_fileids is None, "specific_fileids is ignored if branch is None" self.branches = None @@ -160,8 +158,8 @@ self.log_list = LogList(self.processEvents, self.throbber, no_graph, - self) - + self, + action_commands=True) logbox.addWidget(self.throbber) logbox.addWidget(self.log_list) @@ -377,7 +375,7 @@ self.search_timer.start(200) def _locations_for_title(self, locations): - if locations == ['.']: + if locations is None: return osutils.getcwd() else: if len(locations) > 1: @@ -425,6 +423,10 @@ self.file_list_context_menu_cat = \ self.file_list_context_menu.addAction(gettext("View file"), self.show_file_content) + self.file_list_context_menu_revert_file = \ + self.file_list_context_menu.addAction( + gettext("Revert to this revision"), + self.revert_file) self.file_list.connect( self.file_list, @@ -464,8 +466,8 @@ self.throbber.show() gp = self.log_list.graph_provider repos = [gp.get_revid_branch(revid).repository for revid in revids] - if has_svn and (isinstance(repos[0], SvnRepository) or - isinstance(repos[1], SvnRepository)): + if (repos[0].__class__.__name__ == 'SvnRepository' or + repos[1].__class__.__name__ == 'SvnRepository'): # Loading trees from a remote svn repo is unusably slow. # See https://bugs.launchpad.net/qbzr/+bug/450225 # If only 1 revision is selected, use a optimized svn method @@ -561,6 +563,20 @@ self.file_list_context_menu_annotate.setEnabled(is_single_file) self.file_list_context_menu_cat.setEnabled(is_single_file) + + gp = self.log_list.graph_provider + # It would be nice if there were more than one branch, that we + # show a menu so the user can chose which branch actions should take + # place in. + one_branch_with_tree = (len(gp.branches) == 1 and + gp.branches[0].tree is not None) + + (top_revid, old_revid), count = \ + self.log_list.get_selection_top_and_parent_revids_and_count() + self.file_list_context_menu_revert_file.setEnabled(one_branch_with_tree) + self.file_list_context_menu_revert_file.setVisible(one_branch_with_tree) + + self.file_list_context_menu.popup( self.file_list.viewport().mapToGlobal(pos)) @@ -610,6 +626,25 @@ window.show() self.window().windows.append(window) + @ui_current_widget + def revert_file(self): + """Reverts the file to what it was at the selected revision.""" + res = QtGui.QMessageBox.question(self, gettext("Revert File"), + gettext("Are you sure you want to revert this file " + "to the state it was at the selected revision?" + ),QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) + if res == QtGui.QMessageBox.Yes: + paths, file_ids = self.get_file_selection_paths_and_ids() + + (top_revid, old_revid), count = \ + self.log_list.get_selection_top_and_parent_revids_and_count() + gp = self.log_list.graph_provider + assert(len(gp.branches)==1) + branch_info = gp.branches[0] + rev_tree = gp.get_revid_repo(top_revid).revision_tree(top_revid) + branch_info.tree.revert(paths, old_tree=rev_tree, + report_changes=True) + @ui_current_widget def show_file_annotate(self): """Show qannotate for selected file.""" diff -Nru qbzr-0.18.6/lib/logwidget.py qbzr-0.19/lib/logwidget.py --- qbzr-0.18.6/lib/logwidget.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/logwidget.py 2010-08-05 09:10:37.000000000 -0400 @@ -17,19 +17,23 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from PyQt4 import QtCore, QtGui, Qt +from PyQt4 import QtCore, QtGui -from bzrlib.bzrdir import BzrDir -from bzrlib.revision import NULL_REVISION -from bzrlib.revisionspec import RevisionSpec from bzrlib.plugins.qbzr.lib.revtreeview import (RevisionTreeView, RevNoItemDelegate, get_text_color) +from bzrlib.revision import NULL_REVISION + +from bzrlib.lazy_import import lazy_import +lazy_import(globals(), ''' +from bzrlib.bzrdir import BzrDir +from bzrlib.revisionspec import RevisionSpec from bzrlib.plugins.qbzr.lib.tag import TagWindow, CallBackTagWindow from bzrlib.plugins.qbzr.lib import logmodel from bzrlib.plugins.qbzr.lib import diff from bzrlib.plugins.qbzr.lib.i18n import gettext - +from bzrlib.plugins.qbzr.lib.subprocess import SimpleSubProcessDialog +''') class LogList(RevisionTreeView): """TreeView widget to show log with metadata and graph of revisions.""" @@ -97,12 +101,19 @@ QtCore.SIGNAL("linesUpdated()"), self.make_selection_continuous) - def create_context_menu(self): + def create_context_menu(self, diff_is_default_action=True): + branch_count = len(self.graph_provider.branches) + self.context_menu = QtGui.QMenu(self) - if self.view_commands or self.action_commands: + self.connect(self, + QtCore.SIGNAL("customContextMenuRequested(QPoint)"), + self.show_context_menu) + + if self.view_commands: if self.graph_provider.fileids: if diff.has_ext_diff(): - diff_menu = diff.ExtDiffMenu(self) + diff_menu = diff.ExtDiffMenu( + self, set_default=diff_is_default_action) diff_menu.setTitle(gettext("Show file &differences")) self.context_menu.addMenu(diff_menu) self.connect(diff_menu, QtCore.SIGNAL("triggered(QString)"), @@ -117,13 +128,15 @@ show_diff_action = self.context_menu.addAction( gettext("Show file &differences..."), self.show_diff_specified_files) - self.context_menu.setDefaultAction(show_diff_action) + if diff_is_default_action: + self.context_menu.setDefaultAction(show_diff_action) self.context_menu.addAction( gettext("Show all &differences..."), self.show_diff) else: if diff.has_ext_diff(): - diff_menu = diff.ExtDiffMenu(self) + diff_menu = diff.ExtDiffMenu( + self, set_default=diff_is_default_action) self.context_menu.addMenu(diff_menu) self.connect(diff_menu, QtCore.SIGNAL("triggered(QString)"), self.show_diff_ext) @@ -131,16 +144,53 @@ show_diff_action = self.context_menu.addAction( gettext("Show &differences..."), self.show_diff) - self.context_menu.setDefaultAction(show_diff_action) + if diff_is_default_action: + self.context_menu.setDefaultAction(show_diff_action) - self.connect(self, - QtCore.SIGNAL("customContextMenuRequested(QPoint)"), - self.show_context_menu) + self.context_menu_show_tree = self.context_menu.addAction( + gettext("Show &tree..."), self.show_revision_tree) + + if self.action_commands: + self.context_menu.addSeparator() + def add_branch_action(text, triggered, require_wt=False): + if branch_count == 1: + action = self.context_menu.addAction(text, triggered) + if require_wt: + action.setDisabled( + self.graph_provider.branches[0].tree is None) + else: + menu = BranchMenu(text, self, self.graph_provider, + require_wt) + self.connect(menu, + QtCore.SIGNAL("triggered(QVariant)"), + triggered) + action = self.context_menu.addMenu(menu) + return action + + self.context_menu_tag = add_branch_action( + gettext("Tag &revision..."), self.tag_revision) + + self.context_menu_revert = add_branch_action( + gettext("R&evert to this revision"), self.revert_to_revision, + require_wt=True) + + self.context_menu_update = add_branch_action( + gettext("&Update to this revision"), self.update_to_revision, + require_wt=True) + + # In theory we should have a select branch option like push. + # But merge is orentated to running in a branch, and selecting a + # branch to merge form, so it does not really work well. + if branch_count > 1: + self.context_menu_cherry_pick = add_branch_action( + gettext("&Cherry pick"), self.cherry_pick, + require_wt=True) + else: + self.context_menu_cherry_pick = None - self.context_menu.addAction(gettext("Show &tree..."), - self.show_revision_tree) - self.context_menu.addAction(gettext("Tag &revision..."), - self.tag_revision) + self.context_menu_reverse_cherry_pick = add_branch_action( + gettext("Re&verse Cherry pick"), self.reverse_cherry_pick, + require_wt=True) def load_branch(self, branch, fileids, tree=None): self.throbber.show() @@ -223,7 +273,7 @@ self.graph_provider.unlock_branches() def mousePressEvent (self, e): - colapse_expand_click = False + collapse_expand_click = False if e.button() & QtCore.Qt.LeftButton: pos = e.pos() index = self.indexAt(pos) @@ -239,20 +289,20 @@ if twistyRect.contains(pos): twisty_state = index.data(logmodel.GraphTwistyStateRole) if twisty_state.isValid(): - colapse_expand_click = True + collapse_expand_click = True revision_id = str(index.data(logmodel.RevIdRole).toString()) - self.log_model.colapse_expand_rev(revision_id, not twisty_state.toBool()) + self.log_model.collapse_expand_rev(revision_id, not twisty_state.toBool()) index_b = self.log_model.indexFromRevId(revision_id) index_b = self.filter_proxy_model.mapFromSource(index_b) self.scrollTo(index_b) e.accept () - if not colapse_expand_click: + if not collapse_expand_click: QtGui.QTreeView.mousePressEvent(self, e) def mouseMoveEvent (self, e): # This prevents the selection from changing when the mouse is over # a twisty. - colapse_expand_click = False + collapse_expand_click = False pos = e.pos() index = self.indexAt(pos) rect = self.visualRect(index) @@ -267,8 +317,8 @@ if twistyRect.contains(pos): twisty_state = index.data(logmodel.GraphTwistyStateRole) if twisty_state.isValid(): - colapse_expand_click = True - if not colapse_expand_click: + collapse_expand_click = True + if not collapse_expand_click: QtGui.QTreeView.mouseMoveEvent(self, e) def keyPressEvent (self, e): @@ -287,10 +337,10 @@ if e.key() == QtCore.Qt.Key_Right \ and twisty_state.isValid() \ and not twisty_state.toBool(): - self.log_model.colapse_expand_rev(revision_id, True) + self.log_model.collapse_expand_rev(revision_id, True) if e.key() == QtCore.Qt.Key_Left: if twisty_state.isValid() and twisty_state.toBool(): - self.log_model.colapse_expand_rev(revision_id, False) + self.log_model.collapse_expand_rev(revision_id, False) else: #find merge of child branch revision_id = self.graph_provider.\ @@ -337,7 +387,7 @@ return None, None top_revid = str(indexes[0].data(logmodel.RevIdRole).toString()) bot_revid = str(indexes[-1].data(logmodel.RevIdRole).toString()) - parents = self.graph_provider.graph_parents[bot_revid] + parents = self.graph_provider.known_graph.get_parent_keys(bot_revid) if parents: # We need a ui to select which parent. parent_revid = parents[0] @@ -355,16 +405,146 @@ def default_action(self, index=None): self.show_diff_specified_files() - def tag_revision(self): + def tag_revision(self, selected_branch_info=None): + gp = self.graph_provider + + if selected_branch_info: + selected_branch_info = selected_branch_info.toPyObject() + else: + assert(len(gp.branches)==1) + selected_branch_info = gp.branches[0] + revid = str(self.currentIndex().data(logmodel.RevIdRole).toString()) - revno = self.graph_provider.revid_rev[revid].revno_str + revno = gp.revid_rev[revid].revno_str revs = [RevisionSpec.from_string(revno)] - branch = self.graph_provider.get_revid_branch(revid) + branch = selected_branch_info.branch action = TagWindow.action_from_options(force=False, delete=False) window = CallBackTagWindow(branch, self.refresh_tags, action=action, revision=revs) window.show() self.window().windows.append(window) + def sub_process_action(self, selected_branch_info, get_dialog, + auto_run=False, refresh_method=None): + gp = self.graph_provider + (top_revid, old_revid), rev_count = \ + self.get_selection_top_and_parent_revids_and_count() + top_revno_str = gp.revid_rev[top_revid].revno_str + old_revno_str = gp.revid_rev[old_revid].revno_str + + if selected_branch_info: + selected_branch_info = selected_branch_info.toPyObject() + single_branch = False + else: + assert(len(gp.branches)==1) + selected_branch_info = gp.branches[0] + single_branch = True + + dialog = get_dialog(rev_count, + top_revid, old_revid, + top_revno_str, old_revno_str, + selected_branch_info, single_branch) + + if refresh_method: + QtCore.QObject.connect(dialog, + QtCore.SIGNAL("subprocessFinished(bool)"), + refresh_method) + + dialog.show() + self.window().windows.append(dialog) + + if auto_run: + dialog.do_accept() + + def revert_to_revision(self, selected_branch_info=None): + def get_dialog(rev_count, + top_revid, old_revid, + top_revno_str, old_revno_str, + selected_branch_info, single_branch): + assert(rev_count==1) + + if single_branch: + desc = (gettext("Revert to revision %s revid:%s.") % + (top_revno_str, top_revid)) + else: + desc = (gettext("Revert %s to revision %s revid:%s.") % + (selected_branch_info.label, top_revno_str, top_revid)) + + args = ["revert", '-r', 'revid:%s' % top_revid] + return SimpleSubProcessDialog( + gettext("Revert"), desc=desc, args=args, + dir=selected_branch_info.tree.basedir, + parent=self) + + self.sub_process_action(selected_branch_info, get_dialog) + + def update_to_revision(self, selected_branch_info=None): + def get_dialog(rev_count, + top_revid, old_revid, + top_revno_str, old_revno_str, + selected_branch_info, single_branch): + assert(rev_count==1) + + if single_branch: + desc = (gettext("Update to revision %s revid:%s.") % + (top_revno_str, top_revid)) + else: + desc = (gettext("Update %s to revision %s revid:%s.") % + (selected_branch_info.label, top_revno_str, top_revid)) + + args = ["update", '-r', 'revid:%s' % top_revid] + return SimpleSubProcessDialog( + gettext("Update"), desc=desc, args=args, + dir=selected_branch_info.tree.basedir, + parent=self) + + self.sub_process_action(selected_branch_info, get_dialog, True, + self.refresh) + # TODO, we should just update the branch tags, rather than a full + # refresh. + + def cherry_pick(self, selected_branch_info=None): + def get_dialog(rev_count, + top_revid, old_revid, + top_revno_str, old_revno_str, + selected_branch_info, single_branch): + from_branch_info = self.graph_provider.get_revid_branch_info(top_revid) + + desc = (gettext("Cherry-pick revisions %s - %s from %s to %s.") % + (old_revno_str, top_revno_str, + from_branch_info.label, selected_branch_info.label)) + + args = ["merge", from_branch_info.branch.base, + '-r', 'revid:%s..revid:%s' % (old_revid, top_revid)] + return SimpleSubProcessDialog( + gettext("Cherry-pick"), desc=desc, args=args, + dir=selected_branch_info.tree.basedir, + parent=self) + + self.sub_process_action(selected_branch_info, get_dialog) + # No refresh, because we don't track cherry-picks yet :-( + + def reverse_cherry_pick(self, selected_branch_info=None): + def get_dialog(rev_count, + top_revid, old_revid, + top_revno_str, old_revno_str, + selected_branch_info, single_branch): + if single_branch: + desc = (gettext("Reverse cherry-pick revisions %s - %s") % + (old_revno_str, top_revno_str)) + else: + desc = (gettext("Reverse cherry-pick revisions %s - %s in %s.") % + (old_revno_str, top_revno_str, selected_branch_info.label)) + + args = ["merge", '.', + '-r', 'revid:%s..revid:%s' % (top_revid, old_revid)] + return SimpleSubProcessDialog( + gettext("Reverse cherry-pick"), desc=desc, args=args, + dir=selected_branch_info.tree.basedir, + parent=self) + + self.sub_process_action(selected_branch_info, get_dialog) + # No refresh, because we don't track cherry-picks yet :-( + def show_diff(self, index=None, specific_files=None, specific_file_ids=None, ext_diff=None): @@ -410,8 +590,69 @@ self.window().windows.append(window) def show_context_menu(self, pos): + branch_count = len(self.graph_provider.branches) + (top_revid, old_revid), count = \ + self.get_selection_top_and_parent_revids_and_count() + + def filter_rev_ansestor(action, is_ansestor=True): + branch_menu = action.menu() + if branch_menu: + vis_branch_count = branch_menu.filter_rev_ansestor( + top_revid, is_ansestor) + if vis_branch_count == 0: + action.setVisible(False) + + if self.view_commands: + self.context_menu_show_tree.setVisible(count == 1) + + if self.action_commands: + self.context_menu_tag.setVisible(count == 1) + if count == 1: + filter_rev_ansestor(self.context_menu_tag) + self.context_menu_revert.setVisible(count == 1) + self.context_menu_update.setVisible(count == 1) + + if branch_count>1: + filter_rev_ansestor(self.context_menu_cherry_pick, + is_ansestor=False) + + filter_rev_ansestor(self.context_menu_reverse_cherry_pick) + self.context_menu.popup(self.viewport().mapToGlobal(pos)) +class BranchMenu(QtGui.QMenu): + + def __init__ (self, text, parent, graphprovider, require_wt): + QtGui.QMenu.__init__(self, text, parent) + self.graphprovider = graphprovider + for branch in self.graphprovider.branches: + action = QtGui.QAction(branch.label, self) + action.setData(QtCore.QVariant (branch)) + self.addAction(action) + if require_wt and branch.tree is None: + action.setDisabled(True) + + self.connect(self, QtCore.SIGNAL("triggered(QAction *)"), + self.triggered) + + def filter_rev_ansestor(self, rev, is_ansestor=True): + visible_action_count = 0 + + for action in self.actions(): + branch_info = action.data().toPyObject() + branch_tip = branch_info.branch.last_revision() + is_ansestor_ = ( + frozenset((branch_tip,)) == + self.graphprovider.known_graph.heads((branch_tip, rev))) + visible = is_ansestor_== is_ansestor + action.setVisible(visible) + if visible: + visible_action_count += 1 + + return visible_action_count + + def triggered(self, action): + self.emit(QtCore.SIGNAL("triggered(QVariant)"), action.data()) class GraphTagsBugsItemDelegate(QtGui.QStyledItemDelegate): @@ -460,10 +701,6 @@ text_margin = style.pixelMetric(QtGui.QStyle.PM_FocusFrameHMargin, None, widget) + 1 - if not hasattr(self, '_usingGtkStyle'): - self._usingGtkStyle = style.objectName() == 'gtk+' - self._usingQt45 = Qt.qVersion() >= '4.5' - painter.save() painter.setClipRect(option.rect) style.drawPrimitive(QtGui.QStyle.PE_PanelItemViewItem, @@ -481,9 +718,8 @@ penwidth = 1 pen.setWidth(penwidth) pen.setCapStyle(QtCore.Qt.FlatCap) - if not self._usingQt45: - #this is to try get lines 1 pixel wide to actualy be 1 pixel wide. - painter.translate(0.5, 0.5) + #this is to try get lines 1 pixel wide to actualy be 1 pixel wide. + painter.translate(0.5, 0.5) # Draw lines into the cell for line in self.prevLines: @@ -573,10 +809,7 @@ painter.drawLine(tl.x() + 1, br.y(), br.x() - 1, br.y()) painter.setFont(tagFont) painter.setPen(self._labelColor) - if self._usingGtkStyle: - painter.drawText(tagRect.left() + 3, tagRect.bottom() - option.fontMetrics.descent(), label) - else: - painter.drawText(tagRect.left() + 3, tagRect.bottom() - option.fontMetrics.descent() + 1, label) + painter.drawText(tagRect.left() + 3, tagRect.bottom() - option.fontMetrics.descent() + 1, label) x += tagRect.width() + text_margin finally: painter.restore() diff -Nru qbzr-0.18.6/lib/pull.py qbzr-0.19/lib/pull.py --- qbzr-0.18.6/lib/pull.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/pull.py 2010-08-05 09:10:37.000000000 -0400 @@ -21,7 +21,11 @@ from PyQt4 import QtCore, QtGui -from bzrlib import errors, urlutils +from bzrlib import ( + errors, + osutils, + urlutils, + ) from bzrlib.commands import get_cmd_object from bzrlib.plugins.qbzr.lib.i18n import gettext @@ -82,10 +86,9 @@ dest = self.tree.basedir else: dest = self.branch.base - if dest == os.getcwdu(): - args = [] - else: - args = ['--directory', dest] + args = [] + if dest != osutils.getcwd(): + args.extend(('--directory', dest)) if self.ui.overwrite.isChecked(): args.append('--overwrite') if self.ui.remember.isChecked(): @@ -202,10 +205,9 @@ dest = self.tree.basedir else: dest = self.branch.base - if dest == os.getcwdu(): - args = [] - else: - args = ['--directory', dest] + args = [] + if dest != osutils.getcwd(): + args.extend(('--directory', dest)) if self.ui.overwrite.isChecked(): args.append('--overwrite') if self.ui.remember.isChecked(): @@ -214,7 +216,7 @@ args.append('--create-prefix') if self.ui.use_existing_dir.isChecked(): args.append('--use-existing-dir') - if 'strict' in get_cmd_object('push').options(): + if 'strict' in get_cmd_object('push').options() and self._no_strict: # force --no-strict because we checking blocking conditions # in validate method (see below). args.append('--no-strict') diff -Nru qbzr-0.18.6/lib/resources.py qbzr-0.19/lib/resources.py --- qbzr-0.18.6/lib/resources.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/resources.py 2010-08-05 09:10:37.000000000 -0400 @@ -2,7 +2,7 @@ # Resource object code # -# Created: Fri Nov 6 21:17:20 2009 +# Created: Fri Dec 18 15:04:38 2009 # by: The Resource Compiler for PyQt (Qt v4.5.2) # # WARNING! All changes made in this file will be lost! @@ -366,6 +366,245 @@ \xc0\xd0\x5a\x87\xb4\xd6\x3c\x18\xa2\x94\x22\x66\xd6\x00\x7c\xad\ \xb5\x02\xa0\x00\x78\x13\xc3\x1d\xe8\xf0\x1b\x97\x09\xed\xc1\x8d\ \x52\xf2\x20\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x04\x42\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\ +\x0d\xd7\x01\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd5\x0b\x05\x0f\x2e\x39\x91\x77\x20\x06\x00\x00\x03\xcf\x49\x44\ +\x41\x54\x38\xcb\xb5\x55\x6d\x4c\x9b\x55\x14\x7e\xee\xfb\xd5\x96\ +\xae\x2d\xd4\x76\x30\xb3\x01\xc9\x26\x2d\x61\x9d\x46\x60\x33\x6c\ +\x7c\x98\xa8\x0b\xcc\x39\xc9\x62\x66\xb6\xc4\x1f\xf2\x4b\x89\xce\ +\x65\xc6\x18\x5d\xb2\x2c\x32\x22\x71\x22\xa2\xc4\xa8\xd1\x2d\x31\ +\xe2\x4f\xa3\x89\x2e\xc6\x41\xdc\x54\x46\xf9\x5a\x1c\x93\x22\xdb\ +\x90\x92\x76\xa6\xc0\xda\xf2\x52\x4a\xdf\xf7\xed\x7b\xaf\x3f\x28\ +\xae\xb0\x32\xc1\xc4\x9b\xdc\xe4\xe4\xdc\x93\xe7\x3e\xe7\xb9\xe7\ +\x9c\x0b\xfc\x4f\x8b\x2c\x19\x1f\x7d\xdc\x31\x36\x3f\x1f\xdb\x06\ +\x80\xa5\x1f\x13\x02\x30\xc6\xb0\xdc\x7f\x27\x80\x10\x72\xfe\xf8\ +\xb1\xd7\x9e\x5c\xf5\x86\x96\x77\x9a\x29\x63\x8c\x51\x4a\xd7\xbc\ +\x19\x63\xec\x4c\x6b\x8b\x9e\x09\x4f\x48\xb3\x19\x00\x22\xcb\xb3\ +\x6b\x4e\xd7\x6a\xb5\xad\x96\x09\xb8\xb4\x9c\xd6\xa5\x61\x4a\x9e\ +\x55\x97\x90\x29\xd0\xe7\xf3\xfd\x2b\xa8\xdb\x5d\xbc\x36\xe0\x74\ +\xc6\x6e\xb7\xfb\x9e\x2c\x19\x63\xff\x8d\xf1\xe8\xe8\xe8\x5d\x81\ +\xde\x7e\x2f\x26\xfd\x13\xa0\x94\x82\x32\x0a\x41\x10\x50\x59\x59\ +\xbd\x3e\xc6\xc5\xc5\x77\xd2\xf4\x4f\xfa\x71\xf6\xdc\x59\x1c\x39\ +\x7c\x04\x75\xb5\xfb\xa1\x6a\x3a\x74\x06\x48\x3c\xc1\x9c\x1c\x41\ +\x77\x77\x17\xff\xc6\x89\xd7\x2b\x9a\x9b\xde\xee\x59\x13\x63\xc6\ +\x18\x66\x67\xa3\x38\xff\xc3\xf7\x68\x7c\xf1\x28\xba\x86\x6e\x61\ +\x2c\x1a\x82\x64\xca\x82\xa6\x33\xe8\x4a\x1c\x3b\x36\x32\x1c\x3b\ +\x7a\x1c\x6d\xed\xef\xfe\xdc\x74\xfa\x54\xd9\x89\x37\x4f\x5e\xb9\ +\x27\x63\x97\xcb\x05\xc6\x80\xb7\x4e\x9f\x42\xe3\x0b\x2f\xe3\x9b\ +\x81\x29\xfc\x95\xb0\xe2\xd9\x9a\xcd\xb8\xdf\x6e\x42\x92\x52\xf8\ +\x02\x32\xba\xae\x4e\x21\xea\x0d\xe2\xa5\xc6\x57\xb8\xb6\xf6\xd6\ +\x4b\x00\x2c\x4b\x18\xfc\x92\xf1\xf8\x13\x8f\x9d\xdc\x5d\xb1\x87\ +\x24\x12\x0b\x18\x19\xf1\xa1\xaf\xdf\x8b\x2d\x5b\xf2\x31\x1e\x16\ +\x30\x1e\x33\xe1\xf9\x9a\x7c\x6c\xb4\x19\x61\x14\x79\xe8\x14\x30\ +\x19\x04\x98\x8d\x02\x86\x6f\xa9\x30\xd0\xb8\x9a\x9b\x63\x24\x3b\ +\x1e\xf4\xc4\x2e\xfe\x74\xc9\xbb\xac\x8e\xd3\x25\x71\xb9\x8a\xd0\ +\x73\xf9\x17\x94\x3e\x5c\x8a\x5e\xbf\x86\xdd\x2e\x27\x44\x51\x40\ +\x92\x02\x09\x4d\x07\x65\x0c\x5a\x52\x47\x60\x66\x01\x3c\x55\x71\ +\x2d\x04\x69\x67\xf9\x2e\xe3\xd4\x54\xa8\xed\xae\x06\x59\xae\x35\ +\x81\x28\x8a\xa0\xe0\x60\xb6\xda\x70\x9f\x45\x84\xa2\x25\xa1\x68\ +\x49\xa8\x49\x8a\x05\x55\xc7\x4c\x34\x0e\xf7\x66\x0b\x0c\x4a\x10\ +\x51\x4d\x80\xc9\x94\x05\x51\x14\x59\xc6\xc7\xa3\x94\xa6\x6a\x74\ +\xd1\x67\x10\x05\x88\x1c\xc3\x74\x34\x01\x89\x5f\x7c\x03\x45\x49\ +\x62\x5a\x56\x20\x0a\x00\xc7\xf3\x20\xa0\xd0\x93\x9a\xae\x28\x0a\ +\x4f\x29\xd5\x32\xce\x0a\x5d\xd7\xff\x01\x2e\x29\xd9\x8e\x60\x30\ +\x88\x6c\x49\xc2\x8d\x60\x04\x00\x83\x49\x22\xd8\x60\x14\xa0\x6a\ +\x3a\xcc\x92\x00\xc6\x13\x84\xe3\x04\x05\x4e\x8e\x84\xc3\xb7\x95\ +\xbc\xbc\x4d\xbd\x19\xa5\x58\x04\x5e\x64\xef\xd9\xee\x41\xdf\x80\ +\x17\xfb\x4a\x73\x31\xbd\x00\x28\x49\x0a\xc6\x08\x28\x65\x48\x68\ +\x3a\x92\x94\x21\x1a\x4b\xc0\xe8\xdc\x8a\xda\x87\x9c\xdc\xe7\xe7\ +\x3e\x93\xa3\xd1\x48\xf7\x4a\x60\x02\x00\x06\x83\x01\x0e\x87\x03\ +\x4e\xa7\x13\x8f\xec\xaa\x40\x28\x14\xc2\xcd\x91\x41\xec\x2d\xb1\ +\x62\x68\x42\x46\xcf\xf0\x04\x28\xe1\x31\xa7\x30\x7c\xf7\xeb\x1f\ +\xb8\x30\x3c\x8d\x83\x1e\x01\x17\x2f\x7c\xcb\x0a\xf2\x0b\xcd\xb1\ +\xb9\xf9\x57\x9f\x39\x74\x70\xd3\xb2\x41\x7f\xa6\xb5\xe5\x6b\x5d\ +\xd7\x9f\x5e\xd9\x2c\x81\x40\x00\xdb\xb6\x16\x61\x5f\xfd\x61\xfc\ +\xf8\x5b\x08\x93\xb7\x55\xa8\x8c\xc3\x03\x4e\x11\x55\xee\x1c\x74\ +\xbc\xd7\x44\x9f\xda\x7f\x80\x1b\xbc\x32\x88\x48\x24\x4c\x65\x59\ +\x9e\x91\x44\x69\x2f\xc9\xd0\xe2\xe6\x54\xa1\x5b\x00\x6c\xa8\xae\ +\xa9\xf2\xb8\xdc\x45\x2d\x0e\xbb\x43\xcd\xce\xb1\x8b\xe5\x65\xe5\ +\xe6\xc2\xc2\xc2\xac\xce\xaf\x3a\xff\xbc\x39\x7e\x5d\x8a\xc9\xf1\ +\xe6\xdc\x3c\x67\x47\x5d\x6d\x1d\xae\x5e\x1b\x46\xd5\x9e\x6a\xfa\ +\x65\xe7\x17\x1c\xbf\x02\x98\x02\x50\x01\xc4\x01\x44\x00\xcc\xf8\ +\x27\xfc\xbf\x0f\x0e\x0c\x7d\x50\xfd\x68\xe5\x2c\xc7\x93\x6c\x6f\ +\x5f\x6f\xc1\xe5\xde\x1e\xd1\x66\xb3\x78\xed\xf6\x9c\x8e\xf6\xf7\ +\x3f\xfc\xb4\xbc\x6c\xa7\x74\xfd\xc6\x58\x65\xfd\x81\x7a\x58\x2c\ +\x56\xd2\x3f\xd0\x87\xf5\x4c\x77\x2e\xb5\x49\x9a\x84\x64\xe9\x07\ +\x69\x68\x68\x78\xce\x94\x65\xf8\x24\xe5\x3b\xf4\x37\x8c\xb4\xeb\ +\x4b\x26\xe8\x75\x28\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ +\x82\ +\x00\x00\x02\xb0\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\ +\x0d\xd7\x01\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd5\x0b\x04\x0a\x14\x28\x60\x19\x7b\x03\x00\x00\x02\x3d\x49\x44\ +\x41\x54\x38\xcb\xb5\x95\xbf\x6b\xdb\x50\x10\x80\xbf\xf7\x94\x4c\ +\xb5\x34\x08\x23\x27\x78\xca\xa6\xc4\x01\x27\x71\x8a\xed\x8c\x06\ +\x93\x39\x7f\x43\xf7\xac\xa5\x10\x77\x68\xeb\x92\xba\x7b\x16\x4f\ +\x5e\xf3\x37\x78\x09\x24\xb8\x3f\x30\x84\x40\xec\xe0\x25\xd0\x76\ +\x10\x96\x44\xa1\x49\xe9\x50\x94\xd7\xa1\x96\x2a\x47\x71\xec\x92\ +\xf6\xe0\xd0\xdd\x7b\xe2\xbb\xbb\x77\x27\x3d\xf8\x4f\x22\x42\x63\ +\xbf\x51\x7f\x01\xd4\x1e\x02\x53\x4a\xbd\x7c\xf6\x74\xef\xf9\xd8\ +\xe2\x7e\xa3\xae\x1e\x2a\xfb\x8d\xba\x0a\x79\x73\xb7\xa3\x5e\x5e\ +\x5e\xa2\x69\x1a\x4a\x29\x84\x10\x08\xf1\xbb\xa8\xb8\x1d\xfa\xb1\ +\x4c\xc9\x66\xb3\x63\x9c\x04\x38\x0e\x38\x3f\x3f\x4f\x40\x6e\xcb\ +\xda\xda\x1a\x4a\xa9\xc4\xfa\xbd\xe0\xd5\xd5\x55\xe6\xe6\xfe\xbc\ +\x12\x04\xc1\x98\x7f\x57\xf6\x53\xc1\x42\x08\xce\xce\xce\xa6\x36\ +\x6c\x7d\x7d\x1d\x29\xe5\x6c\x60\x29\x25\x4a\x29\xf2\xf9\x3c\x00\ +\xf3\xf3\xf3\x7f\x3d\x21\x09\xf0\xc7\xee\x07\xca\xc5\x2d\x84\x10\ +\x9c\x9e\x9e\x8e\xed\x35\x9b\xcd\xc8\xde\xd9\xd9\x21\x9d\x4e\x53\ +\x2e\x97\x09\x82\x20\x01\x4e\xd4\x50\x7c\x5c\x62\x71\x71\x11\x21\ +\x04\x1b\x1b\x1b\x63\x5a\xab\xd5\xb0\x2c\x8b\x85\x85\x05\x3a\x9d\ +\x0e\xc5\x62\x71\xe2\x19\xcb\xbb\x8e\xc2\x71\x1c\x84\x10\x0c\x06\ +\x03\x06\x83\x01\xbb\xbb\xbb\x1c\x1f\x1f\x73\x7d\x7d\x4d\xb5\x5a\ +\xc5\xf7\x7d\x7c\xdf\x8f\xa6\xe6\xae\x33\x96\xf7\x35\xcf\xb6\x6d\ +\x6c\xdb\xc6\x34\x4d\xda\xed\x36\x86\x61\xd0\x6e\xb7\x49\xa7\xd3\ +\x91\x4a\x29\x67\xcb\x38\x5e\x5a\xd8\xc8\x50\x9b\xcd\x26\x9a\xa6\ +\x45\xfe\xc1\xc1\x01\x8e\xe3\xcc\x96\xf1\xbb\xf7\x9d\x08\xda\xef\ +\xf7\xe9\xf5\x7a\x54\x2a\x15\x3c\xcf\xc3\x75\x5d\x5c\xd7\x65\x38\ +\x1c\x32\x1c\x0e\xb9\xba\xba\xe2\xf0\xf0\x10\xcf\xf3\xa6\x4f\x45\ +\xb9\xb4\x85\x65\x59\x78\x9e\x87\x6d\xdb\x00\xac\xac\xac\x50\xa9\ +\x54\xa2\x4a\x1c\xc7\xa1\xd5\x6a\xa1\xeb\x3a\x86\x61\x70\x74\x74\ +\xc4\xd2\xd2\xd2\xf4\x39\x76\x5d\x17\x21\x04\x17\x17\x17\x13\xe7\ +\xb4\x54\x2a\x71\x72\x72\x42\x36\x9b\x45\xd7\xf5\xe9\x19\xc7\x65\ +\x79\x79\x39\xf1\x71\x84\x8d\x95\x52\xb2\xb9\xb9\x49\xb7\xdb\x25\ +\x95\x4a\xcd\x06\x0e\x4b\xee\xf7\xfb\x13\x83\x16\x0a\x05\x4c\xd3\ +\x64\x7b\x7b\x7b\xb6\x9f\x50\x5c\x72\xb9\xdc\xd8\x64\x84\x76\xfc\ +\xa9\x94\x9a\x0d\x9c\xc9\x64\xfe\xc9\xd5\x14\x81\x6f\x6e\x6e\x5e\ +\xbd\x79\xfb\x7a\xef\x21\xb0\xcf\x9f\xbe\x3c\x49\xdc\x79\xb7\x82\ +\xa5\x00\x7d\xa4\x29\xe0\xd1\x68\xe6\x35\x40\x01\x3f\x81\x1f\xc0\ +\x57\xe0\x1b\xf0\x7d\xe4\x07\xa3\x7d\x7e\x01\x0e\xb4\xf5\xda\x0b\ +\x7d\x14\xc6\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x03\xbb\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ +\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\ +\x67\x9b\xee\x3c\x1a\x00\x00\x03\x4d\x49\x44\x41\x54\x38\x8d\xb5\ +\x95\x4d\x68\x5c\x55\x18\x86\x9f\xef\x9c\x73\xef\xcd\x9f\x52\xfb\ +\x23\x18\x8d\x34\x05\x8d\x88\xa0\x82\xc6\x98\x99\x2c\xda\x28\x11\ +\xa9\xc1\xfa\x1f\x8a\x5d\x48\xe9\xa6\x2b\x6b\x13\xa1\x2e\xa2\x88\ +\x1b\x11\x84\x8a\x2e\x4c\x37\xad\x62\x75\x51\x8d\x22\x42\x2d\xb6\ +\x1b\x15\x22\x9d\x2a\x28\x88\x41\x94\x58\xd3\x88\xa1\x36\x69\xe8\ +\x64\x66\xee\xb9\xf7\x73\x31\x77\x92\x31\xa6\x63\x5c\xf4\xc0\xcb\ +\x39\x8b\x8f\xe7\x7b\xbf\x97\x7b\xee\x11\x55\xe5\x4a\x2c\x73\x45\ +\xa8\x80\xfb\x3f\xc5\xbd\xfb\x83\x01\x11\x0e\x84\x6d\xbe\xff\xd4\ +\xa8\xfa\x46\xb5\x6b\x76\xdc\x37\x12\xee\xbd\x7e\x53\xe7\x87\x46\ +\x6c\xdf\x5a\x0c\xfd\x27\x58\x5e\x12\x93\x1b\x76\x6f\xde\xdc\x71\ +\xfb\xab\x7b\x06\x0f\xb4\x58\xe3\xd2\xb5\x18\x69\xd8\x79\x60\x58\ +\x5a\x73\xe2\xc6\xbb\x6f\xdd\x9a\xbf\xaf\xfb\xd1\xa6\xc0\x85\x6b\ +\x61\x36\x06\xe7\x9f\x97\x76\xc1\x9d\xea\xbf\x7b\x47\xe7\x9d\x5d\ +\xf7\x06\xdf\x4e\x7f\x4e\xcf\xe6\x41\x8c\xa3\x52\x5e\x70\x8b\xb9\ +\xfd\xc1\x3f\xea\xc5\x30\x1b\xb4\xfa\xf6\x5a\xf6\xab\x82\x73\x23\ +\xe1\x1d\xd6\x34\x9d\x18\xdc\xb6\xf3\x9a\xeb\x36\xdd\x60\x27\xa6\ +\x3e\x05\x94\x24\x4d\x78\x61\xd7\x5b\xcd\x46\x0c\x82\x20\xb2\x9c\ +\xe4\xe8\xd8\xee\xf5\xe0\x1d\xb0\x3a\xb8\xf7\x39\xb7\xbd\xb5\xb9\ +\xed\xe8\xc3\x5b\x9f\x6e\x33\x91\x32\x31\xf5\x09\x46\x2c\xd6\x04\ +\x7c\x31\x79\x18\x23\x0e\x23\x06\x6b\x2c\x82\x41\x44\xc8\x6f\x79\ +\xbc\x71\x14\xb9\xe1\x60\xdf\xba\xab\x37\xbc\xbc\xa3\x7f\x57\xcb\ +\xf9\xc5\x29\x7e\x3e\x7b\x06\x6b\x02\x9c\x09\x48\x35\x25\x4d\x13\ +\xac\x71\x18\xb1\xf8\xd4\x60\x32\xc7\x49\x1a\xa3\x28\xb2\x1a\x38\ +\x3f\xe2\x0e\xb6\x6f\xec\x78\x66\x20\xff\x58\xcb\xe4\xf9\x6f\x98\ +\x9e\xfb\x69\x19\xa8\x09\x81\xa4\xa4\xb6\x42\x45\x3c\x89\xc6\xa0\ +\xe0\x08\x89\xec\x55\x78\x8d\x59\x79\x83\x97\x1d\x1b\xda\x31\x88\ +\x92\x10\xfb\x12\x65\x5f\x24\x16\x8b\xa2\xd8\x10\xc0\x63\x50\x8c\ +\x15\xc4\x54\xbd\x69\xaa\x68\x09\x8a\xe9\x85\x7f\x45\xb1\x94\xfe\ +\x57\xcd\xc9\x13\xe7\xfe\xfc\xfd\xd0\x47\x27\xdf\xbd\x74\xd3\x86\ +\x6e\xba\xae\xbd\x87\xb2\x2f\x92\x9a\x12\xd8\x0a\x2e\x82\xb0\xd9\ +\x12\xb5\x58\x9a\x5a\x2d\x51\x6b\xf5\x1c\x34\x1b\x52\xa9\x5c\x1e\ +\xac\xa3\x9a\x7e\xfd\x9a\xdf\xf7\xd7\xec\x85\xe1\x63\xc7\x0f\x17\ +\xd7\x87\x1d\xf4\x74\x3e\x44\x10\x04\xd8\xc0\xe0\x42\x43\x10\x99\ +\x2a\x7c\x09\x6a\x71\x91\xc1\x58\x41\x81\x85\x73\xcb\xbc\xa5\x28\ +\x44\x24\x00\xa2\x89\x37\xfc\x07\xb7\x3d\x55\x9c\x19\x4f\xde\x3b\ +\x72\x7f\xef\xf6\xb6\xbe\xce\x27\xa5\x30\xfb\x31\x6a\x2a\x3c\xb8\ +\xe5\x59\x9c\x73\xd8\xc0\xa0\xaa\xa4\x5e\x49\x7c\x75\x47\x60\xe6\ +\x0c\x2d\x22\x12\xab\x6a\xec\x32\xa8\x03\xc2\x4c\xd1\x0f\xef\x27\ +\xdf\xdd\x98\xe7\x91\xe3\x7e\xfc\x9d\xdc\x5d\xdb\x36\xe6\x6f\xd9\ +\xe9\x4e\xcf\x1e\x43\x53\x78\xfd\xd0\x2b\xe5\x72\x31\x8e\x56\x8e\ +\x2e\x30\x37\x7f\x16\x03\x84\x22\x92\xd4\x1c\xdb\x4c\xae\xa6\xdf\ +\xbe\x4c\xfe\x98\xff\x95\xa1\xc4\x9f\x3c\x38\x7f\x71\xbe\x2b\xd7\ +\x33\x14\x6a\x22\xc4\x65\x0d\x0a\x63\xfe\x81\xf2\x45\x16\x80\x72\ +\xa6\x52\xb6\xd7\x58\xae\xe1\x4f\x68\x7e\x9a\x85\xc2\xdb\xc9\xde\ +\x42\xe1\xf4\xc9\xcf\x4e\x8c\x97\x17\x8b\xa5\x46\xe5\xf5\x2b\xad\ +\x39\x4e\x32\xf9\x3a\xf7\x15\x40\x7c\x09\x2d\x8c\xa5\x2f\x56\x86\ +\x7e\x99\xbc\x54\x3c\xb2\x87\x34\x8d\xc4\x50\xcc\x5c\xc6\x59\x9d\ +\x5f\xa1\x6a\x14\xaa\xea\x45\x24\x8b\xaa\xda\xb1\xae\x91\x03\xdc\ +\xf7\x47\x93\xb1\xca\xe0\xcc\x8f\xeb\x36\xcb\xee\x24\x66\x2e\x1b\ +\xdd\xd7\xc1\x63\x60\x11\x28\xa9\xaa\x4a\xfd\x8d\x91\x2a\x3d\x00\ +\xa2\x6c\x77\x75\x13\x48\x26\xcd\x54\x3f\x65\x19\x28\xab\x2e\xbf\ +\x2a\x72\xb9\xc7\x54\x44\x2c\xd5\xef\xdc\xd6\xa9\x36\x4d\x6d\xa2\ +\x04\x48\x74\x15\xc8\xdf\x71\xe6\x58\xba\xbc\x24\xce\xad\x00\x00\ +\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x03\xa2\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ +\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\ +\x67\x9b\xee\x3c\x1a\x00\x00\x03\x34\x49\x44\x41\x54\x38\x8d\xb5\ +\x95\x5b\x68\x1d\x55\x14\x86\xbf\x35\xb3\xe7\xe4\x62\xed\x45\x29\ +\x29\x28\xd6\x27\x6f\xed\x83\x85\x0a\x35\x89\xd0\x82\x56\x04\x41\ +\x45\xad\xfa\x22\x52\xa5\x14\x7c\x69\x49\x49\x0b\x82\xa2\x60\x51\ +\xa4\x3e\xf4\x45\x50\x4b\x69\xcc\x43\x88\x5a\x0a\x29\x62\x4b\x34\ +\x86\x26\xa6\x2a\x9a\x16\x35\x34\xc6\x4b\xd4\xa4\xb1\xc6\x04\xd3\ +\x93\xe4\xcc\x65\xcf\x5e\x3e\x9c\x39\x75\x92\x36\xd1\x87\x74\xc1\ +\xcf\xcc\x86\x35\xdf\xda\xff\xda\x8b\xd9\xa2\xaa\x5c\x8d\xf0\xae\ +\x0a\xf5\xff\x82\x1b\x9b\x83\xae\xfa\x26\xf3\xe0\x92\x83\xd5\xb1\ +\x79\x6d\xdd\x2d\xef\x37\x36\x17\x76\x2f\x29\x18\x60\xc7\xc3\x2f\ +\x54\xaf\xbb\x79\xe3\xab\xf7\xec\x35\x6f\x6f\xdb\x26\xfe\x92\x81\ +\x7d\x3f\xe0\x91\xcd\xdb\x6b\x36\xad\xbb\xff\xe9\xf3\x6b\x4d\xe7\ +\x96\xe7\x65\xd9\x62\xf9\x26\xbf\x68\x68\x0e\xfe\xc0\x51\x77\x59\ +\x75\x23\xa1\x73\xb6\xfa\xcc\xf9\x4e\x1a\x37\x6c\xad\x5a\xb1\x6c\ +\x55\xc3\xc7\x7d\x6d\xfd\x9b\xf6\xca\x96\xd3\xaf\xeb\xc8\x95\xc0\ +\x92\x1f\xb7\x86\x3d\x81\xee\xdf\xd9\x32\x27\x41\xd5\xa1\x28\x4e\ +\x1d\x5d\x43\xad\x08\x1e\x77\xac\x69\x60\x6c\x7c\xd4\x1d\xeb\x6a\ +\xf9\xdb\x5a\x7b\xef\xe7\x07\xe2\xfe\xff\x04\xbf\xb2\xe3\x5d\x4e\ +\xfd\xd4\x9e\x41\x15\xc5\x91\xba\x14\xa7\x0e\xa7\x96\xd4\x59\x52\ +\xb5\xdc\x56\x77\x37\x1a\x7b\x1c\xfd\xe4\xf0\x4c\x29\x2c\x3e\x75\ +\xea\x0d\xdb\x31\xc7\xe5\xfc\x4a\xa9\xb3\x44\xb6\x44\x64\x4b\xc4\ +\x69\x48\x64\x43\x92\x34\x22\x49\x43\x62\x1b\x12\xa7\x21\xb1\x2d\ +\xf1\xcd\xef\x27\xb8\x98\x8e\xf1\xe4\x03\x3b\xaf\x59\x71\xed\xea\ +\xb6\x86\x3d\x41\xd3\xa2\x60\xeb\x12\x4a\x49\x91\xc9\xd9\x31\x2e\ +\x14\x87\x19\x9f\xfe\x8d\xa9\xd2\x9f\x84\xb6\x48\x42\x48\x2a\x11\ +\x4e\x62\x9c\xc4\x0c\x5c\xe8\x61\x68\xe2\x0b\x1e\xbb\xef\x99\xda\ +\x1b\xeb\x6e\x7a\xb9\xb1\xd9\x1c\xac\x70\xcc\x7c\x70\x31\x9c\x64\ +\x78\xe2\x5b\x94\x72\x8b\xc4\x03\x3f\xf0\xf0\x9d\xe0\x07\x3e\x05\ +\x53\xc0\x33\x3e\xe2\x04\x27\x29\x6a\xa2\xf2\x53\x10\x44\x6e\x58\ +\x10\x9c\xb8\x68\x0e\x34\xa8\xf2\x30\x85\xb2\x3c\x23\x78\xbe\x05\ +\x2c\xce\x29\xb7\xae\xac\x67\x4d\xe1\x76\x3e\x3c\x71\x64\x76\x6a\ +\x7a\xe2\x50\x6f\x6d\xba\x6b\x41\x70\x3e\xfc\xc0\xc3\x0f\x3c\x4c\ +\x95\x77\xa9\x80\x67\x04\x4f\x3c\xd6\xaf\xda\x8a\x3f\xbb\x9c\xb6\ +\x8e\xc3\xb3\xd3\x53\x33\xfb\x4e\x1f\x4c\xdf\x01\xe0\xa5\x79\x60\ +\x11\x09\xea\x9b\xca\xcb\xc7\x37\xec\x43\x00\xcf\x48\x19\x6e\x04\ +\xdf\x08\x27\xc7\xde\xa4\xb6\xa6\x86\x3b\xaf\x7f\x88\xf1\x91\x29\ +\x3d\x76\xbc\x65\x66\xf2\x97\xe8\xd9\xef\xda\x5d\x37\x50\x0b\x18\ +\x11\x89\x54\x35\x31\x19\xd4\x00\x05\x85\xf1\xb7\xda\xf6\xaf\xbe\ +\x6c\xe7\x46\xe2\xdd\xcf\xbd\x58\xa8\xf6\x97\xb3\xf1\xba\x47\x39\ +\xf7\xfd\xb9\xb4\xf3\xb3\x93\x13\xc3\xbd\xba\x7d\xb4\xcf\x0d\x01\ +\x35\xfc\x3b\x08\x2a\x22\x69\x65\xc7\x3e\xe0\xf7\x1d\xb0\xeb\x81\ +\xaa\x4c\xd5\x95\xf7\xfa\x26\xd3\xeb\x52\xe5\xae\x95\x4f\xd0\xd3\ +\xdd\x13\x7f\x7d\xf6\xcb\x9f\x07\x3e\xb0\xbb\x2e\x8e\xf0\x17\x50\ +\x00\x1c\x90\x66\xb2\x80\x59\xb4\xc7\xf9\x08\x4b\x21\x1f\x7d\xda\ +\x11\x0f\x0e\x0e\xf6\x9c\x39\xe2\x5e\x4b\x23\x66\x16\x49\x77\x15\ +\x70\xbe\x9a\x9f\x29\x06\x04\xca\x23\xd2\x7e\xbc\x35\xfe\xf5\x87\ +\xd1\x43\x67\xdf\x73\xad\x59\x6e\x92\x29\xce\xbe\xcb\xab\xdc\x0a\ +\x55\xb5\x22\x42\x06\x22\x67\xcd\x02\x26\x4d\xf4\xab\x1f\xfb\x47\ +\x5a\x06\x8e\xba\xee\xac\x90\xcb\x41\x2a\xf0\x04\x28\x01\xa1\xaa\ +\xea\x9c\x7f\x85\x94\xe9\x41\xd6\xdb\x80\xf2\xd4\x54\x1c\x48\xce\ +\x81\xce\x73\x19\x01\x91\xaa\xda\x4b\xac\x85\x2e\x53\x11\xf1\x29\ +\x9f\xb4\x9f\x53\xc5\x4d\xfe\xb0\x52\xbd\x02\xe4\x1f\x2d\x27\x87\ +\xbf\xf3\xe1\xd6\x34\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ +\x82\ \x00\x00\x06\x54\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ @@ -663,6 +902,74 @@ \x47\x1d\xa3\xa3\x1f\x2d\x00\x06\x60\xca\x2f\xc0\xfe\x0b\x15\xde\ \xcf\x39\x0f\x47\x17\xc5\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ +\x00\x00\x04\x1e\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ +\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\ +\x67\x9b\xee\x3c\x1a\x00\x00\x03\xb0\x49\x44\x41\x54\x38\x8d\xb5\ +\x94\x5f\x4c\x1c\x55\x14\xc6\xbf\x7b\x67\x66\x07\x76\x81\x15\x16\ +\x4a\x15\x64\x8b\x2d\x85\xa5\xa9\x85\xd2\x85\x84\xc5\x48\xad\xc6\ +\xb4\x54\x6d\xfb\xea\x9f\xc4\x17\x4d\x8c\x6f\x6e\x1a\x1f\xf4\xc9\ +\xc4\x07\x33\x8f\xea\x83\x69\xdf\x34\x26\x18\xdb\x44\x93\x9a\x48\ +\x5a\xb4\x38\xd0\x62\x08\x48\x4b\xf8\x23\x58\x96\x65\x2d\xbb\xac\ +\x5d\xba\x65\xb7\xcb\xce\xcc\x3d\x3e\x74\x77\x33\xae\x5b\xe8\x4b\ +\x4f\x72\x72\x66\xce\xdc\xfb\x9b\x6f\xbe\xb9\xf7\x32\x22\xc2\xe3\ +\x08\xfe\x58\xa8\x00\xe4\xe2\x46\x20\xa8\xb8\xc1\xf0\xbe\xa4\xb0\ +\x97\xc9\xa2\x0e\x22\x38\xb8\xc4\xd6\x19\x47\x58\x98\x74\x55\x58\ +\xf8\x54\xd7\x8c\xe4\x4e\x60\x66\xb7\x22\x10\x54\x5e\xe7\x12\xfb\ +\xdc\x77\x60\x7f\x79\x6b\x6b\xab\xea\xa9\xf1\xc0\xe9\xa8\x42\x3a\ +\x9d\xc2\xdd\xcd\x04\xfe\x5c\x58\xda\xfa\xe3\xc6\x74\x46\x98\xe2\ +\x2c\x80\x73\xba\x66\x88\x1d\xc1\x7d\x67\x95\x8f\xeb\x6a\x77\x7d\ +\x18\x78\xf1\xb0\x73\x77\x6d\x03\x9c\x92\x1b\x69\x6b\x03\x8b\x29\ +\x1d\x59\x33\x05\xd9\xa8\xc2\x2e\xb9\x0d\xfc\x7e\x15\x86\x47\x2e\ +\xa7\x6f\xc7\xc2\x83\xbf\x7d\x66\xbc\xbd\x2d\x38\x10\x54\x8e\x3c\ +\x51\x59\x33\xd2\x7e\x78\x8f\x1a\x09\xc5\x37\xd7\x22\x31\xa7\x43\ +\x55\x8d\x96\x7d\x7b\xc5\x11\xbf\xdf\xf9\xd7\xe6\x35\xfc\x9d\x58\ +\x44\x36\x23\x50\x81\xdd\xf0\xb9\xfb\x31\xf4\xeb\xa5\x74\x7c\x23\ +\xfa\x86\xae\x19\x17\x4b\x82\x7b\x3f\x90\xb9\xaa\x3a\x42\x2e\xd5\ +\xdd\x90\xbc\x7f\x27\x64\x1a\xd6\x7b\x00\x46\x01\xb8\x19\xc7\x3b\ +\x6e\x67\x4d\xf0\xd5\x81\x33\xea\x54\xec\x12\xee\x24\xd7\x91\xcd\ +\x08\xd4\xa8\x8d\x38\x50\xf7\x3c\x2e\x0c\x7d\x9d\x24\x21\xda\x75\ +\xcd\x88\x14\x83\x65\x00\x87\xb6\xb6\xb2\x8d\xa6\x88\x8f\x5a\x06\ +\x1d\xd3\x35\x23\x93\x7b\x76\x17\xc0\x47\x81\xa0\x32\xf3\xcb\xd5\ +\xe1\xf3\x3d\xdd\x47\xcb\x47\xd6\xbe\x87\x10\x16\xe2\x66\x18\x69\ +\x4f\x02\x7b\xbd\xfb\x94\xc5\x5b\x0b\xa7\x00\x7c\x51\x0c\xe6\x00\ +\xba\x98\x84\x84\x65\xd0\x69\x1b\xb4\x10\xba\x66\x7c\x1b\x8e\x2e\ +\x8d\x45\x22\xab\x68\xaa\xf6\x15\xfa\xe1\xc4\x2c\x9a\x9f\x6a\x2b\ +\x67\x1c\x7d\xa5\xac\xe0\x6a\x05\x6f\x04\xe1\x13\x5d\x33\x62\x0f\ +\xfb\x11\x24\xf0\xd5\x5a\x6c\x2d\x55\x59\x56\x5b\xe8\x25\x33\x71\ +\xb8\x5c\x95\x00\xd0\x5d\x6a\x8e\x6c\x19\x34\x4a\x02\x13\xf9\x46\ +\x20\xa8\x48\x00\xbe\x03\x70\xda\x3e\x30\x1e\x5f\xa7\x67\xdb\x3b\ +\x0b\xf7\x59\x2b\x83\x32\x87\x0a\x12\x68\x0e\x04\x95\xe2\xed\x7b\ +\x91\x95\xda\xd2\x81\xa0\xa2\x32\x8e\x2b\x9e\xda\x9a\xae\xa3\xdd\ +\x27\xd5\x32\xd9\xf5\x40\x39\x08\x3f\xcf\x9d\x83\xa0\x07\xcb\xf7\ +\xb8\xef\xdd\xc2\x1c\x4b\x98\xb8\x32\xfe\xc3\x56\x34\x16\x9d\x20\ +\x81\x17\x4a\x82\x73\x70\x17\xe3\x18\x6d\x68\x68\x68\x0b\x74\xbc\ +\xe4\xb8\x1e\xfa\x11\x9b\x5b\x89\xff\x8d\xab\x50\xab\xd1\xe3\x7d\ +\x05\xd7\xa6\x87\xb3\x2b\xe1\xd0\x1c\x09\xf4\xea\x9a\x91\x7a\xe8\ +\x59\xa1\x6b\x46\x8a\x04\xfa\x57\x57\x23\x2b\x93\xb3\x63\xa6\xbf\ +\xe9\x04\xf2\xca\xf3\x51\x26\xbb\xe0\x6f\x3a\x81\xc9\xd9\x31\x33\ +\xb4\x12\x5a\x21\x81\x7e\x5d\x33\x52\xc0\x0e\x87\x90\xae\x19\x09\ +\x10\xfa\x16\x96\xe6\xa3\xf3\xcb\x37\x85\xdf\x3b\x00\x45\x52\x01\ +\x00\x8a\xa4\xc2\xef\x1d\xc0\xfc\xf2\x4d\xb1\xb0\x34\x1f\x05\xa1\ +\x4f\xd7\x8c\xc2\x27\x95\xb4\x82\x31\xc6\x73\x2f\xe5\x00\xd8\xa1\ +\x37\x25\xaf\xab\x9e\x8d\x76\x77\xf6\x56\xd7\xd7\x3d\xc9\x27\xc2\ +\x3f\xa1\xeb\xe9\xe3\x88\xae\xaf\x89\xf1\x49\x3d\x61\xa4\xa9\xfb\ +\xf7\x2f\xad\x5b\x64\x83\x15\xc0\x8c\x31\x06\x40\xca\x25\xb7\x55\ +\x06\x80\xfb\xce\xf0\x96\xea\x66\x3e\xf4\x5c\xcf\xb1\xca\xc6\xfa\ +\x3d\x6c\x35\xba\x4c\x23\xe3\x97\xef\x6d\xde\xa6\xfe\xe9\x6f\xac\ +\x39\x00\x02\x80\x05\xc0\x22\x22\x62\x44\x94\x57\x28\x6d\x93\x1c\ +\x00\x6b\x7b\x8d\x1f\xf4\xb4\xc8\x17\x0e\xfa\x3a\x9c\x37\x66\xa7\ +\xd2\x1b\x2b\xd6\xc9\x99\x41\x6b\x2a\x0f\xb4\xa5\x99\x07\xe7\x01\ +\x72\x11\x50\x2e\xbe\x6e\x3b\xc5\x3b\xab\x9f\xe1\xe7\x93\xab\xf4\ +\xd6\xcc\xa0\x35\x96\x07\xd9\xa1\x76\xf0\x23\x29\xce\x25\x79\xf6\ +\x33\xe7\x3f\x0b\x74\xaf\x84\x52\x0b\x80\x49\x44\xe6\x23\x7b\x9c\ +\xab\xf9\xa0\x9c\xa7\xf9\x6a\x87\x8a\xed\x56\x85\x1d\x66\x57\xcb\ +\x72\xb0\xff\x80\xf3\x30\x7b\xfc\x0b\xa7\x72\xca\x4d\xa2\xbf\x42\ +\x74\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\x11\ \x47\ \x49\x46\x38\x39\x61\x10\x00\x10\x00\xc4\x00\x00\xff\xff\xff\xee\ @@ -1213,27 +1520,6 @@ \x85\xd4\xed\x2a\xb6\x28\x70\x55\x91\xd2\x6b\x0a\x51\xa3\x48\xf9\ \x2d\x23\xc4\x90\x84\x5b\xfd\x2b\xba\xf9\x07\x8a\x58\x02\xe7\x84\ \xb0\x89\x4e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x01\x2d\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ -\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ -\xe7\x49\x44\x41\x54\x28\xcf\x85\xd0\x3d\x2f\x43\x01\x18\xc5\xf1\ -\xdf\xbd\xbd\x4d\xaa\xa2\xde\xd2\xad\xca\x62\x32\x4a\x4c\xd6\x4e\ -\x16\x53\xc3\x07\xa8\x98\x0c\x8d\x8f\x60\xd6\x84\xc1\x4a\x24\xe2\ -\x83\xf8\x00\x26\xe3\x6d\x62\x90\x98\x34\x2d\xbd\x28\x6a\xe8\x9b\ -\x54\xca\x19\xcf\xff\xe4\x9c\x27\x4f\x00\x27\x12\xbf\x35\xe5\x00\ -\x11\x24\xf6\xbd\x83\xee\x10\x77\x9d\x83\xa8\x04\xda\x1a\x43\xd8\ -\x45\x5a\x88\x52\xaf\xa1\xea\x46\xd3\xc3\x0f\x4c\x4a\xa0\xa9\xea\ -\xb8\x37\x11\x6b\xa8\x8f\x4d\x10\xdb\x1c\xdc\xf0\xe2\x68\x68\x07\ -\x63\xa7\x46\xb0\x61\xb2\x22\x58\xff\x2f\x70\x3f\x01\x16\x11\x94\ -\xfc\xad\x54\x2c\xb6\xe5\x50\x5d\x59\xa2\xec\xd9\xae\xb6\x1d\x2d\ -\x57\x62\xb1\x10\x32\x3e\xe4\xb5\xac\xf8\xb2\xec\x53\x4e\x5a\xb6\ -\xdf\x10\xc2\xa2\x50\xd6\xaa\x57\x45\x73\xe6\xb1\x26\x3f\x0a\xd4\ -\xfa\xc6\x63\x3f\x9a\x53\x90\x31\xed\x6c\xd4\x50\x75\x81\x27\x0b\ -\x66\xbd\xb9\xc5\xa5\x3d\x9d\xc1\xe3\x6a\xd2\x0a\xb6\x71\x6a\x46\ -\x47\x05\xd7\xee\x2c\xa9\xe0\x1b\x83\xe2\x38\x28\x2a\x7f\x1b\x1b\ -\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\xbb\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ @@ -1434,6 +1720,23 @@ \x00\x6d\x00\x61\x00\x67\x00\x65\x00\x2d\x00\x6d\x00\x69\x00\x73\x00\x73\x00\x69\x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x0d\ +\x0b\x27\xb1\x67\ +\x00\x65\ +\x00\x64\x00\x69\x00\x74\x00\x2d\x00\x66\x00\x69\x00\x6e\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x17\ +\x03\x48\xc3\xe7\ +\x00\x64\ +\x00\x6f\x00\x63\x00\x75\x00\x6d\x00\x65\x00\x6e\x00\x74\x00\x2d\x00\x70\x00\x72\x00\x6f\x00\x70\x00\x65\x00\x72\x00\x74\x00\x69\ +\x00\x65\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x0f\ +\x0e\x36\x76\xc7\ +\x00\x67\ +\x00\x6f\x00\x2d\x00\x70\x00\x72\x00\x65\x00\x76\x00\x69\x00\x6f\x00\x75\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x0b\ +\x0c\x2b\x1f\xc7\ +\x00\x67\ +\x00\x6f\x00\x2d\x00\x6e\x00\x65\x00\x78\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x0d\ \x07\x6d\xfe\x67\ \x00\x71\ \x00\x62\x00\x7a\x00\x72\x00\x2d\x00\x70\x00\x75\x00\x6c\x00\x6c\x00\x2e\x00\x70\x00\x6e\x00\x67\ @@ -1445,6 +1748,10 @@ \x03\xd9\xfe\x67\ \x00\x71\ \x00\x62\x00\x7a\x00\x72\x00\x2d\x00\x70\x00\x75\x00\x73\x00\x68\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x0b\ +\x0c\x9f\x1f\x67\ +\x00\x67\ +\x00\x6f\x00\x2d\x00\x6a\x00\x75\x00\x6d\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x13\ \x06\x9c\xee\xf6\ \x00\x70\ @@ -1500,10 +1807,6 @@ \x00\x66\ \x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x2d\x00\x6d\x00\x6f\x00\x64\x00\x69\x00\x66\x00\x69\x00\x65\x00\x64\x00\x2e\x00\x70\ \x00\x6e\x00\x67\ -\x00\x0b\ -\x00\xa2\x42\x07\ -\x00\x6d\ -\x00\x69\x00\x73\x00\x73\x00\x69\x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x07\x89\xd8\xc7\ \x00\x63\ @@ -1521,32 +1824,36 @@ qt_resource_struct = "\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x11\x00\x00\x00\x0a\ -\x00\x00\x00\x10\x00\x02\x00\x00\x00\x04\x00\x00\x00\x06\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x10\x00\x00\x00\x0f\ +\x00\x00\x00\x10\x00\x02\x00\x00\x00\x09\x00\x00\x00\x06\ \x00\x00\x00\x3a\x00\x00\x00\x00\x00\x01\x00\x00\x09\xe9\ \x00\x00\x00\x54\x00\x00\x00\x00\x00\x01\x00\x00\x0c\x79\ \x00\x00\x00\x20\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x00\x00\x6e\x00\x00\x00\x00\x00\x01\x00\x00\x13\x25\ -\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x01\x00\x00\x21\x69\ +\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x19\xff\ +\x00\x00\x01\x70\x00\x00\x00\x00\x00\x01\x00\x00\x2f\xc8\ +\x00\x00\x01\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x24\x18\ +\x00\x00\x01\x4a\x00\x00\x00\x00\x00\x01\x00\x00\x2a\x70\ \x00\x00\x00\x96\x00\x00\x00\x00\x00\x01\x00\x00\x15\xb9\ -\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x1c\x11\ -\x00\x00\x01\x50\x00\x00\x00\x00\x00\x01\x00\x00\x30\x61\ -\x00\x00\x02\xb8\x00\x00\x00\x00\x00\x01\x00\x00\x48\x93\ -\x00\x00\x03\x20\x00\x00\x00\x00\x00\x01\x00\x00\x51\xe8\ -\x00\x00\x01\x28\x00\x00\x00\x00\x00\x01\x00\x00\x2d\xe5\ -\x00\x00\x02\x6e\x00\x00\x00\x00\x00\x01\x00\x00\x43\x53\ -\x00\x00\x00\xfc\x00\x00\x00\x00\x00\x01\x00\x00\x27\xd0\ -\x00\x00\x02\xd4\x00\x00\x00\x00\x00\x01\x00\x00\x49\xc4\ -\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x4b\x83\ -\x00\x00\x01\xdc\x00\x00\x00\x00\x00\x01\x00\x00\x39\xaa\ -\x00\x00\x02\x8c\x00\x00\x00\x00\x00\x01\x00\x00\x45\xbf\ -\x00\x00\x02\x2e\x00\x00\x00\x00\x00\x01\x00\x00\x3e\x89\ -\x00\x00\x01\xba\x00\x00\x00\x00\x00\x01\x00\x00\x37\x2b\ -\x00\x00\x01\x66\x00\x00\x00\x00\x00\x01\x00\x00\x31\xce\ -\x00\x00\x01\x92\x00\x00\x00\x00\x00\x01\x00\x00\x34\x89\ -\x00\x00\x02\xf2\x00\x00\x00\x00\x00\x01\x00\x00\x4f\x17\ -\x00\x00\x02\x04\x00\x00\x00\x00\x00\x01\x00\x00\x3c\x08\ -\x00\x00\x02\x48\x00\x00\x00\x00\x00\x01\x00\x00\x40\x7f\ +\x00\x00\x01\x0e\x00\x00\x00\x00\x00\x01\x00\x00\x20\x72\ +\x00\x00\x01\x90\x00\x00\x00\x00\x00\x01\x00\x00\x36\x2f\ +\x00\x00\x00\xea\x00\x00\x00\x00\x00\x01\x00\x00\x1c\xb3\ +\x00\x00\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x42\xe2\ +\x00\x00\x03\xb4\x00\x00\x00\x00\x00\x01\x00\x00\x63\x38\ +\x00\x00\x01\xd8\x00\x00\x00\x00\x00\x01\x00\x00\x40\x66\ +\x00\x00\x03\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x55\xd4\ +\x00\x00\x01\xac\x00\x00\x00\x00\x00\x01\x00\x00\x3a\x51\ +\x00\x00\x03\x68\x00\x00\x00\x00\x00\x01\x00\x00\x5b\x14\ +\x00\x00\x01\x4a\x00\x00\x00\x00\x00\x01\x00\x00\x5c\xd3\ +\x00\x00\x02\x8c\x00\x00\x00\x00\x00\x01\x00\x00\x4c\x2b\ +\x00\x00\x03\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x58\x40\ +\x00\x00\x02\xde\x00\x00\x00\x00\x00\x01\x00\x00\x51\x0a\ +\x00\x00\x02\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x49\xac\ +\x00\x00\x02\x16\x00\x00\x00\x00\x00\x01\x00\x00\x44\x4f\ +\x00\x00\x02\x42\x00\x00\x00\x00\x00\x01\x00\x00\x47\x0a\ +\x00\x00\x03\x86\x00\x00\x00\x00\x00\x01\x00\x00\x60\x67\ +\x00\x00\x02\xb4\x00\x00\x00\x00\x00\x01\x00\x00\x4e\x89\ +\x00\x00\x02\xf8\x00\x00\x00\x00\x00\x01\x00\x00\x53\x00\ " def qInitResources(): diff -Nru qbzr-0.18.6/lib/revisionmessagebrowser.py qbzr-0.19/lib/revisionmessagebrowser.py --- qbzr-0.18.6/lib/revisionmessagebrowser.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/revisionmessagebrowser.py 2010-08-05 09:10:37.000000000 -0400 @@ -88,6 +88,7 @@ center - (boxsize * dotsize * 0.5 ), boxsize * dotsize, boxsize * dotsize) + self.imagesize = boxsize self.images = [] for color in xrange(7): image = QtGui.QImage(boxsize, boxsize, QtGui.QImage.Format_ARGB32) @@ -165,7 +166,8 @@ revno = self.get_revno(revid) color = self.get_color(revid) if color is not None: - color = ('' % (color % 6)) + color = '' % ( + color % 6, self.imagesize, self.imagesize) else: color = "" if revid in self._all_loaded_revs: @@ -356,11 +358,13 @@ open_browser(str(url.toEncoded())) def get_parents(self, revid): - return self.log_list.graph_provider.graph_parents[revid] + return self.log_list.graph_provider.known_graph.get_parent_keys(revid) def get_children(self, revid): - return self.log_list.graph_provider.graph_children[revid] - + return [child for child in + self.log_list.graph_provider.known_graph.get_child_keys(revid) + if not child == "top:"] + def get_revno(self, revid): return self.log_list.graph_provider.revid_rev[revid].revno_str diff -Nru qbzr-0.18.6/lib/revtreeview.py qbzr-0.19/lib/revtreeview.py --- qbzr-0.18.6/lib/revtreeview.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/revtreeview.py 2010-08-05 09:10:37.000000000 -0400 @@ -19,9 +19,12 @@ from PyQt4 import QtCore, QtGui +from bzrlib.lazy_import import lazy_import +lazy_import(globals(), ''' from bzrlib.plugins.qbzr.lib.util import run_in_loading_queue from bzrlib.plugins.qbzr.lib.lazycachedrevloader import load_revisions from bzrlib.transport.local import LocalTransport +''') RevIdRole = QtCore.Qt.UserRole + 1 @@ -45,14 +48,15 @@ self.connect(self, QtCore.SIGNAL("collapsed (QModelIndex)"), - self.colapsed_expanded) + self.collapsed_expanded) self.connect(self, QtCore.SIGNAL("expanded (QModelIndex)"), - self.colapsed_expanded) + self.collapsed_expanded) self.load_revisions_call_count = 0 self.load_revisions_throbber_shown = False + self.revision_loading_disabled = False def setModel(self, model): QtGui.QTreeView.setModel(self, model) @@ -72,7 +76,7 @@ def data_changed(self, start_index, end_index): self.load_visible_revisions() - def colapsed_expanded(self, index): + def collapsed_expanded(self, index): self.load_visible_revisions() def resizeEvent(self, e): @@ -80,7 +84,8 @@ QtGui.QTreeView.resizeEvent(self, e) def load_visible_revisions(self): - run_in_loading_queue(self._load_visible_revisions) + if not self.revision_loading_disabled: + run_in_loading_queue(self._load_visible_revisions) def _load_visible_revisions(self): model = self.model() @@ -93,11 +98,13 @@ # throbber_height = self.throbber. etc... bottom_index = self.indexAt(self.viewport().rect().bottomLeft()) # + throbber_height - revids = set() + revids = [] while True: revid = index.data(RevIdRole) if not revid.isNull(): - revids.add(str(revid.toByteArray())) + revid = str(revid.toByteArray()) + if revid not in revids: + revids.append(revid) if index == bottom_index: break index = self.indexBelow(index) diff -Nru qbzr-0.18.6/lib/run.py qbzr-0.19/lib/run.py --- qbzr-0.18.6/lib/run.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/run.py 2010-08-05 09:10:37.000000000 -0400 @@ -71,13 +71,15 @@ # add the parameters, if any if parameters: self.ui.opt_arg_edit.setText(parameters) + # and add the subprocess widgets - self.splitter = self.ui.splitter for w in self.make_default_layout_widgets(): - self.splitter.addWidget(w) + self.ui.subprocess_container_layout.addWidget(w) self.process_widget.hide_progress() + # restore the sizes self.restoreSize("run", None) + self.splitter = self.ui.splitter self.restoreSplitterSizes() # setup signals QtCore.QObject.connect(self.ui.hidden_checkbox, @@ -110,7 +112,7 @@ # ready to go if execute: # hide user edit fields - self.ui.frame.hide() + self.ui.run_container.hide() self.ui.help_browser.hide() # create edit button diff -Nru qbzr-0.18.6/lib/subprocess.py qbzr-0.19/lib/subprocess.py --- qbzr-0.18.6/lib/subprocess.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/subprocess.py 2010-08-05 09:10:37.000000000 -0400 @@ -19,24 +19,11 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import codecs import os -import re -import shlex -import signal import sys -import tempfile -import thread from PyQt4 import QtCore, QtGui -from bzrlib import ( - bencode, - commands, - osutils, - ui, - ) -from bzrlib.option import Option from bzrlib.plugins.qbzr.lib import MS_WINDOWS from bzrlib.plugins.qbzr.lib.i18n import gettext @@ -48,12 +35,35 @@ QBzrWindow, StandardButton, ensure_unicode, + InfoWidget, ) + +from bzrlib.ui.text import TextProgressView, TextUIFactory from bzrlib.plugins.qbzr.lib.trace import ( report_exception, SUB_LOAD_METHOD) -from bzrlib.ui.text import TextProgressView, TextUIFactory +from bzrlib.lazy_import import lazy_import +lazy_import(globals(), ''' +import codecs +import re +import shlex +import signal +import tempfile +import thread + +from bzrlib import ( + bencode, + commands, + osutils, + ui, + ) + +from bzrlib.bzrdir import BzrDir + +from bzrlib.plugins.qbzr.lib.commit import CommitWindow +from bzrlib.plugins.qbzr.lib.revert import RevertWindow +''') # Subprocess service messages markers @@ -61,6 +71,7 @@ SUB_GETPASS = "qbzr:GETPASS:" SUB_GETUSER = "qbzr:GETUSER:" SUB_GETBOOL = "qbzr:GETBOOL:" +SUB_ERROR = "qbzr:ERROR:" class SubProcessWindowBase(object): @@ -73,7 +84,8 @@ ui_mode=True, dialog=True, parent=None, - hide_progress=False): + hide_progress=False, + immediate=False): self.restoreSize(name, default_size) self._name = name self._default_size = default_size @@ -92,7 +104,7 @@ QtCore.SIGNAL("finished()"), self.on_finished) self.connect(self.process_widget, - QtCore.SIGNAL("failed()"), + QtCore.SIGNAL("failed(QString)"), self.on_failed) self.connect(self.process_widget, QtCore.SIGNAL("error()"), @@ -147,6 +159,34 @@ self.connect(self.buttonbox, QtCore.SIGNAL("accepted()"), self.do_accept) self.connect(self.buttonbox, QtCore.SIGNAL("rejected()"), self.do_reject) closeButton.setHidden(True) # but 'close' starts as hidden. + + self.uncommitted_info = InfoWidget(self) + uncommitted_info_layout = QtGui.QHBoxLayout(self.uncommitted_info) + + # XXX this is to big. Resize + uncommitted_info_icon = QtGui.QLabel() + uncommitted_info_icon.setPixmap(self.style().standardPixmap( + QtGui.QStyle.SP_MessageBoxWarning)) + uncommitted_info_layout.addWidget(uncommitted_info_icon) + + uncommitted_info_label = QtGui.QLabel(gettext( + 'Working tree has uncommitted changes.')) + uncommitted_info_layout.addWidget(uncommitted_info_label, 2) + uncommitted_info_button_layout = QtGui.QVBoxLayout() + uncommitted_info_layout.addLayout(uncommitted_info_button_layout) + commit_button = QtGui.QPushButton(gettext('Commit')) + self.connect(commit_button, QtCore.SIGNAL("clicked(bool)"), + self.open_commit_win) + uncommitted_info_button_layout.addWidget(commit_button) + + revert_button = QtGui.QPushButton(gettext('Revert')) + self.connect(revert_button, QtCore.SIGNAL("clicked(bool)"), + self.open_revert_win) + uncommitted_info_button_layout.addWidget(revert_button) + self.uncommitted_info.hide() + if immediate: + self.do_accept() + def make_default_status_box(self): status_group_box = QtGui.QGroupBox(gettext("Status")) @@ -161,6 +201,7 @@ Button box has 2 buttons: OK and Cancel (after successfull command execution there will be Close and Cancel). """ + yield self.uncommitted_info yield self.make_default_status_box() yield self.buttonbox @@ -198,7 +239,7 @@ if self._check_args(): self.process_widget.do_start(self.dir, *self.args) else: - self.on_failed() + self.on_failed('CheckArgsFailed') def do_reject(self): if self.process_widget.is_running(): @@ -218,9 +259,13 @@ if not self.ui_mode: self.close() - def on_failed(self): + def on_failed(self, error): self.emit(QtCore.SIGNAL("subprocessFailed(bool)"), False) self.emit(QtCore.SIGNAL("disableUi(bool)"), False) + + if error=='UncommittedChanges': + self.action_url = self.process_widget.error_data['display_url'] + self.uncommitted_info.show() def on_error(self): self.emit(QtCore.SIGNAL("subprocessError(bool)"), False) @@ -230,6 +275,27 @@ if self._restore_size: self.resize(self._restore_size) + def open_commit_win(self, b): + # XXX refactor so that the tree can be opened by the window + tree, branch = BzrDir.open_tree_or_branch(self.action_url) + commit_window = CommitWindow(tree, None) + self.windows.append(commit_window) + commit_window.show() + QtCore.QObject.connect(commit_window, + QtCore.SIGNAL("subprocessFinished(bool)"), + self.uncommitted_info, + QtCore.SLOT("setHidden(bool)")) + + def open_revert_win(self, b): + # XXX refactor so that the tree can be opened by the window + tree, branch = BzrDir.open_tree_or_branch(self.action_url) + revert_window = RevertWindow(tree, None) + self.windows.append(revert_window) + revert_window.show() + QtCore.QObject.connect(revert_window, + QtCore.SIGNAL("subprocessFinished(bool)"), + self.uncommitted_info, + QtCore.SLOT("setHidden(bool)")) class SubProcessWindow(SubProcessWindowBase, QBzrWindow): @@ -277,7 +343,8 @@ ui_mode=True, dialog=True, parent=None, - hide_progress=False): + hide_progress=False, + immediate=False): QBzrDialog.__init__(self, title, parent) self.__init_internal__(title, name=name, @@ -287,7 +354,8 @@ ui_mode=ui_mode, dialog=dialog, parent=parent, - hide_progress=hide_progress) + hide_progress=hide_progress, + immediate=immediate) def closeEvent(self, event): if not self.process_widget.is_running(): @@ -312,6 +380,7 @@ hide_progress=False, auto_start_show_on_failed=False, parent=None, + immediate=False ): super(SimpleSubProcessDialog, self).__init__( title, @@ -322,7 +391,8 @@ ui_mode=ui_mode, dialog=dialog, parent=parent, - hide_progress=hide_progress) + hide_progress=hide_progress, + immediate=immediate) self.desc = desc # create a layout to hold our one label and the subprocess widgets. layout = QtGui.QVBoxLayout(self) @@ -413,6 +483,8 @@ self.hide_progress() self._args_file = None # temp file to pass arguments to qsubprocess + self.error_class = '' + self.error_data = {} def hide_progress(self): self.progressMessage.setHidden(True) @@ -482,7 +554,10 @@ if dir is None: dir = self.defaultWorkingDir - + + self.error_class = '' + self.error_data = {} + self.process.setWorkingDirectory(dir) if getattr(sys, "frozen", None) is not None: bzr_exe = sys.argv[0] @@ -579,6 +654,10 @@ data = (button == QtGui.QMessageBox.Yes) self.process.write(SUB_GETBOOL + bencode.bencode(data) + "\n") + elif line.startswith(SUB_ERROR): + data = bencode.bdecode(line[len(SUB_ERROR):]) + self.error_class = data[0] + self.error_data = decode_unicode_escape(data[1]) else: line = line.decode(self.encoding, 'replace') self.logMessageEx(line, 'plain', self.stdout) @@ -631,15 +710,15 @@ else: message = gettext("Error while running bzr. (error code: %d)" % error) self.logMessage(message, True) - self.emit(QtCore.SIGNAL("failed()")) + self.emit(QtCore.SIGNAL("failed(QString)"), self.error_class) def onFinished(self, exitCode, exitStatus): self._delete_args_file() if self.aborting: self.aborting = False self.setProgress(1000000, [gettext("Aborted!")]) - self.emit(QtCore.SIGNAL("failed()")) - elif exitCode == 0: + self.emit(QtCore.SIGNAL("failed(QString)"), 'Aborted') + elif exitCode < 3: if self.commands and not self.aborting: self._start_next() else: @@ -648,7 +727,7 @@ self.emit(QtCore.SIGNAL("finished()")) else: self.setProgress(1000000, [gettext("Failed!")]) - self.emit(QtCore.SIGNAL("failed()")) + self.emit(QtCore.SIGNAL("failed(QString)"), self.error_class) def _create_args_file(self, text): """@param text: text to write into temp file, @@ -786,7 +865,19 @@ argv = [unicode(p, 'utf-8') for p in shlex.split(cmd_utf8)] else: argv = [unicode(p, 'utf-8') for p in bencode.bdecode(cmd_utf8)] - return commands.run_bzr(argv) + try: + return commands.run_bzr(argv) + except Exception, e: + d = {} + for key, val in e.__dict__.iteritems(): + if not key.startswith('_'): + if not isinstance(val, unicode): + val = unicode(val) + d[key] = val + print "%s%s" % (SUB_ERROR, + bencode.bencode((e.__class__.__name__, + encode_unicode_escape(d)))) + raise def sigabrt_handler(signum, frame): @@ -851,3 +942,21 @@ def bdecode_prompt(s): return bencode.bdecode(s).decode('unicode-escape') + +def encode_unicode_escape(obj): + if isinstance(obj, dict): + result = {} + for k,v in obj.iteritems(): + result[k] = v.encode('unicode-escape') + return result + else: + raise TypeError('encode_unicode_escape: unsupported type: %r' % type(obj)) + +def decode_unicode_escape(obj): + if isinstance(obj, dict): + result = {} + for k,v in obj.iteritems(): + result[k] = v.decode('unicode-escape') + return result + else: + raise TypeError('decode_unicode_escape: unsupported type: %r' % type(obj)) diff -Nru qbzr-0.18.6/lib/syntaxhighlighter.py qbzr-0.19/lib/syntaxhighlighter.py --- qbzr-0.18.6/lib/syntaxhighlighter.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/syntaxhighlighter.py 2010-08-05 09:10:37.000000000 -0400 @@ -20,19 +20,31 @@ from PyQt4 import QtCore, QtGui -have_pygments = True -try: - from pygments.styles import get_style_by_name - from pygments import lex - from pygments.util import ClassNotFound - from pygments.lexers import get_lexer_for_filename -except ImportError: - have_pygments = False +_have_pygments = None +def have_pygments(): + global _have_pygments + global ClassNotFound + global get_lexer_for_filename + global get_style_by_name + global lex + + if _have_pygments is None: + try: + from pygments.util import ClassNotFound + from pygments.styles import get_style_by_name + from pygments import lex + from pygments.lexers import get_lexer_for_filename + except ImportError: + _have_pygments = False + else: + _have_pygments = True + return _have_pygments + def highlight_document(edit, filename): doc = edit.document() - if not have_pygments: + if not have_pygments(): return try: @@ -124,4 +136,69 @@ python.show() highlight_document(python, 'syntaxhighlighter.py') - sys.exit(app.exec_()) \ No newline at end of file + sys.exit(app.exec_()) + + +def format_for_ttype(ttype, format, style=None): + if have_pygments() and ttype: + if style is None: + style = get_style_by_name("default") + + font = format.font() + + # If there is no style, use the parent type's style. + # It fixes bug 347333 - GaryvdM + while not style.styles_token(ttype) and ttype.parent: + ttype = ttype.parent + + tstyle = style.style_for_token(ttype) + if tstyle['color']: + if isinstance(format, QtGui.QPainter): + format.setPen (QtGui.QColor("#"+tstyle['color'])) + else: + format.setForeground (QtGui.QColor("#"+tstyle['color'])) + if tstyle['bold']: font.setWeight(QtGui.QFont.Bold) + if tstyle['italic']: font.setItalic (True) + # Can't get this not to affect line height. + #if tstyle['underline']: format.setFontUnderline(True) + if tstyle['bgcolor']: format.setBackground (QtGui.QColor("#"+tstyle['bgcolor'])) + # No way to set this for a QTextCharFormat + #if tstyle['border']: format. + return format + +class CachedTTypeFormater(object): + def __init__(self, base_format): + self.base_format = base_format + self._cache = {} + if have_pygments(): + self.style = get_style_by_name("default") + + def format(self, ttype): + if not have_pygments() or not ttype: + return self.base_format + if ttype in self._cache: + format = self._cache[ttype] + else: + format = QtGui.QTextCharFormat(self.base_format) + self._cache[ttype] = format + + # If there is no style, use the parent type's style. + # It fixes bug 347333 - GaryvdM + while not self.style.styles_token(ttype) and ttype.parent: + ttype = ttype.parent + self._cache[ttype] = format + + format_for_ttype(ttype, format, self.style) + + return format + +def split_tokens_at_lines(tokens): + currentLine = [] + for ttype, value in tokens: + vsplit = value.splitlines(True) + for v in vsplit: + currentLine.append((ttype, v)) + if v[-1:] in ('\n','\r'): + yield currentLine + currentLine = [] + yield currentLine \ No newline at end of file diff -Nru qbzr-0.18.6/lib/tests/__init__.py qbzr-0.19/lib/tests/__init__.py --- qbzr-0.18.6/lib/tests/__init__.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/tests/__init__.py 2010-08-05 09:10:37.000000000 -0400 @@ -40,6 +40,7 @@ 'test_autocomplete', 'test_bugs', 'test_cat', + 'test_commit', 'test_commit_data', #'test_diffview', - broken by API changes 'test_extra_isignored', diff -Nru qbzr-0.18.6/lib/tests/test_commit.py qbzr-0.19/lib/tests/test_commit.py --- qbzr-0.18.6/lib/tests/test_commit.py 1969-12-31 19:00:00.000000000 -0500 +++ qbzr-0.19/lib/tests/test_commit.py 2010-08-05 09:10:37.000000000 -0400 @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2010 Alexander Belchenko +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +from bzrlib.tests import TestCase, TestCaseWithTransport +from PyQt4 import QtCore, QtGui +from bzrlib.plugins.qbzr.lib.tests import replace_report_exception +from bzrlib.plugins.qbzr.lib.tests.excepthookwatcher import TestWatchExceptHook +from bzrlib.plugins.qbzr.lib.commit import CommitWindow + + +class TestCommit(TestWatchExceptHook, TestCaseWithTransport): + + def setUp(self): + super(TestCommit, self).setUp() + replace_report_exception(self) + + def test_bug_526011(self): + tree = self.make_branch_and_tree('branch') + self.build_tree(['branch/a/']) + tree.add('a') + tree.commit(message='1') + win = CommitWindow(tree=tree, selected_list=['a']) + self.addCleanup(win.close) + win.show() + QtCore.QCoreApplication.processEvents() + QtCore.QCoreApplication.processEvents() diff -Nru qbzr-0.18.6/lib/tests/test_loggraphprovider.py qbzr-0.19/lib/tests/test_loggraphprovider.py --- qbzr-0.18.6/lib/tests/test_loggraphprovider.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/tests/test_loggraphprovider.py 2010-08-05 09:10:37.000000000 -0400 @@ -193,3 +193,61 @@ self.assertRaises(errors.BzrCommandError, gp.open_locations, ["file-that-does-not-exist"]) + + def test_branch_label_location(self): + branch = self.make_branch("branch") + gp = LogGraphProvider(False) + + self.assertEqual('path', + gp.branch_label('path', branch)) + + def test_branch_label_no_location(self): + branch = self.make_branch("branch") + gp = LogGraphProvider(False) + + # No location, use nick + self.assertEqual('branch', + gp.branch_label(None, branch)) + + def test_branch_label_path_location(self): + branch = self.make_branch("branch") + gp = LogGraphProvider(False) + + # Location seems like a path - use it + self.assertEqual('path-to-branch', + gp.branch_label('path-to-branch', branch)) + + def test_branch_label_alias_directory(self): + branch = self.make_branch("branch") + gp = LogGraphProvider(False) + + # show shortcut, and nick + self.assertEqual(':parent (branch)', + gp.branch_label(':parent', branch)) + + def test_branch_label_no_info_locations(self): + branch = self.make_branch("branch") + gp = LogGraphProvider(False) + + # locations that don't have alot of info in them should show the nick + self.assertEqual('. (branch)', + gp.branch_label('.', branch)) + self.assertEqual('../ (branch)', + gp.branch_label('../', branch)) + + def test_branch_label_explict_nick(self): + branch = self.make_branch("branch") + branch.nick = "nick" + gp = LogGraphProvider(False) + + self.assertEqual('path (nick)', + gp.branch_label('path', branch)) + + def test_branch_label_repository(self): + repo = self.make_repository("repo", shared=True) + branch = self.make_branch("repo/branch") + + gp = LogGraphProvider(False) + + self.assertEqual('./branch', + gp.branch_label(None, branch, '.', repo)) diff -Nru qbzr-0.18.6/lib/tests/test_subprocess.py qbzr-0.19/lib/tests/test_subprocess.py --- qbzr-0.18.6/lib/tests/test_subprocess.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/tests/test_subprocess.py 2010-08-05 09:10:37.000000000 -0400 @@ -24,6 +24,8 @@ bdecode_prompt, bencode_prompt, bencode_unicode, + encode_unicode_escape, + decode_unicode_escape, ) @@ -45,3 +47,11 @@ self.assertEqual('spam'+'\n'+'eggs', bdecode_prompt("10:spam\\neggs")) self.assertEqual(u'\u0420\n\u0421', bdecode_prompt("14:\\u0420\\n\\u0421")) + + def test_encode_unicode_escape_dict(self): + self.assertEqual({'key': 'foo\\nbar', 'ukey': u'\\u1234'}, + encode_unicode_escape({'key': 'foo\nbar', 'ukey': u'\u1234'})) + + def test_decode_unicode_escape_dict(self): + self.assertEqual({'key': 'foo\nbar', 'ukey': u'\u1234'}, + decode_unicode_escape({'key': 'foo\\nbar', 'ukey': u'\\u1234'})) diff -Nru qbzr-0.18.6/lib/tests/test_treewidget.py qbzr-0.19/lib/tests/test_treewidget.py --- qbzr-0.18.6/lib/tests/test_treewidget.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/tests/test_treewidget.py 2010-08-05 09:10:37.000000000 -0400 @@ -24,13 +24,16 @@ from bzrlib.branch import Branch from bzrlib.bzrdir import BzrDir from bzrlib.conflicts import TextConflict, ConflictList +from bzrlib import ignores from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.treewidget import ( TreeWidget, TreeModel, + TreeFilterProxyModel, ModelItemData, InternalItem, + PersistantItemReference, group_large_dirs, ) from bzrlib.plugins.qbzr.lib.tests.modeltest import ModelTest @@ -39,24 +42,18 @@ def load_tests(standard_tests, module, loader): result = loader.suiteClass() - tree_scenarios = ( - ('Working-Tree', - {'make_tree': TestTreeWidget.make_working_tree, - 'modify_tree': TestTreeWidget.modify_working_tree,}), - ('Working-Tree-Changes-Mode', - {'make_tree': TestTreeWidget.make_working_tree, - 'modify_tree': TestTreeWidget.modify_working_tree, - 'changes_mode': True}), - ('Revision-Tree', - {'make_tree': TestTreeWidget.make_rev_tree, - 'modify_tree': lambda self, tree: None,}), - ) - sp_tests, remaining_tests = tests.split_suite_by_condition( + tree_tests, remaining_tests = tests.split_suite_by_condition( standard_tests, tests.condition_isinstance(( TestTreeWidget, ))) - tests.multiply_tests(sp_tests, tree_scenarios, result) + tests.multiply_tests(tree_tests, tree_scenarios, result) + filter_tests, remaining_tests = tests.split_suite_by_condition( + remaining_tests, tests.condition_isinstance(( + TestTreeFilterProxyModel, + ))) + tests.multiply_tests(filter_tests, filter_scenarios, result) + # No parametrization for the remaining tests result.addTests(remaining_tests) @@ -214,6 +211,160 @@ widget.update() QtCore.QCoreApplication.processEvents() +tree_scenarios = ( + ('Working-Tree', + {'make_tree': TestTreeWidget.make_working_tree, + 'modify_tree': TestTreeWidget.modify_working_tree,}), + ('Working-Tree-Changes-Mode', + {'make_tree': TestTreeWidget.make_working_tree, + 'modify_tree': TestTreeWidget.modify_working_tree, + 'changes_mode': True}), + ('Revision-Tree', + {'make_tree': TestTreeWidget.make_rev_tree, + 'modify_tree': lambda self, tree: None,}), +) + +class TestTreeFilterProxyModel(TestWatchExceptHook, TestCaseWithTransport): + # Set by load_tests + filter = None + expected_visible = None + + def test_filters(self): + tree = self.make_branch_and_tree('tree') + + self.build_tree(['tree/dir-with-unversioned/', + 'tree/ignored-dir-with-child/',]) + self.build_tree_contents([('tree/dir-with-unversioned/child', ''), + ('tree/ignored-dir-with-child/child', ''), + ('tree/unchanged', ''), + ('tree/changed', 'old'), + ('tree/unversioned', ''), + ('tree/ignored', ''), + ]) + tree.add(['dir-with-unversioned'], ['dir-with-unversioned-id']) + tree.add(['unchanged'], ['unchanged-id']) + tree.add(['changed'], ['changed-id']) + ignores.tree_ignores_add_patterns(tree, + ['ignored-dir-with-child', + 'ignored']) + + tree.commit('a', rev_id='rev-a', + committer="joe@foo.com", + timestamp=1166046000.00, timezone=0) + + self.build_tree_contents([('tree/changed', 'new')]) + + self.model = TreeModel() + load_dirs=[PersistantItemReference(None, 'dir-with-unversioned'), + PersistantItemReference(None, 'ignored-dir-with-child')] + self.model.set_tree(tree, branch=tree.branch, load_dirs=load_dirs) + self.filter_model = TreeFilterProxyModel() + self.filter_model.setSourceModel(self.model) + + + self.filter_model.setFilters(self.filter) + self.assertVisiblePaths(self.expected_visible) + + + def assertVisiblePaths(self, paths): + visible_paths = [] + parent_indexes_to_visit = [QtCore.QModelIndex()] + while parent_indexes_to_visit: + parent_index = parent_indexes_to_visit.pop() + for row in range(self.filter_model.rowCount(parent_index)): + index = self.filter_model.index(row, 0, parent_index) + visible_paths.append( + str(self.filter_model.data(index, self.model.PATH).toString())) + if self.filter_model.hasChildren(index): + parent_indexes_to_visit.append(index) + + # we do not care for the order in this test. + visible_paths.sort() + paths.sort() + self.assertEqual(visible_paths, paths) + +class TestTreeWidgetSelectAll(TestWatchExceptHook, TestCaseWithTransport): + + def setUp(self): + super(TestTreeWidgetSelectAll, self).setUp() + tree = self.make_branch_and_tree('tree') + + self.build_tree(['tree/dir-with-unversioned/', + 'tree/ignored-dir-with-child/', + 'tree/unversioned-with-ignored/', + 'tree/unversioned-with-ignored/ignored-dir-with-child/', + ]) + self.build_tree_contents([('tree/dir-with-unversioned/child', ''), + ('tree/ignored-dir-with-child/child', ''), + ('tree/unversioned-with-ignored/ignored-dir-with-child/child', ''), + ('tree/unchanged', ''), + ('tree/changed', 'old'), + ('tree/unversioned', ''), + ('tree/ignored', ''), + ]) + tree.add(['dir-with-unversioned'], ['dir-with-unversioned-id']) + tree.add(['unchanged'], ['unchanged-id']) + tree.add(['changed'], ['changed-id']) + ignores.tree_ignores_add_patterns(tree, + ['ignored-dir-with-child', + 'ignored']) + + tree.commit('a', rev_id='rev-a', + committer="joe@foo.com", + timestamp=1166046000.00, timezone=0) + + self.build_tree_contents([('tree/changed', 'new')]) + self.tree = tree + + def assertSelectedPaths(self, treewidget, paths): + if 0: treewidget = TreeWidget() + selected = [item.path for item in treewidget.tree_model.iter_checked()] + # we do not care for the order in this test. + selected.sort() + paths.sort() + self.assertEqual(selected, paths) + + def test_add_selectall(self): + import bzrlib.plugins.qbzr.lib.add + self.win = bzrlib.plugins.qbzr.lib.add.AddWindow(self.tree, None) + self.addCleanup(self.cleanup_win) + self.win.initial_load() + self.assertSelectedPaths(self.win.filelist, ['dir-with-unversioned/child', + 'unversioned', + 'unversioned-with-ignored']) + + + def test_commit_selectall(self): + import bzrlib.plugins.qbzr.lib.commit + self.win = bzrlib.plugins.qbzr.lib.commit.CommitWindow(self.tree, None) + self.addCleanup(self.cleanup_win) + self.win.load() + self.assertSelectedPaths(self.win.filelist, ['changed']) + #self.win.show_nonversioned_checkbox.setCheckState(QtCore.Qt.Checked) + self.win.show_nonversioned_checkbox.click() + #self.win.selectall_checkbox.setCheckState(QtCore.Qt.Unchecked) + self.win.selectall_checkbox.click() + #import pdb; pdb.set_trace() + self.assertSelectedPaths(self.win.filelist, ['changed', + 'dir-with-unversioned/child', + 'unversioned', + 'unversioned-with-ignored']) + + def test_revert_selectall(self): + import bzrlib.plugins.qbzr.lib.revert + self.win = bzrlib.plugins.qbzr.lib.revert.RevertWindow(self.tree, None) + self.addCleanup(self.cleanup_win) + self.win.initial_load() + self.win.selectall_checkbox.click() + self.assertSelectedPaths(self.win.filelist, ['changed']) + + def cleanup_win(self): + # Sometimes the model was getting deleted before the widget, and the + # widget was trying to query the model. So we delete everything here. + self.win.deleteLater() + self.win.filelist.deleteLater() + self.win.filelist.tree_model.deleteLater() + QtCore.QCoreApplication.processEvents() class TestModelItemData(TestCase): @@ -249,6 +400,52 @@ self.assertEqual(models, sorted(reversed(models), key=ModelItemData.dirs_first_sort_key)) +# UNCHANGED, CHANGED, UNVERSIONED, IGNORED +filter_scenarios = ( + ('All', + {'filter': (True, True, True, True), + 'expected_visible': ['dir-with-unversioned', + 'dir-with-unversioned/child', + 'ignored-dir-with-child', + 'ignored-dir-with-child/child', + 'unchanged', + 'changed', + 'unversioned', + 'ignored', + '.bzrignore', + ],}), + ('Unchanged', + {'filter': (True, False, False, False) , + 'expected_visible': ['dir-with-unversioned', + 'unchanged', + '.bzrignore', + ],}), + ('Changed', + {'filter': (False, True, False, False), + 'expected_visible': ['changed', ],}), + ('Unversioned', + {'filter': (False, False, True, False), + 'expected_visible': ['dir-with-unversioned', + 'dir-with-unversioned/child', + 'unversioned', + ],}), + ('Ignored', + {'filter': (False, False, False, True), + 'expected_visible': ['ignored-dir-with-child', + 'ignored', + ],}), + ('Ignored+Unversioned', + {'filter': (False, False, True, True), + 'expected_visible': ['ignored-dir-with-child/child', + 'ignored-dir-with-child', + 'ignored', + 'dir-with-unversioned', + 'dir-with-unversioned/child', + 'unversioned', + ],}), + ) + + class TestGroupLargeDirs(TestCase): def test_no_group_small(self): @@ -300,3 +497,14 @@ u'b': set([u'b/1', u'b/2', u'b/3', u'b/4', u'b/c']), u'b/c': set([u'b/c/1', u'b/c/2', u'b/c/3', u'b/c/4'])}) + def test_bug_580798(self): + # Test for Bug #580798 + paths = frozenset(('a', + 'a/b1/c1', + 'a/b2/d1', 'a/b2/d2', 'a/b2/d3', 'a/b2/d4', + )) + self.assertEqual(group_large_dirs(paths), + {'': set(['a']), + 'a': set(['a/b1/c1', 'a/b2']), + 'a/b2': set(['a/b2/d1', 'a/b2/d2', 'a/b2/d3', 'a/b2/d4']), + }) diff -Nru qbzr-0.18.6/lib/trace.py qbzr-0.19/lib/trace.py --- qbzr-0.18.6/lib/trace.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/trace.py 2010-08-05 09:10:37.000000000 -0400 @@ -172,21 +172,10 @@ (name, a_plugin.path(), a_plugin.__version__)) - # PyQt is stupid and thinks QMessageBox.StandardButton and - # QDialogButtonBox.StandardButton are different, so we have to - # duplicate this :-( - if type == MAIN_LOAD_METHOD: - buttons = QtGui.QDialogButtonBox.Close - elif type == SUB_LOAD_METHOD: - buttons = QtGui.QDialogButtonBox.Ok - elif type == ITEM_OR_EVENT_METHOD: - buttons = QtGui.QDialogButtonBox.Close | \ - QtGui.QDialogButtonBox.Ignore - msg_box = ErrorReport(gettext("Error"), message, traceback_file.getvalue(), - buttons, + type, window) else: if type == MAIN_LOAD_METHOD: @@ -224,13 +213,31 @@ return error_type class ErrorReport(QtGui.QDialog): - def __init__(self, title, message, trace_back, buttons, + def __init__(self, title, message, trace_back, type=MAIN_LOAD_METHOD, parent=None): + QtGui.QDialog.__init__ (self, parent) - + + self.buttonbox = QtGui.QDialogButtonBox() + + # PyQt is stupid and thinks QMessageBox.StandardButton and + # QDialogButtonBox.StandardButton are different, so we have to + # duplicate this :-( + if type == MAIN_LOAD_METHOD or parent == None: + button = self.buttonbox.addButton(QtGui.QDialogButtonBox.Close) + button.setText(gettext("Close Application")) + elif type == SUB_LOAD_METHOD: + button = self.buttonbox.addButton(QtGui.QDialogButtonBox.Ok) + button.setText(gettext("Close Error Dialog")) + elif type == ITEM_OR_EVENT_METHOD: + button = self.buttonbox.addButton(QtGui.QDialogButtonBox.Close) + button.setText(gettext("Close Application")) + button = self.buttonbox.addButton(QtGui.QDialogButtonBox.Ignore) + button.setText(gettext("Ignore Error")) + label = QtGui.QLabel(message) label.setWordWrap(True) - label.setAlignment(QtCore.Qt.AlignTop|QtCore.Qt.AlignLeft) + label.setAlignment(QtCore.Qt.AlignVCenter|QtCore.Qt.AlignLeft) self.connect(label, QtCore.SIGNAL("linkActivated(QString)"), self.link_clicked) @@ -242,23 +249,25 @@ trace_back_label = QtGui.QTextEdit() trace_back_label.setPlainText (trace_back) trace_back_label.setReadOnly(True) - - self.buttonbox = QtGui.QDialogButtonBox(buttons) + self.connect(self.buttonbox, QtCore.SIGNAL("clicked (QAbstractButton *)"), self.clicked) - layout = QtGui.QGridLayout() - layout.addWidget(icon_label, 0, 0) - layout.addWidget(label, 0, 1) - layout.setColumnStretch(1,1) + vbox = QtGui.QVBoxLayout() - layout.addWidget(trace_back_label, 1, 0, 2, 0) - layout.setRowStretch(1,1) + hbox = QtGui.QHBoxLayout() + hbox.addWidget(icon_label) + hbox.addWidget(label, 10) + vbox.addLayout(hbox) - layout.addWidget(self.buttonbox, 3, 0, 2, 0) + vbox.addWidget(trace_back_label) + + hbox = QtGui.QHBoxLayout() + hbox.addWidget(self.buttonbox) + vbox.addLayout(hbox) - self.setLayout(layout) + self.setLayout(vbox) self.setWindowTitle(title) diff -Nru qbzr-0.18.6/lib/treewidget.py qbzr-0.19/lib/treewidget.py --- qbzr-0.18.6/lib/treewidget.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/treewidget.py 2010-08-05 09:10:37.000000000 -0400 @@ -18,9 +18,23 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os, sys +from PyQt4 import QtCore, QtGui + +from bzrlib.plugins.qbzr.lib.i18n import gettext + +from bzrlib.plugins.qbzr.lib.revtreeview import ( + RevisionTreeView, + RevNoItemDelegate, + ) +from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget +from bzrlib.lazy_import import lazy_import +from bzrlib.plugins.qbzr.lib.lazycachedrevloader import cached_revisions +from bzrlib.plugins.qbzr.lib.trace import report_exception, SUB_LOAD_METHOD + +lazy_import(globals(), ''' import posixpath # to use '/' path sep in path.join(). from time import (strftime, localtime) -from PyQt4 import QtCore, QtGui + from bzrlib import errors from bzrlib.workingtree import WorkingTree from bzrlib.revisiontree import RevisionTree @@ -29,19 +43,12 @@ from bzrlib.plugins.qbzr.lib.cat import QBzrCatWindow, QBzrViewWindow from bzrlib.plugins.qbzr.lib.annotate import AnnotateWindow -from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.log import LogWindow -from bzrlib.plugins.qbzr.lib.revtreeview import ( - RevisionTreeView, - RevNoItemDelegate, - ) -from bzrlib.plugins.qbzr.lib.lazycachedrevloader import cached_revisions from bzrlib.plugins.qbzr.lib.util import ( get_set_encoding, get_summary, get_apparent_author_name, ) -from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget from bzrlib.plugins.qbzr.lib.subprocess import SimpleSubProcessDialog from bzrlib.plugins.qbzr.lib.diff import ( show_diff, @@ -49,9 +56,8 @@ ExtDiffMenu, InternalWTDiffArgProvider, ) -from bzrlib.plugins.qbzr.lib.trace import report_exception, SUB_LOAD_METHOD - +''') def dict_set_add(dict, key, value): if key in dict: dict[key].add(value) @@ -63,7 +69,7 @@ # deep paths. all_paths_expanded = {'':('', 0, set([]))} - """Dict of all paths expaned, and thier depth, and a set of decendents + """Dict of all paths expaned, and their depth, and a set of decendents they contain. The key is the path @@ -105,8 +111,10 @@ while dir_path: dir_path, name = os.path.split(dir_path) ans_decendents = all_paths_expanded[dir_path][2] + old_len = len(ans_decendents) ans_decendents.difference_update(decendents) - ans_decendents.add(path) + if len(ans_decendents) < old_len: + ans_decendents.add(path) # directories included in the original paths container. for path, depth, decendents in paths_deep_first: @@ -387,6 +395,7 @@ self.branch = branch self.revno_map = None self.changes_mode = changes_mode + self.change_load_filter = change_load_filter self.emit(QtCore.SIGNAL("layoutAboutToBeChanged()")) @@ -419,8 +428,8 @@ is_ignored = self.tree.is_ignored(path) change = ChangeDesc(change+(is_ignored,)) - if (change_load_filter is not None and - not change_load_filter(change)): + if (self.change_load_filter is not None and + not self.change_load_filter(change)): continue item = InternalItem("", change.kind(), fileid) @@ -562,6 +571,11 @@ (None, kind), (None, executable), is_ignored)) + + if (self.change_load_filter is not None and + not self.change_load_filter(change)): + continue + yield ModelItemData(path, item=child, change=change) if (not isinstance(item, InternalItem) and @@ -585,6 +599,19 @@ for path in self.unver_by_parent[item_data.path]: yield self.inventory_data_by_path[path] + + _many_loaddirs_started = False + _many_loaddirs_should_start = False + def start_maybe_many_loaddirs(self): + self._many_loaddirs_should_start = True + + def end_maybe_many_loaddirs(self): + self._many_loaddirs_should_start = False + if self._many_loaddirs_started: + self._many_loaddirs_started = False + self.tree.unlock() + + def load_dir(self, dir_id): if dir_id>=len(self.inventory_data): return @@ -594,7 +621,11 @@ if not dir_item.item.kind=='directory': return - self.tree.lock_read() + if not self._many_loaddirs_started: + self.tree.lock_read() + if self._many_loaddirs_should_start: + self._many_loaddirs_started = True + try: dir_item.children_ids = [] children = sorted(self.get_children(dir_item), @@ -608,7 +639,8 @@ finally: self.endInsertRows(); finally: - self.tree.unlock() + if not self._many_loaddirs_started: + self.tree.unlock() def process_inventory(self, get_children, initial_checked_paths, load_dirs): self.get_children = get_children @@ -755,22 +787,24 @@ def setData(self, index, value, role): - def set_checked(item_data, checked): - old_checked = item_data.checked - item_data.checked = checked - if not old_checked == checked: - index = self.createIndex (item_data.row, self.NAME, item_data.id) - self.emit(QtCore.SIGNAL("dataChanged(QModelIndex, QModelIndex)"), - index,index) - if index.column() == self.NAME and role == QtCore.Qt.CheckStateRole: + + def set_checked(item_data, checked, emit=True): + old_checked = item_data.checked + item_data.checked = checked + return not old_checked == checked + value = value.toInt()[0] if index.internalId() >= len(self.inventory_data): return False item_data = self.inventory_data[index.internalId()] + first_index = self._index_from_id(item_data.id, self.NAME) set_checked(item_data, value) + # this is an array so that it is a poormans nonlocal + # http://www.python.org/dev/peps/pep-3104/ + last_item_data = [None] # Recursively set all children to checked. def set_child_checked_recurse(item_data): if (item_data.children_ids is None and @@ -793,6 +827,8 @@ (change, lookat_children) = self.is_item_in_select_all(child) + last_item_data[0] = child + if lookat_children: has_children_changed = set_child_checked_recurse(child) else: @@ -800,10 +836,21 @@ if (change or has_children_changed): have_changed_item = True - set_checked(child, value) + set_checked(child, value, False) return have_changed_item - set_child_checked_recurse(item_data) + self.start_maybe_many_loaddirs() + try: + set_child_checked_recurse(item_data) + finally: + self.end_maybe_many_loaddirs() + + if last_item_data[0]: + last_index = self._index_from_id(last_item_data[0].id, self.NAME) + else: + last_index = first_index + self.emit(QtCore.SIGNAL("dataChanged(QModelIndex, QModelIndex)"), + first_index,last_index) # Walk up the tree, and update every dir parent_data = item_data @@ -835,12 +882,17 @@ break if has_checked and has_unchecked: - set_checked(parent_data, QtCore.Qt.PartiallyChecked) + checked = QtCore.Qt.PartiallyChecked elif has_checked: - set_checked(parent_data, QtCore.Qt.Checked) + checked = QtCore.Qt.Checked else: - set_checked(parent_data, QtCore.Qt.Unchecked) - + checked = QtCore.Qt.Unchecked + + if set_checked(parent_data, checked): + index = self._index_from_id(parent_data.id, self.NAME) + self.emit(QtCore.SIGNAL("dataChanged(QModelIndex, QModelIndex)"), + index,index) + return True if index.column() == self.NAME and role == QtCore.Qt.EditRole: @@ -1137,12 +1189,16 @@ def invalidateFilter(self): self.filter_cache = {} - QtGui.QSortFilterProxyModel.invalidateFilter(self) + self.source_model.start_maybe_many_loaddirs() + try: + QtGui.QSortFilterProxyModel.invalidateFilter(self) + finally: + self.source_model.end_maybe_many_loaddirs() def setFilter(self, filter, value): self.filters[filter] = value # This is slow. It causes TreeModel.index, and TreeModel.data thousands - # of times. + # of times. self.invalidateFilter() def setFilters(self, filters): @@ -1156,8 +1212,8 @@ self.invalidateFilter() def filterAcceptsRow(self, source_row, source_parent): - if all(self.filters): - return True + #if all(self.filters): + # return True model = self.source_model parent_id = source_parent.internalId() @@ -1174,39 +1230,53 @@ if id in self.filter_cache: return self.filter_cache[id] else: - result = self.filter_id(id) + result = self.filter_id_recurse(id) self.filter_cache[id] = result return result - def filter_id(self, id): - (unchanged, changed, unversioned, ignored) = self.filters - - model = self.source_model - item_data = model.inventory_data[id] + def filter_id_recurse(self, id): + item_data = self.source_model.inventory_data[id] - if item_data.change is None and unchanged: return True - - is_versioned = item_data.item.file_id is not None - - if is_versioned and item_data.change is not None and changed: - return True - - if not is_versioned and unversioned: - is_ignored = item_data.change.is_ignored() - if not is_ignored: return True - if is_ignored and ignored: return True - if is_ignored and not ignored: return False + filter = self.filter_id(id, item_data) + if filter is not None: + return filter if item_data.item.kind == "directory": if item_data.children_ids is None: - model.load_dir(id) + self.source_model.load_dir(id) for child_id in item_data.children_ids: if self.filter_id_cached(child_id): return True - return False + def filter_id(self, id, item_data): + """Determines wether a item should be displayed. + Returns : + * True: Show the item + * False: Donot show the item + * None: Show the item if there are any children that are visible. + """ + + (unchanged, changed, unversioned, ignored) = self.filters + + if item_data.change is None and unchanged: return True + + is_versioned = item_data.item.file_id is not None + + if is_versioned and item_data.change is not None and changed: + return True + + if not is_versioned: + if unversioned or ignored: + is_ignored = item_data.change.is_ignored() + if not is_ignored and unversioned: return True + if is_ignored: return ignored + else: + return False + + return None + def on_revisions_loaded(self, revisions, last_call): self.source_model.on_revisions_loaded(revisions, last_call) @@ -1363,6 +1433,8 @@ if isinstance(tree, RevisionTree) and branch is None: raise AttributeError("A branch must be provided if the tree is a " "RevisionTree") + + self.revision_loading_disabled = isinstance(tree, WorkingTree) self.branch = branch self.changes_mode = changes_mode self.want_unversioned = want_unversioned @@ -1816,6 +1888,24 @@ show_diff(arg_provider, ext_diff=ext_diff, parent_window=self.window()) + + def unversioned_parents_paths(self, item, include_item=True): + paths = [] + first = True + while item.item.file_id is None: + if first: + if include_item: + paths.append(item.path) + first = False + else: + paths.append(item.path) + + if item.parent_id: + item = self.tree_model.inventory_data[item.parent_id] + else: + break + paths.reverse() + return paths @ui_current_widget def add(self): @@ -1824,9 +1914,9 @@ items = self.get_selection_items() # Only paths that are not versioned. - paths = [item.path - for item in items - if item.item.file_id is None] + paths = [] + for item in items: + paths.extend(self.unversioned_parents_paths(item)) if len(paths) == 0: return @@ -1847,7 +1937,7 @@ # Only paths that have changes. paths = [item.path for item in items - if item.change is not None and + if item.change is not None and item.item.file_id is not None] if len(paths) == 0: @@ -1931,6 +2021,10 @@ else: return try: + # add the new parent + self.tree.add(self.unversioned_parents_paths( + self.tree_model.inventory_data[new], False)) + self.tree.rename_one(old.path, new.path, after=True) except Exception: report_exception(type=SUB_LOAD_METHOD, window=self.window()) diff -Nru qbzr-0.18.6/lib/ui_run.py qbzr-0.19/lib/ui_run.py --- qbzr-0.18.6/lib/ui_run.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/ui_run.py 2010-08-05 09:10:37.000000000 -0400 @@ -2,8 +2,8 @@ # Form implementation generated from reading ui file 'ui/run.ui' # -# Created: Mon Dec 7 01:25:47 2009 -# by: PyQt4 UI code generator 4.6 +# Created: Fri Jan 22 18:18:46 2010 +# by: PyQt4 UI code generator 4.6.1 # # WARNING! All changes made in this file will be lost! @@ -22,72 +22,70 @@ self.splitter.setOpaqueResize(False) self.splitter.setChildrenCollapsible(False) self.splitter.setObjectName("splitter") - self.frame = QtGui.QFrame(self.splitter) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth()) - self.frame.setSizePolicy(sizePolicy) - self.frame.setFrameShape(QtGui.QFrame.StyledPanel) - self.frame.setFrameShadow(QtGui.QFrame.Raised) - self.frame.setLineWidth(0) - self.frame.setObjectName("frame") - self.frame_layout = QtGui.QVBoxLayout(self.frame) - self.frame_layout.setMargin(0) - self.frame_layout.setObjectName("frame_layout") + self.run_container = QtGui.QGroupBox(self.splitter) + self.run_container.setObjectName("run_container") + self.run_container_layout = QtGui.QVBoxLayout(self.run_container) + self.run_container_layout.setMargin(0) + self.run_container_layout.setObjectName("run_container_layout") self.wd_layout = QtGui.QHBoxLayout() self.wd_layout.setObjectName("wd_layout") - self.wd_label = QtGui.QLabel(self.frame) + self.wd_label = QtGui.QLabel(self.run_container) self.wd_label.setObjectName("wd_label") self.wd_layout.addWidget(self.wd_label) - self.wd_edit = QtGui.QLineEdit(self.frame) + self.wd_edit = QtGui.QLineEdit(self.run_container) self.wd_edit.setObjectName("wd_edit") self.wd_layout.addWidget(self.wd_edit) - self.browse_button = QtGui.QPushButton(self.frame) + self.browse_button = QtGui.QPushButton(self.run_container) self.browse_button.setObjectName("browse_button") self.wd_layout.addWidget(self.browse_button) - self.frame_layout.addLayout(self.wd_layout) + self.run_container_layout.addLayout(self.wd_layout) self.cmd_layout = QtGui.QGridLayout() self.cmd_layout.setObjectName("cmd_layout") - self.cat_label = QtGui.QLabel(self.frame) + self.cat_label = QtGui.QLabel(self.run_container) self.cat_label.setObjectName("cat_label") self.cmd_layout.addWidget(self.cat_label, 0, 0, 1, 1) - self.cat_combobox = QtGui.QComboBox(self.frame) + self.cat_combobox = QtGui.QComboBox(self.run_container) self.cat_combobox.setMinimumSize(QtCore.QSize(170, 0)) self.cat_combobox.setObjectName("cat_combobox") self.cmd_layout.addWidget(self.cat_combobox, 0, 1, 1, 1) - self.cmd_label = QtGui.QLabel(self.frame) + self.cmd_label = QtGui.QLabel(self.run_container) self.cmd_label.setObjectName("cmd_label") self.cmd_layout.addWidget(self.cmd_label, 1, 0, 1, 1) - self.cmd_combobox = QtGui.QComboBox(self.frame) + self.cmd_combobox = QtGui.QComboBox(self.run_container) self.cmd_combobox.setMinimumSize(QtCore.QSize(170, 0)) self.cmd_combobox.setEditable(True) self.cmd_combobox.setObjectName("cmd_combobox") self.cmd_layout.addWidget(self.cmd_combobox, 1, 1, 1, 1) - self.hidden_checkbox = QtGui.QCheckBox(self.frame) + self.hidden_checkbox = QtGui.QCheckBox(self.run_container) self.hidden_checkbox.setObjectName("hidden_checkbox") self.cmd_layout.addWidget(self.hidden_checkbox, 1, 2, 1, 1) - self.frame_layout.addLayout(self.cmd_layout) - self.opt_arg_label = QtGui.QLabel(self.frame) + self.run_container_layout.addLayout(self.cmd_layout) + self.opt_arg_label = QtGui.QLabel(self.run_container) self.opt_arg_label.setLineWidth(0) self.opt_arg_label.setObjectName("opt_arg_label") - self.frame_layout.addWidget(self.opt_arg_label) - self.opt_arg_edit = QtGui.QLineEdit(self.frame) + self.run_container_layout.addWidget(self.opt_arg_label) + self.opt_arg_edit = QtGui.QLineEdit(self.run_container) self.opt_arg_edit.setObjectName("opt_arg_edit") - self.frame_layout.addWidget(self.opt_arg_edit) + self.run_container_layout.addWidget(self.opt_arg_edit) self.opt_arg_btn_layout = QtGui.QHBoxLayout() self.opt_arg_btn_layout.setObjectName("opt_arg_btn_layout") - self.directory_button = QtGui.QPushButton(self.frame) + self.directory_button = QtGui.QPushButton(self.run_container) self.directory_button.setObjectName("directory_button") self.opt_arg_btn_layout.addWidget(self.directory_button) - self.filenames_button = QtGui.QPushButton(self.frame) + self.filenames_button = QtGui.QPushButton(self.run_container) self.filenames_button.setObjectName("filenames_button") self.opt_arg_btn_layout.addWidget(self.filenames_button) spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.opt_arg_btn_layout.addItem(spacerItem) - self.frame_layout.addLayout(self.opt_arg_btn_layout) - self.help_browser = QtGui.QTextBrowser(self.splitter) + self.run_container_layout.addLayout(self.opt_arg_btn_layout) + self.help_browser = QtGui.QTextBrowser(self.run_container) self.help_browser.setObjectName("help_browser") + self.run_container_layout.addWidget(self.help_browser) + self.subprocess_container = QtGui.QWidget(self.splitter) + self.subprocess_container.setObjectName("subprocess_container") + self.subprocess_container_layout = QtGui.QVBoxLayout(self.subprocess_container) + self.subprocess_container_layout.setMargin(0) + self.subprocess_container_layout.setObjectName("subprocess_container_layout") self.main_v_layout.addWidget(self.splitter) self.wd_label.setBuddy(self.wd_edit) self.cat_label.setBuddy(self.cmd_combobox) @@ -95,7 +93,7 @@ self.opt_arg_label.setBuddy(self.opt_arg_edit) self.retranslateUi(RunDialog) - QtCore.QObject.connect(RunDialog, QtCore.SIGNAL("disableUi(bool)"), self.frame.setDisabled) + QtCore.QObject.connect(RunDialog, QtCore.SIGNAL("disableUi(bool)"), self.run_container.setDisabled) QtCore.QMetaObject.connectSlotsByName(RunDialog) RunDialog.setTabOrder(self.wd_edit, self.browse_button) RunDialog.setTabOrder(self.browse_button, self.hidden_checkbox) @@ -107,6 +105,7 @@ def retranslateUi(self, RunDialog): RunDialog.setWindowTitle(gettext("Run bzr command")) + self.run_container.setTitle(gettext("Options")) self.wd_label.setText(gettext("&Working directory:")) self.browse_button.setText(gettext("&Browse...")) self.cat_label.setText(gettext("C&ategory:")) @@ -115,9 +114,4 @@ self.opt_arg_label.setText(gettext("&Options and arguments for command:")) self.directory_button.setText(gettext("Insert &directory...")) self.filenames_button.setText(gettext("Insert &filenames...")) - self.help_browser.setHtml(QtGui.QApplication.translate("RunDialog", "\n" -"\n" -"

", None, QtGui.QApplication.UnicodeUTF8)) diff -Nru qbzr-0.18.6/lib/unbind.py qbzr-0.19/lib/unbind.py --- qbzr-0.18.6/lib/unbind.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/unbind.py 2010-08-05 09:10:37.000000000 -0400 @@ -30,7 +30,7 @@ class QBzrUnbindDialog(SubProcessDialog): - def __init__(self, branch, ui_mode=None): + def __init__(self, branch, ui_mode=None, immediate=False): super(QBzrUnbindDialog, self).__init__( gettext("Unbind branch"), @@ -40,6 +40,7 @@ dialog = True, parent = None, hide_progress=False, + immediate = immediate ) self.branch = branch diff -Nru qbzr-0.18.6/lib/update.py qbzr-0.19/lib/update.py --- qbzr-0.18.6/lib/update.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/update.py 2010-08-05 09:10:37.000000000 -0400 @@ -27,7 +27,7 @@ class QBzrUpdateWindow(SimpleSubProcessDialog): - def __init__(self, tree, ui_mode=True, parent=None): + def __init__(self, tree, ui_mode=True, immediate=False, parent=None): self.tree = tree super(QBzrUpdateWindow, self).__init__( title=gettext("Update working tree"), @@ -38,4 +38,5 @@ default_size=(256, 256), ui_mode=ui_mode, parent=parent, + immediate=immediate, ) diff -Nru qbzr-0.18.6/lib/util.py qbzr-0.19/lib/util.py --- qbzr-0.18.6/lib/util.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/lib/util.py 2010-08-05 09:10:37.000000000 -0400 @@ -23,6 +23,7 @@ import sys import itertools + from PyQt4 import QtCore, QtGui from bzrlib.revision import Revision @@ -32,22 +33,28 @@ config_dir, ensure_config_dir_exists, ) -from bzrlib import ( - lazy_regex, - osutils, - urlutils, - ) -from bzrlib.util.configobj import configobj +from bzrlib import lazy_regex + from bzrlib.plugins.qbzr.lib import MS_WINDOWS -from bzrlib.plugins.qbzr.lib import trace + from bzrlib.plugins.qbzr.lib.i18n import gettext, N_ # pyflakes says this is not needed, but it is. import bzrlib.plugins.qbzr.lib.resources from bzrlib import errors + +from bzrlib.lazy_import import lazy_import +lazy_import(globals(), ''' +from bzrlib import ( + osutils, + urlutils, +) +from bzrlib.util.configobj import configobj +from bzrlib.plugins.qbzr.lib import trace from bzrlib.workingtree import WorkingTree +''') # standard buttons with translatable labels BTN_OK, BTN_CANCEL, BTN_CLOSE, BTN_HELP, BTN_REFRESH = range(5) @@ -370,6 +377,10 @@ self.windows = [] self.closing = False + def show(self): + QtGui.QMainWindow.show(self) + self.raise_() # Make sure it displays in the foreground + class QBzrDialog(QtGui.QDialog, _QBzrWindowBase): @@ -398,29 +409,23 @@ self.saveSize() QtGui.QDialog.reject(self) + def show(self): + QtGui.QMainWindow.show(self) + self.raise_() # Make sure it displays in the foreground + throber_movie = None class ThrobberWidget(QtGui.QWidget): - """A window that displays a simple throbber over its parent.""" + """A widget that indicates activity.""" def __init__(self, parent, timeout=500): QtGui.QWidget.__init__(self, parent) - self.create_ui() - self.num_show = 0 - - # create a timer that displays our window after the timeout. - #QtCore.QTimer.singleShot(timeout, self.show) - - def create_ui(self): - # a couple of widgets - layout = QtGui.QHBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - - self.spinner = QtGui.QLabel("", self) global throber_movie if not throber_movie: throber_movie = QtGui.QMovie(":/16x16/process-working.gif") throber_movie.start() + + self.spinner = QtGui.QLabel("", self) self.spinner.setMovie(throber_movie) self.message = QtGui.QLabel(gettext("Loading..."), self) @@ -429,11 +434,29 @@ #self.progress.hide() #self.progress.setMaximum(sys.maxint) self.transport = QtGui.QLabel("", self) + for widget in (self.spinner, + self.message, + #self.progress, + self.transport): + widget.hide() + + self.widgets = [] + self.set_layout() + self.num_show = 0 + + def set_layout(self): + layout = QtGui.QHBoxLayout(self) + layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.spinner) #layout.addWidget(self.progress) layout.addWidget(self.message, 1) layout.addWidget(self.transport) + + self.widgets.append(self.spinner) + #self.widgets.append(self.progress) + self.widgets.append(self.message) + self.widgets.append(self.transport) def hide(self): #if self.is_shown: @@ -442,12 +465,35 @@ if self.num_show <= 0: self.num_show = 0 QtGui.QWidget.hide(self) - + for widget in self.widgets: + widget.hide() + def show(self): #QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) # and show ourselves. - QtGui.QWidget.show(self) self.num_show += 1 + QtGui.QWidget.show(self) + for widget in self.widgets: + widget.show() + + +class ToolBarThrobberWidget(ThrobberWidget): + """A widget that indicates activity. Smaller than ThrobberWidget, designed + for use on a toolbar.""" + + def set_layout(self): + layout = QtGui.QHBoxLayout(self) + layout.setContentsMargins(0, 0, 0, 0) + + layout.addWidget(self.transport) + layout.addWidget(self.spinner) + #layout.addWidget(self.progress) + #layout.addWidget(self.message, 1) + + self.widgets.append(self.spinner) + #self.widgets.append(self.progress) + #self.widgets.append(self.message) + self.widgets.append(self.transport) # Helpers for directory pickers. @@ -640,17 +686,6 @@ return self.renamed or self.modified raise ValueError('unknown status: %r' % status) -def split_tokens_at_lines(tokens): - currentLine = [] - for ttype, value in tokens: - vsplit = value.splitlines(True) - for v in vsplit: - currentLine.append((ttype, v)) - if v[-1:] in ('\n','\r'): - yield currentLine - currentLine = [] - yield currentLine - # Some helpers for combo-boxes. Combos for different purposes (eg, push # vs pull) have quite different requirements for the combo: # * When pulling from a branch, if the branch is not related to the existing @@ -746,64 +781,6 @@ config.save() -have_pygments = True -try: - from pygments.styles import get_style_by_name -except ImportError: - have_pygments = False - -if have_pygments: - style = get_style_by_name("default") - -def format_for_ttype(ttype, format): - if have_pygments and ttype: - font = format.font() - - # If there is no style, use the parent type's style. - # It fixes bug 347333 - GaryvdM - while not style.styles_token(ttype) and ttype.parent: - ttype = ttype.parent - - tstyle = style.style_for_token(ttype) - if tstyle['color']: - if isinstance(format, QtGui.QPainter): - format.setPen (QtGui.QColor("#"+tstyle['color'])) - else: - format.setForeground (QtGui.QColor("#"+tstyle['color'])) - if tstyle['bold']: font.setWeight(QtGui.QFont.Bold) - if tstyle['italic']: font.setItalic (True) - # Can't get this not to affect line height. - #if tstyle['underline']: format.setFontUnderline(True) - if tstyle['bgcolor']: format.setBackground (QtGui.QColor("#"+tstyle['bgcolor'])) - # No way to set this for a QTextCharFormat - #if tstyle['border']: format. - return format - -class CachedTTypeFormater(object): - def __init__(self, base_format): - self.base_format = base_format - self._cache = {} - - def format(self, ttype): - if not have_pygments or not ttype: - return self.base_format - if ttype in self._cache: - format = self._cache[ttype] - else: - format = QtGui.QTextCharFormat(self.base_format) - self._cache[ttype] = format - - # If there is no style, use the parent type's style. - # It fixes bug 347333 - GaryvdM - while not style.styles_token(ttype) and ttype.parent: - ttype = ttype.parent - self._cache[ttype] = format - - format_for_ttype(ttype, format) - - return format - - def url_for_display(url): """Return human-readable URL or local path for file:/// URLs. Wrapper around bzrlib.urlutils.unescape_for_display @@ -1004,3 +981,130 @@ shlex_split_unicode = _shlex_split_unicode_windows else: shlex_split_unicode = _shlex_split_unicode_linux + +def get_icon(name): + # TODO: Load multiple sizes + # TODO: Try load from system theme + return QtGui.QIcon(":/22x22/%s.png" % name) + + +class FindToolbar(QtGui.QToolBar): + + def __init__(self, window, text_edit, show_action): + QtGui.QToolBar.__init__(self, gettext("Find"), window) + self.text_edit = text_edit + if 0: self.text_edit = QtGui.QTextEdit() + self.show_action = show_action + + self.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) + self.setMovable (False) + + find_label = QtGui.QLabel(gettext("Find: "), self) + self.addWidget(find_label) + + self.find_text = QtGui.QLineEdit(self) + self.addWidget(self.find_text) + find_label.setBuddy(self.find_text) + + prev = self.addAction(get_icon("go-previous"), gettext("Previous")) + prev.setShortcut(QtGui.QKeySequence.FindPrevious) + + next = self.addAction(get_icon("go-next"), gettext("Next")) + next.setShortcut(QtGui.QKeySequence.FindNext) + + self.case_sensitive = QtGui.QCheckBox(gettext("Case sensitive"), self) + self.addWidget(self.case_sensitive) + self.whole_words = QtGui.QCheckBox(gettext("Whole words"), self) + self.addWidget(self.whole_words) + + close_find = QtGui.QAction(self) + close_find.setIcon(self.style().standardIcon( + QtGui.QStyle.SP_DialogCloseButton)) + self.addAction(close_find) + close_find.setShortcut((QtCore.Qt.Key_Escape)) + close_find.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) + close_find.setStatusTip(gettext("Close find")) + self.connect(self.show_action, + QtCore.SIGNAL("toggled (bool)"), + self.show_action_toggle) + self.connect(close_find, + QtCore.SIGNAL("triggered(bool)"), + self.close_triggered) + self.connect(self.find_text, + QtCore.SIGNAL("textChanged(QString)"), + self.find_text_changed) + self.connect(next, + QtCore.SIGNAL("triggered(bool)"), + self.find_next) + self.connect(prev, + QtCore.SIGNAL("triggered(bool)"), + self.find_prev) + self.connect(self.case_sensitive, + QtCore.SIGNAL("stateChanged(int)"), + self.find_text_changed) + self.connect(self.whole_words, + QtCore.SIGNAL("stateChanged(int)"), + self.find_text_changed) + self.connect(self.find_text, + QtCore.SIGNAL("returnPressed()"), + self.find_next) + + def show_action_toggle(self, state): + self.setVisible(state) + if state: + self.find_text.setFocus() + else: + self.find_text.setText('') + + def close_triggered(self, state): + self.show_action.setChecked(False) + + def find_text_changed(self, text): + self.find_avoid_moving() + + def find_get_flags(self): + flags = QtGui.QTextDocument.FindFlags() + if self.case_sensitive.isChecked(): + flags = flags | QtGui.QTextDocument.FindCaseSensitively + if self.whole_words.isChecked(): + flags = flags | QtGui.QTextDocument.FindWholeWords + return flags + + def find_avoid_moving(self): + self.find(self.text_edit.textCursor().selectionStart(), 0, + self.find_get_flags()) + + def find_next(self, state): + self.find(self.text_edit.textCursor().selectionEnd(), 0, + self.find_get_flags()) + + def find_prev(self, state): + self.find(self.text_edit.textCursor().selectionStart(), + self.text_edit.document().characterCount(), + self.find_get_flags() | QtGui.QTextDocument.FindBackward) + + def find(self, from_pos, restart_pos, flags): + doc = self.text_edit.document() + text = self.find_text.text() + cursor = doc.find(text, from_pos, flags) + if cursor.isNull(): + # try again from the restart pos + cursor = doc.find(text, restart_pos, flags) + if cursor.isNull(): + cursor = self.text_edit.textCursor() + cursor.setPosition(cursor.selectionStart()) + self.text_edit.setTextCursor(cursor) + # Maybe make find_text background red like Firefox? + else: + self.text_edit.setTextCursor(cursor) + + +class InfoWidget(QtGui.QFrame): + def __init__(self, parent=None): + QtGui.QFrame.__init__(self, parent) + self.setFrameShape(QtGui.QFrame.StyledPanel) + + self.setAutoFillBackground(True) + self.setBackgroundRole(QtGui.QPalette.ToolTipBase) + self.setForegroundRole(QtGui.QPalette.ToolTipText) + diff -Nru qbzr-0.18.6/NEWS.txt qbzr-0.19/NEWS.txt --- qbzr-0.18.6/NEWS.txt 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/NEWS.txt 2010-08-05 09:10:37.000000000 -0400 @@ -1,8 +1,106 @@ +0.19 "Shepherd's Tree, aka Boscia albitrunca" - 2010/08/05 +---------------------------------------------------------- +Bazaar 2.2 companion release. Suitable for bzr 2.2 and bzr 2.1. + +Changes since 0.19b2 release: + + * qlog: + * Context menu actions for tag, and revert will now show a branch menu if + more than one branch is open. (Craig Hewetson, Gary van der Merwe) + * Add context menu actions for update, cherry-pick, and reverse cherry-pick. + (Bug #258360, Gary van der Merwe) + * Language of GUI can be set in DEFAULT section of bazaar.conf + as ``language = code``. Language codes are the same as for LANG environment + variable. Environment variable LANGUAGE still preferred over settings + in bazaar.conf. (Alexander Belchenko) + * Added Thai translation. + + +0.19 Beta 2 "Pomegranate" - 2010/07/01 +-------------------------------------- + * Allow finding locale in system location on Linux + (Bug #542429, Toshio Kuratomi). + * Provide better text on Close and Ignore buttons when exceptions raised. + (Bug #486946, Luis Arias) + * Fix bug where Mac OS X windows start in background. (Bug #417162, + Luis Arias) + * Fix bug in treewidget where folders are repeated. + (Bug #580798, Iwata, Gary van der Merwe) + * qsubprocess: when sending error object over the stdout we should use + unicode-escape encoding for the possible unicode/multiline strings. + (Bug #570564, Alexander Belchenko) + * qinit: set default value for repository format in the combobox. + (Bug #531795, Gordon Tyler) + * qcommit: + * Hide completer's popup when a IME event occurs. (Bug #573652, INADA Naoki) + * If a branch path is passed to the command line, select the files in + the branch. (Gary van der Merwe) + * qdiff: Use the new bzrlib.diff.get_trees_and_branches_to_diff_locked api. + (Gary van der Merwe) + * qlog: + * Handle ghost revisions better. Ghost can now be seen in the graph, + and don't cause search to crash. (Bug #57042, Gary van der Merwe) + * Show better labels for branch tips. Show a tooltip with the full branch + url. (Bug #585309, Gary van der Merwe) + * Fix a bug where branch labels don't show if the have the same tips. + (Bug # 485236, Gary van der Merwe) + * qlog . in a sub dir now filters to only show the sub dir. + (Bug #517592, Gary van der Merwe) + * Fix crash we viewing file history from qbrowse/bzr explorer. + (Bug #585280, Gary van der Merwe) + * qupdate, qunbind, qgetupdates: new --execute option will run these + commands immediately without waiting for the user to click on the Ok button + (Luis Arias) + * qannotate: + * Add find and goto line interfaces. The style for this interface will be + used for other browsing windows in the future. + (Bug #215256, Gary van der Merwe) + * Double clicking or pressing enter for a revision now changes the annotated + revision. Please use the context menu to get to the diff. + (Bug #404276, Gary van der Merwe) + * When changinging the annotated revision, the scroll position, and selection + are maintained. (Bug #404288, Gary van der Merwe) + + +0.19 Beta 1 "Monkey-puzzle, aka Araucaria araucana" - 2010/03/29 +---------------------------------------------------------------- + * Added Hungarian translation. + * qcommit: Give the user the option to update the branch if it is not up to + date. (Bug #439920, Gary van der Merwe) + * qpush, qmerge, etc.: When there are uncommit changes in the working tree, + give the user the option to commit, or revert. (Gary van der Merwe) + * qlog: Improve performance by using KnownGraph. (John Arbash Meinel, + Gary van der Merwe) + * TreeWidget dialogs (qcommit, qadd, qrevert, qbrowse): + Performance improvements for select all, and changeing filters. + (Bug #513105, Bug #476641, Gary van der Merwe) + * Improve startup performance by using lazy imports. (Gary van der Merwe) + +Note: qbzr now requires bzr 2.1. + + +0.18.7 "Juniper" - not released yet +----------------------------------- +Maintenance release. + + * Don't break when bzr-search tries to import bzr-svn, + and bzr-svn is incompatible with bzrlib. + (Bug #546843, Gary van der Merwe) + * Treewidget: Fix bug in treewidget where folders are repeated. + (Bug #580798, Gary van der Merwe) + * Added Thai translation. + + 0.18.6 - 2010-05-04 ------------------- Maintenance release. * qlog: Fix a bug with search. (Bug #575338, Gary van der Merwe) + * qlog: Fix a bug were qlog crashes when bzr-svn is incompatible with bzrlib. + (Bug #546843, Gary van der Merwe) + * Fix bug in treewidget where folders are repeated. + (Bug #580798, Iwata, Gary van der Merwe) + 0.18.5 "Silver terminalia" - 2010-04-02 --------------------------------------- @@ -339,15 +437,18 @@ * Now working for bound branches (aka heavyweight checkouts). (#422649, Craig Hewetson) + 0.14.7 - Under Development ---------------------------- Bugfixes and backported bugfixes. - * Change dialogs to have normal window flags. This fixes a bug where on - some window managers (metacity, Mac OSX) windows opened from a dialog - would be behind the dialog. (Bug #421039, Gary van der Merwe) - * Treewidget: Fix a crash when refreshing tree with a checked item that has a - parent that is ungrouped. (Bug #512006, Gary van der Merwe) + * Change dialogs to have normal window flags. This fixes a bug where on + some window managers (metacity, Mac OSX) windows opened from a dialog + would be behind the dialog. (Bug #421039, Gary van der Merwe) + * Fix test failures with new versions of bzr. (Bug #433843, Gary van der Merwe) + * qlog: Fix a bug were qlog crashes when bzr-svn is incompatible with bzrlib. + (Bug #546843, Gary van der Merwe) + 0.14.6 "Spruce" - 2010-01-18 ---------------------------- @@ -907,7 +1008,7 @@ * Show changes in x bits. (#153817) * qlog: * Always show location even in the case it runs as ``bzr qlog`` - * Add a revision graph that can be expanded and colapsed. (#242752) + * Add a revision graph that can be expanded and collapsed. (#242752) * qdiff, qcat, qannotate: Font sizes are no longer set a a small 8pt. They now use the default widget font size. (#240859) diff -Nru qbzr-0.18.6/po/qbzr-ar.po qbzr-0.19/po/qbzr-ar.po --- qbzr-0.18.6/po/qbzr-ar.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-ar.po 2010-08-05 09:10:37.000000000 -0400 @@ -8,7 +8,7 @@ "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 11:33+0000\n" +"PO-Revision-Date: 2010-01-16 13:36+0000\n" "Last-Translator: Ali Sabil \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" @@ -16,7 +16,7 @@ "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= " "3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 diff -Nru qbzr-0.18.6/po/qbzr-cs.po qbzr-0.19/po/qbzr-cs.po --- qbzr-0.18.6/po/qbzr-cs.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-cs.po 2010-08-05 09:10:37.000000000 -0400 @@ -8,14 +8,14 @@ "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 11:18+0000\n" -"Last-Translator: Alexander Belchenko \n" +"PO-Revision-Date: 2009-10-23 12:17+0000\n" +"Last-Translator: Kuvaly [LCT] \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 diff -Nru qbzr-0.18.6/po/qbzr-da.po qbzr-0.19/po/qbzr-da.po --- qbzr-0.18.6/po/qbzr-da.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-da.po 2010-08-05 09:10:37.000000000 -0400 @@ -8,14 +8,14 @@ "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 11:27+0000\n" -"Last-Translator: Alexander Belchenko \n" +"PO-Revision-Date: 2009-12-06 12:51+0000\n" +"Last-Translator: nanker \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 diff -Nru qbzr-0.18.6/po/qbzr-de.po qbzr-0.19/po/qbzr-de.po --- qbzr-0.18.6/po/qbzr-de.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-de.po 2010-08-05 09:10:37.000000000 -0400 @@ -8,14 +8,14 @@ "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 11:30+0000\n" -"Last-Translator: Alexander Belchenko \n" +"PO-Revision-Date: 2010-06-03 20:25+0000\n" +"Last-Translator: Eduard Gotwig \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 @@ -58,7 +58,7 @@ #: lib\bind.py:54 msgid "Bind" -msgstr "Bindung" +msgstr "Binden" #: lib\bind.py:56 msgid "Branch location:" @@ -80,7 +80,7 @@ #: lib\bind.py:109 lib\switch.py:153 lib\tag.py:190 msgid "Select branch location" -msgstr "Wähle Ort des Astes" +msgstr "Wähle Ort des Zweigs" #: lib\bind.py:120 msgid "Master branch location not specified." @@ -114,7 +114,7 @@ #: lib\commit.py:240 lib\ui_branch.py:65 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" -msgstr "Ast" +msgstr "Zweig" #: lib\commit.py:252 msgid "&Local commit" @@ -150,7 +150,7 @@ #: lib\commit.py:316 msgid "Set the IDs of bugs fixed by this commit" -msgstr "Setze die IDs der Bugs die mit diesem Commit geflickt werden" +msgstr "Setze die IDs der Bugs, die mit diesem Commit behoben wurden" #: lib\commit.py:319 msgid "" @@ -316,6 +316,7 @@ #: lib\config.py:160 msgid "Show inter-group inserts and deletes in green and red" msgstr "" +"Zeige Einfügungen und Entfernungen innherhalb von Gruppen in Grün und Rot" #: lib\config.py:162 msgid "External Diff Apps:" @@ -367,7 +368,7 @@ #: lib\config.py:586 msgid "Select editor executable" -msgstr "" +msgstr "Wählen Sie eine Editor Ausführungsdatei" #: lib\conflicts.py:39 lib\conflicts.py:159 lib\conflicts.py:176 #: lib\conflicts.py:183 @@ -393,6 +394,12 @@ "external_merge = kdiff3 --output %r %b %t %o\n" "%r is output, %b is .BASE, %t is .THIS and %o is .OTHER file." msgstr "" +"Das Verschmelzungswerkzeug befindet sich konfiguriert in qconfig unter " +"Verschmelzung' Datei.\n" +"Es verfolgt die Konvention in der Bzr Erweiterung: extmerge\n" +"external_merge = kdiff3 --output %r %b %t %o\n" +"%r ist die Ausgabe, %b ist die .BASIS, %t ist .DIESE und %o ist die .ANDERE " +"Datei." #: lib\conflicts.py:91 msgid "&Launch..." @@ -400,7 +407,7 @@ #: lib\conflicts.py:97 msgid "M&erge tool:" -msgstr "" +msgstr "V&erschmelzungs-Werkzeug:" #: lib\conflicts.py:112 msgid "Auto-resolve" @@ -408,11 +415,11 @@ #: lib\conflicts.py:141 lib\treewidget.py:1598 msgid "&Merge conflict" -msgstr "" +msgstr "&Verschmelzungskonflikt" #: lib\conflicts.py:147 msgid "Mark as &resolved" -msgstr "" +msgstr "Markiere als &gelöst" #: lib\conflicts.py:177 #, python-format @@ -428,7 +435,7 @@ #: lib\conflicts.py:240 #, python-format msgid "Error while running merge tool (code %d)" -msgstr "" +msgstr "Fehler während der Ausführung vom Verschmelzungswerkzeug (code %d)" #: lib\conflicts.py:241 lib\conflicts.py:305 lib\tag.py:204 lib\trace.py:186 #: lib\trace.py:200 lib\tree_branch.py:95 lib\util.py:949 lib\util.py:959 @@ -446,6 +453,9 @@ "Missing the flag: %(flags)s. This must be fixed in qconfig under the Merge " "tab." msgstr "" +"The extmerge definition: '%(tool)s' is invalid.\n" +"Missing the flag: %(flags)s. This must be fixed in qconfig under the Merge " +"tab." #: lib\conflicts.py:312 #, python-format @@ -480,7 +490,7 @@ #: lib\conflicts.py:333 msgid "parent loop" -msgstr "" +msgstr "Eltern-Schleife" #: lib\conflicts.py:334 msgid "unversioned parent" @@ -488,15 +498,15 @@ #: lib\conflicts.py:335 msgid "missing parent" -msgstr "" +msgstr "fehlender Parent" #: lib\conflicts.py:336 msgid "deleting parent" -msgstr "" +msgstr "lösche Parent" #: lib\conflicts.py:337 msgid "non-directory parent" -msgstr "" +msgstr "kein-Ordner parent" #: lib\diff.py:80 lib\treewidget.py:1593 msgid "Show &differences" @@ -569,11 +579,11 @@ #: lib\diffwindow.py:163 msgid "Left side encoding:" -msgstr "" +msgstr "Linke-Seite Verschlüsselung" #: lib\diffwindow.py:171 msgid "Right side encoding:" -msgstr "" +msgstr "Rechte-Seite Verschlüsselung" #: lib\diffwindow.py:175 msgid "Complete" @@ -630,12 +640,12 @@ #: lib\encoding_selector.py:114 msgid "Wrong encoding" -msgstr "" +msgstr "Falsche Verschlüsselung" #: lib\encoding_selector.py:115 #, python-format msgid "Encoding \"%s\" is invalid or not supported." -msgstr "" +msgstr "Verschlüsselung \"%s\" ist ungültig oder wird nicht unterstützt." #: lib\export.py:61 lib\export.py:80 msgid "Export" @@ -762,11 +772,11 @@ #: lib\log.py:151 msgid "Bugs" -msgstr "" +msgstr "Fehler" #: lib\log.py:245 msgid "Messages and File text (indexed)" -msgstr "" +msgstr "Nachrichten und Datei-Text (indexiert)" #: lib\log.py:418 lib\logwidget.py:132 msgid "Show &differences..." @@ -799,7 +809,7 @@ #: lib\logwidget.py:112 msgid "Show all &differences" -msgstr "Zeige alle Unterschie&de" +msgstr "Zeige alle &Unterschiede" #: lib\logwidget.py:118 msgid "Show file &differences..." @@ -807,7 +817,7 @@ #: lib\logwidget.py:122 msgid "Show all &differences..." -msgstr "Zeige Unterschie&de in Datei" +msgstr "Zeige alle &Unterschiede..." #: lib\logwidget.py:140 msgid "Show &tree..." @@ -815,7 +825,7 @@ #: lib\logwidget.py:142 msgid "Tag &revision..." -msgstr "" +msgstr "Tag &Revision..." #: lib\main.py:120 msgid "Computer" @@ -851,7 +861,7 @@ #: lib\main.py:285 msgid "&Push" -msgstr "" +msgstr "&Drücken" #: lib\main.py:286 msgid "Turn this branch into a mirror of another branch" @@ -859,7 +869,7 @@ #: lib\main.py:290 msgid "Pu&ll" -msgstr "" +msgstr "&Holen" #: lib\main.py:291 msgid "Update a mirror of this branch" @@ -1005,7 +1015,7 @@ #: lib\revert.py:65 msgid "Select changes to revert" -msgstr "" +msgstr "Wähle Änderungen die rückgängig gemacht werden sollen" #: lib\revert.py:83 msgid "Do not save backups of reverted files" @@ -1035,7 +1045,7 @@ #: lib\revisionmessagebrowser.py:201 msgid "Uncommited Working Tree Changes" -msgstr "" +msgstr "Ungesicherte Änderungen am Arbeitsbaum" #: lib\revisionmessagebrowser.py:236 msgid "Date:" @@ -1097,11 +1107,11 @@ #: lib\send.py:53 msgid "Submit Branch:" -msgstr "" +msgstr "Zu versendenden Zweig:" #: lib\send.py:77 msgid "Public Branch:" -msgstr "" +msgstr "Öffentlicher Zweig:" #: lib\send.py:99 msgid "Remember these locations as defaults" @@ -1117,7 +1127,7 @@ #: lib\send.py:112 msgid "Action" -msgstr "" +msgstr "Aktion" #: lib\send.py:122 msgid "Address:" @@ -1190,19 +1200,19 @@ #: lib\switch.py:64 msgid "Heavyweight checkout:" -msgstr "" +msgstr "Schwergewichtiger Checkout:" #: lib\switch.py:68 msgid "Lightweight checkout:" -msgstr "" +msgstr "Leichtgewichtiger Checkout" #: lib\switch.py:75 msgid "Checkout of branch:" -msgstr "" +msgstr "Checkout des Zweiges:" #: lib\switch.py:88 msgid "Switch to branch:" -msgstr "" +msgstr "Wechseln zum Zweig:" #: lib\switch.py:112 msgid "Create Branch before switching" @@ -1214,7 +1224,7 @@ #: lib\tag.py:137 msgid "You should specify tag name" -msgstr "" +msgstr "Sie sollten einen Tag-Namen angeben" #: lib\tag.py:143 #, python-format @@ -1222,6 +1232,8 @@ "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" +"Der Tag \"%s\" existiert bereits.\n" +"Soll der existierende Tag verschoben werden?" #: lib\tag.py:146 msgid "&Move" @@ -1237,6 +1249,8 @@ "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" +"Der Tag \"%s\" existiert noch nicht.\n" +"Soll ein neuer Tag erzeugt werden?" #: lib\tag.py:159 msgid "Cre&ate" @@ -1245,7 +1259,7 @@ #: lib\tag.py:168 #, python-format msgid "Tag \"%s\" does not exists" -msgstr "" +msgstr "Der Tag \"%s\" extistiert nicht" #: lib\tag.py:205 #, python-format @@ -1253,6 +1267,8 @@ "Not a branch:\n" "%s" msgstr "" +"Kein Zweig:\n" +"%s" #: lib\treewidget.py:312 msgid "ignored" @@ -1292,7 +1308,7 @@ #: lib\treewidget.py:1197 msgid "Unversioned" -msgstr "" +msgstr "Nicht versioniert" #: lib\treewidget.py:1198 msgid "Ignored" @@ -1304,11 +1320,11 @@ #: lib\treewidget.py:1577 msgid "&View file" -msgstr "" +msgstr "Datei &anzeigen" #: lib\treewidget.py:1580 msgid "Show &annotate" -msgstr "" +msgstr "Zeige &Anmerkungen" #: lib\treewidget.py:1583 msgid "Show &log" @@ -1363,7 +1379,7 @@ #: lib\tree_branch.py:91 lib\util.py:950 #, python-format msgid "Not a branch \"%s\"" -msgstr "" +msgstr "Kein Zweig \"%s\"" #: lib\tree_branch.py:93 lib\util.py:960 #, python-format @@ -1402,7 +1418,7 @@ #: lib\ui_info.py:150 msgid "Push branch:" -msgstr "" +msgstr "Zweig hochladen:" #: lib\ui_info.py:152 msgid "Submit branch:" @@ -1414,7 +1430,7 @@ #: lib\ui_info.py:156 msgid "&Related Branches" -msgstr "Verwandte Äste" +msgstr "&Verwandte Zweige" #: lib\ui_info.py:157 msgid "Working tree format:" @@ -1474,15 +1490,15 @@ #: lib\ui_merge.py:67 lib\ui_pull.py:65 lib\ui_push.py:66 msgid "Remember this location as a default" -msgstr "" +msgstr "Diesen Ort als Standard merken" #: lib\ui_merge.py:68 msgid "Merge even if the working tree has uncommitted changes" -msgstr "" +msgstr "Zusammenführen auch wenn Arbeitsbaum ungesicherte Änderungen hat" #: lib\ui_merge.py:69 msgid "Merge uncommitted changes instead of committed ones" -msgstr "" +msgstr "Zusammenführen von ungesicherten Änderungen anstatt der gesicherten" #: lib\ui_new_tree.py:129 msgid "Create a new Bazaar Working Tree" @@ -1493,6 +1509,8 @@ "Branch source (enter a URL or select a local directory with an existing " "branch)" msgstr "" +"Quelle des Zweigs (eine Adresse eingeben oder einen lokalen Ordner mit " +"existierendem Zweig wählen)" #: lib\ui_new_tree.py:133 msgid "Local directory where the working tree will be created" @@ -1516,7 +1534,7 @@ #: lib\ui_new_tree.py:151 msgid "Create a stacked branch referring to the source branch" -msgstr "" +msgstr "Erzeuge einen gestapelten Zweig, basierend auf dem Quell-Zweig" #: lib\ui_new_tree.py:152 msgid "Click a link for more information about checkouts and branches." @@ -1551,7 +1569,7 @@ #: lib\ui_run.py:109 msgid "Run bzr command" -msgstr "" +msgstr "bzr Kommando ausführen" #: lib\ui_run.py:110 msgid "&Working directory:" @@ -1563,27 +1581,27 @@ #: lib\ui_run.py:113 msgid "&Command:" -msgstr "" +msgstr "&Befehl:" #: lib\ui_run.py:114 msgid "&Show hidden commands" -msgstr "" +msgstr "Zeige ver&steckte Befehle" #: lib\ui_run.py:115 msgid "&Options and arguments for command:" -msgstr "" +msgstr "&Optionen und Argumente für Kommando:" #: lib\ui_run.py:116 msgid "Insert &directory..." -msgstr "" +msgstr "Or&dner einfügen..." #: lib\ui_run.py:117 msgid "Insert &filenames..." -msgstr "" +msgstr "Dateinamen ein&fügen..." #: lib\ui_sysinfo.py:113 msgid "Bazaar Library" -msgstr "" +msgstr "Bazaar Bibliothek" #: lib\ui_sysinfo.py:114 lib\ui_sysinfo.py:124 msgid "Version:" @@ -1599,7 +1617,7 @@ #: lib\ui_sysinfo.py:117 msgid "(bzr-lib-path)" -msgstr "" +msgstr "(bzr-lib-path)" #: lib\ui_sysinfo.py:118 msgid "Bazaar Configuration" @@ -1611,7 +1629,7 @@ #: lib\ui_sysinfo.py:120 msgid "(bzr-config-dir)" -msgstr "" +msgstr "(bzr-config-dir)" #: lib\ui_sysinfo.py:121 msgid "Log File:" @@ -1619,19 +1637,19 @@ #: lib\ui_sysinfo.py:122 msgid "(bzr-log-file)" -msgstr "" +msgstr "(bzr-log-file)" #: lib\ui_sysinfo.py:123 msgid "Python Interpreter" -msgstr "" +msgstr "Python Interpreter" #: lib\ui_sysinfo.py:125 msgid "(python-version)" -msgstr "" +msgstr "(Python-Version)" #: lib\ui_sysinfo.py:127 msgid "(python-file)" -msgstr "" +msgstr "(Python-file)" #: lib\ui_sysinfo.py:128 msgid "Library:" @@ -1639,31 +1657,31 @@ #: lib\ui_sysinfo.py:129 msgid "(python-lib-dir)" -msgstr "" +msgstr "(Python-Lib-Verzeichnis)" #: lib\ui_tag.py:88 msgid "Edit tag" -msgstr "" +msgstr "Tag bearbeiten" #: lib\ui_tag.py:91 msgid "Tag" -msgstr "" +msgstr "Tag" #: lib\ui_tag.py:92 msgid "&Action:" -msgstr "" +msgstr "&Aktion" #: lib\ui_tag.py:93 msgid "Create new tag" -msgstr "" +msgstr "Neuen Tag erstellen" #: lib\ui_tag.py:94 msgid "Move existing tag" -msgstr "" +msgstr "Existierenden Tag verschieben" #: lib\ui_tag.py:95 msgid "Delete existing tag" -msgstr "" +msgstr "Existierenden Tag löschen" #: lib\ui_tag.py:96 msgid "&Tag name:" @@ -1690,7 +1708,7 @@ #: lib\ui_update_branch.py:86 msgid "Pull most recent changes from:" -msgstr "" +msgstr "Hohle neueste Änderungen von:" #: lib\ui_update_branch.py:87 msgid "Remember this as the new parent branch" @@ -1702,7 +1720,7 @@ #: lib\ui_update_branch.py:90 msgid "Update working tree to the latest changes in the branch" -msgstr "" +msgstr "Arbeitsbaum auf die neusten Änderungen im Zweig aufdatieren" #: lib\ui_update_checkout.py:74 msgid "Update Checkout" @@ -1715,23 +1733,23 @@ #: lib\ui_update_checkout.py:77 msgid "Update the working tree from the bound branch" -msgstr "" +msgstr "Arebeitsbaum vom gebundenen Zweig aufdatieren" #: lib\ui_update_checkout.py:78 msgid "Pull a different branch" -msgstr "" +msgstr "Hole einen anderen Zweig" #: lib\unbind.py:36 msgid "Unbind branch" -msgstr "" +msgstr "Löse Zweig" #: lib\unbind.py:46 msgid "Unbind" -msgstr "" +msgstr "Lösen" #: lib\unbind.py:54 msgid "Bound to:" -msgstr "" +msgstr "Gebunden an:" #: lib\uncommit.py:40 lib\uncommit.py:124 msgid "Uncommit" @@ -1759,7 +1777,7 @@ #: lib\update.py:33 msgid "Update working tree" -msgstr "" +msgstr "Arbeitsbaum aufdatieren" #: lib\update.py:34 #, python-format @@ -1792,4 +1810,35 @@ #: lib\util.py:912 lib\util.py:913 lib\util.py:916 msgid "(no message)" -msgstr "" +msgstr "(keine Meldung)" + +#~ msgid "Extension" +#~ msgstr "Erweiterung" + +#~ msgid "Show log..." +#~ msgstr "Zeige Log..." + +#~ msgid "&Revert..." +#~ msgstr "&Rückgängig..." + +#~ msgid "modified (x-bit)" +#~ msgstr "modifiziert (x-bit)" + +#, python-format +#~ msgid "Revert %s to latest revision." +#~ msgstr "Setze %s zur letzten Revision zurück" + +#~ msgid "Internal Error" +#~ msgstr "Interner Fehler" + +#~ msgid "Stopped" +#~ msgstr "Angehalten" + +#~ msgid "Local location:" +#~ msgstr "Lokaler Ort:" + +#~ msgid "Public branch location:" +#~ msgstr "Öffentlicher Ort des Astes" + +#~ msgid "&Location" +#~ msgstr "Ort" diff -Nru qbzr-0.18.6/po/qbzr-en_GB.po qbzr-0.19/po/qbzr-en_GB.po --- qbzr-0.18.6/po/qbzr-en_GB.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-en_GB.po 2010-08-05 09:10:37.000000000 -0400 @@ -8,14 +8,14 @@ "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 11:37+0000\n" -"Last-Translator: Alexander Belchenko \n" +"PO-Revision-Date: 2010-01-29 10:13+0000\n" +"Last-Translator: Dr Al \n" "Language-Team: English (United Kingdom) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 diff -Nru qbzr-0.18.6/po/qbzr-en.po qbzr-0.19/po/qbzr-en.po --- qbzr-0.18.6/po/qbzr-en.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-en.po 2010-08-05 09:10:37.000000000 -0400 @@ -10,7 +10,7 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 diff -Nru qbzr-0.18.6/po/qbzr-es.po qbzr-0.19/po/qbzr-es.po --- qbzr-0.18.6/po/qbzr-es.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-es.po 2010-08-05 09:10:37.000000000 -0400 @@ -8,14 +8,14 @@ "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 11:12+0000\n" +"PO-Revision-Date: 2010-02-19 09:57+0000\n" "Last-Translator: Hector Louzao \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 @@ -1809,3 +1809,6 @@ #: lib\util.py:912 lib\util.py:913 lib\util.py:916 msgid "(no message)" msgstr "(sin mensaje)" + +#~ msgid "Line" +#~ msgstr "Línea" diff -Nru qbzr-0.18.6/po/qbzr-et.po qbzr-0.19/po/qbzr-et.po --- qbzr-0.18.6/po/qbzr-et.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-et.po 2010-08-05 09:10:37.000000000 -0400 @@ -8,14 +8,14 @@ "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 11:16+0000\n" -"Last-Translator: Alexander Belchenko \n" +"PO-Revision-Date: 2010-03-26 09:54+0000\n" +"Last-Translator: René Pärts \n" "Language-Team: Estonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 @@ -25,15 +25,15 @@ #: lib\add.py:57 msgid "Unversioned Files" -msgstr "" +msgstr "Versioonita failid" #: lib\add.py:104 msgid "Show ignored files" -msgstr "" +msgstr "Näita eiratud faile" #: lib\annotate.py:199 lib\annotate.py:321 lib\annotate.py:325 lib\log.py:423 msgid "Annotate" -msgstr "" +msgstr "Annoteeri" #: lib\annotate.py:199 lib\diffwindow.py:120 lib\util.py:420 msgid "Loading..." @@ -46,45 +46,45 @@ #: lib\annotate.py:322 #, python-format msgid "Revision %s" -msgstr "" +msgstr "Versioon %s" #: lib\annotate.py:373 msgid "&Annotate this revision" -msgstr "" +msgstr "&Annoteeri see versioon" #: lib\bind.py:44 msgid "Bind branch" -msgstr "" +msgstr "Köida haru" #: lib\bind.py:54 msgid "Bind" -msgstr "" +msgstr "Köida" #: lib\bind.py:56 msgid "Branch location:" -msgstr "" +msgstr "Haru asukoht:" #: lib\bind.py:60 msgid "Currently bound to:" -msgstr "" +msgstr "Hetkel köidetud:" #: lib\bind.py:64 msgid "Bind to:" -msgstr "" +msgstr "Köidetud:" #: lib\bind.py:68 lib\browse.py:64 lib\browse.py:234 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:99 msgid "Browse" -msgstr "Sirvi" +msgstr "Lehitse" #: lib\bind.py:109 lib\switch.py:153 lib\tag.py:190 msgid "Select branch location" -msgstr "" +msgstr "Vali haru asukoht" #: lib\bind.py:120 msgid "Master branch location not specified." -msgstr "" +msgstr "Ülemharu asukohta pole määratud." #: lib\browse.py:73 lib\export.py:179 lib\ui_info.py:146 msgid "Location:" @@ -101,7 +101,7 @@ #: lib\browse.py:89 lib\treewidget.py:1193 msgid "&Filter" -msgstr "&Filter" +msgstr "&Filtreeri" #: lib\cat.py:83 lib\cat.py:282 msgid "View" @@ -118,13 +118,15 @@ #: lib\commit.py:252 msgid "&Local commit" -msgstr "" +msgstr "&Kohalik sissekanne" #: lib\commit.py:254 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" +"Kohalikud sissekanded pole ülemharusse pandud kuniks tavaline sissekanne on " +"tehtud" #: lib\commit.py:258 msgid "Description:" @@ -132,29 +134,31 @@ #: lib\commit.py:273 lib\logmodel.py:95 lib\treewidget.py:345 msgid "Message" -msgstr "Teade" +msgstr "Sõnum" #: lib\commit.py:281 msgid "Show non-versioned files" -msgstr "" +msgstr "Näita versioonita faile" #: lib\commit.py:303 msgid "Enter the commit message" -msgstr "" +msgstr "Sisesta sissekande sõnum" #: lib\commit.py:315 msgid "&Fixed bugs:" -msgstr "" +msgstr "&Fikseeritud vead:" #: lib\commit.py:316 msgid "Set the IDs of bugs fixed by this commit" -msgstr "" +msgstr "Määra selle sissekande poolt parandatud vigade ID-d" #: lib\commit.py:319 msgid "" "Enter the list of bug IDs in format tag:id separated by a space, e.g. " "project:123 project:765" msgstr "" +"Sisesta vigade ID-loend formaadis silt:id eraldatud tühikuga nagu " +"näiteks projekt:123 projekt:765" #: lib\commit.py:329 msgid "&Author:" @@ -162,12 +166,13 @@ #: lib\commit.py:330 msgid "Set the author of this change, if it's different from the committer" -msgstr "" +msgstr "Määra muudatusele sissekandjast erinev autor" #: lib\commit.py:333 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" +"Sisesta autori nimi nagu näiteks John Doe <jdoe@example.com>" #: lib\commit.py:348 msgid "Changes" @@ -175,20 +180,20 @@ #: lib\commit.py:365 msgid "Pending Merges" -msgstr "" +msgstr "Ootel ühendused" #: lib\commit.py:376 lib\main.py:355 lib\subprocess.py:178 #: lib\treewidget.py:347 msgid "Status" -msgstr "Staatus" +msgstr "Olek" #: lib\commit.py:388 msgid "View changes in files selected to commit" -msgstr "" +msgstr "Vaata sissekandeks valitud failide muudatusi" #: lib\commit.py:593 msgid "You should provide commit message." -msgstr "" +msgstr "Peaksid sisestama sissekandesõnumi." #: lib\commit.py:594 lib\conflicts.py:180 lib\conflicts.py:185 #: lib\diffwindow.py:403 lib\util.py:58 @@ -197,25 +202,31 @@ #: lib\commit.py:621 msgid "No changes to commit." -msgstr "" +msgstr "Sissekandeks puuduvad muudatused." #: lib\commit.py:629 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" +"Sissekandeks valitud muudatused puuduvad.\n" +"Kas siiski teha sissekanne?" #: lib\commit.py:694 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" +"Sissekanne tehakse otse ülemharule, hoides sünkroonis kohalikku haru ning " +"ülemharu." #: lib\commit.py:700 msgid "" "A local commit to the branch will be performed. The master branch will not " "be updated until a non-local commit is made." msgstr "" +"Teostatakse kohalik sissekanne harusse. Ülemharu ei uuendata kuniks tehakse " +"mitte-kohalik sissekanne." #: lib\commit.py:733 lib\diff.py:104 lib\diffwindow.py:120 #: lib\diffwindow.py:251 lib\diffwindow.py:393 lib\diffwindow.py:401 @@ -245,11 +256,11 @@ #: lib\config.py:47 msgid "XDG e-mail client" -msgstr "" +msgstr "XDG e-posti klient" #: lib\config.py:48 msgid "MAPI e-mail client" -msgstr "" +msgstr "MAPI e-posti klient" #: lib\config.py:49 msgid "Editor" @@ -265,19 +276,19 @@ #: lib\config.py:87 msgid "E-&mail:" -msgstr "E-&mail:" +msgstr "E-&post:" #: lib\config.py:93 lib\ui_run.py:111 lib\ui_tag.py:90 msgid "&Browse..." -msgstr "" +msgstr "&Lehitse..." #: lib\config.py:100 msgid "&Editor:" -msgstr "" +msgstr "&Redaktor:" #: lib\config.py:108 msgid "E-mail &client:" -msgstr "" +msgstr "E-post &klient:" #: lib\config.py:118 msgid "Alias" @@ -302,11 +313,11 @@ #: lib\config.py:160 msgid "Show inter-group inserts and deletes in green and red" -msgstr "" +msgstr "Näita grupisiseseid sisestusi ja kustutamisi rohelise ja punasega" #: lib\config.py:162 msgid "External Diff Apps:" -msgstr "" +msgstr "Välised erinevusrakendused:" #: lib\config.py:165 lib\main.py:353 lib\plugins.py:56 lib\plugins.py:61 msgid "Name" @@ -314,7 +325,7 @@ #: lib\config.py:192 msgid "External Merge Apps:" -msgstr "" +msgstr "Välised liitmisrakendused:" #: lib\config.py:195 msgid "Definition" @@ -330,11 +341,11 @@ #: lib\config.py:220 msgid "Bug Trackers" -msgstr "" +msgstr "Vigade jälgijad" #: lib\config.py:221 msgid "&User Interface" -msgstr "" +msgstr "&Kasutajaliides" #: lib\config.py:222 msgid "&Diff" @@ -342,19 +353,19 @@ #: lib\config.py:223 msgid "&Merge" -msgstr "" +msgstr "&Liida" #: lib\config.py:248 msgid "Spell check &language:" -msgstr "" +msgstr "Õigekirja kontroll &keel:" #: lib\config.py:340 lib\diff.py:35 msgid "Builtin Diff" -msgstr "" +msgstr "Sisseehitatud võrdlus" #: lib\config.py:586 msgid "Select editor executable" -msgstr "" +msgstr "Vali käivitatav redaktor" #: lib\conflicts.py:39 lib\conflicts.py:159 lib\conflicts.py:176 #: lib\conflicts.py:183 @@ -371,7 +382,7 @@ #: lib\conflicts.py:81 msgid "Use Configured Default" -msgstr "" +msgstr "Kasuta vaikimisi seadistusi" #: lib\conflicts.py:83 msgid "" @@ -380,42 +391,46 @@ "external_merge = kdiff3 --output %r %b %t %o\n" "%r is output, %b is .BASE, %t is .THIS and %o is .OTHER file." msgstr "" +"Liitmise tööriist on seadistatud qconfig liitmise failis.\n" +"See järgib konventsiooni, mis on kasutusel bzr pluginas: extmerge\n" +"external_merge = kdiff3 --output %r %b %t %o\n" +"%r is output, %b is .BASE, %t is .THIS and %o is .OTHER file." #: lib\conflicts.py:91 msgid "&Launch..." -msgstr "" +msgstr "&Käivita..." #: lib\conflicts.py:97 msgid "M&erge tool:" -msgstr "" +msgstr "L&iitmise tööriist:" #: lib\conflicts.py:112 msgid "Auto-resolve" -msgstr "" +msgstr "Automaatne lahendamine" #: lib\conflicts.py:141 lib\treewidget.py:1598 msgid "&Merge conflict" -msgstr "" +msgstr "&Liida konflikt" #: lib\conflicts.py:147 msgid "Mark as &resolved" -msgstr "" +msgstr "Märgi &lahendatuks" #: lib\conflicts.py:177 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d konflikt on automaatselt lahendatud." +msgstr[1] "%d konflikti on automaatselt lahendatud." #: lib\conflicts.py:184 msgid "All conflicts resolved." -msgstr "" +msgstr "Kõik konfliktid on lahendatud." #: lib\conflicts.py:240 #, python-format msgid "Error while running merge tool (code %d)" -msgstr "" +msgstr "Liitmise tööriista (code %d) käivitamisel tekkis viga" #: lib\conflicts.py:241 lib\conflicts.py:305 lib\tag.py:204 lib\trace.py:186 #: lib\trace.py:200 lib\tree_branch.py:95 lib\util.py:949 lib\util.py:959 @@ -424,7 +439,7 @@ #: lib\conflicts.py:281 msgid "Set up external_merge app in qconfig under the Merge tab" -msgstr "" +msgstr "Määra external_merge rakendus qconfig'is liitmise kaardil" #: lib\conflicts.py:306 #, python-format @@ -433,32 +448,35 @@ "Missing the flag: %(flags)s. This must be fixed in qconfig under the Merge " "tab." msgstr "" +"extmerge definitsioon: '%(tool)s' on vigane.\n" +"Kadunud märgistus: %(flags)s. See peab olema fikseeritud qconfig'i liitmise " +"kaardis." #: lib\conflicts.py:312 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." -msgstr "" +msgstr "Kadunud märgistus: %s. Seadista qconfig'i liitmise kaardis." #: lib\conflicts.py:320 #, python-format msgid "%s (Configured external merge definition in qconfig)" -msgstr "" +msgstr "%s (Seadistatud välise liitmise definitsioon qconfig'is)" #: lib\conflicts.py:328 msgid "path conflict" -msgstr "" +msgstr "asukohakonflikt" #: lib\conflicts.py:329 msgid "contents conflict" -msgstr "" +msgstr "sisukonflikt" #: lib\conflicts.py:330 msgid "text conflict" -msgstr "" +msgstr "tekstikonflikt" #: lib\conflicts.py:331 msgid "duplicate id" -msgstr "" +msgstr "dubleeri id" #: lib\conflicts.py:332 msgid "duplicate" @@ -466,27 +484,27 @@ #: lib\conflicts.py:333 msgid "parent loop" -msgstr "" +msgstr "ülemkordus" #: lib\conflicts.py:334 msgid "unversioned parent" -msgstr "" +msgstr "versioonita ülem" #: lib\conflicts.py:335 msgid "missing parent" -msgstr "" +msgstr "kadunud ülem" #: lib\conflicts.py:336 msgid "deleting parent" -msgstr "" +msgstr "ülema kustutamine" #: lib\conflicts.py:337 msgid "non-directory parent" -msgstr "" +msgstr "kataloogita ülem" #: lib\diff.py:80 lib\treewidget.py:1593 msgid "Show &differences" -msgstr "" +msgstr "Näita &erinevusi" #: lib\diffview.py:248 msgid "Last modified:" @@ -506,60 +524,60 @@ #: lib\diffview.py:485 msgid "[binary file]" -msgstr "" +msgstr "[binaarfail]" #: lib\diffview.py:666 msgid "\\ No newline at end of file" -msgstr "" +msgstr "\\ Faili lõpus reavahetus puudub" #: lib\diffwindow.py:77 #, python-format msgid "Working Tree for %s" -msgstr "" +msgstr "Tööpuu %s jaoks" #: lib\diffwindow.py:79 msgid "Working Tree" -msgstr "" +msgstr "Tööpuu" #: lib\diffwindow.py:98 #, python-format msgid "Rev %(rev)s for %(branch)s" -msgstr "" +msgstr "Rev %(rev)s %(branch)s jaoks" #: lib\diffwindow.py:100 #, python-format msgid "Rev %s" -msgstr "" +msgstr "Rev %s" #: lib\diffwindow.py:103 #, python-format msgid "Revid: %(revid)s for %(branch)s" -msgstr "" +msgstr "Revid: %(revid)s %(branch)s jaoks" #: lib\diffwindow.py:105 #, python-format msgid "Revid: %s" -msgstr "" +msgstr "Revid: %s" #: lib\diffwindow.py:108 msgid "Merge Preview" -msgstr "" +msgstr "Liida eelvaade" #: lib\diffwindow.py:146 msgid "Side by side" -msgstr "" +msgstr "Kõrvuti" #: lib\diffwindow.py:153 msgid "Unidiff" -msgstr "" +msgstr "Unidiff" #: lib\diffwindow.py:163 msgid "Left side encoding:" -msgstr "" +msgstr "Vasakpoolne kodeering:" #: lib\diffwindow.py:171 msgid "Right side encoding:" -msgstr "" +msgstr "Parempoolne kodeering:" #: lib\diffwindow.py:175 msgid "Complete" @@ -567,18 +585,18 @@ #: lib\diffwindow.py:184 msgid "Using" -msgstr "" +msgstr "Kasutusel" #: lib\diffwindow.py:257 #, python-format msgid "%d file" msgid_plural "%d files" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d fail" +msgstr[1] "%d faili" #: lib\diffwindow.py:332 lib\treewidget.py:321 msgid "removed" -msgstr "" +msgstr "eemaldatud" #: lib\diffwindow.py:334 lib\treewidget.py:319 msgid "added" @@ -586,11 +604,11 @@ #: lib\diffwindow.py:336 msgid "renamed and modified" -msgstr "" +msgstr "ümbernimetatud ja muudetud" #: lib\diffwindow.py:338 lib\treewidget.py:332 msgid "renamed" -msgstr "" +msgstr "ümbernimetatud" #: lib\diffwindow.py:340 lib\treewidget.py:334 msgid "modified" @@ -602,6 +620,8 @@ "File %s is not versioned.\n" "Operation aborted." msgstr "" +"Fail %s ei ole versioonitud.\n" +"Operatsioon on katkestatud." #: lib\diffwindow.py:396 lib\tag.py:138 lib\tag.py:169 lib\tag.py:206 #: lib\tree_branch.py:97 lib\util.py:60 lib\util.py:952 lib\util.py:962 @@ -610,43 +630,43 @@ #: lib\diffwindow.py:402 msgid "No changes found." -msgstr "Muudatusi ei leitud" +msgstr "Muudatusi ei leitud." #: lib\encoding_selector.py:114 msgid "Wrong encoding" -msgstr "" +msgstr "Vale kodeerimine" #: lib\encoding_selector.py:115 #, python-format msgid "Encoding \"%s\" is invalid or not supported." -msgstr "" +msgstr "\"%s\" kodeerimine on vigane või tugi puudub." #: lib\export.py:61 lib\export.py:80 msgid "Export" -msgstr "" +msgstr "Ekspordi" #: lib\export.py:75 lib\uncommit.py:51 #, python-format msgid "Branch: %s" -msgstr "" +msgstr "Haru: %s" #: lib\export.py:146 msgid "Archive type:" -msgstr "" +msgstr "Arhiivi liik:" #: lib\export.py:168 msgid "Root directory name:" -msgstr "" +msgstr "Juurkataloogi nimi:" #: lib\export.py:236 lib\ui_branch.py:66 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 msgid "Options" -msgstr "" +msgstr "Valikud" #: lib\help.py:59 #, python-format msgid "No help can be found for %s" -msgstr "" +msgstr "Abi %s jaoks ei leitud" #: lib\help.py:103 msgid "Help" @@ -662,39 +682,39 @@ #: lib\i18n.py:89 msgid "symlink" -msgstr "" +msgstr "nimeviit" #: lib\i18n.py:91 msgid "fixed" -msgstr "" +msgstr "fikseeritud" #: lib\i18n.py:93 msgid "View text file" -msgstr "" +msgstr "Tekstifaili vaatamine" #: lib\i18n.py:94 msgid "View image file" -msgstr "" +msgstr "Pildifaili vaatamine" #: lib\i18n.py:95 msgid "View binary file" -msgstr "" +msgstr "Binaarfaili vaatamine" #: lib\i18n.py:96 msgid "View symlink" -msgstr "" +msgstr "Nimeviida vaatamine" #: lib\i18n.py:97 msgid "View directory" -msgstr "" +msgstr "Kataloogi vaatamine" #: lib\i18n.py:99 msgid "No changes selected to commit" -msgstr "" +msgstr "Sissekande jaoks valitud muudatusi ei leitud" #: lib\i18n.py:100 msgid "No changes selected to revert" -msgstr "" +msgstr "Valitud muudatusi tühistamiseks ei leitud" #: lib\info.py:41 msgid "Info" @@ -702,19 +722,19 @@ #: lib\info.py:65 msgid "Location has no working tree" -msgstr "" +msgstr "Asukohal puudub tööpuu" #: lib\info.py:78 msgid "Location has no branch" -msgstr "" +msgstr "Asukohal puudub haru" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" -msgstr "" +msgstr "Initsialiseeri" #: lib\init.py:72 msgid "You must specify a location" -msgstr "" +msgstr "Sa pead määrama asukoha" #: lib\log.py:98 msgid "Log" @@ -726,7 +746,7 @@ #: lib\log.py:141 msgid "Messages" -msgstr "Teated" +msgstr "Sõnumid" #: lib\log.py:143 msgid "Authors" @@ -734,11 +754,11 @@ #: lib\log.py:145 msgid "Revision IDs" -msgstr "" +msgstr "Versiooni ID'd" #: lib\log.py:147 msgid "Revision Numbers" -msgstr "" +msgstr "Versiooni numbrid" #: lib\log.py:149 msgid "Tags" @@ -750,19 +770,19 @@ #: lib\log.py:245 msgid "Messages and File text (indexed)" -msgstr "" +msgstr "Sõnumid ja faili tekst (indekseeritud)" #: lib\log.py:418 lib\logwidget.py:132 msgid "Show &differences..." -msgstr "" +msgstr "Näita &erinevusi..." #: lib\log.py:426 msgid "View file" -msgstr "" +msgstr "Vaata faili" #: lib\logmodel.py:94 lib\treewidget.py:344 msgid "Rev" -msgstr "" +msgstr "Rev" #: lib\logmodel.py:96 lib\treewidget.py:343 msgid "Date" @@ -775,31 +795,31 @@ #: lib\logmodel.py:244 #, python-format msgid "bug #%s" -msgstr "" +msgstr "viga #%s" #: lib\logwidget.py:106 msgid "Show file &differences" -msgstr "" +msgstr "Näita faili &erinevusi" #: lib\logwidget.py:112 msgid "Show all &differences" -msgstr "" +msgstr "Näita kõiki &erinevusi" #: lib\logwidget.py:118 msgid "Show file &differences..." -msgstr "" +msgstr "Näita faili &erinevusi..." #: lib\logwidget.py:122 msgid "Show all &differences..." -msgstr "" +msgstr "Näita kõiki &erinevusi..." #: lib\logwidget.py:140 msgid "Show &tree..." -msgstr "" +msgstr "Näita &puud..." #: lib\logwidget.py:142 msgid "Tag &revision..." -msgstr "" +msgstr "Silt &versioon..." #: lib\main.py:120 msgid "Computer" @@ -807,11 +827,11 @@ #: lib\main.py:149 msgid "&Edit Bookmark..." -msgstr "" +msgstr "&Redigeeri järjehoidjat..." #: lib\main.py:150 msgid "&Remove Bookmark..." -msgstr "" +msgstr "&Eemalda järjehoidja..." #: lib\main.py:165 msgid "Bookmarks" @@ -823,7 +843,7 @@ #: lib\main.py:276 msgid "Refresh the directory tree" -msgstr "" +msgstr "Värskenda kataloogipuu" #: lib\main.py:280 msgid "&Commit" @@ -831,27 +851,27 @@ #: lib\main.py:281 msgid "Commit changes into a new revision" -msgstr "" +msgstr "Kanna muudatused uude versiooni" #: lib\main.py:285 msgid "&Push" -msgstr "" +msgstr "&Lükka" #: lib\main.py:286 msgid "Turn this branch into a mirror of another branch" -msgstr "" +msgstr "Pööra see haru teise haru peegelduseks" #: lib\main.py:290 msgid "Pu&ll" -msgstr "" +msgstr "&Tõmba" #: lib\main.py:291 msgid "Update a mirror of this branch" -msgstr "" +msgstr "Uuenda selle haru peegeldus" #: lib\main.py:294 msgid "&Add Bookmark..." -msgstr "" +msgstr "&Lisa järjehoidja..." #: lib\main.py:301 msgid "&File" @@ -871,7 +891,7 @@ #: lib\main.py:307 msgid "&Branch" -msgstr "" +msgstr "&Haru" #: lib\main.py:311 msgid "&Bookmarks" @@ -887,7 +907,7 @@ #: lib\main.py:316 msgid "&About..." -msgstr "&Programmist..." +msgstr "Te&ave..." #: lib\main.py:354 msgid "Size" @@ -895,7 +915,7 @@ #: lib\main.py:406 msgid "About QBzr" -msgstr "" +msgstr "QBzr'i info" #: lib\main.py:407 #, python-format @@ -905,6 +925,10 @@ "2008 Lukáš Lalinský and others

http://bazaar-vcs.org/QBzr" msgstr "" +"QBzr — Graafiline Bazaari kasutajaliides
Versioon " +"%(qbzr_version)s (bzrlib %(bzrlib_version)s)

Autoriõigus © " +"2006-2008 Lukáš Lalinský ja teised

http://bazaar-vcs.org/QBzr" #: lib\main.py:472 msgid "Add Bookmark" @@ -920,15 +944,15 @@ #: lib\main.py:494 msgid "Do you really want to remove the selected bookmark?" -msgstr "" +msgstr "Kas sa tõesti soovid valitud järjehoidjat eemaldada?" #: lib\plugins.py:44 msgid "Plugins" -msgstr "" +msgstr "Pluginad" #: lib\plugins.py:57 msgid "Version" -msgstr "" +msgstr "Versioon" #: lib\plugins.py:58 lib\subprocess.py:355 msgid "Description" @@ -936,40 +960,40 @@ #: lib\plugins.py:62 msgid "Directory" -msgstr "" +msgstr "Kataloog" #: lib\plugins.py:64 #, python-format msgid "Plugins installed: %(rows)d" -msgstr "" +msgstr "Paigaldatud pluginad: %(rows)d" #: lib\plugins.py:71 msgid "Summary" -msgstr "" +msgstr "Kokkuvõte" #: lib\plugins.py:72 msgid "Locations" -msgstr "" +msgstr "Asukohad" #: lib\plugins.py:111 msgid "(no description)" -msgstr "" +msgstr "(kirjeldus puudub)" #: lib\pull.py:236 msgid "Working tree has uncommitted changes." -msgstr "" +msgstr "Tööpuul on sissekandmata muudatused." #: lib\pull.py:241 msgid "Working tree is out of date, please run 'bzr update'." -msgstr "" +msgstr "Tööpuu on aegunud, palun käivita 'bzr update'." #: lib\pull.py:247 lib\ui_push.py:62 msgid "Push" -msgstr "Lükkamine" +msgstr "Lükka" #: lib\pull.py:249 msgid "Do you want to continue anyway?" -msgstr "Kas sellest hoolimata jätkata?" +msgstr "Kas sa soovid sellest hoolimata jätkata?" #: lib\pull.py:250 lib\uncommit.py:126 msgid "&Yes" @@ -985,63 +1009,65 @@ #: lib\revert.py:65 msgid "Select changes to revert" -msgstr "" +msgstr "Vali tagasivõetavad muudatused" #: lib\revert.py:83 msgid "Do not save backups of reverted files" -msgstr "" +msgstr "Ära salvesta tagasivõetud failide varundusi" #: lib\revert.py:95 msgid "Forget pending merges" -msgstr "" +msgstr "Unusta ootel liitmised" #: lib\revert.py:144 msgid "View changes in files selected to revert" -msgstr "" +msgstr "Vaata valitud tagasivõetavate failide muudatusi" #: lib\revert.py:242 msgid "" "You are reverting all changed paths without also reverting pending merges. " "Do you want to continue?" msgstr "" +"Sa võtad kõik muudetud asukohad tagasi ilma, et võtaksid tagasi ootel " +"liitmised. Kas sa soovid jätkata?" #: lib\revisionmessagebrowser.py:184 msgid "Parents:" -msgstr "" +msgstr "Ülemad:" #: lib\revisionmessagebrowser.py:187 msgid "Children:" -msgstr "" +msgstr "Järglased:" #: lib\revisionmessagebrowser.py:201 msgid "Uncommited Working Tree Changes" -msgstr "" +msgstr "Sissekandmata tööpuu muudatused" #: lib\revisionmessagebrowser.py:236 msgid "Date:" -msgstr "" +msgstr "Kuupäev:" #: lib\revisionmessagebrowser.py:238 msgid "Committer:" -msgstr "" +msgstr "Sissekandja:" #: lib\revisionmessagebrowser.py:244 msgid "Author:" -msgstr "" +msgstr "Autor:" #: lib\revisionmessagebrowser.py:248 lib\unbind.py:49 msgid "Branch:" -msgstr "" +msgstr "Haru:" #: lib\revisionmessagebrowser.py:253 msgid "Tags:" -msgstr "" +msgstr "Sildid:" #: lib\revisionmessagebrowser.py:265 msgid "Bug:" msgid_plural "Bugs:" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Viga:" +msgstr[1] "Vead:" #: lib\revisionview.py:66 lib\ui_new_tree.py:158 msgid "Revision" @@ -1049,23 +1075,23 @@ #: lib\run.py:96 msgid "Select working directory" -msgstr "" +msgstr "Vali töökataloog" #: lib\run.py:118 msgid "&Edit" -msgstr "" +msgstr "&Redigeeri" #: lib\run.py:161 msgid "Help for command" -msgstr "" +msgstr "Abi käsule" #: lib\run.py:278 msgid "Select path to insert" -msgstr "" +msgstr "Vali sisestamiseks asukoht" #: lib\run.py:288 msgid "Select files to insert" -msgstr "" +msgstr "Vali sisestatavad failid" #: lib\send.py:34 msgid "Send" @@ -1073,27 +1099,27 @@ #: lib\send.py:47 msgid "Merge Directive Options" -msgstr "" +msgstr "Liida direktiivsed valikud" #: lib\send.py:53 msgid "Submit Branch:" -msgstr "" +msgstr "Saada haru:" #: lib\send.py:77 msgid "Public Branch:" -msgstr "" +msgstr "Avalik haru:" #: lib\send.py:99 msgid "Remember these locations as defaults" -msgstr "" +msgstr "Jäta need asukohad vaikimisi meelde" #: lib\send.py:103 msgid "Include a bundle in the merge directive" -msgstr "" +msgstr "Sisalda komplekti liidetud direktiividest" #: lib\send.py:107 msgid "Include a preview patch in the merge directive" -msgstr "" +msgstr "Sisalda liidetud direktiividest eelvaate asukohta" #: lib\send.py:112 msgid "Action" @@ -1101,27 +1127,27 @@ #: lib\send.py:122 msgid "Address:" -msgstr "" +msgstr "Aadress:" #: lib\send.py:132 msgid "Message:" -msgstr "Teade:" +msgstr "Sõnum:" #: lib\send.py:149 msgid "Filename:" -msgstr "Faili nimi:" +msgstr "Failinimi:" #: lib\send.py:163 msgid "Revisions:" -msgstr "" +msgstr "Versioonid:" #: lib\subprocess.py:103 msgid "&Retry" -msgstr "" +msgstr "&Proovi uuesti" #: lib\subprocess.py:393 msgid "Ready" -msgstr "" +msgstr "Valmis" #: lib\subprocess.py:462 msgid "Starting..." @@ -1129,7 +1155,7 @@ #: lib\subprocess.py:539 msgid "Aborting..." -msgstr "Katkestan..." +msgstr "Katkestamine..." #: lib\subprocess.py:550 lib\subprocess.py:669 msgid "Finished!" @@ -1141,7 +1167,7 @@ #: lib\subprocess.py:590 lib\uifactory.py:119 msgid "Enter Username" -msgstr "" +msgstr "Sisesta kasutajanimi:" #: lib\subprocess.py:650 lib\subprocess.py:672 msgid "Failed!" @@ -1149,52 +1175,52 @@ #: lib\subprocess.py:652 msgid "Failed to start bzr." -msgstr "" +msgstr "Bzr'i käivitamine nurjus" #: lib\subprocess.py:654 #, python-format msgid "Error while running bzr. (error code: %d)" -msgstr "" +msgstr "Bzr käivitamisel tekkis viga. (vea kood: %d)" #: lib\subprocess.py:662 msgid "Aborted!" -msgstr "" +msgstr "Katkenud!" #: lib\switch.py:45 msgid "Switch" -msgstr "" +msgstr "Lülita" #: lib\switch.py:56 msgid "Switch checkout" -msgstr "" +msgstr "Lülita väljavõttesse" #: lib\switch.py:64 msgid "Heavyweight checkout:" -msgstr "" +msgstr "Väga põhjalik väljavõte:" #: lib\switch.py:68 msgid "Lightweight checkout:" -msgstr "" +msgstr "Vähem põhjalik väljavõte:" #: lib\switch.py:75 msgid "Checkout of branch:" -msgstr "" +msgstr "Haru väljavõte:" #: lib\switch.py:88 msgid "Switch to branch:" -msgstr "" +msgstr "Lülita harusse:" #: lib\switch.py:112 msgid "Create Branch before switching" -msgstr "" +msgstr "Loo enne lülitamist haru" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" -msgstr "" +msgstr "Süsteemi informatsioon" #: lib\tag.py:137 msgid "You should specify tag name" -msgstr "" +msgstr "Sa peaksid määrama sildi nime" #: lib\tag.py:143 #, python-format @@ -1202,14 +1228,16 @@ "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" +"Silt \"%s\" on juba olemas.\n" +"Kas sa soovid liigutada olemasolevat silti?" #: lib\tag.py:146 msgid "&Move" -msgstr "" +msgstr "&Liiguta" #: lib\tag.py:146 lib\tag.py:159 lib\util.py:59 msgid "&Cancel" -msgstr "" +msgstr "&Katkesta" #: lib\tag.py:156 #, python-format @@ -1217,15 +1245,17 @@ "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" +"Silti \"%s\" ei ole veel olemas.\n" +"Kas sa soovid luua uue sildi?" #: lib\tag.py:159 msgid "Cre&ate" -msgstr "" +msgstr "&Loo" #: lib\tag.py:168 #, python-format msgid "Tag \"%s\" does not exists" -msgstr "" +msgstr "Silti \"%s\" ei ole olemas" #: lib\tag.py:205 #, python-format @@ -1233,461 +1263,466 @@ "Not a branch:\n" "%s" msgstr "" +"See pole haru:\n" +"%s" #: lib\treewidget.py:312 msgid "ignored" -msgstr "" +msgstr "ignoreeritud" #: lib\treewidget.py:314 msgid "non-versioned" -msgstr "" +msgstr "versioonita" #: lib\treewidget.py:317 msgid "added, missing" -msgstr "" +msgstr "lisatud, puudu" #: lib\treewidget.py:323 msgid "missing" -msgstr "" +msgstr "puudu" #: lib\treewidget.py:330 msgid "moved" -msgstr "" +msgstr "liigutatud" #: lib\treewidget.py:336 msgid "x-bit" -msgstr "" +msgstr "x-bit" #: lib\treewidget.py:342 msgid "File Name" -msgstr "" +msgstr "Faili nimi" #: lib\treewidget.py:1195 msgid "Unchanged" -msgstr "" +msgstr "Muutmata" #: lib\treewidget.py:1196 msgid "Changed" -msgstr "" +msgstr "Muudetud" #: lib\treewidget.py:1197 msgid "Unversioned" -msgstr "" +msgstr "Versioonita" #: lib\treewidget.py:1198 msgid "Ignored" -msgstr "" +msgstr "Ignoreeritud" #: lib\treewidget.py:1574 msgid "&Open" -msgstr "" +msgstr "&Ava" #: lib\treewidget.py:1577 msgid "&View file" -msgstr "" +msgstr "&Vaata faili" #: lib\treewidget.py:1580 msgid "Show &annotate" -msgstr "" +msgstr "Näita &annoteerimist" #: lib\treewidget.py:1583 msgid "Show &log" -msgstr "" +msgstr "Näita &logi" #: lib\treewidget.py:1601 msgid "Mark conflict &resolved" -msgstr "" +msgstr "Märgi konflikt &lahendatuks" #: lib\treewidget.py:1606 msgid "&Add" -msgstr "" +msgstr "&Lisa" #: lib\treewidget.py:1609 msgid "&Revert" -msgstr "" +msgstr "&Tühista" #: lib\treewidget.py:1612 msgid "Re&name" -msgstr "" +msgstr "&Nimeta ümber" #: lib\treewidget.py:1674 msgid "&Mark as moved and renamed" -msgstr "" +msgstr "&Märgi liigutatuks ja ümbernimetatuks" #: lib\treewidget.py:1676 msgid "&Mark as moved" -msgstr "" +msgstr "&Märgi liigutatuks" #: lib\treewidget.py:1678 msgid "&Mark as renamed" -msgstr "" +msgstr "&Märgi ümbernimetatuks" #: lib\treewidget.py:1825 msgid "Do you really want to revert the selected file(s)?" -msgstr "" +msgstr "Kas sa tõesti soovid valitud faili(d) tagasi võtta?" #: lib\treewidget.py:1858 msgid "External Merge" -msgstr "" +msgstr "Väline liitmine" #: lib\treewidget.py:1936 msgid "" "Some of the files selected cannot be recoverd if removed. Are you sure you " "want to remove these files?" msgstr "" +"Mõningaid valitud faile ei olnud võimalik taastada. Oled sa kindel, et sa " +"soovid need failid eemaldada?" #: lib\treewidget.py:1951 msgid "Select / deselect all" -msgstr "" +msgstr "Vali / ära vali kõik" #: lib\tree_branch.py:91 lib\util.py:950 #, python-format msgid "Not a branch \"%s\"" -msgstr "" +msgstr "Ei ole haru \"%s\"" #: lib\tree_branch.py:93 lib\util.py:960 #, python-format msgid "No working tree exists for \"%s\"" -msgstr "" +msgstr "Tööpuud \"%s\" jaoks ei ole olemas" #: lib\ui_bookmark.py:51 lib\ui_branch.py:67 lib\ui_merge.py:64 #: lib\ui_pull.py:62 lib\ui_push.py:64 msgid "&Location:" -msgstr "" +msgstr "&Asukoht:" #: lib\ui_branch.py:68 lib\ui_branch.py:71 lib\ui_init.py:120 #: lib\ui_merge.py:65 lib\ui_new_tree.py:132 lib\ui_new_tree.py:134 #: lib\ui_pull.py:63 lib\ui_push.py:65 lib\ui_update_branch.py:85 #: lib\ui_update_checkout.py:79 msgid "Browse..." -msgstr "" +msgstr "Lehitse..." #: lib\ui_branch.py:69 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" -msgstr "" +msgstr "&Versioon:" #: lib\ui_branch.py:70 msgid "&To:" -msgstr "" +msgstr "&Kellele:" #: lib\ui_info.py:147 lib\ui_info.py:149 lib\ui_info.py:151 lib\ui_info.py:153 #: lib\ui_info.py:155 lib\ui_info.py:158 lib\ui_info.py:160 lib\ui_info.py:162 #: lib\ui_info.py:164 msgid "..." -msgstr "" +msgstr "..." #: lib\ui_info.py:148 msgid "Parent branch:" -msgstr "" +msgstr "Ülemharu:" #: lib\ui_info.py:150 msgid "Push branch:" -msgstr "" +msgstr "Lükka haru:" #: lib\ui_info.py:152 msgid "Submit branch:" -msgstr "" +msgstr "Saada haru:" #: lib\ui_info.py:154 msgid "Public branch:" -msgstr "" +msgstr "Avalik haru:" #: lib\ui_info.py:156 msgid "&Related Branches" -msgstr "" +msgstr "&Seotud harud" #: lib\ui_info.py:157 msgid "Working tree format:" -msgstr "" +msgstr "Tööpuu vorming:" #: lib\ui_info.py:159 msgid "Branch format:" -msgstr "" +msgstr "Haru vorming:" #: lib\ui_info.py:161 msgid "Repository format:" -msgstr "" +msgstr "Hoidla vorming:" #: lib\ui_info.py:163 msgid "Control directory format:" -msgstr "" +msgstr "Kontrollkataloogi vorming:" #: lib\ui_info.py:165 msgid "&Format" -msgstr "" +msgstr "&Vorming" #: lib\ui_init.py:119 msgid "Local Directory" -msgstr "" +msgstr "Kohalik kataloog" #: lib\ui_init.py:121 msgid "Repository" -msgstr "" +msgstr "Hoidla" #: lib\ui_init.py:122 msgid "Create a new standalone tree" -msgstr "" +msgstr "Loo uus eraldiseisev puu" #: lib\ui_init.py:123 msgid "Ensure all revisions are appended to the log" -msgstr "" +msgstr "Veendu, et kõik versioonid on logisse lisatud" #: lib\ui_init.py:124 msgid "Create a new shared repository" -msgstr "" +msgstr "Loo uus jagatud hoidla" #: lib\ui_init.py:125 msgid "Skip the creation of working trees in this repository" -msgstr "" +msgstr "Jäta tööpuude loomine selles hoidlas vahele" #: lib\ui_init.py:131 msgid "Repository Format:" -msgstr "" +msgstr "Hoidla vorming:" #: lib\ui_init.py:132 msgid "Description of format" -msgstr "" +msgstr "Vormingu kirjeldus" #: lib\ui_merge.py:62 msgid "Merge" -msgstr "" +msgstr "Liida" #: lib\ui_merge.py:67 lib\ui_pull.py:65 lib\ui_push.py:66 msgid "Remember this location as a default" -msgstr "" +msgstr "Jäta see asukoht vaikimisi meelde" #: lib\ui_merge.py:68 msgid "Merge even if the working tree has uncommitted changes" -msgstr "" +msgstr "Liida isegi siis, kui tööpuul on sissekandmata muudatused" #: lib\ui_merge.py:69 msgid "Merge uncommitted changes instead of committed ones" -msgstr "" +msgstr "Liida sissekandmata muudatused sissekantute asemele" #: lib\ui_new_tree.py:129 msgid "Create a new Bazaar Working Tree" -msgstr "" +msgstr "Loo uus Bazaari tööpuu" #: lib\ui_new_tree.py:131 msgid "" "Branch source (enter a URL or select a local directory with an existing " "branch)" msgstr "" +"Haru allikas (Sisesta URL või vali kohalik kataloog olemasoleva haruga)" #: lib\ui_new_tree.py:133 msgid "Local directory where the working tree will be created" -msgstr "" +msgstr "Kohalik kataloog, kuhu loodakse tööpuu" #: lib\ui_new_tree.py:135 msgid "Working Tree Options" -msgstr "" +msgstr "Tööpuu valikud" #: lib\ui_new_tree.py:136 msgid "Create a checkout" -msgstr "" +msgstr "Loo väljavõte" #: lib\ui_new_tree.py:144 msgid "Light-weight checkout" -msgstr "" +msgstr "Lihtsam väljavõte" #: lib\ui_new_tree.py:145 msgid "Make a local copy of the branch" -msgstr "" +msgstr "Tee harust kohalik koopia" #: lib\ui_new_tree.py:151 msgid "Create a stacked branch referring to the source branch" -msgstr "" +msgstr "Loo rühmitatud haru viidates allika harule" #: lib\ui_new_tree.py:152 msgid "Click a link for more information about checkouts and branches." -msgstr "" +msgstr "Väljavõtetest ja harudest rohkema info saamiseks klõpsa lingile." #: lib\ui_new_tree.py:159 msgid "Most recent (tip) revision" -msgstr "" +msgstr "Kõige viimane (tip) versioon" #: lib\ui_new_tree.py:161 msgid "Show Log..." -msgstr "" +msgstr "Näita logi..." #: lib\ui_pull.py:60 msgid "Pull" -msgstr "" +msgstr "Tõmba" #: lib\ui_pull.py:66 lib\ui_push.py:67 lib\ui_update_branch.py:88 #: lib\ui_update_checkout.py:80 msgid "Overwrite differences between branches" -msgstr "" +msgstr "Kirjuta üle harudevahelised erinevused" #: lib\ui_push.py:68 msgid "Use existing directory" -msgstr "" +msgstr "Kasuta olemasolevat kataloogi" #: lib\ui_push.py:69 msgid "Create the path up to the branch if it does not exist" -msgstr "" +msgstr "Loo haruni asukoht, kui seda pole olemas" #: lib\ui_run.py:109 msgid "Run bzr command" -msgstr "" +msgstr "Käivita bzr käsk" #: lib\ui_run.py:110 msgid "&Working directory:" -msgstr "" +msgstr "&Töökataloog:" #: lib\ui_run.py:112 msgid "C&ategory:" -msgstr "" +msgstr "&Kategooria:" #: lib\ui_run.py:113 msgid "&Command:" -msgstr "" +msgstr "&Käsk:" #: lib\ui_run.py:114 msgid "&Show hidden commands" -msgstr "" +msgstr "&Näita peidetud käske" #: lib\ui_run.py:115 msgid "&Options and arguments for command:" -msgstr "" +msgstr "&Valikud ja argumendid käsu jaoks:" #: lib\ui_run.py:116 msgid "Insert &directory..." -msgstr "" +msgstr "Sisesta &kataloog..." #: lib\ui_run.py:117 msgid "Insert &filenames..." -msgstr "" +msgstr "Sisesta &failinimed..." #: lib\ui_sysinfo.py:113 msgid "Bazaar Library" -msgstr "" +msgstr "Bazaari teek" #: lib\ui_sysinfo.py:114 lib\ui_sysinfo.py:124 msgid "Version:" -msgstr "" +msgstr "Versioon:" #: lib\ui_sysinfo.py:115 msgid "(bzr-version)" -msgstr "" +msgstr "(bzr-versioon)" #: lib\ui_sysinfo.py:116 lib\ui_sysinfo.py:126 msgid "Path:" -msgstr "" +msgstr "Asukoht:" #: lib\ui_sysinfo.py:117 msgid "(bzr-lib-path)" -msgstr "" +msgstr "(bzr-lib-asukoht)" #: lib\ui_sysinfo.py:118 msgid "Bazaar Configuration" -msgstr "" +msgstr "Bazaari seadistamine" #: lib\ui_sysinfo.py:119 msgid "Settings:" -msgstr "" +msgstr "Seadistused:" #: lib\ui_sysinfo.py:120 msgid "(bzr-config-dir)" -msgstr "" +msgstr "(bzr-seadistamine-kataloog)" #: lib\ui_sysinfo.py:121 msgid "Log File:" -msgstr "" +msgstr "Logifail:" #: lib\ui_sysinfo.py:122 msgid "(bzr-log-file)" -msgstr "" +msgstr "(bzr-logifail)" #: lib\ui_sysinfo.py:123 msgid "Python Interpreter" -msgstr "" +msgstr "Pythoni interpretaator" #: lib\ui_sysinfo.py:125 msgid "(python-version)" -msgstr "" +msgstr "(python-versioon)" #: lib\ui_sysinfo.py:127 msgid "(python-file)" -msgstr "" +msgstr "(python-fail)" #: lib\ui_sysinfo.py:128 msgid "Library:" -msgstr "" +msgstr "Teek:" #: lib\ui_sysinfo.py:129 msgid "(python-lib-dir)" -msgstr "" +msgstr "(python-lib-kataloog)" #: lib\ui_tag.py:88 msgid "Edit tag" -msgstr "" +msgstr "Muuda silti" #: lib\ui_tag.py:91 msgid "Tag" -msgstr "" +msgstr "Silt" #: lib\ui_tag.py:92 msgid "&Action:" -msgstr "" +msgstr "&Tegevus:" #: lib\ui_tag.py:93 msgid "Create new tag" -msgstr "" +msgstr "Loo uus silt" #: lib\ui_tag.py:94 msgid "Move existing tag" -msgstr "" +msgstr "Liiguta olemasolev silt" #: lib\ui_tag.py:95 msgid "Delete existing tag" -msgstr "" +msgstr "Kustuta olemasolev silt" #: lib\ui_tag.py:96 msgid "&Tag name:" -msgstr "" +msgstr "&Sildi nimi:" #: lib\ui_tag.py:98 msgid "&Select..." -msgstr "" +msgstr "&Vali..." #: lib\ui_update_branch.py:82 msgid "Update Branch" -msgstr "" +msgstr "Uuenda haru" #: lib\ui_update_branch.py:83 msgid "" "This directory is a branch. Please select what you would like to update" -msgstr "" +msgstr "See kataloog on haru. Palun vali see, mida soovid uuendada" #: lib\ui_update_branch.py:84 lib\ui_update_checkout.py:76 msgid "Update source" -msgstr "" +msgstr "Uuenduse allikas" #: lib\ui_update_branch.py:86 msgid "Pull most recent changes from:" -msgstr "" +msgstr "Tõmba hiljutised muudatused siit:" #: lib\ui_update_branch.py:87 msgid "Remember this as the new parent branch" -msgstr "" +msgstr "Jäta see uue ülemharuna meelde" #: lib\ui_update_branch.py:89 msgid "" -msgstr "" +msgstr "<Ülemharu näidatud siin>" #: lib\ui_update_branch.py:90 msgid "Update working tree to the latest changes in the branch" -msgstr "" +msgstr "Uuenda haru viimased muudatused tööpuule" #: lib\ui_update_checkout.py:74 msgid "Update Checkout" -msgstr "" +msgstr "Uuendamise väljavõte" #: lib\ui_update_checkout.py:75 #, python-format msgid "This directory is a checkout of: %s" -msgstr "" +msgstr "See kataloog on %s väljavõte" #: lib\ui_update_checkout.py:77 msgid "Update the working tree from the bound branch" @@ -1695,19 +1730,19 @@ #: lib\ui_update_checkout.py:78 msgid "Pull a different branch" -msgstr "" +msgstr "Tõmba erinev haru" #: lib\unbind.py:36 msgid "Unbind branch" -msgstr "" +msgstr "Sidumata haru" #: lib\unbind.py:46 msgid "Unbind" -msgstr "" +msgstr "Seo lahti" #: lib\unbind.py:54 msgid "Bound to:" -msgstr "" +msgstr "Seo siia:" #: lib\uncommit.py:40 lib\uncommit.py:124 msgid "Uncommit" @@ -1723,11 +1758,11 @@ #: lib\uncommit.py:61 msgid "Other revision:" -msgstr "" +msgstr "Teine versioon:" #: lib\uncommit.py:104 msgid "No other revision specified." -msgstr "" +msgstr "Teist versiooni pole kirjeldatud." #: lib\uncommit.py:122 msgid "Do you really want to uncommit these revisions?" @@ -1735,37 +1770,37 @@ #: lib\update.py:33 msgid "Update working tree" -msgstr "" +msgstr "Uuenda tööpuud" #: lib\update.py:34 #, python-format msgid "Update tree %s" -msgstr "" +msgstr "Uuenda puud %s" #: lib\util.py:450 msgid "Select Source Directory" -msgstr "" +msgstr "Vali allika kataloog" #: lib\util.py:452 msgid "Select Target Directory" -msgstr "" +msgstr "Vali sihtkataloog" #: lib\util.py:609 msgid "deleted files" -msgstr "" +msgstr "kustutatud failid" #: lib\util.py:611 msgid "added files" -msgstr "" +msgstr "lisatud failid" #: lib\util.py:613 msgid "renamed files" -msgstr "" +msgstr "ümbernimetatud failid" #: lib\util.py:615 msgid "modified files" -msgstr "" +msgstr "muudetud failid" #: lib\util.py:912 lib\util.py:913 lib\util.py:916 msgid "(no message)" -msgstr "" +msgstr "(sõnum puudub)" diff -Nru qbzr-0.18.6/po/qbzr-fr.po qbzr-0.19/po/qbzr-fr.po --- qbzr-0.18.6/po/qbzr-fr.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-fr.po 2010-08-05 09:10:37.000000000 -0400 @@ -8,14 +8,14 @@ "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 11:29+0000\n" -"Last-Translator: Julien Rosa \n" +"PO-Revision-Date: 2010-05-17 17:17+0000\n" +"Last-Translator: François Blondel \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 @@ -146,11 +146,11 @@ #: lib\commit.py:315 msgid "&Fixed bugs:" -msgstr "&Bugs corrigé s:" +msgstr "&Bogues corrigé s:" #: lib\commit.py:316 msgid "Set the IDs of bugs fixed by this commit" -msgstr "Définit les identifiants des bugs corrigés par ce commit" +msgstr "Définit les identifiants des bogues corrigés par ce commit" #: lib\commit.py:319 msgid "" @@ -396,11 +396,11 @@ #: lib\conflicts.py:91 msgid "&Launch..." -msgstr "" +msgstr "&Démarrer..." #: lib\conflicts.py:97 msgid "M&erge tool:" -msgstr "" +msgstr "Outil d&e fusion :" #: lib\conflicts.py:112 msgid "Auto-resolve" @@ -408,11 +408,11 @@ #: lib\conflicts.py:141 lib\treewidget.py:1598 msgid "&Merge conflict" -msgstr "" +msgstr "Conflit de &fusion" #: lib\conflicts.py:147 msgid "Mark as &resolved" -msgstr "" +msgstr "Marquer comme &résolu" #: lib\conflicts.py:177 #, python-format @@ -499,7 +499,7 @@ #: lib\diff.py:80 lib\treewidget.py:1593 msgid "Show &differences" -msgstr "" +msgstr "Montrer les &différences" #: lib\diffview.py:248 msgid "Last modified:" @@ -523,7 +523,7 @@ #: lib\diffview.py:666 msgid "\\ No newline at end of file" -msgstr "" +msgstr "\\ Pas de retour à la ligne à la fin du fichier" #: lib\diffwindow.py:77 #, python-format @@ -537,7 +537,7 @@ #: lib\diffwindow.py:98 #, python-format msgid "Rev %(rev)s for %(branch)s" -msgstr "" +msgstr "Version %(rev)s pour la branche %(branch)s" #: lib\diffwindow.py:100 #, python-format @@ -615,6 +615,8 @@ "File %s is not versioned.\n" "Operation aborted." msgstr "" +"Le fichier %s n'est pas sous contrôle de version.\n" +"Opération annulée." #: lib\diffwindow.py:396 lib\tag.py:138 lib\tag.py:169 lib\tag.py:206 #: lib\tree_branch.py:97 lib\util.py:60 lib\util.py:952 lib\util.py:962 @@ -636,12 +638,12 @@ #: lib\export.py:61 lib\export.py:80 msgid "Export" -msgstr "" +msgstr "Exporter" #: lib\export.py:75 lib\uncommit.py:51 #, python-format msgid "Branch: %s" -msgstr "" +msgstr "Branche: %s" #: lib\export.py:146 msgid "Archive type:" @@ -659,7 +661,7 @@ #: lib\help.py:59 #, python-format msgid "No help can be found for %s" -msgstr "" +msgstr "Aucune aide ne peut être trouvée pour %s" #: lib\help.py:103 msgid "Help" @@ -767,7 +769,7 @@ #: lib\log.py:418 lib\logwidget.py:132 msgid "Show &differences..." -msgstr "" +msgstr "Montrer les &différences…" #: lib\log.py:426 msgid "View file" @@ -788,7 +790,7 @@ #: lib\logmodel.py:244 #, python-format msgid "bug #%s" -msgstr "" +msgstr "bogue #%s" #: lib\logwidget.py:106 msgid "Show file &differences" @@ -971,6 +973,7 @@ #: lib\pull.py:236 msgid "Working tree has uncommitted changes." msgstr "" +"L'arborescence du travail contient des modifications non-enregistrées" #: lib\pull.py:241 msgid "Working tree is out of date, please run 'bzr update'." @@ -1023,11 +1026,11 @@ #: lib\revisionmessagebrowser.py:184 msgid "Parents:" -msgstr "" +msgstr "Parents :" #: lib\revisionmessagebrowser.py:187 msgid "Children:" -msgstr "" +msgstr "Enfants :" #: lib\revisionmessagebrowser.py:201 msgid "Uncommited Working Tree Changes" @@ -1035,7 +1038,7 @@ #: lib\revisionmessagebrowser.py:236 msgid "Date:" -msgstr "" +msgstr "Date :" #: lib\revisionmessagebrowser.py:238 msgid "Committer:" @@ -1056,8 +1059,8 @@ #: lib\revisionmessagebrowser.py:265 msgid "Bug:" msgid_plural "Bugs:" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Bogues :" +msgstr[1] "Bugs :" #: lib\revisionview.py:66 lib\ui_new_tree.py:158 msgid "Revision" @@ -1380,7 +1383,7 @@ #: lib\ui_branch.py:69 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" -msgstr "" +msgstr "&Révision :" #: lib\ui_branch.py:70 msgid "&To:" @@ -1760,11 +1763,11 @@ #: lib\util.py:450 msgid "Select Source Directory" -msgstr "" +msgstr "Choisir le répertoire source" #: lib\util.py:452 msgid "Select Target Directory" -msgstr "" +msgstr "Choisir le répertoire cible" #: lib\util.py:609 msgid "deleted files" @@ -1784,4 +1787,16 @@ #: lib\util.py:912 lib\util.py:913 lib\util.py:916 msgid "(no message)" -msgstr "" +msgstr "(aucun message)" + +#~ msgid "Line" +#~ msgstr "Ligne" + +#~ msgid "Show log..." +#~ msgstr "Afficher le log..." + +#~ msgid "&Revert..." +#~ msgstr "&Inverser..." + +#~ msgid "Stopped" +#~ msgstr "Arrêté" diff -Nru qbzr-0.18.6/po/qbzr-gl.po qbzr-0.19/po/qbzr-gl.po --- qbzr-0.18.6/po/qbzr-gl.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-gl.po 2010-08-05 09:10:37.000000000 -0400 @@ -8,14 +8,14 @@ "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 11:13+0000\n" -"Last-Translator: Alexander Belchenko \n" +"PO-Revision-Date: 2009-10-08 15:32+0000\n" +"Last-Translator: Francisco Diéguez \n" "Language-Team: Galician \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 @@ -1769,3 +1769,18 @@ #: lib\util.py:912 lib\util.py:913 lib\util.py:916 msgid "(no message)" msgstr "" + +#~ msgid "Line" +#~ msgstr "Liña" + +#~ msgid "Show log..." +#~ msgstr "Amosar rexistro..." + +#~ msgid "Extension" +#~ msgstr "Extensión" + +#~ msgid "Stopped" +#~ msgstr "Parado" + +#~ msgid "&Revert..." +#~ msgstr "&Reverter..." diff -Nru qbzr-0.18.6/po/qbzr-he.po qbzr-0.19/po/qbzr-he.po --- qbzr-0.18.6/po/qbzr-he.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-he.po 2010-08-05 09:10:37.000000000 -0400 @@ -1,21 +1,21 @@ # Hebrew translation for qbzr -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the qbzr package. -# FIRST AUTHOR , 2010. +# FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 10:29+0000\n" -"Last-Translator: FULL NAME \n" +"PO-Revision-Date: 2008-11-21 23:51+0000\n" +"Last-Translator: Yaron \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 diff -Nru qbzr-0.18.6/po/qbzr-hu.po qbzr-0.19/po/qbzr-hu.po --- qbzr-0.18.6/po/qbzr-hu.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-hu.po 2010-08-05 09:10:37.000000000 -0400 @@ -8,14 +8,14 @@ "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 10:56+0000\n" -"Last-Translator: Csörföly Dániel \n" +"PO-Revision-Date: 2010-02-28 13:26+0000\n" +"Last-Translator: Krasznecz Zoltán \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 @@ -167,7 +167,7 @@ #: lib\commit.py:333 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" -msgstr "" +msgstr "Írja be a szerző nevét, pl. John Doe <jdoe@pelda.com>" #: lib\commit.py:348 msgid "Changes" @@ -758,7 +758,7 @@ #: lib\log.py:426 msgid "View file" -msgstr "" +msgstr "Fájl megnézése" #: lib\logmodel.py:94 lib\treewidget.py:344 msgid "Rev" @@ -783,7 +783,7 @@ #: lib\logwidget.py:112 msgid "Show all &differences" -msgstr "" +msgstr "Összes mutatása &különbségek" #: lib\logwidget.py:118 msgid "Show file &differences..." @@ -851,7 +851,7 @@ #: lib\main.py:294 msgid "&Add Bookmark..." -msgstr "" +msgstr "&Könyvjelző Hozzáadása..." #: lib\main.py:301 msgid "&File" @@ -895,7 +895,7 @@ #: lib\main.py:406 msgid "About QBzr" -msgstr "" +msgstr "A QBzr Névjegye" #: lib\main.py:407 #, python-format @@ -912,11 +912,11 @@ #: lib\main.py:483 msgid "Edit Bookmark" -msgstr "" +msgstr "Könyvjelző Szerkesztése" #: lib\main.py:493 msgid "Remove Bookmark" -msgstr "" +msgstr "Könyvjelző Eltávolítása" #: lib\main.py:494 msgid "Do you really want to remove the selected bookmark?" @@ -941,7 +941,7 @@ #: lib\plugins.py:64 #, python-format msgid "Plugins installed: %(rows)d" -msgstr "" +msgstr "Bővítmények telepítve: %(rows)d" #: lib\plugins.py:71 msgid "Summary" @@ -1007,7 +1007,7 @@ #: lib\revisionmessagebrowser.py:184 msgid "Parents:" -msgstr "" +msgstr "Szülők:" #: lib\revisionmessagebrowser.py:187 msgid "Children:" @@ -1035,7 +1035,7 @@ #: lib\revisionmessagebrowser.py:253 msgid "Tags:" -msgstr "" +msgstr "Kulcsszavak:" #: lib\revisionmessagebrowser.py:265 msgid "Bug:" @@ -1117,7 +1117,7 @@ #: lib\subprocess.py:103 msgid "&Retry" -msgstr "" +msgstr "&Újra" #: lib\subprocess.py:393 msgid "Ready" @@ -1137,28 +1137,28 @@ #: lib\subprocess.py:580 lib\uifactory.py:108 msgid "Enter Password" -msgstr "" +msgstr "Jelszó Megadása" #: lib\subprocess.py:590 lib\uifactory.py:119 msgid "Enter Username" -msgstr "" +msgstr "Felhasználónév Megadása" #: lib\subprocess.py:650 lib\subprocess.py:672 msgid "Failed!" -msgstr "" +msgstr "Sikertelen!" #: lib\subprocess.py:652 msgid "Failed to start bzr." -msgstr "" +msgstr "A bzr elindítása sikertelen." #: lib\subprocess.py:654 #, python-format msgid "Error while running bzr. (error code: %d)" -msgstr "" +msgstr "Hiba a bzr futása közben. (Hibakód: %d)" #: lib\subprocess.py:662 msgid "Aborted!" -msgstr "" +msgstr "Megszakítva!" #: lib\switch.py:45 msgid "Switch" @@ -1225,7 +1225,7 @@ #: lib\tag.py:168 #, python-format msgid "Tag \"%s\" does not exists" -msgstr "" +msgstr "Az \"%s\" cimke nem létezik." #: lib\tag.py:205 #, python-format @@ -1236,7 +1236,7 @@ #: lib\treewidget.py:312 msgid "ignored" -msgstr "" +msgstr "kihagyva" #: lib\treewidget.py:314 msgid "non-versioned" @@ -1418,7 +1418,7 @@ #: lib\ui_init.py:119 msgid "Local Directory" -msgstr "" +msgstr "Helyi Könyvtár" #: lib\ui_init.py:121 msgid "Repository" @@ -1446,7 +1446,7 @@ #: lib\ui_init.py:132 msgid "Description of format" -msgstr "" +msgstr "A formátum leírása" #: lib\ui_merge.py:62 msgid "Merge" @@ -1521,7 +1521,7 @@ #: lib\ui_push.py:68 msgid "Use existing directory" -msgstr "" +msgstr "Meglévő könyvtár használata" #: lib\ui_push.py:69 msgid "Create the path up to the branch if it does not exist" @@ -1529,15 +1529,15 @@ #: lib\ui_run.py:109 msgid "Run bzr command" -msgstr "" +msgstr "bzr parancs futtatása" #: lib\ui_run.py:110 msgid "&Working directory:" -msgstr "" +msgstr "&Munkakönyvtár:" #: lib\ui_run.py:112 msgid "C&ategory:" -msgstr "" +msgstr "K&ategória:" #: lib\ui_run.py:113 msgid "&Command:" @@ -1545,7 +1545,7 @@ #: lib\ui_run.py:114 msgid "&Show hidden commands" -msgstr "" +msgstr "&Rejtett parancsok megjelenítése" #: lib\ui_run.py:115 msgid "&Options and arguments for command:" @@ -1621,7 +1621,7 @@ #: lib\ui_tag.py:88 msgid "Edit tag" -msgstr "" +msgstr "Cimke szerkesztése" #: lib\ui_tag.py:91 msgid "Tag" @@ -1629,19 +1629,19 @@ #: lib\ui_tag.py:92 msgid "&Action:" -msgstr "" +msgstr "&Művelet:" #: lib\ui_tag.py:93 msgid "Create new tag" -msgstr "" +msgstr "Új cimke létrehozása" #: lib\ui_tag.py:94 msgid "Move existing tag" -msgstr "" +msgstr "Meglévő cimke mozgatása" #: lib\ui_tag.py:95 msgid "Delete existing tag" -msgstr "" +msgstr "Meglévő cimke törlése" #: lib\ui_tag.py:96 msgid "&Tag name:" @@ -1662,7 +1662,7 @@ #: lib\ui_update_branch.py:84 lib\ui_update_checkout.py:76 msgid "Update source" -msgstr "" +msgstr "Forrás frissítése" #: lib\ui_update_branch.py:86 msgid "Pull most recent changes from:" @@ -1744,28 +1744,28 @@ #: lib\util.py:450 msgid "Select Source Directory" -msgstr "" +msgstr "Forrás Könyvtár Kiválasztása" #: lib\util.py:452 msgid "Select Target Directory" -msgstr "" +msgstr "Célkönyvtár Kiválasztása" #: lib\util.py:609 msgid "deleted files" -msgstr "" +msgstr "törölt fájlok" #: lib\util.py:611 msgid "added files" -msgstr "" +msgstr "hozzáadott fájlok" #: lib\util.py:613 msgid "renamed files" -msgstr "" +msgstr "átnevezett fájlok" #: lib\util.py:615 msgid "modified files" -msgstr "" +msgstr "módosított fájlok" #: lib\util.py:912 lib\util.py:913 lib\util.py:916 msgid "(no message)" -msgstr "" +msgstr "(nincs üzenet)" diff -Nru qbzr-0.18.6/po/qbzr-it.po qbzr-0.19/po/qbzr-it.po --- qbzr-0.18.6/po/qbzr-it.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-it.po 2010-08-05 09:10:37.000000000 -0400 @@ -8,14 +8,14 @@ "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 11:15+0000\n" +"PO-Revision-Date: 2010-01-17 12:48+0000\n" "Last-Translator: Stefano Karapetsas \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 @@ -1807,3 +1807,67 @@ #: lib\util.py:912 lib\util.py:913 lib\util.py:916 msgid "(no message)" msgstr "(nessun messaggio)" + +#~ msgid "Stopped" +#~ msgstr "Arrestato" + +#~ msgid "Show log..." +#~ msgstr "Mostra log..." + +#~ msgid "Line" +#~ msgstr "Riga" + +#~ msgid "Internal Error" +#~ msgstr "Errore Interno" + +#, python-format +#~ msgid "" +#~ "Sorry, subprocess action \"%s\" cannot be started\n" +#~ "because self.args is None.\n" +#~ "Please, report bug at:\n" +#~ "https://bugs.launchpad.net/qbzr/+filebug" +#~ msgstr "" +#~ "Il sottoprocesso \"%s\" non può essere avviato\n" +#~ "perchè self.args è None.\n" +#~ "Si prega di riportare il bug su:\n" +#~ "https://bugs.launchpad.net/qbzr/+filebug" + +#, python-format +#~ msgid "" +#~ "Tag \"%s\" already exists.\n" +#~ "Do you want to replace existing tag?" +#~ msgstr "" +#~ "Il tag \"%s\" esiste già.\n" +#~ "Si vuole rimpiazzare il tag esistente?" + +#~ msgid "&Replace" +#~ msgstr "&Rimpiazza" + +#~ msgid "Public branch location:" +#~ msgstr "Posizione branch pubblico:" + +#~ msgid "&Location" +#~ msgstr "&Posizione" + +#~ msgid "Local location:" +#~ msgstr "Posizione locale:" + +#~ msgid "" +#~ "Branch source (enter a URL or select a local directory with an exiting " +#~ "branch)" +#~ msgstr "" +#~ "Sorgente branch (inserire un URL o selezionare una directory locale con un " +#~ "branch esistente)" + +#~ msgid "Replace existing tag" +#~ msgstr "Rimpiazza tag esistente" + +#~ msgid "Extension" +#~ msgstr "Estensione" + +#~ msgid "&Revert..." +#~ msgstr "&Ripristina..." + +#, python-format +#~ msgid "Revert %s to latest revision." +#~ msgstr "Ripristina %s all'ultima revisione." diff -Nru qbzr-0.18.6/po/qbzr-ja.po qbzr-0.19/po/qbzr-ja.po --- qbzr-0.18.6/po/qbzr-ja.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-ja.po 2010-08-05 09:10:37.000000000 -0400 @@ -8,14 +8,14 @@ "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 11:35+0000\n" -"Last-Translator: Alexander Belchenko \n" +"PO-Revision-Date: 2010-05-17 05:07+0000\n" +"Last-Translator: iwata \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 @@ -1713,7 +1713,7 @@ #: lib\ui_update_checkout.py:78 msgid "Pull a different branch" -msgstr "異なるブランチにプル" +msgstr "異なるブランチからプル" #: lib\unbind.py:36 msgid "Unbind branch" @@ -1787,3 +1787,63 @@ #: lib\util.py:912 lib\util.py:913 lib\util.py:916 msgid "(no message)" msgstr "(メッセージなし)" + +#~ msgid "Line" +#~ msgstr "行" + +#~ msgid "Show log..." +#~ msgstr "ログを表示..." + +#~ msgid "&Revert..." +#~ msgstr "元に戻す(&R)..." + +#~ msgid "Stopped" +#~ msgstr "停止" + +#~ msgid "Internal Error" +#~ msgstr "内部エラー" + +#~ msgid "Replace existing tag" +#~ msgstr "既存のタグを置換" + +#, python-format +#~ msgid "" +#~ "Sorry, subprocess action \"%s\" cannot be started\n" +#~ "because self.args is None.\n" +#~ "Please, report bug at:\n" +#~ "https://bugs.launchpad.net/qbzr/+filebug" +#~ msgstr "" +#~ "サブプロセス処理 \"%s\" がself.argsがNoneのために開始されません。\n" +#~ "https://bugs.launchpad.net/qbzr/+filebugにバグレポートをしてください。" + +#, python-format +#~ msgid "" +#~ "Tag \"%s\" already exists.\n" +#~ "Do you want to replace existing tag?" +#~ msgstr "" +#~ "タグ \"%s\"は既に存在します。\n" +#~ "既存のタグを置き換えますか?" + +#~ msgid "&Replace" +#~ msgstr "置換(&R)" + +#~ msgid "Local location:" +#~ msgstr "ローカル配置:" + +#~ msgid "Public branch location:" +#~ msgstr "公開ブランチの場所:" + +#~ msgid "&Location" +#~ msgstr "ロケーション(&L)" + +#~ msgid "" +#~ "Branch source (enter a URL or select a local directory with an exiting " +#~ "branch)" +#~ msgstr "ブランチ元(URLを入力するか、ブランチのあるディレクトリを選択してください)" + +#~ msgid "Extension" +#~ msgstr "拡張子" + +#, python-format +#~ msgid "Revert %s to latest revision." +#~ msgstr "%sを最新のリビジョンに戻す" diff -Nru qbzr-0.18.6/po/qbzr-nl.po qbzr-0.19/po/qbzr-nl.po --- qbzr-0.18.6/po/qbzr-nl.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-nl.po 2010-08-05 09:10:37.000000000 -0400 @@ -8,14 +8,14 @@ "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 11:09+0000\n" +"PO-Revision-Date: 2009-11-16 17:05+0000\n" "Last-Translator: Maarten Bosmans \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 @@ -1787,3 +1787,15 @@ #: lib\util.py:912 lib\util.py:913 lib\util.py:916 msgid "(no message)" msgstr "" + +#~ msgid "Line" +#~ msgstr "Regel" + +#~ msgid "&Revert..." +#~ msgstr "&Terugzetten..." + +#~ msgid "Extension" +#~ msgstr "Extensie" + +#~ msgid "Stopped" +#~ msgstr "Gestopt" diff -Nru qbzr-0.18.6/po/qbzr-pl.po qbzr-0.19/po/qbzr-pl.po --- qbzr-0.18.6/po/qbzr-pl.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-pl.po 2010-08-05 09:10:37.000000000 -0400 @@ -1,22 +1,22 @@ # Polish translation for qbzr -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the qbzr package. -# FIRST AUTHOR , 2010. +# FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 10:29+0000\n" -"Last-Translator: FULL NAME \n" +"PO-Revision-Date: 2009-01-10 11:33+0000\n" +"Last-Translator: faw \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 @@ -42,36 +42,36 @@ #: lib\annotate.py:256 lib\cat.py:101 lib\encoding_selector.py:85 msgid "Encoding:" -msgstr "" +msgstr "Kodowanie:" #: lib\annotate.py:322 #, python-format msgid "Revision %s" -msgstr "" +msgstr "Wersja %s" #: lib\annotate.py:373 msgid "&Annotate this revision" -msgstr "" +msgstr "&Zaznacz tę rewizję" #: lib\bind.py:44 msgid "Bind branch" -msgstr "" +msgstr "Połącz gałęzię" #: lib\bind.py:54 msgid "Bind" -msgstr "" +msgstr "Połącz" #: lib\bind.py:56 msgid "Branch location:" -msgstr "" +msgstr "Położenie gałęzi:" #: lib\bind.py:60 msgid "Currently bound to:" -msgstr "" +msgstr "Obecnie przypisane do:" #: lib\bind.py:64 msgid "Bind to:" -msgstr "" +msgstr "Przypisz do:" #: lib\bind.py:68 lib\browse.py:64 lib\browse.py:234 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 @@ -85,7 +85,7 @@ #: lib\bind.py:120 msgid "Master branch location not specified." -msgstr "" +msgstr "Położenie głównej gałęzi nie sprezycowane." #: lib\browse.py:73 lib\export.py:179 lib\ui_info.py:146 msgid "Location:" @@ -102,7 +102,7 @@ #: lib\browse.py:89 lib\treewidget.py:1193 msgid "&Filter" -msgstr "" +msgstr "&Filtr" #: lib\cat.py:83 lib\cat.py:282 msgid "View" @@ -190,7 +190,7 @@ #: lib\commit.py:388 msgid "View changes in files selected to commit" -msgstr "" +msgstr "Przejrzyj zmiany w plikach wybranych do zgłoszenia" #: lib\commit.py:593 msgid "You should provide commit message." @@ -315,10 +315,11 @@ #: lib\config.py:160 msgid "Show inter-group inserts and deletes in green and red" msgstr "" +"Pokazuj wewnętrzne dodania i usunięcia w kolorze zielonym i czerwonym" #: lib\config.py:162 msgid "External Diff Apps:" -msgstr "" +msgstr "Zewnętrzny program diff:" #: lib\config.py:165 lib\main.py:353 lib\plugins.py:56 lib\plugins.py:61 msgid "Name" @@ -326,11 +327,11 @@ #: lib\config.py:192 msgid "External Merge Apps:" -msgstr "" +msgstr "Zewnętrzny program merge:" #: lib\config.py:195 msgid "Definition" -msgstr "" +msgstr "Definicja" #: lib\config.py:218 msgid "General" @@ -350,11 +351,11 @@ #: lib\config.py:222 msgid "&Diff" -msgstr "" +msgstr "&Diff" #: lib\config.py:223 msgid "&Merge" -msgstr "" +msgstr "&Merge" #: lib\config.py:248 msgid "Spell check &language:" @@ -362,16 +363,16 @@ #: lib\config.py:340 lib\diff.py:35 msgid "Builtin Diff" -msgstr "" +msgstr "Wbudowany program diff" #: lib\config.py:586 msgid "Select editor executable" -msgstr "" +msgstr "Wybierz edytor" #: lib\conflicts.py:39 lib\conflicts.py:159 lib\conflicts.py:176 #: lib\conflicts.py:183 msgid "Conflicts" -msgstr "" +msgstr "Konflikty" #: lib\conflicts.py:50 msgid "File" @@ -379,11 +380,11 @@ #: lib\conflicts.py:51 msgid "Conflict" -msgstr "" +msgstr "Konflikt" #: lib\conflicts.py:81 msgid "Use Configured Default" -msgstr "" +msgstr "Użyj domyślnej konfiguracji" #: lib\conflicts.py:83 msgid "" @@ -395,11 +396,11 @@ #: lib\conflicts.py:91 msgid "&Launch..." -msgstr "" +msgstr "&Launch..." #: lib\conflicts.py:97 msgid "M&erge tool:" -msgstr "" +msgstr "Narzędzie M&erge:" #: lib\conflicts.py:112 msgid "Auto-resolve" @@ -407,22 +408,22 @@ #: lib\conflicts.py:141 lib\treewidget.py:1598 msgid "&Merge conflict" -msgstr "" +msgstr "Konflikt &Merge" #: lib\conflicts.py:147 msgid "Mark as &resolved" -msgstr "" +msgstr "Oznacz jako &resolved" #: lib\conflicts.py:177 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Konflikt %d automatycznie rozwiązany." +msgstr[1] "Konflikty %d automatycznie rozwiązane." #: lib\conflicts.py:184 msgid "All conflicts resolved." -msgstr "" +msgstr "Wszystkie konflikty rozwiązane" #: lib\conflicts.py:240 #, python-format @@ -458,23 +459,23 @@ #: lib\conflicts.py:328 msgid "path conflict" -msgstr "" +msgstr "konflikt ścieżki" #: lib\conflicts.py:329 msgid "contents conflict" -msgstr "" +msgstr "konflikt zawartości" #: lib\conflicts.py:330 msgid "text conflict" -msgstr "" +msgstr "konflikt tekstu" #: lib\conflicts.py:331 msgid "duplicate id" -msgstr "" +msgstr "podwójne id" #: lib\conflicts.py:332 msgid "duplicate" -msgstr "" +msgstr "duplikat" #: lib\conflicts.py:333 msgid "parent loop" @@ -486,19 +487,19 @@ #: lib\conflicts.py:335 msgid "missing parent" -msgstr "" +msgstr "brakujący przodek" #: lib\conflicts.py:336 msgid "deleting parent" -msgstr "" +msgstr "usuwanie przodka" #: lib\conflicts.py:337 msgid "non-directory parent" -msgstr "" +msgstr "przodek poza katalogiem" #: lib\diff.py:80 lib\treewidget.py:1593 msgid "Show &differences" -msgstr "" +msgstr "Pokaż &differences" #: lib\diffview.py:248 msgid "Last modified:" @@ -567,11 +568,11 @@ #: lib\diffwindow.py:163 msgid "Left side encoding:" -msgstr "" +msgstr "Kodowanie lewostronne" #: lib\diffwindow.py:171 msgid "Right side encoding:" -msgstr "" +msgstr "Kodowanie prawostronne" #: lib\diffwindow.py:175 msgid "Complete" @@ -579,7 +580,7 @@ #: lib\diffwindow.py:184 msgid "Using" -msgstr "" +msgstr "Użycie" #: lib\diffwindow.py:257 #, python-format @@ -629,7 +630,7 @@ #: lib\encoding_selector.py:114 msgid "Wrong encoding" -msgstr "" +msgstr "Złe kodowanie" #: lib\encoding_selector.py:115 #, python-format @@ -638,20 +639,20 @@ #: lib\export.py:61 lib\export.py:80 msgid "Export" -msgstr "" +msgstr "Eksport" #: lib\export.py:75 lib\uncommit.py:51 #, python-format msgid "Branch: %s" -msgstr "" +msgstr "Gałąź: %s" #: lib\export.py:146 msgid "Archive type:" -msgstr "" +msgstr "Typ archiwum:" #: lib\export.py:168 msgid "Root directory name:" -msgstr "" +msgstr "Nazwa katalogu głównego:" #: lib\export.py:236 lib\ui_branch.py:66 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 @@ -709,7 +710,7 @@ #: lib\i18n.py:100 msgid "No changes selected to revert" -msgstr "" +msgstr "Nie wybrano zmian do przywrócenia" #: lib\info.py:41 msgid "Info" @@ -757,11 +758,11 @@ #: lib\log.py:149 msgid "Tags" -msgstr "" +msgstr "Znaczniki" #: lib\log.py:151 msgid "Bugs" -msgstr "" +msgstr "Błędy" #: lib\log.py:245 msgid "Messages and File text (indexed)" @@ -943,11 +944,11 @@ #: lib\plugins.py:44 msgid "Plugins" -msgstr "" +msgstr "Rozszerzenia" #: lib\plugins.py:57 msgid "Version" -msgstr "" +msgstr "Wersja" #: lib\plugins.py:58 lib\subprocess.py:355 msgid "Description" @@ -955,7 +956,7 @@ #: lib\plugins.py:62 msgid "Directory" -msgstr "" +msgstr "Katalog" #: lib\plugins.py:64 #, python-format @@ -968,11 +969,11 @@ #: lib\plugins.py:72 msgid "Locations" -msgstr "" +msgstr "Położenia" #: lib\plugins.py:111 msgid "(no description)" -msgstr "" +msgstr "(brak opisu)" #: lib\pull.py:236 msgid "Working tree has uncommitted changes." @@ -988,15 +989,15 @@ #: lib\pull.py:249 msgid "Do you want to continue anyway?" -msgstr "" +msgstr "Kontynuować mimo tego?" #: lib\pull.py:250 lib\uncommit.py:126 msgid "&Yes" -msgstr "" +msgstr "&Yes" #: lib\pull.py:250 lib\uncommit.py:126 msgid "&No" -msgstr "" +msgstr "&Nie" #: lib\revert.py:54 lib\treewidget.py:1824 msgid "Revert" @@ -1008,7 +1009,7 @@ #: lib\revert.py:83 msgid "Do not save backups of reverted files" -msgstr "" +msgstr "Nie zachowuj kopii zapasowych i przywróconych plików" #: lib\revert.py:95 msgid "Forget pending merges" @@ -1069,11 +1070,11 @@ #: lib\run.py:96 msgid "Select working directory" -msgstr "" +msgstr "Wybierz katalog roboczy" #: lib\run.py:118 msgid "&Edit" -msgstr "" +msgstr "&Edycja" #: lib\run.py:161 msgid "Help for command" @@ -1089,7 +1090,7 @@ #: lib\send.py:34 msgid "Send" -msgstr "" +msgstr "Wyślij" #: lib\send.py:47 msgid "Merge Directive Options" @@ -1097,15 +1098,15 @@ #: lib\send.py:53 msgid "Submit Branch:" -msgstr "" +msgstr "Zgłoś gałąź" #: lib\send.py:77 msgid "Public Branch:" -msgstr "" +msgstr "Opublikuj gałąź" #: lib\send.py:99 msgid "Remember these locations as defaults" -msgstr "" +msgstr "Ustaw te lokalizacje jako domyślne" #: lib\send.py:103 msgid "Include a bundle in the merge directive" @@ -1117,31 +1118,31 @@ #: lib\send.py:112 msgid "Action" -msgstr "" +msgstr "Czynność" #: lib\send.py:122 msgid "Address:" -msgstr "" +msgstr "Adres:" #: lib\send.py:132 msgid "Message:" -msgstr "" +msgstr "Wiadomość:" #: lib\send.py:149 msgid "Filename:" -msgstr "" +msgstr "Nazwa pliku:" #: lib\send.py:163 msgid "Revisions:" -msgstr "" +msgstr "Rewizje" #: lib\subprocess.py:103 msgid "&Retry" -msgstr "" +msgstr "&Ponów" #: lib\subprocess.py:393 msgid "Ready" -msgstr "" +msgstr "Gotowy" #: lib\subprocess.py:462 msgid "Starting..." @@ -1161,7 +1162,7 @@ #: lib\subprocess.py:590 lib\uifactory.py:119 msgid "Enter Username" -msgstr "" +msgstr "Wprowadż Nazwę Użytkownika" #: lib\subprocess.py:650 lib\subprocess.py:672 msgid "Failed!" @@ -1182,7 +1183,7 @@ #: lib\switch.py:45 msgid "Switch" -msgstr "" +msgstr "Przełącz" #: lib\switch.py:56 msgid "Switch checkout" @@ -1210,7 +1211,7 @@ #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" -msgstr "" +msgstr "Informacje o systemie" #: lib\tag.py:137 msgid "You should specify tag name" @@ -1225,7 +1226,7 @@ #: lib\tag.py:146 msgid "&Move" -msgstr "" +msgstr "&Przenieś" #: lib\tag.py:146 lib\tag.py:159 lib\util.py:59 msgid "&Cancel" @@ -1268,7 +1269,7 @@ #: lib\treewidget.py:317 msgid "added, missing" -msgstr "" +msgstr "dodany, brakujący" #: lib\treewidget.py:323 msgid "missing" @@ -1276,7 +1277,7 @@ #: lib\treewidget.py:330 msgid "moved" -msgstr "" +msgstr "przeniesiony" #: lib\treewidget.py:336 msgid "x-bit" @@ -1284,27 +1285,27 @@ #: lib\treewidget.py:342 msgid "File Name" -msgstr "" +msgstr "Nazwa pliku" #: lib\treewidget.py:1195 msgid "Unchanged" -msgstr "" +msgstr "Niezmieniony" #: lib\treewidget.py:1196 msgid "Changed" -msgstr "" +msgstr "Zmienione" #: lib\treewidget.py:1197 msgid "Unversioned" -msgstr "" +msgstr "Nie wersjonowane" #: lib\treewidget.py:1198 msgid "Ignored" -msgstr "" +msgstr "Ignorowany" #: lib\treewidget.py:1574 msgid "&Open" -msgstr "" +msgstr "&Otwórz" #: lib\treewidget.py:1577 msgid "&View file" @@ -1316,31 +1317,31 @@ #: lib\treewidget.py:1583 msgid "Show &log" -msgstr "" +msgstr "Pokaż &dziennik" #: lib\treewidget.py:1601 msgid "Mark conflict &resolved" -msgstr "" +msgstr "Oznacz konflikt jako &rozwiązany" #: lib\treewidget.py:1606 msgid "&Add" -msgstr "" +msgstr "Dod&aj" #: lib\treewidget.py:1609 msgid "&Revert" -msgstr "" +msgstr "&Przywróć" #: lib\treewidget.py:1612 msgid "Re&name" -msgstr "" +msgstr "Z&mień nazwę" #: lib\treewidget.py:1674 msgid "&Mark as moved and renamed" -msgstr "" +msgstr "&Oznacz jako przesunięte i o zmienionej nazwie" #: lib\treewidget.py:1676 msgid "&Mark as moved" -msgstr "" +msgstr "&Oznacz jako przesunięte" #: lib\treewidget.py:1678 msgid "&Mark as renamed" @@ -1359,6 +1360,8 @@ "Some of the files selected cannot be recoverd if removed. Are you sure you " "want to remove these files?" msgstr "" +"Niektóre z tych plików nie mogą być odzyskane po usunięciu. Czy na pewno " +"chcesz usunąć te pliki?" #: lib\treewidget.py:1951 msgid "Select / deselect all" @@ -1414,7 +1417,7 @@ #: lib\ui_info.py:154 msgid "Public branch:" -msgstr "" +msgstr "Publiczna gałąź:" #: lib\ui_info.py:156 msgid "&Related Branches" @@ -1553,23 +1556,23 @@ #: lib\ui_run.py:109 msgid "Run bzr command" -msgstr "" +msgstr "Uruchom bzr" #: lib\ui_run.py:110 msgid "&Working directory:" -msgstr "" +msgstr "&Katalog roboczy" #: lib\ui_run.py:112 msgid "C&ategory:" -msgstr "" +msgstr "Kategoria" #: lib\ui_run.py:113 msgid "&Command:" -msgstr "" +msgstr "&Polecenie:" #: lib\ui_run.py:114 msgid "&Show hidden commands" -msgstr "" +msgstr "&Pokazuj ukryte polecenia" #: lib\ui_run.py:115 msgid "&Options and arguments for command:" @@ -1589,7 +1592,7 @@ #: lib\ui_sysinfo.py:114 lib\ui_sysinfo.py:124 msgid "Version:" -msgstr "" +msgstr "Wersja:" #: lib\ui_sysinfo.py:115 msgid "(bzr-version)" @@ -1597,7 +1600,7 @@ #: lib\ui_sysinfo.py:116 lib\ui_sysinfo.py:126 msgid "Path:" -msgstr "" +msgstr "Ścieżka:" #: lib\ui_sysinfo.py:117 msgid "(bzr-lib-path)" @@ -1609,7 +1612,7 @@ #: lib\ui_sysinfo.py:119 msgid "Settings:" -msgstr "" +msgstr "Ustawienia:" #: lib\ui_sysinfo.py:120 msgid "(bzr-config-dir)" @@ -1617,7 +1620,7 @@ #: lib\ui_sysinfo.py:121 msgid "Log File:" -msgstr "" +msgstr "Plik dziennika:" #: lib\ui_sysinfo.py:122 msgid "(bzr-log-file)" @@ -1625,19 +1628,19 @@ #: lib\ui_sysinfo.py:123 msgid "Python Interpreter" -msgstr "" +msgstr "Interpreter Pythona" #: lib\ui_sysinfo.py:125 msgid "(python-version)" -msgstr "" +msgstr "(python-version)" #: lib\ui_sysinfo.py:127 msgid "(python-file)" -msgstr "" +msgstr "(python-file)" #: lib\ui_sysinfo.py:128 msgid "Library:" -msgstr "" +msgstr "Biblioteka:" #: lib\ui_sysinfo.py:129 msgid "(python-lib-dir)" @@ -1723,15 +1726,15 @@ #: lib\unbind.py:36 msgid "Unbind branch" -msgstr "" +msgstr "Odłącz gałąź" #: lib\unbind.py:46 msgid "Unbind" -msgstr "" +msgstr "Odłącz" #: lib\unbind.py:54 msgid "Bound to:" -msgstr "" +msgstr "Przypisany do:" #: lib\uncommit.py:40 lib\uncommit.py:124 msgid "Uncommit" diff -Nru qbzr-0.18.6/po/qbzr.pot qbzr-0.19/po/qbzr.pot --- qbzr-0.18.6/po/qbzr.pot 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr.pot 2010-08-05 09:10:37.000000000 -0400 @@ -11,7 +11,7 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 diff -Nru qbzr-0.18.6/po/qbzr-pt_BR.po qbzr-0.19/po/qbzr-pt_BR.po --- qbzr-0.18.6/po/qbzr-pt_BR.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-pt_BR.po 2010-08-05 09:10:37.000000000 -0400 @@ -8,14 +8,14 @@ "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 11:32+0000\n" +"PO-Revision-Date: 2009-11-16 21:09+0000\n" "Last-Translator: Fabio S Monteiro \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 @@ -1774,3 +1774,18 @@ #: lib\util.py:912 lib\util.py:913 lib\util.py:916 msgid "(no message)" msgstr "" + +#~ msgid "Line" +#~ msgstr "Linha" + +#~ msgid "Show log..." +#~ msgstr "Exibir log..." + +#~ msgid "&Revert..." +#~ msgstr "&Reverter..." + +#~ msgid "Extension" +#~ msgstr "Extensão" + +#~ msgid "Stopped" +#~ msgstr "Parado" diff -Nru qbzr-0.18.6/po/qbzr-ru.po qbzr-0.19/po/qbzr-ru.po --- qbzr-0.18.6/po/qbzr-ru.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-ru.po 2010-08-05 09:10:37.000000000 -0400 @@ -6,15 +6,15 @@ "Project-Id-Version: QBzr 0.7.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 10:59+0000\n" -"Last-Translator: Alexander Belchenko \n" +"PO-Revision-Date: 2010-06-11 08:30+0000\n" +"Last-Translator: Alex L. \n" "Language-Team: Russian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 @@ -53,7 +53,7 @@ #: lib\bind.py:44 msgid "Bind branch" -msgstr "" +msgstr "Связать ветви" #: lib\bind.py:54 msgid "Bind" @@ -83,7 +83,7 @@ #: lib\bind.py:120 msgid "Master branch location not specified." -msgstr "" +msgstr "Не указано расположение основной ветви" #: lib\browse.py:73 lib\export.py:179 lib\ui_info.py:146 msgid "Location:" @@ -407,7 +407,7 @@ #: lib\conflicts.py:141 lib\treewidget.py:1598 msgid "&Merge conflict" -msgstr "" +msgstr "&Объединить конфликты" #: lib\conflicts.py:147 msgid "Mark as &resolved" @@ -479,7 +479,7 @@ #: lib\conflicts.py:333 msgid "parent loop" -msgstr "" +msgstr "цикл родителя" #: lib\conflicts.py:334 msgid "unversioned parent" @@ -491,11 +491,11 @@ #: lib\conflicts.py:336 msgid "deleting parent" -msgstr "" +msgstr "удаление родителя" #: lib\conflicts.py:337 msgid "non-directory parent" -msgstr "" +msgstr "не каталогизированный родитель" #: lib\diff.py:80 lib\treewidget.py:1593 msgid "Show &differences" @@ -580,7 +580,7 @@ #: lib\diffwindow.py:184 msgid "Using" -msgstr "" +msgstr "Используя" #: lib\diffwindow.py:257 #, python-format @@ -718,11 +718,11 @@ #: lib\info.py:65 msgid "Location has no working tree" -msgstr "" +msgstr "Место не имеет рабочего дерева" #: lib\info.py:78 msgid "Location has no branch" -msgstr "" +msgstr "Место не имеет ветви" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" @@ -766,7 +766,7 @@ #: lib\log.py:245 msgid "Messages and File text (indexed)" -msgstr "" +msgstr "Сообщения и текстовые файлы (проиндексированные)" #: lib\log.py:418 lib\logwidget.py:132 msgid "Show &differences..." @@ -1359,16 +1359,19 @@ #: lib\treewidget.py:1825 msgid "Do you really want to revert the selected file(s)?" msgstr "" +"Вы действительно хотите вернуть выбранные файлы в исходное состояние?" #: lib\treewidget.py:1858 msgid "External Merge" -msgstr "" +msgstr "Внешние слияния" #: lib\treewidget.py:1936 msgid "" "Some of the files selected cannot be recoverd if removed. Are you sure you " "want to remove these files?" msgstr "" +"Некоторые из выбранных файлов не могут быть восстановлены, если будут " +"удалены. Вы уверены, что хотите удалить эти файлы?" #: lib\treewidget.py:1951 msgid "Select / deselect all" @@ -1416,15 +1419,15 @@ #: lib\ui_info.py:150 msgid "Push branch:" -msgstr "" +msgstr "Поместить ветвь:" #: lib\ui_info.py:152 msgid "Submit branch:" -msgstr "" +msgstr "Отправить ветвь:" #: lib\ui_info.py:154 msgid "Public branch:" -msgstr "" +msgstr "Опубликовать ветвь:" #: lib\ui_info.py:156 msgid "&Related Branches" @@ -1502,21 +1505,23 @@ #: lib\ui_new_tree.py:129 msgid "Create a new Bazaar Working Tree" -msgstr "" +msgstr "Создать новое рабочее дерево Bazaar" #: lib\ui_new_tree.py:131 msgid "" "Branch source (enter a URL or select a local directory with an existing " "branch)" msgstr "" +"Источник ветви (введите URL или выберите локальный каталог с существующей " +"ветвью)" #: lib\ui_new_tree.py:133 msgid "Local directory where the working tree will be created" -msgstr "" +msgstr "Локальный каталог, где рабочие дерево будет создано" #: lib\ui_new_tree.py:135 msgid "Working Tree Options" -msgstr "" +msgstr "Опции рабочего дерева" #: lib\ui_new_tree.py:136 msgid "Create a checkout" @@ -1575,7 +1580,7 @@ #: lib\ui_run.py:112 msgid "C&ategory:" -msgstr "" +msgstr "К&атегория:" #: lib\ui_run.py:113 msgid "&Command:" @@ -1737,19 +1742,19 @@ #: lib\unbind.py:36 msgid "Unbind branch" -msgstr "" +msgstr "Отвязать ветвь" #: lib\unbind.py:46 msgid "Unbind" -msgstr "" +msgstr "Отвязать" #: lib\unbind.py:54 msgid "Bound to:" -msgstr "" +msgstr "Связать с:" #: lib\uncommit.py:40 lib\uncommit.py:124 msgid "Uncommit" -msgstr "" +msgstr "Отменить фиксацию" #: lib\uncommit.py:57 msgid "Move tip to" @@ -1769,7 +1774,7 @@ #: lib\uncommit.py:122 msgid "Do you really want to uncommit these revisions?" -msgstr "" +msgstr "Вы действительно хотите отменить фиксацию этих изменений?" #: lib\update.py:33 msgid "Update working tree" @@ -1807,3 +1812,60 @@ #: lib\util.py:912 lib\util.py:913 lib\util.py:916 msgid "(no message)" msgstr "(нет комментария)" + +#~ msgid "Extension" +#~ msgstr "Расширение" + +#~ msgid "&Revert..." +#~ msgstr "&Вернуть предыдущую версию..." + +#~ msgid "Show log..." +#~ msgstr "Показать журнал..." + +#~ msgid "Line" +#~ msgstr "Строка" + +#~ msgid "Stopped" +#~ msgstr "Остановлено" + +#~ msgid "Local location:" +#~ msgstr "Расположение на диске" + +#~ msgid "&Location" +#~ msgstr "&Расположение" + +#, python-format +#~ msgid "Revert %s to latest revision." +#~ msgstr "Вернуться к последней версии для %s" + +#~ msgid "Public branch location:" +#~ msgstr "Публичная ветка:" + +#~ msgid "Internal Error" +#~ msgstr "Внутренняя ошибка" + +#, python-format +#~ msgid "" +#~ "Tag \"%s\" already exists.\n" +#~ "Do you want to replace existing tag?" +#~ msgstr "" +#~ "Тег \"%s\" уже существует.\n" +#~ "Хотите его изменить?" + +#~ msgid "Replace existing tag" +#~ msgstr "Изменить существующий тег" + +#, python-format +#~ msgid "" +#~ "Sorry, subprocess action \"%s\" cannot be started\n" +#~ "because self.args is None.\n" +#~ "Please, report bug at:\n" +#~ "https://bugs.launchpad.net/qbzr/+filebug" +#~ msgstr "" +#~ "Sorry, subprocess action \"%s\" cannot be started\n" +#~ "because self.args is None.\n" +#~ "Please, report bug at:\n" +#~ "https://bugs.launchpad.net/qbzr/+filebug" + +#~ msgid "&Replace" +#~ msgstr "И&зменить" diff -Nru qbzr-0.18.6/po/qbzr-sk.po qbzr-0.19/po/qbzr-sk.po --- qbzr-0.18.6/po/qbzr-sk.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-sk.po 2010-08-05 09:10:37.000000000 -0400 @@ -7,14 +7,14 @@ "Project-Id-Version: sk\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 10:59+0000\n" +"PO-Revision-Date: 2008-11-22 15:14+0000\n" "Last-Translator: Lukáš Lalinský \n" "Language-Team: Slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 @@ -1773,3 +1773,12 @@ #: lib\util.py:912 lib\util.py:913 lib\util.py:916 msgid "(no message)" msgstr "" + +#~ msgid "Extension" +#~ msgstr "Prípona" + +#~ msgid "&Revert..." +#~ msgstr "&Revertovať..." + +#~ msgid "Show log..." +#~ msgstr "Zobraziť históriu..." diff -Nru qbzr-0.18.6/po/qbzr-sl.po qbzr-0.19/po/qbzr-sl.po --- qbzr-0.18.6/po/qbzr-sl.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-sl.po 2010-08-05 09:10:37.000000000 -0400 @@ -1,14 +1,14 @@ # Slovenian translation for qbzr -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the qbzr package. -# FIRST AUTHOR , 2010. +# FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 10:29+0000\n" +"PO-Revision-Date: 2008-11-22 14:11+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Slovenian \n" "MIME-Version: 1.0\n" @@ -16,7 +16,7 @@ "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || " "n%100==4 ? 3 : 0);\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 diff -Nru qbzr-0.18.6/po/qbzr-sr.po qbzr-0.19/po/qbzr-sr.po --- qbzr-0.18.6/po/qbzr-sr.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-sr.po 2010-08-05 09:10:37.000000000 -0400 @@ -8,15 +8,15 @@ "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 11:02+0000\n" -"Last-Translator: Alexander Belchenko \n" +"PO-Revision-Date: 2009-12-11 18:52+0000\n" +"Last-Translator: Данило Шеган \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 diff -Nru qbzr-0.18.6/po/qbzr-sv.po qbzr-0.19/po/qbzr-sv.po --- qbzr-0.18.6/po/qbzr-sv.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-sv.po 2010-08-05 09:10:37.000000000 -0400 @@ -8,14 +8,14 @@ "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 11:14+0000\n" -"Last-Translator: Alexander Belchenko \n" +"PO-Revision-Date: 2010-01-11 19:10+0000\n" +"Last-Translator: Johan Helin \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 @@ -1769,3 +1769,18 @@ #: lib\util.py:912 lib\util.py:913 lib\util.py:916 msgid "(no message)" msgstr "" + +#~ msgid "Extension" +#~ msgstr "Tillägg" + +#~ msgid "Show log..." +#~ msgstr "Visa logg..." + +#~ msgid "Line" +#~ msgstr "Linje" + +#~ msgid "&Revert..." +#~ msgstr "&Återgå..." + +#~ msgid "Stopped" +#~ msgstr "Stoppad" diff -Nru qbzr-0.18.6/po/qbzr-th.po qbzr-0.19/po/qbzr-th.po --- qbzr-0.18.6/po/qbzr-th.po 1969-12-31 19:00:00.000000000 -0500 +++ qbzr-0.19/po/qbzr-th.po 2010-08-05 09:10:37.000000000 -0400 @@ -0,0 +1,1771 @@ +# Thai translation for qbzr +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the qbzr package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: qbzr\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2010-01-16 13:16+0200\n" +"PO-Revision-Date: 2010-03-12 20:23+0000\n" +"Last-Translator: Jeroen T. Vermeulen \n" +"Language-Team: Thai \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 +#: lib\config.py:201 +msgid "Add" +msgstr "เพิ่ม" + +#: lib\add.py:57 +msgid "Unversioned Files" +msgstr "" + +#: lib\add.py:104 +msgid "Show ignored files" +msgstr "" + +#: lib\annotate.py:199 lib\annotate.py:321 lib\annotate.py:325 lib\log.py:423 +msgid "Annotate" +msgstr "" + +#: lib\annotate.py:199 lib\diffwindow.py:120 lib\util.py:420 +msgid "Loading..." +msgstr "กำลังโหลด..." + +#: lib\annotate.py:256 lib\cat.py:101 lib\encoding_selector.py:85 +msgid "Encoding:" +msgstr "" + +#: lib\annotate.py:322 +#, python-format +msgid "Revision %s" +msgstr "" + +#: lib\annotate.py:373 +msgid "&Annotate this revision" +msgstr "" + +#: lib\bind.py:44 +msgid "Bind branch" +msgstr "" + +#: lib\bind.py:54 +msgid "Bind" +msgstr "" + +#: lib\bind.py:56 +msgid "Branch location:" +msgstr "" + +#: lib\bind.py:60 +msgid "Currently bound to:" +msgstr "" + +#: lib\bind.py:64 +msgid "Bind to:" +msgstr "" + +#: lib\bind.py:68 lib\browse.py:64 lib\browse.py:234 lib\export.py:182 +#: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 +#: lib\switch.py:99 +msgid "Browse" +msgstr "" + +#: lib\bind.py:109 lib\switch.py:153 lib\tag.py:190 +msgid "Select branch location" +msgstr "" + +#: lib\bind.py:120 +msgid "Master branch location not specified." +msgstr "" + +#: lib\browse.py:73 lib\export.py:179 lib\ui_info.py:146 +msgid "Location:" +msgstr "" + +#: lib\browse.py:78 lib\export.py:216 lib\revisionmessagebrowser.py:150 +#: lib\ui_new_tree.py:160 +msgid "Revision:" +msgstr "" + +#: lib\browse.py:83 +msgid "Show" +msgstr "แสดง" + +#: lib\browse.py:89 lib\treewidget.py:1193 +msgid "&Filter" +msgstr "" + +#: lib\cat.py:83 lib\cat.py:282 +msgid "View" +msgstr "" + +#: lib\commit.py:214 lib\commit.py:592 lib\commit.py:620 lib\commit.py:628 +msgid "Commit" +msgstr "" + +#: lib\commit.py:240 lib\ui_branch.py:65 lib\ui_new_tree.py:130 +#: lib\ui_tag.py:89 +msgid "Branch" +msgstr "" + +#: lib\commit.py:252 +msgid "&Local commit" +msgstr "" + +#: lib\commit.py:254 +msgid "" +"Local commits are not pushed to the master branch until a normal commit is " +"performed" +msgstr "" + +#: lib\commit.py:258 +msgid "Description:" +msgstr "คำบรรยาย:" + +#: lib\commit.py:273 lib\logmodel.py:95 lib\treewidget.py:345 +msgid "Message" +msgstr "" + +#: lib\commit.py:281 +msgid "Show non-versioned files" +msgstr "" + +#: lib\commit.py:303 +msgid "Enter the commit message" +msgstr "" + +#: lib\commit.py:315 +msgid "&Fixed bugs:" +msgstr "" + +#: lib\commit.py:316 +msgid "Set the IDs of bugs fixed by this commit" +msgstr "" + +#: lib\commit.py:319 +msgid "" +"Enter the list of bug IDs in format tag:id separated by a space, e.g. " +"project:123 project:765" +msgstr "" + +#: lib\commit.py:329 +msgid "&Author:" +msgstr "" + +#: lib\commit.py:330 +msgid "Set the author of this change, if it's different from the committer" +msgstr "" + +#: lib\commit.py:333 +msgid "" +"Enter the author's name, e.g. John Doe <jdoe@example.com>" +msgstr "" + +#: lib\commit.py:348 +msgid "Changes" +msgstr "" + +#: lib\commit.py:365 +msgid "Pending Merges" +msgstr "" + +#: lib\commit.py:376 lib\main.py:355 lib\subprocess.py:178 +#: lib\treewidget.py:347 +msgid "Status" +msgstr "" + +#: lib\commit.py:388 +msgid "View changes in files selected to commit" +msgstr "" + +#: lib\commit.py:593 +msgid "You should provide commit message." +msgstr "" + +#: lib\commit.py:594 lib\conflicts.py:180 lib\conflicts.py:185 +#: lib\diffwindow.py:403 lib\util.py:58 +msgid "&OK" +msgstr "" + +#: lib\commit.py:621 +msgid "No changes to commit." +msgstr "" + +#: lib\commit.py:629 +msgid "" +"No changes selected to commit.\n" +"Do you want to commit anyway?" +msgstr "" + +#: lib\commit.py:694 +msgid "" +"A commit will be made directly to the master branch, keeping the local and " +"master branches in sync." +msgstr "" + +#: lib\commit.py:700 +msgid "" +"A local commit to the branch will be performed. The master branch will not " +"be updated until a non-local commit is made." +msgstr "" + +#: lib\commit.py:733 lib\diff.py:104 lib\diffwindow.py:120 +#: lib\diffwindow.py:251 lib\diffwindow.py:393 lib\diffwindow.py:401 +#: lib\revert.py:298 +msgid "Diff" +msgstr "" + +#: lib\config.py:42 +msgid "Default" +msgstr "" + +#: lib\config.py:43 +msgid "Thunderbird" +msgstr "" + +#: lib\config.py:44 +msgid "Evolution" +msgstr "" + +#: lib\config.py:45 +msgid "KMail" +msgstr "" + +#: lib\config.py:46 +msgid "Mutt" +msgstr "" + +#: lib\config.py:47 +msgid "XDG e-mail client" +msgstr "" + +#: lib\config.py:48 +msgid "MAPI e-mail client" +msgstr "" + +#: lib\config.py:49 +msgid "Editor" +msgstr "" + +#: lib\config.py:71 +msgid "Configuration" +msgstr "" + +#: lib\config.py:81 lib\ui_bookmark.py:50 +msgid "&Name:" +msgstr "ชื่อ:" + +#: lib\config.py:87 +msgid "E-&mail:" +msgstr "" + +#: lib\config.py:93 lib\ui_run.py:111 lib\ui_tag.py:90 +msgid "&Browse..." +msgstr "" + +#: lib\config.py:100 +msgid "&Editor:" +msgstr "" + +#: lib\config.py:108 +msgid "E-mail &client:" +msgstr "" + +#: lib\config.py:118 +msgid "Alias" +msgstr "" + +#: lib\config.py:118 lib\config.py:166 +msgid "Command" +msgstr "คำสั่ง" + +#: lib\config.py:123 lib\config.py:144 lib\config.py:175 lib\config.py:204 +#: lib\treewidget.py:1615 lib\treewidget.py:1935 +msgid "Remove" +msgstr "" + +#: lib\config.py:139 +msgid "Abbreviation" +msgstr "" + +#: lib\config.py:139 +msgid "URL" +msgstr "" + +#: lib\config.py:160 +msgid "Show inter-group inserts and deletes in green and red" +msgstr "" + +#: lib\config.py:162 +msgid "External Diff Apps:" +msgstr "" + +#: lib\config.py:165 lib\main.py:353 lib\plugins.py:56 lib\plugins.py:61 +msgid "Name" +msgstr "ชื่อ" + +#: lib\config.py:192 +msgid "External Merge Apps:" +msgstr "" + +#: lib\config.py:195 +msgid "Definition" +msgstr "" + +#: lib\config.py:218 +msgid "General" +msgstr "" + +#: lib\config.py:219 +msgid "Aliases" +msgstr "" + +#: lib\config.py:220 +msgid "Bug Trackers" +msgstr "" + +#: lib\config.py:221 +msgid "&User Interface" +msgstr "" + +#: lib\config.py:222 +msgid "&Diff" +msgstr "" + +#: lib\config.py:223 +msgid "&Merge" +msgstr "" + +#: lib\config.py:248 +msgid "Spell check &language:" +msgstr "" + +#: lib\config.py:340 lib\diff.py:35 +msgid "Builtin Diff" +msgstr "" + +#: lib\config.py:586 +msgid "Select editor executable" +msgstr "" + +#: lib\conflicts.py:39 lib\conflicts.py:159 lib\conflicts.py:176 +#: lib\conflicts.py:183 +msgid "Conflicts" +msgstr "" + +#: lib\conflicts.py:50 +msgid "File" +msgstr "" + +#: lib\conflicts.py:51 +msgid "Conflict" +msgstr "" + +#: lib\conflicts.py:81 +msgid "Use Configured Default" +msgstr "" + +#: lib\conflicts.py:83 +msgid "" +"The merge tool configured in qconfig under Merge' file.\n" +"It follows the convention used in the bzr plugin: extmerge\n" +"external_merge = kdiff3 --output %r %b %t %o\n" +"%r is output, %b is .BASE, %t is .THIS and %o is .OTHER file." +msgstr "" + +#: lib\conflicts.py:91 +msgid "&Launch..." +msgstr "" + +#: lib\conflicts.py:97 +msgid "M&erge tool:" +msgstr "" + +#: lib\conflicts.py:112 +msgid "Auto-resolve" +msgstr "" + +#: lib\conflicts.py:141 lib\treewidget.py:1598 +msgid "&Merge conflict" +msgstr "" + +#: lib\conflicts.py:147 +msgid "Mark as &resolved" +msgstr "" + +#: lib\conflicts.py:177 +#, python-format +msgid "%d conflict auto-resolved." +msgid_plural "%d conflicts auto-resolved." +msgstr[0] "" +msgstr[1] "" + +#: lib\conflicts.py:184 +msgid "All conflicts resolved." +msgstr "" + +#: lib\conflicts.py:240 +#, python-format +msgid "Error while running merge tool (code %d)" +msgstr "" + +#: lib\conflicts.py:241 lib\conflicts.py:305 lib\tag.py:204 lib\trace.py:186 +#: lib\trace.py:200 lib\tree_branch.py:95 lib\util.py:949 lib\util.py:959 +msgid "Error" +msgstr "" + +#: lib\conflicts.py:281 +msgid "Set up external_merge app in qconfig under the Merge tab" +msgstr "" + +#: lib\conflicts.py:306 +#, python-format +msgid "" +"The extmerge definition: '%(tool)s' is invalid.\n" +"Missing the flag: %(flags)s. This must be fixed in qconfig under the Merge " +"tab." +msgstr "" + +#: lib\conflicts.py:312 +#, python-format +msgid "Missing the flag: %s. Configure in qconfig under the merge tab." +msgstr "" + +#: lib\conflicts.py:320 +#, python-format +msgid "%s (Configured external merge definition in qconfig)" +msgstr "" + +#: lib\conflicts.py:328 +msgid "path conflict" +msgstr "" + +#: lib\conflicts.py:329 +msgid "contents conflict" +msgstr "" + +#: lib\conflicts.py:330 +msgid "text conflict" +msgstr "" + +#: lib\conflicts.py:331 +msgid "duplicate id" +msgstr "" + +#: lib\conflicts.py:332 +msgid "duplicate" +msgstr "" + +#: lib\conflicts.py:333 +msgid "parent loop" +msgstr "" + +#: lib\conflicts.py:334 +msgid "unversioned parent" +msgstr "" + +#: lib\conflicts.py:335 +msgid "missing parent" +msgstr "" + +#: lib\conflicts.py:336 +msgid "deleting parent" +msgstr "" + +#: lib\conflicts.py:337 +msgid "non-directory parent" +msgstr "" + +#: lib\diff.py:80 lib\treewidget.py:1593 +msgid "Show &differences" +msgstr "" + +#: lib\diffview.py:248 +msgid "Last modified:" +msgstr "" + +#: lib\diffview.py:249 +msgid "Status:" +msgstr "" + +#: lib\diffview.py:250 +msgid "Kind:" +msgstr "" + +#: lib\diffview.py:251 +msgid "Properties:" +msgstr "" + +#: lib\diffview.py:485 +msgid "[binary file]" +msgstr "" + +#: lib\diffview.py:666 +msgid "\\ No newline at end of file" +msgstr "" + +#: lib\diffwindow.py:77 +#, python-format +msgid "Working Tree for %s" +msgstr "" + +#: lib\diffwindow.py:79 +msgid "Working Tree" +msgstr "" + +#: lib\diffwindow.py:98 +#, python-format +msgid "Rev %(rev)s for %(branch)s" +msgstr "" + +#: lib\diffwindow.py:100 +#, python-format +msgid "Rev %s" +msgstr "" + +#: lib\diffwindow.py:103 +#, python-format +msgid "Revid: %(revid)s for %(branch)s" +msgstr "" + +#: lib\diffwindow.py:105 +#, python-format +msgid "Revid: %s" +msgstr "" + +#: lib\diffwindow.py:108 +msgid "Merge Preview" +msgstr "" + +#: lib\diffwindow.py:146 +msgid "Side by side" +msgstr "" + +#: lib\diffwindow.py:153 +msgid "Unidiff" +msgstr "" + +#: lib\diffwindow.py:163 +msgid "Left side encoding:" +msgstr "" + +#: lib\diffwindow.py:171 +msgid "Right side encoding:" +msgstr "" + +#: lib\diffwindow.py:175 +msgid "Complete" +msgstr "" + +#: lib\diffwindow.py:184 +msgid "Using" +msgstr "" + +#: lib\diffwindow.py:257 +#, python-format +msgid "%d file" +msgid_plural "%d files" +msgstr[0] "" +msgstr[1] "" + +#: lib\diffwindow.py:332 lib\treewidget.py:321 +msgid "removed" +msgstr "" + +#: lib\diffwindow.py:334 lib\treewidget.py:319 +msgid "added" +msgstr "" + +#: lib\diffwindow.py:336 +msgid "renamed and modified" +msgstr "" + +#: lib\diffwindow.py:338 lib\treewidget.py:332 +msgid "renamed" +msgstr "" + +#: lib\diffwindow.py:340 lib\treewidget.py:334 +msgid "modified" +msgstr "" + +#: lib\diffwindow.py:394 +#, python-format +msgid "" +"File %s is not versioned.\n" +"Operation aborted." +msgstr "" + +#: lib\diffwindow.py:396 lib\tag.py:138 lib\tag.py:169 lib\tag.py:206 +#: lib\tree_branch.py:97 lib\util.py:60 lib\util.py:952 lib\util.py:962 +msgid "&Close" +msgstr "" + +#: lib\diffwindow.py:402 +msgid "No changes found." +msgstr "" + +#: lib\encoding_selector.py:114 +msgid "Wrong encoding" +msgstr "" + +#: lib\encoding_selector.py:115 +#, python-format +msgid "Encoding \"%s\" is invalid or not supported." +msgstr "" + +#: lib\export.py:61 lib\export.py:80 +msgid "Export" +msgstr "" + +#: lib\export.py:75 lib\uncommit.py:51 +#, python-format +msgid "Branch: %s" +msgstr "" + +#: lib\export.py:146 +msgid "Archive type:" +msgstr "" + +#: lib\export.py:168 +msgid "Root directory name:" +msgstr "" + +#: lib\export.py:236 lib\ui_branch.py:66 lib\ui_merge.py:63 lib\ui_pull.py:61 +#: lib\ui_push.py:63 +msgid "Options" +msgstr "" + +#: lib\help.py:59 +#, python-format +msgid "No help can be found for %s" +msgstr "" + +#: lib\help.py:103 +msgid "Help" +msgstr "" + +#: lib\i18n.py:87 +msgid "file" +msgstr "" + +#: lib\i18n.py:88 +msgid "directory" +msgstr "" + +#: lib\i18n.py:89 +msgid "symlink" +msgstr "" + +#: lib\i18n.py:91 +msgid "fixed" +msgstr "" + +#: lib\i18n.py:93 +msgid "View text file" +msgstr "" + +#: lib\i18n.py:94 +msgid "View image file" +msgstr "" + +#: lib\i18n.py:95 +msgid "View binary file" +msgstr "" + +#: lib\i18n.py:96 +msgid "View symlink" +msgstr "" + +#: lib\i18n.py:97 +msgid "View directory" +msgstr "" + +#: lib\i18n.py:99 +msgid "No changes selected to commit" +msgstr "" + +#: lib\i18n.py:100 +msgid "No changes selected to revert" +msgstr "" + +#: lib\info.py:41 +msgid "Info" +msgstr "" + +#: lib\info.py:65 +msgid "Location has no working tree" +msgstr "" + +#: lib\info.py:78 +msgid "Location has no branch" +msgstr "" + +#: lib\init.py:37 lib\ui_init.py:118 +msgid "Initialize" +msgstr "" + +#: lib\init.py:72 +msgid "You must specify a location" +msgstr "" + +#: lib\log.py:98 +msgid "Log" +msgstr "" + +#: lib\log.py:125 +msgid "&Search:" +msgstr "" + +#: lib\log.py:141 +msgid "Messages" +msgstr "" + +#: lib\log.py:143 +msgid "Authors" +msgstr "" + +#: lib\log.py:145 +msgid "Revision IDs" +msgstr "" + +#: lib\log.py:147 +msgid "Revision Numbers" +msgstr "" + +#: lib\log.py:149 +msgid "Tags" +msgstr "" + +#: lib\log.py:151 +msgid "Bugs" +msgstr "" + +#: lib\log.py:245 +msgid "Messages and File text (indexed)" +msgstr "" + +#: lib\log.py:418 lib\logwidget.py:132 +msgid "Show &differences..." +msgstr "" + +#: lib\log.py:426 +msgid "View file" +msgstr "" + +#: lib\logmodel.py:94 lib\treewidget.py:344 +msgid "Rev" +msgstr "" + +#: lib\logmodel.py:96 lib\treewidget.py:343 +msgid "Date" +msgstr "" + +#: lib\logmodel.py:97 lib\treewidget.py:346 +msgid "Author" +msgstr "" + +#: lib\logmodel.py:244 +#, python-format +msgid "bug #%s" +msgstr "" + +#: lib\logwidget.py:106 +msgid "Show file &differences" +msgstr "" + +#: lib\logwidget.py:112 +msgid "Show all &differences" +msgstr "" + +#: lib\logwidget.py:118 +msgid "Show file &differences..." +msgstr "" + +#: lib\logwidget.py:122 +msgid "Show all &differences..." +msgstr "" + +#: lib\logwidget.py:140 +msgid "Show &tree..." +msgstr "" + +#: lib\logwidget.py:142 +msgid "Tag &revision..." +msgstr "" + +#: lib\main.py:120 +msgid "Computer" +msgstr "" + +#: lib\main.py:149 +msgid "&Edit Bookmark..." +msgstr "" + +#: lib\main.py:150 +msgid "&Remove Bookmark..." +msgstr "" + +#: lib\main.py:165 +msgid "Bookmarks" +msgstr "" + +#: lib\main.py:274 lib\util.py:62 +msgid "&Refresh" +msgstr "" + +#: lib\main.py:276 +msgid "Refresh the directory tree" +msgstr "" + +#: lib\main.py:280 +msgid "&Commit" +msgstr "" + +#: lib\main.py:281 +msgid "Commit changes into a new revision" +msgstr "" + +#: lib\main.py:285 +msgid "&Push" +msgstr "" + +#: lib\main.py:286 +msgid "Turn this branch into a mirror of another branch" +msgstr "" + +#: lib\main.py:290 +msgid "Pu&ll" +msgstr "" + +#: lib\main.py:291 +msgid "Update a mirror of this branch" +msgstr "" + +#: lib\main.py:294 +msgid "&Add Bookmark..." +msgstr "" + +#: lib\main.py:301 +msgid "&File" +msgstr "" + +#: lib\main.py:302 +msgid "&Configure..." +msgstr "" + +#: lib\main.py:304 +msgid "&Quit" +msgstr "" + +#: lib\main.py:305 +msgid "&View" +msgstr "" + +#: lib\main.py:307 +msgid "&Branch" +msgstr "" + +#: lib\main.py:311 +msgid "&Bookmarks" +msgstr "" + +#: lib\main.py:313 lib\util.py:61 +msgid "&Help" +msgstr "" + +#: lib\main.py:314 +msgid "&Help..." +msgstr "" + +#: lib\main.py:316 +msgid "&About..." +msgstr "" + +#: lib\main.py:354 +msgid "Size" +msgstr "" + +#: lib\main.py:406 +msgid "About QBzr" +msgstr "" + +#: lib\main.py:407 +#, python-format +msgid "" +"QBzr — A graphical user interface for Bazaar
Version " +"%(qbzr_version)s (bzrlib %(bzrlib_version)s)

Copyright © 2006-" +"2008 Lukáš Lalinský and others

http://bazaar-vcs.org/QBzr" +msgstr "" + +#: lib\main.py:472 +msgid "Add Bookmark" +msgstr "" + +#: lib\main.py:483 +msgid "Edit Bookmark" +msgstr "" + +#: lib\main.py:493 +msgid "Remove Bookmark" +msgstr "" + +#: lib\main.py:494 +msgid "Do you really want to remove the selected bookmark?" +msgstr "" + +#: lib\plugins.py:44 +msgid "Plugins" +msgstr "" + +#: lib\plugins.py:57 +msgid "Version" +msgstr "" + +#: lib\plugins.py:58 lib\subprocess.py:355 +msgid "Description" +msgstr "" + +#: lib\plugins.py:62 +msgid "Directory" +msgstr "" + +#: lib\plugins.py:64 +#, python-format +msgid "Plugins installed: %(rows)d" +msgstr "" + +#: lib\plugins.py:71 +msgid "Summary" +msgstr "" + +#: lib\plugins.py:72 +msgid "Locations" +msgstr "" + +#: lib\plugins.py:111 +msgid "(no description)" +msgstr "" + +#: lib\pull.py:236 +msgid "Working tree has uncommitted changes." +msgstr "" + +#: lib\pull.py:241 +msgid "Working tree is out of date, please run 'bzr update'." +msgstr "" + +#: lib\pull.py:247 lib\ui_push.py:62 +msgid "Push" +msgstr "" + +#: lib\pull.py:249 +msgid "Do you want to continue anyway?" +msgstr "" + +#: lib\pull.py:250 lib\uncommit.py:126 +msgid "&Yes" +msgstr "" + +#: lib\pull.py:250 lib\uncommit.py:126 +msgid "&No" +msgstr "" + +#: lib\revert.py:54 lib\treewidget.py:1824 +msgid "Revert" +msgstr "" + +#: lib\revert.py:65 +msgid "Select changes to revert" +msgstr "" + +#: lib\revert.py:83 +msgid "Do not save backups of reverted files" +msgstr "" + +#: lib\revert.py:95 +msgid "Forget pending merges" +msgstr "" + +#: lib\revert.py:144 +msgid "View changes in files selected to revert" +msgstr "" + +#: lib\revert.py:242 +msgid "" +"You are reverting all changed paths without also reverting pending merges. " +"Do you want to continue?" +msgstr "" + +#: lib\revisionmessagebrowser.py:184 +msgid "Parents:" +msgstr "" + +#: lib\revisionmessagebrowser.py:187 +msgid "Children:" +msgstr "" + +#: lib\revisionmessagebrowser.py:201 +msgid "Uncommited Working Tree Changes" +msgstr "" + +#: lib\revisionmessagebrowser.py:236 +msgid "Date:" +msgstr "" + +#: lib\revisionmessagebrowser.py:238 +msgid "Committer:" +msgstr "" + +#: lib\revisionmessagebrowser.py:244 +msgid "Author:" +msgstr "" + +#: lib\revisionmessagebrowser.py:248 lib\unbind.py:49 +msgid "Branch:" +msgstr "" + +#: lib\revisionmessagebrowser.py:253 +msgid "Tags:" +msgstr "" + +#: lib\revisionmessagebrowser.py:265 +msgid "Bug:" +msgid_plural "Bugs:" +msgstr[0] "" +msgstr[1] "" + +#: lib\revisionview.py:66 lib\ui_new_tree.py:158 +msgid "Revision" +msgstr "" + +#: lib\run.py:96 +msgid "Select working directory" +msgstr "" + +#: lib\run.py:118 +msgid "&Edit" +msgstr "" + +#: lib\run.py:161 +msgid "Help for command" +msgstr "" + +#: lib\run.py:278 +msgid "Select path to insert" +msgstr "" + +#: lib\run.py:288 +msgid "Select files to insert" +msgstr "" + +#: lib\send.py:34 +msgid "Send" +msgstr "" + +#: lib\send.py:47 +msgid "Merge Directive Options" +msgstr "" + +#: lib\send.py:53 +msgid "Submit Branch:" +msgstr "" + +#: lib\send.py:77 +msgid "Public Branch:" +msgstr "" + +#: lib\send.py:99 +msgid "Remember these locations as defaults" +msgstr "" + +#: lib\send.py:103 +msgid "Include a bundle in the merge directive" +msgstr "" + +#: lib\send.py:107 +msgid "Include a preview patch in the merge directive" +msgstr "" + +#: lib\send.py:112 +msgid "Action" +msgstr "" + +#: lib\send.py:122 +msgid "Address:" +msgstr "" + +#: lib\send.py:132 +msgid "Message:" +msgstr "" + +#: lib\send.py:149 +msgid "Filename:" +msgstr "" + +#: lib\send.py:163 +msgid "Revisions:" +msgstr "" + +#: lib\subprocess.py:103 +msgid "&Retry" +msgstr "" + +#: lib\subprocess.py:393 +msgid "Ready" +msgstr "" + +#: lib\subprocess.py:462 +msgid "Starting..." +msgstr "" + +#: lib\subprocess.py:539 +msgid "Aborting..." +msgstr "" + +#: lib\subprocess.py:550 lib\subprocess.py:669 +msgid "Finished!" +msgstr "" + +#: lib\subprocess.py:580 lib\uifactory.py:108 +msgid "Enter Password" +msgstr "" + +#: lib\subprocess.py:590 lib\uifactory.py:119 +msgid "Enter Username" +msgstr "" + +#: lib\subprocess.py:650 lib\subprocess.py:672 +msgid "Failed!" +msgstr "" + +#: lib\subprocess.py:652 +msgid "Failed to start bzr." +msgstr "" + +#: lib\subprocess.py:654 +#, python-format +msgid "Error while running bzr. (error code: %d)" +msgstr "" + +#: lib\subprocess.py:662 +msgid "Aborted!" +msgstr "" + +#: lib\switch.py:45 +msgid "Switch" +msgstr "" + +#: lib\switch.py:56 +msgid "Switch checkout" +msgstr "" + +#: lib\switch.py:64 +msgid "Heavyweight checkout:" +msgstr "" + +#: lib\switch.py:68 +msgid "Lightweight checkout:" +msgstr "" + +#: lib\switch.py:75 +msgid "Checkout of branch:" +msgstr "" + +#: lib\switch.py:88 +msgid "Switch to branch:" +msgstr "" + +#: lib\switch.py:112 +msgid "Create Branch before switching" +msgstr "" + +#: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 +msgid "System Information" +msgstr "" + +#: lib\tag.py:137 +msgid "You should specify tag name" +msgstr "" + +#: lib\tag.py:143 +#, python-format +msgid "" +"Tag \"%s\" already exists.\n" +"Do you want to move existing tag?" +msgstr "" + +#: lib\tag.py:146 +msgid "&Move" +msgstr "" + +#: lib\tag.py:146 lib\tag.py:159 lib\util.py:59 +msgid "&Cancel" +msgstr "" + +#: lib\tag.py:156 +#, python-format +msgid "" +"Tag \"%s\" does not exists yet.\n" +"Do you want to create new tag?" +msgstr "" + +#: lib\tag.py:159 +msgid "Cre&ate" +msgstr "" + +#: lib\tag.py:168 +#, python-format +msgid "Tag \"%s\" does not exists" +msgstr "" + +#: lib\tag.py:205 +#, python-format +msgid "" +"Not a branch:\n" +"%s" +msgstr "" + +#: lib\treewidget.py:312 +msgid "ignored" +msgstr "" + +#: lib\treewidget.py:314 +msgid "non-versioned" +msgstr "" + +#: lib\treewidget.py:317 +msgid "added, missing" +msgstr "" + +#: lib\treewidget.py:323 +msgid "missing" +msgstr "" + +#: lib\treewidget.py:330 +msgid "moved" +msgstr "" + +#: lib\treewidget.py:336 +msgid "x-bit" +msgstr "" + +#: lib\treewidget.py:342 +msgid "File Name" +msgstr "" + +#: lib\treewidget.py:1195 +msgid "Unchanged" +msgstr "" + +#: lib\treewidget.py:1196 +msgid "Changed" +msgstr "" + +#: lib\treewidget.py:1197 +msgid "Unversioned" +msgstr "" + +#: lib\treewidget.py:1198 +msgid "Ignored" +msgstr "" + +#: lib\treewidget.py:1574 +msgid "&Open" +msgstr "" + +#: lib\treewidget.py:1577 +msgid "&View file" +msgstr "" + +#: lib\treewidget.py:1580 +msgid "Show &annotate" +msgstr "" + +#: lib\treewidget.py:1583 +msgid "Show &log" +msgstr "" + +#: lib\treewidget.py:1601 +msgid "Mark conflict &resolved" +msgstr "" + +#: lib\treewidget.py:1606 +msgid "&Add" +msgstr "" + +#: lib\treewidget.py:1609 +msgid "&Revert" +msgstr "" + +#: lib\treewidget.py:1612 +msgid "Re&name" +msgstr "" + +#: lib\treewidget.py:1674 +msgid "&Mark as moved and renamed" +msgstr "" + +#: lib\treewidget.py:1676 +msgid "&Mark as moved" +msgstr "" + +#: lib\treewidget.py:1678 +msgid "&Mark as renamed" +msgstr "" + +#: lib\treewidget.py:1825 +msgid "Do you really want to revert the selected file(s)?" +msgstr "" + +#: lib\treewidget.py:1858 +msgid "External Merge" +msgstr "" + +#: lib\treewidget.py:1936 +msgid "" +"Some of the files selected cannot be recoverd if removed. Are you sure you " +"want to remove these files?" +msgstr "" + +#: lib\treewidget.py:1951 +msgid "Select / deselect all" +msgstr "" + +#: lib\tree_branch.py:91 lib\util.py:950 +#, python-format +msgid "Not a branch \"%s\"" +msgstr "" + +#: lib\tree_branch.py:93 lib\util.py:960 +#, python-format +msgid "No working tree exists for \"%s\"" +msgstr "" + +#: lib\ui_bookmark.py:51 lib\ui_branch.py:67 lib\ui_merge.py:64 +#: lib\ui_pull.py:62 lib\ui_push.py:64 +msgid "&Location:" +msgstr "" + +#: lib\ui_branch.py:68 lib\ui_branch.py:71 lib\ui_init.py:120 +#: lib\ui_merge.py:65 lib\ui_new_tree.py:132 lib\ui_new_tree.py:134 +#: lib\ui_pull.py:63 lib\ui_push.py:65 lib\ui_update_branch.py:85 +#: lib\ui_update_checkout.py:79 +msgid "Browse..." +msgstr "" + +#: lib\ui_branch.py:69 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 +msgid "&Revision:" +msgstr "" + +#: lib\ui_branch.py:70 +msgid "&To:" +msgstr "" + +#: lib\ui_info.py:147 lib\ui_info.py:149 lib\ui_info.py:151 lib\ui_info.py:153 +#: lib\ui_info.py:155 lib\ui_info.py:158 lib\ui_info.py:160 lib\ui_info.py:162 +#: lib\ui_info.py:164 +msgid "..." +msgstr "" + +#: lib\ui_info.py:148 +msgid "Parent branch:" +msgstr "" + +#: lib\ui_info.py:150 +msgid "Push branch:" +msgstr "" + +#: lib\ui_info.py:152 +msgid "Submit branch:" +msgstr "" + +#: lib\ui_info.py:154 +msgid "Public branch:" +msgstr "" + +#: lib\ui_info.py:156 +msgid "&Related Branches" +msgstr "" + +#: lib\ui_info.py:157 +msgid "Working tree format:" +msgstr "" + +#: lib\ui_info.py:159 +msgid "Branch format:" +msgstr "" + +#: lib\ui_info.py:161 +msgid "Repository format:" +msgstr "" + +#: lib\ui_info.py:163 +msgid "Control directory format:" +msgstr "" + +#: lib\ui_info.py:165 +msgid "&Format" +msgstr "" + +#: lib\ui_init.py:119 +msgid "Local Directory" +msgstr "" + +#: lib\ui_init.py:121 +msgid "Repository" +msgstr "" + +#: lib\ui_init.py:122 +msgid "Create a new standalone tree" +msgstr "" + +#: lib\ui_init.py:123 +msgid "Ensure all revisions are appended to the log" +msgstr "" + +#: lib\ui_init.py:124 +msgid "Create a new shared repository" +msgstr "" + +#: lib\ui_init.py:125 +msgid "Skip the creation of working trees in this repository" +msgstr "" + +#: lib\ui_init.py:131 +msgid "Repository Format:" +msgstr "" + +#: lib\ui_init.py:132 +msgid "Description of format" +msgstr "" + +#: lib\ui_merge.py:62 +msgid "Merge" +msgstr "" + +#: lib\ui_merge.py:67 lib\ui_pull.py:65 lib\ui_push.py:66 +msgid "Remember this location as a default" +msgstr "" + +#: lib\ui_merge.py:68 +msgid "Merge even if the working tree has uncommitted changes" +msgstr "" + +#: lib\ui_merge.py:69 +msgid "Merge uncommitted changes instead of committed ones" +msgstr "" + +#: lib\ui_new_tree.py:129 +msgid "Create a new Bazaar Working Tree" +msgstr "" + +#: lib\ui_new_tree.py:131 +msgid "" +"Branch source (enter a URL or select a local directory with an existing " +"branch)" +msgstr "" + +#: lib\ui_new_tree.py:133 +msgid "Local directory where the working tree will be created" +msgstr "" + +#: lib\ui_new_tree.py:135 +msgid "Working Tree Options" +msgstr "" + +#: lib\ui_new_tree.py:136 +msgid "Create a checkout" +msgstr "" + +#: lib\ui_new_tree.py:144 +msgid "Light-weight checkout" +msgstr "" + +#: lib\ui_new_tree.py:145 +msgid "Make a local copy of the branch" +msgstr "" + +#: lib\ui_new_tree.py:151 +msgid "Create a stacked branch referring to the source branch" +msgstr "" + +#: lib\ui_new_tree.py:152 +msgid "Click a link for more information about checkouts and branches." +msgstr "" + +#: lib\ui_new_tree.py:159 +msgid "Most recent (tip) revision" +msgstr "" + +#: lib\ui_new_tree.py:161 +msgid "Show Log..." +msgstr "" + +#: lib\ui_pull.py:60 +msgid "Pull" +msgstr "" + +#: lib\ui_pull.py:66 lib\ui_push.py:67 lib\ui_update_branch.py:88 +#: lib\ui_update_checkout.py:80 +msgid "Overwrite differences between branches" +msgstr "" + +#: lib\ui_push.py:68 +msgid "Use existing directory" +msgstr "" + +#: lib\ui_push.py:69 +msgid "Create the path up to the branch if it does not exist" +msgstr "" + +#: lib\ui_run.py:109 +msgid "Run bzr command" +msgstr "" + +#: lib\ui_run.py:110 +msgid "&Working directory:" +msgstr "" + +#: lib\ui_run.py:112 +msgid "C&ategory:" +msgstr "" + +#: lib\ui_run.py:113 +msgid "&Command:" +msgstr "" + +#: lib\ui_run.py:114 +msgid "&Show hidden commands" +msgstr "" + +#: lib\ui_run.py:115 +msgid "&Options and arguments for command:" +msgstr "" + +#: lib\ui_run.py:116 +msgid "Insert &directory..." +msgstr "" + +#: lib\ui_run.py:117 +msgid "Insert &filenames..." +msgstr "" + +#: lib\ui_sysinfo.py:113 +msgid "Bazaar Library" +msgstr "" + +#: lib\ui_sysinfo.py:114 lib\ui_sysinfo.py:124 +msgid "Version:" +msgstr "" + +#: lib\ui_sysinfo.py:115 +msgid "(bzr-version)" +msgstr "" + +#: lib\ui_sysinfo.py:116 lib\ui_sysinfo.py:126 +msgid "Path:" +msgstr "" + +#: lib\ui_sysinfo.py:117 +msgid "(bzr-lib-path)" +msgstr "" + +#: lib\ui_sysinfo.py:118 +msgid "Bazaar Configuration" +msgstr "" + +#: lib\ui_sysinfo.py:119 +msgid "Settings:" +msgstr "" + +#: lib\ui_sysinfo.py:120 +msgid "(bzr-config-dir)" +msgstr "" + +#: lib\ui_sysinfo.py:121 +msgid "Log File:" +msgstr "" + +#: lib\ui_sysinfo.py:122 +msgid "(bzr-log-file)" +msgstr "" + +#: lib\ui_sysinfo.py:123 +msgid "Python Interpreter" +msgstr "" + +#: lib\ui_sysinfo.py:125 +msgid "(python-version)" +msgstr "" + +#: lib\ui_sysinfo.py:127 +msgid "(python-file)" +msgstr "" + +#: lib\ui_sysinfo.py:128 +msgid "Library:" +msgstr "" + +#: lib\ui_sysinfo.py:129 +msgid "(python-lib-dir)" +msgstr "" + +#: lib\ui_tag.py:88 +msgid "Edit tag" +msgstr "" + +#: lib\ui_tag.py:91 +msgid "Tag" +msgstr "" + +#: lib\ui_tag.py:92 +msgid "&Action:" +msgstr "" + +#: lib\ui_tag.py:93 +msgid "Create new tag" +msgstr "" + +#: lib\ui_tag.py:94 +msgid "Move existing tag" +msgstr "" + +#: lib\ui_tag.py:95 +msgid "Delete existing tag" +msgstr "" + +#: lib\ui_tag.py:96 +msgid "&Tag name:" +msgstr "" + +#: lib\ui_tag.py:98 +msgid "&Select..." +msgstr "" + +#: lib\ui_update_branch.py:82 +msgid "Update Branch" +msgstr "" + +#: lib\ui_update_branch.py:83 +msgid "" +"This directory is a branch. Please select what you would like to update" +msgstr "" + +#: lib\ui_update_branch.py:84 lib\ui_update_checkout.py:76 +msgid "Update source" +msgstr "" + +#: lib\ui_update_branch.py:86 +msgid "Pull most recent changes from:" +msgstr "" + +#: lib\ui_update_branch.py:87 +msgid "Remember this as the new parent branch" +msgstr "" + +#: lib\ui_update_branch.py:89 +msgid "" +msgstr "" + +#: lib\ui_update_branch.py:90 +msgid "Update working tree to the latest changes in the branch" +msgstr "" + +#: lib\ui_update_checkout.py:74 +msgid "Update Checkout" +msgstr "" + +#: lib\ui_update_checkout.py:75 +#, python-format +msgid "This directory is a checkout of: %s" +msgstr "" + +#: lib\ui_update_checkout.py:77 +msgid "Update the working tree from the bound branch" +msgstr "" + +#: lib\ui_update_checkout.py:78 +msgid "Pull a different branch" +msgstr "" + +#: lib\unbind.py:36 +msgid "Unbind branch" +msgstr "" + +#: lib\unbind.py:46 +msgid "Unbind" +msgstr "" + +#: lib\unbind.py:54 +msgid "Bound to:" +msgstr "" + +#: lib\uncommit.py:40 lib\uncommit.py:124 +msgid "Uncommit" +msgstr "" + +#: lib\uncommit.py:57 +msgid "Move tip to" +msgstr "" + +#: lib\uncommit.py:59 +msgid "Parent of current tip revision" +msgstr "" + +#: lib\uncommit.py:61 +msgid "Other revision:" +msgstr "" + +#: lib\uncommit.py:104 +msgid "No other revision specified." +msgstr "" + +#: lib\uncommit.py:122 +msgid "Do you really want to uncommit these revisions?" +msgstr "" + +#: lib\update.py:33 +msgid "Update working tree" +msgstr "" + +#: lib\update.py:34 +#, python-format +msgid "Update tree %s" +msgstr "" + +#: lib\util.py:450 +msgid "Select Source Directory" +msgstr "" + +#: lib\util.py:452 +msgid "Select Target Directory" +msgstr "" + +#: lib\util.py:609 +msgid "deleted files" +msgstr "" + +#: lib\util.py:611 +msgid "added files" +msgstr "" + +#: lib\util.py:613 +msgid "renamed files" +msgstr "" + +#: lib\util.py:615 +msgid "modified files" +msgstr "" + +#: lib\util.py:912 lib\util.py:913 lib\util.py:916 +msgid "(no message)" +msgstr "" diff -Nru qbzr-0.18.6/po/qbzr-tr.po qbzr-0.19/po/qbzr-tr.po --- qbzr-0.18.6/po/qbzr-tr.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-tr.po 2010-08-05 09:10:37.000000000 -0400 @@ -8,14 +8,14 @@ "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 11:32+0000\n" +"PO-Revision-Date: 2009-07-04 09:57+0000\n" "Last-Translator: Mert Dirik \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 @@ -881,11 +881,11 @@ #: lib\main.py:313 lib\util.py:61 msgid "&Help" -msgstr "Ya&rdım" +msgstr "&Yardım" #: lib\main.py:314 msgid "&Help..." -msgstr "Ya&rdım..." +msgstr "&Yardım..." #: lib\main.py:316 msgid "&About..." @@ -1771,3 +1771,27 @@ #: lib\util.py:912 lib\util.py:913 lib\util.py:916 msgid "(no message)" msgstr "" + +#~ msgid "Line" +#~ msgstr "Satır" + +#~ msgid "&Location" +#~ msgstr "&Konum" + +#~ msgid "Local location:" +#~ msgstr "Yerel Konum:" + +#~ msgid "Extension" +#~ msgstr "Uzantı" + +#~ msgid "Show log..." +#~ msgstr "Günlüğü göster..." + +#~ msgid "Stopped" +#~ msgstr "Durduruldu" + +#~ msgid "Public branch location:" +#~ msgstr "Umumi dalın konumu:" + +#~ msgid "&Revert..." +#~ msgstr "&Eski durumuna getir..." diff -Nru qbzr-0.18.6/po/qbzr-uk.po qbzr-0.19/po/qbzr-uk.po --- qbzr-0.18.6/po/qbzr-uk.po 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/po/qbzr-uk.po 2010-08-05 09:10:37.000000000 -0400 @@ -8,7 +8,7 @@ "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-16 13:16+0200\n" -"PO-Revision-Date: 2010-02-18 11:01+0000\n" +"PO-Revision-Date: 2008-11-22 15:38+0000\n" "Last-Translator: Alexander Belchenko \n" "Language-Team: Ukrainian \n" "MIME-Version: 1.0\n" @@ -16,7 +16,7 @@ "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Launchpad-Export-Date: 2010-02-19 13:56+0000\n" +"X-Launchpad-Export-Date: 2010-08-03 12:24+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: lib\add.py:45 lib\config.py:120 lib\config.py:141 lib\config.py:172 @@ -1777,3 +1777,33 @@ #: lib\util.py:912 lib\util.py:913 lib\util.py:916 msgid "(no message)" msgstr "" + +#~ msgid "&Revert..." +#~ msgstr "&Повернути попередню версію..." + +#~ msgid "Extension" +#~ msgstr "Розширення" + +#~ msgid "Show log..." +#~ msgstr "Показати журнал..." + +#~ msgid "Line" +#~ msgstr "Рядок" + +#~ msgid "Stopped" +#~ msgstr "Зупинено" + +#~ msgid "Internal Error" +#~ msgstr "Internal Error" + +#, python-format +#~ msgid "" +#~ "Sorry, subprocess action \"%s\" cannot be started\n" +#~ "because self.args is None.\n" +#~ "Please, report bug at:\n" +#~ "https://bugs.launchpad.net/qbzr/+filebug" +#~ msgstr "" +#~ "Sorry, subprocess action \"%s\" cannot be started\n" +#~ "because self.args is None.\n" +#~ "Please, report bug at:\n" +#~ "https://bugs.launchpad.net/qbzr/+filebug" diff -Nru qbzr-0.18.6/README.txt qbzr-0.19/README.txt --- qbzr-0.18.6/README.txt 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/README.txt 2010-08-05 09:10:37.000000000 -0400 @@ -12,7 +12,7 @@ * Python 2.4, 2.5 or 2.6 - * Bazaar VCS itself + * Bazaar VCS itself (see below version compatibility information) * PyQt 4.4 with Qt 4.4 or later http://www.riverbankcomputing.co.uk/pyqt/ @@ -25,6 +25,19 @@ http://pyenchant.sourceforge.net/ +Compatibility between qbzr and bzr versions +=========================================== + + * QBzr 0.14.x compatible with bzr 1.17, 1.18.x, 2.0.x. + + * QBzr 0.18.x required bzr 2.1.x. + Some commands/dialogs are working with bzr 1.17, 1.18.x, 2.0.x. + It may work with bzr 2.2 or later, but this is not guaranteed. + + * QBzr 0.19 required bzr 2.2 and compatible with bzr 2.1. + It may not work with older versions of bzr. + + Other bzr plugins that improve QBzr =================================== diff -Nru qbzr-0.18.6/setup.py qbzr-0.19/setup.py --- qbzr-0.18.6/setup.py 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/setup.py 2010-08-05 09:10:37.000000000 -0400 @@ -13,7 +13,7 @@ setup(name='qbzr', description='Qt4 frontend for Bazaar', keywords='plugin bzr qt qbzr', - version='0.18.6', + version='0.19', url='http://wiki.bazaar.canonical.com/QBzr', license='GPL', author='QBzr Developers', diff -Nru qbzr-0.18.6/ui/run.ui qbzr-0.19/ui/run.ui --- qbzr-0.18.6/ui/run.ui 2010-05-04 15:20:20.000000000 -0400 +++ qbzr-0.19/ui/run.ui 2010-08-05 09:10:37.000000000 -0400 @@ -24,26 +24,11 @@ false - - - - 0 - 0 - + + + Options - - QFrame::StyledPanel - - - QFrame::Raised - - - 0 - - - - 0 - + @@ -169,16 +154,18 @@ + + + + - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p></body></html> - + + + + 0 + + @@ -199,7 +186,7 @@ RunDialog disableUi(bool) - frame + run_container setDisabled(bool)