././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/AUTHORS.txt0000644000000000000000000000543214556556456012534 0ustar00Contributors: * Alessandro Renieri * Alexander Belchenko * Alexey Borzenkov * Alexey Stukalov * André Bachmann * Atsuo Ishimoto * A. S. Budden * B. Sygnat * Benoît Pierre * Craig Hewetson * David Roberts * Dorin Scutarașu * Eugene Tarasenko * Gary van der Merwe * Glen Mailer * Goffredo Baroncelli * Gordon Tyler * HAYASHI Kentaro * Ian Clatworthy * INADA Naoki * IWATA Hidetaka * Jared Silva * Javier Derderian * Jelmer Vernooij * Jérémy Subtil * John Arbash Meinel * John Szakmeister * Jonathan Riddell * Luis Arias * Lukáš Lalinský * Mario del Pozo * Mark Hammond * Martin [gz] * Max Bowsher * Neil Martinsen-Burrell * Nicholas Allen * Nick Sonneveld * Ohad Kammar * Philip Peitsch * Robert Widhopf-Fenk * Samuel Bronson * Simon Kersey * Timothy Reaves * Toshio Kuratomi * Vincent Ladeuil Python 3 (flaky) conversion: * Robert Ladyman The idea of an UI for Bazaar commands comes from bzr-gtk plugin by Jelmer Vernooij . Used icons: * bzr-16.png and bzr-48.png The official Bazaar icons http://bazaar-vcs.org/LogoOptions * bookmark.png From the Tango Firefox theme http://tango.freedesktop.org/Firefox Copyright (C) Jakub 'jimmac' Steiner * view-refresh.png From the Tango Desktop Project http://tango.freedesktop.org/Tango_Desktop_Project Copyright (C) Jakub 'jimmac' Steiner ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/COPYING.txt0000644000000000000000000004310514556556456012516 0ustar00 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/MANIFEST.in0000644000000000000000000000007614556556456012403 0ustar00include ./*.txt prune docs/* include po/* include extras/*.py ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/Makefile0000644000000000000000000001745014556556456012311 0ustar00 all: @echo Targets: @echo test - run tests @echo pot - regenerate qbzr.pot translations template @echo mo - build binary translations @echo clean - remove build products @echo tags - collect tags with ctags utility @echo docs - build htmls for texts in docs/ directory @echo epydoc - build API docs with epydoc @echo ui - compile UI files @echo inno - compile exe - pass RELEASE=X.Y.Z @echo @echo To build release run: @echo make release @echo the version will be picked up from version.txt @echo MAKE SURE YOU COMMIT FIRST - brz export USES THE COMMITTED FILES # We'll read the RELEASE number from version.txt .PHONY: test pot mo clean tags docs ui # Making pot files is disabled for now - no translators! # pot: # python3 setup.py build_pot -N -d. RELEASE:=$(shell cat version.txt) .check-env-vars: $(info Building QBzr version ${RELEASE}) mo: python3 setup.py build_mo -f --verbose tarball: .check-env-vars brz export --root=qbrz qbrz-$(RELEASE).tar.gz rm -f qbrz-$(RELEASE).tar.gz.asc # gpg2 -ab qbrz-$(RELEASE).tar.gz # RJL needs to come back in # inno: mo # ./iscc installer/qbrz-setup.iss # gpg -ab qbrz-setup-$(RELEASE).exe inno: .check-env-vars ./iscc installer/qbrz-setup.iss /DVersion=$(RELEASE) rm -f qbrz-setup-$(RELEASE).exe.asc gpg2 -ab qbrz-setup-$(RELEASE).exe # release: tarball inno release: tarball inno clean: python3 ./setup.py clean -a tags: ctags *.py lib/*.py lib/extra/*.py lib/tests/*.py epydoc: epydoc.py -o api -v lib docs: $(MAKE) -C docs ui: python3 setup.py build_ui # === Tests beyond this point === # When you run ``brz selftest``, Breezy will scan all its plugins to see if they contain a function named test_suite(). # For each plugin that does, it calls the function and adds any resulting tests to the master test suite. # To run just the tests for plugin xxx, the command is: ``brz selftest -s bp.xxx`` so we use bp.qbrz in our case. check: BRZ_PLUGINS_AT=qbrz@$(shell pwd) brz selftest --starting-with=bp.qbrz --exclude=TestTreeFilterProxyModel --exclude=TestTreeWidget # Stop on first error, ignore TestTreeFilterProxyModel for now checkone: BRZ_PLUGINS_AT=qbrz@$(shell pwd) brz selftest -v --one --starting-with=bp.qbrz --exclude=TestTreeFilterProxyModel # Test specific item - e.g. for internationalisation, use: # # BRZ_PLUGINS_AT=qbrz@$(shell pwd) brz selftest --one --strict -s bp.qbrz TestI18n checkspecific: BRZ_PLUGINS_AT=qbrz@$(shell pwd) brz selftest -v --one --strict --starting-with=bp.qbrz test_show_widget # Rather than running the test_ suite, this lets you run the actual plugin - note # that the tests can often pass but the code fails in actual use. qtest: # You can test on qbrz itself like this (qlog in the below example): # # BRZ_PLUGINS_AT=qbrz@$(shell pwd) brz qlog # # If you have a test directory you wish to use, you can pass it to the relevant command. # In this example, we have a test dir of ``~/pythonstuff/bzr_test_dir/dycco`` and we # are developing in ~/pythonstuff/qbrz - thus we call brz with qadd and the dycco directory # Note we have to use ${HOME} for BZR_PLUGINS_AT... # BRZ_PLUGINS_AT=qbrz@${HOME}/pythonstuff/qbrz brz qadd ~/pythonstuff/bzr_test_dir/dycco/ #BRZ_PLUGINS_AT=qbrz@${HOME}/pythonstuff/qbrz brz qannotate ~/pythonstuff/qbrz/lib/treewidget.py #BRZ_PLUGINS_AT=qbrz@${HOME}/pythonstuff/qbrz brz qplugins test: brz selftest -s bp.qbrz # Fully working: (note, qcheckout-ala-explorer is qgetn). # qlog # qadd <- fails to display new files # qannotate, qblame # qcommit # qbrowse # qcat, qviewer # qversion # qplugins # qinit # qbranch # qbind # qunbind # qignore # qinfo # qupdate # quncommit # qpull # qshelve # qunshelve # qtag # qgetn # qrevert # qpush # qsend # qmerge # qconflicts # qresolve # qswitch # qcmd # qsubprocess # qdiff # qconfig # === qmain === # qmain fails in bzr # === qverify-signatures === # qverify-signatures fails in bzr # === qhelp === # qhelp doesn't work for me even in bzr # === Items in Plug-ins === # NOT working # qinit-workspace, qnew also unknown - they appear to be from the 'explorer' plugin # === Literate documentation, etc === # This uses pycco to generate the literal documentation. # To rebuild all of it, with an index.html file, use: # # make literate_index # # To just update (although new files won't be added to index.html), use: # # make literate_docs # # otherwise, you can just make the base, lib, or whatever using (for example): # # make widget_docs # # Output goes into docs/literate/... mirroring the source-code locations (e.g. # lib/widgets/... go into docs/literate/lib/widgets # # pycco isn't brilliant, but it tries its best # We build or rebuild the documentation with pycco - shorthand for the command here in PYCCO_ALL variable # This one builds the index.html file PYCCO_ALL := pycco --generate_index --paths -s --directory # This one does NOT build the index file - otherwise, if you pass a single file # it will be the ONLY one in the index. Do'h! PYCCO_ONE := pycco --paths -s --directory # We want to look at all the .py files in the Code directory (where we start) # in case any have changed. The makefile is in /Code so we just use './' # the shell for 'this directory that we are in' - so the following means # 'all the files ending in "py" in this directory' PYMAINSOURCES=$(wildcard ./*.py) # The lib sources PYLIBSOURCES=$(wildcard ./lib/*.py) # extras and tests PYEXTRASOURCES=$(wildcard ./lib/extra/*.py) PYEXTRASSOURCES=$(wildcard ./extras/*.py) PYTESTSSOURCES=$(wildcard ./lib/tests/*.py) PYWIDGETSOURCES=$(wildcard ./lib/widgets/*.py) # So now add them all together PYSOURCES=$(PYMAINSOURCES) $(PYLIBSOURCES) $(PYEXTRASOURCES) $(PYEXTRASSOURCES) $(PYTESTSSOURCES) $(PYWIDGETSOURCES) # This is how we extract an html file-name for each changed python file-name # It basically reads: for each .py file in the source directory (PYSOURCES), # there should be a matching .html file in Code_Documentation. # The % means the stem, for example world.py has a stem of 'world' so we # make world.html from world.py DOCUMENTS_NEEDED_BASE=$(PYSOURCES:%.py=docs/literate/%.html) # For subdirectories, we'll get the subdirectory as a prefix # for example, svrsub/svrconfig DOCUMENTS_NEEDED_LIB=$(PYLIBSOURCES:%.py=docs/literate/%.html) DOCUMENTS_NEEDED_EXTRA=$(PYEXTRASOURCES:%.py=docs/literate/%.html) DOCUMENTS_NEEDED_EXTRAS=$(PYEXTRASSOURCES:%.py=docs/literate/%.html) DOCUMENTS_NEEDED_TEST=$(PYTESTSSOURCES:%.py=docs/literate/%.html) DOCUMENTS_NEEDED_WIDGETS=$(PYWIDGETSOURCES:%.py=docs/literate/%.html) .PHONY: literate_docs # No such file as all so mark it as a phony .PHONY: base_docs .PHONY: lib_docs .PHONY: extra_docs .PHONY: extras_docs .PHONY: test_docs .PHONY: widget_docs base_docs: $(DOCUMENTS_NEEDED_BASE) lib_docs: $(DOCUMENTS_NEEDED_LIB) extra_docs: $(DOCUMENTS_NEEDED_EXTRA) extras_docs: $(DOCUMENTS_NEEDED_EXTRAS) test_docs: $(DOCUMENTS_NEEDED_TEST) widget_docs: $(DOCUMENTS_NEEDED_WIDGETS) literate_docs: base_docs lib_docs extra_docs extras_docs test_docs widget_docs # The html file in docs/literate (and its cousins) depends upon the py file of the same name # If the html file is missing or older than the python one, run the pycco command # for the file (in $<) docs/literate/%.html: %.py $(PYCCO_ONE) ./docs/literate $< docs/literate/extras/%.html: %.py $(PYCCO_ONE) ./docs/literate $< docs/literate/lib/%.html: %.py $(PYCCO_ONE) ./docs/literate $< docs/literate/lib/data/%.html: %.py $(PYCCO_ONE) ./docs/literate $< docs/literate/lib/extra/%.html: %.py $(PYCCO_ONE) ./docs/literate $< docs/literate/lib/test/%.html: %.py $(PYCCO_ONE) ./docs/literate $< docs/literate/lib/widgets/%.html: %.py $(PYCCO_ONE) ./docs/literate $< # Call 'make index' to make the full documentation .PHONY: literate_index literate_index: make literate_clean $(PYCCO_ALL) ./docs/literate $(PYSOURCES) .PHONY: literate_clean literate_clean: rm -rf docs/literate/ ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/NEWS.txt0000644000000000000000000021420714556556456012165 0ustar000.23.2 - 2016/04/10 ------------------- Maintenance release. * qrun: * More robust against unicode help from some hidden commands. Attempt to fix bug #1217371. (Alexander Belchenko) * qshelve: * New command line option --all to start with all changes selected. (Sveinung Kvilhaugsvik, Bug #1227914) * New command line option --message (-m) to set the message string. (Sveinung Kvilhaugsvik, Bug #1233909) * qcommit: * Better compatibility with bzr 2.6+: fixed warning message `Cannot expand "commit_data": Dicts do not support option expansion`. (Alexander Belchenko, Bug #1254838) 0.23.1 - 2013/07/29 ------------------- Maintenance release. * qannotate: * option --line=N: properly activate the first line and a line with uncommitted changes. (Alexander Belchenko) * qcommit: * Better support of cancel commit for foreign branches (git/svn/etc). (Bug #1030343, Jared Silva, Jelmer Vernooij) * qconfig: * Fix: Fails to modify or remove merge tool configuration. (IWATA Hidetaka, Bug #1045827) * qlog: * Support for FusionForge bug tracker. (Jérémy Subtil, Bug #1072044) * Support for Jira bug tracker. (Craig Hewetson, Bug #1189421) * Support for Flyspray bug tracker URLs (2 styles). (Alexander Belchenko) * Hack for Vista/Win7 aero style: selected rows should use black text color. (Alexander Belchenko, Bug #790590) * Workaround for date column width problem on Windows Vista and higher (1 pixel miscalculation). (Alexander Belchenko, Bug #430502) 0.23.0 "Birch" - 2012/07/12 --------------------------- What's new in this release: QBzr 0.23 is companion release for bzr 2.6, and compatible with bzr 2.5. Behavior change: External diff behavior is changed as below.(IWATA Hidetaka) 1. When calling external diff for multiple files, all diffs shown at once.(Bug #942218) 2. Working tree or branch is locked only when starting up of diff tools.(Bug #942221) This affects to all commands which use external diff. (qdiff, qcommit, qbrowse, qannotate, ...) Now, you can launch 'Shelve' directly from each dialog when uncommitted change blocks action. And you can launch 'Resolve' directly when conflicts generated. (IWATA Hidetaka #935903) New feature of qannotate command: command-line option `--line=N` (`-L`) allows you to jump right to specific line. That could be used for tighter integration with editors and IDEs. Annotation window now uses e-mail of revision author to define background color of revision. Previously we've used author name to define background color, so changes in different revisions made by user with the same e-mail but with differently spelled name was highlighted with different colors. Simple actions to resolve conflicts: 'take "THIS"' and 'take "OTHER"'. Available from context menu. Show simple message box instead of exception report dialog when failing to lock. (#935902) Improvements of qlog's context menus: better context menu of deleted files, and for files from virtual "Working Tree" revision (available when qlog run with --show-tree option). Also properly refresh the state of changes in virtual "Working Tree" revision. * qannotate: * New command-line option `--line=N` (`-L`) to activate specified line number on start of dialog. (Alexander Belchenko) * Prefer e-mail as "author id" to define background color for lines. (Alexander Belchenko, Bug #878204) * qbind: * Add push location to suggestions. (Alexander Belchenko) * qconflicts: * Added 2 resolve actions to context menu: `Take "THIS"` and `Take "OTHER"`. (Alexander Belchenko) * Auto-refresh conflicts list after selecting a resolve action. (Alexander Belchenko) * qlog: * Disable context menu items (view, annotate, save) for deleted files. (Alexander Belchenko, Bug #1009876) * Fix - Some menus (show tree, view, annotate) don't work when Working tree revision selected. (IWATA Hidetaka, Bug #1020530) * Some menus (tag, update, revert, ...) are disabled when Working tree revision selected. (IWATA Hidetaka, Bug #1020530) * Fixing issue: Working tree revision is never refreshed. (IWATA Hidetaka, Bug #1021076) * qrevert: * it now does a real check to see if there are files (or merges) selected to revert - if not, it shows a warning message. (André Bachmann, Bug #942744) * qshelve/qunshelve: * Use `encoding` settings from branch or global config to properly show files content. (Alexander Belchenko, Bug #995943) 0.22.5 - yyyy/mm/dd ------------------- Maintenance release. * qcommit: * Better support of cancel commit for foreign branches (git/svn/etc). (Bug #1030343, Jared Silva, Jelmer Vernooij) 0.22.4 - 2012/07/12 ------------------- Maintenance release. * qlog: * Disable context menu items (view, annotate, save) for deleted files. (Alexander Belchenko, Bug #1009876) * Fix - Some menus (show tree, view, annotate) don't work when Working tree revision selected. (IWATA Hidetaka, Bug #1020530) * Some menus (tag, update, revert, ...) are disabled when Working tree revision selected. (IWATA Hidetaka, Bug #1020530) * Fixing issue: Working tree revision is never refreshed. (IWATA Hidetaka, Bug #1021076) 0.22.3 - 2012/05/23 ------------------- Maintenance release. * qlog * Fix - crashes when trying show log of subdirectory with --show-trees option. (IWATA Hidetaka, Bug #974362) * qshelve/qunshelve: * Use `encoding` settings from branch or global config to properly show files content. (Alexander Belchenko, Bug #995943) 0.22.2 - 2012/04/05 ------------------- Maintenance release. * qrun: * Localized help text for selected command is shown correctly now. (Alexander Belchenko, Bug #963542) * qshelve: * Pressing Ctrl+Enter in message edit area triggers shelve action. (IWATA Hidetaka, Bug #936982) * Hunks are not displayed on Mac OS. (IWATA Hidetaka, Bug #955241) * qgetnew: * Ask for verification if a checkout should go to a non-empty directory - this may cause unwanted conflicts (André Bachmann, Bug #938835) * qdiff * Fix - crashes when trying show complete diff of renamed file. (Bug #969055) * Don't use deprecated API (bzrlib.builtins.tree_files). (Alexander Belchenko, Bug #776241) 0.22.1 - 2012/02/21 ------------------- Just in time for bzr 2.5. * New command: qignore. (Alexander Belchenko, Bug #524785) 0.22.0 "Alder" - 2012/02/07 --------------------------- What's new in this release: QBzr 0.22 is companion release for bzr 2.5, and compatible with bzr 2.4. This release has many improvements and bugfixes. As usual many improvements related to qdiff dialog. While searching for the word or sentence all matches are highlighted. This highlighting works in qdiff, qshelve, qunshelve, qannotate. To make navigation faster through the long side-by-side diff, or inside big annotated file you can use backside guide bar in qdiff and qannotate. Behavior change: "Unchanged" option in treewidget filter now only applies to versioned files. (Before it was applied to unknown files too). Other qdiff improvements include: curved lines are using in side-by-side view, smart synchronization of side-by-side view in "Complete" mode; files with wrong or mixed encoding no more shown as "latin-1", but in user- specified encoding. For full list of improvements and bugfixes please see changelog below. * qannotate: * Vertically center the target line when using "Goto Line" in qannotate. (Benoît Pierre) * Show change markers side of annotate view. It represents where lines changed by selected revisions are. (IWATA Hidetaka) * qbrowse: * Does not crash anymore when called for shared repository. (André Bachmann, Alexander Belchenko, Bug #578935) * Avoid using inventory for access to revision and working trees. (Jelmer Vernooij, Bug #922121) * qconfig: * Fixed Set Default button in Merge tab. (Gordon Tyler, Bug #820635) * qdiff: * Smart scroll syncronizing for side by side view (in complete mode). (IWATA Hidetaka) * Fixed ignore whitespace changes code. (Alexander Belchenko, Bug #827391) * Use curved lines in central widget change markers. (IWATA Hidetaka) * In the case of file content has mixed encoding that cannot be safely decode to unicode qdiff don't fallback to use latin-1 encoding anymore, but try to decode such content in "replace" mode. (Alexander Belchenko, Bug #814117) * Implement search highlight. This change affects to qdiff, qshelve, qunshelve, qannotate. (IWATA Hidetaka, Bug #785565) * Show change markers side of diff views. (IWATA Hidetaka Bug #827251) * qgetnew * Base directories for the source branch and the destination checkout folder can now be configured in qconfig, tab 'User Interface'. (André Bachmann) * qlog: * Do not crash on ghost revisions. (Jonathan Riddell, Bug #785967) * Show context menu properly after re-load of branch(es). (IWATA Hidetaka, Bug #744904) * qrun: * Command-line arguments with spaces properly quoted. (Alexander Belchenko, Bug #824381) * Add support for UIFactory.choose. Make it possible to use 'shelve' in qrun. (Benoît Pierre) * qverify-signatures: * Report commits signed with expired keys in "verify-signatures". (Jonathan Riddell, #804254) * Adapt command progress display to changes needed for translations in bzrlib which was raising a TypeError with unicode. (Martin Packman, #872616) * Treewidget 'unchanged' filter is now only versioned files. (Martin Packman) * Stringify tab_width settings while writing it to branch config. (Workaround for bug #912344, Alexander Belchenko) 0.21.4 - development -------------------- Maintenance release. * qlog: * Disable context menu items (view, annotate, save) for deleted files. (Alexander Belchenko, Bug #1009876) 0.21.3 - 2012/04/05 ------------------- Maintenance release. * Avoid AttributeError on 'is_ignored' from treewidget filtering involving unversioned files that have been moved. (Martin Packman, Bug #557603) * Stringify tab_width settings while writing it to branch config. (Workaround for bug #912344, Alexander Belchenko) * Don't use deprecated API (bzrlib.builtins.tree_files). (Alexander Belchenko, Bug #776241) 0.21.2 - 2011/12/07 ------------------- Maintenance release. * qbrowse: * Does not crash anymore when called for shared repository. (André Bachmann, Alexander Belchenko, Bug #578935) * qconfig: * Fixed Set Default button in Merge tab. (Gordon Tyler, Bug #820635) * qdiff: * Fixed ignore whitespace changes code. (Alexander Belchenko, Bug #827391) * qlog: * Show context menu properly after re-load of branch(es). (IWATA Hidetaka, Bug #744904) * qrun: * Command-line arguments with spaces properly quoted. (Alexander Belchenko, Bug #824381) * qunshelve: * Disable OK button while executing unshelve. (IWATA Hidetaka, Bug #842818) * Avoid NoSuchFile error when working tree has added and removed file. (IWATA Hidetaka, Bug #842842) * Updated translations. 0.21.1 - 2011/08/04 ------------------- Maintenance release. * qlog: * Do not crash on ghost revisions. (Jonathan Riddell, Bug #785967) * qswitch: * Support unicode locations. (Alexander Belchenko, Bug #819259) 0.21 "Tilia" - 2011/07/21 ------------------------- What's new in this release: QBzr 0.21 is companion release for bzr 2.4, and compatible with bzr 2.3. New features in this release: Now you can select changes to shelve and unshelve your saved changes with new shiny qshelve and qunshelve dialogs. qdiff window has been reworked and all controls moved to a toolbar, similar to one in qannotate window. Also qdiff toolbar provides you new functions: text search within active pane and also knob to ignore whitespace changes (it's also available as command-line option). User can configure the tab width and this setting affects qdiff, qannotate and qcat windows. By default tab width equals to 8 characters, user can set new default value in bazaar.conf as ``tab_width = N`` (either via qconfig or editing [DEFAULT] section of bazaar.conf). Also user can set individual tab width for branches in their branch.conf. User can configure tab width via "View Options" menu in toolbars of qdiff, qannotate. QBzr provides support for new builtin feature of bzr: mergetools. Now you can easier configure your favorite diff/merge tool to be used from qconflicts or context menu in qbrowse (Working Tree browser in Bazaar Explorer). If you have python-gpgme installed and you have enabled gpg-signatures for your commits then you can see new messages regarding valid gpg-signatures available in qlog. Also you can run check of your signatures with new qverify-signatures command. Other changes include major rework of qinfo dialog (show the same information as CLI ``bzr info`` does), qcommit dialog now remembers state of "Show non-versioned" knob between runs, now it's possible to save old state of the file from qlog dialog (using context menu in file list), error dialogs has been improved (now also support apport if available) and several other improvements and bugfixes (see full changelog for details). Changes after 0.21 beta 1: * qcat: * Fixed problem with viewing file from qbrowse. (Alexander Belchenko, Bug #776196) * qinfo: * Turned off word-wrap in location label: prevents strange path display if there are spaces in the path. (A. S. Budden, Bug #781040) * Fixed UnicodeError for non-ascii paths. (Alexander Belchenko, Bug #790138) * qdiff, qannotate: * Tab-width can be customised from the view menu. (Bug #490377, A. S. Budden) * qgetnew: * The target location no longer gets overwritten when the source location changes. (André Bachmann) * qlog: * File list context menu: added support to save content of a file of specific revision as a new file. (André Bachmann) * Show digital signature information for commits if python-gpgme is installed * Improved error dialogs on internal/other error, support for apport (if it's available). (Jonathan Riddell) * Branch/Checkout dialogs: * Fixed UnicodeDecodeError with non-ascii paths in target directory picker. (Alexander Belchenko, Bug #789083) * Use bzrlib.mergetools for managing and using external merge tools in qconfig and qconflicts. (Bug #489915, Gordon Tyler) * New qshelve / qunshelve dialogs. (IWATA Hidetaka) * New command qverify-signatures to show digital signature statuses for branch commits 0.21 beta 1 - 2011/05/02 ------------------------ * qbranch: * Fixed problem with very small width of input fields in the dialog on Mac OSX. (Timothy Reaves, Bug #667090) * qbrowse: * Use `qcat --native` equivalent to allow opening copies of files from branches without working trees. (A. S. Budden, Bug #752422) * qcommit: * Remember "Show non-versioned" checkbox state. (Nick Sonneveld, Bug #258926) * qconflicts: * Fixed internal error when there is conflict in non-versioned file. (Alexander Belchenko, Bug #655451) * qdiff: * New toolbar with controls and options (similar to qannotate's toolbar). (Dorin Scutarașu) * Support for ignore whitespace differences in changes. This mode can be turned on from command-line (`qdiff -w` or `qdiff --ignore-whitespace`) and from GUI itself (in View Options). (Dorin Scutarașu, Glen Mailer, Bug #642000) * Added Find action to do text search within either pane. (Dorin Scutarașu, Bug #497832) * qinfo: * Significantly simpler implementation that shows the information provided by Bazaar. This fills in the gaps in the data shown by qinfo (such as details of checkouts) and means that changes to 'bzr info' will automatically be reflected in qinfo. (A. S. Budden, Bug #439624) * qsubprocess: * Reliable exception encoding to pass exception attributes from subprocess to the GUI process. (Martin [gz], Bug #686735) * qannotate, qdiff: * Find text box turns red if no matches are found. (A. S. Budden, Bug #772244) * qcat, qannotate, qdiff, qconfig: * Added ability to customise the tab-stop width (setting in qconfig, affects qcat, qannotate and qdiff). The setting is stored in [DEFAULT] section of bazaar.conf, and is named tab_width (it can also be configured with qconfig). Units are characters (so 4 means a tab should be displayed with the width of 4 spaces). The default value is 8. The setting can also be adjusted in branch.conf for specific branches. (Bug #490377, A. S. Budden) 0.20.4 ------ NOTE: 0.20 is obsolete series as of September 2012. Maintenance fixes. * Workaround for bug in Python http://bugs.python.org/issue4230 (Samuel Bronson, Bug #1051000; Alexander Belchenko, Bug #711602) 0.20.3 - 2011/12/07 ------------------- Maintenance release. * qbrowse: * Does not crash anymore when called for shared repository. (André Bachmann, Alexander Belchenko, Bug #578935) * qlog: * Show context menu properly after re-load of branch(es). (IWATA Hidetaka, Bug #744904) * qrun: * Command-line arguments with spaces properly quoted. (Alexander Belchenko, Bug #824381) * qswitch: * Support unicode locations. (Alexander Belchenko, Bug #819259) 0.20.2 - 2011/07/20 ------------------- Maintenance release. * qconflicts: * Fixed internal error when there is conflict in non-versioned file. (Alexander Belchenko, Bug #655451) * qinfo: * Fixed UnicodeError with non-ascii locations. (Alexander Belchenko, Bug #790138) * Branch/Checkout dialogs: * Fixed UnicodeDecodeError with non-ascii paths in target directory picker. (Alexander Belchenko, Bug #789083) 0.20.1 - 2011/04/26 -------------------- Maintenance release. * Compatibility with patched bzrlib on debian without copy of configobj library inside it. (Bug #715067, Alexander Belchenko) * qbranch: * Fixed problem with very small width of input fields in the dialog on Mac OSX. (Timothy Reaves, Bug #667090) * qsubprocess: * Reliable exception encoding to pass exception attributes from subprocess to the GUI process. (Martin [gz], Bug #686735) 0.20.0 - 2011/02/03 ------------------- Bazaar 2.3 companion release. Suitable for bzr 2.3 and bzr 2.2. * Refactor the config code: * Remove the QBzrGlobalConfig class so that we only have one class that writes to qbzr.conf. * Have a global cache for the QBzrConfig, like we have for bzr GlobalConfig, to reduce reading the config from disk. * Refactor the window.saveSize methods, so that we only have to write the config to disk once. * Lock the config dir when when saving the config file. (Gary van der Merwe) * qrun: fixed '--execute' mode. (Bug #590229, Simon Kersey) * qlog: * Refactor loggraphprovider so that the state and computed data is separated from the cache. Rename to loggraphviz. * Write lots of tests for loggraphviz. * Remove LogFilterProxyModel which improves performance. * --no-graph mode now shows nodes per revision, indented by merge depth. * Fix the layout of octopus merges. (Bug #489383) * Add a option --show-trees that shows working tree changes as a node in the graph. * Fix bug with show log form the tree widget with remote branch. (Bug #621934) * qcommit: added option to load commit message from a file. (Bug #640071, Philip Peitsch) * qconflicts: fix bug with access to QBzr configuration. (Bug #675894) * When a interupt signal is recived, close rather than showing a error message. (Gary van der Merwe) * qpush: fixed smart suggestion of new push URLs for lp branches. (Bug #710767, Alexander Belchenko) 0.19.4 - 2011/07/20 ------------------- Maintenance release. * qconflicts: * Fixed internal error when deleting non-versioned files/directories. (Alexander Belchenko, Bug #655451) 0.19.3 - 2010/11/26 ------------------- Maintenance release. * The 0.19 series is now marked as incompatible with bzr versions >= 2.3. This due to Bug #650905. (Gary van der Merwe) * qlog: * Fix actions that use the branch menu on PyQt 4.7.4. (Bug #621158, Gary van der Merwe) * Fix crash when trying to "Revert to this revision", "Update to this revision", etc. (Bug #680787, Gary van der Merwe) * Restore ignore button for error dialogs. (Gary van der Merwe) 0.19.2 - 2010/09/24 ------------------- Maintenance release. * Fix finding bzr.exe when running from bzrw.exe with out full path in the command line. Handle been launched from tortoisebzr without it having to change sys.executable. (Bug #640082, Bug #641557, Gary van der Merwe) 0.19.1 "Chestnut" - 2010/09/13 ------------------------------ Maintenance release. * Fix modeltest.py so that it works with Qt 4.7. (Bug #614123, Gary van der Merwe) * qbrowse: fixed 'Mark as renamed' feature in treewidget. (Bug #620433, Alexander Belchenko) * qconfig: guess user id if there is no whoami set. (Bug #622336, Gary van der Merwe, Alexander Belchenko) * qgetupdates: fixed API mismatch. (Bug #636510, Alexander Belchenko) * qlog: * better branch labels for `bzr qlog colo:` case. (Alexander Belchenko) * give a size hint for the GraphTagsBugsItemDelegate so that blured rendering on Windows with PyQt 4.7 is avoided. (Gary van der Merwe) * qrun: fixed '--execute' mode. (Bug #590229, Simon Kersey) 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.8 - 2011/04/27 ------------------- Maintenance release. * qrun: * Fixed '--execute' mode. (Bug #590229, Simon Kersey) 0.18.7 "Juniper" - 2010/08/04 ----------------------------- 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 --------------------------------------- Maintenance release. * qsubprocess: pass command line with double and multiple backslashes via temporary file. (Bug #528944, Alexander Belchenko) * qlog, qbrowse: Fix a bug when using with pyqt 4.7.2. (Bug #544928, Gary van der Merwe) 0.18.4 "Pussy-willow" - 2010/03/22 ---------------------------------- Bugfixes in the stable branch. Suitable for bzr 2.1.x. * Improved support for Redmine bugs URL. (Bug #538414, Alexander Belchenko) * TreeWidget: Fix a bug where refreshing may result in data inconsistencies. This bug was causing a number of knock on bugs. (Bug #538753, Gary van der Merwe) * qcommit: better support of commit directly into SVN tree. (Bug #540363, Alexander Belchenko) 0.18.3 "Cypress" - 2010/03/03 ----------------------------- Bugfixes in the stable branch. Suitable for bzr 2.1.x. * Fixed problem with running diff from qannotate from qbrowse. (Bug #505987, Alexander Belchenko) * Rollback changes to qadd made in 0.18.2 which caused regression. (Bug #526933, Alexander Belchenko) * Handle FileTimestampUnavailable error when diffing file with ghosts in history. (Bug #513096, Alexander Belchenko) * 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: emit layoutAboutToBeChanged signal while we remove old items to ensure model data consistency. (Bug #513066, Bug #515908, Gary van der Merwe) * TreeWidget: When renaming a file, pressing enter should not cause the default action to be run. (Bug #513107, Gary van der Merwe) * Sub processes dialogs: Fix usability bugs with the Retry button: * The button position changes on Linux when the Retry button appears. * The Enter key does not work after the Retry button appears. (Gary van der Merwe) * TreeWidget: Add more comprehensive tests. Fix some minor bugs found by these tests. (Gary van der Merwe) * TreeWidget: Fix a bug where the TreeWidget if there was a conflict, for which the file does not exist. (Bug #528548, Gary van der Merwe) 0.18.2 "Cedar" - 2010/02/21 --------------------------- Bugfixes in the stable branch. Suitable for bzr 2.1.x. * qconfig: don't quote editor path. (Bug #523212, Alexander Belchenko) * qsubprocess: pass command line with \n in it via temporary file. (Bug #517420, Alexander Belchenko) * qsubprocess: relax the unicode problems while decode stdout of subprocess. (Bug #523746, INADA Naoki) * Restore standard bzrlib ui_factory on exit from q-commands. (Bug #498309, Alexander Belchenko) * Better "select all" logic for qrevert and qadd. (Bug #524483, Alexander Belchenko) * Added Hungarian translation. 0.18.1 "Fern" - 2010/02/04 -------------------------- What's new in this release: * Treewidget: Fix a crash when refreshing tree with a checked item that has a parent that is ungrouped. (Bug #512006, Gary van der Merwe) * Avoid importing Qt libs when `bzr help commands` invoked. (Bug #515636, Alexander Belchenko) 0.18 "Pine-needles" - 2010-01-19 -------------------------------- What's new in this release: * Fixed problems with rename items in subdirectory. (Bug #495519, INADA Naoki) * Flush clipboard on exit, so data copied there is available after closing of q-window. (Bug #503401) * Fixed problem with insufficient width of revno column in qannotate and qbrowse (for revision tree) if revno bigger than 9999. (Bug #505990, Alexander Belchenko) * Changed buttons behavior in subprocess-based dialogs: if the operation failed then show Retry button (instead of OK), at the successfull finish show only Close button. (Simon Kersey) * qrun has new option --execute which allows to run the supplied command immediately. If the command failed user can edit the command and its arguments in usual way. (Simon Kersey) * Fixed a bug in the new SyntaxHighlighter used in qannotate and qcat so that it correctly handle tokens without styles. (Bug #508281, Gary van der Merwe) * Fixed a bug in TreeWidget were some times duplicated in parent directories. (Gary van der Merwe) * qbranch has a new --bind option for convenient binding to the parent location while branching. * qcommit: Non versioned files are now selected by select all when they are shown. (Bug #490864, Gary van der Merwe) * Serbian translations added. 0.17 "Sapin de Noテォl" - 2009/12/12 --------------------------------- What's new in this release: * New encoding selector added to qdiff, qannotate, qcat and qviewer. This selector allows change of the text encoding "on the fly". See: http://bazaarvcs.wordpress.com/2009/12/04/selecting-file-encoding-in-qbzr/ * qpush can auto-suggest push location for feature branches when master branch hosted on remote server. In the case of Launchpad it suggests location lp:~user/project/branch. * Now it's possible to tag a revision while browsing history in qlog. * Details on revision in qlog now have fancy dots for parent/children revisions, dots have the same color as in main qlog graph. * qcat/qviewer: show line numbers for text lines. * qannotate: new feel & look, you can copy text from annotated view now. * qrun now groups the commands into several categories (All, Core, and separate for each installed plugin) * New translations added: Arabic, Czech, Danish, English (United Kingdom). * And many other bugfixes as well. Changelog: * New encoding selector added to qdiff, qannotate and qcat. This selector allows change of the text encoding "on the fly". (INADA Naoki) * qpush: * When a push location is yet to be defined, qpush suggests a location for feature branches when the master branch is hosted on Launchpad. (Bug #487562, Ian Clatworthy) * qconflicts: * Double click on file item opens merge tool. (Eugene Tarasenko) * qdiff: * Fixed problem with invoking external diff from qdiff dialog when the current directory is not repository root. (Bug #439084, Alexander Belchenko) * qlog: * Added "tag revision" action to context menu. (Bug #442953, Craig Hewetson) * Robust handling of bogus --fixed properties. (Bug #436834, Craig Hewetson) * The properties box in the message box now follow the theme, and hence are now readable on dark themes. (Bug #407070, Gary van der Merwe) * Parents and children in the message box are now show with a dot, of the same color as thier dot in the graph. (Gary van der Merwe) * qcat: * Line numbers are now shown when viewing text files. (Gary van der Merwe) * qannotate: * It is now possible to select and copy text from qannotate. (Bug #251309, Gary van der Merwe) * Show all revisions that touch the file in the log list. (Bug #488824, Gary van der Merwe) * qrun: * A category field has been added to make finding commands easier. (#486968, Ian Clatworthy) * The command name, command parameters and command category can be passed on the command line. (Ian Clatworthy) * qsubprocess: * Catch possible errors from bencode decoder is we got malformed string from child process. Show the error nicely. (Bug #484624, Alexander Belchenko) * treewidget (used in qcommit, qadd, qrevert, and qbrowse): * Fixed compatibility with PyQt < 4.6. (Bug #479093, Bug #478979, Gary van der Merwe) * Extended keyboard navigation: pressing Enter invokes default action for selected item. (Bug #483597, Alexander Belchenko) * Fixed is_ignored() check (versioned file that matches ignore pattern should not be called "ignored"). (Bug #487560, Alexander Belchenko) * qrevert: * Don't revert entire directory if only one file within it is selected. (Bug #491212, Alexander Belchenko) * qbranch: * If a source URL is given on the command line, focus is set to the To field. * The To location is now intelligently set based on the source URL. (#318214, Ian Clatworthy) * qexport: * Fixed NameError when invoked with directory location argument. (Bug #491702, Alexander Belchenko) * qconfig: * Properly save data in empty qbzr.conf. (Bug #493634, Alexander Belchenko) * New translations added: Arabic, Czech, Danish, English (United Kingdom). 0.16 "Acacia" - 2009/11/9 ------------------------- What's new in this release: * qswitch: * Added support for --create-branch option to "bzr switch". (A. S. Budden) * SubprocessUIFactory and QUIFactory now both support get_username, and get_boolean. (Bug #421851, Gary van der Merwe) * Save the size of Dialogs when the user press Esc. (Bug #417809, Gary van der Merwe) * qlog: * Get the max main_line digets in a different way so that we don't break --no-graph. (Bug #455867, Gary van der Merwe) * Corrected the margin for the revision number column. (Gary van der Merwe) * When loading the file list delta, only lock the repositories that are being used. If the 2 trees are from the same repositories, load them together. (Gary van der Merwe) * When viewing a svn repo, only show the file list if 1 revision is selected, and if so, use a optimized method to do so. (Bug #450225, Gary van der Merwe) * Show a throbber above the file list while a delta is being loaded. (Gary van der Merwe) * Fix a bug when refreshing a branch with revisions that have been removed. (Bug #435486, Gary van der Merwe) * qlog/qannotate: * Preserve leading whitespace in the lines of the log message. (Max Bowsher) * qadd: * Don't show unchanged directories that contain ignored files. (Bug #462435, Gary van der Merwe) * qcommit, qadd, qrevert: * Directoies with 4 or more sub items are grouped in the tree view. (Bug #456198, Gary van der Merwe) * Correct the old path shown for renamed files. (Bug #432572, Gary van der Merwe) * Passing a directory via the command line now correctly checks the directory. (Bug #435034, Gary van der Merwe) * For qcommit, It is now possible to select unversioned file and directories via the command line. (Gary van der Merwe) * Automaticly expand to the check items on load. (Gary van der Merwe) * Fix View for unversoined files when run from a sub directory of the working tree. (Gary van der Merwe) * qcommit/qbrowse: * Conflicts are shown in the status column. External merge applications can be launched to resolve these conflicts, and the conflicts can be marked as merged. (Bug #174509, Gary van der Merwe) * Improved the usibility of the context menu add, and revert actions. These now directly use the api, rather than via subprocess. There is now no prompt for add. With large trees, there is less flicker when the tree is refreshed, and the scroll position is remembered. (Gary van der Merwe) * It is now possible to rename and move files or directories, and to mark files or directories that have already been renamed or moved as such. (Gary van der Merwe) * It is now possible to remove files from the branch. (Gary van der Merwe) * Show blank icon for missing files. (Bug #418471, Gary van der Merwe) * qcommit/uncommit: * Catch AttributeError in save of commit_data during qcommit and/or uncommit in lightweight checkout from branch accessed via smart-server (lp:, bzr+ssh://, bzr:// etc). (Bug #434034 Bug #430382 Bug #463296, Alexander Belchenko) * qsubprocess: * Show actual command-line to user when we invoke action via qsubprocess. (Bug #476025, Alexander Belchenko) * qcommit: * Don't run `bzr add --no-recurse` before commit if there is nothing to add. (Alexander Belchenko) * qplugins: * Format plugin version nicely even if it does not follow bzr standards on version_info tuple. (Bug #475286, Alexander Belchenko) 0.15 "Yellow and green" - 2009-10-19 ------------------------------------ What's new in this release: * Compatible with bzr >= 1.17 (works fine with 2.0.x and 2.1.x series). * New qrun dialog to launch any (non-interactive) bzr command. * Improved speed of qcat, qdiff, qlog. * Added Browse button for editor selection in qconfig. * qconflicts: Enable multiple selections of conflict items to resolve or launch merge tool for them. * qgetupdates and qupdate dialogs now properly support all 3 cases: * update tree * update bound branch * update lightweight checkout * qlog can display foreign revision info if available. * Sort tags alphabeticaly and case-insensitive in qtag dialog. * qexport now has sensible defaults and more user-friendly archive types (e.g. tar.gz instead of tgz) displayed in the combo box. On windows, the default archive type is now zip as well. * And more than 37 bugfixes (plus all critical bugfixes from 0.14.x releases). Detailed changelog: * Compatible with bzr >= 1.17 (works fine with 2.0.x and 2.1.x series). * Internal: * Install QUIFactory after we have properly initialize QApplication. (#430232, John Arbash Meinel) * Better compatibility of qbzr test suite with bzr 2.1. (#433843, Vincent Ladeuil) * Use unicode('.') everywhere as current directory marker. (Naoki INADA) * Don't bundle PyQt4 and Pygments libs to Windows installer anymore. (Alexander Belchenko) * Get rid of old-style classes to be compatible with PyQt 4.6. (#447214) * New dialog: * qrun (Alexander Belchenko) * qadd: * Properly support adding unversioned files to newly added directory. (#418520, Gary van der Merwe) * qbind/qunbind: * Show Close, not Ok/Cancel, on completion. (#449489, Ian Clatworthy) * qcat: * Improve speed of syntax highlighting. (#442965, Atsuo Ishimoto) * qconfig: * Added Browse button for editor selection. (#430192, Alexander Belchenko) * qconflicts: * Enable multiple selections of conflict items to resolve or launch merge tool for them. (#415393, Craig Hewetson) * qdiff: * More responsive dialog during diff loading. (Gary van der Merwe) * Better support for external diff tools. (#422688, #423221, Gary van der Merwe) * qgetupdates: * Now able to update lightweight checkouts. (Alexander Belchenko) * qlog: * More responsive dialog during revision loading. (Gary van der Merwe) * Faster qlog on directory. (Gary van der Merwe) * Show the revision html, and file delta for all selected revisions. (#412029, Gary van der Merwe) * Don't show the throbber when loading revisions from a remote repo to avoid weird behavior. (#412894, Gary van der Merwe) * Fixed regression with --no-graph feature. (#448232, Craig Hewetson) * Display foreign revision info if available. (John Szakmeister, Gary van der Merwe) * Auto-adjust revno column to the number of digits in latest revno on mainline. (#450179, Gary van der Merwe) * qpull/qpush: * Don't remember location by default. (Alexander Belchenko) * qsubprocess: * New command-line option --bencode to use bencoded command list. (#392920, Alexander Belchenko) * Very long command-line passed to qsubprocess via temp file regardless of platform. (#387320, Alexander Belchenko) * qtag: * Sort tags alphabeticaly and case-insensitive. (#423075, Craig Hewetson) * Save/restore the size of dialog. (#435859, Craig Hewetson) * qupdate: * Now working for bound branches (aka heavyweight checkouts). (#422649, Craig Hewetson) 0.14.7 - 2010-09-04 ---------------------------- 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) * 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 ---------------------------- Bugfixes and backported bugfixes. * qlog: Fix a bug when refreshing a branch with revisions that have been removed. (Bug #435486, Gary van der Merwe) 0.14.5 "Dropzone" - 2009-10-31 ------------------------------ Bugfixes and backported bugfixes. * qcommit: * Catch AttributeError in save of commit_data during qcommit and/or uncommit in lightweight checkout from branch accessed via smart-server (lp:, bzr+ssh://, bzr:// etc). (#434034 #430382 #463296, Alexander Belchenko) * qlog: * Avoid a deprecation warning when diffing the first rev in a branch. (John Szakmeister) * qadd: * Properly support adding unversioned files to newly added directory. (#418520, Gary van der Merwe) * qtag: * save/restore the size of dialog. (#435859, Craig Hewetson) * Save the size of Dialogs when the user press Esc. (Bug 417809, Gary van der Merwe) * qsubprocess: * new command-line option --bencode to use bencoded command list. (#392920, Alexander Belchenko) * Very long command-line passed to qsubprocess via temp file regardless of platform. (Alexander Belchenko) 0.14.4 "Kenny" - 2009-10-17 --------------------------- Critical Koala bugfixes. * Internal: get rid of old-style classes to be compatible with PyQt 4.6. (#447214) * qlog: * handle revids as plain strings, not unicode. (#452235) * qcommit/qrevert: * Fixed a bug were the pending merges graph was being loaded twice. (Gary van der Merwe) 0.14.3 - 2009-10-02 ------------------- Bugfixes release. * qcommit: * Fixed bug with inability of run qcommit /path/to/tree/root after merge. (#433137, Alexander Belchenko) * qlog: * Ensure that tree objects correctly locked when checking for directories. (#436467, Gary van der Merwe) 0.14.2 - 2009-09-16 ------------------- Bugfixes. * qlog: * Fixed couple of problems with proper rendering of branch labels when inspecting log for several branches (e.g. in shared repo). (Gary van der Merwe) * qmerge, qcommit, ...: * Fixed a bug where we create the QApp after opening a Branch, but we had already installed the QUIFactory(). A branch can be a lightweight checkout of a remote location which requires a password. Which wants to open a UI dialog, which causes a crash because QApp has not been created yet. (#430232, John Arbash Meinel) 0.14.1 - 2009-09-10 ------------------- Maintenance release: * qannotate: * Fixed a bug when annotating a file in a branch with no working tree. (Bug 419477) * Fixed a bug were the logwidget would crash trying to render some graphs. (Bug 417895) * Fixed a bug were it was not possible to annotate files that have been deleted. (Bug 419790) * Fixed a bug where opening a per file diff would crash with a ObjectNotLocked error in a 2a branch. (Bug 426688) * qlog: * Fixed a bug where it was not possible to do any file list context menu actions on a file that was renamed in the revision that you were viewing. (Bug 418340) * Fixed a graph layout bug, where if the first revions of a brach was filter, there was no non direct line to it. (Bug 417895) * Removed superfluous twisties at the end of a filterted branch line. (Bug 419784) * Fixed a bug where branch lables would show on the wrong revisions. (Bug 423201) * qcommit: * Show a friendly error message when tring to commit a specific file, and there are pending merges. (Bug 417210) * qbrowse: * Fixed a bug where the window would crash with a ObjectNotLocked error when expanded a folder in a 2a branch. (Bug 424258) * Handle errors raised from _qbzr_run methods and the __init__ methods that they call, so that ui-mode is honoured when they are reported. (Bug 420534) 0.14 "Eucalyptus" - 2009-08-21 ------------------------------- What's new in this release: * we have 5 new dialogs (qbind, qunbind, qexport, qplugins and quncommit). * better help for plugin itself (now `bzr help qbzr` gives you useful info). * qcommit and uncommit hook now can store revision message and information about bugfixes for revision, this information automatically restored on next qcommit run in this branch. * most q-commands now able to return exit code 0 when operation finished successfully, and exit code 1 when dialog/operation was canceled. * `merge --qpreview` feature has disabled. * qmerge now supports uncommitted and forced merging. * Dozen bugfixes and small improvements. Detailed changelog: * New dialogs: * qbind, qexport, qunbind (Javier Derderian) * qplugins, quncommit (Ian Clatworthy) * Renamed [hidden] command qbzr to qmain. * Better help for plugin itself. * Full list of all contributors added to AUTHORS.txt. * Most q-commands those change state of the branch or working tree (e.g qcommit, qadd, qpull etc.) now return exit code 0 when operation finished successfully, and exit code 1 when dialog/operation was canceled. Commands those only show information about branch/tree or the bzr itself (e.g. qlog, qdiff, qversion) always return exit code 0. * Now QBzr can save and restore bug ids information on qcommit cancel and in uncommit hook (#380896, #328636). On uncommit it also saves beginning and end revision ids of uncommitted chain of revisions in addition to old tip revision message and bug ids. All data saved as dictionary in "commit_data" section of branch.conf. * Disabled decoration of merge command with --qpreview option (#395817). * qmerge now supports forced merging and merging of uncommitted changes. (#400062, #409865) * qinfo now works on shared repositories (#385105) 0.13.1 - 2009-08-11 ----------------------- * qdiff: Fix for critical regression when viewing diffs with images. (#411811) 0.13 - 2009-08-10 ----------------------- * Bazaar 1.18 compatibility fixes. (#397615) (#402022) (#404269) * Support for PyQT 4.5 (#394125) * New dialogs for qsend (#174504), qswitch (#385116) * External diff buttons are now the correct width when using the qgtkstyle. * Added Estonian translation. * Bug reports now point to https://bugs.launchpad.net/qbzr/+filebug rather than https://bugs.launchpad.net/bzr/+filebug. It is now possilble to click on this link. * qcommit: * Pressing Escape cancels the dialog. * Spelling suggestions are shown in the message context menu. (#395895) * If you dbl click on a pending merge, it will show the revision message, which is usefull if you want to copy it. * When the arguments are written to a file, thay are now encoded. (#398750) * Added a refresh button to reload changes. (#253777) * qcommit, qadd, and qrevert now reuse the widget from qbrowse. This means that there are more context menu items, and you can expand unversioned directories (#258929). On Windows and Mac, system file icons are shown. * qrevert: You can now control if you want to revert pending merges. (#388469) * qlog: * Support for Mantis BugTracker bug urls. * Wildcards now supported to search for message, author, tags and bugs. You can see all revisions with tags or bugs by selecting corresponding search filter and type * in the search entry. * qannotate: * It is now possible to annotate the working tree. * Branch encoding setting is now correcly loaded. (#397753) * A minimum of 80 chars is now shown (#397756) * qdiff: * Use configured color for interline_changes_background. * Files now correctly aligned. There is no longer a space at the end of each line. (#271178) * Performance improvement for loading and scrolling. (#411367) 0.12 - 2009-07-08 ----------------------- Maintenance release: compatibility with bzr 1.17 (progress indicator for commands); branching into exisiting directory (with qbranch) works now (require bzr 1.17); better support of unicode paths in various commands. * qbranch: now it's possible to branch into newly created empty directory. * qgetupdates: new alias: qgetup * qmerge: the revision argument is no longer ignored. * qupdate: new command as simple front-end for stadard `bzr update` * qversion: new command to display Bazaar & Python installation information * qannotate: * Revisions are loaded lazily (only when they appear on screen.) This greatly reduces the load time when annotating a file from a remote branch. (The code for this is reused from qlog.) * Add a item to the revision list context menu to annotate a older revision. * qbrowse: * It is now possible to browse a working tree. The change status of file is shown. * Trees are loaded lazily (sub directories are only loaded when you expand them.) * Revisions are loaded lazily (only when they appear on screen.) This greatly reduces the load time when browseing a remote branch. (The code for this is reused from qlog.) * qlog/qannotate/qbrowse: revision numbers are right aligned on the mainline number. E.g: 10 9 8.2 8.1 8 * Universal installer for Windows: one installer for both standalone bzr.exe version and for python-based version. NOTES: this is last release with tested PyQt 4.3.x support. All further releases will be tested against PyQt 4.4 as minimum supported version. 0.11.0 - 2009-06-11 ----------------------- Maintenance release: compatibility with bzr 1.16 (bencode releated changes), improved performance of qlog, more fixes for side-by-side qdiff, a dozen of various bugfixes. Windows standalone installer for QBzr now built with Inno Setup. Now user can install only main QBzr files without additional libraries (e.g. PyQt4). So this installer now can be used to upgrade copy of QBzr plugin installed as part of standalone bzr.exe installer. * qbrowse: * Fix problem with opening the log for file/directory. (#383192) * qinfo: * Add a basic help string (#384632) * qview command renamed to qviewer (previously qviewer was alias for qview) to avoid confusion with bzr views feature. (#385225) NOTES: when upgrading your standalone installation of qbzr (on Windows) you should uninstall old QBzr first, and then re-install it from new installer. 0.10.0 - 2009-06-02 ----------------------- Maintenance release: log widget with revisions graph used in qannotate, and qcommit (to show pending merges); you can search for tags and bugs in qlog; improvements to show qlog for multiple files or for dir content; more context menus; various bugfixes. * qlog: * Added search for tags and bugs. * Fixed a bug with qlog FILE where it was not showing revisions if the revision that changed the file had been merge into another branch before it was merged into the mainline. (Bug #350166) * Fixed a bug when clicking refresh with multiple branches open. (Bug #351633) * When viewing a remote branch, qlog will load the revisions from local current directory if availible. * Improvements to the graph layout. * When opening diffs, there is less of a delay. * When running qlog DIR, revisions that change the children of the directory are also displayed. This only works if you are using bzr 1.14. (Bug #314528) * When runing qlog FILE1 FILE2 or qlog DIR, changes to the specified files are displayed in bold. By default diff will show changes only to selected items. Full diff could be invoked via context menu. * Add context menu to file list. * qannotate: * Use the log widget to display the revision list with a folding graph. The graph can be disabled by using the --no-graph command line argument. (Bug #328595) * Fixed a bug where qannotate crashes if you scroll to the bottom of the file and the file's last line is blank. (Bug #340956) * Add option to the log context menu to select a revision to annotate. * qcommit: * Use the log widget to display the pending merges list with a folding graph. (Bug #328592) * qdiff: * Fixed a bug with the error reporting when launching external diffs. * qpull/qpush/qmerge: * If there is no default saved location then set focus on URL combobox 0.9.9 - 2009-03-28 ---------------------- Maintenance release: qlog improvements, bugfixes, configurable external merge to use with qconflicts, configurable colors for qdiff window, new qview command. * qcommit: * Added Diff button to view changes in files selected to commit. * qconfig: * Added tab to configure external merge tools. * qconflicts: * Use extmerge if configured. * qdiff: * User can configure colors for diff view in qbzr.conf, under the [QDIFF COLORS] section * qlog: * Added support for following bug trackers: Microsoft SharePoint, FogBugz, Roundup. * new --no-graph command line option to show plain log for one file. * new style of labels for bugs/tags/branches. * qrevert: * Added Diff button to view changes in files selected to revert. * qview: new command to view content of any arbitrary file from disk. * When some internal error occurs while q-command is running then user will see special information dialog with error message and prompt to file the bug report. * Added special translation for English locale. 0.9.8 - 2009-02-13 ------------------ This release is a minor regression fixing release, to be released in sync with bzr 1.12 final. * Fix bug where qinit was not working - correclty handle QString arguments when starting a subprocess (Bug #327395) 0.9.7 - 2009-02-09 ---------------------- * qcommit: * handle situation with huge list of committed files on Windows (Bug #277077). * properly show changed files when only executable bit changed. * fixed a bug, where if there is a lock on a branch, you could not close the window. * qconflicts: new command and new window to view and resolve conflicts. * qlog: * removed the delay when loading revision form local repositories. * when the search is, scroll so that the selected revision is kepted in view. * qdiff: * Don't use replace when decoding texts, fall back to latin1 instead. (Bug #323543 - side-by-side shows wrong changes highlighting for files with non-ascii characters) * qrevert: * added --no-backup option. * Add the ability to configure, and use external diff tools from QBzr. If the user has bzr-difftools - the usability of this funcaility is improved. * Properly stop running action with Cancel button on Windows. * Transport activity is displayed next to the throbbers/progress bars. * Password prompts are now displaied in qlog, qbrowse, qcat, qdiff, qannotate. 0.9.6 - 2009-01-10 ---------------------- New features in this release: throbber, interactive password prompt, post_uncommit hook, new bug-url command. Dozen of bugs fixed as well. * Add post_uncommit hook to remember the uncomitted commit message. * Add interactive prompt for password if access to the branch require it. * Add throbber feature: user will see message "Loading..." and animation when there is long operation in progress to indicate that qbzr window is not hang. * Command-line interface to QBzr commands now is much closer to coresponding commands in bzr itself. Where possible commands options are reused from bzr. (#272359) * qcommit: * Commit without message is forbidden (#297606). * If no files selected to commit then user will be asked for confirmation. Commit without files allowed only when bzr >= 1.6 is used. (#148165) * qdiff: * To detect binary files entire file content is analyzed, not only first 1K. * Short option name for --deleted changed from -D to -K. * If there is no changes in the tree or specified file list (file group) then show info box with "No changes found" message (#295767). * Unidiff produce valid headers. (#308095) * qlog: multiple improvements for showing common log of multiple branches. * qpull and qmerge in lightweight checkouts now working for the tree, not for the master branch. (#310314) * New command bug-url (console only) can show you full URL to bug number and optionally open this URL in your browser. * New translations added: Hebrew, Polish. 0.9.5 - 2008-11-03 ---------------------- Maintenance release: various bugfixes and bunch of small improvements. New features: * qcat: * New command-line option `--native` to show file content in native application rather than in usual QCat window. (experimental) * qtag: new command to edit tags. * New translation added: Turkish NOTES: when upgrading old installation (<0.9.2) of QBzr to 0.9.5, please uninstall or remove old files first. 0.9.4 - 2008-09-20 ---------------------- This release provide many new features and new commands, and many improvements and bugfixes to existing commands. New commands, similar to standard bzr commands: qadd, qinfo, qinit, qmerge and qrevert New 'hybrid' commands: qgetnew, qgetupdates, qinit Hybrid commands provide universal interface to several similar bzr functions in one dialog and supposed to be configurable via dialog options. This release is also contains next improvements: all q-commands now lazily registered to to minimalize the bzr startup time; autocompleter in qcommit now understand more programming languages, not only C/Python; qcommit trying to spell check your commit message, if you have PyEnchant installed; qannotate and qdiff(!) highlight syntax of source code files; qlog can use bzr-search plugin for searching in history; qlog can show combinated history for several branches from one shared repository. Here the list of most user-visible changes since 0.9.3: * qadd, qinfo, qinit, qmerge and qrevert: * Added new commands. * qannotate: * A working tree is no longer required to annotate a file. * The column widths are resize automaticly. * Syntax highlighting of annotated file (Pygments library required). * qbrowse: * A context menu item has been added to annotate a file. * qcommit: * Improved auto-completer understand more programming languages. * Checkbox to select/deselect all files * Simple spell checker support (required PyEnchant library) * Ignored items no longer shown. * qdiff: * A checkbox has been added to control weather a Complete diff is shown. * Syntax highlighting of shown files (Pygments library required). * Diffing across 2 branches. * Show revno in the window title not revid if possible. * qlog: * The graph is now not hidden when you search. * Improved graph layout. * The graph now shows lines for sprouts and roots. * You can specify multiple branches, or multiple files or a repository as a location. Heads from different branches are labeled. * Pending merges are shown. * A refresh button has been added. * If you have bzr-search installed, and the branch you are viewing has index, you can search using the index. (#251468) * qgetnew * New 'hybrid' command to fetch a new working tree. The dialog allows you to choose if you want to 'branch' or 'checkout' the source. * qgetupdates * new 'hybrid' command to update a working tree: involves 2 dialogs, one shown if the tree is a checkout, and the other if it is a branch. * New translation added: Galician NOTES: when upgrading old installation (<0.9.2) of QBzr to 0.9.4, please uninstall or remove old files first. 0.9.3 - 2008-08-19 ---------------------- Maintenance release: * qcommit: * Double-click on pending merge show changes properly (#252879). * Better support for compiz (#245419). * New command-line options: --local and --message (#253613). * qdiff: * Added a refresh button (#252191). * Workaround for random segfault of qdiff due the bug in bzrlib's C implementation of patience diff sequence matcher. * Show x-bit (+x) property for added/removed files in side-by-side view. * qlog: * When you search on revision id or revision number, it selects the revision that matches, rather than filtering the ones that don't. This also faster. * New revision details view. * Fixed problem with showing merges for some branches (#255265). * Support for Redmine bug URLs. * merge --qpreview: * workaround for bug in bzrlib's PreviewTree related to renamed files (#251537). * qpull/qbranch: * Better detection of bzr executable for the case of standalone bzr.exe (#256793). * New translations: Dutch, French, Italian, Japanese Launchpad Translations service re-enabled for translations of QBzr strings. NOTES: when upgrading old installation (<0.9.2) of QBzr to 0.9.3, please uninstall or remove old files first. 0.9.2 - 2008-07-22 ---------------------- This release is first step towards QBzr 1.0. In this release QBzr introduce new qlog view with nice graph of revisions. qcat window now allow you to see images as images, binary files as hex dump, and target for versioned symlink. Side-by-side diff now able to show changes in image files; side-by-side and unidiff will show you changes in executable bit as well. Also you can specify in command line which files (added/removed/modified/renamed) you want to see in qdiff. Also there is many other improvements and many bugfixes. See the list of user-visible changes below. NOTES: when upgrading old installation of QBzr to 0.9.2, please uninstall or remove old files first. * qannotate: * Show tags (if any) for revision in revision message view (#149246) * qbrowse: * Now supports any kind of URLs as branch location, not only local paths (#241930) * Double-click on file opens qcat window and show file content (#148028). Also user can run this action via context menu -> View file * qcat: * Show content of image file as image (#242070) and hex dump for other binary files * Now able to show symlink target. Window title better reflects content type * qcommit: * Don't show entire filename as extension if name started with dot (e.g. for .bzrignore files) * Set focus on Message Edit area if there is no saved message; otherwise set focus on OK button (#215271) * UI improvements: * user can walk with Tab key over all control widgets (#243177); * message saved not only when user press Cancel, but on other closing actions too (e.g. Alt+F4); * Ctrl+Enter in message edit area triggers commit action (#148156) * qdiff: * Options to filter diff output (to see added/deleted/modified/renamed files in any combination) * Show label '[binary file]' for modified binary files (#165006) * Images are shown in side by side diff. (#242083) * Window loads straight away, and the diff loads incrementaly in the background, showing files that have be diffed as the become availible. (#174964) * 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 collapsed. (#242752) * qdiff, qcat, qannotate: Font sizes are no longer set a a small 8pt. They now use the default widget font size. (#240859) 0.9.1 - 2008-06-17 ---------------------- Maintenance release: * qannotate: fixing incompatibility with Python 2.4.x in decoding lines to unicode (#209467) * qbrowse->qlog->qdiff: properly lock repository before invoking qdiff window (#209875) * qconfig no more fails if whoami missed e-mail. (#239534) * catching PyQt4 ImportError and show to user explanation message instead a traceback. (#240123, #163728) * Fix "QPainter::begin: A paint device can only be painted by one painter at a time." warning from Qt (#234965) Translations was updated; Spanish translation added. Launchpad Rosetta service no more used for translations. See "Help translate" section in README.txt for details. 0.9.0 - 2008-03-29 ---------------------- * New commands: qpull, qpush, qbranch * New qannotate view * Search for author names, revision ids/numbers in qlog * Fixed single-file diff of renamed file in qlog * Display child revision links in qlog * New option for local commit in qcommit * Handle empty revision specified in qbrowse * Display author names instead of committer names in qbrowse * Fixed `qbrowse -rN` * Fixed getting of modified files in qlog opened from qbrowse 0.8.0 - 2007-12-08 ------------------ * qannotate: * Double clicking history in annotate window should open diff window. (Lukテ。ナ。 Lalinskテス, #148024) * qbrowse: * Context menu "Show log" now actually works. (Alexander Belchenko, Mario del Pozo, #147434) * qcat: * Show contents of a file in a particular revision. (Lukテ。ナ。 Lalinskテス) * qcommit: * Ask for confirmation when trying to commit with empty message. (Lukテ。ナ。 Lalinskテス, #173327) * Remember the last message on cancel or error. (Lukテ。ナ。 Lalinskテス, #149743) * qconfig: * New command. (Lukテ。ナ。 Lalinskテス) * qdiff: * Removed unused option --inline. (Alexander Belchenko, #148409) * Fix a special case where the line in the HTML view still contained newline characters. (Lukテ。ナ。 Lalinskテス) * Fix failure for modified file in moved directory. (Lukテ。ナ。 Lalinskテス) * qlog: * Add a global branch lock around qlog to make showing of modified files on packs faster. (Lukテ。ナ。 Lalinskテス, #173327) * Use a flat list for single-file log. (Lukテ。ナ。 Lalinskテス, #172558) * Display text with the right color for selected but non-active lines with tags/bugs. (Alexander Belchenko) * Open a single-file diff window after double-clicking on a file. (Lukテ。ナ。 Lalinskテス, #148410) * Search in commit messages. (Lukテ。ナ。 Lalinskテス, #162952) 0.7.1 - 2007-11-17 ------------------ * Custom implementation of global bzr option 'change' used by qdiff, to provide support of bzr older than 0.91. (#162875) * qannotate no more try to read revisions outside of text origins. (#151458, #162505) * Windows installers contain compiled translations files. (#162951) 0.7.0 - 2007-11-10 ------------------ * Added version info for 'bzr plugins'. * Gettext support. * Remember window sizes and states. (#148157) * qdiff: * New command line option '-c'. * Optional unified diff view. * Use per-branch 'encoding' option to decode source code. (#148159) * qlog: * Display text with the right color for selected lines with tags/bugs. (#147998) * Use os.startfile to open external links if the webbrowser module is not available. (#148002) * Add the Diff button in the Log dialog. * Display only the committer/author name in revision lists. * qcommit: * Fixed commit with pending merges. (#148849) * Allow reverting and viewing changes of multiple files in qcommit. * Double click on a pending merged revision will show the changes. * Fixed pre-selecting of files specified on the command line. 0.6.0 - 2007-09-06 ------------------ * Support for --fixes and --author eqivalents in the commit dialog. * Display fixed bugs in the log view. * Changed color of tags to yellow (to make it more consistant with gitk/hgk). * Faster diff viewing from the log window. * Pending merges in the commit dialog are now displayed as a flat list. * PyQt 4.3 fixes. 0.5.0 - 2007-07-29 ------------------ * Improved annotation viewer. * Fixed Windows installer (included the Queue Python module). 0.4.0 - 2007-07-20 ------------------ * qbrowse of a new branch errors (#113602) * Support for diffing of two working trees. * Display pending merges in the commit dialog. * Display tags in the log view. * Fixed working tree locking for qannotate by using tree.path2id instead of tree.inventory.path2id. (#121631) * New diff viewer. 0.3.1 - 2007-03-15 ------------------ * Compatibility with bzr 0.15 0.3.0 - 2007-03-09 ------------------ * Rewritten diff viewer: * Now works also with binary files. * Displays more information about the files. * qbrowse uses native system icons instead of the Tango ones. * Windows installer for the 'standalone' Bazaar package. 0.2.0 - 2007-02-02 ------------------ * Bug Fixes: * qdiff * Fixed highlighting of inter-line changes containing HTML. * qcommit * The editor now doesn't accept rich-text. * New Features: * qdiff * Configurable window size. * qcommit * Non-versioned are hidden by default, add a checkbox to show them. * Auto completion of file and variable/class/function names (only for Python source code right now, but it's easily extendable for other languages). * Added option to revert a file from the commit dialog. 0.1.0 - 2006-12-26 ------------------ * Initial release. ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/README.md0000644000000000000000000001163414556556456012126 0ustar00QBrz - Qt-based front end for Breezy #################################### QBrz is a cross platform, Qt-based front-end for Breezy, providing GUI applications for many core brz commands. In addition, it provides several special dialogs and helper commands. Equivalents for core brz commands have the same names as CLI commands but with a prefix of "q". Requirements ============ * Python 3 * Breezy VCS itself (see below version compatibility information) * PyQt 4.4 with Qt 4.4 or later http://www.riverbankcomputing.co.uk/pyqt/ http://www.trolltech.com/products/qt * Pygments v.1.0 or higher (optional, needed for syntax highlighting) http://pygments.pocoo.org/ * PyEnchant (optional, needed for spellchecking in qcommit) http://pyenchant.sourceforge.net/ Provided Commands ================= Basic q-commands: * qadd - GUI for adding files or directories. * qannotate - Show the origin of each line in a file. * qbind - Convert the current branch into a checkout of the supplied branch. * qbranch - Create a new copy of a branch. * qcat - View the contents of a file as of a given revision. * qcommit - GUI for committing revisions. * qconflicts - Show conflicts. * qdiff - Show differences in working tree in a GUI window. * qexport - Export current or past revision to a destination directory or archive. * qignore - Ignore files or patterns. * qinfo - Shows information about the current location. * qinit - Initializes a new branch or shared repository. * qlog - Show log of a repository, branch, file, or directory in a Qt window. * qmerge - Perform a three-way merge. * qplugins - Display information about installed plugins. * qpull - Turn this branch into a mirror of another branch. * qpush - Update a mirror of this branch. * qrevert - Revert changes files. * qsend - Mail or create a merge-directive for submitting changes. * qswitch - Set the branch of a checkout and update. * qtag - Edit tags. * qunbind - Convert the current checkout into a regular branch. * quncommit - Move the tip of a branch to an earlier revision. * qupdate - Update working tree with latest changes in the branch. * qverify-signatures - Show digital signatures information * qversion - Show version/system information. Hybrid dialogs: * qgetnew - Creates a new working tree (either a checkout or full branch). * qgetupdates - Fetches external changes into the working tree. Additional commands: * qbrowse - Show inventory or working tree. * qconfig - Configure Breezy and Qbrz. * qrun - Run arbitrary brz command. * qviewer - Simple file viewer. Miscellaneous: * bug-url - print full URL to a specific bug, or open it in your browser. Interface localization ====================== Qbrz uses gettext library for i18n support. Available translations resides in po/ subdirectory of the tree. Qbrz expects to load binary mo-files from locale/ subdirectory of the tree. To generate translation POT-template file you need to run command: python setup.py build_pot All existing PO-files will be updated as well. To compile translations to binary mo-files you need to run command: python setup.py build_mo NOTE: windows installer ships with latest compiled translation inside. Help translate -------------- You can help to translate Qbrz interface to other languages. You can use either Launchpad trnaslations interface (it's preferable way) see https://translations.launchpad.net/qbrz, or you can translate it offline, see instructions below. First at all you need to download from http://bazaar.launchpad.net/~qbrz-dev/qbrz/trunk/files either `po/qbrz-XX.po` (where XX is your language and country code) or `po/qbrz.pot` if there is no po-file for your language yet. Then you need to translate it either using any suitable text editor with UTF-8 support or with tools like Poedit (http://www.poedit.net/) or KBabel (http://kbabel.kde.org/). When you're finish please file a bug report at https://launchpad.net/qbrz/+filebug and attach the translated file. To learn more about gettext and po-files see: http://www.gnu.org/software/gettext/ Language and country codes listed in gettext manual: http://www.gnu.org/software/gettext/manual/gettext.html#Language-Codes Configuration ============= The configuration is in .bazaar/qbrz.conf. qlog_replace ----------- Multiline value containing regular expressions to replace text in commit messages (useful to make clickable links to bug reports, ...). Can be used for example by adding: qlog_replace='''#(\d+) #\1''' to project/.brz/branch/branch.conf. diff_show_intergroup_colors --------------------------- Boolean value to allow painting interline changes in different colors depend on the kind of change. Use values 'True' or '1' to enable option. More Info ========= * Mailing list/Discussion forum: http://groups.google.com/group/qbrz * Bug Tracker, Source Code, Translations, Questions: https://launchpad.net/qbrz ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/TODO.txt0000644000000000000000000000166214556556456012155 0ustar00TODO List ========= Todo items, feature requests, wishes, and wild ideas. - allow changing of location in qbrowse -- is it really needed? [bialix] - tabbed (per file) qdiff view - more information in qblame (like gblame) -- needs more details [bialix] - pluggable API for adding pages to qconfig from other plugins - faster qdiff on big binary files: provide small optimization re binary files: 1) try to get content of binary file from working tree first 2) if it's really binary file and it's not image file then skip reading its content from revision tree/repository 3) support for binary settings in rules file (global/local does not matter), e.g. * rule name: ``binary``, * possible values: ``auto`` (default, require content check), ``yes`` (force binary mode, no need to check content), ``no`` (force text mode, no need to check content) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/__init__.py0000644000000000000000000002031014556556456012747 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2008 Lukáš Lalinský # Copyright (C) 2009-2016 QBzr Developers # # 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. """QBrz - Qt5-based frontend for Breezy QBrz is a cross platform, Qt-based front-end for Breezy, providing GUI applications for many core bzr commands. In addition, it provides several special dialogs and helper commands. Equivalents for core bzr commands have the same names as CLI commands but with a prefix of "q". QBrz requires Qt/PyQt 5 to be installed. Basic q-commands: * qadd - GUI for adding files or directories. * qannotate - Show the origin of each line in a file. * qbind - Convert the current branch into a checkout of the supplied branch. * qbranch - Create a new copy of a branch. * qcat - View the contents of a file as of a given revision. * qcommit - GUI for committing revisions. * qconflicts - Show conflicts. * qdiff - Show differences in working tree in a GUI window. * qexport - Export current or past revision to a destination directory or archive. * qignore - Ignore files or patterns. * qinfo - Shows information about the current location. * qinit - Initializes a new branch or shared repository. * qlog - Show log of a repository, branch, file, or directory in a Qt window. * qmerge - Perform a three-way merge. * qplugins - Display information about installed plugins. * qpull - Turn this branch into a mirror of another branch. * qpush - Update a mirror of this branch. * qrevert - Revert changes files. * qsend - Mail or create a merge-directive for submitting changes. * qswitch - Set the branch of a checkout and update. * qtag - Edit tags. * qunbind - Convert the current checkout into a regular branch. * quncommit - Move the tip of a branch to an earlier revision. * qupdate - Update working tree with latest changes in the branch. * qverify-signatures - Show digital signatures information * qversion - Show version/system information. Hybrid dialogs: * qgetnew - Creates a new working tree (either a checkout or full branch). * qgetupdates - Fetches external changes into the working tree. Additional commands: * qbrowse - Show inventory or working tree. * qconfig - Configure Breezy and QBrz * qrun - Run arbitrary bzr command. * qviewer - Simple file viewer. Miscellaneous: * bug-url - print full URL to a specific bug, or open it in your browser. RJL 2020: This is the updated version for QBrz and Qt5 """ import sys if sys.version_info < (3,4,0): sys.stderr.write("You need python 3.4.0 or later to run this script\n") exit(1) # New location for sip # https://www.riverbankcomputing.com/static/Docs/PyQt5/incompatibilities.html#pyqt-v5-11 # from PyQt5 import sip # sip.setapi('QVariant', 2) # Note: # https://doc.bccnsoft.com/docs/PyQt5/pyqt_qvariant.html#ref-qvariant # In PyQt5 the implementation of QVariant is different to those of PyQt4. By default the behaviour is the same # as PyQt4’s v2 API. However it is possible to temporarily suppress the automatic conversion of a C++ QVariant # to a Python object and to return a wrapped Python QVariant instead - behaviour similar to PyQt4’s v1 API - by # calling the sip.enableautoconversion() function. # Get the version number from version.txt # We have to find it relative to ourselves... import os base_path = os.path.dirname(os.path.abspath(__file__)) version_file_path = os.path.join(base_path, 'version.txt') with open(version_file_path, 'r') as f: v_version, v_major, v_minor = f.read().strip().split('.') # RJL: Breezy's _format_version_tuple expects integers, not strings version_info = (int(v_version), int(v_major), int(v_minor),'dev',0) __version__ = '.'.join(map(str, version_info)) import breezy from breezy.commands import plugin_cmds # merge --qpreview disabled for 0.14 because it makes qbrz incompatible with bzr-pipeline plugin # see bug https://bugs.launchpad.net/bugs/395817 # register_lazy_command('breezy.plugins.qbrz.lib.commands', 'cmd_merge', [], decorate=True) # provides merge --qpreview lazy_commands = ( # module, command, [aliases] ('breezy.plugins.qbrz.lib.commands', 'cmd_qadd', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qannotate', ['qann', 'qblame']), ('breezy.plugins.qbrz.lib.commands', 'cmd_qbind', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qbranch', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qbrowse', ['qbw']), ('breezy.plugins.qbrz.lib.commands', 'cmd_qmain', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qcat', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qcommit', ['qci']), ('breezy.plugins.qbrz.lib.commands', 'cmd_qconfig', ['qconfigure']), ('breezy.plugins.qbrz.lib.commands', 'cmd_qconflicts', ['qresolve']), ('breezy.plugins.qbrz.lib.commands', 'cmd_qdiff', ['qdi']), ('breezy.plugins.qbrz.lib.commands', 'cmd_qexport', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qgetnew', ['qgetn']), ('breezy.plugins.qbrz.lib.commands', 'cmd_qgetupdates', ['qgetu', 'qgetup']), ('breezy.plugins.qbrz.lib.commands', 'cmd_qhelp', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qignore', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qinfo', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qinit', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qlog', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qmerge', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qplugins', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qpull', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qpush', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qrevert', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qrun', ['qcmd']), ('breezy.plugins.qbrz.lib.commands', 'cmd_qshelve', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qunshelve', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qtag', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_quncommit', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qupdate', ['qup']), ('breezy.plugins.qbrz.lib.commands', 'cmd_qverify_signatures', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qversion', ['qsysinfo']), ('breezy.plugins.qbrz.lib.commands', 'cmd_qviewer', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qsend', ['qsend']), ('breezy.plugins.qbrz.lib.commands', 'cmd_qswitch', []), ('breezy.plugins.qbrz.lib.commands', 'cmd_qunbind', []), # extra commands ('breezy.plugins.qbrz.lib.extra.bugurl', 'cmd_bug_url', []), ('breezy.plugins.qbrz.lib.extra.isignored', 'cmd_is_ignored', []), ('breezy.plugins.qbrz.lib.extra.isversioned', 'cmd_is_versioned', []), # hidden power of qbrz ;-) ('breezy.plugins.qbrz.lib.commands', 'cmd_qsubprocess', []), ) for module, name, aliases in lazy_commands: plugin_cmds.register_lazy(name, aliases, module) def post_uncommit_hook(local, master, old_revno, old_tip, new_revno, hook_new_tip): from breezy.plugins.qbrz.lib.commit_data import QBzrCommitData branch = local or master ci_data = QBzrCommitData(branch=branch) ci_data.set_data_on_uncommit(old_tip, hook_new_tip) ci_data.save() try: from breezy.hooks import install_lazy_named_hook except ImportError: from breezy.branch import Branch Branch.hooks.install_named_hook('post_uncommit', post_uncommit_hook, 'Remember uncomitted revision data for qcommit') else: install_lazy_named_hook("breezy.branch", "Branch.hooks", 'post_uncommit', post_uncommit_hook, 'Remember uncomitted revision data for qcommit') def load_tests(basic_tests, module, loader): from breezy.plugins.qbrz.lib.tests import load_tests return load_tests(basic_tests, module, loader) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/0000755000000000000000000000000014556556456011553 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/0000755000000000000000000000000014556556456011572 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/extras/0000755000000000000000000000000014556556456012150 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/installer/0000755000000000000000000000000014556556456012637 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/iscc0000755000000000000000000000033014556556456011505 0ustar00#!/bin/sh unset DISPLAY scriptname=$1 [ -f "$scriptname" ] && scriptname=$(winepath -w "$scriptname") wine "C:\Program Files (x86)\Inno Setup 5\ISCC.exe" "$scriptname" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/0000755000000000000000000000000014556556456011410 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/0000755000000000000000000000000014556556456012101 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/0000755000000000000000000000000014556556456011260 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/run-tests.sh0000755000000000000000000000013214556556456013141 0ustar00#!/bin/sh # bzr selftest -s bzrlib.plugins.qbrz $@ brz selftest -s breezy.plugins.qbrz $@ ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/setup.py0000755000000000000000000000325114556556456012360 0ustar00#!/usr/bin/env python # -*- coding: utf-8 -*- import sys if sys.version_info < (3,4,0): sys.stderr.write("You need python 3.4.0 or later to run this setup script\n") exit(1) # from distutils.core import setup from setuptools import setup # RJL Patched out temporarily try: from extras import cmdclass except (ImportError, SystemError): cmdclass = {} except ValueError: try: from extras import cmdclass except ImportError: cmdclass = {} # RJLRJL: patiencediff and dulwich also needed # Dulwich is installed with breezy and you cannot use this without breezy anyway # # https://katastrophos.net/andre/blog/2009/03/16/setting-up-the-inno-setup-compiler-on-debian/ # ... is needed for inno setup from extras import cmdclass # Get the version number from version.txt with open('version.txt', encoding='utf-8') as f: version_str = f.read().strip() ext_modules = [] setup(name='qbrz', description='Qt5 frontend for Breezy', keywords='plugin brz qt qbrz', version=version_str, url='https://www.breezy-vcs.org/', license='GPL', author='QBrz Developers', author_email='qbrz@googlegroups.com', package_dir={'breezy.plugins.qbrz': '.'}, package_data={'breezy.plugins.qbrz': ['locale/*/LC_MESSAGES/qbrz.mo', '*.txt', ]}, packages=['breezy.plugins.qbrz', 'breezy.plugins.qbrz.lib', 'breezy.plugins.qbrz.lib.extra', 'breezy.plugins.qbrz.lib.tests', 'breezy.plugins.qbrz.lib.widgets', ], ext_modules=ext_modules, cmdclass=cmdclass, install_requires=['patiencediff', 'breezy', 'fastbencode', 'python3-sip'], ) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/ui/0000755000000000000000000000000014556556456011257 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/version.txt0000644000000000000000000000000614556556456013064 0ustar000.4.2 ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/0000755000000000000000000000000014556556456012340 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/22x22/0000755000000000000000000000000014556556456012332 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/bzr-16.png0000644000000000000000000000121414556556456013300 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxڤS]HSqvZMLLPCI%~ts|0"i=>'mBE1`FV7Û .:H8[N:yp ƾV(^NІn):BÀtɨS~*Iw4Qe12NDMSo+,q*"Rs7l gUaⵊʊl0.>||EkccjH"MP]ټVP'D.B0[7ق?acdMtbf _` 5LCGG7 .K،W2+Âw1]Ncf=4BC CQS2eV)vnb A[3 }p=l/4Z&{z{%Ox.ن<8E݇UX9l2Ezpi=d ;xv]R89?'q(+'/W[lIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/bzr-32.png0000644000000000000000000000325014556556456013300 0ustar00PNG  IHDR szzbKGD pHYs  tIME vE5IDATXý{PTuǿ{ k4)R(RX9P(TJ9X)"1S $si"R33sF_)E,]D)3sg~|?KK;^b,,iΦ%/=doPq*ܭJX2x=ɘtѯ 3\) bގ Dbs6ҽxn Ck_A y_()4̹{ߖg߸2R Q#d5ML㳢@nO+hإO +x\wFQg gB1عOk% Ȗ]\T1|pFJ2=*ζ׋2 "{or+*ORH2wr?~c ۸SK\Nͩx!\8_\| yBdྫྷ-@F}5v4q EPBK(:Aւ3?_(Bb/#Oϱ=lW6$6v_jڷu 3un ɐ:Yh#*SIJlhq.k Oq5[L2 `[q+UfBBc*Cf(EF/c$C~\4M<*;`n=I!01/|eRG1X 9P*g0W cްY7\{)Y3PrUÞGkKZڙAŵTB܉O?ż߀Z]m自~8@R/ܿ8P4knJ2zs wЮF(>)pMSgZ*݆7f7.Rh̭ҏNkr g: ;m(UOԺ?[^׀3U9Mn ͚RtA>IV4tjJ<| k]^j[Y17\u͚ݗb5ץ&yK..{ߊ!N(TJEŚWa nR- :ɊЬYk3 ,*rlrxWc"b{a>5Gh,jf&͚۱ҧ:-A(zg vG~Ũ;KV XP勴&5ϨRt!'/_ YsK)}ǥ22=QĽmqD1 &5;^S<W HHiNⶸq`4knyhil:PdU=B(Kj^{ rщqVz.T!.AYy4kr-j3X%5OAބ6MboG> 0t̊_cՅocD/2ht(׿c_o yⅡqcor$0*CP kĒDimrE)FEF\ $} `s1LѳC4!sV)'M RWÜ,8οԙm@ o[y ?X*}UxY feYX 1lr2O JBӱCnT9t8]>-/鐓?+aF:`cƵY^郔iЙ⭾d)Koz]Lmi1( | 6Me+kǑr'v~Q@; S@LO[AFx^nAL?V[ Gs嫡8[ ~QFNڌcNy|k`p9lzTqNA~x'ъrM(Fy*֡HC`# UWr;dઠ1ˊ]М"#"D|Naʸ-JMf`Wmn:UV'lU\>QT;3e̘ث=:-iDC}¶P{Aku\e]qyqj5#' qFPىѣlA71qٞKngERz^UxvZ|<iT jHL{'N6 V *Fvx&2p$I:,j)r5+ܺ}HRp:CBNncTJT{' ,mA Bʔ^׬dz*q7HWwC-M@=V/g wԅ 'kvK `ԟsQ# Qp.8a2ݴ3swr_{l>,ٟJPZ8v,IE0*j9Z ơkt/]X*8{l2y ZǍaײlٯ3ܹ[dƇ(G pEd[aI>nF >я{x ~2TM.=- ڕO 3޲ z{ xBq-xcMK7#PyV5?\^ :bHcܘ 8ʿ9讁'JKSRUuPtZȄxͨhKz'CԬ('ŵN @Dx}[ʨv}"#zH8]-p٩Q&I&ŕJI/("j@& *Lj6DWo]U?=G?L\)wOהDkIx@.^ׯTr?R|:L~9\fcJ'D~趠֤&Ĉ9ݢ]LLЕ:7h]uxבlTJ>&ȭU@5"F$mC/?׈$轢5чJaP̉""z:I!DdBbTy 4fA/uř3jɠ..ƨVmQ1kAz&:\z yI Fd@wx Ri԰.ʂFx(#=QT2oh_Ë0rՃ}~vz=žcyޮ+zlѢmF$f(;Ēc`nr.WN9^'g/fc.yT D rt8_}b6S{@ˉ:G(STMY_|]6J=t`Ҝ;(p6z:O lN,9;o tx'Iޑ.\@ h^Qzݭ}ML ?#K@iPfgcQGBŮW&QMXxjoܹcYy]neahVҶv^'M\") z1ի!!Z274~*N;^/=4 fkn'C\ش@u72j7)QDQMEQ69WʄqԙRMo?)k-q~d\Y,d$8\qbrR3;TNNL=_f32vu8% ch2 Y:mnlcU)vg /Z4IENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/compile.py0000755000000000000000000000040114556556456013553 0ustar00#!/usr/bin/env python import os, sys RESFILE = '../lib/resources.py' os.system("pyrcc4 qbrz.qrc -o "+RESFILE) if sys.platform == 'win32': f = open(RESFILE, 'rU') s = f.read() f.close() f = open(RESFILE, 'wb') f.write(s) f.close() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/qbzr-pull.svg0000644000000000000000000063510214556556456014233 0ustar00 image/svg+xml Remote Desktop Jakub Steiner Tuomas Kuosmanen http://jimmac.musichall.cz vnc remote desktop control ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/qbzr-push.svg0000644000000000000000000063711314556556456014242 0ustar00 image/svg+xml Remote Desktop Jakub Steiner Tuomas Kuosmanen http://jimmac.musichall.cz vnc remote desktop control ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/qbzr.qrc0000644000000000000000000000346714556556456013252 0ustar00 bzr-16.png bzr-32.png bzr-48.png 16x16/bookmark.png 16x16/computer.png 16x16/view-refresh.png 22x22/view-refresh.png 22x22/qbzr-pull.png 22x22/qbzr-push.png 22x22/image-missing.png 16x16/file.png 16x16/file-added.png 16x16/file-unchanged.png 16x16/file-modified.png 16x16/file-conflict.png 16x16/folder.png 16x16/folder-open.png 16x16/folder-branch.png 16x16/folder-added.png 16x16/folder-unchanged.png 16x16/folder-modified.png 16x16/folder-conflict.png 16x16/process-working.gif 16x16/delete.png 16x16/complete.png 16x16/unidiff.png 16x16/format-text-bold.png 16x16/go-down.png 16x16/go-up.png 16x16/whitespace.png 16x16/document-properties.png 22x22/document-properties.png 22x22/edit-find.png 22x22/go-jump.png 22x22/go-next.png 22x22/go-previous.png 22x22/view-split-left-right.png 22x22/system-run.png 16x16/edit-find.png 16x16/accessories-text-editor.png 22x22/shelve.png 22x22/unshelve.png 22x22/delete.png 22x22/select-all.png 22x22/unselect-all.png 22x22/internet-news-reader.png ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/accessories-text-editor.png0000644000000000000000000000107614556556456017623 0ustar00PNG  IHDRabKGD pHYs  tIME 7);RHIDAT8˥MhA3ݣH"-)X+xEж'< "~1[M\bӍLlZx0Cmj+ ofރ a]VzxG/fw؎XM9WOJݬ;-T@YXݓ zV_LKNJ7qĉ?}MeM}'O2t3@zz}KAI{|-Mu=۶m;R>n&X^Q@dct| UsEΟ0 M ҽ \y7}7FdY~C;>Yz=iv4nK!?y%;nL&q]7\OPV<G;+H%H`YeExA,CkMVCk5Bl:ud})0oZy IENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/bookmark.png0000644000000000000000000000115014556556456014650 0ustar00PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8kSQuoJ& "4ZTpi⤂h;$@šSGRJ-X,Fmbos{»?8ٛx9 g f_Gtvv6ak5\Hk1dkڙ[!vZ:6~msƏwRYY@T g-tG`Ĩ~jT='pʥ֫ߖ}FWqi%STb bj n&&eqY( !.ls\\ ܣ@ J (E VaFsHkC(m|-W87'8^β%YHAm"2JݣIɇ1hgrx~}VUJ hI"5Gpݾ41O7|`0QP^̽1hEV3ۅsJ-IENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/complete.png0000644000000000000000000000103414556556456014654 0ustar00PNG  IHDRabKGD pHYs B(xtIME -\IDAT8˭O(a?ARRCjFea`ns8pfAN&$dm9a1K"y"j^f<~#05q[}lFH'`k&Ӝ1c-o#<<\IB(@ i5ĠVھd[+@0U âckhĨC*@0ؘr:.qy^?W~_dV?ao5+b62+5P~p)&ݭȐWרV[aqc*J(S3Ӿ|dۻw'(7K=F#p.|K[HY_.sVQ)fH_udj|>N 0CI]vBMIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/computer.png0000644000000000000000000000067314556556456014712 0ustar00PNG  IHDRabKGDC pHYs  ~tIME 3HIDAT8˥AKQowKx",AAPo}$E)]A5&l Tv؝${3OS| $2[V$VDvE题4Ny4ິ} F,.!cjah_|LaAPxX  ȩx|xQL =[PXoaxVD ({9$~@_o0ϭOMPո:ߛHh4Fe9=e+gT.vw}ubCu8{%srz R|V6frʕٌӜx;#IENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/delete.png0000644000000000000000000000125014556556456014306 0ustar00PNG  IHDRabKGD!~ pHYs  tIME HtEXtCommentid logowIDAT8˥OqƟw-Z* nnP(8ijMM`RB4F7'u11d08rWzwrCQ|y>| ;YqڍLhs(lEat 岵M$A.f$IBy@f.Ql64EQ ("INyΊт h4`j"úDnKL!Vg"gc8LYd :~E @`P Z_4wqR\}T.)S{&Ъ MiZ7+˲QyGk~C^]7!Ztpi8#Hy~$6 #F ('t)mG^(,+"}߱o_}d$I{= XvT,>L q3s_^y)nr:]ͬ8 +Ϟ:өٶQKKEǏ$d"ݧ( ^zCQtJ`:bfneYXVjWwpθX,<A$v{sN-fb1FA0$ C!Zm6& B\.|>RJ;pza4$h\..v-4))? ``0x}+ڶm1$IENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/edit-find.png0000644000000000000000000000115114556556456014707 0ustar00PNG  IHDRabKGD4g pHYs  tIME %/IDAT8˝MkQ;$MfJR ]hE Uw&o$ADtYwUM;AT(VP5G'M23EHIBRgw=GvM;N!#Lv B]wf2f_Kдkw߾J9zjmŋi+dk&nߌĢ5(4]#Ns ^R>q>sƕ]$ ORpsӶQ %#6Kot Kz Xd4,U~_e% EJvK0n \$[5ܪ-]pi-Nlc5ߣ-F}=kr+Bt4M¹|'+7*|\YT[z,?",+| 0p8TNVdT앬/dߧ>xtXtk뗧d3 ;e+D, X}|>+ 7pd5 A OUu!D^dYF0tt 4U!Ht87Xl_^8: hM0+$ yr캌h>d> ߺǎ`$Tַ:rEK`ZހBH^`Kk@[E*{Ei+0^gOBۭʰY绦$X~1b|P`۰!6v]J`cQYPN"3:{Mְ03}xtkcd6$W:pkDSx+jCبg_֛UTUUjvc0%?l `|a_#92Hz$!GKX]pE IENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/file-conflict.png0000644000000000000000000000113214556556456015561 0ustar00PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8AHTQ;o漞7c"2b hQ@вVm2Y Zii&*Z*f@"h47FXJ0YF_̀\=/|>-(JI$HzژAkMxӵ\.@m۬A$ xJ)\ % wNR6$ (:t;՘ XcVR)дm,^LBj.#i޿bs \j!*?XyB3۾6To ,Z.̒ˍ0q7|NսAa9<ˇtx ضMzmK`Q,$z/k ,3Z|MzLcf\L&S(IxJWG#ew/\_Z u ɱ.@ut ڹFIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/file-modified.png0000644000000000000000000000117014556556456015542 0ustar00PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8ka?{z\oQh J t7qp@7AW'TT\2eQP8PM2X:Ն4%&%)6L>HӫL'mggg?L&I"OT*`Z-@4p }b0(!333G7D8HpXELJLGP*xϟ_HynIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/file-unchanged.png0000644000000000000000000000117514556556456015723 0ustar00PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8kSQ$ILn"BAJDD\ AMQ'NS E( .PhZ5dIŏs&rP9^^糅BP:JdnσR W?^#@1ֿ !uP(H))ð$ɑq\E<ߑ`\ bؘm@4;T*c",.SjM&MrHb1}Ͷ- ^[gтp'fcG)rޛ(ͱVe"=g̃_݅- |FaZߴ-L`.~M.kKp&( ro$:Oj1.E`3A$!1 0-|XBlJ &6+"J)hz>67,B)5;;Ѹ bewٶ }IENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/file.png0000644000000000000000000000055114556556456013766 0ustar00PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT81n0ER@KR)$J p跲H@fِ_eoF>~+iY']i9,is-"aH9vӰnh}0h'4M+?18,ˀ p"yG`]jmyDƘ;bw# à&׌T?H.摢,ڶ}9TUBW7iwhIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/folder-added.png0000644000000000000000000000132014556556456015354 0ustar00PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<MIDAT8KHao:XZhWIU`A &QfAᦄ\" (hYymS0V SD(sg|-'w~tɵ>VHu:rfw랁%)c}]&Qcq7qٙ\Mx;fYm'.(jhMN@{!x|b:>kN2J4EUs[O$n^6[۷lhH"HAIBv5!3A>|yĈai4:N76Rk/ZjJڷ1Bi@.SN/5u)Ԕ1)*Fj ;0RH@J)%@ )(\[)%G1E1!_)H!X rOz;˰+GP̦|lmjcxB'S2Y޻ , 8kn̟DwwTkH o~|bTD<)/b!y " BtJV`uCOFoXIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/folder-branch.png0000644000000000000000000000123614556556456015556 0ustar00PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8MHTQsǹEQ g +HZDA@(VjBpQ`Ԡ!TP4&ƌ0QS秹w:Ũs9PZ_pA;{qX$zz` U3e^^-B4v^|STUzP< ai z&eY磴Cw_ BNn]@7[r@M 1R(`l]QյՙNfe}%H,nzR)V5Ț-?x͜wPc`fFSyY#EڮgG36%P{k;#bY8$Sq)_#5٥t(X-LwOO8r3 A"b6S_GoأġڛjPV}C{y6Atk׊D"Ԝ"pÍs0̹ }0 Arh OHT[}U|΄+ @AV*aS%L"$_u}`Tik4M I|*Lѝ\pV񤮡{FYgAZrMN#Z)r"jI擩a%8y$7V ȫ|#~/[ϳhGbAB'?&c`U ͩ ={3_XmA~33+)- q߽ z<"ڣ4\Z8?%ƅ@-W_[|iIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/folder-modified.png0000644000000000000000000000132014556556456016073 0ustar00PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<MIDAT8]Haϻf$J TuTb`ݴ"4n;" !«2 I`*#!"h[}>] oswyē7|ah?y@㫲&'zx zCmV(ylk=BEx;fSX'e Ze g90H$⼞1r4Y9@zfCNnB72Qlusl sYg1R8K V꺎Q] wHL Gs µA<Nގu) `|C4 A6ֲe(Kxlv{5(D^&h DffH*J6DR, 6)I*|-4 {2-&-I1HZVE$$ayzG)drUd  M|\JK=04,]N6yvEWwfsiR7GU,@M<W hzE&jυ*(pUk QH-#Đ[+X焰NIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/folder-open.png0000644000000000000000000000101314556556456015253 0ustar00PNG  IHDRabKGDC pHYs B(xtIME 0IDAT8˥MK[AԒ)(J.]B-'`UpG)H[hݹuU$jWB5);s_7Z0003gTgwǗh4iу3)*H |e/mbz;l'9QqhPu]ɄյG@C0Q8R)RBrZk,+EQu[ܼ$Hlf[C\Ni%&ezN 5ٷP m U߻Ī247ܭc<)Nm-O9L['.mKI8sL/v% .}s7AM#.>M 2MP9/5(޵H;!U`8ˆ PQ9dQFu*Qs蟁,Z؀mwUCn._-d1qfn39/yDc?6nDh5u}8$'1Cg[A(fJ>}L) 3i@[8$'&8tDh}Ъ4u,wU<7_ä\=?/,9[zeDIQH?٭'o>6IENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/folder.png0000644000000000000000000000076214556556456014326 0ustar00PNG  IHDRabKGDC pHYs B(xtIME 9 pPIDAT8˥MRQc*@ZA ,b lf]P3*DeIPlF"( {Gfq ͗/Q.6S2Bԝ{3x^wZ=>Lxx3}Z=B)pS @0y.?iv2̥gn:RHaf'us1RC}X?<5_8 &3 \ _KM`e "(DZah}H,C+ \t]D#1Y~uڜ>{_w"a/_8hyʛ,‡ʧIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/format-text-bold.png0000644000000000000000000000130114556556456016231 0ustar00PNG  IHDRabKGD pHYs  tIME!}NIDAT8Œ?LSQƿ{oWЂ')PcI&&@Hp m\u˜8)AƁhb4apr8:2(AC -{}@EprlK/9؟[o,r3H/u"CQ荃-R }K>Ξ!/WS5GRǗiY=p<"|^eg2HdZ`لp+HʋVo. XD Z[b~đ! u29 .I˲X}wvnEx8N,>4ֹwdVʚ"9I$'MB2 1]`Jyer5 %8-HJEII'Li1Ɂh{P(Fq%k40#oAqZ̊1`ܵeGjQjŒ Q-9\UR 4Ι3J2=-BAƠ9&|A((Ohŀd]la(7i õhcOY/Tjfo-m"d}52?Z~Iu I1 kc IENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/go-down.png0000644000000000000000000000125314556556456014421 0ustar00PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<=IDAT8MhAߙk`C"I"/*AU*mك١E&MADEt>S8zVO޼)c>. Q51Qw&zgO/Dk00(nCȽ{[a~5鈴@bLQ= &$dY[AOXZloxz.Ҽ6?_h8|E7sJ*hIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/go-up.png0000644000000000000000000000121414556556456014073 0ustar00PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8OhAƿ73ٍzhLт@*ՊhDbE-rkJIbREOBM*^DPC)*4&Q!|ߛ!5ɛ|fvn<IuL:.O <WLFfG ฼ʼns֖ǖ% Ep74HK: ]"GJ a2Wk =<؎Ql*eh :}6.N_ +XR"K(u@AVqE؟~ԋ+U?cjJZۆ25|I=/b1 lܺ?n%&Fs'0۶К"IENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/process-working.gif0000644000000000000000000000302114556556456016157 0ustar00GIF89aݻwwwfffUUUDDD333"""! NETSCAPE2.0!,w $B$B##( R!!,c $PxB +*-[dඁ+i@ )`L ?'I`JGb Ph XB)0׸XQ# } No "tI+ZI!!,\ $P`8* 1h0rx8BQaV  !MDl!4%BBe PDY00!!,] $$I>Q] d"28 GqH9 A2ȀB", DH('4C \0`UL"r(!! ,d $dI`ìkBB m A72, (PX鲪 8@R%a K*D2E {$ft5C%!;././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/unidiff.png0000644000000000000000000000052014556556456014467 0ustar00PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT810 E%n9\1 `/='JEB$%"h9.̜u}ŏir Z$u Z(8 \(>~ 9`8CgH k]W03[QD "{8p+Kog1&}N,-M8m$@zm,IENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/view-refresh.png0000644000000000000000000000162014556556456015453 0ustar00PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<"IDAT8mRMlTe={3m[ 3јF7`XDa M ta1L%47!«qВF;̴Yp=''\bfHe4jՄ'¸.ؖp|t&E@O*}]gQ(V02v|g'-lzW6ÌĈdǂЉ  3EW Ŋ 5>.W f43=gOk40ĭCձž _M^l8l?3]X1/23ǕgƧg^hڷuS( wD-HU/<A2e^ۏ^,}?,az  ,Hc$UgnSui&vn{'v>Eq4Akw_?߼''k'W%߼[0j>AX-/?ԩT=eYcJ奎Go@W!'$_ԓSln\{&?3 DV%r=?JeFmXv@x\qqah=Ѿ2;}З|9r-k5tT2>hMA҄ǡ̖MD, z=*];[x 8wyIuI1MN<-I7, #?[FՕD(̗ˣRmcer-0{ W1oR ]!PՑl.UvjeIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/16x16/whitespace.png0000644000000000000000000000052614556556456015205 0ustar00PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8S90 X %@!:{+!i3#QUm/@DcUU DMIUq"ڸ,c${B*˙QG0̌eY. !{03BU!")" y4M(;8碶.5Xk ,ˤ Aěr<`?fzcIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/22x22/bookmark.png0000644000000000000000000000172314556556456014650 0ustar00PNG  IHDRĴl;sRGBbKGD pHYs B(xtIME QSIDAT8˝Kh\U9LG[Lk3-] . V-vSt'XMEŅ.BŕDv#Db,-dLq3s=;sg2NTz<8pw*o]=BI΋@iO"%qc3&a˶O0$ C*,.A4=:>a]yatti|ȘU{0N^c1* $bC>67<6*t̞ \ *手/WѓQt}\ieѩO>_O=E\Xv@TD5~g332<( &gxX0޼ͼh{.9W^x~@Z=ODq0F!T5Hc.GuKz]Ms k+Z+|qy%;$ڎVn}L~xh_r-#9l (V{&2˃窉T)`(3Eziq໽zKu]Y[ۘݙ)̙ܞdxxiaX' CQqXk3ڬL59) =^~x'ի t:}99=C%0Vp-G.\+6O\3gi9A cssCԥ^ ն_.97P>bAIIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/22x22/delete.png0000644000000000000000000000227314556556456014306 0ustar00PNG  IHDRĴl;bKGDC pHYs  tIME n tEXtCommentid logow-IDAT8˭mh[U{m^zolm,V;i`/uSh0 /"~gK7"ҕ4j;f-ڔ66M4M{ n8_Ώ<<[t=Cz\S^~ t:q΋ ! IN9[hqD{{/fB9ǎ>qm9tzدhoK^o4~=&E_6i||<2||s.!e^Ĕswwvv(3fdXY8紡3u.oml0`6PQ)juT676֊EMbʌd*<֗9s`=&R AQf.ӡ C,( N]B`d2Cn3P&XEL%棋h4zp?챆 [U?`0Ps1C1 0r I-bKIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/22x22/document-properties.png0000644000000000000000000000126014556556456017047 0ustar00PNG  IHDRĴl;bKGD pHYs B(xtIME  (`{=IDAT8˵kPL4#'xʦ'q9Cwh뒺{O^7x $?0@%vDIPס*Gq{⻻w'=O"BcQSJ|t~* ys^^^iJ)񻨸Lfc88??O@nJUWSBΦ6l}})l`)%J)<=! -5!NS. NP|\bqq!cZհ,:bq˻q s}}MZ}|ߏ35϶ml4M6anIӑJ)g8^ZP&E̖zT* O,}16?0ư'rמ\w)cQJ׼cLk OH"˳kNj ֥aJU)+]6tn,c]~/&2 APYY>wOqY9|uj:tH<AwwƉ+Ycfg8h|(na,dʂ3J;62;zmtTى7O^'cƀNB /㛁)ٚ͸nBR2N! WK,K]$ ߋ-[103|lay0o0иc$;.tɻ%qs>\^.'DQ@ Me ZRG`fHJ`N@(͑A-bhBF(10|0</| ͱW9tpӲAk]ן^,@۶a_a[UNUtD2H$LeYDi/T[lE-Cαe¬ί:9~]tw3[KOrrfo2"XF 𾤰ɢ"8GXtUXT׌N`f"T^w`ykkB:\XtF,sf}gjw}xswmik)Y3٨. ~G.oƒ}f-8T0_g; Y+2 h{ҁ2+ښ'2@9?ϝK2V4 Jspmhhh t[P}צ+ ꚑzYkFWW#+cQ&o:13Z!~]3R 7;ERM4O׌'1s/ء7%vwV='?㈮I=a/[d1@%Uf>\ϱ=l5L#mަo9""bDW(mk{:7f+əAk*rP.n;;瓫̠5١v#)%y3? tR ID#{jVfWr0{ rMBtIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/22x22/go-next.png0000644000000000000000000000164214556556456014424 0ustar00PNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<4IDAT8[hU5bE))('o탅 5ЂVAE"R|iII `Q>EPKiCZ )bK4&*54KԤӓe^>9u6чt̆5ڋ٢\ &ձym-76v/)`/Ty5oo&}?k6kMeb&hhQwYu#sN7lZlU}mʖӯȕ=2'Aա(N]Cwi`l|jZ{]NԞAőYRVw7{L),>u 1JDDdKiHdC4"ICb!-';Yq궆=AӢ`JI1.ҟHBH*Nb \ah nzp|p1dx[r?>S3>')jSDnXh40<#x,)gMv>끪LՕ&R宕O}˟>.PfYK!}9^K#fIwp)#~5CgsYn)ξ˫ U"B"g&MGZA*(AۀTH΁sK.S)SMR-'4IENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/22x22/go-previous.png0000644000000000000000000000167314556556456015326 0ustar00PNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<MIDAT8Mh\Us͟R#4Ƙ,(]H+k..L7buQ"B-"*(AXӈ6idfs1w1c\9{{UJ,sE?ŽmԨFkv7~SFlZ 'X^voq{Xҵiy`XZsƻoݚѦka6矗v{G]NNAR^p?0Zs#4ܶ6`'>$Mxa[F :9[n321 F,|1y##k,ADoyq`ߺ7W)~>{k H5%Mq`2I(8?oxf Xoi BE<ƠUxYy1e_$cPTih EWG'߽tӆn/ .XZ-Qk4R\~cׇt>DBC*| jqXAs˼(D$7=UO;r'01j*ZCjebH}h>~6n\_Pz[7͙;1ay kvG#a0%hk,bYZt|Ey4F%KiHy&KEn$3& I`[/NL&gmF:>K۶K5ޭ+\SvK<˝WJD:NF<;~ "D1Bh4zVZu&) =Z<"f|x R IENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/22x22/internet-news-reader.png0000644000000000000000000000116414556556456017104 0ustar00PNG  IHDRĴl;bKGDC pHYs  ~tIME g{>tEXtCommentCreated with The GIMP (c) 2003 Jakub 'jimmac' Steiner'3XIDAT8˵AkAqEJTEPO*6g/{/JI+=P0$8+mqh _ /KZT2nIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/22x22/qbzr-pull.png0000644000000000000000000000312414556556456014770 0ustar00PNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8}[l\Gskz׎:rbMT!C@B'h%JkQUIBb)&{}]߽{9{9 ь7RJ TOpgo ߰:㉴>3>m>CI=^.\mr fu-8,6 w>7/7.t_ܻ-0,BO"2D7}n.kY㭷ok_r+t\ Vd.jZF03qLkLqT:[Gv _žt){X 1,:%Z[6,,xCEW/.op|kʹ/[*'oVǝ͂]=yjm&qg:QՊͪrg{O2s{{ǯ(l4}=>mgp$/X,(ǎs٫X=Ż) }6)[AX< B\әoy۟?@A>ٍҧvj:WRbrzl.O\TZkqhꛑzf3J kK#ih45`w/]2:>݁[J2cQZH=ȊR8q<"J]S㓌OosL.)+wjuZC0#CDTԂ)A6'̯VTOD\5Nun)Ԝ[eM< /?T\,5г.~{ѭK_ [Ns`ډIU=?\pZɍ$E$ݞVdlLky܎/;udX7ʧ0O#܍ܽ` 3iSu#$IGPz<ʙjw&tPnp7J yKmDWW12<<Uk:57h4J" JX\fww5LnD׸ᷳqi'L]办^ 1<<{꭯{R/4`X[[Sdb+X/9m_Ss|6qkƯN7gR"MLHcYȑ1`;y81K*P.رBŀ(niyH8&\f<<8?|o妜IENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/22x22/qbzr-push.png0000644000000000000000000000314314556556456014774 0ustar00PNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8}[lTsnb{`SskLDR"RJQUTQCP &j 8cc/ǻgׇԑq~3ьR,kk;JC5uMc1`j@6:grǣϊ{p籆!_H`RL'Y)@wݿv؟/o]raY( qbn*Ӂ''HSSS5?mm?_xakpr]ϡ=,U*a̪FTO*ԙ_W<ɰsWGg *W eZK N0vy<R^^7k-˗R;G_Ǔi0 eǙ_ɇ! k߷'_Wi4ML&ԔO7K)\}o[׸ QN݀S1K} e:!\MH<_>hv[& !wPSH> Պ=Ls:ywNOnYoh+biWV{gE`$燉}@ LP6Ro.|CܴayoFtȹ[`j ldtND($M20p5.':bpXqڬح*ǿmCAŎPTb4^S+_y27pT8x< Oa7)<% :Q,*2¢ٱhvL,LArw1 `L=rsi=CX$mHnМyl躎T).+ erb~@zU](/r%vy/ NdfD1.%qx$q_e2ф(?];- kh8{fMcTǼ@tm|6Y:DPvBKWpY WBXqS7 }Gąal:RJii1 yΑkǎtjB| ! /^-?,mIM$9ciYĩTAf3fx|zN;ξА;qĊ;v\R.} !RW [l%>O "%l<62cG-`/ 9GIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/22x22/select-all.png0000644000000000000000000000116614556556456015071 0ustar00PNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8K`o~Wgs ЭD)xQO޽ y K(lbkd*Sv WD8MCQ種>;xauo++!a'HpzJ*Cse&|N]*qT.__4Һ_q4?OJ%_]Ym48Y^&ps]*=j4GWӐT1׉>wm|/33_^1 A&Cuu R +QHcc4X }nw/^d2>NuT["ƛ%Tm"C0<Kak$  ~w gIrvW5VCBX4P%./ղ_wIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/22x22/shelve.png0000644000000000000000000000217614556556456014334 0ustar00PNG  IHDRĴl;bKGD pHYs B(xtIME 4Her IDAT8˭]lU39meeY>"ڒVX0B4F|5HUR FilD4ȋh 16ƈ4AT%6ݶvggw|hwlPL'7s=3W`{?ƦH\om~8ያ#>1UeNϸT:CdVۻ_;rĖ"U[pm##J+PvutPv=ܹϥ:p+bkw'tO>P+Ft6N<@}A/.yYb5%3}}pG_6G$TUHNeRELhekԡ>;r?Ϫ I۩7/Jrk|ow_&ǎdۺeQ.;K`P ^xD-".vVTneE"dddC8?A2) =Uh,{z$8BO)?9F#_;aYq )r|B7߷!g3XPLLL\ YYY/PPi kjV < ≤DO"/l q)_*͐!g\WW"766~d%hJR!}/B1^P6 \0hZ3KN UUU_iH4ZT0mx%=xt؋?&\'a u;=7]c߳X  /nL)HG0 !~Mҟ22S~C588MNNw:;;s0O[(+-6- Oee<j\A"nhhW /+ Gp:\!o!=2^__1]Q+-d7)7[O>zSx47/:0> 1<̆ӚMj%]ijrXwS(`6Q5%``I\ZZzcTTJ`04!H!D긹4cdҝr %"\ĹY1??Eѥff 5a/%%HsCʁV{ԓ aff潁1ښn0kjjLT{'So^EAAvjj'@ @Cߥ`&H5" '/cIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/22x22/unidiff.png0000644000000000000000000000067314556556456014472 0ustar00PNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<8IDAT8͕n0ɭ]Cg,<# Ȋi捈foeYvD4.u})cl ^+Ttw~ɭAݤ*&eXIhl>31& M5ctVzO88yCʇIpK o?:9c'" , R-l6_.b} 0p ܀R@a18ɿVE`D7`7g]_XyIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/22x22/unselect-all.png0000644000000000000000000000104114556556456015424 0ustar00PNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8]O@ 8m]xW(w0&uW@0 ݰkz\ s'3p=j/>p=I|Z$I2]_|+hk9$I/>si+ނNPD㘷7GquO'"SKl?Ƙ6uzgX븻( LFZO-: ,[=F#1x/[WWǨl-(VTc>FȲέNVy||ZgSO0Tfx(8eo^5hԙ8`a8 Nz'󿢝0@QA^^Bi_,8,W !UU?~ O&~nQ4v] <~v?QUIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/22x22/unshelve.png0000644000000000000000000000204614556556456014673 0ustar00PNG  IHDRĴl;sRGBbKGD pHYs B(xtIMEAUvIDAT8˭MLe3;NۥX]VxЄl7ƃ"aEp0 VM8a& ij! H)ٝʺ /<}- iW79"96^5م[\+Y]Ň!u9S8d{_]7fW!(qprXؙᄐ=-w&Rラz߅G?Ň. 03H\duu _i;a_v]1؟PQt埂m[&&# mddƠsxͣ#L8 S\39j6?z94`޾Մ94c#\dn}Z ڇln,v+}U4 ]#m٧N8blؙSQ~x&9|ʟ8yVx7?Ϫҩҩ:5ц[ /b%`sUoH}=QEv|i]:c#be-xZP'h츎l*hazz"9Z0 TUEUUDQk-{Cl?[kJbee hijl&:RmimE1 }seX_:5kه3'L& j>yݴx@E' ?je@Mӄ'ʔHl$? MJaNCC^% @u9?-GR f& xP>J((~ àd2Ynr8"`& .?7668 I!FL&p8,NmmݾI@5H8 !>T"`#IENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/22x22/view-refresh.png0000644000000000000000000000252414556556456015451 0ustar00PNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<IDAT8iLg;3;K9[kEh&1iOM&415iZ$54iGb53LNUxO&3E,kÓ]zCM/ >5+5nmJ_;$ nB8,!Xd1 CH `"wĴUtyh*K1C!vò)B0cK`e)N,MZ.j\귊Ԥx iNl.HH01HK97rŢ.jHc,ҎGH^V@s>⪦1ǸqFO;Jkdl9ƀnL)@VZPv>,}\Gyd\5Bi^߉ հNITɰHll͜3nӖ)?FU4/],a}@8qܝ01kr08Đȁ-=])nJXb\d"CUzm)c5;_ft/EĴyϋW 3tǾg'NƐ֐8'k+z"0g4C5&8߱im˺,7`"0/M.R]MG e/$"0Ƥ FﺸqQʝ%իOMQ2ScaC0L ]qC=81raa"gu~s=}5)++ZZp:UFLߟ}6uE$ }͛ /PDFn%! !F\GPѢ1&́D a7oEcD0Ț)i\r`IENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/data/22x22/view-split-left-right.png0000644000000000000000000000047414556556456017213 0ustar00PNG  IHDRĴl;sRGBbKGD pHYsu85tIME #CIDAT8 @Eb ѷKjmbM(Bwu; S7VX$u@]UUǣǰƘZkn{`/HD(rd+βKuf pN0&Z+人sҊDdyzi6>ųƏb;iRS':RVDIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/Makefile0000644000000000000000000000060114556556456013227 0ustar00.PHONY = html all: html # rst2html := python rst2html.py RST2HTML := rst2html5.py --initial-header-level=2 --footnote-references=superscript --smart-quotes=yes -g -d -t %.html: %.txt $(RST2HTML) $< $@ %.html: ../%.txt $(RST2HTML) $< $@ html: index.html gettext_usage.html make_release.html \ slot-signal-mini-tutorial/slot-signal-mini-tutorial.html \ exception_reporting.html ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/exception_reporting.txt0000644000000000000000000000477314556556456016435 0ustar00Exception reporting in QBzr *************************** Overview ======== QBzr has a global exception handler. This will either report the exception to the command line, or show a dialog with the error. The behaviour of this can be modified to suit the area of the program. Modes ===== There are 3 different modes for the exception reporting: (In the code, these are called "type") MAIN_LOAD_METHOD ---------------- 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 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 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. ITEM_OR_EVENT_METHOD -------------------- 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 ignore button is pressed, just the report dialog is closed. 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. Controlling the mode ==================== 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 parameter, with MAIN_LOAD_METHOD as the default. 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()) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/gettext_usage.txt0000644000000000000000000000605714556556456015213 0ustar00Gettext usage in QBzr ********************* Overview -------- QBzr uses the standard Python/GNU gettext library to create localized interface. To use gettext functions you should import the bzrlib.plugins.qbzr.lib.i18n module. Functions --------- i18n.py module provides the following functions: gettext(message) return translated message as unicode string. ngettext(singular, plural, n) do plural form lookup and return corresponding translation as unicode string. N_(message) return message itself. install() enable translations uninstall() disable translations By default translations are disabled, and therefore gettext() and ngettext() functions return original untranslated message. To enable translations you should call i18n.install() function. This function is called automatically for all q-commands. N_() and gettext() ------------------ Function N_() has only one purpose: mark some string for translation, so GNU xgettext utility can extract such string from source code. It does effectively nothing and always returns its argument. Function N_() should be called only for a string literal and never for a variable. gettext() main purpose is to do message translation lookup when translations are enabled. Its second purpose is to mark some string for translation, so GNU xgettext utility can extract such string from source code. Function gettext() can be called either for a string literal or for a variable. Argument to gettext() can be either plain string or unicode, but always in ascii-encoding. Function gettext() always returns an unicode string. Valid usage of these functions: ==================== ================================================ N_(message) -> message without transformation gettext(message) -> translated message (as unicode) gettext(variable) -> translated message from variable (as unicode) gettext(N_(message)) -> translated message (as unicode) ==================== ================================================ Incorrect usage: ========================= ====================== N_(N_(message)) -> message N_(gettext(message)) -> translated message gettext(gettext(message)) -> translated message ========================= ====================== Although such usage don't raise runtime error, but never use it in such manner. How to use gettext() and N_() ----------------------------- Simple rules: - use N_() at import time, that is, for global and class definitions - use gettext() inside functions - in the tests gettext() always returns original (non-translated) string Always call gettext() for strings that will appear [verbatim] in GUI forms. If you need to have both original and translated string (e.g. original string used as dictionary key etc.) then use N_() for declaring such original string, and later call gettext() to obtain translated string. See also: http://www.gnu.org/software/gettext/manual/html_node/Special-cases.html (replace gettext_noop() in those examples with N_()). ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/index.txt0000644000000000000000000000064314556556456013445 0ustar00QBzr developers documentation catalog ************************************* *General topics* * `Gettext usage in QBzr `_ * `Mini-tutorial on slots and signals`__ * `Exception reporting in QBzr `_ __ slot-signal-mini-tutorial/slot-signal-mini-tutorial.html *Release process* * `Short checklist and instructions how to make release `_ ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/literate/0000755000000000000000000000000014556556456013403 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/lp-urls-notes.txt0000644000000000000000000000126014556556456015056 0ustar00Explanation from Max Bowsher 2011/03/28 lp: URL structure ================= lp:bzr | PROJECT lp:bzr/2.3 | PROJECT/SERIES lp:~maxb/bzr/foobar | USER/PROJECT/BRANCHNAME lp:ubuntu/bzr | DISTRO/SOURCEPACKAGE lp:ubuntu/maverick/bzr | DISTRO/SERIES/SOURCEPACKAGE lp:ubuntu/maverick-proposed/bzr | DISTRO/POCKET/SOURCEPACKAGE lp:~maxb/ubuntu/maverick/bzr/sru | USER/DISTRO/SERIES/SOURCEPACKAGE/BRANCHNAME bzr+ssh:b.l.n URL structure =========================== bzr+ssh://b.l.n/~..... Any of the ~user based lp: forms bzr+ssh://b.l.n/+branch/..... Any of the non-~user based lp: forms ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/make_release.txt0000644000000000000000000000751714556556456014762 0ustar00Short checklist and instructions how to make release ==================================================== When you're ready to make release X.Y.Z you need to do following steps. Prepare code ------------ 1. Update ./NEWS.txt with descriptions of user-visible changes. 2. Update version numbers in following places: * ./__init__.py: at the beginning of file:: version_info = (X, Y, Z, 'final', 0) * ./setup.py: function setup() at the end of file, argument version:: version='X.Y.Z', * ./installer/qbzr-setup.iss: at the beginning of file:: AppVerName=QBzr X.Y.Z OutputBaseFilename=qbzr-setup-X.Y.Z 3. Commit this changes and tag the revision with label: release-X.Y.Z 4. Push the code to Launchpad Prepare translations (optionally) --------------------------------- * It makes sense to download fresh translations from Launchpad just before major releases, or on regular basis. * To do so, go to translation page https://translations.launchpad.net/qbzr * Select series for which you want to get translations, usually it's ok to go straight to trunk series: https://translations.launchpad.net/qbzr/trunk/+translations * And in Manual Synchronization section select "download" https://translations.launchpad.net/qbzr/trunk/+export You need PO format of files. * After some time you'll get an e-mail with download link. * Download that tarball and place it to the root of your qbzr development tree, then execute command:: python setup.py import_po * Inspect changes, run:: make mo to ensure that everything is OK. * If there are new translation files for new languages appear (not under version control) - ensure you're `bzr add` them before commit (NOTE in NEWS.txt about new translations are very welcome). * Commit updated translations and push to Launchpad. * You'd better update transaltions before starting release process. Register release at Launchpad ----------------------------- 1. Make corresponding page for new release on Launchpad: https://launchpad.net/qbzr/trunk/+addrelease 2. Put info about release from ./NEWS.txt to "Release notes" section. You can leave Changelog section empty. Build distribution files ------------------------ Building + signing distribution files now possible to do in semi-automated way using make utility. Run command:: make release RELEASE=X.Y.Z This command will create sources tarball (qbzr-X.Y.Z.tar.gz) and windows universal installer (qbzr-setup-X.Y.Z.exe) and will sign both with GPG. Upload tarball and installer with their gpg-signatures to Launchpad: https://launchpad.net/qbzr/trunk/X.Y.Z/+adddownloadfile Building distribution files under the hood ****************************************** 1. Make source code tarball:: bzr export --root=qbzr qbzr-X.Y.Z.tar.gz The file qbzr-X.Y.Z.tar.gz will be created in tree root directory. Sign this file with your GPG key:: gpg -ab qbzr-X.Y.Z.tar.gz 2. Build binary translations files:: python setup.py build_mo -f 3. Make Windows universal installer: a. Run Inno Setup script compiler:: iscc installer/qbzr-setup.iss This command will produce qbzr-setup-X.Y.Z.exe file in tree root directory. b. Sign this file with your GPG key:: gpg -ab qbzr-setup-X.Y.Z.exe Make announcement ----------------- 1. Send short e-mail with announcement to: * * (optionally for beta releases, mandatory for final releases) * 2. Also make announcement about release via Launchpad RSS: https://launchpad.net/qbzr/+announce Finishing stuff at Launchpad ---------------------------- * Mark all bugs targeted to X.Y.Z milestone as Fix Released. Create deb packages with Launchpad PPA -------------------------------------- ??? ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/pycco.css0000644000000000000000000001566614556556456013437 0ustar00/*--------------------- Layout and Typography ----------------------------*/ body { font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; font-size: 16px; line-height: 24px; color: #252519; margin: 0; padding: 0; background: #f5f5ff; } a { color: #261a3b; } a:visited { color: #261a3b; } p { margin: 0 0 15px 0; } h1, h2, h3, h4, h5, h6 { margin: 40px 0 15px 0; } h2, h3, h4, h5, h6 { margin-top: 0; } #container { background: white; } #container, div.section { position: relative; } #background { position: absolute; top: 0; left: 580px; right: 0; bottom: 0; background: #f5f5ff; border-left: 1px solid #e5e5ee; z-index: 0; } #jump_to, #jump_page { background: white; -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777; -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; font: 10px Arial; text-transform: uppercase; cursor: pointer; text-align: right; } #jump_to, #jump_wrapper { position: fixed; right: 0; top: 0; padding: 5px 10px; } #jump_wrapper { padding: 0; display: none; } #jump_to:hover #jump_wrapper { display: block; } #jump_page { padding: 5px 0 3px; margin: 0 0 25px 25px; } #jump_page .source { display: block; padding: 5px 10px; text-decoration: none; border-top: 1px solid #eee; } #jump_page .source:hover { background: #f5f5ff; } #jump_page .source:first-child { } div.docs { float: left; max-width: 500px; min-width: 500px; min-height: 5px; padding: 10px 25px 1px 50px; vertical-align: top; text-align: left; } .docs pre { margin: 15px 0 15px; padding-left: 15px; overflow-y: scroll; } .docs p tt, .docs p code { background: #f8f8ff; border: 1px solid #dedede; font-size: 12px; padding: 0 0.2em; } .octowrap { position: relative; } .octothorpe { font: 12px Arial; text-decoration: none; color: #454545; position: absolute; top: 3px; left: -20px; padding: 1px 2px; opacity: 0; -webkit-transition: opacity 0.2s linear; } div.docs:hover .octothorpe { opacity: 1; } div.code { margin-left: 580px; padding: 14px 15px 16px 50px; vertical-align: top; } .code pre, .docs p code { font-size: 12px; } pre, tt, code { line-height: 18px; font-family: Monaco, Consolas, "Lucida Console", monospace; margin: 0; padding: 0; } div.clearall { clear: both; } /*---------------------- Syntax Highlighting -----------------------------*/ td.linenos { background-color: #f0f0f0; padding-right: 10px; } span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; } body .hll { background-color: #ffffcc } body .c { color: #408080; font-style: italic } /* Comment */ body .err { border: 1px solid #FF0000 } /* Error */ body .k { color: #954121 } /* Keyword */ body .o { color: #666666 } /* Operator */ body .cm { color: #408080; font-style: italic } /* Comment.Multiline */ body .cp { color: #BC7A00 } /* Comment.Preproc */ body .c1 { color: #408080; font-style: italic } /* Comment.Single */ body .cs { color: #408080; font-style: italic } /* Comment.Special */ body .gd { color: #A00000 } /* Generic.Deleted */ body .ge { font-style: italic } /* Generic.Emph */ body .gr { color: #FF0000 } /* Generic.Error */ body .gh { color: #000080; font-weight: bold } /* Generic.Heading */ body .gi { color: #00A000 } /* Generic.Inserted */ body .go { color: #808080 } /* Generic.Output */ body .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ body .gs { font-weight: bold } /* Generic.Strong */ body .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ body .gt { color: #0040D0 } /* Generic.Traceback */ body .kc { color: #954121 } /* Keyword.Constant */ body .kd { color: #954121; font-weight: bold } /* Keyword.Declaration */ body .kn { color: #954121; font-weight: bold } /* Keyword.Namespace */ body .kp { color: #954121 } /* Keyword.Pseudo */ body .kr { color: #954121; font-weight: bold } /* Keyword.Reserved */ body .kt { color: #B00040 } /* Keyword.Type */ body .m { color: #666666 } /* Literal.Number */ body .s { color: #219161 } /* Literal.String */ body .na { color: #7D9029 } /* Name.Attribute */ body .nb { color: #954121 } /* Name.Builtin */ body .nc { color: #0000FF; font-weight: bold } /* Name.Class */ body .no { color: #880000 } /* Name.Constant */ body .nd { color: #AA22FF } /* Name.Decorator */ body .ni { color: #999999; font-weight: bold } /* Name.Entity */ body .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ body .nf { color: #0000FF } /* Name.Function */ body .nl { color: #A0A000 } /* Name.Label */ body .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ body .nt { color: #954121; font-weight: bold } /* Name.Tag */ body .nv { color: #19469D } /* Name.Variable */ body .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ body .w { color: #bbbbbb } /* Text.Whitespace */ body .mf { color: #666666 } /* Literal.Number.Float */ body .mh { color: #666666 } /* Literal.Number.Hex */ body .mi { color: #666666 } /* Literal.Number.Integer */ body .mo { color: #666666 } /* Literal.Number.Oct */ body .sb { color: #219161 } /* Literal.String.Backtick */ body .sc { color: #219161 } /* Literal.String.Char */ body .sd { color: #219161; font-style: italic } /* Literal.String.Doc */ body .s2 { color: #219161 } /* Literal.String.Double */ body .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ body .sh { color: #219161 } /* Literal.String.Heredoc */ body .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ body .sx { color: #954121 } /* Literal.String.Other */ body .sr { color: #BB6688 } /* Literal.String.Regex */ body .s1 { color: #219161 } /* Literal.String.Single */ body .ss { color: #19469D } /* Literal.String.Symbol */ body .bp { color: #954121 } /* Name.Builtin.Pseudo */ body .vc { color: #19469D } /* Name.Variable.Class */ body .vg { color: #19469D } /* Name.Variable.Global */ body .vi { color: #19469D } /* Name.Variable.Instance */ body .il { color: #666666 } /* Literal.Number.Integer.Long */ ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/rst2html.py0000644000000000000000000000115414556556456013724 0ustar00# Author: David Goodger # Contact: goodger@python.org # Revision: $Revision: 3901 $ # Date: $Date: 2005-09-25 17:49:54 +0200 (Sun, 25 Sep 2005) $ # Copyright: This module has been placed in the public domain. """ A minimal front end to the Docutils Publisher, producing HTML. """ try: import locale locale.setlocale(locale.LC_ALL, '') except: pass from docutils.core import publish_cmdline, default_description description = ('Generates (X)HTML documents from standalone reStructuredText ' 'sources. ' + default_description) publish_cmdline(writer_name='html', description=description) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/slot-signal-mini-tutorial/0000755000000000000000000000000014556556456016621 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/literate/extras/0000755000000000000000000000000014556556456014711 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/literate/lib/0000755000000000000000000000000014556556456014151 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/literate/pycco.css0000644000000000000000000001563614556556456015245 0ustar00/*--------------------- Layout and Typography ----------------------------*/ body { font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; font-size: 16px; line-height: 24px; color: #252519; margin: 0; padding: 0; background: #f5f5ff; } a { color: #261a3b; } a:visited { color: #261a3b; } p { margin: 0 0 15px 0; } h1, h2, h3, h4, h5, h6 { margin: 40px 0 15px 0; } h2, h3, h4, h5, h6 { margin-top: 0; } #container { background: white; } #container, div.section { position: relative; } #background { position: absolute; top: 0; left: 580px; right: 0; bottom: 0; background: #f5f5ff; border-left: 1px solid #e5e5ee; z-index: 0; } #jump_to, #jump_page { background: white; -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777; -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; font: 10px Arial; text-transform: uppercase; cursor: pointer; text-align: right; } #jump_to, #jump_wrapper { position: fixed; right: 0; top: 0; padding: 5px 10px; } #jump_wrapper { padding: 0; display: none; } #jump_to:hover #jump_wrapper { display: block; } #jump_page { padding: 5px 0 3px; margin: 0 0 25px 25px; } #jump_page .source { display: block; padding: 5px 10px; text-decoration: none; border-top: 1px solid #eee; } #jump_page .source:hover { background: #f5f5ff; } #jump_page .source:first-child { } div.docs { float: left; max-width: 500px; min-width: 500px; min-height: 5px; padding: 10px 25px 1px 50px; vertical-align: top; text-align: left; } .docs pre { margin: 15px 0 15px; padding-left: 15px; } .docs p tt, .docs p code { background: #f8f8ff; border: 1px solid #dedede; font-size: 12px; padding: 0 0.2em; } .octowrap { position: relative; } .octothorpe { font: 12px Arial; text-decoration: none; color: #454545; position: absolute; top: 3px; left: -20px; padding: 1px 2px; opacity: 0; -webkit-transition: opacity 0.2s linear; } div.docs:hover .octothorpe { opacity: 1; } div.code { margin-left: 580px; padding: 14px 15px 16px 50px; vertical-align: top; } .code pre, .docs p code { font-size: 12px; } pre, tt, code { line-height: 18px; font-family: Monaco, Consolas, "Lucida Console", monospace; margin: 0; padding: 0; } div.clearall { clear: both; } /*---------------------- Syntax Highlighting -----------------------------*/ td.linenos { background-color: #f0f0f0; padding-right: 10px; } span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; } body .hll { background-color: #ffffcc } body .c { color: #408080; font-style: italic } /* Comment */ body .err { border: 1px solid #FF0000 } /* Error */ body .k { color: #954121 } /* Keyword */ body .o { color: #666666 } /* Operator */ body .cm { color: #408080; font-style: italic } /* Comment.Multiline */ body .cp { color: #BC7A00 } /* Comment.Preproc */ body .c1 { color: #408080; font-style: italic } /* Comment.Single */ body .cs { color: #408080; font-style: italic } /* Comment.Special */ body .gd { color: #A00000 } /* Generic.Deleted */ body .ge { font-style: italic } /* Generic.Emph */ body .gr { color: #FF0000 } /* Generic.Error */ body .gh { color: #000080; font-weight: bold } /* Generic.Heading */ body .gi { color: #00A000 } /* Generic.Inserted */ body .go { color: #808080 } /* Generic.Output */ body .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ body .gs { font-weight: bold } /* Generic.Strong */ body .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ body .gt { color: #0040D0 } /* Generic.Traceback */ body .kc { color: #954121 } /* Keyword.Constant */ body .kd { color: #954121; font-weight: bold } /* Keyword.Declaration */ body .kn { color: #954121; font-weight: bold } /* Keyword.Namespace */ body .kp { color: #954121 } /* Keyword.Pseudo */ body .kr { color: #954121; font-weight: bold } /* Keyword.Reserved */ body .kt { color: #B00040 } /* Keyword.Type */ body .m { color: #666666 } /* Literal.Number */ body .s { color: #219161 } /* Literal.String */ body .na { color: #7D9029 } /* Name.Attribute */ body .nb { color: #954121 } /* Name.Builtin */ body .nc { color: #0000FF; font-weight: bold } /* Name.Class */ body .no { color: #880000 } /* Name.Constant */ body .nd { color: #AA22FF } /* Name.Decorator */ body .ni { color: #999999; font-weight: bold } /* Name.Entity */ body .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ body .nf { color: #0000FF } /* Name.Function */ body .nl { color: #A0A000 } /* Name.Label */ body .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ body .nt { color: #954121; font-weight: bold } /* Name.Tag */ body .nv { color: #19469D } /* Name.Variable */ body .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ body .w { color: #bbbbbb } /* Text.Whitespace */ body .mf { color: #666666 } /* Literal.Number.Float */ body .mh { color: #666666 } /* Literal.Number.Hex */ body .mi { color: #666666 } /* Literal.Number.Integer */ body .mo { color: #666666 } /* Literal.Number.Oct */ body .sb { color: #219161 } /* Literal.String.Backtick */ body .sc { color: #219161 } /* Literal.String.Char */ body .sd { color: #219161; font-style: italic } /* Literal.String.Doc */ body .s2 { color: #219161 } /* Literal.String.Double */ body .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ body .sh { color: #219161 } /* Literal.String.Heredoc */ body .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ body .sx { color: #954121 } /* Literal.String.Other */ body .sr { color: #BB6688 } /* Literal.String.Regex */ body .s1 { color: #219161 } /* Literal.String.Single */ body .ss { color: #19469D } /* Literal.String.Symbol */ body .bp { color: #954121 } /* Name.Builtin.Pseudo */ body .vc { color: #19469D } /* Name.Variable.Class */ body .vg { color: #19469D } /* Name.Variable.Global */ body .vi { color: #19469D } /* Name.Variable.Instance */ body .il { color: #666666 } /* Literal.Number.Integer.Long */ ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/literate/lib/extra/0000755000000000000000000000000014556556456015274 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/literate/lib/tests/0000755000000000000000000000000014556556456015313 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/literate/lib/widgets/0000755000000000000000000000000014556556456015617 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/slot-signal-mini-tutorial/slot-signal-fig1.png0000644000000000000000000004751114556556456022417 0ustar00PNG  IHDRtd IDATxyw}gF%ْG6ƎDlx!`@ K6A{7k?0Ar 661&"6 ²F:QUU]]]TSߪo}[̷߮r q6J1Ir|"FcJ<_%׸@#G d9BTA7 u%=yǤ*Ҩ*FI8-"ɓbb8oqiט4ZV%PJ葠Q ,G\?8#\>&|dE㚱S5suK󮁫6!%IWB.rTV/K9p $8/בh2ye[qޱ}[>e9m90mO\Uj@^ ?MWbg:4;3'7sޏsiRVb@g}_W37C:w~7~eJ#TU8(QG1Θ$>p+_vl`r2n_!6@I순QF*KFV/)X?Di\_~m?|dxS=Ќ=8kgvrExzzT*99B߄OCღTs3:S'kld& cz)a풱g,'s=+y:^> +k{1cY"g}לG_6=_TmO@eOth3޷Rһ3^K}2­ɓyƎ,UкrVr_oz'>sd InI['57߼qss?𺹴μnǑi튚_ׅW?㯹8IѺ̓Dc3:oTc7M/ߒ䎛3K{I]FEĒ<іO_ 鿼O+\tW|i//'\(?XG嚼?mHRz^\E<_$cd 7Gczݎ. 'Fz٩;w긏aoo idۿUO۔߶dԍ4=pW^vfwn~qE8a~k_:lkG2rkflTUcd$G·22d V|ʳ{.Wq\Wkedķ|׭6de_LIR0*I&TX{.'^z-SzG7\&_̡FkWw'~g=vFJRv>`V{[_p`/Y|9f||ܮy$3bmEr\qK/O  V^-xcXI3#n|/*ᚱUǭgeV:KGk~z5a_|v—>s ϗ|v?Nf_SSȟVKƏ[tJany؅pmx\Uɕ.N.?5V68jfNxz[-RIF2;;/^w%|ݯ]'zCSR)rF-Nkgթʃ?V'gO~mc$a%&.ۚ3gӓ7o>Żٷ5~|ݫNX>J=_q|9'Vtgϕ 7W.}SE7|п};Β _jZyGyOjO)z?xۧg 54'q}v5 dXWY/Йml+e[̺O}39ˌV{zswWt|zcdҨIKzrZ) F#̈$c_yxŇ<cltc'~ p|٩o~+顏1ƑugʓdFd'yKe-dJ>.f/omW֯W~?|;F{ڜZ~djɫo(l_.e]pV$V_QS&Lo_K=&GZz]~/ЃͭxC5S>[|$giq[-$|K.x[_&z&6U_xdzjn1#RY"U`zN>A',2Wc%c\3R*~l~--2O*-b^u߿,IUOR~\zůr@I~x^ VVn0wƥ7pۭs G7u%l1%8-{^j~bv3K'd0IYob gzZWTfˎkLcwUe*VT|y+~PW%iĨj%U`n1 㖌cgcUUUTl~ Ooa&#%U%Ue].C`8ů:#SkLTU/0^PZ뇗JGDdJ|w qn0͒v%V% אָJNxM u#o-FW>Ҧtg[>'|g(2ӟ͙ wl>`\NOkL*#*|͖Y?ouD ?[z6Dç ZSn~~'\y|WWɺUcntm y57^zJ@ e uج$G򝣩 |#~uV>hY]\@uN]Qui IdICKXQ?Jڭr\kKhf0GJ굢dp{W]-#j9tlNlzk 7}b:@jacK6XUYolWV\@7d 5%} Sj) CSho50ZzK1CvT4( IVD{C x,01bwo$ɨ^ \vJ*FjZ}fTLrΠv)%^m䩱ŗFh[vakB2:vV/=o>r<t=tzqepy+_4 yWzZH*yPW{.  GQ-lB>Г) `S}SI.Pp7T/)al9gl]RWՀHep:yy-o(5(T!\p}rdk<1چ eps$M{ډ*Cr㌬[3Vcd~ǖCg]6{jdO}fg8.P;-$lV+_N/Lܽ;OZGܗs\ :iȩϹ#8:ҳSk -C0H&VNne:9ww\4n=6'usn˰65D\nlvSK;ku[2 ]2cL˩yȹL_h_vk73uā~}=^}Y8mֆ&7To~r.Z׮B-VtSg[>-da2j21 Fv’3KԻ@ wyoU٦ ߩ0憼f!;_<PW_ʉR;2**c.u;F iZE=6~NCp ]m}-'djG!%QWۯ+~NeDZݑک,Dzж@F08zs*<p%08Ε55Rhѱp"dwdј0R+.K`pTʎ7ykW,yyζ~ .=R<_u" ^Xݲ t;/?56'#;+_Y]O}綕<"#_`(Fy+%[%ϐ9_J ajZ`z.uko_#7.xiSWk7C7oڠwvm4ww*;!U}{f808=ز$E3gk2ό/@ꪩɹhT~TwoܩP}[nWٹ5L[p"M7[W4$NnC(SJ3`ech[ =s _pzٲ S{2jb{4 cu[Ⱥ(:"Vl7ߝZ`Z %0x>sIJe+CY&\lCOGˇk~-b{d0.% +-[Ma`|t9]l{cӡ&3Ylel"c:gۮ#n;g|hmyE"8^ˡ4a '[p؛LeN1_19GO~KQ=xG1Zh7zQ`+ٿ-'zQ y~~9 IN.gs*qn1&Tscl|=Fx6HY}zJvԾ#žj;kzyrWQ!IUZȡq4:n= bO0lϵ=Vs͞j9eq`X;pV[k*es2bˡE9-Q9U_-.{vKtƎ̆d2(z#ssiQ=ZN\ƫV棰d߫V^*iH9x@{Q5-ܛ-'g!i?z$/ص| ‚ko57+vi`AZW>cK*z`CCvqӰqh[N1;/? ,8u%O;SVV|OW\ppB=UaxoVNjjxWkW?4-}GFs+>ԁAڵ+g}G/F~gxZfh V؜Ժwfvn[Wi60LS{sa==bgZҜk- .Q*:{9yeƯ=qf|bYvV\zqe/q+_4 yWhgyG@m^}Gr@W֖-zE@ ;}9r:+cqC[?B9GCZ 9rb f_O>;G5#}K|k##1ڱk7gMќڤ+֮%egbS;^UdTNr-^bcOg/Q#={S]8 AhT鴼IkcT_ S_9i/="y$4$ת*Rs#{3*'YuMmְ94uR79+3jx򉕼Ujdzu5Z&CVs<>U;sb6ĽwѮZ;|2ë+qXc ck+_@% P_Ãԅǻ/꽮>\2: ]sWueԁ7;^o9U3nSʓRd,_oNfvMpMl]vMг}rtL]<1F]db%.L>99\ucIk'g۝=~9WAzv><lsڶ9,T]5ۮ˙gurl^<аY欺ahIM\>98#֌&/|;&F퓓|ᶹRSȺM!.4UuC>-Ν֋,#Wk5w;ae/X=OIU 'n ox?%M(y{.IkWY2bZ9e.V/[X}S;{.Nv5-pzOHdqٴUj5|v$c hQU77gak $'tׄx.^K^g8?s7|_tQ0STFϾSwqߋ:/;ݟcٌl~Z(@kkuZo Zay9eTo=xۛWڬ?8g;E?~TeoWܰ{RLiC?`Rys~q7=oo՛NKz7%E=mђ[6Ԥμz[-Ol^bɭ^=DTU*,]. OgffՏ#W=MƘM}?8Cs?nq=qE?3R0udԕLmmԺT5@</Mg'oן}@0B,"Gqs};;-ׯy9x+^]TxOXM͡ PK!@a.PKzH%TR%9F[]|Gx=z=!żDFt@Q Nz׬omEC?e@ Cp ”zdg]ss~+9=wKI}7 g%uK뺎>M!}pY^d8X5BյL9phV㸩PӏG%:- U@6BOd|DnjRFّesԮß-7un9O/8+3@5\F9!)=g]s?fDҕL>3fC,8S]%7prsIy[g]6)F22?cfN;q͆3B,_ZĄ1usˎ,3L}P/],#RW73οwu[ͦseJZ,gvg aOgGeejYj>y%#dGiB6wY!k)$WwCMMHeYH:Doi+gl!ذZ^\(E>-nݓMMdȎ,i7&n!(}mՁ<0ѧ6YH5֗,"/GbSZ,>l)3GbG]Vfw3dfz@Σ%/hXz{v9*Cl-Lɇ9ik%[ȭa!'߻w9Oմsv,CBePKFwD 2K::1BO J*v39=KoZU=͊Fa1u 02_{Ɇ+8y?|h߫׾w T7`+ΟN~_~7_8KX-;Z> Wdpy~ i}oҹ('gjc[oy hMEctyh7kyml؉:̮)vM%sMM.#FˉwyZr6Uc۪2l0Up%IDATR4 kl&l*گB֩zv=Pi#Z7uf; 5 zFxfou= 蜎\QK%jaU2Rk"'J>`ča'jT|zkίaej JrNԫ5PBl"g/Qf}M<tc`;;QcOѶk%@Ǿ璱 %:6I}j_*0Gv .;h(̡ PK!@aI/A*C*s&]r<x%,b^Etb{c<@~{ 5}NݲJZv<J^Kˀ?;7=B9hs^T}|IuA6F~ibGp `!9hNXbʣ#j[c}@ *'.,W VK ɸ@p `!UAg6#o%J#9G_ i5o#*5v=[`!-g!P7@c@R6I?0Z+kd~q/v='^{N[nuQ!v= @OG>s3嘞ˋ.0cz@3KʷԮuŕo]7OkԻYۉGYEI[(skvD$|ÿ? ,Cx{=#v\ytlNrzYN0nfSo/Ted}u,l1ܾ Tdpl6fcp0#H͓mAjk9d2,ZY%">Qdp¬E^-^ɒ?~>?|o*IV *?@ +zeD@NHf'O;iOg8svgb‰؜2kIͶ6U2N>eqSae,=dƺYe𑠜[On:~b9y=X\Fu$_ .?t;N@|k ae| '56<-}zH͟ r%Ulu֯[YZ1Պ+%g?gBa#?@䌓8y @opMD%TXpy"ovZ b˽<@_:A/PK!@a.Pc39yDn%@GemTWMhzJԖO,%^bo=b٨k$?|C/I T+_߼r^{e/C{.PK!@a.l_!LX:#e˧v~!_aj׃Sl8C{J7 Ȭ\uLmޞhvj=Szݙ9[/30#bO0O ȩ+@ .>ќ-7Pk׳6X|Cmel+ɵRDle/2Df,U 5I*zWvY<ω>Gpj׃ cvBɟs+޹="IR77 ¢@ ]\ "J}6Aѩ{ دf M-*bs HpY/`J,^oNt*g"5\&yJ00JTSrUre o$IM)#cCE@18b$::>Bt+MTRI%T^hb%oZupϾW-}r䉉zݲ흗JmMj L;5g'eoK/_rݷ]l ߑ H*Ț|>7o-W_0!@a.PK!@a.PFЗ8_@orT3.#J*Z:hb뢵K3B~P=ߡ)FK!@a.PK!@a@_|zH%~Im|FOz\0$+KE :K!@a.PKz%WЛTRIe@a&]|Ռ;Bm0Bt\0( % H2b]R9\0( % =+M_[Qz7 Ʌy @.PK!@aI ):Kz:f\5&OŐ/ cK?w=__ɓ'&ꥆԮRmכߎ< ɿL:k LuՄfkfϖO,K/_rݷ]l ߑ H*Ț|>7oVm^}G a |dC:TTFQXo8?ÚXY,5DuE32MJXMͳ^RKR[ 3v&{|+~IVv5ftvXd4гJͽ^`$H]%5z3#猢6\8;*L =\"\漙/3W G h[]-DiAa˷i,/;|CX[fXluջ K)Nej'8+[ٞMybsbׂsP'Q)FmVGsǂyGż Ƥx%,$c/zfrrt{n-M5<@Ml]vM\{{.h۝:GG@?"6F2##cddd%+Q( % Cp \0KCeq,1ڱk7gM˟ .oz˝vm;vM[ c]RI%NNIkY9yG m)cIk"=ߺgfQ9R@$V\ Ϸr6.eZ䉵TiqC/I( % Cp \0( % wRI%ԁIt=KN[ZZ}`ԊryZЗh/az3Un?j;zbhl mwڬ@^♶2mnZvnw߻[Wl 1%=8Wx%^\Uo~ZDZ۬6++ ]d%{4}@J[@x i͖IENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/slot-signal-mini-tutorial/slot-signal-fig2.png0000644000000000000000000007606014556556456022421 0ustar00PNG  IHDRRosRGBgAMA a cHRMz&u0`:pQ<{IDATx^ VEDk*jz)1˼""&^/̢4+Բ2J%j"Q\;^u̜9s9Ҵ:cg% 9iTO }w:9o;鼪Uae 7\pنҥ[Tp)R X@JF'n)8wCx@g-It|p)znkUL{n9UsfJV6\DiMS4NX1w'?eMUHP @*PPt^Ww|^'|kLK_K'Ny5 H(`*BExg'UDO0J@zS_l{u$() cWn"z'@ē8P T5,r17W({"D'ŏUأRQ͔ ,h. @* Q迦0NöP*\%B#:M Xm-1';֏(Xr"A(馏Q U8Rak;ih]aȎeşgXbuPxm%mb~.@0;pD%]-=yHP @fkgJWm4(AəR|z' nMs,dJ4NΣT>S︹ @*Ў}c^q}iM5xÎOmAADl5R i@L+@T'%Fx յ]%hlEA%{^k"'N$> @(e`9g((ȖżaGPrYnHk]}-]YDvh_m꿐r<'GlV8tb2ؗѨ̆P  'G}ōZڢ}8 K[F^ bRm V!?iyu5tL~}Noם|NI_#j+?U1כ#^|oݡn~D}]uk\7dJk8ҚKGwX4Vc=>=?G9"(2}{?< {h1t7NCֲ^']ىX/ %Q?]?'}xv}]#u?p C4 yà_r}{Ͻos㎃X{(6뿊 ;<߿x7s 5hmٿs =ec}ԾGWo;r/N fC(F 9Sa#.OsW&=w#y“|Nd>ua( @(0yť?'[ȮklLㆋﭿ};gؗB}'V{M;j}^tZJtK ~3zn|߈M߻vo}ІQV_3;Wcį݊}D~ܾyŗ5C< Kiϲ|mҋ$.FPI*}SWxz6]9+ŏM²z˛9Ocs۷W&cO'k`Ǟf6_ހ%i#)@ρ]<0u5Fuo~߭?n;aTGsSmkaWطaE[C0o&}AnP}}uמnik/?a/>f`^rO/ 䩎A>|_Q@y6$P }_lj[X͢}Ͼ;bxu??g ׺Ko%m;}>;!ֹ;]:G׊ ſҖv}a\MᆆXVmSeQݯHSZAn)r O؛kjtÎ#ql-?||EpY7Tb5ϯ訕}iI6zѾėtL3H.;_4pУ6|h. @d}4<"S¾V7u>K>;u4oC?ԟ޷}mdo;↺îï;_n_}Φ|mk0'uWk/Z;]5_uK91E%sEhhu+Y;ȫ-<ڸf2@rPO6^:[w7sƇz1vfny[்Da{dg{\sk#s]d>~T;J|CpVuVc_"3H h ^p=|;NؑGXw u_׬۷oum{FZK?|ȋ/kg~_Xku=sժbScngT,YРhۀ/| hcam@6h'9Ѿ1s|جc.vAF==G:%O_}r\=7p}ǟ`|;h&a\1+ص ]{ RNVqg2:t|ˆ%_>7tpٽ8N!"Umy Rn\e4ןswi߮;Ꮊco;rTo;xD7Cnq;!ؒWD uw^I֏P} =>Twȳr2'G~csK:`'jCkfJ3\"40!/ӎƗѺ6z ΙT|m'璘N8o?xɣ{Sϝk~?oZɏ௘F8tvˉrˣ^~vL!w9n÷Q=鯱kxޢ)ַYk!RҤW%Qq#k/a7w~^D9[wO;ꎼQ?h΃^"]}poFZ{7׏ٴsGV8w ZzA~SHN"c?Zڮˀ}v(.GqO~}?#>-_rbZ`Kh_'-e4bQ;OH=Zäh}JP ;S܉48}<Ȱ{t!s>{н/Nڶ`gzhc}7{y{}zI)䴍N:uC~_Z`gUhb#( @*Q`fgv}{ A7<[?>q+6Oԛ?{!%F~ x|Cgl'-lbpJ ztľsVc 2ekΐe[XQg%(@| (Ghw$uξ{=xy=O=ߧ ]F5wٲLj(uRaX3%ذqKֺ]繋=-e{ Hn_~b]`.7`Rf{\>7 dC%^5Y7J yT0 )D]{kOw=pw}]uMmK6qJ1wŇS^}h"WЙX?p7=fo:|zk]=ڱȏ뛝W;?#A(P& Hk }im > uUk.fvjEwp\2Ϝsߞ◺\-D~:%HP  ?i(@Kvrֵo}G];OVwwW1߮? p 𩑻.CkSJ"p>C㼫/ nHuO||_y̆ˏC6]|Row_C;9I,GGo!O<"P }:E+z4z{ccבjzGu.})y.v^`m-,EP Sw]+7n?n_[vrF#jixН{\Aߚ mO{~+?콋rWV}U{KfSݧ{_wrU_/qp)v#KdLBh&PI{]oj\'VLw|$%FZXqHL\yekbWkz^_Wץx} Zr/b߰m=l׻;y߅gCs³蜃F~c.0 @2Q@}M_w[3=7K̝"(үu_.yLԙ/}?sVŧϬ~ֿ'Ϛ^Yu櫴)/w:‰3ba6ZĆYhʙ=q'z}|Gz1ݟ>3>M>ja'3_(LNWu3e>8PE2m-mx}oA^~>o쳙ǣ}+P @+PZQ+NW$L3Z`Et"^ { $F.4/I X@'l#'B`_,P %>-ʨ)q`_p1Uaֵ$VY̠7` O{g>#?P M[1AF2FmKE ZUxKRR?+h_SS3O4oz5QV A(V| O0ii]:d)QtJ/3l6%&IFmːǗa)E<`n9S(7)XJs_Φ.ݥ30e'_WNA(?EotVW"+C`ZEkCVJVҝf, 퓰>=S4 pI!ZG`_V!*ch|!s c0P^=h=Ik>ġH/ ErmxJ F`_LINg8ano> Im:IvFʠFD?ľUHgZ$bmh(+}.P eS>|mڱ }"iݏ6yNůl*+gB|(*[|$(@}boFh IF!>";?ukHP dA9Ӧ -$cHP @4(XH{MҔ>#'?h66^y:tk1bH>>hE)PQ14U7iP mbX9ks}9ڢ0(͟R}-HAOݷO wIipb* A];" AB}C (ҥSW2#kx%r9` ,  <3XIr&VqFhMhOai)WfD#O\˗wHi>g33CϗVl͉tR|KN2 ȋɬ5F*Ajdj ,&%W6)sFaɛ?K=P U g%<6&OL5bDe/n散Bp-$P,_y/>t{'wCȷt}#?P@U R~5-$1*6GJ(t,a= 9ES?^Q,{"|spQD=P~H"=Vj폝Oenzk ٨?3Ots}P \L`m+5$F R T=mn'ZdtsVėZc2ݴP27nJ>wӭ;,{ }nHP LbE&=y_{쓂p)z`T+$p&@"7>6UL6nCW>њq>ו9h(C2}INW%=KUJjGuУgEUEo=_FG}Po _ +Co&CL(]30j" euZ3-r,]%ܪ(I5C^=*q_죘Y}2`$2}fPXKr/Nņ/P ]`_b^A(!sfB,H[xWߚʛyyQ2߈5VPf\L6fnIG|LP (s|A)@T7?R83/)ͯZ)6&`Bn1̍eTkI]t+;t u6A[kɥun54D< PJ-QoWGK.j+CEJ}n^xf5ݱ_X-$zڙ fTXKvW[{7-{? 8GRH 0)g h&M/ԘoWR\6 R`~U?.bˑ2|j^+zRT5Lb ZUz4~%IaDmﯯ[篛$,ϯ.o@yƱ;o`5}?0М*#0"BzJ.]hnuY>9A&nIcF*dN MP%쩕6F}>?F鼽=;Bmv v]\R~e 5^f]K;sYkn})K طlٮe򔪪+|pbf9 xRu3nlص{gI' TZ=kɠȁo.,U2s D#>)ڇ}d 4* r.]fy>|f1 YcC-nTj~hS2>)Xγ^OL퍖ʒ`g'i!~Ē" ˟W9IK\xۂ9>8'6 R `3c[=['Q'Ug`S.C֞\ KR"W6߾{s[KֈK:#/lV#RxPɜ y\ ;u}n,۽onm?\H%(T{=3ܜd@j*jT)D,VOOx1Tma q%/_KuR0, !9 煥ȰE[潞UKJX9H+i|:k;i D}`U)bؗ{@S@# 2ϫgXf~^&-P'LiL2O Oh+thOJ-d)`6^YiJ /j"9l?/}+^b۷`s ͓y)`}L[:zOb1eN[*`>F{SZc ~=.fxIzE 7͝W@P X+죱]vRb\sG=}npK-6eݰ`GCm&/MP :`_^U=F5pDN=װa{KV$:]~#96B%s"Jرze2ٴy-6I!/Uվʱ1LN T-;^H y ƷV챏))MORHW5Ɉ}N"dIEka|XTmqHf_}l0OʜZga<ڧ_ǵ;΀}r|s<_ ZO#U~U 9I[P"cđᚳK͂Hu7E*Y vB{fdVmS0uj7SUm99>}[:x䵁Q y(`"mSϭ~m{h_y+qqt\賽P}jfKnU[Kݭ/W")B EݐԦvmp+=˴7Ƴy *6Ĕ9@ZRI}TðF7DO^b 6LDYO9̷?,#[h}9`l|}]HlZ&B:b(Kڍće -' 쌻+}*A?%H>h-&D ɉʘ)3D xoϼ9w3s٬A՗^גE\ ا>NHa/ٳ:6 W8֜lO}{YkDzm\x"3<+"9Qve.+q3rНO~ҋS#M:wSʻYZY=R57 El O Lncs k%|w2H>Q(I7`_Tn{}5O9Gh<4O|~r[dlƀht"XEOJq)H9nqE.j3&iNz\5Dҕ[R),)V.PVo=EЯ$U[¥ګ7Tj }}i JޅWpmo/}ޱ* &w.5þ} t zDO\Ӿ)Rf vU5Ba],.<MԮͫJCѶ%U6%Ta#a6#O,>}w /I*P h⒎\ۑZ!sC۴K:E %+ X`N^E(J>7c9,Ah}$ 4*C ʓP X*`}lx׼2'  }> ٢m8a](^Zw Iþho ޕt#4#Dtby޽).rdᶩ yb SN殕Kx!/7\s}g+yA>~g2[zdQyݮn r}w7Ѿq _%X p1)PQ1/اFSx}ƈRA)~ +_jHJD+8LOI5nۧnK{V-/ESި«OF|z}TWIMh_q>۷o&;yx9jXGP@RbԩeTPOtZ[s||Gɒ*aXVp-WyfY0%E4l_yBzy!2+Spafd \55-b)GvvN"9 EeDT݊RB7(B)uS[*^] \<Db3-Fe%JÁH!.I[͖[y /z'"q\+~E,C {RX&걈 ɗe/%Ac@ pqD0NR(T !g[Tֱq~5 W:=ĭin=̀}}}D{1y/`_~Ah}/̭鍪9U+)%/j6b~l?eXqZ ق_H`S>4 qVF^74do}9~sb_f(cA>)3{Y`( GѾHŮ<HطLj u!9qV/>YhV^vWD'@+NH}pf*Vٔ|¦ _"sxm >.("f01g>&2/Ǐ*Y`_xȢ6p}l1'Q]H.L1E= W{IGRѾ^#f- ieCP &`N^B -ȸaP V5'}%W%'ҁtܸ V U4$T~ mcT \9|~Kcgk2juE1ԣbߌN~R*"`K৶ta;tb/gSW3N3~nx6&heצG=ը˾W9mialsanBIS, }!(a×"F}̣8)Tɢ>_Ѿ0-̵.-lb/|[lJzCm=aF5rmĺ+yA^mJ>58Ig҉y3<ڧ-GB5.X>`_6gNTaK#;,!&!rTWdъ ^%Q]Pe<ˆ| 7Ur ZǦvK]KۅĿl:ۯ8 tPG{iQ*G=5<'R8M>,eg`(RTa6ǞZ3x2U;&[Ϭ&6KEd4k*{? ג U!Vg] sSvnq^IE"D}<u hMI'2ukJV|[KI_QRىz@3mkl࢝gWݳ=$mtpK h>j;K~Ke(rVXUR;_m vm" %}.tA!P E—ඤ \Taa&) C \ڷOln*nCSoR#: h( 2Wb9Jkq%kQraD6tJtM1<~+KnҹLj91NT:1-j嶁K2k,ҹ,B6(طt!{ .q×8/*"Q5;SqIQ50FcK:Q+`w`H|9  ;10aWTPK6ɫlU|gSA(I|DK:|a;O sxoG[J@ ~(A"?}ĕ>JBj/7R}jxg%QI/YwZx'o ϖxT @}6+y"'oh-}ٽw< d/6yرU]a J`6%hPo J+F}lI|N܅>3!R)V \9U ܼps y!˱S)Q,dB^.7 _3l[fK86k!/d_pRbCfY[xRSR/1}DTJ!mK }MA{+UU CZoin ˮ#Ƕn9Z^ ? 8~"!H-iJrΫKu7"[axfY+~s룅lu))ADe`ڴ1< EYEz֥V~H> >5a0gC^% q9H-B,n^!0csĘ/B6;0x`VfTbS pU&JӞi]yx7f^kY$9c>>`J^O D@U紁9Ҵ6IhGQRub6h4WIF%mjv{)9> Ue~'/cW9颴s?#0">o-oyb9þ/B YI2D{wЦXg#CD-l8i#r_Y8I\Ìb~d')sd[)iHKe'\ӏ}ȗ:$Q$JV椵^351,/9E,~VIRлNKn$nPL0ec#i膉oJh_ ok:.Gha_z/4 IUm@L̥Ґ|d#e. dmeU9$c)9fYH '+>2E9ҶCqo3~󓉃D?ΔGcR% 4MED %wKix6-Jطй0Myc$yHkC* P O^qFr)2_eK/o_oͣD3<p 0$-EPEKDb>p}*f""WXWNK}ed(B*,W>eq'1ՠ>>vEoβ2/G@~ 18`vIC$}ngѾT P \4bVo|>6KwmWCyT#Θ5cJ$:VР#+ETLԆbYrXdyV8gX{jO5`Ky:&mU.;erf- = @H|`{np|o`~o?ݗW.}q9}"[bt^CV:+^e8}Rn+y9Z˹h[Ƞ6KE ys  `_ȧ?.P (Gv='힯qˑ}o˫zlvhh[pKaj؛ ^j! XO׀}fd'?;[ks = @H>G{Gc~ÿdJbmڹ} vߐ"[3eFXV>@6fjd>'!/G/7ņB>q9e@v29^J^ګ5ll1+y o8L>!Ni&ڧryVʯb'AިXuO7Y +C&C(Roc xy|'/yڙ磽ZT6lv>q>N)cⶤCx'J?>TszNFK:ܰ JjyŜնT#Gxyx/=agKeEO\@*԰[:hZKk8(GctUbOT6`_ )cP TIY N^ lE$v;I1QW B>q9e@뉯>k!p>_ʬ>_j sB/kIx~,o+ B\`_ȧ?.P }*.ogqD0c:#;ITKlFH<)` Ds*T賽{yB1kN5۪707T5ήlW4RiRSWQMP >w毜 mSQSO% \]z.4G,S$Ѿ^x- M`_j P >_rb΂L>D4S`_ P >'<9D~!KrOGe6ʁz@ }{Rl}'m,GB\<ƾi%X[BH^Tcۖ1YӇ%K^0 w' @+`>znڧ0hmN -q6˰M}v_0iɋL{mB{,buط n5Y*ˁAH^b:ȏa|K/K!W8II>ySi)E3M3@*WfKpA0  @(^c3hc[v8#{wGZLa|Lk 9xʱOK"8m1o>Jyl.)\:{ Q)ˁAH^b8|1-; M.ce/-wþ|LrܰfD}D,Lfy 2-įjP  d|;m߳>mF$z3KJJ} Ov rQkTs3Z SLUI=Ef:LukۅyNi|=_$ P $@O;șv}i>Z+2_: 6˘o+ا{TFqsZ҆8BI+ȓ`N˦bOL|'W'fO%nM9lj60B_ r~(W@¾e=F5p+:|LRhl||uEykyɍch}(,Ҧ]ϯ5!Q7}z^%;gvUv%Yf/A  @(j 81W׆>NB6Q(A }һ/綒WG4_8/=aWd%HQ7gi㜪F9{i3W+g.i4ͦ o)ſGȁ@ȇ|cV+23`آ:Fr-M-O|v%kU +%q0K:T$n*ݑrnhrik(ߗIhX*ˇB+HX` տ@!2YdI5K>)E>q>u`0Tԥl^} T@>H#)};y ;ysN^ MR}%!``*_ (V [:ԷŴK/7gOlfOZq3: ?D`_®A(ҋ}*W>cm7rח\ (V z~lI/? 4~XxƎ)sZGr{vQ*aQo ,'6곽pB L|r9l2V&Pq(F'ܺHf~-'~ uy$5SHKqE`cL87O p( @+% gsq*ic~migFfH`_֝P }q h)h6*N"ڗ! *7S}q8 @H#12f/Ȥ>QT`_1 ;'@  ܯ@(%qx @H/dql1K::l4aUJ®@2QѾ-4 @ xկ<7VƧ-JNR`_` ȱ>l%I7J5Gq(˱BӠ@Giƌ1It*x- y!Y̚2m,f*Y!֊O$(PJ0/B(P D}'?ͷ4X&^BѲu2ZFቖm?w#J%,\dDӥP ;ɜӇ<'G? C0GO(ٷO`P`ϭ:~0fߞ\{CK",L 2},TŸx2U Vm}~N|ӧ׽b7Hދcz8i#>$ q9L^LI 풎쎶6U ~hvE{]]Iy'2<)T r1KLG^)Eh-\ N:Pˡ3 \(B&dاHh>z*`hP]h {#RɩW}~h.$wWLo<6cy%jTOcST1aKbJ8ȫF6o_5E^;#2hUP U zHek8T{Ƈ[mÉpr}jpK}n21 1<X Z>i.#>rZix\"2{Wq*~@`=C(>G{1+4]2j>u cN*mH&ΞB7S,} ɋROlzԴ>^vI|rOm @(W豏䥽ZGc#{5敼`"[O EA^_L6kSQrdӀ}n jImۈAy0]PqP @豏G^-nWbsobX! a@'9'W}|d>yQc83 ke۱miIni}p`P @ Ă}-W ۥ54v}Czk.d}|"߽s_mbk {͸_V`=C(b>N^qY|'X@}>Y ~|z'≻"G y#rv2Y`=C(҈}D۴/gs{Yi mʊ3 ~A9cFe \E /,öŕPlX0o[r6UB텓z>^>fcͩf[5=XQ7gi㜪F9{i3W+g.i4ͦ orXw eP Ĥ@gx gR~[_mB8f᝼9VcE4F`_L>B(iҋ}G 8-TUrhHe3x(bR:H>ȟx>=ا=VP@P dZ`_ɰ2p&/@e/Ӟ C(>aH u d΁ѾL`,2< .O}1  @c_. Jh<)e3x(bRvXMQJY!.mjjŕЄ2Q@P dZ %TS_M eiw1  P/K:"L`_=P &bߌ30z56PbǎNL^);&b2 *v-/M]sB08y̐ gX(2@ڱhHљݻy"$O1;9ŢcZVxjկd>7oCSsp`_=P &b>ZI~FxmnHLt]M,?E8D%_GP/&bȷǢP(u^#m}p0;G%,'~!]Ml?CI)a4@}OCF1dψ,Ǖ$d8#E8YhjPWؗoτA(WIl*qʑ֨Jrq(dYO-ǘc6+dp8>I~bNdbfu+R;ɑN,@by"?%}Rb2?˜] %()WFhf&}6:x UK@P [oɯH>nix2ۗ)!%YAy2ԗ ˷gBIWvf'a;u;:_G'1cǬ^) b>> ">y,Ǿ 6ޘÌ}Vd_TIt7/9}1 @O>c"AhX džw9Gh#s()BXf c;>^DWunmd&Ine ` P˷gBIA^|Z!]>k8#.;q>b8iO\NfY طK:x q0&s5r{ ne79:* Kjdۖu7y*}p-BAm(M.BC၍T 9 ETK^%4K@P [h6qnitH@N.<ߜO qF [WJK:J^ZNom%=# YxHL #|ЖEx>rlIb=Ć8Ɗ>ؘ:@`RPڠbU#=.F"W3uP Ĥ@}mA[Io GW|E|uvS G+h41Ȣ}" I$ch DSȱO JoڨMOՎ+19yfsce7Aa %X(@Xs>r3`ーR L$?3qW&9ȫE5'YHs<#^W_4b3mKxWxIvڷû*S:(bRs׻h٠+KQ#(җ>)2ĈA+4 h3X7c+y +i0Tmқ:*Z`@MRX˩Zm ՛w=.%X(nrK~q'}jI9kwx+y}afq>qix \+ɴ.Z"Hq˷gBI ط`ފ=wWEWeعR fq>8m޷-xNdO2SaU\P dT0F:]WOZ*_ :(bR a[E,a퇗AѾ%E/&bȷi>Dl \v*sKq'蒵Q2OZ"~, 8T sl/B1kN5۪ L{n9UsfJV6\DiMS4NX1w'?eXq"hR GC? $f.J?R5+Adi37",*s 2`*)Fcx$*Ԓ9'-VVG/1_H>!Ji'hh4x`_*< P e dx/7اݪ&f0/Ň}5I sR` )e< (:ѾLOa-]R’Y(2@zPtaIGX6FѾL6 VTcvod}} 4$U ć}B(]R}N~X+6pU^c9*4Ѿ%M/l2ױo_v!,e@f YMy0Zv"Ov(U@q(`OD#@0yFLxk`ŗ6/g;yj\a}w|h(_ƾB$짘TQ+ae՝U#Tbo c[٭.G [z3r07ZDuSx٢4g(!W-W z#Ǔ3r}n(b rrJ}lN*%f9/n*!Zʦ4s (P& D}8(J>1g3kO>f4O)ʒRb#7,-Ng6`_x)4 @ȟyZf̘_D@]R e@XkQ̑H(mR"-_%F~HqtψoΉq҅,<&jaT*mwhb1ʐh\(tڨܝ.J)jZo:-U=PL$e,>|mӊd~Ŧ;.5ߐJ6gDQyu /DO)Anתy$D c6(-LfyƐM>7ҖF!6w0+Z֪8v&0Qe°{yc&>9֜jU?> 򖉃D3@@!DZiO Z?mz5Փ)fүVaڀ}-mun["i\rB5LW /HTTn0IiIy(CZ^㶤C-ӌ}b8 WJJJD%*I7 .k 6YpڻlJg X=|(@,I A=#TKFgҗ9$ @H+c_= ˑF3|iI~M)U4III{#iK P>S zKߕ*T`nɉ[orK> % -PK`e*ܹ^L|- S`C(P \tfq[E(?}f(:(bT`C(P Rhb1[ۄz=CCRu뵬Lj0MNv:ӽEcal`_8y==>A^Drthh3^ }؇} C`C(P J}D#eNa`R(`E`_9:4 @/}ľ+[ҖY64tH}#eNL y==P@Vn26EMKu?O ]㞩;w>x3(@}>=V})D7kG~YM}i͔K_lGE_&7uz\ }>h4qP 2(GkMf?_j4qz `}^P @` }'EnD-͖.=C{HH{m/`{\#W(S}횩X* D##)c_MNJvWr`IG Z>L|+Qy"Mz~RsA(+}O{r8-ˌ]^nfK| Z"1`_=.P 0>) aB>v[9 ¤nA8-;%k+3B PN>4K%6Kq>~P V !SCg̃BICQ,J[J6cY>a&3K:X)lmB{pivz#۷B1kN5۪ ;yNʦ9K)Zʦ4}I =skGƅP @htA =Ù'ܦ> GEk?9SbSvMH{ OntEP@,'Fco9 6% u'>.Keq68{ZQdɍ|ۇh_9: @$ܰrƞ=itXF< IHe?<@Ѷ,=5ӝy~hzlJ#K8 B(Pv 퓢zZXZYҡ-mEcӂIf!Zfta 7ؗ-(q+>"?`_%4 @,wԳnbYಯc #P~xڙ~Nޞ&T44Ʊ{6t cAP U`_؝asOv# Λ9(є>J|9#}s՟.(R@ɰϒBF,k)I`ɛQʜٿ{݄I4^ҟ8V>3wZKgP T`}.2SY1>YֱDǔh %ۥ81ߌ})'0 @+yc_Gk߱eg'AzqBoKP DG+m;ghO:O[f?)}Q@ J2гR";Y"ē DDB(+uP@>i /(p!' Xa_O׿P dY`_JVI$אG8޹ Wۄz=e1v(Rs# dHʅP }>*˲cP ĥ//Lsn8A0RX4P.YVfbF`_lP ."ƾ pKj.PܷOwknń;Li3p!/.rȲc_?kOVOԕl= %S`_lP .}%sZV ȎJ(-\(gѾ\KbUؗ_DŽA(>`]X+ʠp{}q @~ogLL`_~Z@\ 豏&xuSk,K:}lUB, %S[@P W=Rc_p % '`Vڮ5c^ΖUžzN(t3ɱT\9*,m4ki*f%M/l2wRS-W_A(1>IaPI'ܞx-/-$UeXܙ7nQ~T 2m`.)P v`d9pu\>+Zޝ<ʁx@HĘaBb茴J?j1 *F.KD;yN)iSQ Jx;PA`_Ƽ ̅P  Y)1}LH5!ddĠ!AR@\x@( I75&Vk/Yztd 2m`.)P hF)q.jj~ qX+ڱ`HqvJ8ګ] @Q`_ <LP c ċ}1y͇( @y @ RP Q a{anUMoT5ϩj]L%ͯ,i4}QӴMϭ:ґ+I *p-P>(2@h[Q;y] @*ˤGaУ$(R,[7UIV8#B("]ɋh_̃P zPG @:@/zȻ> B(I}ywOh+ˤKgVA$EP"yWP >(WcI}_XґduArVC@P ]SO]y< 0TؗwA(Lo%\QHJP }P dR`_@ ۇAt?`(+};@}{ZcD^Whg=}e\X(N"'yqherx+nVA$A(*A(I}~cv> &@]P A(*h_&(}~Ȥ>80(_}tx@(G~( ?i3  @4(P U>DȤ>{P 2k P ~Ȥ>{P 2JeAP ~Ȥ>{P tnzk i+y P ž =/t3ɱT\ s_jzyNUfJ.i~eI#鋚o8}n-?e= @(}sC(KP dH` @L*ːP D`_&"=P RE`RP 2i`*)QؗIHx@Ȥ y @Je!/%^f@(!}>(2/CB(}tx@(KP dH` @L*ːP D`_&"=P RE`Rk o @&&rW0 @ P ;@)ˤD0FBXB{@&w( @rSؗIkCL(+7wB(^豏HP @0iвuS[*^轼K:;@2$P ^`_lP )}P r" @,)ˡ}   `+I)A(C}I9@yB ^`_lP )}>(r/)'zȒ1aKZ$(@2 ;y`+&OZ["K`_h(/RW7;|&W~9׌|v;",EAO>2=1/H;EKTf Fi2 1 ]ER/[ȕk}gP @ D},W(pa61}+/DJkj;Í7TE:7#hy1W.aT 1nNotثx(Qh(ڣf_iM5^mK6V`=C(>D(TG->L/glʗJ!:$H$~* XbSVH*d㰥30'B"[6ljP}#XZ^A(P U IH;*1>b$ Dn8OŀG9Jxb<%Fo[Ot*p*ŠREI9+qP @x2g)8 Q7^c-\J+"dKs>)' jN)g}bF<]G~(I6E񎯖$Nc9E⃪q8U|hU,JاV2r3ET8䉡M>OJ4^5FIs3<:´SvRDk%cԆgmQ@>qvE d P4CE"J)EkD;2jxD#`t}#?e@۫W;yCnC\<'R6<<'e9σbzUSp~-nll}zN;yP(1e"N, ˍ#U.xQHKV;1R #ȫ}rswh/"QD@گ=I3yRH+(H x9. @S h_$0TB/B>Rd` Q rFݜs͔^l7.h:bNr",s,h1)Uؗ$/ǵPؗR(z3QiyE|๡C(RhOD*…P $/>fA(PR}+C @Գr(R@,(J@{7A(*PQ1WRςʡHK:> @(sN} ؗR(hvF(@ݮUr(Q7 @(  }|A)P T`U e@+?}'ǚSͶjzJJP9(dn_Y4 @)Ɓ(}A(Pv `/(+; Z*Ɓ(@)˚P D}~F~(@:E@P YSѾs *(* @4 }P hJP k 鋪{knlNs @(Ehfo_<P */wIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/slot-signal-mini-tutorial/slot-signal-fig3.png0000644000000000000000000005216614556556456022423 0ustar00PNG  IHDR>sRGBgAMA a cHRMz&u0`:pQ<SIDATx^ ۘH/4 TP@ʩr(mb5Hc""bA@kON]}zjڪO}~1F_FZpXE=Z5=b;OZN;cW mj[? h rQJ dEr0IU= ꎭ4^cg9WszBl$<4d?IǤ)@ ;fc#8d~2&`;d\q/?/;^j @aŵ&IGjM<_<ɺwŤ@ DFcRGxfF 8 ,,S^sZj ?PcH11 1~f>[>~g i_k\]VVAưBB & --a0)@ .(pZ1t4R!~yf5zm7CmjtltK73Z}d1"._@K [(R&F:n %0c`ڬ`3oõ_Xo3gIThhf ) ;ݹ{+97un!:7=y|[+W;oqά~<%/?xkRQpg 7|ِi}~_%/nwwud+4%c \OBJȈΫ=)>/==sOw]/^6/#.di(ǒSKzw =t׮GzxTC# Vp?b߼=rGݐ3m}Zpւ.*Z|ƟT[\mIoodV}wӟk=>SkXU6x=rs(YaAޔ@ON3&>_6@Oҁ)%][6Z_Cc{|'&:Q,|`h= &ϛpc9޿{f"Z' Ϫ{B pI'v}ğ.λan>G5չO}@ ъ H>@~(Zv猲1ϔd @J{?Rw%],E=xНtz$W`r?W~]S涂{O?w޸l6\+tMf8ﯪ߂> »_\ݍ]+)X/gհ92 eW,'7#e# R^:kIGJ{WLshN-pIJ:S|+&]6WjlQۋ.}ŰӺ/{|ߞgX_O?Wn9u|Λ287wikxӴ;}-f[O.fkx#Oo{yx~[+ӏj?ڛǟ2E2/m˹N_\RүwL?}tJN⚌ؼ5: ~ I=f [zRR) w@1oش])=%L_:ۋ.]bt/}ŭ`cw?~}8c_ǜv7^[m0]?>pu#_:/O7c֨[_;6}-yn`x}cc|bJ?ī>rN⚌ؼ;KɻLq5LTCOoSe+iJiߖt]m,n/>tq(>oTqӸ;m/g.ghmvUyzX7/ol&c_@fj{?U7<8cf,ٵ9A0A@p<8Fkwe K#x+0B:}tLeD~y߿k'{YWV4a͎LIM`˰?ޛtWY| n/n>g(n6֜F]b Rw{c*u;{G3wtk/.oT_n 0}vco^ܣG?iuhcoЬ槍7FC6Un`]ǧvބw?Fhe+b]cݖo6m$\;5BLBCނ~O+Ƭ芿G6ifD/pɀy{Xqr,H*U``w>fw@_ߖt{\|[|֘G9͆5$W|6sU0k=z&ʽ;R<7gzngnuunL䊍c |}8|!ڈ|b\hͯO_4h~quufi;x|S^9 .s5n׹}8rpØ:_`^Yj[ή㚝d-脵ifDHY蝫H [x[/pMSMa@ɵ\yO񥓋[L,9gBəJ^tLc1, 1 _zLz)o 7uNn3s5tG3p_60i Ao'bӞyE8O3+μsoqϹsZ_uV捇>vSoY? [uW!`3ۇuGj $rz-^&\;we/KvuZ/Ĥ_ H7#ia&_EgH*E]~S{JIߗR ~W7%,K-s&qgi %Ǖ4SxhI>w]g߂;@pn8[]KN2rG,l3wz)`Ж -o<}Ec4nzҩM~u)'44媽_ 9ѐg־jz%f`7"crLf-vҜ2U?%sW F1sS8]&_Eg2G!%?DP הK;=T6-%_z=gL.mtg)KOS`pO;.58aN_|zކ->P򻝒o5f"&/lļ?2l>c|ӧl3FOopܻ]sCǷX~\+F@A Xጝ㹫*X xIep O1GN1D /l͒j _Ov&=c<GȔ.ӗ,,{b&:췇)<n6PIE(cb4̍o[f;)olq=0Q_U0j䷰G r:ps.8 @@\A668 axp᩽:j9?[CŵFC`q!97,Kd7O+?so9t;YS{`kުy=ڙ|!#SVN|;YB&5"!R&X⏽ߔ6=e7gJOQuy~`MvUΰv#oF]?ۮ,].w ^95 @9F@s+1 |Z/HCf` ^U7_+-_^M;<;xU.־LkA&pOYO9"H7o~\:@˱[;xᄃqN8p\Q1E7P?vWV|_6wo/m7]Om}[n{>jӣin׆?!mm"gf"=jV# ԃH{bQI@D!x@jO$]E @#m뭍l=cfl?gඳo~֠g dЎFs ʭ?0'7_^y50_۴q ?V]wƪVu`1EN<¨g>d@՛4 W/ut{?~I-;|pKN~tuXGָc%M/Za/֯~毝¬F˓Y٪[-Os s/<~9[㭳YW5ͪ0?kGM] d6m10hˁ)@ }1t )uFT<ynpyu1:JGL7S9uz:_  ߙ%-fl̪},GCBaʇTGI]fۿz1n*18`uٷ<6 ׭}?̭?nr,A%c! I[)5:X ( Sv|;nd!3e+W}ْ:K_e/F@ CX3`|ªo1x?!({jZnl0fq})`ǜ)@ WtOiԟ{C_b2y& IR0;=) %KA)( ¢cv1/,Mv*{B? ? H+`2x·4G vggHeR ] ]~G$#/M@*}[C;>MIRH_ zBOش$;tD[()1rқ< g QF=.hgv)=l [[U50O|Ā%"S$z|Ÿ067]_:syb(@dp/c5} fe}IN3B˃}+wlE"4PFHR}} |~*%gxf)AAIC3Tp4忲TV=4YR  ?+/{V_+ {N?D)|Lv~HR |pr1]/>GzHޟIk^(7i5.'D \d} V_4#I۶6#$2)˶B ?t [$,<"4`G_(p/ [kƇ}IO QaRǏ/Ꮮ?ROU/hIS\[T/[N3IIR..y@I @ ?/-J \TIӛWp ()RȈOZ/_G~3RZtSRpQw'C8?ˌ"HWp}~_mdu(RHGڿ ^{ )@ ]񗀠{#/_* UȯB ?n/s[4CY-HG b䣯t?a{_x0OA5=聦Ȥ}GҩQ ?9Y_.Md_jϛg` +23,2?ˀOXF~U9 Aod[/e1̊1b4 -I7zծ/?_(n?zêb1͗ _nz?C [8X>"* 5I|/?>qs@$̏{_mHx 2CNWɒVG G_x9R˵3.@>0;ϰx*M'izS׮ݷꫂ/owkh-yN|AC?}命?z[& AOkDe1  F|DqRP@F)_.֊/iί'wIJz_}U=ea+LmGkWe ǹJ=9WFLx4|)|o}oOmK7,}rnma ǻ30TcD;&H+ÎIhzs'=[_yo`E4_.~f~x?>:*MKE/ARD+>w"۠g[w÷?dy 6 L`3Vv  }Wi/ڴhC_B^UyK 2, [G~kK}u(V_Eݧ|C`HbHWdF(?|mACʇF~CQg(XW?#FQFc/_&O }IV#_ke- x × aK#3dR4XhkK,tjBJ;4kޟհo 4 =DȞ\,Z?o1>?lj3ζ7#&|gU?e"\Ĕ@)pU0:08Ӟ;GTO{z m왗K9A[Ӟ7~qV{?zÇ:@Zǟޟ%_[_e1_Z%;%K6SW_+jCF=kf"«Ñ_edX`jGgB>}V`|L, @ oE"è/q_'0NhʭZe;*>0>d3)ּol /< ep2s@3e'ݗ-\%]%_ ~2X}mOG\)_ԔHs?\O}؁ׄ}_S/AGOB}@^ zm3/Ng>bGnJ dPǍzl+n}/*sl5K) E#)`[ K Q5Lfl EHWpқr\^a 2%k^z_U6HXJP*>Ko' %Vw~>(2>VJޟO<݂@|N{>,ç=RT+HlS K{D?-1 eͲ 1Aίt /tDkI K_Oj&).{A\>7~Q`1nн" 9zhב\HS;6aJg{W\_QLQF" mίOJ՜l6aOfVNIw'S͜.w߸쫂?w;Yhw)@G#;Ae;LMO{@K A?6ޟr}:M=Ys d- Y[q(6 yESZƬ^ o=#**xUJL 50ݠy?f9sv͛g} s:.|:K:JøJdQOn 6#] ƟrjǠ ^̾E-^\s[[}+j5 (`pI:ޟG;ez*/c=_?aOW>>h2͹yޕWޙ`{|AYK!LGX C 1WiF<+NP7xjF9y}׾zύmp_|O= (%KVʵį ʪ*?1,K -!_6s_e0fhl`_Ir֒f6qGΘ l_v}ş͑_煱~%ύ=>I7.X^q?<D/hBX4eipGgPwMN9%ȸO F$8/68?}zqG  ļ?+gG|1G+$}DF<,t{5v췃?f$LP[2?׃9.>>h6tg/X|GGNX[r ':Gr iʠ!(ioԱ[Ԏ6=_ǻ\ϕKSntw&/qq^6ڼ})G~60߂RMCWU+ۢ*q~ sNoˍ_)5x̦o.OG?|1$}3`~qwؼXU)[6|dfLR}XOi+fkta|7̫Fl^6M|ş*?s\`:68au|u`:"bg5.Ou LYG*FeL(Ņ B'#=U ssy!\/;[ % 89,XQ3@/4+w n_ p|şzQ%#e5Д3 DbV@K)rʉ/F~S^/Iʒ`)rA𝼴s҅>+`c 7XM×ޘdJ@dgt5hyߡt u/ iS4Pt&)64Zy*%1.u6/ @xí-Pżsm,&-w5R#PK˔OZtR~ZBR >^1O3f>h*hjႤ%a r _w?5P ]9f=sOO+,\7uqor鸎L* L{|t2'\T@惺' 8yfa2A_JUa}:tOT iX'm.?%s%_6xqy^+q/_aai"U9=plGXUPiF%5A+$(q}&v: 9 2 +Afg9v諙EvzS"Ɋ/ D۽}lG%|5ۏ݆Jٞz#;X66gQuV}J` 8Aط{w9䜵yq7%+e!Z3|7_۰:3쩀생lOQԔ[#'FJ?a&~\~j[+(ge 7a߲GeIk%n#ͫQ 2c(laK,m.d޽&]46~hM ql6xrqƱN SiEj>v*M G؝&Ze'i%LQv|pDO#<;Q}OƟԔP2–^2сY|܅7YfEL!>\%{gU7;p ~.cgnTue{*1eˎ?\N= dO3Av]G V i`!jnI'T';n n IIL ?3;9K+>؜-O N٪* {!F.)TŤME+_IݺT̑IAE"Lxig=&]%)GXO7PUetdm,nRNU7IJ8ëPhUVFjLj'*A`ۿ(>`PH\R`#2j ?~ޟT.2r_ŸG /T?|rw~QGۚ8ȶ{E8K+X} A/gYvAS SzF O$cmÔ`Ei@0/.LS(0Ȇ  Ⳗ8dڴlr/LL ~/֣N3MYصy)[+i|OY10 w:`H[ =YpR />`+OK-* ٍWoygΝ6&;ܺr% ^uޟw+k*Jvz@-\d;Vn-\77EX k4 X.Na?b)z#?61y{ aųytJ3Jwy~퍄aH@)D(m^}A3B%xB?bCU ?k#%'˒72Uol8"lu>ÊҶJHIݮpM6(PUAX *-.8v%Ї&;VUQ1)iMNS&\f<⑆,;E#j#6~ ;%߃7Q"q^6!6|vx VB {7JǐEo3E>[wT?OyG%bYCRNߟZN1S ~=b>ؠeV}Xw9٩ʂ״iʵ]vdc;79'#/)6>ohɟzq~oda'1eMMfJYogjGfofAw"$`f9.0+%MB| ЇŔ^кaBjV~jY'p3vnޟe3Ts|^ fV^{*YlDŽqsn;j`49׼ iC*:I?/-&04{'O_$Lt=:e#ce{*8%@gy?7vL Pb¨@'9X_(@Y@HY8Cn M_0:e_bea ֞<!#X")?t!)^Ucwþ}ǎ=S  >W]] %K+UT ȎcM);qOcbbj' %;I *GdF)/?h$_>;˜|Rp-K<%6!>JjyKQ rFIgGdP$z|p#GgUa< y!Ҋg=w ?数0?ƚXgLf|/a^= ]Ug[8 !Y _}ɻxc2ᗥa'3_7nPʑW*KaLSЃpd}1G8f_.;:M|d tc'm||[TTƀ%7~k W5ߓ K =_;:$"dV0V&p0_aǎv)c]0KGk!%e8;?Ljb%O*#:7/1M0[<X`g*?>h`gc^|dß?"lɟG*Bd4Rnk̐ He65j *  oM>#>~`bl[6l9+Ǐ01#0Ȇ>Ȏs-dg{1aWocՆ>'bq C C,ev7~T %3֥e?!/<|xW4ޖl[yL)h;J(獔yjcerC _%?_ğ14(q0{d_8O|?;+BTajkɼ??l U)(=}bJv@ġ;8V~J212)+.iO(O- (؋g>lj{j$(8Ƒ_?JMߖgLYUi,dwJF&{RJ*vO)Ľ_oK}C_fAm+l Z B[opi(Їȯ& -Y< yd IĤ8V2& Ә1Q+r7e/ݣ@dXUi a wl.IB˲fL;}xO2Jۜ# >r'l0!4َ)`N&^a4\u\ˍ ;ϖq-DaT$)XaJX `IR>v);Ցr78 v1T " T0b٣AΔ .^U42tE f=ZdRp tG,_h B?/ӧ穼o ai*LVFY@΄̰ N9U^7Wnfw= Ѕ*zfګ6t Z*e.mXL (! "  ̿|kE[,Y̲$ɠ¯fHGiy6q.nq=*iǰ  r"?+hck;#_؁%<kKa ov] ̀\D);+Z~;{!N'lyI ! *Xn_ U e@+#D`Ȥ,Q/3n=D+-#DdO('ڿ_T_ %KL|uA旽:+sKg)첗*1x /2_t0M`'+~E\QG Yrdޫίńp/ʏ?%wʅ{JWZd&$$/Kxs6yKMABzGAƟa!~3$ iHWD{/8sGU/rHAhod3)?)@ d,-xwE)5R ) ?7d3) ?|Exfg\GF T_|d~)#@ ) `R |P@9ʛ8r}҅)@ /K.>C)R?RRYZ!&I HR K eiJI!U1ژ>pK )@ @Z_n6N{Ũ?͘ *W7v )@ x!8-~6Yq %E $U )d|sڳW~K۳8?yVrFZLHv4arWu/LZ(BHʢ]艖4i?c+q%_k?1"y &_~2qp&3hFJY){ļ1_͎P-)8kG gڄ6)""y{d'15y B#2@'C;|KMnʜ@,l<G9d_y@`4K-D!td9=j<e?Qfhh(ʽ.3[o(PDPV{_ @6dzLy@8gg?_E<S@%2IO B'+je`ғQ2|d"bJ 58D dyc4#o BE}  ( ˈkagAß~aN ;o!`(˼4SBV)/B96gaRß +?;N`Ȉ҅Ohgds8;XL@ddQelr ?巂a&E=Um;>*x>5&HU$Iٶ3bE(Ulʋ<_ ӞC7xy0N"Rn$ ině$0WH_y r6:,b!b繧8t7i;8*zgB;ѩol{:wޞ kHV?7W⩲+\SqZVAqH*, u0+OMLY-k٤o @ JO0+Arʄ? ( B"Y')S): ߨ2/)=R.rD aTG{}@*m5N@ ? x2%/yO()@Og_klvx]0>)@ xWMԾg}0?OJh'()@ Y )A~6R '(Î ;nkE`K #H4pͬW|iYRLٱ8.UiJ@  hSvZ5x5ޟ-/.YH @̤M=;^,JaŸڵu?+  BRpWS\h}cAvH.XUSN)_}a$H*@HR Kp'ݘ`̾l]`t:@ HP*+_qӉn]= m7f 雧M?yz4K34/74 (_eO2}Ҫ\IdwOտjFWӞe4 $$% NHsIW }H$yI.Of^ܥ><~_)@_5~><@ @V)0HRB?2%/BIENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/slot-signal-mini-tutorial/slot-signal-fig4.png0000644000000000000000000005130614556556456022417 0ustar00PNG  IHDRQhSP]sRGBgAMA a cHRMz&u0`:pQ<RDIDATx^ ՙ 3Of&a'F11ˈYLFd,>NtBfD1?!1F@dm^ކ>Mq8Tݺuk?yuO=1yw??fXq45Q=v&jja;fأG4ȱRީ *0fR@8O=|·u PZ0› }ZZOZ?iF2RGƣ>3f̘G_}711Qpoć>q<:}ʯ4Y=]ibEW T 20DD pZXG;&IwN|e5wSG)>Dd߉m( İĎe ],b$2? H a&>8LI[;8whBI%z>8DixG)mkdl焇Pr"A( ~BhPX`褻31wjwi{s}sG-_v^vShkKJk:׾qxAǒ?K6N @(C:ҝ-cleHJ74n4X[ه(U]E\===ڇ2yļF Ҍt,t:ehEhnAP +@HÛcT;6K rD8JtoƮD#QE#̣tŌyl͓_dP8xgv[hRc3#A(}]=C5E!ZVû[uƝZ#U̫R-Ssz{ΡYgU|?\^LӁǘ:Q83vqi_?eO]1©;Έ0 `8.tQخrOw<n?4y~7?0+kмs.誫ϩk>` Jqp̕+^5qOm?[0iΒ1 3 hR0 `Ƈc;Ƽu5|7/<';G?x]݂kjyI:~ mR"CQG q 3YWƖYZ~mv}j/.7g~ 3XlܵU鞟=Woo\뎷job;?E1iGzPբߨC%m\]S}V]Q  (`}+-??Gq."^ 7W_}dy(hAZp'wbJZU1޷7Vܱt {/N3~smd[^m{;z~*( @($}]ӗ4_o3V{%Ψǁw'g}hΧKf˧qޗu}[Gc_~iU*Gp/[+&[[?7Bmyq_&xgWe:%i\?[Lr%@(*@ :^#5FK>rswǁ7cWz֙fr5\SFrѭ2op-3{n9gΟ?\WϚ<[g)~L.WЛ7RhBVKEG* c?e[b U-2|->(C:.d;!fTH̤Ta/ V/[}FwuM5^@e7g˭t%u߹mD?Zs?H,e|y,ԣ{Xn.՗G9'yOn;幭g}+xۃz̸]G9KOae?oXǰgg#s$mۧUN{6J~'=􋥴Q4ʡPȀmzۯ,Š.):swvfHR=+!h)x P [%x PGLP (h'$}ͯfy ߝtC7?pdثus?^7#u:3ʮJ:;|טG)Xxsq۞闔GV>y WQsK_1bf ` eX+)4>BP(@g8N)z;[cm{>xOiګ>W>ot]ܨ]Tc:GGu5듷wc{z?B(¨-~mZM_u^i5{q÷o ͷ}t/}{OMЙwan {o QǘG7/ώ;/yds~z97~vyW]̌~]]?y)WRc8z҂#l)iwSzlC:!U͓,">vq5vf̷lD7 i{2߁Av{3O(Qy^2)ggO>*ktɢfydd>B0(ݑF'*#EYz,JS%w_\ w}sn9yhMWuE>q({ļ/5o ;Y]MwQ?NYl{gI__7~ wVNXpxEx._wmaw?J=|M fgsl׏e\"M2Y鱪2ٞ`9'y%jX__^)D U#A)-~G˛UO˵ͨ}FmΫ܆?xMןN 5^W3Ɨ}e3PGoԙB=aHק3-:BiC .|jE ]5:yM#cɻTզVPo1BF (pGG|yS+9uxpCaz wv3kg^wuWL3'IQ{(yk'2a]p0Hz䈐3ƂWe̎ւ\WZچpcvShc^lHs:kk}KWwH#`Xee5|5(ea=(3h#>Bv^o=F)#"go1O9mZŻ &6>m +yىLh|̘P(PR=)3Ӂl-w޽x . < (yk/gQl %%[hVYP1bЁya뇱lp8a,IA_Zmb9l|pJ™q4QH煮/< S}h T]2^>;XpqgLޕng˛k>gr#2/nvƓܫ@ 1S87iީ '̨ͫ3b)ZvfsOP86Z Dy| ίи\1ءRx6ױW ̋}+7@>*n m_a)&5*J`BηGEU m+yP t yQXahB7߅0|%M0̃SKD }S |[ۣ*慶i`X<(:O? yBW`o yIM^6Z$(X,Kp d;ۜHPN.tyG $RKS*0Bi( *`pyFP[ K0&ASnxxȾ]2;\`} 8QccX}{`zG Eo߻fg+ֻlKOE 0OѸgGy<Lr{d2%"|0 Q`ۼExD;Jy)Bݛ,Q.=[4bca+*ƶG!Jrɾf3kY~;%+'Wmԫ4@0ZdUر_H.\W @<`o}U>z4 0S4gVg(ͺ BݺĘ7Dy"3fgs~*=@櫝=2<)z%kv6-.%ͦEX֐yA>W(fyꁑ1nZ/hGcz{^ZS7){5h&D 1 ŔuH(( L,Y9`}d+FFEz&#Mļu{ү]s荼H2/*?$e]Q>ы*HrC^Ƽ%ަv-MV؝^VZchy^4| |T Q T 0潲{)7 辕S$-mK=,hv(53/ދvT3ʆg}O叿T=XK(6K?{*[ϼGE ?(B92&Akf69%`p}0OPv1Hf ko?~Kح+uAyf?_iN3%ȏ?5,:egiE x{ Geh4xPyǿof=o W=y ڔvrS6d2 Ey3&$3Ƌů7#᷄S[K)K(+Jc%f8lX0/c\8/]?~y_OG1gx ?!U^Ɠ(,' NM8y7qa1A^8S\?H|`[Jb$V0/[NyeP+#]ͮ[ J`b8܈`^ &C`ȨQ"dP̋F;@H_{srn 2(dYWt: K<fv3|=ҦfIY?<^g&N׷] yfS?/8&k.v5`qhHːP~ yy&- aa 0ÒYz< d 9@<:JEeb#ky!;ʌcRv}1OЭcFc<֬Xf|ka̳c2sfkЫcӫ]w$UL0bK"qdS=@ S38ιʣ)D) mr0/rl&QB rjDǜ0^fA^N<~qp7;N0/; V0/M£@ROo2Fu6Y20&pN0'ʶC,B%&8SYf]ٷfd"<2)'Ge$"D%΂yf]S5,*BE8yd386:yk7<˘Fǯ[ZHX4 +7r|-6cGM(S|`p7{X̎J }V tpwʅYOD*\B]@3w {.OaݝQo DyF',{b>(慗yM( Dy>Lm (N]>i^e٧hEz, 6͌mF|f*E1<3 %Ȱ6 $yFkɄx Ā@3`IkO:xY1OFfM/KU*Y07@<]|!ђF Q7izU6[h؇bPw纤(0`^F DC1O aed"t0 @6>+,8^)y,ʍ`^$[0/m)ْ @^?~aaނ *,?Q5eT1oξy婭Ô6 [(:?6?ng|qe1u0Z]ѩͨЦ-Ҧ,Դ ;eQzad@/PeT ,̛4۴f xZ[V/x'IgYy ~8)5BGw:K  +(K@(,~WΛtf{&ɿ4-pO0=-QTgjB:0/u<(|fq^L:e& 8R (ُuYƼ5;w畧ST2nIҺԺ=ŕjm*vE6BXPN.4}U EE-eF(G ˬF|wS fS^/-ıK'0/fI.i_Zp8Ħ`M ]0{X"k٦PDeZ DB0/#@f!G @\ҒC<EPO<\Sů.0/~m @߫{5Lx `^;܏acʂy^2D57>0ݘ ,U7[t8 );@(5)_*|K<^zp{bҖp3<ϤEP_|`;Ǭf@~ڢcye)z&Z6LiSƒ4uӫ RSkwvSNo3- c33F]eUc犌( ?3hg0_# ^zX, x<;P2d ]]0ڦ&n`p@4¨ ֗`!l`^A $yveBd+%}Hbbp%DGP Vm)M+Km)K4q$+IQ^?r;=xs(`3{eՙ}+Dor26,څbV-o (xt R(^3/cdiYfni䱠Qf[["|k]/oH _4u+Ds ڹf{F]]{k(_O mbmBM;pSOW)?C@2p0,Mk؉,<1"N;=+ Kpx),f|>2Fʽ;Aٺ+!慿`!`l` W¶]ªY-bpeX_r053/V"K y. b@ xͼ~9Hn`z/ ̳rBP+Q<^U}GTw.Lޱw8<,$VݔJ0 QgqEi>XN |B|~+T6`fM)G&0xZrs8 xjv2D&”`ۼExD;Jy)Bݛ,Q.=[Yu]?i}rQcm10 ۠@#hn:Ojo^t(Z0-޼G҃W[,=H5ٗ煶/0AGcX^t(Z1"G|7`?ּ/b0(+`y3+ c:C 1f3o``H6m=_!z0/} 9',0y|`FBp̼ؖ7os* hiiܗ`[$'D~F;<0+X!6ӈ<Ύ*0/} EykV1Czz:X6=,FwMxƘy6 ̋Y;p̼ÔY"-WlA!< yxN%♱-a;:Z[[k*L$a- ~g C 6 :;[Y趼}UowtTyvTadv@m#hp<-K³ Nol(nji慶#0Y1MAf3oN$z¬'lWM[MYi'NwI*3꘱t{,Ȑ@3]imUѤoߡ=ļ6\DNiWtj3=cЁ@-CFyQɱj_YmGCT( x{~ONH+0-!^{mw{~誇~+ʊxJ6nZz<i}x(0HDflf _ikw}S xyJU};zu g'm"*5N`^GNZA)ٙ 8P |qHb֠p'< y``^xHX3w1apǁ`pA)ٙ 8P &e l!P ޽^V)tg' Qt_9GF=vڢmg7FQ Rd vZF $7F28uAyvzꜟIvB(^+3oF6m6e^uu%K55j[[nǵ S:{\X[LIV&+7B;m6<@(("}b Gȯ>2c{w +qWz2sb&U~D޵5OA *觼cox}~3N(tы3ו+KRIuȻmeiJ1s<2sH为g5{w퇔q}5@oOWG{`^rGw( DEƼ+ b{WNY3o`?6.3Gz0lP 0-E;6Wh.}"IrhP $cɶξ>^LRoomn?ugkcZxHVmu ?(gV4>FcggGX3ʧ=m h}vE#%k/J9VʯL=JgMά"[[k<ܷ `qޯ7jy=I-̩L#xM-5p Py?tnn?[\M/Y3kc,oiaC(ŒZJͱI\(~WaF|!Ǜj0Owp&C(SKj)ѥ֖'r9EuW1<1szߡ=fy8P 5uc L]wgf߳ H"OFzQV6d[H2s0CP @(w?s1IENDB`././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/docs/slot-signal-mini-tutorial/slot-signal-mini-tutorial.txt0000644000000000000000000000672514556556456024423 0ustar00Mini-tutorial on slots and signals ********************************** This mini-tutorial from Mark Hammond explains how to use QtDesigner for editing signals-slots connections. On Figure 1 we have a screen-shot of one of our dialogs in QtDesigner in "Edit Widgets" (ie, normal) mode, with a signal/slot editor to the right. This little editor is generally in the tabbed window to the right of the screen, right near the Property Editor. Select "Tools->Signal/Slot Editor" to ensure it is visible. .. figure:: slot-signal-fig1.png Figure 1 Let's go through this list: * The first 2 elements in the list have a "Sender" as our 2 QLabel objects with the hyperlinks, and these objects are sending a linkActivated signal (which is builtin to QLabel objects). The receiver of the signal is the form itself (InitForm), and it receives the signal into a slot also called 'linkActivated' - linkActivated is *not* builtin to dialogs, but I've previously told QtDesigner that this form has such a slot - it could have used any name. As a result, we have linkActivated signals being 'forwarded' to our dialog. * The next 2 items in the list are showing the form itself as the sender of a signal called 'subprocessStarted(bool)' and the receiver of the events are groupboxes - but the slot is 'setDisabled'. Thus, whenever the form sends a signal of 'subprocessStarted(True)', the groupbox 'setDisabled(True)' will be called (and vice-versa). I've previously told QtDesigner that our form may send such a signal, and subprocess.py is where the actual emit() of the signal happens. As a result, we have the 2 groupboxes being automatically disabled when the subprocess starts and renabled if things fail. * The next item in the list if a signal from the 'but_init' widget, which is the 'Create a new standalone tree' radio button. The toggled(bool) signal is attached to the checkbox directly under it via the setEnabled(bool) slot. Thus, when the radio button is selected, it will send a toggled(True) signal, which will end up calling the checkbox's setEnabled(True) function. Thus, that checkbox depends on the state of the radio above it. * The final item in the list is the second radio button connected to the second checkbox, as described above. Now - we will switch QtDesigner into "Edit Signals/Slots" mode - select that mode from the Edit menu or press F4. Suddenly we will see lots of colors, see figure 2 below. .. figure:: slot-signal-fig2.png Figure 2 Note how Qt is trying to show all these signal slot relationships. Note that when a slot/signal is selected on the right, the connection is shown in pink on the form itself. It looks noisy, but it starts to make sense after a short time. By way of example, let's say I wanted to add a new label to the form with a new help link. See below figure 3 - I've added a new 'TextLabel' at the bottom of the form and selected it. .. figure:: slot-signal-fig3.png Figure 3 Now, I drag a line from that new widget to the dialog itself. A Qt dialog pops up asking me what connection I want to make between the objects. In this case, I want to connect the linkActivated signal from the label with the linkActivated slot on our dialog - see figure 4: .. figure:: slot-signal-fig4.png Figure 4 If you select OK, the Signal/Slot editor panel we started with will now show this new connection. ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/extras/__init__.py0000644000000000000000000000250214556556456014260 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2007, 2008 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 .build_docs import build_docs from .build_mo import build_mo from .build_pot import build_pot from .build_ui import build_ui from .check_py24 import check_py24 from .check_utf8 import check_utf8 from .import_po import import_po cmdclass = { 'build_docs': build_docs, 'build_mo': build_mo, 'build_pot': build_pot, 'build_ui': build_ui, 'check_py24': check_py24, 'check_utf8': check_utf8, 'import_po': import_po, } ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/extras/build_docs.py0000644000000000000000000000577414556556456014646 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2008 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. """build_docs command for setup.py""" from distutils.core import Command from distutils.dep_util import newer from distutils import log import os import sys class build_docs(Command): description = 'translate txt files from docs/ to html with docutils' # List of options: # - long name, # - short name (None if no short name), # - help string. user_options = [('output-dir=', 'o', 'Directory for output html files'), ('force', 'f', 'Force creation of html files'), ('clean', None, 'Clean html files'), ] boolean_options = ['force', 'clean'] def initialize_options(self): self.output_dir = None self.force = None self.clean = None def finalize_options(self): pass def iter_txt_files(self, from_dir, out_dir=None): """For each txt file yields 2 paths: source txt and target html.""" if out_dir is None: out_dir = from_dir if not from_dir.endswith(os.sep): from_dir = from_dir + os.sep n = len(from_dir) for root, dirs, files in os.walk(from_dir): for f in files: if f.endswith('.txt'): source = os.path.join(root, f) relpath = source[n:] target = os.path.join(out_dir, relpath[:-3]+'html') yield source, target def do_clean(self): """Clean all generated html files""" for source, target in self.iter_txt_files('docs', self.output_dir): if os.path.isfile(target): log.info('removing ' + target) os.remove(target) def run(self): """Run rst2html for each txt file""" if self.clean: self.do_clean() return rst2html = ['rst2html.py'] if sys.platform == 'win32': rst2html = ['python', os.path.join(sys.prefix, 'Scripts', 'rst2html.py')] for source, target in self.iter_txt_files('docs', self.output_dir): if self.force or newer(source, target): log.info('translating ' + source) self.spawn(rst2html + [source, target]) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/extras/build_mo.py0000644000000000000000000001056014556556456014316 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2007,2009 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. # RJLRJL: breezy converted """build_mo command for setup.py""" from distutils import log from distutils.command.build import build from distutils.core import Command from distutils.dep_util import newer from distutils.spawn import find_executable import os import re from .en_po import regenerate_en class build_mo(Command): """Subcommand of build command: build_mo""" description = 'compile po files to mo files' # List of options: # - long name, # - short name (None if no short name), # - help string. user_options = [('build-dir=', 'd', 'Directory to build locale files'), ('output-base=', 'o', 'mo-files base name'), ('source-dir=', None, 'Directory with sources po files'), ('force', 'f', 'Force creation of mo files'), ('lang=', None, 'Comma-separated list of languages to process'), ] boolean_options = ['force'] def initialize_options(self): self.build_dir = None self.output_base = None self.source_dir = None self.force = None self.lang = None def finalize_options(self): self.set_undefined_options('build', ('force', 'force')) self.prj_name = self.distribution.get_name() if self.build_dir is None: self.build_dir = 'locale' if not self.output_base: self.output_base = self.prj_name or 'messages' if self.source_dir is None: self.source_dir = 'po' if self.lang is None: if self.prj_name: re_po = re.compile(r'^(?:%s-)?([a-zA-Z_]+)\.po$' % self.prj_name) else: re_po = re.compile(r'^([a-zA-Z_]+)\.po$') self.lang = [] for i in os.listdir(self.source_dir): mo = re_po.match(i) if mo: self.lang.append(mo.group(1)) else: self.lang = [i.strip() for i in self.lang.split(',') if i.strip()] def run(self): """Run msgfmt for each language""" if not self.lang: return if find_executable('msgfmt') is None: log.warn("GNU gettext msgfmt utility not found!") log.warn("Skip compiling po files.") return # RJLRJL: TODO: by-passed for now: we don't want to shred what we have # if 'en' in self.lang: # if find_executable('msginit') is None: # log.warn("GNU gettext msginit utility not found!") # log.warn("Skip creating English PO file.") # else: # log.info('Creating English PO file...') # pot = (self.prj_name or 'messages') + '.pot' # regenerate_en(self.prj_name, self.source_dir, pot, self.spawn) basename = self.output_base if not basename.endswith('.mo'): basename += '.mo' po_prefix = '' if self.prj_name: po_prefix = self.prj_name + '-' for lang in self.lang: po = os.path.join('po', lang + '.po') if not os.path.isfile(po): po = os.path.join('po', po_prefix + lang + '.po') dir_ = os.path.join(self.build_dir, lang, 'LC_MESSAGES') self.mkpath(dir_) mo = os.path.join(dir_, basename) if self.force or newer(po, mo): log.info('Compile: %s -> %s' % (po, mo)) self.spawn(['msgfmt', '-o', mo, po]) build.sub_commands.insert(0, ('build_mo', None)) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/extras/build_pot.py0000644000000000000000000001153014556556456014503 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2007,2009 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. """build_pot command for setup.py""" import glob from distutils import log from distutils.core import Command from distutils.errors import DistutilsOptionError from .en_po import regenerate_en class build_pot(Command): """Distutils command build_pot""" description = 'extract strings from python sources for translation' # List of options: # - long name, # - short name (None if no short name), # - help string. user_options = [('build-dir=', 'd', 'Directory to put POT file'), ('output=', 'o', 'POT filename'), ('lang=', None, 'Comma-separated list of languages to update po-files'), ('no-lang', 'N', "Don't update po-files"), ('english', 'E', 'Regenerate English PO file'), ] boolean_options = ['no-lang', 'english'] def initialize_options(self): self.build_dir = None self.output = None self.lang = None self.no_lang = False self.english = False def finalize_options(self): if self.build_dir is None: self.build_dir = 'po' if not self.output: self.output = (self.distribution.get_name() or 'messages')+ '.pot' if self.lang is not None: self.lang = [i.strip() for i in self.lang.split(',') if i.strip()] if self.lang and self.no_lang: raise DistutilsOptionError("You can't use options --lang=XXX and --no-lang in the same time.") def _force_LF(self, src, dst=None): with open(src, 'rU') as f: content = f.read() if dst is None: dst = src with open(dst, 'wb') as f: f.write(content) def run(self): """Run xgettext for project sources""" import glob import os # project name based on `name` argument in setup() call prj_name = self.distribution.get_name() # output file if self.build_dir != '.': fullname = os.path.join(self.build_dir, self.output) else: fullname = self.output log.info('Generate POT file: ' + fullname) if not os.path.isdir(self.build_dir): log.info('Make directory: ' + self.build_dir) os.makedirs(self.build_dir) # RJLRJL: TODO: bypassed for now, to not shred what we have # self.spawn(['xgettext', # '--keyword=N_', # '-p', self.build_dir, # '-o', self.output, # '__init__.py', # ] + glob.glob('lib/*.py') + glob.glob('lib/widgets/*.py') # ) # self._force_LF(fullname) # regenerate english PO print('self.english is ', self.english, 'project is ', prj_name) if self.english: log.info('Regenerating English PO file...') log.info(' project: {0}, build_dir {1}, output {2}'.format(prj_name, self.build_dir, self.output)) print('Regenerating English PO file...') print(' project: {0}, build_dir {1}, output {2}'.format(prj_name, self.build_dir, self.output)) regenerate_en(prj_name, self.build_dir, self.output, self.spawn) # search and update all po-files if self.no_lang: print('No language: stopping') return for po in glob.glob(os.path.join(self.build_dir,'*.po')): print('\tworking on ', po) if self.lang is not None: po_lang = os.path.splitext(os.path.basename(po))[0] if prj_name and po_lang.startswith(prj_name + '-'): po_lang = po_lang[5:] if po_lang not in self.lang: continue new_po = po + ".new" cmd = "msgmerge %s %s -o %s" % (po, fullname, new_po) self.spawn(cmd.split()) # force LF line-endings log.info("%s --> %s" % (new_po, po)) self._force_LF(new_po, po) os.unlink(new_po) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/extras/build_ui.py0000644000000000000000000000524614556556456014325 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2009 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 distutils import log from PyQt5.QtWidgets import * from distutils.core import Command from distutils.dep_util import newer from io import StringIO import glob import os import re _translate_re = re.compile(r'QtGui\.QCoreApplication.translate\(.*?, (.*?), None, QtGui\.QApplication\)') _import_re = re.compile(r'(from PyQt5 import QtCore, QtGui)') class build_ui(Command): description = "build Qt UI files" user_options = [ ('force', 'f', 'Force creation of ui files'), ('module=', 'm', 'Specify UI module to (re)build'), ] boolean_options = ['force'] def initialize_options(self): self.force = None self.module = None def finalize_options(self): if not self.module: self.module = glob.glob("ui/*.ui") else: self.module = ['ui/%s.ui' % self.module] def run(self): from PyQt5 import uic # project name based on `name` argument in setup() call prj_name = self.distribution.get_name() or '?' for uifile in self.module: uifile = uifile.replace('\\', '/') pyfile = "lib/ui_%s.py" % os.path.splitext(os.path.basename(uifile))[0] if self.force or newer(uifile, pyfile): log.info("compiling %s -> %s", uifile, pyfile) tmp = StringIO() uic.compileUi(uifile, tmp) source = _translate_re.sub(r'gettext(\1)', tmp.getvalue()) source = source.replace("from PyQt5 import QtCore, QtGui, QtWidgets", "from PyQt5 import QtCore, QtGui, QtWidgets\n" "from breezy.plugins.%s.lib.i18n import gettext\n" % prj_name) # f = open(pyfile, "wb") f = open(pyfile, "w") f.write(source) f.close() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/extras/check_py24.py0000644000000000000000000000517714556556456014467 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2007 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. """check_py24 command for setup.py. It checks syntax of Python modules by compiling them with Python 2.4. """ from distutils.core import Command from distutils.errors import DistutilsPlatformError from distutils import log import os import sys import traceback class check_py24(Command): description = ("check syntax of python modules " "by compiling them with Python 2.4") user_options = [] def initialize_options(self): pass def finalize_options(self): if sys.version_info[:2] != (2, 4): raise DistutilsPlatformError( 'check_py24 command require Python 2.4') def run(self): for root, dirs, files in os.walk('.'): for fname in sorted(files): if fname.endswith('.py'): fullname = os.path.join(root, fname)[2:] # first 2 characters is ./ # verbose: 0=quiet, 1=normal, 2=verbose if self.verbose: log.info('checking ' + fullname) if not self.dry_run: f = open(fullname, 'rU') # rU automatically converts CRLF to LF content = f.read() f.close() try: compile(content, fullname, 'exec') except SyntaxError as e: log.error(str(e)) if self.verbose: traceback.print_exc(0) # skip some directories for dname in dirs[:]: fullname = os.path.join(root, dname).replace('\\','/') if fullname in ('./_lib', './build', './dist', './installer'): dirs.remove(dname) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/extras/check_utf8.py0000644000000000000000000000450014556556456014544 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2009 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. """check_utf8 command for setup.py. It checks contents of source files to be UTF-8 encoded. """ from distutils.core import Command from distutils.errors import DistutilsPlatformError from distutils import log import os import sys class check_utf8(Command): description = ("check contents of source files to be UTF-8 encoded") user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): for root, dirs, files in os.walk('.'): for fname in sorted(files): ext = os.path.splitext(fname)[1].lower() if ext in ('.py', '.txt', '.ui'): fullname = os.path.join(root, fname)[2:] # first 2 characters is ./ # verbose: 0=quiet, 1=normal, 2=verbose if self.verbose: log.info('checking ' + fullname) if not self.dry_run: f = open(fullname, 'rb') content = f.read() f.close() try: content.decode('utf-8') except UnicodeDecodeError as e: log.error(fullname + ': ' + str(e)) # skip some directories for dname in dirs[:]: fullname = os.path.join(root, dname).replace('\\','/') if fullname in ('./_lib', './build', './dist', './installer'): dirs.remove(dname) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/extras/en_po.py0000644000000000000000000000256414556556456013631 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy 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() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/extras/import_po.py0000644000000000000000000000650514556556456014540 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2009 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. """import PO-files from launchpad-export.tar.gz (extra command for setup.py)""" from distutils import log 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.""" description = 'import PO-files from launchpad-export.tar.gz' # List of options: # - long name, # - short name (None if no short name), # - help string. user_options = [('tarball=', 'F', 'path to launchpad-export.tar.gz file'), ('output-dir=', 'O', 'output directory (default: po)'), ] boolean_options = [] def initialize_options(self): self.tarball = None self.output_dir = None def finalize_options(self): if self.tarball is None: self.tarball = 'launchpad-export.tar.gz' if self.output_dir is None: self.output_dir = 'po' def run(self): """Unpack tarball with PO-files.""" import os import tarfile log.info('Inspecting tarball...') t = tarfile.open(self.tarball) names = t.getnames() # filter names # names could have '$PROJECT/' or '/' prefix, # also there is some strange entries as './' (wtf lp?) # see https://bugs.launchpad.net/rosetta/+bug/148271 entries = [] # 2-tuple (archive name, output file name) pot_file = None for n in names: if n == './': continue parts = os.path.split(n) fn = parts[-1] if not fn: continue if t.getmember(n).isfile(): entries.append((n, os.path.join(self.output_dir, fn))) if fn.endswith('.pot'): assert pot_file is None, "There is 2 POT files in archive!" pot_file = fn log.info('Extracting...') for n, fn in entries: log.info(' %s -> %s' % (n, fn)) ft = t.extractfile(n) with open(fn, 'wb') as fd: fd.write(ft.read()) if pot_file: if find_executable('msginit') is None: log.warn("GNU gettext msginit utility not found!") log.warn("Skip creating English PO file.") else: log.info('Re-creating English PO file...') prj_name = os.path.splitext(pot_file)[0] regenerate_en(prj_name, self.output_dir, pot_file, self.spawn) log.info('Done.') ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/installer/qbrz-setup.iss0000644000000000000000000001223014556556456015471 0ustar00; Script initially generated by the Inno Setup Script Wizard ; and then modified by Alexander Belchenko. [Setup] ; NOTE: The value of AppId uniquely identifies this application. ; Do not use the same AppId value in installers for other applications. ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId=QBrz AppName= QBrz AppVerName= QBrz {#Version} OutputBaseFilename=qbrz-setup-{#Version} ; AppVerName= QBrz 0.3.1 ; OutputBaseFilename=qbrz-setup-0.3.1 SourceDir="..\" OutputDir="." OutputManifestFile=qbrz-setup-iss.log AppPublisher=QBrz Developers AppPublisherURL=http://launchpad.net/qbzr AppSupportURL=http://groups.google.com/group/qbzr AppUpdatesURL=http://launchpad.net/qbzr/+download DefaultDirName={code:GetDirName} DisableProgramGroupPage=yes Compression=lzma SolidCompression=yes [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" Name: "basque"; MessagesFile: "compiler:Languages\Basque.isl" Name: "brazilianportuguese"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl" Name: "catalan"; MessagesFile: "compiler:Languages\Catalan.isl" Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl" Name: "danish"; MessagesFile: "compiler:Languages\Danish.isl" Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl" Name: "finnish"; MessagesFile: "compiler:Languages\Finnish.isl" Name: "french"; MessagesFile: "compiler:Languages\French.isl" Name: "german"; MessagesFile: "compiler:Languages\German.isl" Name: "hebrew"; MessagesFile: "compiler:Languages\Hebrew.isl" Name: "hungarian"; MessagesFile: "compiler:Languages\Hungarian.isl" Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl" Name: "norwegian"; MessagesFile: "compiler:Languages\Norwegian.isl" Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl" Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl" Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl" Name: "slovak"; MessagesFile: "compiler:Languages\Slovak.isl" Name: "slovenian"; MessagesFile: "compiler:Languages\Slovenian.isl" Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl" [Files] Source: "__init__.py"; DestDir: {app}; Source: "lib\*.py"; DestDir: {app}\lib; Flags: recursesubdirs; Source: "*.txt"; DestDir: {app}; Source: "locale\*.*"; DestDir: {app}\locale; Flags: recursesubdirs; [UninstallDelete] ; TODO: create special uninstall function in Code section to recursively delete pyc/pyo files ; using FindFile API Type: files; Name: {app}\*.pyc Type: files; Name: {app}\lib\*.pyc Type: files; Name: {app}\lib\extra\*.pyc Type: files; Name: {app}\lib\tests\*.pyc Type: files; Name: {app}\lib\widgets\*.pyc Type: files; Name: {app}\*.pyo Type: files; Name: {app}\lib\*.pyo Type: files; Name: {app}\lib\extra\*.pyo Type: files; Name: {app}\lib\tests\*.pyo Type: files; Name: {app}\lib\widgets\*.pyo [Registry] Root: HKLM; Subkey: "Software\QBrz"; Flags: uninsdeletekey Root: HKLM; Subkey: "Software\QBrz"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}" [Code] {Function detects system-wide installation of brz: either brz.exe or python-based} function GetBrzPath(): String; var BrzPath: String; PythonVersions: TArrayOfString; Ix: Integer; PythonKey: String; PythonPath: String; BrzlibPath: String; Path: String; begin {Check brz.exe presence} if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\Breezy', 'InstallPath', BrzPath) then begin Result := BrzPath; end else begin BrzlibPath := ''; {Get list of all installed python versions} if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, 'Software\Python\PythonCore', PythonVersions) then begin {Iterate over installed pythons and check if there is installed bzrlib} for Ix := 0 to GetArrayLength(PythonVersions)-1 do begin PythonKey := 'Software\Python\PythonCore\' + PythonVersions[Ix] + '\InstallPath' if RegQueryStringValue(HKEY_LOCAL_MACHINE, PythonKey, '', PythonPath) then begin Path := AddBackslash(PythonPath) + 'Lib\site-packages\bzrlib' if DirExists(Path) then begin BrzlibPath := Path; break; end; end; end; end; Result := BrzlibPath; end; end; {Function determines best possible PATH to install QBrz. At first it tries to find system-wide installation (either brz.exe or python-based) then checks BRZ_PLUGIN_PATH, if all above fails then it suggests install to %APPDATA%\Breezy\2.0 } function GetDirName(Param: String): String; var Path: String; BrzPath: String; EnvBrzPluginPath: String; Ix: Integer; begin Path := ExpandConstant('{userappdata}\Breezy\2.0\plugins\qbzr'); BrzPath := GetBrzPath(); if BrzPath <> '' then begin Path := AddBackslash(BrzPath) + 'plugins\qbzr'; end else begin EnvBrzPluginPath := GetEnv('BRZ_PLUGIN_PATH') Ix := Pos(';', EnvBrzPluginPath) if Ix > 0 then EnvBrzPluginPath := Copy(EnvBrzPluginPath, 1, Ix-1) if EnvBrzPluginPath <> '' then Path := AddBackslash(EnvBrzPluginPath) + 'qbzr'; end; Result := Path; end; ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/__init__.py0000644000000000000000000000363214556556456013525 0ustar00# # -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2006-2008 Lukáš Lalinský # Copyright (C) 2008, 2009 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. import os, sys if sys.version_info < (3,4,0): sys.stderr.write("You need python 3.4.0 or later to run this script\n") exit(1) # Special constant MS_WINDOWS = (sys.platform == 'win32') # Features dictionary: # keys are feature names, values are optional parameters for those features. # the meaning of parameters depend on the feature, so it's more like config. # The keys names can use namespaces in the form 'domain.option'. # # Intended usage of this dict by the external code: # # if feature_name in FEATURES: then_do_something(); else: backward_compatible_code() # # or # # feature_value = FEATURES.get(feature_name); if feature_value == XXX: then_do_something() # # NOTE: No external code should add the keys or change the values to this dict!!! # FEATURES = dict( # feature_name=None, # for features without extra parameters # feature_name='1.2.3', # to specify optional version or parameter # feature_name=[some list], # to specify the list of parameters # etc. qignore=None, # we have qignore ) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/add.py0000644000000000000000000001611014556556456012511 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # # Contributors: # Mark Hammond # # 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 PyQt5 import QtCore, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.subprocess import SubProcessDialog from breezy.plugins.qbrz.lib.treewidget import (TreeWidget, SelectAllCheckBox, ChangeDescription, FilterModelKeys) from breezy.plugins.qbrz.lib.util import ThrobberWidget from breezy.plugins.qbrz.lib.uifactory import ui_current_widget from breezy.plugins.qbrz.lib.trace import reports_exception def versioned_pattern_handler(change_description: ChangeDescription): # As we are adding, we don't need to see any files that are versioned return not change_description.is_versioned() def item_wanted(item): # Replaces the old lambda for clarity not_versioned_not_ignored = item.change is not None and item.change.ignored_pattern() is None and not item.change.is_versioned() lookat_children = item.change is not None and item.change.ignored_pattern() is None or item.change is None return not_versioned_not_ignored, lookat_children class AddWindow(SubProcessDialog): # BUGBUG: the window still does not update when check-boxes are ticked (clicking on the window itself does so) # Not showing 'ignored' files doesn't work either def __init__(self, tree, selected_list, dialog=True, ui_mode=True, parent=None, local=None, message=None): self.tree = tree self.initial_selected_list = selected_list super().__init__(gettext("Add"), name="add", default_size=(400, 400), ui_mode=ui_mode, dialog=dialog, parent=parent, hide_progress=True) self.throbber = ThrobberWidget(self) # Display the list of unversioned files groupbox = QtWidgets.QGroupBox(gettext("Unversioned Files"), self) vbox = QtWidgets.QVBoxLayout(groupbox) self.filelist_widget = TreeWidget(groupbox) self.filelist_widget.throbber = self.throbber self.filelist_widget.tree_model.is_item_in_select_all = item_wanted self.filelist_widget.filter_context_menu = self.filter_context_menu vbox.addWidget(self.filelist_widget) self.selectall_checkbox = SelectAllCheckBox(self.filelist_widget, groupbox) vbox.addWidget(self.selectall_checkbox) self.selectall_checkbox.setCheckState(QtCore.Qt.Checked) self.selectall_checkbox.setEnabled(True) # self.selectall_checkbox.toggled[bool].connect(self.select_all) self.show_ignored_checkbox = QtWidgets.QCheckBox(gettext("Show ignored files"), groupbox) vbox.addWidget(self.show_ignored_checkbox) self.show_ignored_checkbox.toggled[bool].connect(self.show_ignored) # groupbox gets disabled as we are executing. self.disableUi[bool].connect(groupbox.setDisabled) self.splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical) self.splitter.addWidget(groupbox) self.splitter.addWidget(self.make_default_status_box()) self.splitter.setStretchFactor(0, 10) self.restoreSplitterSizes([150, 150]) layout = QtWidgets.QVBoxLayout(self) layout.addWidget(self.throbber) layout.addWidget(self.splitter) layout.addWidget(self.buttonbox) self.throbber.show() self.processEvents() def filter_context_menu(self): items = self.filelist_widget.get_selection_items() selection_len = len(items) single_file = (selection_len == 1 and items[0].item.kind == "file") # BUGBUG: magic constants in here single_item_in_tree = (selection_len == 1 and (items[0].change is None or items[0].change[6][1] is not None)) self.filelist_widget.action_open_file.setEnabled(True) self.filelist_widget.action_open_file.setVisible(True) self.filelist_widget.action_show_file.setEnabled(single_file) self.filelist_widget.action_show_file.setVisible(True) self.filelist_widget.action_show_annotate.setVisible(False) self.filelist_widget.action_show_log.setVisible(False) self.filelist_widget.action_show_diff.setVisible(False) self.filelist_widget.action_add.setVisible(False) self.filelist_widget.action_revert.setVisible(False) self.filelist_widget.action_merge.setVisible(False) self.filelist_widget.action_resolve.setVisible(False) self.filelist_widget.action_rename.setVisible(True) self.filelist_widget.action_rename.setEnabled(single_item_in_tree) self.filelist_widget.action_remove.setVisible(False) self.filelist_widget.action_mark_move.setVisible(False) def show(self): # SubProcessDialog.show(self) super().show() # QtCore.QTimer.singleShot(1, self.initial_load) self.initial_load() # @runs_in_loading_queue @ui_current_widget @reports_exception() def initial_load(self): self.filelist_widget.tree_model.checkable = True self.filelist_widget.tree_filter_model.setFilter(FilterModelKeys.CHANGED, False) self.filelist_widget.tree_filter_model.setFilter(FilterModelKeys.UNCHANGED, False) self.filelist_widget.tree_filter_model.setFilter(FilterModelKeys.IGNORED, False) self.filelist_widget.set_tree(self.tree, changes_mode=True, want_unversioned=True, initial_checked_paths=self.initial_selected_list, change_load_filter=versioned_pattern_handler) self.throbber.hide() def _get_files_to_add(self): # OK pressed return [ref.path for ref in self.filelist_widget.tree_model.iter_checked()] def validate(self): if not self._get_files_to_add(): self.operation_blocked(gettext("Nothing selected to add")) return False return True def do_start(self): """Add the files.""" files = self._get_files_to_add() self.process_widget.do_start(self.tree.basedir, "add", "--no-recurse", *files) def show_ignored(self, state): """Show/hide ignored files.""" self.filelist_widget.tree_filter_model.setFilter(FilterModelKeys.IGNORED, state) self.filelist_widget.tree_filter_model.invalidateFilter() def _saveSize(self, config): SubProcessDialog._saveSize(self, config) self._saveSplitterSizes(config, self.splitter) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/annotate.py0000644000000000000000000007647214556556456013613 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2006 Lukáš Lalinský # Copyright (C) 2005 Dan Loda # Copyright (C) 2009 Gary van der Merwe # # 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. # TODO: # - better annotate algorithm on packs import sys, time, hashlib from itertools import groupby from PyQt5 import QtCore, QtGui, QtWidgets from breezy.revision import CURRENT_REVISION from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.util import ( BTN_CLOSE, QBzrWindow, ToolBarThrobberWidget, get_apparent_author_name, get_icon, get_monospace_font, get_set_encoding, get_set_tab_width_chars, get_tab_width_pixels, runs_in_loading_queue, ) from breezy.plugins.qbrz.lib.widgets.toolbars import FindToolbar from breezy.plugins.qbrz.lib.widgets.texteditaccessory import ( GuideBarPanel, setup_guidebar_for_find ) from breezy.plugins.qbrz.lib.uifactory import ui_current_widget from breezy.plugins.qbrz.lib.trace import reports_exception from breezy.plugins.qbrz.lib.logwidget import LogList from breezy.plugins.qbrz.lib.lazycachedrevloader import (load_revisions, cached_revisions) from breezy.plugins.qbrz.lib.texteditannotate import (AnnotateBarBase, AnnotateEditerFrameBase) from breezy.lazy_import import lazy_import lazy_import(globals(), ''' from breezy.config import parse_username from breezy.workingtree import WorkingTree from breezy.revisiontree import RevisionTree from breezy.plugins.qbrz.lib.revisionmessagebrowser import LogListRevisionMessageBrowser from breezy.plugins.qbrz.lib.encoding_selector import EncodingMenuSelector from breezy.plugins.qbrz.lib.widgets.tab_width_selector import TabWidthMenuSelector from breezy.plugins.qbrz.lib.syntaxhighlighter import highlight_document from breezy.plugins.qbrz.lib.revtreeview import paint_revno, get_text_color from breezy.plugins.qbrz.lib import logmodel from breezy.plugins.qbrz.lib.loggraphviz import BranchInfo from patiencediff import PatienceSequenceMatcher as SequenceMatcher ''') class AnnotateBar(AnnotateBarBase): def __init__(self, edit, parent, get_revno): super(AnnotateBar, self).__init__(edit, parent) self.get_revno = get_revno self.annotate = None self.rev_colors = {} self._highlight_revids = set() self.highlight_lines = [] self.splitter = None self.adjustWidth(1, 999) edit.cursorPositionChanged.connect(self.edit_cursorPositionChanged) self.show_current_line = False def get_highlight_revids(self): return self._highlight_revids def set_highlight_revids(self, value): if self._highlight_revids == value: return self._highlight_revids = value self.update_highlight_lines() def update_highlight_lines(self): self.highlight_lines = [] if not self.annotate: return lines = [i for i, (revno, istop) in enumerate(self.annotate) if revno in self._highlight_revids] # Convert [0,1,2,5,6,9,14,15,16,17] to [(0,3),(5,2),(9,1),(14,4)] def summarize(lines): for k, g in groupby(enumerate(lines), key=lambda x:x[1]-x[0]): yield [line for i, line in g] self.highlight_lines = [(x[0], len(x)) for x in summarize(lines)] highlight_revids = property(get_highlight_revids, set_highlight_revids) def edit_cursorPositionChanged(self): self.show_current_line = True def adjustWidth(self, lines, max_revno): fm = self.fontMetrics() text_margin = self.style().pixelMetric(QtWidgets.QStyle.PM_FocusFrameHMargin, None, self) + 1 self.line_number_width = fm.width(str(lines)) self.line_number_width += (text_margin * 2) self.revno_width = fm.width(str(max_revno)+".8.88") self.max_mainline_digits = len(str(max_revno)) self.revno_width += (text_margin * 2) if self.splitter: if 0: self.splitter = QtWidgets.QSplitter width = (self.line_number_width + self.revno_width + fm.width("Joe I have a Long Name")) self.splitter.setSizes([width, 1000]) self.setMinimumWidth(self.line_number_width + self.revno_width) def paint_line(self, painter, rect, line_number, is_current): fm = self.fontMetrics() painter.save() if is_current and self.show_current_line: style = self.style() option = QtWidgets.QStyleOptionViewItem() option.initFrom(self) option.state = option.state | QtWidgets.QStyle.State_Selected option.rect = rect.toRect() painter.fillRect(rect, QtGui.QBrush(option.palette.highlight())) style.drawPrimitive(QtWidgets.QStyle.PE_PanelItemViewItem, option, painter, self) painter.setPen(get_text_color(option, style)) elif self.annotate and line_number-1 < len(self.annotate): revid, is_top = self.annotate[line_number - 1] if revid in self.rev_colors: painter.fillRect(rect, self.rev_colors[revid]) text_margin = self.style().pixelMetric(QtWidgets.QStyle.PM_FocusFrameHMargin, None, self) + 1 if 0: rect = QtCore.QRect line_number_rect = QtCore.QRect(*map(int, [ rect.left() + text_margin, rect.top(), self.line_number_width - (2 * text_margin), rect.height()])) painter.drawText(line_number_rect, QtCore.Qt.AlignRight, str(line_number)) if self.annotate and line_number-1 < len(self.annotate): revid, is_top = self.annotate[line_number - 1] if is_top: if revid in self._highlight_revids: font = painter.font() font.setBold(True) painter.setFont(font) revno_rect = QtCore.QRect(*map(int, [ rect.left() + self.line_number_width + text_margin, rect.top(), self.revno_width - (2 * text_margin), rect.height()])) paint_revno(painter, revno_rect, str(self.get_revno(revid)), self.max_mainline_digits) if revid in cached_revisions: rev = cached_revisions[revid] author_rect = QtCore.QRect(*map(int, [ rect.left() + self.line_number_width + self.revno_width + text_margin, rect.top(), rect.right() - revno_rect.right() - (2 * text_margin), rect.height()])) author = get_apparent_author_name(rev) if fm.width(author) > author_rect.width(): author= fm.elidedText(author, QtCore.Qt.ElideRight, author_rect.width()) painter.drawText(author_rect, 0, author) painter.restore() class AnnotatedTextEdit(QtWidgets.QPlainTextEdit): annotate = None rev_colors = {} # RJLRJL: added for Qt5 documentChangeFinished = QtCore.pyqtSignal() def paintEvent(self, event): if self.annotate: block = self.firstVisibleBlock() painter = QtGui.QPainter(self.viewport()) painter.setClipRect(event.rect()) line_count = block.blockNumber() # Iterate over all visible text blocks in the document. while block.isValid(): line_count += 1 # Check if the position of the block is out side of the visible # area. rect = self.blockBoundingGeometry(block) rect = rect.translated(self.contentOffset()) if not block.isVisible() or rect.top() >= event.rect().bottom(): break if line_count - 1 >= len(self.annotate): break revid, is_top = self.annotate[line_count - 1] if revid in self.rev_colors: painter.fillRect(rect, self.rev_colors[revid]) block = block.next() del painter QtWidgets.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): documentChangeFinished = QtCore.pyqtSignal() def __init__(self, branch, working_tree, annotate_tree, path, fileId, encoding=None, parent=None, ui_mode=True, no_graph=False, loader=None, loader_args=None, activate_line=None): QBzrWindow.__init__(self, [gettext("Annotate"), gettext("Loading...")], parent, ui_mode=ui_mode) self.restoreSize("annotate", (780, 680)) self.activate_line_after_load = activate_line self.windows = [] self.branch = branch self.annotate_tree = annotate_tree self.working_tree = working_tree if (self.working_tree is None and isinstance(annotate_tree, WorkingTree)): self.working_tree = annotate_tree self.no_graph = no_graph self.old_lines = None self.fileId = fileId self.path = path self.encoding = encoding self.loader_func = loader self.loader_args = loader_args self.throbber = ToolBarThrobberWidget(self) self.text_edit_frame = AnnotateEditerFrameBase(self) self.text_edit = AnnotatedTextEdit(self) self.text_edit.setFrameStyle(QtWidgets.QFrame.NoFrame) self.text_edit.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse | QtCore.Qt.TextSelectableByKeyboard) self.text_edit.setLineWrapMode(QtWidgets.QPlainTextEdit.NoWrap) self.text_edit.document().setDefaultFont(get_monospace_font()) self.guidebar_panel = GuideBarPanel(self.text_edit, parent=self) self.guidebar_panel.add_entry('annotate', QtGui.QColor(255, 160, 180)) self.annotate_bar = AnnotateBar(self.text_edit, self, self.get_revno) annotate_spliter = QtWidgets.QSplitter(QtCore.Qt.Horizontal, self) annotate_spliter.addWidget(self.annotate_bar) annotate_spliter.addWidget(self.guidebar_panel) self.annotate_bar.splitter = annotate_spliter self.text_edit_frame.hbox.addWidget(annotate_spliter) self.text_edit.cursorPositionChanged.connect(self.edit_cursorPositionChanged) self.annotate_bar.cursorPositionChanged.connect(self.edit_cursorPositionChanged) self.text_edit.documentChangeFinished.connect(self.edit_documentChangeFinished) self.log_list = AnnotateLogList(self.processEvents, self.throbber, self) self.log_list.header().hideSection(logmodel.COL_DATE) self.log_list.parent_annotate_window = self self.log_branch_loaded = False self.log_list.selectionModel().selectionChanged[QtCore.QItemSelection, QtCore.QItemSelection].connect(self.log_list_selectionChanged) self.message = LogListRevisionMessageBrowser(self.log_list, self) self.encoding_selector = EncodingMenuSelector(self.encoding, gettext("Encoding"), self._on_encoding_changed) hsplitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal) hsplitter.addWidget(self.log_list) hsplitter.addWidget(self.message) hsplitter.setStretchFactor(0, 2) hsplitter.setStretchFactor(1, 2) splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical) splitter.addWidget(self.text_edit_frame) splitter.addWidget(hsplitter) splitter.setStretchFactor(0, 5) splitter.setStretchFactor(1, 2) vbox = QtWidgets.QVBoxLayout(self.centralwidget) #vbox.addWidget(self.toolbar) vbox.addWidget(splitter) self.text_edit.setFocus() self.show_find = QtWidgets.QAction(get_icon("edit-find"), gettext("Find"), self) self.show_find.setShortcuts(QtGui.QKeySequence.Find) self.show_find.setCheckable(True) self.show_goto_line = QtWidgets.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 = QtWidgets.QAction(get_icon("document-properties"), gettext("&View Options"), self) view_menu = QtWidgets.QMenu(gettext('View Options'), self) show_view_menu.setMenu(view_menu) word_wrap = QtWidgets.QAction(gettext("Word Wrap"), self) word_wrap.setCheckable(True) word_wrap.toggled [bool].connect(self.word_wrap_toggle) def setTabStopWidth(tw): self.text_edit.setTabStopWidth(get_tab_width_pixels(tab_width_chars=tw)) get_set_tab_width_chars(branch=self.branch,tab_width_chars=tw) self.tab_width_selector = TabWidthMenuSelector(get_set_tab_width_chars(branch=branch), gettext("Tab Width"), setTabStopWidth) view_menu.addMenu(self.tab_width_selector) 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(QtWidgets.QToolButton.InstantPopup) spacer = QtWidgets.QWidget() spacer.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.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.show_find.toggled [bool].connect(self.show_find_toggle) setup_guidebar_for_find(self.guidebar_panel, self.find_toolbar, index=1) self.goto_line_toolbar = GotoLineToolbar(self, self.show_goto_line) self.goto_line_toolbar.hide() self.addToolBar(self.goto_line_toolbar) self.show_goto_line.toggled [bool].connect(self.show_goto_line_toggle) self.__hashes = {} def show(self): QBzrWindow.show(self) # RJL 2023 - the singleShot causes problems, so just run the load # QtCore.QTimer.singleShot(0, self.initial_load) self.initial_load() @runs_in_loading_queue @ui_current_widget @reports_exception() def initial_load(self): """Called to perform the initial load of the form. Enables a throbber window, then loads the branches etc if they weren't specified in our constructor. """ self.throbber.show() try: if self.loader_func is not None: (self.branch, self.annotate_tree, self.working_tree, self.path, self.fileId) = self.loader_func(*self.loader_args) self.loader_func = self.loader_args = None # kill extra refs... QtCore.QCoreApplication.processEvents() self.encoding = get_set_encoding(self.encoding, self.branch) self.encoding_selector.encoding = self.encoding with self.branch.lock_read(): self.set_annotate_title() self.annotate(self.annotate_tree, self.fileId, self.path) finally: self.throbber.hide() QtCore.QTimer.singleShot(1, self._activate_line) def _activate_line(self): # [bialix 2012/09/14] I have to use QtCore.QTimer.singleShot because # otherwise the line with uncommitted changes is not highlighted # properly: nothing appears in the revision message browser at all. # I didn't find the reason behind it, shame on me. n = self.activate_line_after_load self.activate_line_after_load = None # clear the line number just in case if n: if n == 1: # [bialix 2012/09/13] actually after loading annotation # document implictly sets current position to the first line. # So we're unable to change position to 1st line. # Make a hack: select 2nd line, and then actually select 1st one. self.go_to_line(2) self.go_to_line(n) def set_annotate_title(self): # and update the title to show we are done. if isinstance(self.annotate_tree, RevisionTree): revno = self.get_revno(self.annotate_tree.get_revision_id()) if revno: self.set_title_and_icon([gettext("Annotate"), self.path, gettext("Revision %s") % revno]) return self.set_title_and_icon([gettext("Annotate"), self.path]) def get_revno(self, revid): gv = self.log_list.log_model.graph_viz if (gv and revid in gv.revid_rev): return gv.revid_rev[revid].revno_str return "" def annotate(self, annotate_tree, fileId, path): self.now = time.time() self.rev_indexes = {} last_revid = None lines = [] annotate = [] ordered_revids = [] self.processEvents() for revid, text in annotate_tree.annotate_iter(path): if revid == CURRENT_REVISION: revid = CURRENT_REVISION + annotate_tree.basedir.encode("utf-8") text = text.decode(self.encoding, 'replace') lines.append(text) text = text.rstrip() if revid not in self.rev_indexes: self.rev_indexes[revid]=[] ordered_revids.append(revid) self.rev_indexes[revid].append(len(annotate)) is_top = last_revid != revid last_revid = revid annotate.append((revid, is_top)) 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 self.annotate_bar.show_current_line = False self.text_edit.documentChangeFinished.emit() self.processEvents() just_loaded_log = False if not self.log_branch_loaded: self.log_branch_loaded = True bi = BranchInfo('', self.working_tree, self.branch) self.log_list.load((bi,), bi, [self.fileId], self.no_graph, logmodel.WithWorkingTreeGraphVizLoader) gv = self.log_list.log_model.graph_viz self.annotate_bar.adjustWidth(len(lines), gv.revisions[0].revno_sequence[0]) just_loaded_log = True # Show the revisions the we know about from the annotate. filter = self.log_list.log_model.file_id_filter changed_revs = [] for revid in list(self.rev_indexes.keys()): rev = gv.revid_rev[revid] filter.filter_file_id[rev.index] = True changed_revs.append(rev) filter.filter_changed_callback(changed_revs, last_call=True) self.processEvents() highlight_document(self.text_edit, path) self.processEvents() load_revisions(ordered_revids, self.branch.repository, revisions_loaded = self.revisions_loaded, pass_prev_loaded_rev = True) self.processEvents() if just_loaded_log: # Check for any other revisions we don't know about filter = self.log_list.log_model.file_id_filter revids = [rev.revid for rev in gv.revisions if rev.revid not in self.rev_indexes] filter.load(revids) 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.values(): authors = rev.get_apparent_authors() emails = list(map(self._maybe_extract_email, authors)) author_id = ';'.join(emails) if rev.timestamp is None: days = sys.maxsize elif self.now < rev.timestamp: days = 0 else: days = (self.now - rev.timestamp) / (24 * 60 * 60) alpha = 0.5/((days/50) + 1) h_sh = self._get_hash(author_id) hue = 1-float(h_sh) / sys.maxsize color = QtGui.QColor.fromHsvF(hue, 1, 1, alpha) brush = QtGui.QBrush(color) self.annotate_bar.rev_colors[rev.revision_id] = brush self.text_edit.rev_colors[rev.revision_id] = brush self.annotate_bar.update() self.text_edit.update() def _maybe_extract_email(self, author): name, email = parse_username(author) if email: return email return author def _get_hash(self, author_id): h = self.__hashes.get(author_id) if h is None: h = abs(hash(author_id)) #h = abs(hash(hashlib.md5(author_id).hexdigest())) # maybe increase enthropy via md5? # XXX [bialix 2012/03/30] # I don't really like how we create colors for annotation. # Also, abs(hash) loses 1 bit of the hash result. # I think we can improve our algorithm to use more distinctive colors # maybe we should use md5 as more enthropy source for hash, # or maybe we can use some sort of predefined set of colors # and each next author will use color from that set, # but in this case we lose consistency of colors for the same author # between different annotations # I have no clever idea yet. self.__hashes[author_id] = h return h def edit_cursorPositionChanged(self): current_line = self.text_edit.document().findBlock( self.text_edit.textCursor().position()).blockNumber() if self.text_edit.annotate: rev_id, is_top = self.text_edit.annotate[current_line] self.log_list.select_revid(rev_id) def edit_documentChangeFinished(self): self.annotate_bar.update_highlight_lines() self.guidebar_panel.update_data(annotate=self.annotate_bar.highlight_lines) @runs_in_loading_queue def set_annotate_revision(self): self.throbber.show() try: with self.branch.lock_read(): revid = self.log_list.currentIndex().data(logmodel.RevIdRole) if revid.startswith(CURRENT_REVISION): rev = cached_revisions[revid] self.annotate_tree = self.working_tree else: self.annotate_tree = self.branch.repository.revision_tree(revid) self.path = self.annotate_tree.id2path(self.fileId) self.set_annotate_title() self.processEvents() self.annotate(self.annotate_tree, self.fileId, self.path) finally: self.throbber.hide() @runs_in_loading_queue def _on_encoding_changed(self, encoding): self.encoding = encoding get_set_encoding(encoding, self.branch) self.throbber.show() try: with self.branch.lock_read(): self.annotate(self.annotate_tree, self.fileId, self.path) finally: self.throbber.hide() def log_list_selectionChanged(self, selected, deselected): revids = self.log_list.get_selection_and_merged_revids() self.annotate_bar.highlight_revids = revids self.guidebar_panel.update_data(annotate=self.annotate_bar.highlight_lines) 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(QtWidgets.QPlainTextEdit.WidgetWidth) else: self.text_edit.setLineWrapMode(QtWidgets.QPlainTextEdit.NoWrap) def go_to_line(self, line): doc = self.text_edit.document() cursor = QtGui.QTextCursor(doc) cursor.setPosition(doc.findBlockByNumber(line-1).position()) self.text_edit.setTextCursor(cursor) self.text_edit.centerCursor() # QIntValidator did not work on vila's setup, so this is a workaround. # RJLRJL QIntValidator seems to be working in 2020, whereas this isn't # so ignored for now. 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(QtWidgets.QToolBar): def __init__(self, anotate_window, show_action): QtWidgets.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 = QtWidgets.QLabel(gettext("Goto Line: "), self) self.addWidget(label) self.line_edit = QtWidgets.QLineEdit(self) # QIntValidator is working in python3, so we'll use that # self.line_edit.setValidator(IntValidator(self.line_edit)) self.line_edit.setValidator(QtGui.QIntValidator()) self.addWidget(self.line_edit) label.setBuddy(self.line_edit) go = self.addAction(get_icon("go-next"), gettext("Go")) spacer = QtWidgets.QWidget() spacer.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.addWidget(spacer) close = QtWidgets.QAction(self) close.setIcon(self.style().standardIcon(QtWidgets.QStyle.SP_DialogCloseButton)) self.addAction(close) close.setShortcut((QtCore.Qt.Key_Escape)) close.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) close.setStatusTip(gettext("Close Goto Line")) close.triggered[bool].connect(self.close_triggered) go.triggered[bool].connect(self.go_triggered) self.line_edit.returnPressed.connect(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())) except ValueError: pass else: self.anotate_window.go_to_line(line) self.show_action.setChecked(False) class AnnotateLogList(LogList): parent_annotate_window = None def create_context_menu(self): LogList.create_context_menu(self, diff_is_default_action=False) set_rev_action = QtWidgets.QAction(gettext("&Annotate this revision"), self.context_menu) set_rev_action.triggered.connect(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() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/autocomplete.py0000644000000000000000000000676714556556456014503 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2007-2008 Lukáš Lalinský # # 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. import re # Based on my old commit code and http://tortoisesvn.tigris.org/svn/tortoisesvn/trunk/src/TortoiseSVNSetup/include/autolist.txt autolist = [ (r'^\s*(?:class|typedef|struct|union|namespace)\s+([\w_]+)|\b([\w_]+)\s*\(', ('.h', '.hh', '.hpp', '.hxx')), (r'(?<=typedef)\s+(?:struct|union)\s+([\w_]+)', ('.h', '.hh', '.hpp', '.hxx', '.c')), (r'\b(([\w_]+)::([\w_]+))|\b([\w_]+)\s*\(', ('.cpp', '.cc', '.c', '.cxx')), (r'(?:(?:prototype\.|this\.)(\w+)\s*=\s*)?function\s*(?:(\w*)\s*)\(', ('.js',)), (r'(\w+)\s+=\s+(?:class|record|interface)|(?:procedure|function|property|constructor)\s+(\w+)', ('.pas',)), (r'^\s*(?:class|def)\s+(\w+)', ('.py', '.pyw', '.rb')), (r'(\w+)\s*=\s*', ('.py', '.pyw')), (r'^\s*sub\s+(\w+)|\s*(?:package|use)\s+([\w\:]+)', ('.pl', '.pm')), (r'^\s*class\s+(\w+)|^\s*(?:(?:public|private|)\s+function)\s+(\w+)|::(\w+)|->(\w+)', ('.php',)), (r'(?:class|function|sub)\s+(\w+)(?:\s*(?:[\(\']|$))', ('.vb', '.vb6')), (r'^\s*(?:(?:Public (?:Default )?|Private )?(?:Sub|Function|Property Get|Property Set|Property Let) ?)(\w+)\(|^Attribute VB_Name = "(\w+)"', ('.bas', '.frm', '.cls')), (r'(?:public|protected|private|internal)\s+(?:[\w\d_\.]+\s+)*([\w\d_\.]+)', ('.cs', '.asp', '.aspx')), (r'class\s+([\w_]+)(?:(?:\s+)?(?:extends|implements)(?:\s+)?([\w_]+)?)', ('.java',)), (r'(?:public|protected|private|internal)\s+(?:[\w\d_\.]+\s+)*([\w\d_\.]+)', ('.java',)), (r'^.{6} ([A-Z][A-Z0-9-]*)(?: SECTION)?\.', ('.cbl', '.cpy')), (r'Func\s+([\w_]+)|\$([\w_]+)', ('.au3', '.auh')), (r'^([\w]+) *', ('.asm',)), ] _autolist_map = {} class AutocompleteWordListBuilder(object): def __init__(self): self.regexes = [] self.compiled_regexes = None def compile_regexes(self): if self.compiled_regexes is None: self.compiled_regexes = list(map(re.compile, self.regexes)) def iter_words(self, file): self.compile_regexes() for line in file: for regex in self.compiled_regexes: for result in regex.findall(line): if not isinstance(result, tuple): result = (result,) for word in [_f for _f in result if _f]: yield word def get_wordlist_builder(ext): if not _autolist_map: for regex, extensions in autolist: for extension in extensions: if extension not in _autolist_map: _autolist_map[extension] = AutocompleteWordListBuilder() _autolist_map[extension].regexes.append(regex) return _autolist_map.get(ext) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/bind.py0000644000000000000000000001143714556556456012704 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # # Contributors: # Javier Der Derian # # 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 PyQt5 import QtCore, QtGui, QtWidgets from breezy import errors, osutils from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.subprocess import SubProcessDialog from breezy.plugins.qbrz.lib.util import ( url_for_display, ) from breezy.plugins.qbrz.lib.uifactory import ui_current_widget from breezy.plugins.qbrz.lib.trace import ( reports_exception, SUB_LOAD_METHOD, ) class QBzrBindDialog(SubProcessDialog): def __init__(self, branch, location=None, ui_mode = None): self.branch = branch super(QBzrBindDialog, self).__init__( gettext("Bind branch"), name = "bind", default_size = (400, 400), ui_mode = ui_mode, dialog = True, parent = None, hide_progress=False, ) # Display information fields gbBind = QtWidgets.QGroupBox(gettext("Bind"), self) bind_box = QtWidgets.QFormLayout(gbBind) bind_box.addRow(gettext("Branch location:"), QtWidgets.QLabel(url_for_display(branch.base))) self.currbound = branch.get_bound_location() if self.currbound != None: bind_box.addRow(gettext("Currently bound to:"), QtWidgets.QLabel(url_for_display(self.currbound))) # Build the "Bind to" widgets branch_label = QtWidgets.QLabel(gettext("Bind to:")) branch_combo = QtWidgets.QComboBox() branch_combo.setEditable(True) self.branch_combo = branch_combo browse_button = QtWidgets.QPushButton(gettext("Browse")) browse_button.clicked[bool].connect(self.browse_clicked) # Add some useful values into the combo box. If a location was given, # default to it. If an old bound location exists, suggest it. # Otherwise suggest the parent branch, if any. suggestions = [] if location: suggestions.append(osutils.abspath(location)) self._maybe_add_suggestion(suggestions, branch.get_old_bound_location()) self._maybe_add_suggestion(suggestions, branch.get_parent()) self._maybe_add_suggestion(suggestions, branch.get_push_location()) if suggestions: branch_combo.addItems(suggestions) # Build the "Bind to" row/panel bind_hbox = QtWidgets.QHBoxLayout() bind_hbox.addWidget(branch_label) bind_hbox.addWidget(branch_combo) bind_hbox.addWidget(browse_button) bind_hbox.setStretchFactor(branch_label,0) bind_hbox.setStretchFactor(branch_combo,1) bind_hbox.setStretchFactor(browse_button,0) bind_box.addRow(bind_hbox) # Put the form together layout = QtWidgets.QVBoxLayout(self) layout.addWidget(gbBind) layout.addWidget(self.make_default_status_box()) layout.addWidget(self.buttonbox) branch_combo.setFocus() def _maybe_add_suggestion(self, suggestions, location): if location: url = url_for_display(location) if url not in suggestions: suggestions.append(url) def browse_clicked(self): fileName = QtWidgets.QFileDialog.getExistingDirectory(self, gettext("Select branch location")); if fileName != '': self.branch_combo.insertItem(0,fileName) self.branch_combo.setCurrentIndex(0) def _get_location(self): return str(self.branch_combo.currentText()) def validate(self): if not self._get_location(): self.operation_blocked(gettext("Master branch location not specified.")) return False return True def do_start(self): self.process_widget.do_start(None, 'bind', self._get_location()) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/branch.py0000644000000000000000000001270214556556456013221 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2007 Lukáš Lalinský # # 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. import os from PyQt5 import QtCore from breezy import osutils from breezy.commands import get_cmd_object from breezy.plugins.qbrz.lib.subprocess import SubProcessDialog from breezy.plugins.qbrz.lib.ui_branch import Ui_BranchForm from breezy.plugins.qbrz.lib.util import ( iter_saved_pull_locations, save_pull_location, fill_combo_with, hookup_directory_picker, DIRECTORYPICKER_SOURCE, DIRECTORYPICKER_TARGET, ) class QBzrBranchWindow(SubProcessDialog): NAME = "branch" def __init__(self, from_location, to_location=None, revision=None, bind=False, parent_dir=None, ui_mode=True, parent=None): super(QBzrBranchWindow, self).__init__(name = self.NAME, ui_mode = ui_mode, parent = parent) # Unless instructed otherwise, use the current directory as # the parent directory. if parent_dir is None: parent_dir = os.getcwd() self.parent_dir = parent_dir # Layout the form, adding the subprocess widgets self.ui = Ui_BranchForm() self.setupUi(self.ui) self.cmd_branch_options = get_cmd_object('branch').options() if 'bind' not in self.cmd_branch_options: self.ui.bind.setVisible(False) for w in self.make_default_layout_widgets(): self.layout().addWidget(w) # Setup smart setting of fields as others are edited. self.ui.from_location.editTextChanged['QString'].connect(self.from_changed) # Initialise the fields fill_combo_with(self.ui.from_location, '', iter_saved_pull_locations()) if from_location: self.ui.from_location.setEditText(from_location) if to_location: self.ui.to_location.setEditText(to_location) if bind: self.ui.bind.setChecked(True) if revision: self.ui.revision.setText(revision) # Hook up our directory pickers hookup_directory_picker(self, self.ui.from_picker, self.ui.from_location, DIRECTORYPICKER_SOURCE) hookup_directory_picker(self, self.ui.to_picker, self.ui.to_location, DIRECTORYPICKER_TARGET) # Put the focus on the To location if From is already set if from_location: self.ui.to_location.setFocus() else: self.ui.from_location.setFocus() def from_changed(self, from_location): to_location = self._default_to_location(str(from_location)) if to_location is not None: self.ui.to_location.setEditText(to_location) def _default_to_location(self, from_location): """Work out a good To location give a From location. :return: the To location or None if unsure """ # We want to avoid opening the from location here so # we 'guess' the basename using some simple heuristics from_location = from_location.replace('\\', '/').rstrip('/') if from_location.find('/') >= 0: basename = osutils.basename(from_location) else: # Handle 'directory services' like lp: ds_sep = from_location.find(':') if ds_sep >= 0: basename = from_location[ds_sep + 1:] else: return None # Calculate the To location and check it's not the same as the # From location. to_location = osutils.pathjoin(self.parent_dir, basename) if to_location == from_location: return None else: return to_location def get_to_location(self): """The path the branch was created in.""" # This is used by explorer to find the location to open on completion return str(self.ui.to_location.currentText()) def do_start(self): args = [] if self.ui.bind.isChecked(): args.append('--bind') revision = str(self.ui.revision.text()) if revision: args.append('--revision') args.append(revision) from_location = str(self.ui.from_location.currentText()) to_location = self.get_to_location() if 'use-existing-dir' in self.cmd_branch_options: # always use this options because it should be mostly harmless args.append('--use-existing-dir') self.process_widget.do_start(None, 'branch', from_location, to_location, *args) save_pull_location(None, from_location) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/browse.py0000644000000000000000000002063414556556456013270 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2006 Lukáš Lalinský # # 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 PyQt5 import QtWidgets from breezy.plugins.qbrz.lib.util import ( BTN_CLOSE, BTN_REFRESH, StandardButton, QBzrWindow, ThrobberWidget, url_for_display, ) from breezy.plugins.qbrz.lib.uifactory import ui_current_widget from breezy.plugins.qbrz.lib.trace import reports_exception from breezy import osutils, errors from breezy.controldir import ControlDir from breezy.revisionspec import RevisionSpec from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.treewidget import TreeWidget, TreeFilterMenu, FilterModelKeys from breezy.plugins.qbrz.lib.diff import DiffButtons class BrowseWindow(QBzrWindow): def __init__(self, branch=None, location=None, revision=None, revision_id=None, revision_spec=None, parent=None): if branch: self.branch = branch self.location = url_for_display(branch.base) else: self.branch = None if location is None: location = osutils.getcwd() self.location = location self.workingtree = None self.revision_id = revision_id self.revision_spec = revision_spec self.revision = revision QBzrWindow.__init__(self, [gettext("Browse"), self.location], parent) self.restoreSize("browse", (780, 580)) vbox = QtWidgets.QVBoxLayout(self.centralwidget) self.throbber = ThrobberWidget(self) vbox.addWidget(self.throbber) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(QtWidgets.QLabel(gettext("Location:"))) self.location_edit = QtWidgets.QLineEdit() self.location_edit.setReadOnly(True) self.location_edit.setText(self.location) hbox.addWidget(self.location_edit, 7) hbox.addWidget(QtWidgets.QLabel(gettext("Revision:"))) self.revision_edit = QtWidgets.QLineEdit() self.revision_edit.returnPressed.connect(self.reload_tree) hbox.addWidget(self.revision_edit, 1) self.show_button = QtWidgets.QPushButton(gettext("Show")) self.show_button.clicked.connect(self.reload_tree) hbox.addWidget(self.show_button, 0) self.filter_menu = TreeFilterMenu(self) self.filter_button = QtWidgets.QPushButton(gettext("&Filter")) self.filter_button.setMenu(self.filter_menu) hbox.addWidget(self.filter_button, 0) self.filter_menu.triggered[int, bool].connect(self.filter_triggered) vbox.addLayout(hbox) self.file_tree = TreeWidget(self) self.file_tree.throbber = self.throbber vbox.addWidget(self.file_tree) self.filter_menu.set_filters(self.file_tree.tree_filter_model.filters) buttonbox = self.create_button_box(BTN_CLOSE) self.refresh_button = StandardButton(BTN_REFRESH) buttonbox.addButton(self.refresh_button, QtWidgets.QDialogButtonBox.ActionRole) self.refresh_button.clicked.connect(self.file_tree.refresh) self.diffbuttons = DiffButtons(self.centralwidget) self.diffbuttons._triggered['QString'].connect(self.file_tree.show_differences) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(self.diffbuttons) hbox.addWidget(buttonbox) vbox.addLayout(hbox) self.windows = [] self.file_tree.setFocus() # set focus so keyboard navigation will work from the beginning def show(self): # we show the bare form as soon as possible. super().show() self.load() self.file_tree.refresh() # @runs_in_loading_queue # @ui_current_widget @reports_exception() def load(self): self.throbber.show() self.processEvents() try: self.revno_map = None if not self.branch: (self.workingtree, self.branch, repo, path) = ControlDir.open_containing_tree_branch_or_repository(self.location) if self.revision is None: if self.revision_id is None: if self.workingtree is not None: self.revision_spec = "wt:" else: revno, self.revision_id = self.branch.last_revision_info() self.revision_spec = str(revno) self.set_revision(revision_id=self.revision_id, text=self.revision_spec) else: self.set_revision(self.revision) self.processEvents() finally: self.throbber.hide() self.processEvents() # @runs_in_loading_queue @ui_current_widget def set_revision(self, revspec=None, revision_id=None, text=None): self.throbber.show() try: buttons = (self.filter_button, self.diffbuttons, self.refresh_button) state = self.file_tree.get_state() if text == "wt:": self.tree = self.workingtree with self.tree.lock_read(): self.file_tree.set_tree(self.workingtree, self.branch) self.file_tree.restore_state(state) for button in buttons: button.setEnabled(True) else: branch = self.branch with branch.lock_read(): self.processEvents() for button in buttons: button.setEnabled(False) self.file_tree.tree_filter_model.setFilter(FilterModelKeys.UNCHANGED, True) self.filter_menu.set_filters(self.file_tree.tree_filter_model.filters) if revision_id is None: text = revspec.spec or '' if revspec.in_branch == revspec.in_history: args = [branch] else: args = [branch, False] revision_id = revspec.in_branch(*args).rev_id self.revision_id = revision_id self.tree = branch.repository.revision_tree(revision_id) self.processEvents() self.file_tree.set_tree(self.tree, self.branch) self.file_tree.restore_state(state) if self.revno_map is None: self.processEvents() # XXX make this operation lazy? how? self.revno_map = self.branch.get_revision_id_to_revno_map() self.file_tree.tree_model.set_revno_map(self.revno_map) self.revision_edit.setText(text) finally: self.throbber.hide() # @ui_current_widget def reload_tree(self): revstr = str(self.revision_edit.text()) if not revstr: if self.workingtree is not None: self.revision_spec = "wt:" revision_id = None else: revno, revision_id = self.branch.last_revision_info() self.revision_spec = str(revno) self.set_revision(revision_id=revision_id, text=self.revision_spec) else: if revstr == "wt:": self.revision_spec = "wt:" revision_id = None self.set_revision(revision_id=revision_id, text=self.revision_spec) else: try: revspec = RevisionSpec.from_string(revstr) except errors.NoSuchRevisionSpec as e: QtWidgets.QMessageBox.warning(self, gettext("Browse"), str(e), QtWidgets.QMessageBox.Ok) return self.set_revision(revspec) def filter_triggered(self, filter, checked): self.file_tree.tree_filter_model.setFilter(filter, checked) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/bugs.py0000644000000000000000000001117414556556456012726 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # # 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 breezy import ( bugtracker, config, lazy_regex, ) # XXX use just (\d+) at the end of URL as simpler regexp? _bug_id_re = lazy_regex.lazy_compile(r'(?:' r'bugs/' # Launchpad bugs URL r'|ticket/' # Trac bugs URL r'|show_bug\.cgi\?id=' # Bugzilla bugs URL r'|issues/(?:show/)?' # Redmine bugs URL r'|DispForm.aspx\?ID=' # Microsoft SharePoint URL r'|default.asp\?' # Fogbugz URL r'|issue' # Roundup issue tracker URL r'|view.php\?id=' # Mantis bug tracker URL r'|aid=' # FusionForge bug tracker URL r'|task_id=' # Flyspray bug tracker URL (http://flyspray.org) - old style URLs(?) r'|task/' # Flyspray itself bugtracker (https://bugs.flyspray.org) r')(\d+)(?:\b|$)') _jira_bug_id_re = lazy_regex.lazy_compile(r'(?:.*/browse/)([A-Z][A-Z0-9_]*-\d+)($)') _unique_bugtrackers = ('lp', 'deb', 'gnome') # bugtracker config settings _bugtracker_re = lazy_regex.lazy_compile('(bugtracker|trac|bugzilla)_(.+)_url') def get_bug_id(bug_url): match = _bug_id_re.search(bug_url) if match: return match.group(1) match = _jira_bug_id_re.search(bug_url) if match: return match.group(1) return None class FakeBranchForBugs(object): """Fake branch required for breezy/bugtracker.py""" def __init__(self): self._config = config.GlobalConfig() def get_config(self): return self._config def bug_urls_to_ids(bug_urls, branch=None): """Convert list of bug URLs to list of bug ids in form tag:id. @param bug_urls: list of bug URLs from revision property 'bugs'. @param branch: current branch object or None. """ result = [] urls_dict = {} for i in bug_urls: url = i.split(' ')[0] n = get_bug_id(url) if n: urls_dict[url] = n if not urls_dict: return result # collect bug tags bug_tags = {} bug_tags.update(get_unique_bug_tags()) bug_tags.update(get_global_bug_tags()) if branch is not None: bug_tags.update(get_branch_bug_tags(branch)) else: branch = FakeBranchForBugs() # try to convert bug urls to tag:id values for k,n in urls_dict.items(): for tag in bug_tags: url = bugtracker.get_bug_url(tag, branch, n) if url == k: result.append(tag+':'+n) break return sorted(result) def get_user_bug_trackers_tags(config_keys): """Return dict of abbreviated bugtrackers tags from user config. @param config_keys: options names from config which could be bugtracker settings. @return: dict with tags as keys and bugtracker_type as values, where bugtracker_type is prefix of tag entry in config_dict. Possible prefixes are: bugtracker, trac, bugzilla """ result = {} for key in config_keys: m = _bugtracker_re.match(key) if m: result[m.group(2)] = m.group(1) return result def get_unique_bug_tags(): """Return dict of global unique bugtrackers, e.g. Launchpad.""" return dict([(i, 'unique') for i in _unique_bugtrackers]) def get_global_bug_tags(): """Return bug tags collected from global config bazaar.conf""" cfg = config.GlobalConfig() keys = list(cfg._get_parser().get('DEFAULT', {}).keys()) return get_user_bug_trackers_tags(keys) def get_branch_bug_tags(branch): """Return bug tags collected from branch configs (branch.conf and locations.conf). """ result = {} cfg = branch.get_config() loc_cfg = cfg._get_location_config() keys = loc_cfg._get_parser().scalars result.update(get_user_bug_trackers_tags(keys)) br_cfg = cfg._get_branch_data_config() keys = br_cfg._get_parser().scalars result.update(get_user_bug_trackers_tags(keys)) return result ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/cat.py0000644000000000000000000003204614556556456012536 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2007 Lukáš Lalinský # # 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. import os from PyQt5 import QtCore, QtGui, QtWidgets from breezy import errors, osutils from breezy.branch import Branch from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.util import ( BTN_CLOSE, QBzrWindow, ThrobberWidget, file_extension, get_monospace_font, get_set_encoding, get_tab_width_pixels, runs_in_loading_queue, ) from breezy.plugins.qbrz.lib.encoding_selector import EncodingSelector from breezy.plugins.qbrz.lib.fake_branch import FakeBranch from breezy.plugins.qbrz.lib.syntaxhighlighter import highlight_document from breezy.plugins.qbrz.lib.texteditannotate import LineNumberEditerFrame from breezy.plugins.qbrz.lib.trace import reports_exception from breezy.plugins.qbrz.lib.uifactory import ui_current_widget def hexdump(data): content = [] for i in range(0, len(data), 16): hexdata = [] chardata = [] for c in data[i:i+16]: j = ord(c) hexdata.append('%02x' % j) if j >= 32 and j < 128: chardata.append(c) else: chardata.append('.') for c in range(16 - len(hexdata)): hexdata.append(' ') chardata.append(' ') line = '%08x ' % i + ' '.join(hexdata[:8]) + ' ' + ' '.join(hexdata[8:]) + ' |' + ''.join(chardata) + '|' content.append(line) return '\n'.join(content) class QBzrCatWindow(QBzrWindow): """Show content of versioned file/symlink.""" def __init__(self, filename=None, revision=None, tree=None, file_id=None, encoding=None, parent=None): """Create qcat window.""" self.filename = filename self.revision = revision self.tree = tree if tree: self.branch = getattr(tree, 'branch', None) if self.branch is None: self.branch = FakeBranch() self.file_id = file_id self.encoding = encoding if (not self.filename) and self.tree and self.file_id: self.filename = self.tree.id2path(self.file_id) QBzrWindow.__init__(self, [gettext("View"), self.filename], parent) self.restoreSize("cat", (780, 580)) self.throbber = ThrobberWidget(self) self.buttonbox = self.create_button_box(BTN_CLOSE) self.encoding_selector = self._create_encoding_selector() self.vbox = QtWidgets.QVBoxLayout(self.centralwidget) self.vbox.addWidget(self.throbber) self.vbox.addStretch() hbox = QtWidgets.QHBoxLayout() hbox.addWidget(self.encoding_selector) hbox.addWidget(self.buttonbox) self.vbox.addLayout(hbox) def _create_encoding_selector(self): encoding_selector = EncodingSelector(self.encoding, gettext("Encoding:"), self._on_encoding_changed) # disable encoding selector, # it will be enabled later only for text files encoding_selector.setDisabled(True) return encoding_selector def show(self): # we show the bare form as soon as possible. # RJL, 2023 - this used to call QtCore.QTimer.singleShot(0, self.load) # however, that failed to call self.load() rapidly enough # (probably things run a lot faster in 2023 than 2007!), so # just call it directly QBzrWindow.show(self) self.load() @runs_in_loading_queue @ui_current_widget @reports_exception() def load(self): self.throbber.show() self.processEvents() try: if not self.tree: branch, relpath = Branch.open_containing(self.filename) self.branch = branch self.encoding = get_set_encoding(self.encoding, branch) self.encoding_selector.encoding = self.encoding if self.revision is None: self.tree = branch.basis_tree() else: revision_id = self.revision[0].in_branch(branch).rev_id self.tree = branch.repository.revision_tree(revision_id) self.file_id = self.tree.path2id(relpath) if not self.file_id: self.file_id = self.tree.path2id(self.filename) if not self.file_id: raise errors.BzrCommandError( "%r is not present in revision %s" % ( self.filename, self.tree.get_revision_id())) with self.tree.lock_read(): kind = self.tree.kind(self.filename) if kind == 'file': text = self.tree.get_file_text(self.filename) elif kind == 'symlink': text = self.tree.get_symlink_target(self.filename) else: text = '' self.processEvents() self.text = text self.kind = kind self._create_and_show_browser(self.filename, text, kind) finally: self.throbber.hide() def _create_and_show_browser(self, filename, text, kind): """Create browser object for given file and then attach it to GUI. @param filename: filename used for differentiate between images and simply binary files. @param text: raw file content. @param kind: filesystem kind: file, symlink, directory """ type_, fview = self.detect_content_type(filename, text, kind) # update title title = "View " + type_ self.set_title([gettext(title), filename]) # create and show browser self.browser = fview(filename, text) self.vbox.insertWidget(1, self.browser, 1) # set focus on content self.browser.setFocus() def detect_content_type(self, relpath, text, kind='file'): """Return (file_type, viewer_factory) based on kind, text and relpath. Supported file types: text, image, binary """ if kind == 'file': if not b'\0' in text: return 'text file', self._create_text_view else: ext = file_extension(relpath).lower() image_exts = ['.'+str(i) for i in QtGui.QImageReader.supportedImageFormats()] if ext in image_exts: return 'image file', self._create_image_view else: return 'binary file', self._create_hexdump_view else: return kind, self._create_symlink_view def _set_text(self, edit_widget, relpath, text, encoding=None): """Set plain text to widget, as unicode. @param edit_widget: edit widget to view the text. @param relpath: filename (required for syntax highlighting to detect file type). @param text: plain non-unicode text (bytes). @param encoding: text encoding (default: utf-8). """ text = text.decode(encoding or 'utf-8', 'replace') edit_widget.setPlainText(text) highlight_document(edit_widget, relpath) def _create_text_view(self, relpath, text): """Create widget to show text files. @return: created widget with loaded text. """ browser = LineNumberEditerFrame(self) edit = browser.edit edit.setReadOnly(True) edit.document().setDefaultFont(get_monospace_font()) edit.setTabStopWidth(get_tab_width_pixels(self.branch)) self._set_text(edit, relpath, text, self.encoding) self.encoding_selector.setEnabled(True) return browser def _on_encoding_changed(self, encoding): """Event handler for EncodingSelector. It sets file text to browser again with new encoding. """ self.encoding = encoding branch = self.branch if branch is None: branch = Branch.open_containing(self.filename)[0] if branch: get_set_encoding(encoding, branch) self._set_text(self.browser.edit, self.filename, self.text, self.encoding) def _create_simple_text_browser(self): """Create and return simple widget to show text-like content.""" browser = QtWidgets.QPlainTextEdit(self) browser.setReadOnly(True) browser.document().setDefaultFont(get_monospace_font()) return browser def _create_symlink_view(self, relpath, target): """Create widget to show symlink target. @return: created widget with loaded content. """ browser = self._create_simple_text_browser() browser.setPlainText('-> ' + target.decode('utf-8', 'replace')) return browser def _create_hexdump_view(self, relpath, data): """Create widget to show content of binary files. @return: created widget with loaded content. """ browser = self._create_simple_text_browser() browser.setPlainText(hexdump(data)) return browser def _create_image_view(self, relpath, data): """Create widget to show image file. @return: created widget with loaded image. """ self.pixmap = QtGui.QPixmap() self.pixmap.loadFromData(data) self.item = QtWidgets.QGraphicsPixmapItem(self.pixmap) self.scene = QtWidgets.QGraphicsScene(self.item.boundingRect()) self.scene.addItem(self.item) return QtWidgets.QGraphicsView(self.scene) class QBzrViewWindow(QBzrCatWindow): """Show content of file/symlink from the disk.""" def __init__(self, filename=None, encoding=None, parent=None): """Construct GUI. @param filename: filesystem object to view. @param encoding: use this encoding to decode text file content to unicode. @param parent: parent widget. """ QBzrWindow.__init__(self, [gettext("View"), filename], parent) self.restoreSize("cat", (780, 580)) self.filename = filename self.encoding = encoding self.buttonbox = self.create_button_box(BTN_CLOSE) self.encoding_selector = self._create_encoding_selector() self.branch = FakeBranch() self.vbox = QtWidgets.QVBoxLayout(self.centralwidget) self.vbox.addStretch() hbox = QtWidgets.QHBoxLayout() hbox.addWidget(self.encoding_selector) hbox.addWidget(self.buttonbox) self.vbox.addLayout(hbox) def load(self): kind = osutils.file_kind(self.filename) text = '' if kind == 'file': with open(self.filename, 'rb') as f: text = f.read() elif kind == 'symlink': text = os.readlink(self.filename) self.text = text self._create_and_show_browser(self.filename, text, kind) def cat_to_native_app(tree, relpath): """Extract file content to temp directory and then launch native application to open it. @param tree: RevisionTree object. @param relpath: path to file relative to tree root. @raise KindError: if relpath entry has not file kind. @return: True if native application was launched. """ kind = tree.kind(relpath) if kind != 'file': raise KindError('cat to native application is not supported ' 'for entry of kind %r' % kind) # make temp file import os import tempfile # RJLRJL Check this QBzr reference # qdir = os.path.join(tempfile.gettempdir(), 'QBzr', 'qcat') qdir = os.path.join(tempfile.gettempdir(), 'qbrz', 'qcat') if not os.path.isdir(qdir): os.makedirs(qdir) basename = os.path.basename(relpath) fname = os.path.join(qdir, basename) with open(fname, 'wb') as f, tree.lock_read(): f.write(tree.get_file_text(relpath)) # open it url = QtCore.QUrl.fromLocalFile(fname) result = QtGui.QDesktopServices.openUrl(url) # now application is about to start and user will work with file # so we can do cleanup in "background" import time limit = time.time() - 60 # files older than 1 minute files = os.listdir(qdir) for i in files[:20]: if i == basename: continue fname = os.path.join(qdir, i) st = os.lstat(fname) if st.st_mtime > limit: continue try: os.unlink(fname) except (OSError, IOError): pass # return result class KindError(errors.BzrError): pass ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/commands.py0000644000000000000000000011551314556556456013571 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2006 Lukáš Lalinský # Copyright (C) 2008, 2009 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. import signal from breezy import errors from breezy.commands import Command from breezy.option import Option import breezy.builtins import sys from PyQt5 import QtCore, QtWidgets from breezy import osutils, ui, gpg from breezy.branch import Branch from breezy.controldir import ControlDir from breezy.workingtree import WorkingTree from breezy.diff import get_trees_and_branches_to_diff_locked from breezy.plugins.qbrz.lib import i18n from breezy.plugins.qbrz.lib.add import AddWindow from breezy.plugins.qbrz.lib.annotate import AnnotateWindow from breezy.plugins.qbrz.lib.branch import QBzrBranchWindow from breezy.plugins.qbrz.lib.browse import BrowseWindow from breezy.plugins.qbrz.lib.cat import ( QBzrCatWindow, QBzrViewWindow, cat_to_native_app, ) from breezy.plugins.qbrz.lib.commit import CommitWindow from breezy.plugins.qbrz.lib.config import QBzrConfigWindow from breezy.plugins.qbrz.lib.diffwindow import DiffWindow from breezy.plugins.qbrz.lib.getupdates import UpdateBranchWindow, UpdateCheckoutWindow from breezy.plugins.qbrz.lib.help import show_help from breezy.plugins.qbrz.lib.log import LogWindow from breezy.plugins.qbrz.lib.info import QBzrInfoWindow from breezy.plugins.qbrz.lib.init import QBzrInitWindow from breezy.plugins.qbrz.lib.main import QBzrMainWindow from breezy.plugins.qbrz.lib.verify_signatures import QBzrVerifySignaturesWindow from breezy.plugins.qbrz.lib.pull import ( QBzrPullWindow, QBzrPushWindow, QBzrMergeWindow, ) from breezy.plugins.qbrz.lib.revert import RevertWindow from breezy.plugins.qbrz.lib.tag import TagWindow from breezy.plugins.qbrz.lib.tree_branch import TreeBranch from breezy.plugins.qbrz.lib.uncommit import QBzrUncommitWindow from breezy.plugins.qbrz.lib.update import QBzrUpdateWindow from breezy.plugins.qbrz.lib.util import ( FilterOptions, is_valid_encoding, open_tree, ) from breezy.plugins.qbrz.lib.uifactory import QUIFactory from breezy.plugins.qbrz.lib.send import SendWindow from breezy.plugins.qbrz.lib.shelvewindow import ShelveWindow from breezy.plugins.qbrz.lib.diff_arg import DiffArgProvider CUR_DIR = '.' class InvalidEncodingOption(errors.BzrError): _fmt = 'Invalid encoding: %(encoding)s\nValid encodings are:\n%(valid)s' def __init__(self, encoding): errors.BzrError.__init__(self) self.encoding = encoding import encodings self.valid = ', '.join(sorted(list(set(encodings.aliases.aliases.values())))).replace('_','-') def check_encoding(encoding): if is_valid_encoding(encoding): return encoding raise InvalidEncodingOption(encoding) class PyQt4NotInstalled(errors.BzrError): _fmt = 'QBrz requires at least PyQt 4.4 and Qt 4.4 to run. Please check your install' # TODO: test this with qt5 def report_missing_pyqt(unbound): """Decorator for q-commands run method to catch ImportError PyQt4 and show explanation to user instead of scary traceback. See bugs: #240123, #163728 """ def run(self, *args, **kwargs): try: return unbound(self, *args, **kwargs) except ImportError as e: if str(e).endswith('PyQt4'): raise PyQt4NotInstalled raise return run def install_gettext(unbound): """Decorator for q-commands run method to enable gettext translations.""" def run(self, *args, **kwargs): i18n.install() try: return unbound(self, *args, **kwargs) finally: i18n.uninstall() return run class QBzrCommand(Command): """Base class for all q-commands. NOTES: 1) q-command should define method '_qbrz_run' instead of 'run' (as in breezy). 2) The _qbrz_run method should return 0 for successfull exit and 1 if operation was cancelled by user. 3) The _qbrz_run method can return None, in this case return code will be asked from self.main_window instance (if there is one). self.main_window should be instance of QBzrWindow or QBzrDialog with attribute "return_code" set to 0 or 1. """ @install_gettext @report_missing_pyqt def run(self, *args, **kwargs): # We must create the QApplication before we install the QUIFactory. # This is because once the factory is installed, it is possible that # opening a branch, etc will go to the ui_factory to request a # password, and the app must exist before the dialog can be created. self._application = QtWidgets.QApplication(sys.argv) std_ui_factory = ui.ui_factory try: ui.ui_factory = QUIFactory() # Handle interupt signal correctly. signal.signal(signal.SIGINT, signal.SIG_DFL) # Set up global exception handling. from breezy.plugins.qbrz.lib.trace import excepthook sys.excepthook = excepthook try: try: ret_code = self._qbrz_run(*args, **kwargs) finally: # ensure we flush clipboard data (see bug #503401) clipboard = self._application.clipboard() clipEvent = QtCore.QEvent(QtCore.QEvent.Clipboard) self._application.sendEvent(clipboard, clipEvent) if ret_code is None: main_window = getattr(self, "main_window", None) if main_window is not None: # 0.20 special: We check hasattr() first to work around # if hasattr(main_window, "return_code"): ret_code = main_window.return_code return ret_code except Exception: ui_mode = kwargs.get("ui_mode", False) from breezy.plugins.qbrz.lib.trace import report_exception return report_exception(ui_mode=ui_mode) finally: ui.ui_factory = std_ui_factory 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* want breezy's feature of parsing the revision string before passing it. # This is used when we just want a plain string to pass to our dialog for it to # display in the UI, and we will later pass it to bzr for parsing. If you want # breezy to parse and pass a revisionspec object, just pass the string # 'revision' as normal. simple_revision_option = Option("revision", short_name='r', type=str, help='See "help revisionspec" for details.') def brz_option(cmd_name, opt_name): """Helper so we can 'borrow' options from brz itself without needing to duplicate the help text etc. Pass the builtin bzr command name and an option name. eg: takes_options = [brz_option("push", "create-prefix")] would give a command the exact same '--create-prefix' option as bzr's push command has, including help text, parsing, etc. """ from breezy.commands import get_cmd_object cmd = get_cmd_object(cmd_name, False) return cmd.options()[opt_name] class cmd_qannotate(QBzrCommand): """Show the origin of each line in a file.""" takes_args = ['filename'] takes_options = ['revision', Option('encoding', type=check_encoding, help='Encoding of files content (default: utf-8).'), ui_mode_option, Option('no-graph', help="Shows the log with no graph."), Option('line', short_name='L', type=int, argname='N', param_name='activate_line', help='Activate line N on start.'), ] aliases = ['qann', 'qblame'] def _load_branch(self, filename, revision): """To assist in getting a UI up as soon as possible, the UI calls back to this function to process the command-line args and convert them into the branch and tree etc needed by the UI. """ wt, branch, relpath = ControlDir.open_containing_tree_or_branch(filename) if wt is not None: wt.lock_read() else: branch.lock_read() try: if revision is None: if wt is not None: tree = wt else: tree = branch.repository.revision_tree(branch.last_revision()) elif len(revision) != 1: raise errors.BzrCommandError('brz qannotate --revision takes exactly 1 argument') else: tree = branch.repository.revision_tree(revision_id = revision[0].in_history(branch).rev_id) file_id = tree.path2id(relpath) if file_id is None: raise errors.NotVersionedError(filename) [(path, entry)] = list(tree.iter_entries_by_dir(specific_files=[relpath])) if entry.kind != 'file': raise errors.BzrCommandError('brz qannotate only works for files (got %r)' % entry.kind) # repo = branch.repository # w = repo.weave_store.get_weave(file_id, repo.get_transaction()) # content = list(w.annotate_iter(entry.revision)) # revision_ids = set(o for o, t in content) # revision_ids = [o for o in revision_ids if repo.has_revision(o)] # revisions = branch.repository.get_revisions(revision_ids) finally: if wt is not None: wt.unlock() else: branch.unlock() return branch, tree, wt, relpath, file_id def _qbrz_run(self, filename=None, revision=None, encoding=None, ui_mode=False, no_graph=False, activate_line=None): win = AnnotateWindow(None, None, None, None, None, encoding=encoding, ui_mode=ui_mode, loader=self._load_branch, loader_args=(filename, revision), no_graph=no_graph, activate_line=activate_line) win.show() self._application.exec_() class cmd_qadd(QBzrCommand): """GUI for adding files or directories.""" takes_args = ['selected*'] takes_options = [ui_mode_option] def _qbrz_run(self, selected_list=None, ui_mode=False): tree, selected_list = WorkingTree.open_containing_paths(selected_list) if 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_() class cmd_qrevert(QBzrCommand): """Revert changes files.""" takes_args = ['selected*'] takes_options = [ui_mode_option, brz_option('revert', 'no-backup')] def _qbrz_run(self, selected_list=None, ui_mode=False, no_backup=False): tree, selected_list = WorkingTree.open_containing_paths(selected_list) if selected_list == ['']: selected_list = None self.main_window = RevertWindow(tree, selected_list, dialog=False, ui_mode=ui_mode, backup=not no_backup) self.main_window.show() self._application.exec_() class cmd_qconflicts(QBzrCommand): """Show conflicts.""" takes_args = [] takes_options = [] aliases = ['qresolve'] def _qbrz_run(self): from breezy.plugins.qbrz.lib.conflicts import ConflictsWindow self.main_window = ConflictsWindow(CUR_DIR) self.main_window.show() self._application.exec_() class cmd_qbrowse(QBzrCommand): """Show inventory or working tree.""" takes_args = ['location?'] takes_options = ['revision'] aliases = ['qbw'] def _qbrz_run(self, revision=None, location=None): Branch.open_containing(location or '.') # if there is no branch we want NotBranchError raised if revision is None: self.win = BrowseWindow(location=location) else: self.win = BrowseWindow(location=location, revision=revision[0]) self.win.show() self._application.exec() class cmd_qcommit(QBzrCommand): """GUI for committing revisions.""" takes_args = ['selected*'] takes_options = [ brz_option('commit', 'message'), brz_option('commit', 'local'), brz_option('commit', 'file'), Option('file-encoding', type=check_encoding, help='Encoding of commit message file content.'), ui_mode_option, ] aliases = ['qci'] def _qbrz_run(self, selected_list=None, message=None, file=None, local=False, ui_mode=False, file_encoding=None): if message is not None and file: raise errors.BzrCommandError("please specify either --message or --file") if file: with open(file) as f: message = f.read().decode(file_encoding or osutils.get_user_encoding()) tree, selected_list = WorkingTree.open_containing_paths(selected_list) if 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() self._application.exec_() class cmd_qdiff(QBzrCommand, DiffArgProvider): """Show differences in working tree in a GUI window.""" takes_args = ['file*'] takes_options = [ 'revision', Option('complete', help='Show complete files.'), Option('encoding', type=check_encoding, help='Encoding of files content (default: utf-8).'), Option('added', short_name='A', help='Show diff for added files.'), Option('deleted', short_name='K', help='Show diff for deleted files.'), Option('modified', short_name='M', help='Show diff for modified files.'), Option('renamed', short_name='R', help='Show diff for renamed files.'), Option('ignore-whitespace', short_name='w', help="Ignore whitespace when finding differences"), brz_option('diff', 'old'), brz_option('diff', 'new'), ] if 'change' in Option.OPTIONS: takes_options.append('change') aliases = ['qdi'] def get_diff_window_args(self, processEvents, es): args = {} (args["old_tree"], args["new_tree"], args["old_branch"], args["new_branch"], args["specific_files"], _) = get_trees_and_branches_to_diff_locked(self.file_list, self.revision, self.old, self.new, es) args["ignore_whitespace"] = self.ignore_whitespace return args def get_ext_diff_args(self, processEvents): args = [] if self.revision and len(self.revision) == 1: args.append("-r%s" % (self.revision[0].user_spec,)) elif self.revision and len(self.revision) == 2: args.append("-r%s..%s" % (self.revision[0].user_spec, self.revision[1].user_spec)) if self.new and not self.new == CUR_DIR: args.append("--new=%s" % self.new) if self.old and not self.old == CUR_DIR: args.append("--old=%s" % self.old) if self.file_list: args.extend(self.file_list) return None, args def _qbrz_run(self, revision=None, file_list=None, complete=False, encoding=None, ignore_whitespace=False, added=None, deleted=None, modified=None, renamed=None, old=None, new=None, ui_mode=False): if revision and len(revision) > 2: raise errors.BzrCommandError('brz qdiff --revision takes exactly one or two revision specifiers') # changes filter filter_options = FilterOptions(added=added, deleted=deleted, modified=modified, renamed=renamed) if not (added or deleted or modified or renamed): # if no filter option used then turn all on filter_options.all_enable() self.revision = revision self.file_list = file_list self.old = old self.new = new self.ignore_whitespace = ignore_whitespace window = DiffWindow(self, complete=complete, encoding=encoding, filter_options=filter_options, ui_mode=ui_mode) window.show() self._application.exec_() class cmd_qlog(QBzrCommand): """Show log of a repository, branch, file, or directory in a Qt window. By default show the log of the branch containing the working directory. If multiple files are speciffied, they must be from the same branch. :Examples: Log the current branch:: bzr qlog Log of files:: bzr qlog foo.c bar.c Log from different branches:: bzr qlog ~/branch1 ~/branch2 """ takes_args = ['locations*'] takes_options = [ ui_mode_option, Option('no-graph', help="Shows the log with no graph."), Option('show-trees', help="Show working trees that have changes as nodes in the graph"), ] def _qbrz_run(self, locations_list=None, ui_mode=False, no_graph=False, show_trees=False): window = LogWindow(locations_list, None, None, ui_mode=ui_mode, no_graph=no_graph, show_trees=show_trees) window.show() self._application.exec_() class cmd_qconfig(QBzrCommand): """Configure Bazaar and QBzr.""" takes_args = [] takes_options = [] aliases = ['qconfigure'] def _qbrz_run(self): window = QBzrConfigWindow() window.show() self._application.exec_() class cmd_qcat(QBzrCommand): """View the contents of a file as of a given revision. If no revision is nominated, the last revision is used. """ takes_options = [ 'revision', Option('encoding', type=check_encoding, help='Encoding of files content (default: utf-8).'), Option('native', help='Show file with native application.'), ] takes_args = ['filename'] def _qbrz_run(self, filename, revision=None, encoding=None, native=None): if revision is not None and len(revision) != 1: raise errors.BzrCommandError("brz qcat --revision takes exactly one revision specifier") if native: branch, relpath = Branch.open_containing(filename) if revision is None: tree = branch.basis_tree() else: revision_id = revision[0].in_branch(branch).rev_id tree = branch.repository.revision_tree(revision_id) result = cat_to_native_app(tree, relpath) return int(not result) window = QBzrCatWindow(filename = filename, revision = revision, encoding = encoding) window.show() self._application.exec_() class cmd_qpull(QBzrCommand): """Turn this branch into a mirror of another branch.""" takes_options = [ 'remember', 'overwrite', simple_revision_option, brz_option('pull', 'directory'), ui_mode_option, ] takes_args = ['location?'] def _qbrz_run(self, location=None, directory=None, remember=None, overwrite=None, revision=None, ui_mode=False): if directory is None: directory = CUR_DIR try: tree_to = WorkingTree.open_containing(directory)[0] branch_to = tree_to.branch except errors.NoWorkingTree: tree_to = None branch_to = Branch.open_containing(directory)[0] self.main_window = QBzrPullWindow(branch_to, tree_to, location, remember=remember, overwrite=overwrite, revision=revision, ui_mode=ui_mode) self.main_window.show() self._application.exec_() class cmd_qmerge(QBzrCommand): """Perform a three-way merge.""" takes_options = [ui_mode_option, simple_revision_option, brz_option('merge', 'directory'), brz_option('merge', 'force'), brz_option('merge', 'uncommitted'), 'remember'] takes_args = ['location?'] def _qbrz_run(self, location=None, directory=None, revision=None, remember=None, force=None, uncommitted=None, ui_mode=False): if directory is None: directory = CUR_DIR try: tree_to = WorkingTree.open_containing(directory)[0] branch_to = tree_to.branch except errors.NoWorkingTree: tree_to = None branch_to = Branch.open_containing(directory)[0] self.main_window = QBzrMergeWindow(branch_to, tree_to, location, revision=revision, remember=remember, force=force, uncommitted=uncommitted, ui_mode=ui_mode) self.main_window.show() self._application.exec_() class cmd_qpush(QBzrCommand): """Update a mirror of this branch.""" takes_options = ['remember', 'overwrite', brz_option("push", "create-prefix"), brz_option("push", "use-existing-dir"), brz_option("push", "directory"), ui_mode_option] takes_args = ['location?'] def _qbrz_run(self, location=None, directory=None, remember=None, overwrite=None, create_prefix=None, use_existing_dir=None, ui_mode=False): if directory is None: directory = CUR_DIR try: tree_to = WorkingTree.open_containing(directory)[0] branch_to = tree_to.branch except errors.NoWorkingTree: tree_to = None branch_to = Branch.open_containing(directory)[0] self.main_window = QBzrPushWindow(branch_to, tree_to, location=location, create_prefix=create_prefix, use_existing_dir=use_existing_dir, remember=remember, overwrite=overwrite, ui_mode=ui_mode) self.main_window.show() self._application.exec_() class cmd_qbranch(QBzrCommand): """Create a new copy of a branch.""" takes_options = [simple_revision_option, ui_mode_option] try: takes_options.append(brz_option("branch", "bind")) except KeyError: # older version of bzr that doesn't support the option pass takes_args = ['from_location?', 'to_location?'] def _qbrz_run(self, from_location=None, to_location=None, revision=None, bind=False, ui_mode=False): self.main_window = QBzrBranchWindow(from_location, to_location, revision=revision, bind=bind, ui_mode=ui_mode) self.main_window.show() self._application.exec_() class cmd_qinfo(QBzrCommand): """Shows information about the current location.""" takes_options = [] takes_args = ['location?'] def _qbrz_run(self, location=CUR_DIR): window = QBzrInfoWindow(location) window.show() self._application.exec_() class cmd_qverify_signatures(QBzrCommand): """Shows digital signature statuses for branch commits""" takes_options = [ Option('acceptable-keys', help='Comma separated list of GPG key patterns which are acceptable for verification.', short_name='k', type=str,), 'revision', ] takes_args = ['location?'] def _qbrz_run(self, acceptable_keys=None, revision=None, location=CUR_DIR): if gpg.GPGStrategy.verify_signatures_available(): window = QBzrVerifySignaturesWindow(acceptable_keys, revision, location) window.show() self._application.exec_() else: raise errors.DependencyNotPresent("python-gpgme", "python-gpgme not installed") class cmd_qinit(QBzrCommand): """Initializes a new branch or shared repository.""" takes_options = [ui_mode_option] takes_args = ['location?'] def _qbrz_run(self, location=CUR_DIR, ui_mode=False): self.main_window = QBzrInitWindow(location, ui_mode=ui_mode) self.main_window.show() self._application.exec_() class cmd_merge(breezy.builtins.cmd_merge, DiffArgProvider): __doc__ = breezy.builtins.cmd_merge.__doc__ takes_options = breezy.builtins.cmd_merge.takes_options + [ Option('qpreview', help='Instead of merging, show a diff of the merge in a GUI window.'), Option('encoding', type=check_encoding, help='Encoding of files content, used with --qpreview (default: utf-8).'), ] def run(self, *args, **kw): self.qpreview = ('qpreview' in kw) if self.qpreview: kw['preview'] = kw['qpreview'] del kw['qpreview'] self._encoding = kw.get('encoding') if self._encoding: del kw['encoding'] return breezy.builtins.cmd_merge.run(self, *args, **kw) def get_diff_window_args(self, processEvents, es): tree_merger = self.merger.make_merger() self.tt = tree_merger.make_preview_transform() result_tree = self.tt.get_preview_tree() return {"old_tree": self.merger.this_tree, "new_tree": result_tree} @install_gettext @report_missing_pyqt def _do_qpreview(self, merger): # Set up global execption handeling. from breezy.plugins.qbrz.lib.trace import excepthook sys.excepthook = excepthook self.merger = merger try: window = DiffWindow(self, encoding=self._encoding) window.show() self._application.exec_() finally: if self.tt: self.tt.finalize() def _do_preview(self, merger, *args, **kw): if self.qpreview: self._do_qpreview(merger) else: breezy.builtins.cmd_merge._do_preview(self, merger, *args, **kw) class cmd_qmain(QBzrCommand): """The QBzr main application. Not finished -- DON'T USE """ takes_options = [] takes_args = [] hidden = True def _qbrz_run(self): # Remove svn checkout support try: from breezy.plugins.svn.format import SvnWorkingTreeDirFormat except ImportError: pass else: from breezy.controldir import ControlDirFormat, format_registry ControlDirFormat.unregister_control_format(SvnWorkingTreeDirFormat) format_registry.remove('subversion-wc') # Start QBzr window = QBzrMainWindow() window.setDirectory(osutils.realpath(CUR_DIR)) window.show() self._application.exec_() # [bialix 2010/02/04] body of cmd_qsubprocess has moved to subprocess.py # to see annotation of cmd_qsubprocess before move use: # bzr qannotate commands.py -r1117 class cmd_qsubprocess(Command): """Run some bzr command as subprocess. Used with most of subprocess-based dialogs of QBzr. If CMD argument starts with @ characters then it used as name of file with actual cmd string (in utf-8). With --bencode option cmd string interpreted as bencoded list of utf-8 strings. This is the recommended way to launch qsubprocess. """ takes_args = ['cmd'] takes_options = [Option("bencoded", help="Pass command as bencoded string.")] hidden = True def run(self, cmd, bencoded=False): from breezy.plugins.qbrz.lib.subprocess import run_subprocess_command return run_subprocess_command(cmd, bencoded) class cmd_qgetupdates(QBzrCommand): """Fetches external changes into the working tree.""" takes_args = ['location?'] takes_options = [ui_mode_option, execute_option] aliases = ['qgetu', 'qgetup'] def _qbrz_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_lightweight_checkout(): window = QBzrUpdateWindow(tb.tree, ui_mode, immediate=execute) elif tb.is_bound(): window = UpdateCheckoutWindow(tb.branch, ui_mode=ui_mode) else: window = UpdateBranchWindow(tb.branch, ui_mode=ui_mode) self.main_window = window self.main_window.show() self._application.exec_() class cmd_qgetnew(QBzrCommand): """Creates a new working tree (either a checkout or full branch).""" takes_args = ['location?'] takes_options = [ui_mode_option] aliases = ['qgetn'] def _qbrz_run(self, location=None, ui_mode=False): from breezy.plugins.qbrz.lib.getnew import GetNewWorkingTreeWindow self.main_window = GetNewWorkingTreeWindow(location, ui_mode=ui_mode) self.main_window.show() self._application.exec_() class cmd_qhelp(QBzrCommand): """Shows a help window""" takes_args = ['topic'] # until we get links and better HTML out of 'topics', this is hidden. hidden = True def _qbrz_run(self, topic): show_help(topic) self._application.exec_() class cmd_qtag(QBzrCommand): """Edit tags.""" takes_args = ['tag_name?'] takes_options = [ ui_mode_option, brz_option('tag', 'delete'), brz_option('tag', 'directory'), brz_option('tag', 'force'), 'revision', ] def _qbrz_run(self, tag_name=None, delete=None, directory=CUR_DIR, force=None, revision=None, ui_mode=False): branch = Branch.open_containing(directory)[0] # determine action based on given options action = TagWindow.action_from_options(force=force, delete=delete) self.main_window = TagWindow(branch, tag_name=tag_name, action=action, revision=revision, ui_mode=ui_mode) self.main_window.show() self._application.exec_() class cmd_quncommit(QBzrCommand): """Move the tip of a branch to an earlier revision.""" takes_options = [ ui_mode_option, ] takes_args = ["location?"] def _qbrz_run(self, location=CUR_DIR, ui_mode=False): window = QBzrUncommitWindow(location, ui_mode=ui_mode) window.show() self._application.exec_() class cmd_qviewer(QBzrCommand): """Simple file viewer.""" aliases = [] takes_args = ['filename'] takes_options = [ Option('encoding', type=check_encoding, help='Encoding of file content (default: utf-8).'), ] _see_also = ['qcat'] def _qbrz_run(self, filename, encoding=None): window = QBzrViewWindow(filename=filename, encoding=encoding) window.show() self._application.exec_() class cmd_qversion(QBzrCommand): """Show version/system information.""" takes_args = [] takes_options = [] aliases = [] def _qbrz_run(self): from breezy.plugins.qbrz.lib.sysinfo import QBzrSysInfoWindow window = QBzrSysInfoWindow() window.show() self._application.exec_() class cmd_qplugins(QBzrCommand): """Show information about installed plugins.""" takes_args = [] takes_options = [] aliases = [] def _qbrz_run(self): from breezy.plugins.qbrz.lib.plugins import QBzrPluginsWindow window = QBzrPluginsWindow() window.show() self._application.exec_() class cmd_qupdate(QBzrCommand): """Update working tree with latest changes in the branch.""" aliases = ['qup'] takes_args = ['directory?'] takes_options = [ui_mode_option, execute_option] def _qbrz_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, execute) self.main_window.show() self._application.exec_() class cmd_qsend(QBzrCommand): """Mail or create a merge-directive for submitting changes.""" takes_args = ['submit_branch?', 'public_branch?'] takes_options = [ui_mode_option] def _qbrz_run(self, submit_branch=CUR_DIR, public_branch=None, ui_mode=False): branch = Branch.open_containing(submit_branch)[0] window = SendWindow(branch, ui_mode) window.show() self._application.exec_() class cmd_qswitch(QBzrCommand): """Set the branch of a checkout and update.""" takes_args = ['location?'] takes_options = [ui_mode_option] def _qbrz_run(self, location=None, ui_mode=False): from breezy.plugins.qbrz.lib.switch import QBzrSwitchWindow branch = Branch.open_containing(CUR_DIR)[0] controldir = ControlDir.open_containing(CUR_DIR)[0] self.main_window = QBzrSwitchWindow(branch, controldir, location, ui_mode) self.main_window.show() self._application.exec_() class cmd_qunbind(QBzrCommand): """Convert the current checkout into a regular branch.""" takes_options = [ui_mode_option, execute_option] def _qbrz_run(self, ui_mode=False, execute=False): from breezy.plugins.qbrz.lib.unbind import QBzrUnbindDialog branch = Branch.open_containing(CUR_DIR)[0] if branch.get_bound_location() is None: raise errors.BzrCommandError("This branch is not bound.") self.main_window = QBzrUnbindDialog(branch, ui_mode, execute) self.main_window.show() self._application.exec_() class cmd_qexport(QBzrCommand): """Export current or past revision to a destination directory or archive. DEST is the destination file or dir where the branch will be exported. If BRANCH_OR_SUBDIR is omitted then the branch containing the current working directory will be used. """ takes_args = ['dest?','branch_or_subdir?'] takes_options = [ui_mode_option] def _qbrz_run(self, dest=None, branch_or_subdir=None, ui_mode=False): from breezy.plugins.qbrz.lib.export import QBzrExportDialog if branch_or_subdir is None: branch = Branch.open_containing(CUR_DIR)[0] else: branch = Branch.open_containing(branch_or_subdir)[0] window = QBzrExportDialog(dest, branch, ui_mode) window.show() self._application.exec_() class cmd_qbind(QBzrCommand): """Convert the current branch into a checkout of the supplied branch. LOCATION is the branch where you want to bind your current branch. """ takes_args = ['location?'] takes_options = [ui_mode_option] def _qbrz_run(self, location=None, ui_mode=False): from breezy.plugins.qbrz.lib.bind import QBzrBindDialog branch = Branch.open_containing(CUR_DIR)[0] self.main_window = QBzrBindDialog(branch, location, ui_mode) self.main_window.show() self._application.exec_() class cmd_qrun(QBzrCommand): """Run arbitrary bzr command. If you wish to pass options to COMMAND, use ``--`` beforehand so that the options aren't treated as options to the qrun command itself. For example:: bzr qrun shelve -- --list NOTE: you should use only canonical name of the COMMAND, not the alias. """ takes_args = ['command?', 'parameters*'] takes_options = [ui_mode_option, Option('directory', help='Working directory.', short_name='d', type=str, ), Option('category', help='Initial category selection.', type=str, ), execute_option, ] aliases = ['qcmd'] def _qbrz_run(self, command=None, parameters_list=None, ui_mode=False, directory=None, category=None, execute=False): from breezy.plugins.qbrz.lib.run import QBzrRunDialog if parameters_list: def quote_spaces(s): if " " in s: s = '"%s"' % s return s parameters = " ".join([quote_spaces(i) for i in parameters_list]) else: parameters = None if not command: execute = False window = QBzrRunDialog(command=command, parameters=parameters, workdir=directory, category=category, ui_mode=ui_mode, execute=execute) window.show() self._application.exec_() class cmd_qshelve(QBzrCommand): """Shelve selected changes away.""" takes_args = ['file*'] takes_options = [ ui_mode_option, brz_option('shelve', 'list'), brz_option('shelve', 'directory'), brz_option('shelve', 'message'), Option('all', help='Select all changes.'), Option('complete', help='Show complete files.'), Option('ignore-whitespace', short_name='w', help="Ignore whitespace when finding differences.(Only work when --list specified)"), Option('encoding', type=check_encoding, help='Encoding of files content (default: utf-8).'), ] def _qbrz_run(self, file_list=None, list=False, directory=None, ui_mode=False, complete=False, ignore_whitespace=False, encoding=None, all=False, message=None): if list: initial_tab = 1 else: initial_tab = 0 self.main_window = ShelveWindow(file_list=file_list, directory=directory, ui_mode=ui_mode, initial_tab=initial_tab, complete=complete, ignore_whitespace=ignore_whitespace, encoding=encoding, select_all=all, message=message) self.main_window.show() self._application.exec_() class cmd_qunshelve(QBzrCommand): """Restore shalved changes.""" takes_options = [ ui_mode_option, brz_option('unshelve', 'directory'), Option('complete', help='Show complete files.'), Option('ignore-whitespace', short_name='w', help="Ignore whitespace when finding differences.(Only work when --list specified)"), Option('encoding', type=check_encoding, help='Encoding of files content (default: utf-8).'), ] def _qbrz_run(self, directory=None, ui_mode=False, complete=False, ignore_whitespace=False, encoding=None): self.main_window = ShelveWindow(directory=directory, ui_mode=ui_mode, initial_tab=1, complete=complete, ignore_whitespace=ignore_whitespace, encoding=encoding) self.main_window.show() self._application.exec_() class cmd_qignore(QBzrCommand): """Ignore files or patterns.""" takes_args = [] takes_options = [ ui_mode_option, brz_option('ignore', 'directory'), ] aliases = [] def _qbrz_run(self, directory=None, ui_mode=False): from breezy.plugins.qbrz.lib.ignore import IgnoreWindow wt = WorkingTree.open_containing(directory)[0] self.main_window = IgnoreWindow(tree=wt, ui_mode=ui_mode) self.main_window.show() self._application.exec_() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/commit.py0000644000000000000000000007710714556556456013266 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2006-2007 Lukáš Lalinský # Copyright (C) 2006 Trolltech ASA # Copyright (C) 2006 Jelmer Vernooij # # 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. import os.path from PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.subprocess import SubProcessDialog from breezy.plugins.qbrz.lib.util import ( BTN_REFRESH, file_extension, get_global_config, get_qbrz_config, url_for_display, ThrobberWidget, runs_in_loading_queue, StandardButton, InfoWidget, ) from breezy.plugins.qbrz.lib.logwidget import LogList from breezy.plugins.qbrz.lib.uifactory import ui_current_widget from breezy.plugins.qbrz.lib.trace import reports_exception from breezy import errors from breezy.plugins.qbrz.lib.spellcheck import SpellCheckHighlighter, SpellChecker from breezy.plugins.qbrz.lib.autocomplete import get_wordlist_builder from breezy.plugins.qbrz.lib.commit_data import QBzrCommitData from breezy.plugins.qbrz.lib.diff import (DiffButtons, show_diff, InternalWTDiffArgProvider) from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib import logmodel from breezy.plugins.qbrz.lib.loggraphviz import BranchInfo from breezy.plugins.qbrz.lib.treewidget import (TreeWidget, SelectAllCheckBox, ChangeDescription, FilterModelKeys) from breezy.plugins.qbrz.lib.revisionview import RevisionView from breezy.plugins.qbrz.lib.update import QBzrUpdateWindow MAX_AUTOCOMPLETE_FILES = 20 class TextEdit(QtWidgets.QTextEdit): messageEntered = QtCore.pyqtSignal() def __init__(self, spell_checker, parent=None, main_window=None): QtWidgets.QTextEdit.__init__(self, parent) # RJL The completer, I think, is to provide suggestions for anything typed self.context_tc = None self.completer = None self.spell_checker = spell_checker # RJL eow = 'end of word'? self.eow = "~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-=" self.main_window = main_window def inputMethodEvent(self, e): self.completer.popup().hide() QtWidgets.QTextEdit.inputMethodEvent(self, e) def keyPressEvent(self, e): c = self.completer e_key = e.key() if (e_key in (QtCore.Qt.Key_Tab, QtCore.Qt.Key_Backtab) or (c.popup().isVisible() and e_key in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return, QtCore.Qt.Key_Escape))): e.ignore() return if (self.main_window and e_key in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return) and (int(e.modifiers()) & QtCore.Qt.ControlModifier)): e.ignore() self.messageEntered.emit() return isShortcut = e.modifiers() & QtCore.Qt.ControlModifier and e.key() == QtCore.Qt.Key_E if not isShortcut: QtWidgets.QTextEdit.keyPressEvent(self, e) ctrlOrShift = e.modifiers() & (QtCore.Qt.ControlModifier | QtCore.Qt.ShiftModifier) if ctrlOrShift and not e.text(): return hasModifier = (e.modifiers() != QtCore.Qt.NoModifier) and not ctrlOrShift completionPrefix = self.textUnderCursor() # RJL I *think* this is trying to find out whether to hide or display a list # of possible completions. right() is a QString method that: # # Returns a substring that contains the n rightmost characters of the string. # The entire string is returned if n is greater than size() or less than zero. # QString x = "Pineapple"; # QString y = x.right(5); // y == "apple" # # or simply x[-5:] in the land of Python, .right(1) is the last letter # which is e.text()[-1:] if not isShortcut and (hasModifier or not e.text() or len(completionPrefix) < 2 or e.text()[-1:] in self.eow): c.popup().hide() return if completionPrefix != c.completionPrefix(): c.setCompletionPrefix(completionPrefix) c.popup().setCurrentIndex(c.completionModel().index(0, 0)) cr = self.cursorRect() cr.setWidth(c.popup().sizeHintForColumn(0) + c.popup().verticalScrollBar().sizeHint().width()) c.complete(cr) def textUnderCursor(self): tc = self.textCursor() tc.select(QtGui.QTextCursor.WordUnderCursor) return tc.selectedText() def insertCompletion(self, completion): tc = self.textCursor() extra = len(completion) - len(self.completer.completionPrefix()) tc.movePosition(QtGui.QTextCursor.Left) tc.movePosition(QtGui.QTextCursor.EndOfWord) # We want the right-most 'extra' letters # tc.insertText(completion.right(extra)) tc.insertText(completion[-extra:]) self.setTextCursor(tc) def setCompleter(self, completer): self.completer = completer completer.setWidget(self) completer.setCaseSensitivity(QtCore.Qt.CaseSensitive) completer.activated['QString'].connect(self.insertCompletion) def contextMenuEvent(self, event): menu = self.createStandardContextMenu(event.globalPos()) self.context_tc = self.cursorForPosition(event.pos()) self.context_tc.movePosition(QtGui.QTextCursor.StartOfWord) self.context_tc.movePosition(QtGui.QTextCursor.EndOfWord, QtGui.QTextCursor.KeepAnchor) text = str(self.context_tc.selectedText()) if list(self.spell_checker.check(text)): suggestions = self.spell_checker.suggest(text) first_action = menu.actions()[0] for suggestion in suggestions: action = QtWidgets.QAction(suggestion, self) action.triggered[bool].connect(self.suggestion_selected(suggestion)) menu.insertAction(first_action, action) if suggestions: menu.insertSeparator(first_action) menu.exec_(event.globalPos()) event.accept() def suggestion_selected(self, text): def _suggestion_selected(b): self.context_tc.insertText(text) return _suggestion_selected class PendingMergesList(LogList): def __init__(self, *args, **kargs): super().__init__(*args, **kargs) # The rev numbers are currently bogus. Hide that column. # We could work out the revision numbers by loading whole graph, but # that is going to make this much slower. self.header().hideSection(0) self.log_model.last_rev_is_placeholder = True def load_tree(self, tree): bi = BranchInfo('', tree, tree.branch) self.log_model.load((bi,), bi, None, False, logmodel.PendingMergesGraphVizLoader) def create_context_menu(self, file_ids): super().create_context_menu(file_ids) showinfo = QtWidgets.QAction("Show &information...", self) self.context_menu.insertAction(self.context_menu.actions()[0], showinfo) self.context_menu.setDefaultAction(showinfo) showinfo.triggered[bool].connect(self.show_info_menu) def show_info_menu(self, b=False): self.default_action() def default_action(self, index=None): """Show information of a single revision from a index.""" if index is None: index = self.currentIndex() # XXX We should make this show all selected revisions... revid = index.data(logmodel.RevIdRole) branch = self.log_model.graph_viz.get_revid_branch(revid) parent_window = self.window() window = RevisionView(revid, branch, parent=parent_window) window.show() parent_window.windows.append(window) def ignore_pattern_handler(change_description: ChangeDescription): return not change_description.ignored_pattern() class CommitWindow(SubProcessDialog): RevisionIdRole = QtCore.Qt.UserRole + 1 ParentIdRole = QtCore.Qt.UserRole + 2 def __init__(self, tree, selected_list, dialog=True, parent=None, local=None, message=None, ui_mode=True): super().__init__(gettext("Commit"), name="commit", default_size=(540, 540), ui_mode=ui_mode, dialog=dialog, parent=parent) self.is_loading = False self.tree = tree self.ci_data = QBzrCommitData(tree=tree) self.ci_data.load() self.is_bound = bool(tree.branch.get_bound_location()) self.has_pending_merges = len(tree.get_parent_ids()) > 1 if self.has_pending_merges and selected_list: raise errors.CannotCommitSelectedFileMerge(selected_list) self.windows = [] self.initial_selected_list = selected_list self.process_widget.failed['QString'].connect(self.on_failed) self.throbber = ThrobberWidget(self) # commit to branch location branch_groupbox = QtWidgets.QGroupBox(gettext("Branch"), self) branch_layout = QtWidgets.QGridLayout(branch_groupbox) self.branch_location = QtWidgets.QLineEdit() self.branch_location.setReadOnly(True) # branch_base = url_for_display(tree.branch.base) 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, 0, 0, 1, 2) else: self.local_checkbox = QtWidgets.QCheckBox(gettext("&Local commit")) self.local_checkbox.setToolTip(gettext("Local commits are not pushed to the master branch until a normal commit is performed")) branch_layout.addWidget(self.local_checkbox, 0, 0, 1, 2) branch_layout.addWidget(self.branch_location, 1, 0, 1, 2) branch_layout.addWidget(QtWidgets.QLabel(gettext('Description:')), 2, 0, QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) self.commit_type_description = QtWidgets.QLabel() self.commit_type_description.setWordWrap(True) branch_layout.addWidget(self.commit_type_description, 2, 1) branch_layout.setColumnStretch(1,10) self.local_checkbox.stateChanged[int].connect(self.update_branch_groupbox) 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 = QtWidgets.QHBoxLayout(self.not_uptodate_info) # XXX this is to big. Resize not_uptodate_icon = QtWidgets.QLabel() not_uptodate_icon.setPixmap(self.style().standardPixmap(QtWidgets.QStyle.SP_MessageBoxWarning)) not_uptodate_layout.addWidget(not_uptodate_icon) self.not_uptodate_label = QtWidgets.QLabel('error message goes here') not_uptodate_layout.addWidget(self.not_uptodate_label, 2) update_button = QtWidgets.QPushButton(gettext('Update')) update_button.clicked[bool].connect(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 = QtWidgets.QSplitter(QtCore.Qt.Vertical, self) message_groupbox = QtWidgets.QGroupBox(gettext("Message"), splitter) splitter.addWidget(message_groupbox) self.tabWidget = QtWidgets.QTabWidget() splitter.addWidget(self.tabWidget) splitter.setStretchFactor(0, 1) splitter.setStretchFactor(1, 8) grid = QtWidgets.QGridLayout(message_groupbox) self.show_nonversioned_checkbox = QtWidgets.QCheckBox(gettext("Show non-versioned files")) show_nonversioned = get_qbrz_config().get_option_as_bool(self._window_name + "_show_nonversioned") if show_nonversioned: self.show_nonversioned_checkbox.setChecked(True) else: self.show_nonversioned_checkbox.setChecked(False) self.filelist_widget = TreeWidget(self) self.filelist_widget.throbber = self.throbber if show_nonversioned: self.filelist_widget.tree_model.set_select_all_kind('all') else: self.filelist_widget.tree_model.set_select_all_kind('versioned') self.file_words = {} self.filelist_widget.tree_model.dataChanged[QtCore.QModelIndex, QtCore.QModelIndex].connect(self.on_filelist_data_changed) self.selectall_checkbox = SelectAllCheckBox(self.filelist_widget, self) self.selectall_checkbox.setCheckState(QtCore.Qt.Checked) language = get_global_config().get_user_option('spellcheck_language') or 'en' spell_checker = SpellChecker(language) # Equivalent for 'bzr commit --message' self.message = TextEdit(spell_checker, message_groupbox, main_window=self) self.message.setToolTip(gettext("Enter the commit message")) self.message.messageEntered.connect(self.do_accept) self.completer = QtWidgets.QCompleter() self.completer_model = QtCore.QStringListModel(self.completer) self.completer.setModel(self.completer_model) self.message.setCompleter(self.completer) self.message.setAcceptRichText(False) SpellCheckHighlighter(self.message.document(), spell_checker) grid.addWidget(self.message, 0, 0, 1, 2) # Equivalent for 'bzr commit --fixes' self.bugsCheckBox = QtWidgets.QCheckBox(gettext("&Fixed bugs:")) self.bugsCheckBox.setToolTip(gettext("Set the IDs of bugs fixed by this commit")) self.bugs = QtWidgets.QLineEdit() self.bugs.setToolTip(gettext("Enter the list of bug IDs in format " "tag:id separated by a space, " "e.g. project:123 project:765")) self.bugs.setEnabled(False) self.bugsCheckBox.stateChanged[int].connect(self.enableBugs) grid.addWidget(self.bugsCheckBox, 1, 0) grid.addWidget(self.bugs, 1, 1) # Equivalent for 'bzr commit --author' self.authorCheckBox = QtWidgets.QCheckBox(gettext("&Author:")) self.authorCheckBox.setToolTip(gettext("Set the author of this change," " if it's different from the committer")) self.author = QtWidgets.QLineEdit() self.author.setToolTip(gettext("Enter the author's name, " "e.g. John Doe <jdoe@example.com>")) self.author.setEnabled(False) self.authorCheckBox.stateChanged[int].connect(self.enableAuthor) grid.addWidget(self.authorCheckBox, 2, 0) grid.addWidget(self.author, 2, 1) # default author from config config = self.tree.branch.get_config() self.default_author = config.username() self.custom_author = '' self.author.setText(self.default_author) # Display the list of changed files files_tab = QtWidgets.QWidget() self.tabWidget.addTab(files_tab, gettext("Changes")) vbox = QtWidgets.QVBoxLayout(files_tab) vbox.addWidget(self.filelist_widget) self.show_nonversioned_checkbox.toggled[bool].connect(self.show_nonversioned) vbox.addWidget(self.show_nonversioned_checkbox) vbox.addWidget(self.selectall_checkbox) # Display a list of pending merges if self.has_pending_merges: self.selectall_checkbox.setCheckState(QtCore.Qt.Checked) self.selectall_checkbox.setEnabled(False) self.pending_merges_list = PendingMergesList(self.processEvents, self.throbber, self) self.tabWidget.addTab(self.pending_merges_list,gettext("Pending Merges")) self.tabWidget.setCurrentWidget(self.pending_merges_list) # Pending-merge widget gets disabled as we are executing. self.disableUi[bool].connect(self.pending_merges_list.setDisabled) else: self.pending_merges_list = None self.process_panel = self.make_process_panel() self.tabWidget.addTab(self.process_panel, gettext("Status")) splitter.setStretchFactor(0, 3) vbox = QtWidgets.QVBoxLayout(self) vbox.addWidget(self.throbber) vbox.addWidget(branch_groupbox) vbox.addWidget(splitter) # Diff button to view changes in files selected to commit self.diffbuttons = DiffButtons(self) self.diffbuttons.setToolTip(gettext("View changes in files selected to commit")) self.diffbuttons._triggered['QString'].connect(self.show_diff_for_checked) self.refresh_button = StandardButton(BTN_REFRESH) self.refresh_button.clicked.connect(self.refresh) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(self.diffbuttons) hbox.addWidget(self.refresh_button) hbox.addWidget(self.buttonbox) vbox.addLayout(hbox) # groupbox and tabbox signals handling. for w in (message_groupbox, files_tab): # when operation started we need to disable widgets self.disableUi[bool].connect(w.setDisabled) self.restore_commit_data() if message: self.message.setText(message) # Try to be smart: if there is no saved message # then set focus on Edit Area; otherwise on OK button. if str(self.message.toPlainText()).strip(): self.buttonbox.setFocus() else: self.message.setFocus() def show(self): # we show the bare form as soon as possible. SubProcessDialog.show(self) # QtCore.QTimer.singleShot(1, self.load) self.load() def exec_(self): # QtCore.QTimer.singleShot(1, self.load) self.load() return SubProcessDialog.exec_(self) @runs_in_loading_queue @ui_current_widget @reports_exception() def load(self, refresh=False): if refresh: self.throbber.show() self.refresh_button.setDisabled(True) try: with self.tree.lock_read(): if self.pending_merges_list: self.pending_merges_list.load_tree(self.tree) # Force the loading of the revisions, before we start # loading the file list. self.pending_merges_list._load_visible_revisions() self.processEvents() # filelist_widget is actually a TreeWidget and its model will be a TreeModel self.filelist_widget.tree_model.checkable = not self.pending_merges_list self.is_loading = True # XXX Would be nice if we could only load the files when the # user clicks on the changes tab, but that would mean that # we can't load the words list. if not refresh: want_unversioned = self.show_nonversioned_checkbox.isChecked() self.filelist_widget.tree_filter_model.setFilter(FilterModelKeys.UNVERSIONED, want_unversioned) if not want_unversioned and self.initial_selected_list: # if there are any paths from the command line that are not versioned, we want_unversioned. for path in self.initial_selected_list: if not self.tree.is_versioned(path): want_unversioned = True break # Now we call our old pal, TreeWidget::set_tree which goes away and calls TreeModel::set_tree self.filelist_widget.set_tree(self.tree, branch=self.tree.branch, changes_mode=True, want_unversioned=want_unversioned, initial_checked_paths=self.initial_selected_list, change_load_filter=ignore_pattern_handler) else: self.filelist_widget.refresh() self.is_loading = False self.processEvents() self.update_compleater_words() finally: self.throbber.hide() self.refresh_button.setDisabled(False) def refresh(self): self.load(True) def on_filelist_data_changed(self, start_index, end_index): self.update_compleater_words() def update_compleater_words(self): if self.is_loading: return num_files_loaded = 0 words = set() for ref in self.filelist_widget.tree_model.iter_checked(): path = ref.path if path not in self.file_words: file_words = set() if num_files_loaded < MAX_AUTOCOMPLETE_FILES: file_words.add(path) file_words.add(os.path.split(path)[-1]) change = self.filelist_widget.tree_model.inventory_data_by_path[ref.path].change if change and change.is_renamed(): file_words.add(change.oldpath()) file_words.add(os.path.split(change.oldpath())[-1]) # if num_versioned_files < MAX_AUTOCOMPLETE_FILES: ext = file_extension(path) builder = get_wordlist_builder(ext) if builder is not None: try: abspath = os.path.join(self.tree.basedir, path) file = open(abspath, 'rt') file_words.update(builder.iter_words(file)) self.processEvents() except EnvironmentError: pass self.file_words[path] = file_words num_files_loaded += 1 else: file_words = self.file_words[path] words.update(file_words) words = list(words) words.sort(key=lambda x: x.lower()) self.completer_model.setStringList(words) def enableBugs(self, state): if state == QtCore.Qt.Checked: self.bugs.setEnabled(True) self.bugs.setFocus(QtCore.Qt.OtherFocusReason) else: self.bugs.setEnabled(False) def enableAuthor(self, state): if state == QtCore.Qt.Checked: self.author.setEnabled(True) self.author.setText(self.custom_author) self.author.setFocus(QtCore.Qt.OtherFocusReason) else: self.author.setEnabled(False) self.custom_author = self.author.text() self.author.setText(self.default_author) def restore_commit_data(self): message = self.ci_data['message'] if message: self.message.setText(message) bug = self.ci_data['bugs'] if bug: self.bugs.setText(bug) self.bugs.setEnabled(True) self.bugsCheckBox.setChecked(True) def save_commit_data(self): if self.tree.branch.get_physical_lock_status() or self.tree.branch.is_locked(): # XXX maybe show this in a GUI MessageBox (information box)??? from breezy.trace import warning warning("Cannot save commit data because the branch is locked.") return # collect data ci_data = QBzrCommitData(tree=self.tree) message = str(self.message.toPlainText()).strip() if message: ci_data['message'] = message bug_str = '' if self.bugsCheckBox.isChecked(): bug_str = str(self.bugs.text()).strip() if bug_str: ci_data['bugs'] = bug_str # save only if data different if not ci_data.compare_data(self.ci_data, all_keys=False): ci_data.save() def wipe_commit_data(self): if self.tree.branch.get_physical_lock_status() or self.tree.branch.is_locked(): # XXX maybe show this in a GUI MessageBox (information box)??? from breezy.trace import warning warning("Cannot wipe commit data because the branch is locked.") return self.ci_data.wipe() def _get_message(self): return str(self.message.toPlainText()).strip() def _get_selected_files(self): """Return (has_files_to_commit[bool], files_to_commit[list], files_to_add[list])""" if self.has_pending_merges: return True, [], [] files_to_commit = [] files_to_add = [] for ref in self.filelist_widget.tree_model.iter_checked(): if ref.file_id is None: files_to_add.append(ref.path) files_to_commit.append(ref.path) if not files_to_commit: return False, [], [] else: return True, files_to_commit, files_to_add def validate(self): if not self._get_message(): self.operation_blocked(gettext("You should provide a commit message.")) self.message.setFocus() return False if not self._get_selected_files()[0]: if not self.ask_confirmation(gettext("No changes selected to commit.\nDo you want to commit anyway?")): return False return True def do_start(self): args = ["commit"] message = self._get_message() # AND we need to quote it... args.extend(['-m', message]) # keep them separated to avoid bug #297606 has_files_to_commit, files_to_commit, files_to_add = self._get_selected_files() if not has_files_to_commit: # Possible [rare] problems: # 1. unicode tree root in non-user encoding # may provoke UnicodeEncodeError in subprocess (@win32) # 2. if branch has no commits yet then operation may fail # because of bug #299879 args.extend(['--exclude', self.tree.basedir]) args.append('--unchanged') else: args.extend(files_to_commit) if self.bugsCheckBox.isChecked(): for s in str(self.bugs.text()).split(): args.append(("--fixes=%s" % s)) if self.authorCheckBox.isChecked(): args.append(("--author=%s" % str(self.author.text()))) if self.is_bound and self.local_checkbox.isChecked(): args.append("--local") base_directory = self.tree.basedir commands = [] if files_to_add: commands.append((base_directory, ["add", "--no-recurse"] + files_to_add)) commands.append((base_directory, args)) self.tabWidget.setCurrentWidget(self.process_panel) self.process_widget.start_multi(commands) def show_nonversioned(self, state): """Show/hide non-versioned files.""" if state and not self.filelist_widget.want_unversioned: state = self.filelist_widget.get_state() # RJLRJL: might need to set initial_checked_paths here self.filelist_widget.set_tree(self.tree, changes_mode=True, want_unversioned=True, change_load_filter=ignore_pattern_handler) self.filelist_widget.restore_state(state) if state: self.filelist_widget.tree_model.set_select_all_kind('all') else: self.filelist_widget.tree_model.set_select_all_kind('versioned') self.filelist_widget.tree_filter_model.setFilter(FilterModelKeys.UNVERSIONED, state) def _save_or_wipe_commit_data(self): if not self.process_widget.is_running(): if self.process_widget.is_finished: self.wipe_commit_data() else: self.save_commit_data() def closeEvent(self, event): self._save_or_wipe_commit_data() qbrz_config = get_qbrz_config() qbrz_config.set_option(self._window_name + "_show_nonversioned", self.show_nonversioned_checkbox.isChecked()) qbrz_config.save() # do I need this or is .saveSize() enough? return SubProcessDialog.closeEvent(self, event) def reject(self): self._save_or_wipe_commit_data() return SubProcessDialog.reject(self) def update_branch_groupbox(self): if not self.local_checkbox.isChecked(): # commit to master branch selected loc = url_for_display(self.tree.branch.get_bound_location()) desc = gettext("A commit will be made directly to the master branch, keeping the local and master branches in sync.") else: # local commit selected loc = url_for_display(self.tree.branch.base) desc = gettext("A local commit to the branch will be performed. The master branch will not be updated until " "a non-local commit is made.") # update GUI self.branch_location.setText(loc) self.commit_type_description.setText(desc) def show_diff_for_checked(self, ext_diff=None, dialog_action='commit'): """Diff button clicked: show the diff for checked entries. @param ext_diff: selected external diff tool (if any) @param dialog_action: purpose of parent window (main action) """ # XXX make this function universal for both qcommit and qrevert (?) if self.filelist_widget.tree_model.checkable: checked = [] # checked versioned unversioned = [] # checked unversioned (supposed to be added) for ref in self.filelist_widget.tree_model.iter_checked(): if ref.file_id: checked.append(ref.path) else: unversioned.append(ref.path) if checked: arg_provider = InternalWTDiffArgProvider( self.tree.basis_tree().get_revision_id(), self.tree, self.tree.branch, self.tree.branch, specific_files=checked) show_diff(arg_provider, ext_diff=ext_diff, parent_window=self, context=self.filelist_widget.diff_context) else: msg = "No changes selected to " + dialog_action QtWidgets.QMessageBox.warning(self, "QBrz - " + gettext("Diff"), gettext(msg), QtWidgets.QMessageBox.Ok) if unversioned: # XXX show infobox with message that not all files shown in diff pass else: arg_provider = InternalWTDiffArgProvider(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, context=self.filelist_widget.diff_context) 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() update_window.subprocessFinished[bool].connect(self.not_uptodate_info.setHidden) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/commit_data.py0000644000000000000000000001754614556556456014260 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2009 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. """Commit data save/restore support.""" class CommitData(object): """Class to manipulate with commit data. Hold the data as dictionary and provide dict-like interface. All strings saved internally as unicode. Known items for data dict: message: main commit message. bugs: string with space separated fixed bugs ids in the form 'id:number' authors: string with name(s) of patch author(s) file_message: dict for per-file commit messages (used e.g. in MySQL), keys in this dict are filenames/fileids, values are specific commit messages. old_revid: old tip revid (before uncommit) new_revid: new tip revid (after uncommit) Pair of revision ids (old_revid and new_revid) could be used to get all revision messages from uncommitted chain. XXX provide some helper API to get uncommitted chain of revisions and/or graph and/or revisions data. [bialix 20090812] Data saved in branch.conf in [commit_data] section as plain dict. """ def __init__(self, branch=None, tree=None, data=None): """Initialize data object attached to some tree. @param tree: working tree object for commit/uncommit. @param branch: branch object for commit/uncommit. @param data: initial data values (dictionary). """ self._tree = tree self._branch = branch self._data = {} if data: self._data.update(data) def _filtered_data(self): """Return copy of internal data dictionary without keys with "empty" values (i.e. those equal to empty string or None). """ d = {} for k,v in self._data.items(): if v not in (None, ''): d[k] = v return d def __bool__(self): """Check if there is some data actually. @return: True if data dictionary is not empty. """ return bool(self._filtered_data()) def __getitem__(self, key): """Read the value of specified key via dict-like interface, e.g. a[key]. @param key: key in data dictionary. @return: value or None if there is no such key. """ return self._data.get(key) def __setitem__(self, key, value): """Set new value for specified key.""" self._data[key] = value def __delitem__(self, key): """Delete key from dictionary.""" del self._data[key] def keys(self): """Return keys of internal dict.""" return list(self._data.keys()) def as_dict(self): return self._data.copy() def set_data(self, data=None, **kw): """Set new data to dictionary (e.g. to save data from commit dialog). @param data: dictionary with new data. @param kw: pairs name=value to insert. """ if data: self._data.update(data) for key, value in kw.items(): self._data[key] = value def set_data_on_uncommit(self, old_revid, new_revid): """Set data from post_uncommit hook. @param old_revid: old tip revid (before uncommit) @param new_revid: new tip revid (after uncommit). Could be None. """ from breezy.plugins.qbrz.lib.bugs import bug_urls_to_ids branch = self._get_branch() revision = branch.repository.get_revision(old_revid) # remember revids self._data['old_revid'] = old_revid if new_revid is None: from breezy.revision import NULL_REVISION new_revid = NULL_REVISION self._data['new_revid'] = new_revid # set data from revision self._data['message'] = revision.message or '' bug_urls = revision.properties.get('bugs', None) if bug_urls: self._data['bugs'] = ' '.join(bug_urls_to_ids(bug_urls.split('\n'))) def compare_data(self, other, all_keys=True): """Compare this data with other data. @return: True if data equals. @param other: other object (dict or instance of CommitData). @param all_keys: if True all keys in both objects are compared. If False then only keys in this instance compared with corresponding keys in other instance. """ try: for k,v in self._data.items(): if v != other[k]: return False except KeyError: return False if all_keys: if set(self._data.keys()) != set(other.keys()): return False return True def _load_old_data(self): """Load saved data in old format.""" return def load(self): """Load saved data from branch/tree.""" config = self._get_branch_config() data = config.get_user_option('commit_data', expand=False) if data: self.set_data(data) else: # for backward compatibility self._load_old_data() def save(self): """Save data to the branch/tree.""" br = self._get_branch() with br.lock_write(): # XXX save should wipe if self._data is empty self._set_new_commit_data(self._filtered_data()) # clear old data self._wipe_old_data() def _wipe_old_data(self): """Wipe saved data in old format.""" return def wipe(self): """Delete saved data from branch/tree config.""" br = self._get_branch() with br.lock_write(): self._set_new_commit_data({}) # clear old data self._wipe_old_data() def _get_branch(self): """Return branch object if either branch or tree was specified on init. Raise BzrInternalError otherwise. """ if self._branch: return self._branch if self._tree: return self._tree.branch # too bad from breezy import errors raise errors.BzrInternalError("CommitData has no saved branch or tree.") def _get_branch_config(self): return self._get_branch().get_config() def _set_new_commit_data(self, new_data): config = self._get_branch_config() old_data = config.get_user_option('commit_data', expand=False) if old_data == new_data: return try: config.set_user_option('commit_data', new_data) except AttributeError: pass class QBzrCommitData(CommitData): """CommitData variant with backward compatibility support. This class knows about old data saved as qbrz_commit_message and can provide automatic migration of data. """ def _load_old_data(self): config = self._get_branch_config() old_data = config.get_user_option('qbrz_commit_message', expand=False) if old_data: self.set_data(message=old_data) def _wipe_old_data(self): config = self._get_branch_config() if config.get_user_option('qbrz_commit_message', expand=False): config.set_user_option('qbrz_commit_message', '') # in similar way to QBzrCommitData it's possible to implement # class for bzr-gtk. ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/compatibility.py0000644000000000000000000000173614556556456014642 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2011 QBzr Developers # # 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. """Compatibility module to allow lazy-import of its members.""" # configobj library try: from breezy.util.configobj import configobj except ImportError: import configobj ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/conditional_dataview.py0000644000000000000000000001203214556556456016147 0ustar00# Copyright (C) 2009 Canonical Ltd # # 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from PyQt5 import QtGui, QtWidgets from PyQt5.QtCore import Qt class QBzrConditionalDataView(QtWidgets.QFrame): """A list/table/tree with a label. Only the label is shown when the data model is empty. """ def __init__(self, type, listmode_or_headers, label_text, details, parent=None): """Construct the view. :param type: one of list, table, tree :param listmode_or_headers: For lists, set the initial list view mode: True => list, False => icon. For tables and trees, the list of headers. :param label_text: text for label. May contain %(rows)d to substitute the row count. :param details: if non-None, a QWidget to show in a details panel. :param parent: parent widget """ QtWidgets.QFrame.__init__(self, parent) # Build the model & view for the data self._type = type columns = listmode_or_headers if type == 'list': self._view = QtWidgets.QListView() self._view.setSectionResizeMode(QtWidgets.QListView.Adjust) self._view.setWrapping(True) if listmode_or_headers: self._view.setViewMode(QtWidgets.QListView.ListMode) else: self._view.setViewMode(QtWidgets.QListView.IconMode) columns = ['Name'] # TODO: we could add a combo-box here letting the user decide # on list vs icons. Would we need a way to switch it off? elif type == 'tree': self._view = QtWidgets.QTreeView() elif type == 'table': self._view = QtWidgets.QTableView() self._model = QtGui.QStandardItemModel(0, len(columns)) self._model.setHorizontalHeaderLabels(columns) # Make the view read-only, and enable multi-selection of items self._view.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) self._view.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self._view.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) self._view.setModel(self._model) # Build the label self._label_text = label_text if label_text: self._label = QtWidgets.QLabel() self._update_label_text() # Put them together layout = QtWidgets.QVBoxLayout() if details: splitter = QtWidgets.QSplitter() splitter.setOrientation(Qt.Vertical) splitter.addWidget(self._view) splitter.addWidget(details) layout.addWidget(splitter) else: layout.addWidget(self._view) if label_text: layout.addWidget(self._label) self.setLayout(layout) def view(self): """Get the view object (QAbstractItemView).""" return self._view def label(self): """Get the label object (QLabel).""" return self._label def setData(self, tuple_list, decoration_provider=None): """Reset the model to have the data shown. :param tuple_list: a list of tuples. Each tuple should have len(headers) items. :param decoration_provider: a callable taking the row number and record. It returns the icon to display in the first column or None if none. """ # Update the model row_count = len(tuple_list) model = self._model model.setRowCount(row_count) cell_role = Qt.DisplayRole for row, record in enumerate(tuple_list): if decoration_provider: icon = decoration_provider(row, record) if icon: index = model.index(row, 0) model.setData(index, icon, Qt.DecorationRole) for col, value in enumerate(record): #print "putting %s into %d,%d" % (value, row, col) index = model.index(row, col) model.setData(index, value or '', cell_role) # Update the view & label self._view.setVisible(row_count > 0) if self._type in ['tree', 'table']: self._view.resizeColumnToContents(0) self._update_label_text(row_count) def _update_label_text(self, row_count=0): if self._label_text: text = self._label_text % {'rows': row_count} self._label.setText(text) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/config.py0000644000000000000000000011430214556556456013230 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2007 Lukáš Lalinský # # 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. import re import os.path from PyQt5 import QtCore, QtGui, QtWidgets from breezy.config import extract_email_address from breezy.bedding import ensure_config_dir_exists from breezy import cmdline, errors, trace from breezy.plugins.qbrz.lib import ui_merge_config from breezy.plugins.qbrz.lib.i18n import gettext, N_ from breezy.plugins.qbrz.lib.spellcheck import SpellChecker from breezy.plugins.qbrz.lib.util import ( BTN_OK, BTN_CANCEL, QBzrDialog, extract_name, get_qbrz_config, get_global_config, get_set_tab_width_chars, ) try: from breezy import mergetools except ImportError: mergetools = None _mail_clients = [ ('default', N_('Default')), ('thunderbird', N_('Thunderbird')), ('evolution', N_('Evolution')), ('kmail', N_('KMail')), ('mutt', N_('Mutt')), ('xdg-email', N_('XDG e-mail client')), ('mapi', N_('MAPI e-mail client')), ('editor', N_('Editor')), ] # XXX use special function from bugs.py instead _bug_tracker_re = re.compile('bugtracker_(.+?)_url') class QRadioCheckItemDelegate(QtWidgets.QItemDelegate): def drawCheck(self, painter, option, rect, state): style = self.parent().style() radioOption = QtWidgets.QStyleOptionButton() radioOption.rect = option.rect radioOption.state = option.state if state: radioOption.state = radioOption.state | QtWidgets.QStyle.State_On style.drawControl(QtWidgets.QStyle.CE_RadioButton, radioOption, painter) class QBzrConfigWindow(QBzrDialog): def __init__(self, parent=None): QBzrDialog.__init__(self, [gettext("Configuration")], parent) self.restoreSize("config", (400, 300)) self.tabwidget = QtWidgets.QTabWidget() generalWidget = QtWidgets.QWidget() generalVBox = QtWidgets.QVBoxLayout(generalWidget) generalGrid = QtWidgets.QGridLayout() self.nameEdit = QtWidgets.QLineEdit() label = QtWidgets.QLabel(gettext("&Name:")) label.setBuddy(self.nameEdit) generalGrid.addWidget(label, 0, 0) generalGrid.addWidget(self.nameEdit, 0, 1) self.emailEdit = QtWidgets.QLineEdit() label = QtWidgets.QLabel(gettext("E-&mail:")) label.setBuddy(self.emailEdit) generalGrid.addWidget(label, 1, 0) generalGrid.addWidget(self.emailEdit, 1, 1) self.editorEdit = QtWidgets.QLineEdit() btnEditorBrowse = QtWidgets.QPushButton(gettext('&Browse...')) btnEditorBrowse.clicked.connect(self.browseEditor) editorHBox = QtWidgets.QHBoxLayout() editorHBox.addWidget(self.editorEdit) editorHBox.addWidget(btnEditorBrowse) label = QtWidgets.QLabel(gettext("&Editor:")) label.setBuddy(self.editorEdit) generalGrid.addWidget(label, 2, 0) generalGrid.addLayout(editorHBox, 2, 1) self.emailClientCombo = QtWidgets.QComboBox() for name, label in _mail_clients: self.emailClientCombo.addItem(gettext(label), name) label = QtWidgets.QLabel(gettext("E-mail &client:")) label.setBuddy(self.emailClientCombo) generalGrid.addWidget(label, 3, 0) generalGrid.addWidget(self.emailClientCombo, 3, 1) self.tabWidthSpinner = QtWidgets.QSpinBox() self.tabWidthSpinner.setRange(1, 20) self.tabWidthSpinner.setToolTip(gettext("Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows")) label = QtWidgets.QLabel(gettext("Tab &Width:")) label.setBuddy(self.tabWidthSpinner) generalGrid.addWidget(label, 4, 0) _hb = QtWidgets.QHBoxLayout() _hb.addWidget(self.tabWidthSpinner) _hb.addStretch(10) generalGrid.addLayout(_hb, 4, 1) generalVBox.addLayout(generalGrid) generalVBox.addStretch() self.aliasesList = QtWidgets.QTreeWidget() self.aliasesList.setRootIsDecorated(False) self.aliasesList.setHeaderLabels([gettext("Alias"), gettext("Command")]) addAliasButton = QtWidgets.QPushButton(gettext("Add")) addAliasButton.clicked.connect(self.addAlias) removeAliasButton = QtWidgets.QPushButton(gettext("Remove")) removeAliasButton.clicked.connect(self.removeAlias) aliasesHBox = QtWidgets.QHBoxLayout() aliasesHBox.addWidget(addAliasButton) aliasesHBox.addWidget(removeAliasButton) aliasesHBox.addStretch() aliasesWidget = QtWidgets.QWidget() aliasesVBox = QtWidgets.QVBoxLayout(aliasesWidget) aliasesVBox.addWidget(self.aliasesList) aliasesVBox.addLayout(aliasesHBox) self.bugTrackersList = QtWidgets.QTreeWidget() self.bugTrackersList.setRootIsDecorated(False) self.bugTrackersList.setHeaderLabels([gettext("Abbreviation"), gettext("URL")]) addBugTrackerButton = QtWidgets.QPushButton(gettext("Add")) addBugTrackerButton.clicked.connect(self.addBugTracker) removeBugTrackerButton = QtWidgets.QPushButton(gettext("Remove")) removeBugTrackerButton.clicked.connect(self.removeBugTracker) bugTrackersHBox = QtWidgets.QHBoxLayout() bugTrackersHBox.addWidget(addBugTrackerButton) bugTrackersHBox.addWidget(removeBugTrackerButton) bugTrackersHBox.addStretch() bugTrackersWidget = QtWidgets.QWidget() bugTrackersVBox = QtWidgets.QVBoxLayout(bugTrackersWidget) bugTrackersVBox.addWidget(self.bugTrackersList) bugTrackersVBox.addLayout(bugTrackersHBox) diffWidget = QtWidgets.QWidget() self.diffShowIntergroupColors = QtWidgets.QCheckBox(gettext("Show inter-group inserts and deletes in green and red"), diffWidget) label = QtWidgets.QLabel(gettext("External Diff Apps:")) self.extDiffList = QtWidgets.QTreeWidget(diffWidget) self.extDiffList.setRootIsDecorated(False) self.extDiffList.setHeaderLabels([gettext("Name"), gettext("Command")]) self.extDiffList.setItemDelegateForColumn(0, QRadioCheckItemDelegate(self.extDiffList)) self.extDiffList.itemChanged [QtWidgets.QTreeWidgetItem, int].connect(self.extDiffListItemChanged) addExtDiffButton = QtWidgets.QPushButton(gettext("Add"), diffWidget) addExtDiffButton.clicked.connect(self.addExtDiff) removeExtDiffButton = QtWidgets.QPushButton(gettext("Remove"), diffWidget) removeExtDiffButton.clicked.connect(self.removeExtDiff) extDiffButtonsLayout = QtWidgets.QHBoxLayout() extDiffButtonsLayout.addWidget(addExtDiffButton) extDiffButtonsLayout.addWidget(removeExtDiffButton) extDiffButtonsLayout.addStretch() diffLayout = QtWidgets.QVBoxLayout(diffWidget) diffLayout.addWidget(self.diffShowIntergroupColors) diffLayout.addWidget(label) diffLayout.addWidget(self.extDiffList) diffLayout.addLayout(extDiffButtonsLayout) if mergetools is not None: mergeWidget = QtWidgets.QWidget() self.merge_ui = ui_merge_config.Ui_MergeConfig() self.merge_ui.setupUi(mergeWidget) self.merge_ui.tools.sortByColumn(0, QtCore.Qt.AscendingOrder) self.merge_ui.remove.setEnabled(False) self.merge_ui.set_default.setEnabled(False) self.merge_tools_model = MergeToolsTableModel() self.merge_ui.tools.setModel(self.merge_tools_model) self.merge_tools_model.dataChanged[QtCore.QModelIndex, QtCore.QModelIndex].connect(self.merge_tools_data_changed) self.merge_ui.tools.selectionModel().selectionChanged[QtCore.QItemSelection, QtCore.QItemSelection].connect(self.merge_tools_selectionChanged) self.merge_ui.add.clicked.connect(self.merge_tools_add_clicked) self.merge_ui.remove.clicked.connect(self.merge_tools_remove_clicked) self.merge_ui.set_default.clicked.connect(self.merge_tools_set_default_clicked) else: mergeWidget = QtWidgets.QLabel(gettext("Bazaar 2.4 or newer is required to configure mergetools.")) mergeWidget.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) self.tabwidget.addTab(generalWidget, gettext("General")) self.tabwidget.addTab(aliasesWidget, gettext("Aliases")) self.tabwidget.addTab(bugTrackersWidget, gettext("Bug Trackers")) self.tabwidget.addTab(self.getGuiTabWidget(), gettext("&User Interface")) self.tabwidget.addTab(diffWidget, gettext("&Diff")) self.tabwidget.addTab(mergeWidget, gettext("&Merge")) buttonbox = self.create_button_box(BTN_OK, BTN_CANCEL) vbox = QtWidgets.QVBoxLayout(self) vbox.addWidget(self.tabwidget) vbox.addWidget(buttonbox) self.load() def getGuiTabWidget(self): """ Returns the widget for the GUI tab. """ tabwidget = QtWidgets.QWidget() grid = QtWidgets.QGridLayout() vbox = QtWidgets.QVBoxLayout(tabwidget) vbox.addLayout(grid) vbox.addStretch() self.spellcheck_language_combo = QtWidgets.QComboBox() languages = sorted(SpellChecker.list_languages()) for name in languages: self.spellcheck_language_combo.addItem(gettext(name), name) if not languages: self.spellcheck_language_combo.setEnabled(False) label = QtWidgets.QLabel(gettext("Spell check &language:")) label.setBuddy(self.spellcheck_language_combo) label.setSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum) grid.addWidget(label, 0, 0) grid.addWidget(self.spellcheck_language_combo, 0, 1) self.branchsourceBasedirEdit = QtWidgets.QLineEdit() self.branchsourceBasedirEdit.setToolTip(gettext("This directory will be automatically filled in your branch source input field")) btnBranchsourceBasedirBrowse = QtWidgets.QPushButton(gettext('Browse...')) btnBranchsourceBasedirBrowse.clicked.connect(self.browseBranchsourceBasedir) branchsourceBasedirHBox = QtWidgets.QHBoxLayout() branchsourceBasedirHBox.addWidget(self.branchsourceBasedirEdit) branchsourceBasedirHBox.addWidget(btnBranchsourceBasedirBrowse) label = QtWidgets.QLabel(gettext("Base directory\nfor &branch sources:")) label.setBuddy(self.branchsourceBasedirEdit) grid.addWidget(label, 1, 0) grid.addLayout(branchsourceBasedirHBox, 1, 1) self.checkoutBasedirEdit = QtWidgets.QLineEdit() self.checkoutBasedirEdit.setToolTip(gettext("This directory will be automatically filled in your checkout destination input field")) btnCheckoutBasedirBrowse = QtWidgets.QPushButton(gettext('Browse...')) btnCheckoutBasedirBrowse.clicked.connect(self.browseCheckoutBasedir) checkoutBasedirHBox = QtWidgets.QHBoxLayout() checkoutBasedirHBox.addWidget(self.checkoutBasedirEdit) checkoutBasedirHBox.addWidget(btnCheckoutBasedirBrowse) label = QtWidgets.QLabel(gettext("Base directory\nfor &checkouts:")) label.setBuddy(self.checkoutBasedirEdit) grid.addWidget(label, 2, 0) grid.addLayout(checkoutBasedirHBox, 2, 1) return tabwidget def load(self): """Load the configuration.""" config = get_global_config() parser = config._get_parser() qconfig = get_qbrz_config() # Name & e-mail try: try: username = config.username() name = extract_name(username, strict=True) try: email = extract_email_address(username) except errors.NoEmailInUsername: email = '' except errors.NoWhoami: name, email = get_user_id_from_os() except Exception as e: trace.mutter("qconfig: load name/email error: %s", str(e)) name, email = '', '' self.nameEdit.setText(name) self.emailEdit.setText(email) # Editor editor = config.get_user_option('editor') if editor: self.editorEdit.setText(editor) # E-mail client mailClient = config.get_user_option('mail_client') if mailClient: index = self.emailClientCombo.findData(mailClient) if index >= 0: self.emailClientCombo.setCurrentIndex(index) # Tab-width self.tabWidthSpinner.setValue(get_set_tab_width_chars()) # Spellcheck language spellcheck_language = config.get_user_option('spellcheck_language') or 'en' if spellcheck_language: index = self.spellcheck_language_combo.findData(spellcheck_language) if index >= 0: self.spellcheck_language_combo.setCurrentIndex(index) # Branch source basedir branchsourceBasedir = qconfig.get_option('branchsource_basedir') if branchsourceBasedir: self.branchsourceBasedirEdit.setText(branchsourceBasedir) # Checkout basedir checkoutBasedir = qconfig.get_option('checkout_basedir') if checkoutBasedir: self.checkoutBasedirEdit.setText(checkoutBasedir) # Aliases aliases = parser.get('ALIASES', {}) for alias, command in list(aliases.items()): item = QtWidgets.QTreeWidgetItem(self.aliasesList) item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled) item.setText(0, alias) item.setText(1, command) # Bug trackers # XXX use special function from bugs.py for name, value in list(parser.get('DEFAULT', {}).items()): m = _bug_tracker_re.match(name) if not m: continue abbreviation = m.group(1) item = QtWidgets.QTreeWidgetItem(self.bugTrackersList) item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled) item.setText(0, abbreviation) item.setText(1, value) # Diff self.diffShowIntergroupColors.setChecked(qconfig.get_option("diff_show_intergroup_colors") in ("True", "1")) defaultDiff = qconfig.get_option("default_diff") if defaultDiff is None: defaultDiff = "" self.extDiffListIgnore = True def create_ext_diff_item(name, command): item = QtWidgets.QTreeWidgetItem(self.extDiffList) item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsUserCheckable) if command == defaultDiff: item.setCheckState(0, QtCore.Qt.Checked) else: item.setCheckState(0, QtCore.Qt.Unchecked) item.setText(0, name) item.setText(1, command) return item builtin = create_ext_diff_item(gettext("Builtin Diff"),"") builtin.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsUserCheckable) extDiffs = qconfig.get_section('EXTDIFF') for name, command in list(extDiffs.items()): create_ext_diff_item(name, command) self.extDiffListIgnore = False # Merge if mergetools is not None: user_merge_tools = config.get_merge_tools() # RJLRJL: check this - might need to be 'brz.default_mergetool' default_merge_tool = config.get_user_option('bzr.default_mergetool') if len(user_merge_tools) == 0: self.import_external_merge(user_merge_tools, config, qconfig) self.merge_tools_model.set_merge_tools(user_merge_tools, mergetools.known_merge_tools, default_merge_tool) self.merge_tools_model.sort(0, QtCore.Qt.AscendingOrder) def import_external_merge(self, user_merge_tools, config, qconfig): # don't ask to import if we already asked before if qconfig.get_option_as_bool('imported_external_merge'): return external_merge = config.get_user_option('external_merge') if external_merge is None or external_merge.strip() == '': return name, new_cmdline = self.convert_external_merge(external_merge) answer = QtGui.QMessageBox.question( self, gettext('Import old external merge tool'), gettext('Would you like to import your previously configured ' 'external merge tool:\n\n %(old_cmdline)s\n\nas:\n\n' ' %(new_cmdline)s' % {'old_cmdline':external_merge, 'new_cmdline':new_cmdline}), QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.Yes ) if answer == QtWidgets.QMessageBox.Yes: if name in mergetools.known_merge_tools: name = name + '-NEW' user_merge_tools[name] = new_cmdline # set a flag to indicate that we've already asked about this qconfig.set_option('imported_external_merge', True) def convert_external_merge(self, external_merge): args = cmdline.split(external_merge) # %b %t %o -o %r external_merge = external_merge.replace('%b', '{base}') external_merge = external_merge.replace('%t', '{this}') external_merge = external_merge.replace('%T', '{this_temp}') external_merge = external_merge.replace('%o', '{other}') external_merge = external_merge.replace('%r', '{result}') return os.path.basename(args[0]), external_merge def save(self): """Save the configuration.""" config = get_global_config() parser = config._get_parser() qconfig = get_qbrz_config() def set_or_delete_option(parser, name, value): if value: if 'DEFAULT' not in parser: parser['DEFAULT'] = {} parser['DEFAULT'][name] = value else: try: del parser['DEFAULT'][name] except KeyError: pass # Name & e-mail _name = str(self.nameEdit.text()).strip() _email = str(self.emailEdit.text()).strip() username = '' if _name: username = _name if _email: username = (username + ' <%s>' % _email).strip() set_or_delete_option(parser, 'email', username) # Editor editor = str(self.editorEdit.text()) set_or_delete_option(parser, 'editor', editor) # E-mail client index = self.emailClientCombo.currentIndex() mail_client = self.emailClientCombo.itemData(index) set_or_delete_option(parser, 'mail_client', mail_client) tabWidth = self.tabWidthSpinner.value() set_or_delete_option(parser, 'tab_width', tabWidth) # Spellcheck language index = self.spellcheck_language_combo.currentIndex() spellcheck_language = self.spellcheck_language_combo.itemData(index) set_or_delete_option(parser, 'spellcheck_language', spellcheck_language) # Branch source basedir branchsource_basedir = str(self.branchsourceBasedirEdit.text()) qconfig.set_option('branchsource_basedir', branchsource_basedir) # Checkout basedir checkout_basedir = str(self.checkoutBasedirEdit.text()) qconfig.set_option('checkout_basedir', checkout_basedir) # Aliases parser['ALIASES'] = {} for index in range(self.aliasesList.topLevelItemCount()): item = self.aliasesList.topLevelItem(index) alias = str(item.text(0)) command = str(item.text(1)) if alias and command: parser['ALIASES'][alias] = command # Bug trackers for name, value in list(parser.get('DEFAULT', {}).items()): m = _bug_tracker_re.match(name) if m: abbrev = m.group(1) del parser['DEFAULT']['bugtracker_%s_url' % abbrev] for index in range(self.bugTrackersList.topLevelItemCount()): item = self.bugTrackersList.topLevelItem(index) abbrev = str(item.text(0)) url = str(item.text(1)) # FIXME add URL validation (must contain {id}) if abbrev and url: parser['DEFAULT']['bugtracker_%s_url' % abbrev] = url # Diff qconfig.set_option('diff_show_intergroup_colors', self.diffShowIntergroupColors.isChecked()) defaultDiff = None ext_diffs = {} for index in range(1, self.extDiffList.topLevelItemCount()): item = self.extDiffList.topLevelItem(index) name = str(item.text(0)) command = str(item.text(1)) if item.checkState(0) == QtCore.Qt.Checked: defaultDiff = command if name and command: ext_diffs[name] = command qconfig.set_section('EXTDIFF', ext_diffs) qconfig.set_option('default_diff', defaultDiff) if hasattr(config, 'file_name'): file_name = config.file_name else: file_name = config._get_filename() ensure_config_dir_exists(os.path.dirname(file_name)) f = open(file_name, 'wb') parser.write(f) f.close() qconfig.save() # Merge if mergetools is not None: for name in self.merge_tools_model.get_removed_merge_tools(): option = 'bzr.mergetool.%s' % name if config.get_user_option(option, expand=False) is not None: config.remove_user_option(option) user_merge_tools = self.merge_tools_model.get_user_merge_tools() for name, cmdline in user_merge_tools.items(): orig_cmdline = config.find_merge_tool(name) if orig_cmdline is None or orig_cmdline != cmdline: config.set_user_option('bzr.mergetool.%s' % name, cmdline) default_mt = self.merge_tools_model.get_default() if default_mt is not None: config.set_user_option('bzr.default_mergetool', default_mt) def do_accept(self): """Save changes and close the window.""" if not self.validate(): return self.save() self.close() def do_reject(self): """Close the window.""" self.close() def validate(self): """Check the inputs and return False if there is something wrong and save should be prohibited.""" # check whoami _name = str(self.nameEdit.text()).strip() _email = str(self.emailEdit.text()).strip() if (_name, _email) == ('', ''): if QtWidgets.QMessageBox.warning(self, "Configuration", "Name and E-mail settings should not be empty", gettext("&Ignore and proceed"), gettext("&Change the values")) != 0: # change the values self.tabwidget.setCurrentIndex(0) self.nameEdit.setFocus() return False return True def addAlias(self): item = QtWidgets.QTreeWidgetItem(self.aliasesList) item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled) self.aliasesList.setCurrentItem(item) self.aliasesList.editItem(item, 0) def removeAlias(self): for item in self.aliasesList.selectedItems(): index = self.aliasesList.indexOfTopLevelItem(item) if index >= 0: self.aliasesList.takeTopLevelItem(index) def addBugTracker(self): item = QtWidgets.QTreeWidgetItem(self.bugTrackersList) item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled) self.bugTrackersList.setCurrentItem(item) self.bugTrackersList.editItem(item, 0) def removeBugTracker(self): for item in self.bugTrackersList.selectedItems(): index = self.bugTrackersList.indexOfTopLevelItem(item) if index >= 0: self.bugTrackersList.takeTopLevelItem(index) def addExtDiff(self): item = QtWidgets.QTreeWidgetItem(self.extDiffList) item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsUserCheckable) item.setCheckState(0, QtCore.Qt.Unchecked) self.extDiffList.setCurrentItem(item) self.extDiffList.editItem(item, 0) def removeExtDiff(self): for item in self.extDiffList.selectedItems(): index = self.extDiffList.indexOfTopLevelItem(item) if index >= 1: # You can't remove the builtin diff self.extDiffList.takeTopLevelItem(index) def extDiffListItemChanged(self, changed_item, col): if col == 0 and not self.extDiffListIgnore: checked_count = 0 for index in range(self.extDiffList.topLevelItemCount()): item = self.extDiffList.topLevelItem(index) if item.checkState(0) == QtCore.Qt.Checked: checked_count += 1 if checked_count == 0: self.extDiffListIgnore = True changed_item.setCheckState(0, QtCore.Qt.Checked) self.extDiffListIgnore = False elif checked_count > 1: self.extDiffListIgnore = True for index in range(self.extDiffList.topLevelItemCount()): item = self.extDiffList.topLevelItem(index) if item.checkState(0) == QtCore.Qt.Checked: item.setCheckState(0, QtCore.Qt.Unchecked) changed_item.setCheckState(0, QtCore.Qt.Checked) self.extDiffListIgnore = False def get_selected_merge_tool(self): sel_model = self.merge_ui.tools.selectionModel() if len(sel_model.selectedRows()) == 0: return None row = sel_model.selectedRows()[0].row() return self.merge_tools_model.get_merge_tool_name(row) def update_buttons(self): selected = self.get_selected_merge_tool() self.merge_ui.remove.setEnabled(selected is not None and self.merge_tools_model.is_user_merge_tool(selected)) self.merge_ui.set_default.setEnabled(selected is not None and self.merge_tools_model.get_default() != selected) def merge_tools_data_changed(self, top_left, bottom_right): self.update_buttons() def merge_tools_selectionChanged(self, selected, deselected): self.update_buttons() def merge_tools_add_clicked(self): index = self.merge_tools_model.new_merge_tool() sel_model = self.merge_ui.tools.selectionModel() sel_model.select(index, QtCore.QItemSelectionModel.ClearAndSelect) self.merge_ui.tools.edit(index) def merge_tools_remove_clicked(self): sel_model = self.merge_ui.tools.selectionModel() assert len(sel_model.selectedRows()) > 0 for index in sel_model.selectedRows(): self.merge_tools_model.remove_merge_tool(index.row()) def merge_tools_set_default_clicked(self): sel_model = self.merge_ui.tools.selectionModel() self.merge_tools_model.set_default(self.get_selected_merge_tool()) def browseEditor(self): filename = QtWidgets.QFileDialog.getOpenFileName(self, gettext('Select editor executable'), '/')[0] if filename: self.editorEdit.setText(filename) def browseCheckoutBasedir(self): filename = QtWidgets.QFileDialog.getExistingDirectory(self, gettext('Select base directory for checkouts'), '/') if filename: self.checkoutBasedirEdit.setText(filename) def browseBranchsourceBasedir(self): filename = QtWidgets.QFileDialog.getExistingDirectory(self, gettext('Select default directory for branch sources'), '/') if filename: self.branchsourceBasedirEdit.setText(filename) def get_user_id_from_os(): """Calculate automatic user identification. Returns (realname, email). Only used when none is set in the environment or the id file. This previously used the FQDN as the default domain, but that can be very slow on machines where DNS is broken. So now we simply use the hostname. """ # This use to live in breezy.config._auto_user_id, but got removed, so # we have a copy. import sys if sys.platform == 'win32': from breezy import win32utils name = win32utils.get_user_name_unicode() if name is None: raise errors.BzrError("Cannot autodetect user name.\n" "Please, set your name with command like:\n" 'brz whoami "Your Name "') host = win32utils.get_host_name_unicode() if host is None: host = socket.gethostname() return name, (name + '@' + host) try: import pwd uid = os.getuid() try: w = pwd.getpwuid(uid) except KeyError: raise errors.BzrCommandError('Unable to determine your name. Please use "brz whoami" to set it.') # we try utf-8 first, because on many variants (like Linux), # /etc/passwd "should" be in utf-8, and because it's unlikely to give # false positives. (many users will have their user encoding set to # latin-1, which cannot raise UnicodeError.) try: gecos = w.pw_gecos.decode('utf-8') encoding = 'utf-8' except UnicodeError: try: encoding = osutils.get_user_encoding() gecos = w.pw_gecos.decode(encoding) except UnicodeError: raise errors.BzrCommandError('Unable to determine your name. Use brz whoami" to set it.') try: username = w.pw_name.decode(encoding) except UnicodeError: raise errors.BzrCommandError('Unable to determine your name. Use "brz whoami" to set it.') comma = gecos.find(',') if comma == -1: realname = gecos else: realname = gecos[:comma] if not realname: realname = username except ImportError: import getpass try: user_encoding = osutils.get_user_encoding() realname = username = getpass.getuser().decode(user_encoding) except UnicodeDecodeError: raise errors.BzrError("Can't decode username as %s." % user_encoding) import socket return realname, (username + '@' + socket.gethostname()) class MergeToolsTableModel(QtCore.QAbstractTableModel): dataChanged = QtCore.pyqtSignal(QtCore.QModelIndex, QtCore.QModelIndex) layoutAboutToBeChanged = QtCore.pyqtSignal() layoutChanged = QtCore.pyqtSignal() COL_NAME = 0 COL_COMMANDLINE = 1 COL_COUNT = 2 def __init__(self): super(MergeToolsTableModel, self).__init__() self._order = [] self._user = {} self._known = {} self._default = None self._removed = [] def get_user_merge_tools(self): return self._user def set_merge_tools(self, user, known, default): self.beginResetModel() self._user = user self._known = known self._order = list(user.keys()) + list(known.keys()) self._default = default self.endResetModel() def get_default(self): return self._default def set_default(self, new_default): old_row = None if self._default is not None: old_row = self._order.index(self._default) new_row = None if new_default is not None: new_row = self._order.index(new_default) self._default = new_default else: self._default = None if old_row is not None: self.dataChanged.emit(self.index(old_row, self.COL_NAME), self.index(old_row, self.COL_NAME)) if new_row is not None: self.dataChanged.emit(self.index(new_row, self.COL_NAME), self.index(new_row, self.COL_NAME)) def get_removed_merge_tools(self): return self._removed def get_merge_tool_name(self, row): return self._order[row] def get_merge_tool_command_line(self, row): name = self._order[row] return self._user.get(name, self._known.get(name, None)) def is_user_merge_tool(self, name): return name in self._user def new_merge_tool(self): index = self.createIndex(len(self._order), 0) self.beginInsertRows(QtCore.QModelIndex(), index.row(), index.row()) self._order.append('') self._user[''] = '' self.endInsertRows() return index def remove_merge_tool(self, row): name = self._order[row] if name not in self._user: return self.beginRemoveRows(QtCore.QModelIndex(), row, row) self._removed.append(name) if name == self._default: self._default = None del self._order[row] del self._user[name] self.endRemoveRows() def rowCount(self, parent): return len(self._order) def columnCount(self, parent): return self.COL_COUNT def data(self, index, role): name = self._order[index.row()] cmdline = self.get_merge_tool_command_line(index.row()) if role == QtCore.Qt.DisplayRole: if index.column() == self.COL_NAME: return name elif index.column() == self.COL_COMMANDLINE: return cmdline elif role == QtCore.Qt.EditRole: if index.column() == self.COL_NAME: return name elif index.column() == self.COL_COMMANDLINE: return cmdline elif role == QtCore.Qt.CheckStateRole: if index.column() == self.COL_NAME: return self._default == name and QtCore.Qt.Checked or QtCore.Qt.Unchecked elif role == QtCore.Qt.BackgroundRole: if name in self._known: palette = QtWidgets.QApplication.palette() return palette.alternateBase() return None def setData(self, index, value, role): name = self._order[index.row()] if role == QtCore.Qt.EditRole: if index.column() == self.COL_NAME: # To properly update the config, renaming a merge tool must be # handled as a remove and add. cmdline = self.get_merge_tool_command_line(index.row()) if name != '': self._removed.append(name) del self._order[index.row()] del self._user[name] new_name = str(value) self._order.insert(index.row(), new_name) self._user[new_name] = cmdline if self._default == name: self._default = new_name self.dataChanged.emit(index, index) self.sort(self.COL_NAME, QtCore.Qt.AscendingOrder) return True elif index.column() == self.COL_COMMANDLINE: self._user[name] = str(value) self.dataChanged.emit(index, index) return True elif role == QtCore.Qt.CheckStateRole: if index.column() == self.COL_NAME: if int(value) == (QtCore.Qt.Checked, True): self.set_default(name) elif (int(value) == (QtCore.Qt.Unchecked, True) and self._default == name): self.set_default(None) # if value.toInt() == (QtCore.Qt.Checked, True): # self.set_default(name) # elif (value.toInt() == (QtCore.Qt.Unchecked, True) and self._default == name): # self.set_default(None) return False def flags(self, index): f = super().flags(index) name = self._order[index.row()] if name not in self._known: f = f | QtCore.Qt.ItemIsEditable if index.column() == self.COL_NAME: f = f | QtCore.Qt.ItemIsUserCheckable return f def headerData(self, section, orientation, role): if orientation == QtCore.Qt.Horizontal: if section == self.COL_NAME: if role == QtCore.Qt.DisplayRole: return gettext("Name") elif section == self.COL_COMMANDLINE: if role == QtCore.Qt.DisplayRole: return gettext("Command Line") return None def sort(self, column, sortOrder): self.layoutAboutToBeChanged.emit() index_map = self._order[:] # copy def tool_cmp(a, b): if column == self.COL_NAME: return cmp(a, b) elif column == self.COL_COMMANDLINE: return cmp(self.get_merge_tool_command_line(a), self.get_merge_tool_command_line(b)) return 0 # self._order.sort(cmp=tool_cmp, reverse=sortOrder==QtCore.Qt.DescendingOrder) for i in range(0, len(index_map)): index_map[i] = self._order.index(index_map[i]) from_list = [] to_list = [] for col in range(0, self.columnCount(None)): from_list.extend([self.index(i, col) for i in index_map]) to_list.extend([self.index(i, col) for i in range(0, len(index_map))]) self.changePersistentIndexList(from_list, to_list) self.layoutChanged.emit() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/conflicts.py0000644000000000000000000003110614556556456013747 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2009 Lukáš Lalinský # # 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 PyQt5 import QtCore, QtGui, QtWidgets from breezy.config import GlobalConfig from breezy.conflicts import resolve from breezy.workingtree import WorkingTree from breezy.plugins.qbrz.lib.i18n import gettext, N_, ngettext from breezy.plugins.qbrz.lib.util import ( BTN_CLOSE, BTN_REFRESH, QBzrWindow, get_qbrz_config, StandardButton, ) try: from breezy.cmdline import split as cmdline_split except ImportError: from breezy.commands import shlex_split_unicode as cmdline_split try: from breezy import mergetools except ImportError: mergetools = None class ConflictsWindow(QBzrWindow): allResolved = QtCore.pyqtSignal(bool) def __init__(self, wt_dir, parent=None): self.merge_action = None self.wt = None self.wt_dir = wt_dir QBzrWindow.__init__(self, [gettext("Conflicts")], parent) self.restoreSize("conflicts", (550, 380)) vbox = QtWidgets.QVBoxLayout(self.centralwidget) self.conflicts_list = QtWidgets.QTreeWidget(self) self.conflicts_list.setRootIsDecorated(False) self.conflicts_list.setUniformRowHeights(True) self.conflicts_list.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.conflicts_list.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) self.conflicts_list.setHeaderLabels([ gettext("File"), gettext("Conflict"), ]) self.conflicts_list.selectionModel().selectionChanged[QItemSelection, QItemSelection].connect(self.update_merge_tool_ui) self.conflicts_list.customContextMenuRequested[QPoint].connect(self.show_context_menu) self.conflicts_list.itemDoubleClicked[QTreeWidgetItem, int].connect(self.launch_merge_tool) self.conflicts_list.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.conflicts_list.setSortingEnabled(True) self.conflicts_list.sortByColumn(0, QtCore.Qt.AscendingOrder) header = self.conflicts_list.header() header.setStretchLastSection(False) header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents) vbox.addWidget(self.conflicts_list) hbox = QtWidgets.QHBoxLayout() self.merge_tools_combo = QtWidgets.QComboBox(self) self.merge_tools_combo.setEditable(False) self.merge_tools_combo.currentIndexChanged[int].connect(self.update_merge_tool_ui) self.merge_tool_error = QtWidgets.QLabel('', self) self.program_launch_button = QtWidgets.QPushButton(gettext("&Launch..."), self) self.program_launch_button.setEnabled(False) self.program_launch_button.clicked.connect(self.launch_merge_tool) self.program_label = QtWidgets.QLabel(gettext("M&erge tool:"), self) self.program_label.setBuddy(self.merge_tools_combo) hbox.addWidget(self.program_label) hbox.addWidget(self.merge_tools_combo) hbox.addWidget(self.merge_tool_error) hbox.addStretch(1) hbox.addWidget(self.program_launch_button) vbox.addLayout(hbox) self.create_context_menu() buttonbox = self.create_button_box(BTN_CLOSE) refresh = StandardButton(BTN_REFRESH) buttonbox.addButton(refresh, QtWidgets.QDialogButtonBox.ActionRole) refresh.clicked.connect(self.refresh) autobutton = QtWidgets.QPushButton(gettext('Auto-resolve'), self.centralwidget) autobutton.clicked[bool].connect(self.auto_resolve) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(autobutton) hbox.addWidget(buttonbox) vbox.addLayout(hbox) self.initialize_ui() def initialize_ui(self): config = GlobalConfig() if mergetools is not None: # get user-defined merge tools defined_tools = list(config.get_merge_tools().keys()) # get predefined merge tools defined_tools += list(mergetools.known_merge_tools.keys()) # sort them nicely defined_tools.sort() for merge_tool in defined_tools: self.merge_tools_combo.insertItem( self.merge_tools_combo.count(), merge_tool) default_tool = config.get_user_option('bzr.default_mergetool') if default_tool is not None: self.merge_tools_combo.setCurrentIndex( self.merge_tools_combo.findText(default_tool)) # update_merge_tool_ui invokes is_merge_tool_launchable, which displays # error message if mergetools module is not available. self.update_merge_tool_ui() def create_context_menu(self): self.context_menu = QtWidgets.QMenu(self.conflicts_list) self.merge_action = QtWidgets.QAction(gettext("&Merge conflict"), self.context_menu) self.merge_action.triggered[bool].connect(self.launch_merge_tool) self.context_menu.addAction(self.merge_action) self.context_menu.setDefaultAction(self.merge_action) self.context_menu.addAction(gettext('Take "&THIS" version'), self.take_this) self.context_menu.addAction(gettext('Take "&OTHER" version'), self.take_other) self.context_menu.addAction(gettext("Mark as &resolved"), self.mark_item_as_resolved) def show(self): QBzrWindow.show(self) QtCore.QTimer.singleShot(1, self.load) def refresh(self): QtCore.QTimer.singleShot(1, self.load) def load(self): self.wt = wt = WorkingTree.open_containing(self.wt_dir)[0] self.set_title([gettext("Conflicts"), wt.basedir]) conflicts = self.wt.conflicts() items = [] for conflict in conflicts: item = QtWidgets.QTreeWidgetItem() item.setText(0, conflict.path) item.setText(1, gettext(conflict.typestring)) item.setData(0, QtCore.Qt.UserRole, conflict.file_id or '') # file_id is None for non-versioned items, so we force it to be empty string to avoid Qt error item.setData(1, QtCore.Qt.UserRole, conflict.typestring) items.append(item) if len(items) == 0 and self.conflicts_list.topLevelItemCount() > 0: self.allResolved.emit(True) self.conflicts_list.clear() self.conflicts_list.addTopLevelItems(items) def auto_resolve(self): while self.wt is None: QtWidgets.QApplication.processEvents() un_resolved, resolved = self.wt.auto_resolve() if len(un_resolved) > 0: n = len(resolved) QtWidgets.QMessageBox.information(self, gettext('Conflicts'), ngettext('%d conflict auto-resolved.', '%d conflicts auto-resolved.', n) % n, gettext('&OK')) QtCore.QTimer.singleShot(1, self.load) else: QtWidgets.QMessageBox.information(self, gettext('Conflicts'), gettext('All conflicts resolved.'), gettext('&OK')) self.close() def update_merge_tool_ui(self): enabled, error_msg = self.is_merge_tool_launchable() self.merge_tool_error.setText(error_msg) self.program_launch_button.setEnabled(enabled) self.merge_action.setEnabled(enabled) def launch_merge_tool(self): items = self.conflicts_list.selectedItems() enabled, error_msg = self.is_merge_tool_launchable() if not enabled: return config = GlobalConfig() cmdline = config.find_merge_tool(str(self.merge_tools_combo.currentText())) file_id = items[0].data(0, QtCore.Qt.UserRole) if not file_id: # bug https://bugs.launchpad.net/qbrz/+bug/655451 return file_name = self.wt.abspath(self.wt.id2path(file_id)) process = QtCore.QProcess(self) def qprocess_invoker(executable, args, cleanup): def qprocess_error(error): self.show_merge_tool_error(error) cleanup(process.exitCode()) def qprocess_finished(exit_code, exit_status): cleanup(exit_code) process.error[QProcess.ProcessError].connect(qprocess_error) process.finished[int, QProcess.ExitStatus].connect(qprocess_finished) process.start(executable, args) mergetools.invoke(cmdline, file_name, qprocess_invoker) def show_merge_tool_error(self, error): msg = gettext("Error while running merge tool (code %d)") % error QtWidgets.QMessageBox.critical(self, gettext("Error"), msg) def take_this(self): self._resolve_action('take_this') def take_other(self): self._resolve_action('take_other') def mark_item_as_resolved(self): self._resolve_action('done') def _resolve_action(self, action): items = self.conflicts_list.selectedItems() file_names = [] for item in items: # XXX why we need to use file_id -> path conversion if we already have filename??? # this conversion fails in the case when user removed file or directory # which marked as conflicted (e.g. in missing parent conflict case). # ~file_id = str(item.data(0, QtCore.Qt.UserRole).toString()) # ~file_names.append(self.wt.id2path(file_id)) file_names.append(str(item.text(0))) resolve(self.wt, file_names, action=action) self.refresh() def show_context_menu(self, pos): self.context_menu.popup(self.conflicts_list.viewport().mapToGlobal(pos)) def is_merge_tool_launchable(self): if mergetools is None: return False, gettext("Bazaar 2.4 or later is required for external mergetools support") items = self.conflicts_list.selectedItems() error_msg = "" enabled = True if len(items) != 1 or items[0].data(1, QtCore.Qt.UserRole) != "text conflict": enabled = False config = GlobalConfig() tool = str(self.merge_tools_combo.currentText()) cmdline = config.find_merge_tool(tool) if cmdline is None: error_msg = gettext("Set up external_merge app in qconfig under the Merge tab") enabled = False elif not mergetools.check_availability(cmdline): enabled = False error_msg = gettext("External merge tool %(tool)s is not available") % \ { 'tool': tool } return enabled, error_msg def is_extmerge_definition_valid(self, showErrorDialog): bzr_config = GlobalConfig() extmerge_tool = bzr_config.get_user_option("external_merge") # Check if the definition format is correct flags = "%r" try: extmerge_tool.rindex('%r') flags = "%b" extmerge_tool.rindex('%b') flags = "%t" extmerge_tool.rindex('%t') flags = "%o" extmerge_tool.rindex('%o') except ValueError: if showErrorDialog: QtWidgets.QMessageBox.critical(self, gettext("Error"), gettext("The extmerge definition: '%(tool)s' is invalid.\n" "Missing the flag: %(flags)s. " "This must be fixed in qconfig under the Merge tab.") % { 'tool': extmerge_tool, 'flags': flags, }) return gettext("Missing the flag: %s. Configure in qconfig under the merge tab.") % flags return "" if 0: N_("path conflict") N_("contents conflict") N_("text conflict") N_("duplicate id") N_("duplicate") N_("parent loop") N_("unversioned parent") N_("missing parent") N_("deleting parent") N_("non-directory parent") ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/decorators.py0000644000000000000000000000707614556556456014141 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 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 # 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 PyQt5 import QtCore import time from collections import defaultdict from functools import wraps """Decorators for debugging and maybe main work mode.""" def print_in_out(unbound): """Decorator to print input arguments and return value of the function.""" def _run(*args, **kwargs): from breezy.trace import mutter a = ','.join(repr(i) for i in args) b = ','.join('%s=%r' % (i,j) for (i,j) in kwargs.items()) if a and b: a = a + ',' + b else: a = a or b func_name = unbound.__name__ mutter('Called %s(%s)' % (func_name, a)) result = unbound(*args, **kwargs) mutter('%s returned %r' % (func_name, result)) return result return _run class LazyCall(object): def __init__(self, millisec, func, callback=None): self.func = func self.millisec = millisec self.callback = callback self._last_scheduled_at = 0 def call(self, *args, **kargs): self._func = lambda:self.func(*args, **kargs) if self._last_scheduled_at == 0: QtCore.QTimer.singleShot(self.millisec, self._exec) self._last_scheduled_at = time.time() def _exec(self): elapsed = (time.time() - self._last_scheduled_at) * 1000 if elapsed < self.millisec: # Retry QtCore.QTimer.singleShot(int(self.millisec - elapsed), self._exec) return last_executed_at = self._last_scheduled_at ret = self._func() has_next = last_executed_at != self._last_scheduled_at if self.callback: self.callback(ret, has_next) if has_next: # One more call if there was another request when executing proc QtCore.QTimer.singleShot(self.millisec, self._exec) return self._last_scheduled_at = 0 def lazy_call(millisec, per_instance=False): """ Decorator to delay function call. Specified function will called after waiting `millisec`, if there are multiple call while waiting, only last one will be done. """ def _lazy_call(function): if per_instance: _instances = defaultdict(lambda:LazyCall(millisec, function)) def __lazy_call(*args, **kwargs): key = hash(args[0]) caller = _instances[key] if not caller.callback: def cleanup(ret, has_next): if not has_next: del _instances[key] caller.callback = cleanup caller.call(*args, **kwargs) else: caller = LazyCall(millisec, function) def __lazy_call(*args, **kwargs): caller.call(*args, **kwargs) return __lazy_call return _lazy_call ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/diff.py0000644000000000000000000005656114556556456012707 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2008 Gary van der Merwe # # 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. import tempfile from contextlib import ExitStack import errno import re import time import sys import os import glob from PyQt5 import QtCore, QtGui, QtWidgets from breezy import trace, osutils, cmdline from breezy.errors import NoSuchId, ExecutableMissing from breezy.tree import FileTimestampUnavailable from breezy.plugins.qbrz.lib.diff_arg import * # import DiffArgProvider classes from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.subprocess import SimpleSubProcessDialog from breezy.plugins.qbrz.lib.util import ( get_qbrz_config, content_seems_to_be_binary, ) from breezy.lazy_import import lazy_import lazy_import(globals(), ''' from patiencediff import PatienceSequenceMatcher as SequenceMatcher from breezy.plugins.qbrz.lib.i18n import gettext, ngettext, N_ from breezy.workingtree import WorkingTree from breezy.trace import mutter ''') from breezy.diff import DiffFromTool, DiffPath subprocess = __import__('subprocess', {}, {}, []) qconfig = get_qbrz_config() default_diff = qconfig.get_option("default_diff") if default_diff is None: default_diff = "" ext_diffs = {gettext("Builtin Diff"):""} for name, command in list(qconfig.get_section('EXTDIFF').items()): ext_diffs[name] = command def show_diff(arg_provider, ext_diff=None, parent_window=None, context=None): if ext_diff is None: ext_diff = default_diff if ext_diff == "": # We can't import this globaly becuse it ties to import us, # which causes and Import Error. from breezy.plugins.qbrz.lib.diffwindow import DiffWindow window = DiffWindow(arg_provider, parent=parent_window) window.show() if parent_window: parent_window.windows.append(window) elif context: ext_diff = str(ext_diff) # convert QString to str with ExitStack() as es: args = arg_provider.get_diff_window_args( QtWidgets.QApplication.processEvents, es ) old_tree = args["old_tree"] new_tree = args["new_tree"] specific_files = args.get("specific_files") context.setup(ext_diff, old_tree, new_tree) if specific_files: context.diff_paths(specific_files) else: context.diff_tree() else: args=["diff", "--using", ext_diff] # NEVER USE --using=xxx, ALWAYS --using xxx # This should be move to after the window has been shown. dir, extra_args = arg_provider.get_ext_diff_args( QtCore.QCoreApplication.processEvents) args.extend(extra_args) window = SimpleSubProcessDialog("External Diff", desc=ext_diff, args=args, dir=dir, auto_start_show_on_failed=True, parent=parent_window) window.process_widget.hide_progress() if parent_window: parent_window.windows.append(window) def has_ext_diff(): return len(ext_diffs) > 1 class ExtDiffMenu(QtWidgets.QMenu): _triggered = QtCore.pyqtSignal('QString') def __init__(self, parent=None, include_builtin=True, set_default=True): QtWidgets.QMenu.__init__(self, gettext("Show &differences"), parent) for name, command in list(ext_diffs.items()): if command == "" and include_builtin or not command == "": action = QtWidgets.QAction(name, self) action.setData(command) if command == default_diff and set_default: self.setDefaultAction(action) self.addAction(action) self.triggered[QtWidgets.QAction].connect(self.do_trigger) def do_trigger(self, action): ext_diff = str(action.data()) self._triggered.emit(ext_diff) class DiffButtons(QtWidgets.QWidget): _triggered = QtCore.pyqtSignal('QString') def __init__(self, parent = None): QtWidgets.QWidget.__init__(self, parent) layout = QtWidgets.QHBoxLayout(self) self.default_button = QtWidgets.QPushButton(gettext('Diff'), self) layout.addWidget(self.default_button) layout.setSpacing(0) self.default_button.clicked.connect(self.do_trigger) if has_ext_diff(): self.menu = ExtDiffMenu(self) self.menu_button = QtWidgets.QPushButton("", self) layout.addWidget(self.menu_button) self.menu_button.setMenu(self.menu) #QStyle.PM_MenuButtonIndicator self.menu_button.setFixedWidth( self.menu_button.style().pixelMetric( QtWidgets.QStyle.PM_MenuButtonIndicator) + self.menu_button.style().pixelMetric( QtWidgets.QStyle.PM_ButtonMargin) ) self.menu._triggered.connect(self.do_trigger) def do_trigger(self, ext_diff=None): # Note: this is connected to default_button.clicked # as well as the menu events. The button passes it's # checked state (always False here) in arguments. if not ext_diff: ext_diff = default_diff self._triggered.emit(ext_diff) class DiffItem(object): """ Diff data for each file. This class has moved from lib/diffwindow.py. You can see annotation of older code by:: bzr ann lib/diffwindow.py -r 1429 """ @classmethod def iter_items(cls, trees, specific_files=None, filter=None, lock_trees=False): """ RJLRJL: updated to call .iter_changes directly """ with ExitStack() as es: if lock_trees: for t in trees: es.enter_context(t.lock_read()) # changes = trees[1].iter_changes(trees[0], specific_files=specific_files, require_versioned=True) # def changes_key(change): # return change[1][1] or change[1][0] for change in trees[1].iter_changes(trees[0], specific_files=specific_files, require_versioned=True): # file_id -> ascii string # paths -> 2-tuple (old, new) fullpaths unicode/None # changed_content -> bool # versioned -> 2-tuple (bool, bool) # parent -> 2-tuple # name -> 2-tuple (old_name, new_name) utf-8?/None # kind -> 2-tuple (string/None, string/None) # executable -> 2-tuple (bool/None, bool/None) # NOTE: None value used for non-existing entry in corresponding # tree, e.g. for added/deleted file di = DiffItem.create(trees, change.file_id, change.path, change.changed_content, change.versioned, change.parent_id, change.name, change.kind, change.executable, filter = filter) if not di: continue yield di @classmethod def create(cls, trees, file_id, paths, changed_content, versioned, parent, name, kind, executable, filter = None): if parent == (None, None): # filter out TREE_ROOT (?) return None # check for manually deleted files (w/o using bzr rm commands) if kind[1] is None: if versioned == (False, True): # added and missed return None if versioned == (True, True): versioned = (True, False) paths = (paths[0], None) renamed = (parent[0], name[0]) != (parent[1], name[1]) dates = [None, None] for ix in range(2): if versioned[ix]: try: dates[ix] = trees[ix].get_file_mtime(paths[ix]) except OSError as e: if not renamed or e.errno != errno.ENOENT: raise # If we get ENOENT error then probably we trigger # bug #251532 in breezy. Take current time instead dates[ix] = time.time() except FileTimestampUnavailable: # ghosts around us (see Bug #513096) dates[ix] = 0 # using 1970/1/1 instead properties_changed = [] if bool(executable[0]) != bool(executable[1]): descr = {True: "+x", False: "-x", None: None} properties_changed.append((descr[executable[0]], descr[executable[1]])) if versioned == (True, False): status = N_('removed') elif versioned == (False, True): status = N_('added') elif renamed and changed_content: status = N_('renamed and modified') elif renamed: status = N_('renamed') else: status = N_('modified') # check filter options if filter and not filter(status): return None return cls(trees, file_id, paths, changed_content, versioned, kind, properties_changed, dates, status) def __init__(self, trees, file_id, paths, changed_content, versioned, kind, properties_changed, dates, status): self.trees = trees self.file_id = file_id self.paths = paths self.changed_content = changed_content self.versioned = versioned self.kind = kind self.properties_changed = properties_changed self.dates = dates self.status = status self._lines = None self._binary = None self._group_cache = {} self._encodings = [None, None] self._ulines = [None, None] def load(self): if self._lines is None: self._load_lines() def _load_lines(self): if ((self.versioned[0] != self.versioned[1] or self.changed_content) and (self.kind[0] == 'file' or self.kind[1] == 'file')): lines = [] binary = False # print('\n_load_lines', self.file_id) for ix, tree in enumerate(self.trees): content = () if self.versioned[ix] and self.kind[ix] == 'file': content = tree.get_file_lines(tree.id2path(self.file_id)) # print('\n\tcontent loaded for ', tree.id2path(self.file_id), self.file_id) lines.append(content) binary = binary or content_seems_to_be_binary(content) self._lines = lines self._binary = binary else: self._lines = ((),()) self._binary = False @property def lines(self): if self._lines is None: self._load_lines() return self._lines @property def binary(self): if self._binary is None: self._load_lines() return self._binary def groups(self, complete, ignore_whitespace): key = (complete, ignore_whitespace) groups = self._group_cache.get(key) if groups is not None: return groups lines = self.lines if not self.binary: if self.versioned == (True, False): groups = [[('delete', 0, len(lines[0]), 0, 0)]] elif self.versioned == (False, True): groups = [[('insert', 0, 0, 0, len(lines[1]))]] else: groups = self.difference_groups(lines, complete, ignore_whitespace) else: groups = [] self._group_cache[key] = groups return groups def difference_groups(self, lines, complete, ignore_whitespace): # RJL Changed strings to bytes for pattern-matching and coerced # left and right to lists (instead of generators) in 'if...' left, right = lines if ignore_whitespace: re_whitespaces = re.compile(br"\s+") left = list((re_whitespaces.sub(b" ", line) for line in left)) right = list((re_whitespaces.sub(b" ", line) for line in right)) matcher = SequenceMatcher(None, left, right) if complete: groups = list([matcher.get_opcodes()]) else: groups = list(matcher.get_grouped_opcodes()) return groups def get_unicode_lines(self, encodings): """ Return pair of unicode lines for each side of diff. Parameter encodings is 2-list or 2-tuple with encoding names (str) for each side of diff. """ lines = self.lines ulines = self._ulines for i in range(2): if encodings[i] != self._encodings[i]: self._encodings[i] = encodings[i] if self.binary: ulines[i] = lines[i][:] else: try: ulines[i] = [l.decode(encodings[i]) for l in lines[i]] except UnicodeDecodeError as e: filename = self.paths[i] trace.note("Some characters in file %s " "could not be properly decoded " "using '%s' encoding " "and therefore they replaced with special character.", filename, e.encoding) ulines[i] = [l.decode(encodings[i], 'replace') for l in lines[i]] return ulines CACHE_TIMEOUT = 3600 class _ExtDiffer(DiffFromTool): """ Run extdiff async. XXX: This class is strongly depending on DiffFromTool internals now. """ def __init__(self, command_string, old_tree, new_tree, to_file=None, path_encoding='utf-8'): DiffPath.__init__(self, old_tree, new_tree, to_file or sys.stdout, path_encoding) self.set_command_string(command_string) # parent = osutils.joinpath([osutils.tempfile.gettempdir(), 'qbrz']) parent = osutils.joinpath([tempfile.gettempdir(), 'qbrz']) if not os.path.isdir(parent): os.mkdir(parent) # self._root = osutils.mkdtemp(prefix='qbrz/brz-diff-') self._root = tempfile.mkdtemp(prefix='qbrz/brz-diff-') self.prefixes = {} self._set_prefix() @property def trees(self): return self.old_tree, self.new_tree def set_trees(self, old_tree, new_tree): self.old_tree = old_tree self.new_tree = new_tree self._set_prefix() def _set_prefix(self): self.old_prefix = self.get_prefix(self.old_tree) self.new_prefix = self.get_prefix(self.new_tree) def get_prefix(self, tree): def get_key(tree): if hasattr(tree, "get_revision_id"): return tree.__class__.__name__ + ":" + tree.get_revision_id().decode('utf-8') elif hasattr(tree, "abspath"): return tree.__class__.__name__ + ":" + tree.abspath("") else: return tree.__class__.__name__ + ":" + str(hash(tree)) if tree is None: return None key = get_key(tree) if key in self.prefixes: return self.prefixes[key] prefix = str(len(self.prefixes) + 1) self.prefixes[key] = prefix return prefix def set_command_string(self, command_string): command_template = cmdline.split(command_string) if "{old_path}" not in command_string: command_template.extend(["{old_path}", "{new_path}"]) self.command_template = command_template def finish(self): parent = os.path.dirname(self._root) for path in glob.glob(os.path.join(parent, "*")): if self._is_deletable(path): self._delete_tmpdir(path) self._delete_tmpdir(self._root) def finish_lazy(self): parent = os.path.dirname(self._root) for path in glob.glob(os.path.join(parent, "*")): if self._is_deletable(path): self._delete_tmpdir(path) open(os.path.join(self._root, ".delete"), "w").close() def _is_deletable(self, root): if os.path.exists(os.path.join(root, ".delete")): return True elif time.time() > os.path.getctime(root) + CACHE_TIMEOUT: return True else: return False def _delete_tmpdir(self, path): try: osutils.rmtree(path) except: if os.path.isdir(path): open(os.path.join(path, ".delete"), "w").close() def _write_file(self, relpath, tree, prefix, force_temp=False, allow_write=False, file_id=None): if force_temp or not isinstance(tree, WorkingTree): full_path = self._safe_filename(prefix, relpath) if os.path.isfile(full_path): return full_path # return DiffFromTool._write_file(self, relpath, tree, prefix, force_temp, allow_write, file_id) return DiffFromTool._write_file(self, relpath, tree, prefix, force_temp, allow_write) # def _prepare_files(self, old_path, new_path, force_temp=False, # file_id=None, allow_write_new=False): # old_disk_path = self._write_file(old_path, self.old_tree, # self.old_prefix, force_temp, # file_id=file_id) # new_disk_path = self._write_file(new_path, self.new_tree, # self.new_prefix, force_temp, # allow_write=allow_write_new, # file_id=file_id) # return old_disk_path, new_disk_path def _execute(self, old_path, new_path): command = self._get_command(old_path, new_path) try: subprocess.Popen(command, cwd=self._root) except OSError as e: if e.errno == errno.ENOENT: raise ExecutableMissing(command[0]) else: raise return 0 def diff(self, file_id): try: new_path = self.new_tree.id2path(file_id) # new_kind = self.new_tree.kind(new_path, file_id) new_kind = self.new_tree.kind(new_path) old_path = self.old_tree.id2path(file_id) # old_kind = self.old_tree.kind(old_path, file_id) old_kind = self.old_tree.kind(old_path) except NoSuchId: return DiffPath.CANNOT_DIFF # return DiffFromTool.diff(self, file_id, old_path, new_path, old_kind, new_kind) return DiffFromTool.diff(self, old_path, new_path, old_kind, new_kind) class ExtDiffContext(QtCore.QObject): """ Environment for external diff execution. This class manages cache of diffed files and when it will be deleted. """ def __init__(self, parent, to_file=None, path_encoding='utf-8'): """ :parent: parent widget. If specified, cache is deleted automatically when parent is closed. :to_file: stream to write output messages. If not specified, stdout is used. :path_encoding: encoding of path """ QtCore.QObject.__init__(self, parent) self.to_file = to_file self.path_encoding = path_encoding self._differ = None if parent is not None: parent.window().installEventFilter(self) def finish(self): """ Remove temporary directory which contains cached files. """ try: if self._differ: self._differ.finish() self._differ = None except: pass def finish_lazy(self): """ Mark temporary directory as deletable, without delete it actually. XXX: Directory marked as deletable will be deleted next time. """ try: if self._differ: self._differ.finish_lazy() self._differ = None except: pass @property def rootdir(self): if self._differ: return self._differ._root else: return None def setup(self, command_string, old_tree, new_tree): """ Set or change diff command and diffed trees. """ if self._differ is None: self._differ = _ExtDiffer(command_string, old_tree, new_tree, self.to_file, self.path_encoding) else: self._differ.set_trees(old_tree, new_tree) self._differ.set_command_string(command_string) def eventFilter(self, obj, event): if event.type() == QtCore.QEvent.Close: self.finish() return QtCore.QObject.eventFilter(self, obj, event) def diff_ids(self, file_ids, interval=50, lock_trees=True): """ Show diffs of specified file_ids. NOTE: Directories cannot be specified. Use diff_tree or diff_paths instead when specifing directory. """ with ExitStack() as es: if lock_trees: es.enter_context(self._differ.new_tree.lock_read()) es.enter_context(self._differ.old_tree.lock_read()) for file_id in file_ids: self._differ.diff(file_id) time.sleep(interval * 0.001) def diff_paths(self, paths, interval=50, lock_trees=True): """ Show diffs of specified file paths. """ new_tree = self._differ.new_tree old_tree = self._differ.old_tree valid_paths = [] ids = [] dir_included = False with ExitStack() as es: # Sometimes, we must lock tree before calling tree.kind() if lock_trees: es.enter_context(new_tree.lock_read()) es.enter_context(old_tree.lock_read()) for p in paths: id = new_tree.path2id(p) if id: valid_paths.append(p) ids.append(id) dir_included = dir_included or (new_tree.kind(p) != 'file') else: mutter('%s does not exist in the new tree' % p) if not ids: return if dir_included: self.diff_tree(valid_paths, interval, False) else: self.diff_ids(ids, interval, False) def diff_tree(self, specific_files=None, interval=50, lock_trees=True): """ Show diffs between two trees. (trees must be set by setup method) NOTE: Directory path can be specified to specific_files. """ for di in DiffItem.iter_items(self._differ.trees, specific_files=specific_files, lock_trees=lock_trees): if di.changed_content: self._differ.diff(di.file_id) time.sleep(interval * 0.001) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/diff_arg.py0000644000000000000000000001512414556556456013526 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2008 Gary van der Merwe # # 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. """Diff Arg Provider classes.""" from breezy.revision import NULL_REVISION, CURRENT_REVISION # These classes were extracted from diff.py to avoid dependency on PyQt4 # in commands.py where base provider class is used, but PyQt4 is not required # for overriden merge command. class DiffArgProvider (object): """Contract class to pass arguments to either builtin diff window, or external diffs""" def get_diff_window_args(self, processEvents, es): """Returns the arguments for the builtin diff window. :return: {"old_tree": old_tree, "new_tree": new_tree, "old_branch": old_branch, (optional) "new_branch": new_branch, (optional) "specific_files": specific_files, (optional) "ignore_whitespace": True or False} (optional) """ raise NotImplementedError() def get_ext_diff_args(self, processEvents): """Returns the command line arguments for running an ext diff window. :return: (dir, List of command line arguments). """ raise NotImplementedError() class InternalDiffArgProvider(DiffArgProvider): """Use for passing arguments from internal source.""" def __init__(self, old_revid, new_revid, old_branch, new_branch, old_tree=None, new_tree=None, specific_files=None, specific_file_ids=None): self.old_revid = old_revid self.new_revid = new_revid self.old_branch = old_branch self.new_branch = new_branch self.specific_files = specific_files self.specific_file_ids = specific_file_ids self.old_tree = old_tree self.new_tree = new_tree def need_to_load_paths(self): return self.specific_file_ids is not None \ and self.specific_files is None def load_old_tree(self): if not self.old_tree: self.old_tree = \ self.old_branch.repository.revision_tree(self.old_revid) def load_new_tree_and_paths(self): if not self.new_tree: self.new_tree = \ self.new_branch.repository.revision_tree(self.new_revid) if self.need_to_load_paths(): with self.new_tree.lock_read(): self.specific_files = [self.new_tree.id2path(id) \ for id in self.specific_file_ids] def get_diff_window_args(self, processEvents, es): self.load_old_tree() processEvents() self.load_new_tree_and_paths() processEvents() return {"old_tree": self.old_tree, "new_tree": self.new_tree, "old_branch": self.old_branch, "new_branch": self.new_branch, "specific_files": self.specific_files} def get_revspec(self): def get_revspec_part(revid): if revid.startswith(CURRENT_REVISION): return '' return 'revid:%s' % revid return "-r%s..%s" % ( get_revspec_part(self.old_revid), get_revspec_part(self.new_revid)) def get_ext_diff_args(self, processEvents): from breezy import urlutils from breezy import errors args = [] revspec = self.get_revspec() if revspec: args.append(revspec) from breezy.workingtree import WorkingTree # RJLRJL: TODO: check this (see rev 1074) def get_base(branch, tree): if tree and isinstance(tree, WorkingTree): return urlutils.local_path_to_url(tree.basedir) return branch.base old_base = get_base(self.old_branch, self.old_tree) new_base = get_base(self.new_branch, self.new_tree) # We need to avoid using --new and --old because diff tools # does not support it. There are however some cases where # this is not possilble. need_old = False if not self.old_branch.base == self.new_branch.base: need_old = True try: dir = urlutils.local_path_from_url(new_base) except errors.InvalidURL: dir = "" args.append("--new=%s" % new_base) need_old = True if need_old: args.append("--old=%s" % old_base) if self.need_to_load_paths(): self.load_new_tree_and_paths() processEvents() if self.specific_files: args.extend(self.specific_files) return dir, args class InternalWTDiffArgProvider(InternalDiffArgProvider): """Use for passing arguments from internal source where the new tree is the working tree.""" def __init__(self, old_revid, new_tree, old_branch, new_branch, specific_files=None): self.old_revid = old_revid self.new_tree = new_tree self.old_branch = old_branch self.new_branch = new_branch self.specific_files = specific_files self.old_tree = None def load_old_tree(self): if self.old_revid is None and self.old_tree is None: self.old_tree = self.new_tree.basis_tree() self.old_revid = self.old_tree.get_revision_id() else: InternalDiffArgProvider.load_old_tree(self) def get_diff_window_args(self, processEvents, es): self.load_old_tree() processEvents() return {"old_tree": self.old_tree, "new_tree": self.new_tree, "old_branch": self.old_branch, "new_branch": self.new_branch, "specific_files": self.specific_files} def get_revspec(self): if self.old_revid is not None: return "-rrevid:%s" % (self.old_revid,) else: return None def need_to_load_paths(self): return False ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/diffview.py0000644000000000000000000011531314556556456013571 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2007 Lukáš Lalinský # # 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 PyQt5 import QtCore, QtGui, QtWidgets import re from patiencediff import PatienceSequenceMatcher as SequenceMatcher from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.util import ( file_extension, format_timestamp, get_qbrz_config, get_monospace_font, get_tab_width_pixels, ) from breezy.trace import mutter from breezy.plugins.qbrz.lib.syntaxhighlighter import ( CachedTTypeFormater, split_tokens_at_lines, ) from breezy.plugins.qbrz.lib.widgets.texteditaccessory import ( GuideBarPanel, GBAR_LEFT, GBAR_RIGHT ) have_pygments = True try: from pygments import lex from pygments.util import ClassNotFound from pygments.lexers import get_lexer_for_filename except ImportError: have_pygments = False colors = { 'delete': [QtGui.QColor(255, 160, 180), QtGui.QColor(200, 60, 90)], 'insert': [QtGui.QColor(180, 255, 180), QtGui.QColor(80, 210, 80)], 'replace': [QtGui.QColor(206, 226, 250), QtGui.QColor(90, 130, 180)], 'blank': [QtGui.QColor(240, 240, 240), QtGui.QColor(171, 171, 171)], 'dummy': [QtGui.QColor(0, 0, 0, 0), QtGui.QColor(0, 0, 0, 0)], } # The background color of the replacement text in a replacement group. interline_changes_background = QtGui.QColor(180, 210, 250) # load user-defined color mapping from configuration file. # For each kind, there can be two entries in the configuration file, # under the [QDIFF COLORS] section: # kind_bound -- the color of the boundary of the rectangle this kind refers to. # kind_fill -- the color of the filling of that same rectangle. config = get_qbrz_config() component_dict = {0:'fill', 1:'bound'} for key in colors.keys(): for comp in [0,1]: color = None try: color = config.get_color(key + '_' + component_dict[comp], 'QDIFF COLORS') except ValueError as msg: # error handling. mutter(str(msg)) if color is not None: colors[key][comp] = color # Get a user-defined replacement text background try: new_interline_bg = config.get_color('interline_changes_background', 'QDIFF COLORS') if new_interline_bg is not None: interline_changes_background = new_interline_bg except ValueError as msg: mutter(str(msg)) brushes = {} for kind, cols in list(colors.items()): brushes[kind] = (QtGui.QBrush(cols[0]), QtGui.QBrush(cols[1])) class DiffSourceView(QtWidgets.QTextBrowser): resized = QtCore.pyqtSignal() # RJL added for qt5 documentChangeFinished = QtCore.pyqtSignal() def __init__(self, parent=None): QtWidgets.QTextBrowser.__init__(self, parent) self.setLineWrapMode(QtWidgets.QTextEdit.NoWrap) self.clear() self.scrollbar = None self.changes = [] self.infoBlocks = [] def clear(self): self.changes = [] self.infoBlocks = [] def resizeEvent(self, event): QtWidgets.QTextBrowser.resizeEvent(self, event) self.resized.emit() def paintEvent(self, event): w = self.width() y = self.verticalScrollBar().value() painter = QtGui.QPainter(self.viewport()) painter.setClipRect(event.rect()) bot = event.rect().bottom() top = event.rect().top() pen = QtGui.QPen(QtCore.Qt.black) pen.setWidth(2) painter.setPen(pen) for block_y in self.infoBlocks: block_y = int(block_y - y) if block_y < top: continue if block_y > bot: break painter.drawLine(0, block_y, w, block_y) pen.setWidth(1) for y_top, y_bot, kind in self.changes: y_top = int(y_top - y) y_bot = int(y_bot - y) if y_top < top and y_bot < top: continue if y_top > bot and y_bot > bot: break painter.fillRect(0, y_top, w, y_bot - y_top, brushes[kind][0]) painter.setPen(colors[kind][1]) painter.drawLine(0, y_top, w, y_top) painter.drawLine(0, y_bot - 1, w, y_bot - 1) del painter QtWidgets.QTextBrowser.paintEvent(self, event) # def wheelEvent(self, event): # if event.orientation() == QtCore.Qt.Vertical and self.scrollbar: # self.scrollbar.wheelEvent(event) # else: # QtWidgets.QTextBrowser.wheelEvent(self, event) def wheelEvent(self, event): # RJLRJL orientation is no longer in qt5, so replaed with angleDelta().y() > 0 if event.angleDelta().y() > 0 and self.scrollbar: self.scrollbar.wheelEvent(event) else: QtWidgets.QTextBrowser.wheelEvent(self, event) class DiffViewHandle(QtWidgets.QSplitterHandle): def __init__(self, parent=None): QtWidgets.QSplitterHandle.__init__(self, QtCore.Qt.Horizontal, parent) self.scrollbar = None self.view = parent self.changes = [] self.infoBlocks = [] self.clear() def clear(self): self.changes = [] self.infoBlocks = [] def paintEvent(self, event): painter = QtGui.QPainter(self) painter.setClipRect(event.rect()) frame = QtWidgets.QApplication.style().pixelMetric(QtWidgets.QStyle.PM_DefaultFrameWidth) ly = self.view.browsers[0].verticalScrollBar().value() - frame ry = self.view.browsers[1].verticalScrollBar().value() - frame w = self.width() h = self.height() painter.setRenderHints(QtGui.QPainter.Antialiasing, True) curve_factor = 16 def create_line(ly, ry, right_to_left=False): """ Create path which represents upper or lower line of change marker. """ line = QtGui.QPainterPath() if not right_to_left: line.moveTo(0, ly) line.cubicTo(curve_factor, ly, w - curve_factor, ry, w, ry) else: line.moveTo(w, ry) line.cubicTo(w - curve_factor, ry, curve_factor, ly, 0, ly) return line pen = QtGui.QPen(QtCore.Qt.black) pen.setWidth(2) painter.setPen(pen) for block_ly, block_ry in self.infoBlocks: block_ly -= ly block_ry -= ry if block_ly < 0 and block_ry < 0: continue if block_ly > h and block_ry > h: break painter.drawPath(create_line(block_ly, block_ry)) for ly_top, ly_bot, ry_top, ry_bot, kind in self.changes: ly_top -= ly ly_bot -= ly + 1 ry_top -= ry ry_bot -= ry + 1 if ly_top < 0 and ly_bot < 0 and ry_top < 0 and ry_bot < 0: continue if ly_top > h and ly_bot > h and ry_top > h and ry_bot > h: break upper_line = create_line(ly_top, ry_top) lower_line = create_line(ly_bot, ry_bot, True) region = QtGui.QPainterPath() region.moveTo(0, ly_top) region.connectPath(upper_line) region.lineTo(w, ry_bot) region.connectPath(lower_line) region.closeSubpath() painter.fillPath(region, brushes[kind][0]) painter.setPen(colors[kind][1]) for path, aa in zip((upper_line, lower_line), (ly_top != ry_top, ly_bot != ry_bot)): painter.setRenderHints(QtGui.QPainter.Antialiasing, aa) painter.drawPath(path) del painter def wheelEvent(self, event): # RJL orientation is now obsolete # if event.orientation() == QtCore.Qt.Vertical: # angleDelta().y() provides the angle through which the common # vertical mouse wheel was rotated since the previous event. # angleDelta().x() provides the angle through which the horizontal # mouse wheel was rotated, if the mouse has a horizontal wheel; # otherwise it stays at zero. # We'll be vertical if y_delta is non-zero x_delta is zero... if event.angleDelta().y() and not event.angleDelta().x(): self.view.scrollbar.wheelEvent(event) else: QtWidgets.QSplitterHandle.wheelEvent(self, event) class SidebySideDiffView(QtWidgets.QFrame): def __init__(self, parent=None): QtWidgets.QFrame.__init__(self, parent) hbox = QtWidgets.QHBoxLayout(self) hbox.setContentsMargins(0, 0, 0, 0) hbox.setSpacing(0) self.view = _SidebySideDiffView(parent) self.browsers = self.view.browsers hbox.addWidget(self.view) hbox.addWidget(self.view.scrollbar) def __getattr__(self, name): """Delegate unknown methods to internal diffview.""" return getattr(self.view, name) SYNC_POSITION = 0.4 class SidebySideDiffViewScrollBar(QtWidgets.QScrollBar): def __init__(self, handle, browsers): QtWidgets.QScrollBar.__init__(self) self.handle = handle self.browsers = browsers self.total_length = 0 self.changes = [] self.complete = False for b in browsers: b.scrollbar = self for i, scbar in enumerate([self] + [b.verticalScrollBar() for b in browsers]): scbar.valueChanged[int].connect(lambda value, target=i : self.scrolled(target)) browsers[0].resized.connect(self.adjust_range) self.setSingleStep(browsers[0].verticalScrollBar().singleStep()) self.adjust_range() self.syncing = False self.gap_with_left = 0 def clear(self): self.gap_with_left = 0 self.total_length = 0 self.changes = [] def set_complete(self, complete): if self.complete != complete: self.complete = complete self.clear() def adjust_range(self): page_step = self.browsers[0].verticalScrollBar().pageStep() self.setPageStep(page_step) self.setRange(0, int(self.total_length - page_step + 4)) self.setVisible(self.total_length > page_step) def get_position_info(self, target): """ Get position info should scroll to. target: 0 is self, 1 is left browser, 2 is right browser """ basis_y = self.height() * SYNC_POSITION if target == 0: scbar = self changes = self.changes else: b = self.browsers[target - 1] scbar, changes = b.verticalScrollBar(), b.changes if not self.complete: return 'exact', scbar.value() else: value = scbar.value() + basis_y prev = (0, 0, None) for i, ch in enumerate(changes): if value <= ch[1]: if ch[0] <= value: ratio = float(value - ch[0]) / (ch[1] - ch[0]) return 'in', i, ratio else: offset = value - prev[1] return 'after', i - 1, offset break else: prev = ch else: offset = value - prev[1] return 'after', len(self.changes) - 1, offset def scroll_to(self, target: int, position): """ Scroll to specified position. target: 0 is self, 1 is left browser, 2 is right browser """ basis_y: float = self.height() * SYNC_POSITION if target == 0: scbar, changes = self, self.changes else: b = self.browsers[target - 1] scbar, changes = b.verticalScrollBar(), b.changes if position[0] == 'exact': scbar.setValue(position[1]) elif position[0] == 'in': change_idx, ratio = position[1:] start, end = changes[change_idx][:2] # scbar.setValue(start + float(end - start) * ratio - basis_y) scbar.setValue(int(start + float(end - start) * ratio - basis_y)) else: change_idx, offset = position[1:] if change_idx < 0: start = 0 else: start = changes[change_idx][1] # scbar.setValue(start + offset - basis_y) scbar.setValue(int(start + offset - basis_y)) def scrolled(self, target): if self.syncing: return try: self.syncing = True position = self.get_position_info(target) for t in range(3): if t != target: self.scroll_to(t, position) self.handle.update() finally: self.syncing = False def append_change(self, l_top, l_bot, r_top, r_bot, kind): if not self.complete: return changes = self.changes height = max(l_bot - l_top, r_bot - r_top) top = l_top + self.gap_with_left changes.append((top, top + height, kind)) self.gap_with_left = top + height - l_bot def fix_document_length(self, cursors): if not self.complete: scbar = self.browsers[0].verticalScrollBar() self.total_length = scbar.maximum() + scbar.pageStep() else: l = cursors[0].block().layout() self.total_length = l.position().y() + l.boundingRect().height() + self.gap_with_left self.adjust_range() def setup_guidebar_entries(gb): gb.add_entry('title', QtGui.QColor(80, 80, 80), -1) for tag in ('delete', 'insert', 'replace'): gb.add_entry(tag, colors[tag][0], 0) class _SidebySideDiffView(QtWidgets.QSplitter): """Widget to show differences in side-by-side format.""" def __init__(self, parent=None): QtWidgets.QSplitter.__init__(self, QtCore.Qt.Horizontal, parent) self.setHandleWidth(30) self.complete = False titleFont = QtGui.QFont(self.font()) titleFont.setPointSizeF(titleFont.pointSizeF() * 140 / 100) titleFont.setBold(True) self.monospacedFont = get_monospace_font() metadataFont = QtGui.QFont(self.font()) metadataFont.setPointSizeF(titleFont.pointSizeF() * 70 / 100) metadataLabelFont = QtGui.QFont(metadataFont) metadataLabelFont.setBold(True) self.monospacedFormat = QtGui.QTextCharFormat() self.monospacedFormat.setFont(self.monospacedFont) self.ttype_formater = CachedTTypeFormater(QtGui.QTextCharFormat(self.monospacedFormat)) self.background = self.monospacedFormat.background() self.titleFormat = QtGui.QTextCharFormat() self.titleFormat.setFont(titleFont) self.metadataFormat = QtGui.QTextCharFormat() self.metadataFormat.setFont(metadataFont) self.metadataLabelFormat = QtGui.QTextCharFormat() self.metadataLabelFormat.setFont(metadataLabelFont) self.docs = (QtGui.QTextDocument(), QtGui.QTextDocument()) self.browsers = (DiffSourceView(self), DiffSourceView(self)) self.guidebar_panels = [ GuideBarPanel(b, align=a) for (b, a) in zip(self.browsers, (GBAR_LEFT, GBAR_RIGHT)) ] for g in self.guidebar_panels: setup_guidebar_entries(g.bar) self.reset_guidebar_data() for b in self.browsers: b.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.cursors = [QtGui.QTextCursor(doc) for doc in self.docs] for i, (panel, doc, cursor) in enumerate(zip(self.guidebar_panels, self.docs, self.cursors)): doc.setUndoRedoEnabled(False) doc.setDefaultFont(self.monospacedFont) panel.edit.setDocument(doc) self.addWidget(panel) self.setCollapsible(i, False) char_format = QtGui.QTextCharFormat() char_format.setAnchorNames(["top"]) cursor.insertText("", char_format) self.scrollbar = SidebySideDiffViewScrollBar(self.handle(1), self.browsers) self.ignoreUpdate = False self.browsers[0].horizontalScrollBar().valueChanged[int].connect(self.syncHorizontalSlider1) self.browsers[1].horizontalScrollBar().valueChanged[int].connect(self.syncHorizontalSlider2) self.rewinded = False self.lastModifiedLabel = gettext('Last modified:') self.statusLabel = gettext('Status:') self.kindLabel = gettext('Kind:') self.propertiesLabel = gettext('Properties:') self.image_exts = ['.'+str(i) for i in QtGui.QImageReader.supportedImageFormats()] config = get_qbrz_config() self.show_intergroup_colors = config.get_option("diff_show_intergroup_colors") in ("True", "1") def setTabStopWidths(self, pixels): for (pixel_width, browser) in zip(pixels, self.browsers): browser.setTabStopWidth(pixel_width) def reset_guidebar_data(self): self.guidebar_data = [ dict(title=[], delete=[], insert=[], replace=[]), # for left view dict(title=[], delete=[], insert=[], replace=[]), # for right view ] def clear(self): self.browsers[0].clear() self.browsers[1].clear() self.handle(1).clear() self.scrollbar.clear() for doc in self.docs: doc.clear() self.reset_guidebar_data() self.update() def set_complete(self, complete): if self.complete != complete: self.complete = complete self.clear() self.scrollbar.set_complete(complete) def append_diff(self, paths, file_id, kind, status, dates, present, binary, lines, groups, data, properties_changed): cursors = self.cursors guidebar_data = self.guidebar_data for i in range(2): cursor = cursors[i] guidebar_data[i]['title'].append((cursor.block().blockNumber(), 2)) cursor.beginEditBlock() cursor.insertText(paths[i] or " ", self.titleFormat) # None or " " => " " cursor.insertBlock() if present[i]: cursor.insertText(self.lastModifiedLabel, self.metadataLabelFormat) cursor.insertText(" %s, " % format_timestamp(dates[i]), self.metadataFormat) cursor.insertText(self.statusLabel, self.metadataLabelFormat) cursor.insertText(" %s, " % gettext(status), self.metadataFormat) cursor.insertText(self.kindLabel, self.metadataLabelFormat) cursor.insertText(" %s" % gettext(kind[i]), self.metadataFormat) if properties_changed: cursor.insertText(", ", self.metadataFormat) cursor.insertText(self.propertiesLabel, self.metadataLabelFormat) cursor.insertText(" ", self.metadataFormat) cursor.insertText(", ".join([p[i] for p in properties_changed]), self.metadataFormat) else: cursor.insertText(" ", self.metadataFormat) cursor.insertBlock() infoBlocks = (cursors[0].block().layout(), cursors[1].block().layout()) changes = [] if not binary: for cursor in cursors: cursor.setCharFormat(self.monospacedFormat) cursor.insertBlock() def fix_last_line(lines): """Fix last line if there is no new line. @param lines: list of lines @return: original lines if lastline is OK, or new list with fixed last line. """ if lines: last = lines[-1] if last and last[-1] not in ('\r', '\n'): lines = lines[:-1] + [last+'\n'] return lines lines = [fix_last_line(l) for l in lines] if have_pygments: use_pygments = True try: def getTokens(p, d, path): if not p: return [] lexer = get_lexer_for_filename(path, stripnl=False) tokens = [] for token in split_tokens_at_lines(lex(d, lexer)): tokens.append(token) if len(token) % 100 == 0: QtCore.QCoreApplication.processEvents() return tokens display_lines = [getTokens(p, d, path) for p, d, path in zip(present, data, paths)] except ClassNotFound: use_pygments = False display_lines = lines else: use_pygments = False display_lines = lines def insertLine(cursor, line): if use_pygments: for ttype, value in line: ttype_format = self.ttype_formater.format(ttype) modifyFormatForTag(ttype_format, "equal") cursor.insertText(value, ttype_format) else: cursor.insertText(line) def insertIxs(ixs): for cursor, line, ix in zip(cursors, display_lines, ixs): for l in line[ix[0]:ix[1]]: insertLine(cursor, l) def modifyFormatForTag(type_format, tag): if tag == "replace": type_format.setBackground(interline_changes_background) elif tag == "equal": type_format.setBackground(self.background) elif self.show_intergroup_colors: type_format.setBackground(brushes[tag][0]) else: type_format.setBackground(interline_changes_background) split_words = re.compile(r"\w+|\n\r|\r\n|\W") def insertIxsWithChangesHighlighted(ixs): texts = ["".join(l[ix[0]:ix[1]]) for l, ix in zip(lines, ixs)] if use_pygments: # This is what the pygments lexer does, so we need to do the # same incase we have \r\n line endings. texts = ["\n".join(t.splitlines()) for t in texts] texts = [split_words.findall(t) for t in texts] if use_pygments: groups = ([], []) for tag, i0, i1, j0, j1 in SequenceMatcher(None, tuple(texts[0]), tuple(texts[1]), ).get_opcodes(): groups[0].append((tag, len("".join(texts[0][i0:i1])))) groups[1].append((tag, len("".join(texts[1][j0:j1])))) for cursor, ls, ix, g in zip(cursors, display_lines, ixs, groups): tag, n = g.pop(0) for l in ls[ix[0]:ix[1]]: for ttype, value in l: while value: ttype_format = self.ttype_formater.format(ttype) modifyFormatForTag(ttype_format, tag) t = value[0:n] cursor.insertText(t, ttype_format) value = value[len(t):] n -= len(t) if n <= 0: if g: tag, n = g.pop(0) else: # why would this happen????? tag = 'equal' n = len(value) else: for tag, i0, i1, j0, j1 in SequenceMatcher(None, tuple(texts[0]), tuple(texts[1]), ).get_opcodes(): ttype_format = QtGui.QTextCharFormat() ttype_format.setFont(self.monospacedFont) modifyFormatForTag(ttype_format, tag) cursors[0].insertText("".join(texts[0][i0:i1]),ttype_format) cursors[1].insertText("".join(texts[1][j0:j1]),ttype_format) for cursor in cursors: cursor.setCharFormat (self.monospacedFormat) for i, group in enumerate(groups): if i > 0: y_top = [cursor.block().layout() for cursor in self.cursors] for cursor in cursors: cursor.insertBlock() t_bot = [cursor.block().layout() for cursor in self.cursors] changes.append((y_top[0], t_bot[0], y_top[1], t_bot[1], 'blank')) linediff = 0 for g in group: tag = g[0] # indexes ixs = ((g[1], g[2]), (g[3], g[4])) n = [ix[1]-ix[0] for ix in ixs] if tag == "equal": insertIxs(ixs) else: y_top = [cursor.block().layout() for cursor in self.cursors] g_top = [cursor.block().blockNumber() for cursor in self.cursors] if tag == "replace": insertIxsWithChangesHighlighted(ixs) else: insertIxs(ixs) linediff += n[0] - n[1] y_bot = [cursor.block().layout() for cursor in self.cursors] changes.append((y_top[0], y_bot[0], y_top[1], y_bot[1], tag)) g_bot = [cursor.block().blockNumber() for cursor in self.cursors] for data, top, bot in zip(guidebar_data, g_top, g_bot): data[tag].append((top, bot - top)) if linediff == 0: continue if not self.complete: if linediff < 0: i0 = group[-1][2] i1 = i0 - linediff exlines = display_lines[0][i0:i1] linediff = -linediff - len(exlines) cursor = cursors[0] else: j0 = group[-1][4] j1 = j0 + linediff exlines = display_lines[1][j0:j1] linediff = linediff - len(exlines) cursor = cursors[1] for l in exlines: insertLine(cursor, l) if i % 100 == 0: QtCore.QCoreApplication.processEvents() else: y_top = [cursor.block().layout() for cursor in self.cursors] heights = [0,0] is_images = [False, False] for i in range(2): if present[i]: ext = file_extension(paths[i]).lower() if ext in self.image_exts: is_images[i] = True image = QtGui.QImage() image.loadFromData(data[i]) heights[i] = image.height() self.docs[i].addResource(QtGui.QTextDocument.ImageResource, QtCore.QUrl(file_id), image) max_height = max(heights) for i, cursor in enumerate(self.cursors): block_format = QtGui.QTextBlockFormat() block_format.setBottomMargin((max_height - heights[i])/2) block_format.setTopMargin((max_height - heights[i])/2) cursor.insertBlock(block_format) if present[i]: if is_images[i]: cursor.insertImage(file_id) else: cursor.insertText(gettext('[binary file (%d bytes)]') % len(data[i])) else: cursor.insertText(" ") cursor.insertBlock(QtGui.QTextBlockFormat()) y_bot = [cursor.block().layout() for cursor in self.cursors] changes.append((y_top[0], y_bot[0], y_top[1], y_bot[1], 'dummy')) for cursor in cursors: cursor.endEditBlock() cursor.insertText("\n") y_top = [cursor.block().layout() for cursor in self.cursors] if not self.complete: maxy = max([l.position().y() for l in y_top]) for cursor in cursors: block_format = QtGui.QTextBlockFormat() block_format.setBottomMargin(maxy-cursor.block().layout().position().y()) cursor.setBlockFormat(block_format) cursor.insertBlock(QtGui.QTextBlockFormat()) l_block = infoBlocks[0].position().y() r_block = infoBlocks[1].position().y() self.browsers[0].infoBlocks.append(l_block) self.browsers[1].infoBlocks.append(r_block) self.handle(1).infoBlocks.append((l_block, r_block)) for (ly_top, ly_bot, ry_top, ry_bot, kind) in changes: ly_top = ly_top.position().y() - 1 ly_bot = ly_bot.position().y() + 1 ry_top = ry_top.position().y() - 1 ry_bot = ry_bot.position().y() + 1 self.scrollbar.append_change(ly_top, ly_bot, ry_top, ry_bot, kind) self.browsers[0].changes.append((ly_top, ly_bot, kind)) self.browsers[1].changes.append((ry_top, ry_bot, kind)) self.handle(1).changes.append((ly_top, ly_bot, ry_top, ry_bot, kind)) self.scrollbar.fix_document_length(cursors) # check horizontal scrollbars and force both if scrollbar visible only at one side if (self.browsers[0].horizontalScrollBar().isVisible() or self.browsers[1].horizontalScrollBar().isVisible()): self.browsers[0].setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) self.browsers[1].setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) self.update_guidebar() self.update() def rewind(self): if not self.rewinded: self.rewinded = True self.browsers[0].scrollToAnchor("top") self.browsers[1].scrollToAnchor("top") def _syncSliders(self, slider1, slider2, value): m = slider1.maximum() if m: value = slider2.minimum() + slider2.maximum() * (value - slider1.minimum()) / m self.ignoreUpdate = True slider2.setValue(int(value)) self.ignoreUpdate = False def syncHorizontalSlider1(self, value): if not self.ignoreUpdate: slider1 = self.browsers[0].horizontalScrollBar() slider2 = self.browsers[1].horizontalScrollBar() self._syncSliders(slider1, slider2, value) self.handle(1).update() def syncHorizontalSlider2(self, value): if not self.ignoreUpdate: slider1 = self.browsers[0].horizontalScrollBar() slider2 = self.browsers[1].horizontalScrollBar() self._syncSliders(slider2, slider1, value) self.handle(1).update() def createHandle(self): return DiffViewHandle(self) def update_guidebar(self): for gb, data in zip(self.guidebar_panels, self.guidebar_data): gb.bar.update_data(**data) class SimpleDiffView(GuideBarPanel): def __init__(self, parent): self.view = _SimpleDiffView(parent) GuideBarPanel.__init__(self, self.view, parent=parent) setup_guidebar_entries(self) def append_diff(self, *args, **kwargs): self.view.append_diff(*args, **kwargs) self.update_data(**self.view.guidebar_data) def __getattr__(self, name): """Delegate unknown methods to internal diffview.""" return getattr(self.view, name) class _SimpleDiffView(QtWidgets.QTextBrowser): """Widget to show differences in unidiff format.""" documentChangeFinished = QtCore.pyqtSignal() def __init__(self, parent=None): QtWidgets.QTextBrowser.__init__(self, parent) self.doc = QtGui.QTextDocument(parent) self.doc.setUndoRedoEnabled(False) self.setDocument(self.doc) option = self.doc.defaultTextOption() option.setWrapMode(QtGui.QTextOption.NoWrap) self.doc.setDefaultTextOption(option) self.rewinded = False self.cursor = QtGui.QTextCursor(self.doc) char_format = QtGui.QTextCharFormat() char_format.setAnchorNames(["top"]) self.cursor.insertText("", char_format) monospacedFont = get_monospace_font() self.monospacedFormat = QtGui.QTextCharFormat() self.monospacedFormat.setFont(monospacedFont) self.monospacedInsertFormat = QtGui.QTextCharFormat(self.monospacedFormat) self.monospacedInsertFormat.setForeground(QtGui.QColor(0, 136, 11)) self.monospacedDeleteFormat = QtGui.QTextCharFormat(self.monospacedFormat) self.monospacedDeleteFormat.setForeground(QtGui.QColor(204, 0, 0)) monospacedBoldFont = QtGui.QFont(monospacedFont) monospacedBoldFont.setBold(True) monospacedItalicFont = QtGui.QFont(monospacedFont) monospacedItalicFont.setItalic(True) self.monospacedBoldInsertFormat = QtGui.QTextCharFormat(self.monospacedInsertFormat) self.monospacedBoldInsertFormat.setFont(monospacedBoldFont) self.monospacedBoldDeleteFormat = QtGui.QTextCharFormat(self.monospacedDeleteFormat) self.monospacedBoldDeleteFormat.setFont(monospacedBoldFont) self.monospacedHeaderFormat = QtGui.QTextCharFormat() self.monospacedHeaderFormat.setFont(monospacedBoldFont) self.monospacedHeaderFormat.setBackground(QtGui.QColor(246, 245, 238)) self.monospacedHeaderFormat.setForeground(QtGui.QColor(117, 117, 117)) self.monospacedHunkFormat = QtGui.QTextCharFormat() self.monospacedHunkFormat.setFont(monospacedItalicFont) self.monospacedHunkFormat.setForeground(QtGui.QColor(153, 30, 199)) self.reset_guidebar_data() def rewind(self): if not self.rewinded: self.rewinded = True self.scrollToAnchor("top") def set_complete(self, complete): self.clear() def append_diff(self, paths, file_id, kind, status, dates, present, binary, lines, groups, data, properties_changed): guidebar_data = self.guidebar_data guidebar_data['title'].append((self.cursor.block().blockNumber(), 2)) self.cursor.beginEditBlock() path_info = paths[1] or paths[0] if status in ('renamed', 'renamed and modified'): path_info = paths[0] + ' => ' + paths[1] kind_info = kind[0] or kind[1] self.cursor.insertText("=== %s %s %s" % (gettext(status), gettext(kind_info), path_info), self.monospacedHeaderFormat) if properties_changed: prop_str = [] for pair in properties_changed: if None not in pair: prop_str.append("%s to %s" % pair) if prop_str: self.cursor.insertText(" (properties changed: %s)" % (", ".join(prop_str))) self.cursor.insertText("\n") # GNU Patch uses the epoch date to detect files that are being added # or removed in a diff. EPOCH_DATE = '1970-01-01 00:00:00 +0000' for i in range(2): if present[i]: dates[i] = timestamp.format_patch_date(dates[i]) else: paths[i] = paths[(i+1)%2] dates[i] = EPOCH_DATE if not binary: self.cursor.insertText('--- %s\t%s\n' % (paths[0], dates[0]), self.monospacedBoldInsertFormat) self.cursor.insertText('+++ %s\t%s\n' % (paths[1], dates[1]), self.monospacedBoldDeleteFormat) def fix_last_line(lines): """Fix last line if there is no new line. @param lines: original list of lines @return: lines if lastline is OK, or new list with fixed last line. """ if lines: last = lines[-1] if last and last[-1] not in ('\r', '\n'): last += ('\n' + gettext('\\ No newline at end of file') + '\n') lines = lines[:-1] + [last] return lines a = fix_last_line(lines[0]) b = fix_last_line(lines[1]) for i, group in enumerate(groups): if group: i0, i1, j0, j1 = \ group[0][1], group[-1][2], group[0][3], group[-1][4] self.cursor.insertText( "@@ -%d,%d +%d,%d @@\n" % (i0+1, i1-i0, j0+1, j1-j0), self.monospacedHunkFormat) for tag, i0, i1, j0, j1 in group: if tag == "equal": text = "".join(" " + l for l in a[i0:i1]) self.cursor.insertText(text, self.monospacedFormat) else: start = self.cursor.block().blockNumber() text = "".join("-" + l for l in a[i0:i1]) self.cursor.insertText(text, self.monospacedDeleteFormat) text = "".join("+" + l for l in b[j0:j1]) self.cursor.insertText(text, self.monospacedInsertFormat) end = self.cursor.block().blockNumber() guidebar_data[tag].append((start, end - start)) else: self.cursor.insertText("Binary files %s %s and %s %s differ\n" % (paths[0], dates[0], paths[1], dates[1])) self.cursor.insertText("\n") self.cursor.endEditBlock() self.update() def clear(self): QtWidgets.QTextBrowser.clear(self) self.reset_guidebar_data() def reset_guidebar_data(self): self.guidebar_data = dict(title=[], delete=[], insert=[], replace=[]) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/diffwindow.py0000644000000000000000000005065614556556456014136 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2006 Lukáš Lalinský # Portions Copyright (C) 2006 Jelmer Vernooij # Portions Copyright (C) 2005 Canonical Ltd. (author: Scott James Remnant ) # Portions Copyright (C) 2004-2006 Christopher Lenz # # 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 contextlib import ExitStack from PyQt5 import QtCore, QtGui, QtWidgets from breezy.errors import NoSuchRevision, PathsNotVersionedError from breezy.mutabletree import MutableTree from breezy.revisiontree import RevisionTree from breezy.workingtree import WorkingTree from breezy.bzr.workingtree_4 import DirStateRevisionTree from breezy.plugins.qbrz.lib.diffview import ( SidebySideDiffView, SimpleDiffView, ) from breezy.plugins.qbrz.lib.diff import ( show_diff, has_ext_diff, ExtDiffMenu, DiffItem, ExtDiffContext, ) from breezy.plugins.qbrz.lib.i18n import gettext, ngettext, N_ from breezy.plugins.qbrz.lib.util import ( FilterOptions, QBzrWindow, ToolBarThrobberWidget, get_icon, get_set_encoding, get_set_tab_width_chars, get_tab_width_pixels, content_seems_to_be_binary, run_in_loading_queue, runs_in_loading_queue, show_shortcut_hint, ) from breezy.plugins.qbrz.lib.widgets.toolbars import FindToolbar from breezy.plugins.qbrz.lib.uifactory import ui_current_widget from breezy.plugins.qbrz.lib.trace import reports_exception from breezy.plugins.qbrz.lib.encoding_selector import EncodingMenuSelector from breezy.plugins.qbrz.lib.widgets.tab_width_selector import TabWidthMenuSelector from breezy.plugins.qbrz.lib.widgets.texteditaccessory import setup_guidebar_for_find def get_title_for_tree(tree, branch, other_branch): branch_title = "" if None not in (branch, other_branch) and branch.base != other_branch.base: branch_title = branch.nick if isinstance(tree, WorkingTree): if branch_title: return gettext("Working Tree for %s") % branch_title else: return gettext("Working Tree") elif isinstance(tree, (RevisionTree, DirStateRevisionTree)): # revision_id_to_revno is faster, but only works on mainline rev revid = tree.get_revision_id() try: revno = branch.revision_id_to_revno(revid) except NoSuchRevision: try: revno_map = branch.get_revision_id_to_revno_map() revno_tuple = revno_map[revid] # this can raise KeyError is revision not in the branch revno = ".".join("%d" % i for i in revno_tuple) except KeyError: # this can happens when you try to diff against other branch # or pending merge revno = revid if revno is not None: if branch_title: return gettext("Rev %(rev)s for %(branch)s") % {"rev": revno, "branch": branch_title} else: return gettext("Rev %s") % revno else: if branch_title: return gettext("Revid: %(revid)s for %(branch)s") % {"revid": revid, "branch": branch_title} else: return gettext("Revid: %s") % revid # XXX I don't know what other cases we need to handle return 'Unknown tree' class DiffWindow(QBzrWindow): documentChangeFinished = QtCore.pyqtSignal() def __init__(self, arg_provider, parent=None, complete=False, encoding=None, filter_options=None, ui_mode=True, allow_refresh=True): title = [gettext("Diff"), gettext("Loading...")] QBzrWindow.__init__(self, title, parent, ui_mode=ui_mode) self.restoreSize("diff", (780, 580)) self.trees = None self.encoding = encoding self.arg_provider = arg_provider self.filter_options = filter_options if filter_options is None: self.filter_options = FilterOptions(all_enable=True) self.complete = complete self.ignore_whitespace = False self.delayed_signal_connections = [] self.diffview = SidebySideDiffView(self) self.sdiffview = SimpleDiffView(self) self.views = (self.diffview, self.sdiffview) for view in self.views: view.set_complete(complete) self.stack = QtWidgets.QStackedWidget(self.centralwidget) self.stack.addWidget(self.diffview) self.stack.addWidget(self.sdiffview) vbox = QtWidgets.QVBoxLayout(self.centralwidget) vbox.addWidget(self.stack) # Don't use a custom tab width by default # Indices are left side, right side and unidiff # respectively self.custom_tab_widths = [-1,-1,-1] for browser in self.diffview.browsers: browser.installEventFilter(self) self.create_main_toolbar(allow_refresh) self.addToolBarBreak() self.find_toolbar = FindToolbar(self, self.diffview.browsers, self.show_find) self.find_toolbar.hide() self.addToolBar(self.find_toolbar) setup_guidebar_for_find(self.sdiffview, self.find_toolbar, 1) for gb in self.diffview.guidebar_panels: setup_guidebar_for_find(gb, self.find_toolbar, 1) self.diff_context = ExtDiffContext(self) # # RJLRJL: As far as I can tell, this is only called ONCE... # def connect_later(self, *args, **kwargs): # """Schedules a signal to be connected after loading CLI arguments. # Accepts the same arguments as QObject.connect method. # """ # self.delayed_signal_connections.append((args, kwargs)) # # ...and this is only called by _initial_load. Once. # def process_delayed_connections(self): # for (args, kwargs) in self.delayed_signal_connections: # self.connect(*args, **kwargs) def create_main_toolbar(self, allow_refresh=True): toolbar = self.addToolBar(gettext("Diff")) toolbar.setMovable(False) toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) self.show_find = self.create_find_action() toolbar.addAction(self.show_find) toolbar.addAction(self.create_toggle_view_mode()) self.view_refresh = self.create_refresh_action(allow_refresh) if allow_refresh: toolbar.addAction(self.view_refresh) if has_ext_diff(): show_ext_diff_menu = self.create_ext_diff_action() toolbar.addAction(show_ext_diff_menu) widget = toolbar.widgetForAction(show_ext_diff_menu) widget.setPopupMode(QtWidgets.QToolButton.InstantPopup) widget.setShortcut("Alt+E") show_shortcut_hint(widget) show_view_menu = self.create_view_menu() toolbar.addAction(show_view_menu) widget = toolbar.widgetForAction(show_view_menu) widget.setPopupMode(QtWidgets.QToolButton.InstantPopup) widget.setShortcut("Alt+V") show_shortcut_hint(widget) spacer = QtWidgets.QWidget() spacer.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) toolbar.addWidget(spacer) self.throbber = ToolBarThrobberWidget(self) toolbar.addWidget(self.throbber) return toolbar def create_find_action(self): action = QtWidgets.QAction(get_icon("edit-find"), gettext("&Find"), self) action.setShortcut(QtGui.QKeySequence.Find) action.setToolTip(gettext("Find on active panel")) show_shortcut_hint(action) action.setCheckable(True) return action def create_toggle_view_mode(self): action = QtWidgets.QAction(get_icon("view-split-left-right"), gettext("Unidiff"), self) action.setToolTip(gettext("Toggle between Side by side and Unidiff view modes")) action.setShortcut("Ctrl+U") show_shortcut_hint(action) action.setCheckable(True) action.setChecked(False) action.toggled[bool].connect(self.click_toggle_view_mode) return action def create_refresh_action(self, allow_refresh=True): action = QtWidgets.QAction(get_icon("view-refresh"), gettext("&Refresh"), self) action.setShortcut("Ctrl+R") show_shortcut_hint(action) action.triggered[bool].connect(self.click_refresh) action.setEnabled(allow_refresh) return action def create_ext_diff_action(self): action = QtWidgets.QAction(get_icon("system-run"), gettext("&External Diff"), self) action.setToolTip(gettext("Launch an external diff application")) ext_diff_menu = ExtDiffMenu(parent=self, include_builtin=False) action.setMenu(ext_diff_menu) ext_diff_menu._triggered.connect(self.ext_diff_triggered) return action def create_view_menu(self): show_view_menu = QtWidgets.QAction(get_icon("document-properties"), gettext("&View Options"), self) view_menu = QtWidgets.QMenu(gettext('View Options'), self) show_view_menu.setMenu(view_menu) view_complete = QtWidgets.QAction(gettext("&Complete"), self) view_complete.setCheckable(True) view_complete.toggled[bool].connect(self.click_complete) view_menu.addAction(view_complete) self.ignore_whitespace_action = self.create_ignore_ws_action() view_menu.addAction(self.ignore_whitespace_action) # Indent is correct: nested function def on_unidiff_tab_width_changed(tabwidth): if self.branches: get_set_tab_width_chars(branch=self.branches[0],tab_width_chars=tabwidth) self.custom_tab_widths[2] = tabwidth self.setup_tab_width() self.tab_width_selector_unidiff = TabWidthMenuSelector(label_text=gettext("Tab width"), onChanged=on_unidiff_tab_width_changed) view_menu.addMenu(self.tab_width_selector_unidiff) # Indent is correct: nested function def on_left_tab_width_changed(tabwidth): if self.branches: get_set_tab_width_chars(branch=self.branches[0],tab_width_chars=tabwidth) self.custom_tab_widths[0] = tabwidth self.setup_tab_width() self.tab_width_selector_left = TabWidthMenuSelector(label_text=gettext("Left side tab width"), onChanged=on_left_tab_width_changed) view_menu.addMenu(self.tab_width_selector_left) # Indent is correct: nested function def on_right_tab_width_changed(tabwidth): if self.branches: get_set_tab_width_chars(branch=self.branches[1],tab_width_chars=tabwidth) self.custom_tab_widths[1] = tabwidth self.setup_tab_width() self.tab_width_selector_right = TabWidthMenuSelector(label_text=gettext("Right side tab width"), onChanged=on_right_tab_width_changed) view_menu.addMenu(self.tab_width_selector_right) if self.stack.currentWidget() == self.diffview: self.tab_width_selector_unidiff.menuAction().setVisible(False) else: self.tab_width_selector_left.menuAction().setVisible(False) self.tab_width_selector_right.menuAction().setVisible(False) # Indent is correct: nested function def on_left_encoding_changed(encoding): if self.branches: get_set_encoding(encoding, self.branches[0]) self.click_refresh() self.encoding_selector_left = EncodingMenuSelector(self.encoding, gettext("Left side encoding"), on_left_encoding_changed) view_menu.addMenu(self.encoding_selector_left) # Indent is correct: nested function def on_right_encoding_changed(encoding): if self.branches: get_set_encoding(encoding, self.branches[1]) self.click_refresh() self.encoding_selector_right = EncodingMenuSelector(self.encoding, gettext("Right side encoding"), on_right_encoding_changed) view_menu.addMenu(self.encoding_selector_right) return show_view_menu def create_ignore_ws_action(self): action = QtWidgets.QAction(gettext("&Ignore whitespace changes"), self) action.setCheckable(True) # RJLRJL removed spurious semi-colon (hmm...) action.setChecked(self.ignore_whitespace) # RJLRJL this is the only occurance of connect_later. # self.connect_later(action, QtCore.SIGNAL("toggled (bool)"), self.click_ignore_whitespace) # ...which ends up with eventually needing to call process_delayed_connections, etc. # Get rid of it and do it normally action.toggled[bool].connect(self.click_ignore_whitespace) return action def eventFilter(self, object, event): if event.type() == QtCore.QEvent.FocusIn: if object in self.diffview.browsers: self.find_toolbar.set_text_edit(object) return QBzrWindow.eventFilter(self, object, event) # Why doesn't this work? # return super(DiffWindow, self).eventFilter(object, event) def show(self): QBzrWindow.show(self) QtCore.QTimer.singleShot(1, self.initial_load) @runs_in_loading_queue @ui_current_widget @reports_exception() def initial_load(self): """Called to perform the initial load of the form. Enables a throbber window, then loads the branches etc if they weren't specified in our constructor. """ with ExitStack() as es: es.callback(self.throbber.hide) self.throbber.show() self._initial_load(es) def _initial_load(self, es): args = self.arg_provider.get_diff_window_args(self.processEvents, es) self.trees = (args["old_tree"], args["new_tree"]) self.branches = (args.get("old_branch", None), args.get("new_branch",None)) self.specific_files = args.get("specific_files", None) self.ignore_whitespace = args.get("ignore_whitespace", False) # RJLRJL setChecked is also done in create_ignore_ws_action self.ignore_whitespace_action.setChecked(self.ignore_whitespace) # RJLRJL got rid of this # self.process_delayed_connections() self.load_branch_info() self.setup_tab_width() self.load_diff() def load_branch_info(self): self.set_diff_title() 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): rev1_title = get_title_for_tree(self.trees[0], self.branches[0], self.branches[1]) rev2_title = get_title_for_tree(self.trees[1], self.branches[1], self.branches[0]) title = [gettext("Diff"), "%s..%s" % (rev1_title, rev2_title)] if self.specific_files: nfiles = len(self.specific_files) if nfiles > 2: title.append(ngettext("%d file", "%d files", nfiles) % nfiles) else: title.append(", ".join(self.specific_files)) else: if self.filter_options and not self.filter_options.is_all_enable(): title.append(self.filter_options.to_str()) self.set_title_and_icon(title) self.processEvents() def setup_tab_width(self): tabWidths = self.custom_tab_widths if tabWidths[0] < 0: tabWidths[0] = get_set_tab_width_chars(branch=self.branches[0]) self.tab_width_selector_left.setTabWidth(tabWidths[0]) if tabWidths[1] < 0: tabWidths[1] = get_set_tab_width_chars(branch=self.branches[1]) self.tab_width_selector_right.setTabWidth(tabWidths[1]) if tabWidths[2] < 0: tabWidths[2] = get_set_tab_width_chars(branch=self.branches[0]) self.tab_width_selector_unidiff.setTabWidth(tabWidths[2]) tabWidthsPixels = [get_tab_width_pixels(tab_width_chars=i) for i in tabWidths] self.diffview.setTabStopWidths(tabWidthsPixels) self.sdiffview.setTabStopWidth(tabWidthsPixels[2]) def load_diff(self): self.view_refresh.setEnabled(False) self.processEvents() try: no_changes = True # if there are no changes found we need to inform the user for di in DiffItem.iter_items(self.trees, specific_files=self.specific_files, filter=self.filter_options.check, lock_trees=True): self.processEvents() groups = di.groups(self.complete, self.ignore_whitespace) self.processEvents() ulines = di.get_unicode_lines( (self.encoding_selector_left.encoding, self.encoding_selector_right.encoding)) # If we've got binary, it'll be bytes (probably)... if di.binary: data = [b''.join(line) for line in ulines] else: data = [''.join(line) for line in ulines] for view in self.views: view.append_diff(list(di.paths), di.file_id, di.kind, di.status, di.dates, di.versioned, di.binary, ulines, groups, data, di.properties_changed) self.processEvents() no_changes = False except PathsNotVersionedError as e: QtWidgets.QMessageBox.critical(self, gettext('Diff'), gettext('File %s is not versioned.\n' 'Operation aborted.') % e.paths_as_string, gettext('&Close')) self.close() if no_changes: QtWidgets.QMessageBox.information(self, gettext('Diff'), gettext('No changes found.'), gettext('&OK')) for t in self.views[0].browsers + (self.views[1],): t.documentChangeFinished.emit() self.view_refresh.setEnabled(self.can_refresh()) def click_toggle_view_mode(self, checked): if checked: view = self.sdiffview self.find_toolbar.set_text_edits([view.view]) self.tab_width_selector_left.menuAction().setVisible(False) self.tab_width_selector_right.menuAction().setVisible(False) self.tab_width_selector_unidiff.menuAction().setVisible(True) else: view = self.diffview self.find_toolbar.set_text_edits(view.browsers) self.tab_width_selector_left.menuAction().setVisible(True) self.tab_width_selector_right.menuAction().setVisible(True) self.tab_width_selector_unidiff.menuAction().setVisible(False) view.rewind() index = self.stack.indexOf(view) self.stack.setCurrentIndex(index) def click_complete(self, checked): self.complete = checked # Has the side effect of refreshing... self.diffview.set_complete(checked) self.sdiffview.set_complete(checked) self.diffview.clear() self.sdiffview.clear() run_in_loading_queue(self.load_diff) def click_refresh(self): self.diffview.clear() self.sdiffview.clear() run_in_loading_queue(self.load_diff) def can_refresh(self): """Does any of tree is Mutanble/Working tree.""" if self.trees is None: # we might still be loading... return False tree1, tree2 = self.trees if isinstance(tree1, MutableTree) or isinstance(tree2, MutableTree): return True return False def ext_diff_triggered(self, ext_diff): """@param ext_diff: path to external diff executable.""" show_diff(self.arg_provider, ext_diff=ext_diff, parent_window=self, context=self.diff_context) def click_ignore_whitespace(self, checked): self.ignore_whitespace = checked # Has the side effect of refreshing... self.diffview.clear() self.sdiffview.clear() run_in_loading_queue(self.load_diff) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/encoding_selector.py0000644000000000000000000002146114556556456015454 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Contributors: # INADA Naoki, 2009 # Alexander Belchenko, 2009 # # 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. import codecs from PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.util import is_valid_encoding from breezy.osutils import get_user_encoding, get_terminal_encoding class UniqueList(object): """List-like object with unique-only append.""" def __init__(self, data=None): self._data = [] if data: self._data.extend(data) def append(self, item): if item not in self._data: self._data.append(item) def __add__(self, other): for item in other: self.append(item) return UniqueList(self._data) def __iter__(self): return iter(self._data) class BaseEncodingSelector(object): def init_encodings(self, initial_encoding=None): _encodings = UniqueList() if initial_encoding: _encodings.append(initial_encoding) _encodings.append(get_user_encoding()) _encodings.append(get_terminal_encoding()) _encodings += python_encodings self.encodings = list(filter(is_valid_encoding, _encodings)) if initial_encoding: if initial_encoding not in self.encodings: self.encodings.insert(0, initial_encoding) else: 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): QtWidgets.QMessageBox.critical(self, gettext("Wrong encoding"), gettext('Encoding "%s" is invalid or not supported.') % str(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(QtWidgets.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. """ QtWidgets.QWidget.__init__(self, *args) self.init_encodings(initial_encoding) self.onChanged = onChanged if onChanged is None: self.onChanged = lambda encoding: None layout = QtWidgets.QHBoxLayout() if label_text is None: label_text = gettext("Encoding:") self._label = QtWidgets.QLabel(label_text) layout.addWidget(self._label) self.chooser = QtWidgets.QComboBox() self.chooser.addItems(self.encodings) self.chooser.setEditable(True) self.chooser.setEditText(self.encoding) self.chooser.currentIndexChanged['QString'].connect(self._encodingChanged) self.chooser.focusOutEvent = self._focusOut layout.addWidget(self.chooser) self.setLayout(layout) def _focusOut(self, ev): encoding = self.chooser.currentText() if self._encoding != encoding: self._encodingChanged(encoding) QtWidgets.QComboBox.focusOutEvent(self.chooser, ev) def _setEncoding(self, encoding): self.chooser.setEditText(encoding) def getLabel(self): return str(self._label.text()) def setLabel(self, new_label): self._label.setText(new_label) label = property(getLabel, setLabel) class EncodingMenuSelector(QtWidgets.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. """ QtWidgets.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.setStyleSheet("QMenu { menu-scrollable: 1; }") self.action_group = QtWidgets.QActionGroup(self) self.encoding_actions = {} for encoding in self.encodings: action = QtWidgets.QAction(encoding, self.action_group) action.setCheckable(True) action.setData(encoding) self.addAction(action) self.encoding_actions[encoding] = action self._setEncoding(self.encoding) # RJLRJL changed triggered to _triggered self.triggered[QtWidgets.QAction].connect(self._triggered) def _triggered(self, action): encoding = action.data() self._encodingChanged(encoding) def _setEncoding(self, encoding): if encoding in self.encoding_actions: self.encoding_actions[encoding].setChecked(True) def getLabel(self): return str(self.title()) def setLabel(self, new_label): self.setTitle(new_label) label = property(getLabel, setLabel) # The 'python_encodings' horror below changes underscores to dashes and them makes a list. # What you actually get is: # # ['utf-8', 'ascii', 'latin-1', 'big5', 'big5hkscs', 'cp037', 'cp1006', 'cp1026', 'cp1140', 'cp1250', 'cp1251', # 'cp1252', 'cp1253', 'cp1254', 'cp1255', 'cp1256', 'cp1257', 'cp1258', 'cp424', 'cp437', 'cp500', 'cp737', 'cp775', # 'cp850', 'cp852', 'cp855', 'cp856', 'cp857', 'cp860', 'cp861', 'cp862', 'cp863', 'cp864', 'cp865', 'cp866', 'cp869', # 'cp874', 'cp875', 'cp932', 'cp949', 'cp950', 'euc-jisx0213', 'euc-jis-2004', 'euc-jp', 'euc-kr', 'gb18030', 'gb2312', # 'gbk', 'hp-roman8', 'hz', 'iso2022-jp', 'iso2022-jp-1', 'iso2022-jp-2', 'iso2022-jp-2004', 'iso2022-jp-3', # 'iso2022-jp-ext', 'iso2022-kr', 'iso8859-1', 'iso8859-10', 'iso8859-11', 'iso8859-13', 'iso8859-14', 'iso8859-15', # 'iso8859-16', 'iso8859-2', 'iso8859-3', 'iso8859-4', 'iso8859-5', 'iso8859-6', 'iso8859-7', 'iso8859-8', 'iso8859-9', # 'johab', 'koi8-r', 'koi8-u', 'mac-arabic', 'mac-centeuro', 'mac-croatian', 'mac-cyrillic', 'mac-farsi', 'mac-greek', # 'mac-iceland', 'mac-latin2', 'mac-roman', 'mac-romanian', 'mac-turkish', 'ptcp154', 'shift-jis', 'shift-jisx0213', # 'shift-jis-2004', 'tis-620', 'utf-16', 'utf-16-be', 'utf-16-le', 'utf-32', 'utf-32-be', 'utf-32-le', 'utf-7', 'utf-8-sig'] # # ...and before you ask, no, I don't know why they didn't just do that either. What larks! # human encodings found in standard Python encodings package. python_encodings = """ utf_8 ascii latin_1 big5 big5hkscs cp037 cp1006 cp1026 cp1140 cp1250 cp1251 cp1252 cp1253 cp1254 cp1255 cp1256 cp1257 cp1258 cp424 cp437 cp500 cp737 cp775 cp850 cp852 cp855 cp856 cp857 cp860 cp861 cp862 cp863 cp864 cp865 cp866 cp869 cp874 cp875 cp932 cp949 cp950 euc_jisx0213 euc_jis_2004 euc_jp euc_kr gb18030 gb2312 gbk hp_roman8 hz iso2022_jp iso2022_jp_1 iso2022_jp_2 iso2022_jp_2004 iso2022_jp_3 iso2022_jp_ext iso2022_kr iso8859_1 iso8859_10 iso8859_11 iso8859_13 iso8859_14 iso8859_15 iso8859_16 iso8859_2 iso8859_3 iso8859_4 iso8859_5 iso8859_6 iso8859_7 iso8859_8 iso8859_9 johab koi8_r koi8_u mac_arabic mac_centeuro mac_croatian mac_cyrillic mac_farsi mac_greek mac_iceland mac_latin2 mac_roman mac_romanian mac_turkish ptcp154 shift_jis shift_jisx0213 shift_jis_2004 tis_620 utf_16 utf_16_be utf_16_le utf_32 utf_32_be utf_32_le utf_7 utf_8_sig """.replace('_','-').split() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/export.py0000644000000000000000000003455614556556456013320 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # # Contributors: # Javier Derderian # # 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. import os import sys from PyQt5 import QtCore, QtGui, QtWidgets from breezy import ( controldir, errors, export, osutils, ) from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.subprocess import SubProcessDialog from breezy.plugins.qbrz.lib.util import url_for_display class QBzrExportDialog(SubProcessDialog): FORMATS = { # key is archive format, value is tuple of accepted extensions 'tar': ('tar',), 'tbz2': ('tar.bz2', 'tbz2'), 'tgz': ('tar.gz', 'tgz'), 'zip': ('zip',), } FORMAT_NAMES = { # key is shown name , value is format 'tar': 'tar', 'tar.bz2': 'tbz2', 'tar.gz': 'tgz', 'zip': 'zip', } def __init__(self, dest=None, branch=None, ui_mode=False, parent=None): """Create export dialog. @param dest: path to export to (either archive name or directory). @param branch: exported branch. @param ui_mode: does dialog should stay on the screen after operation completed successfully. @param parent: parent window. """ title = gettext("Export") super(QBzrExportDialog, self).__init__( title, name = "export", default_size = (400, 400), ui_mode = ui_mode, dialog = True, parent = parent, hide_progress=False, ) self.branch = branch # Create the branch information panel info_hbox = QtWidgets.QHBoxLayout() branch_info = gettext("Branch: %s") % url_for_display(branch.base) info_label = QtWidgets.QLabel(branch_info) info_hbox.addWidget(info_label) # Create the export group box gbExportDestination = QtWidgets.QGroupBox(gettext("Export"), self) vboxExportDestination = QtWidgets.QVBoxLayout(gbExportDestination) vboxExportDestination.addStrut(0) # Build export as archive section exportarch_radio = QtWidgets.QRadioButton("Export as archive") exportarch_radio.setChecked(True) self.exportarch_radio = exportarch_radio vboxExportDestination.addWidget(exportarch_radio) vboxExportDestination.addLayout(self._build_archive_location_layout()) vboxExportDestination.addLayout(self._build_archive_root_layout()) vboxExportDestination.addLayout(self._build_archive_type_layout()) # Build export as directory section exportdir_radio = QtWidgets.QRadioButton("Export as directory") self.exportdir_radio = exportdir_radio vboxExportDestination.addWidget(exportdir_radio) vboxExportDestination.addLayout( self._build_directory_location_layout()) # Build the options group box gbExportOptions = self._build_options_group_box() # Put the form together layout = QtWidgets.QVBoxLayout(self) layout.addLayout(info_hbox) layout.addWidget(gbExportDestination) layout.addWidget(gbExportOptions) layout.addWidget(self.make_default_status_box()) layout.addWidget(self.buttonbox) # Initialise the locations with sensible defaults if dest is not None: if os.path.isdir(dest) or self.detect_format(dest) is None: self.locationdir_edit.setText(osutils.abspath(dest)) self.locationdir_edit.setFocus() exportdir_radio.setChecked(True) self.locationdir_edit.setFocus() else: self.locationdir_edit.setText(osutils.abspath(dest)) self.update_root_n_format() exportarch_radio.setChecked(True) self.locationfil_edit.setFocus() else: self.update_export_path(use_parent=True) self.update_root_n_format() # Disable the group boxes while doing the real work self.disableUi[bool].connect(gbExportDestination.setDisabled) self.disableUi[bool].connect(gbExportOptions.setDisabled) # Setup smart setting of fields as others are edited. # We could do more here (e.g. make the root directory change # when the location changes or vice versa) but opinions vary on # whether that increases or decreases usability so KISS for now. self.format_combo.currentIndexChanged[int].connect(self.format_changed) def _build_archive_type_layout(self): format_label = QtWidgets.QLabel(gettext("Archive type:")) format_combo = QtWidgets.QComboBox() self.format_combo = format_combo for ix, k in enumerate(sorted(self.FORMAT_NAMES.keys())): format_combo.insertItem(ix, k) # set zip as default if we're on windows, otherwise tar.gz if sys.platform == 'win32': indx = format_combo.findText("zip") else: indx = format_combo.findText("tar.gz") format_combo.setCurrentIndex(indx) format_hbox = QtWidgets.QHBoxLayout() format_hbox.addSpacing(25) format_hbox.addWidget(format_label) format_hbox.addWidget(format_combo) format_hbox.setStretchFactor(format_label,0) format_hbox.setStretchFactor(format_combo,1) return format_hbox def _build_archive_root_layout(self): folder_label = QtWidgets.QLabel(gettext("Root directory name:")) folder_edit = QtWidgets.QLineEdit() self.folder_edit = folder_edit folder_hbox = QtWidgets.QHBoxLayout() folder_hbox.addSpacing(25) folder_hbox.addWidget(folder_label) folder_hbox.addWidget(folder_edit) return folder_hbox def _build_archive_location_layout(self): locationfil_label = QtWidgets.QLabel(gettext("Location:")) locationfil_edit = QtWidgets.QLineEdit() self.locationfil_edit = locationfil_edit browsefil_button = QtWidgets.QPushButton(gettext("Browse")) browsefil_button.clicked[bool].connect(self.browsefil_clicked) locationfil_hbox = QtWidgets.QHBoxLayout() locationfil_hbox.addSpacing(25) locationfil_hbox.addWidget(locationfil_label) locationfil_hbox.addWidget(locationfil_edit) locationfil_hbox.addWidget(browsefil_button) locationfil_hbox.setStretchFactor(locationfil_label,0) locationfil_hbox.setStretchFactor(locationfil_edit,1) locationfil_hbox.setStretchFactor(browsefil_button,0) return locationfil_hbox def _build_directory_location_layout(self): locationdir_edit = QtWidgets.QLineEdit() self.locationdir_edit = locationdir_edit browsedir_button = QtWidgets.QPushButton(gettext("Browse")) browsedir_button.clicked[bool].connect(self.browsedir_clicked) locationdir_hbox = QtWidgets.QHBoxLayout() locationdir_hbox.addSpacing(25) locationdir_hbox.addWidget(locationdir_edit) locationdir_hbox.addWidget(browsedir_button) locationdir_hbox.setStretchFactor(locationdir_edit,1) locationdir_hbox.setStretchFactor(browsedir_button,0) return locationdir_hbox def _build_options_group_box(self): """Build and return the options group box.""" # Build the revision selection fields revisions_box = QtWidgets.QGridLayout() revisions_label = QtWidgets.QLabel(gettext("Revision:")) revisions_tip = QtWidgets.QRadioButton("Branch tip") revisions_tip.setChecked(True) self.revisions_tip = revisions_tip revisions_box.addWidget(revisions_label, 0, 0) revisions_box.addWidget(revisions_tip, 0, 1) revisions_other = QtWidgets.QRadioButton("Other") self.revisions_other = revisions_other revisions_edit = QtWidgets.QLineEdit() self.revisions_edit = revisions_edit revisions_box.addWidget(revisions_other, 1, 1) revisions_box.addWidget(revisions_edit, 1, 2) # Build the content filtering field format_box = QtWidgets.QGridLayout() format_canonical = QtWidgets.QCheckBox("Apply content filters to files") self.format_canonical = format_canonical format_box.addWidget(format_canonical, 0, 0) # Build the group box and return it gbExportOptions = QtWidgets.QGroupBox(gettext("Options"), self) vbxExportOptions = QtWidgets.QVBoxLayout(gbExportOptions) vbxExportOptions.addLayout(revisions_box) vbxExportOptions.addLayout(format_box) return gbExportOptions def update_export_path(self, root_folder=None, use_parent=False): base = url_for_display(self.branch.base) if base[-1] == '/' or base[-1] == '\\': base = base[0:-1] base = os.path.split(base) format = str(self.format_combo.currentText()) if root_folder == None: export_name = "%s/%s.%s" % (base[0], base[1], format) else: export_name = "%s/%s.%s" % (base[0], root_folder, format) try: basedir = controldir.ControlDir.open(base[0]) except errors.NotBranchError: #this is not even a bzr dir pass else: try: basedir.open_branch() except errors.NotBranchError: #this is a shared repo. name "repo-dir" base_sp = os.path.split(base[0]) if use_parent: export_name = "%s/%s/%s-%s.%s" % (base_sp[0], base_sp[1], base_sp[1], base[1], format) else: export_name = "%s/%s/%s.%s" % (base_sp[0], base_sp[1], root_folder, format) self.locationfil_edit.setText(export_name) def get_current_format(self): format_name = str(self.format_combo.currentText()) format = self.FORMAT_NAMES[format_name] return format def detect_format(self, path): """Return archive type or None.""" for k, v in self.FORMATS.items(): for i in v: if path.endswith(i): return k return None def update_root_n_format(self): path = str(self.locationfil_edit.text()) format = self.detect_format(path) if format is not None: ix = sorted(self.FORMATS.keys()).index(format) self.format_combo.setCurrentIndex(ix) self.folder_edit.setText(export.get_root_name(path)) def browsedir_clicked(self): fileName = QtWidgets.QFileDialog.getExistingDirectory(self, ("Select save location")) if fileName != None and fileName != '': self.locationdir_edit.setText(fileName) self.exportdir_radio.setChecked(True) def browsefil_clicked(self): fileName = QtWidgets.QFileDialog.getSaveFileName(self, ("Select save location"))[0] if fileName != None and fileName != '': self.locationfil_edit.setText(fileName) self.update_root_n_format() self.exportarch_radio.setChecked(True) def format_changed(self, index): sel_format = str(self.format_combo.currentText()) currfil = str(self.locationfil_edit.text()) path = os.path.split(currfil) name = path[1] path = path[0] name = name.split(".")[0] self.locationfil_edit.setText("%s/%s.%s" % (path,name,sel_format)) def validate(self): if self.exportarch_radio.isChecked(): location = str(self.locationfil_edit.text()) if not location: self.operation_blocked(gettext("Export location is invalid")) return False elif self.exportdir_radio.isChecked(): location = str(self.locationdir_edit.text()) if not location: self.operation_blocked(gettext("Export location is invalid")) return False if self.revisions_other.isChecked(): if str(self.revisions_edit.text()) == "": self.operation_blocked(gettext("Export revision is invalid")) return False return True def do_start(self): args = ['export'] # setup export to archive or directory if self.exportarch_radio.isChecked(): location = str(self.locationfil_edit.text()) format = self.get_current_format() root = str(self.folder_edit.text()) if root: args.append("--root=%s" % root) else: args.append("--root=") else: location = str(self.locationdir_edit.text()) format = 'dir' args.append(location) args.append("--format=%s" % format) # Append options if self.revisions_tip.isChecked(): args.append("--revision=-1") else: revision = str(self.revisions_edit.text()) args.append("--revision=%s" % revision) if self.format_canonical.isChecked(): args.append("--filters") # Append the source location branch_location = url_for_display(self.branch.base) args.append(branch_location) self.process_widget.do_start(None, *args) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/extra/0000755000000000000000000000000014556556456012533 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/fake_branch.py0000644000000000000000000000224614556556456014211 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2011 QBzr Developers # # 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. """Special Fake branch because sometimes we lost the real branch.""" class FakeBranch(object): """Special branch object to disable save any options to branch.conf""" def __init__(self): pass def __bool__(self): # this method makes FakeBranch boolean False # so we shouldn't check (branch is not None) but (not branch) return False ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/getnew.py0000644000000000000000000001470514556556456013262 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2008 Canonical # # 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. # This implements the 'qupdate-hybrid' command - a hybrid update command # that examines the tree being updated and displays one of 2 dialogs # depending on if the tree is bound (ie, a checkout) or not. import os import re from PyQt5 import QtCore from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.subprocess import SubProcessDialog from breezy.plugins.qbrz.lib.ui_new_tree import Ui_NewWorkingTreeForm from breezy.plugins.qbrz.lib.util import ( save_pull_location, fill_pull_combo, hookup_directory_picker, DIRECTORYPICKER_SOURCE, DIRECTORYPICKER_TARGET, get_qbrz_config, ) class GetNewWorkingTreeWindow(SubProcessDialog): NAME = "new_tree" def __init__(self, to_location, ui_mode=True, parent=None): config = get_qbrz_config() checkout_basedir = config.get_option("checkout_basedir") branchsource_basedir = config.get_option("branchsource_basedir") if not to_location: to_location = checkout_basedir or '.' self.to_location = os.path.abspath(to_location) super(GetNewWorkingTreeWindow, self).__init__( name = self.NAME, ui_mode = ui_mode, parent = parent) self.ui = Ui_NewWorkingTreeForm() self.ui.setupUi(self) fill_pull_combo(self.ui.from_location, None) # and add the subprocess widgets. for w in self.make_default_layout_widgets(): self.layout().addWidget(w) # Our 2 directory pickers hook up to our combos. hookup_directory_picker(self, self.ui.from_picker, self.ui.from_location, DIRECTORYPICKER_SOURCE) hookup_directory_picker(self, self.ui.to_picker, self.ui.to_location, DIRECTORYPICKER_TARGET) # signal to manage updating the 'location' on the fly. self.ui.from_location.editTextChanged['QString'].connect(self.from_location_changed) self.ui.to_location.textChanged['QString'].connect(self.to_location_changed) self.ui.but_checkout.setChecked(True) self.ui.but_rev_tip.setChecked(True) self.ui.to_location.setText(self.to_location) if branchsource_basedir is not None: self.from_location = branchsource_basedir self.ui.from_location.setEditText(self.from_location) def to_location_changed(self): self.ui.from_location.editTextChanged['QString'].disconnect(self.from_location_changed) self.ui.to_location.textChanged['QString'].disconnect(self.to_location_changed) def from_location_changed(self, new_text): new_val = self.to_location tail = re.split("[:$#\\\\/]", str(new_text))[-1] try: projectname = re.split("[:$#\\\\/]", str(new_text))[-2] except: projectname = "" if tail: if self.checkout_basedir is not None: new_val = os.path.join(self.checkout_basedir, projectname) else: new_val = os.path.join(new_val, tail) self.ui.to_location.setText(new_val) def _get_from_location(self): return str(self.ui.from_location.currentText()) def _get_to_location(self): return str(self.ui.to_location.text()) def _is_checkout_action(self): return self.ui.but_checkout.isChecked() def validate(self): if not self._get_from_location(): self.operation_blocked(gettext("You should specify branch source")) return False to_location = self._get_to_location() if not to_location: self.operation_blocked(gettext("You should select destination directory")) return False # This is a check if the user really wants to checkout to a non-empty directory. # Because this may create conflicts, we want to make sure this is intended. if os.path.exists(to_location) and os.listdir(to_location): if self._is_checkout_action(): quiz = gettext("Do you really want to checkout into a non-empty folder?") else: quiz = gettext("Do you really want to branch into a non-empty folder?") reason = gettext("The destination folder is not empty.\n" "Populating new working tree there may create conflicts.") if not self.ask_confirmation(reason+'\n\n'+quiz, type='warning'): return False return True def do_start(self): from_location = self._get_from_location() to_location = self._get_to_location() revision_args = [] if self.ui.but_rev_specific.isChecked() and self.ui.revision.text(): revision_args.append('--revision='+str(self.ui.revision.text())) if self._is_checkout_action(): args = ['checkout'] if self.ui.but_lightweight.isChecked(): args.append('--lightweight') args.extend(revision_args) args.append(from_location) args.append(to_location) else: # its a 'branch' args = ['branch'] if self.ui.but_stacked.isChecked(): args.append('--stacked') args.extend(revision_args) args.append(from_location) args.append(to_location) self.process_widget.do_start(None, *args) save_pull_location(None, from_location) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/getupdates.py0000644000000000000000000001371414556556456014135 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2008 Canonical # # 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. # This implements the 'qupdate-hybrid' command - a hybrid update command # that examines the tree being updated and displays one of 2 dialogs # depending on if the tree is bound (ie, a checkout) or not. from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.subprocess import SubProcessDialog from breezy.plugins.qbrz.lib.ui_update_branch import Ui_UpdateBranchForm from breezy.plugins.qbrz.lib.ui_update_checkout import Ui_UpdateCheckoutForm from breezy.plugins.qbrz.lib.util import ( iter_saved_pull_locations, save_pull_location, fill_combo_with, fill_pull_combo, hookup_directory_picker, DIRECTORYPICKER_SOURCE, url_for_display, ) class UpdateBranchWindow(SubProcessDialog): NAME = "update_branch" def __init__(self, branch, ui_mode=True, parent=None): self.branch = branch super(UpdateBranchWindow, self).__init__( name = self.NAME, ui_mode = ui_mode, parent = parent) self.ui = Ui_UpdateBranchForm() self.ui.setupUi(self) # and add the subprocess widgets. for w in self.make_default_layout_widgets(): self.layout().addWidget(w) # nuke existing items in the combo. while self.ui.location.count(): self.ui.location.removeItem(0) fill_pull_combo(self.ui.location, self.branch) # One directory picker for the pull location. hookup_directory_picker(self, self.ui.location_picker, self.ui.location, DIRECTORYPICKER_SOURCE) self.ui.but_pull.setChecked(not not self.branch.get_parent()) def _is_pull_selected(self): return self.ui.but_pull.isChecked() def _get_pull_location(self): return str(self.ui.location.currentText()) def validate(self): if self._is_pull_selected() and not self._get_pull_location(): self.operation_blocked(gettext("You should specify source branch location")) return False return True def do_start(self): if self._is_pull_selected(): # its a 'pull' args = ['--directory', self.branch.base] if self.ui.but_pull_overwrite.isChecked(): args.append('--overwrite') if self.ui.but_pull_remember.isChecked(): args.append('--remember') location = self._get_pull_location() self.process_widget.do_start(None, 'pull', location, *args) save_pull_location(self.branch, location) else: # its an 'update'. self.process_widget.do_start(None, 'update', self.branch.base) class UpdateCheckoutWindow(SubProcessDialog): NAME = "update_checkout" def __init__(self, branch, ui_mode=True, parent=None): self.branch = branch super(UpdateCheckoutWindow, self).__init__( name = self.NAME, ui_mode = ui_mode, parent = parent) self.ui = Ui_UpdateCheckoutForm() self.ui.setupUi(self) # and add the subprocess widgets. for w in self.make_default_layout_widgets(): self.layout().addWidget(w) # nuke existing items in the combo. while self.ui.location.count(): self.ui.location.removeItem(0) # We don't look at 'related' branches etc when doing a 'pull' from # a checkout - the default is empty, but saved locations are used. fill_combo_with(self.ui.location, '', iter_saved_pull_locations()) # and the directory picker for the pull location. hookup_directory_picker(self, self.ui.location_picker, self.ui.location, DIRECTORYPICKER_SOURCE) # Our 'label' object is ready to have the bound location specified. loc = url_for_display(self.branch.get_bound_location()) self.ui.label.setText(str(self.ui.label.text()) % loc) self.ui.but_pull.setChecked(False) def _is_pull_selected(self): return self.ui.but_pull.isChecked() def _get_pull_location(self): return str(self.ui.location.currentText()) def validate(self): if self._is_pull_selected() and not self._get_pull_location(): self.operation_blocked(gettext("You should specify source branch location")) return False return True def do_start(self): if self._is_pull_selected(): args = ['--directory', self.branch.base] if self.ui.but_pull_overwrite.isChecked(): args.append('--overwrite') location = self._get_pull_location() self.process_widget.do_start(None, 'pull', location, *args) else: # its an update. self.process_widget.do_start(None, 'update', self.branch.base) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/help.py0000644000000000000000000001460714556556456012722 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # # 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 PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.util import QBzrWindow from breezy.help import HelpIndices, NoHelpTopic try: from docutils.core import publish_string from docutils.writers.html4css1 import Writer as BaseHTMLWriter have_docutils = True except ImportError: have_docutils = False if have_docutils: # We run into issues in Windows binaries where docutils may be in a .zip # file, so template and .css files can't be located. This is OK for now, # as the HTML we generate is so basic we don't need stylesheets. class CustomWriter(BaseHTMLWriter): # This is the context of template.txt from distutils. template = """%(head_prefix)s %(head)s %(stylesheet)s %(body_prefix)s %(body_pre_docinfo)s %(docinfo)s %(body)s %(body_suffix)s """ def apply_template(self): # Docutils expects to find this on disk, but its not there subs = self.interpolation_dict() return self.template % subs def get_help_topic_as_html(topic): topics = HelpIndices() try: results = topics.search(topic) except NoHelpTopic: tpl = gettext("No help can be found for %s") return tpl % topic # assert len(results)==1, "what does more than one result mean?" # An example of when one might get more than one result, is if you have # bzrtools plugin install, you will get a second result for it command, # if you search for "Branches". We (like bzr help) only want to show the # first result. index, topic = results[0] if have_docutils: # we can make pretty HTML on the fly text = topic.get_help_text(plain=False) html = publish_string(text, writer=CustomWriter(), settings_overrides={'stylesheet': None, 'stylesheet_path': None}) else: # No docutils - we don't try too hard here - installing docutils is # easy! But we do try and make the line-breaks correct at least. text = topic.get_help_text(plain=True) bits = ['''

(Please install the Python docutils package for improved formatting)

'''] bits.append('
%s
' % text) html = ' '.join(bits) return html class QBzrHelpWindow(QBzrWindow): def __init__(self, parent=None): """Create help window. @param parent: If None, a normal top-level window will be opened. If not None, a 'tool' style window will be opened, be 'always on top' of the parent and have no taskbar entry. """ if parent is None: # a normal window. window_id = "help" default_size = (780, 580) else: # a smallish tooltop window. window_id = "help-popup" default_size = (500, 400) QBzrWindow.__init__(self, [gettext("Help")], parent, centralwidget=QtWidgets.QTextBrowser()) self.restoreSize(window_id, default_size) if parent is not None: # make it a tool window for the parent. self.setWindowFlags(QtCore.Qt.Tool) # Without this, the window object remains alive even after its closed. # There's no good reason for that... self.setAttribute(QtCore.Qt.WA_DeleteOnClose) def move_next_to(self, parent): """Move next to a parent window so we aren't obscuring any widgets""" # We move to the right of the parent if room for the window to be # full visible on the same screen as the parent. # Get the geometry for the screen holding the parent. desktop = QtWidgets.QApplication.desktop() geo = desktop.screenGeometry(parent) pt = parent.pos() parent_size = parent.size() my_size = self.size() new_pt = QtCore.QPoint(pt.x()+parent_size.width()+15, pt.y()) if geo.contains(QtCore.QRect(new_pt, my_size)): self.move(new_pt) else: # see if we can make it fit on the left. new_pt = QtCore.QPoint(pt.x()-my_size.width()-15, pt.y()) if geo.contains(QtCore.QRect(new_pt, my_size)): self.move(new_pt) else: # coulnd't fit it to the left *or* right - give up. pass def load_help_topic(self, topic): html = get_help_topic_as_html(topic) self.centralwidget.setHtml(html) def show_help(topic, parent=None): """Create a help window displaying the specified topic. If a parent is given, the window will be a 'tool' window for the parent, otherwise a normal MainWindow. """ # find an existing one with the same parent. for window in QtWidgets.QApplication.topLevelWidgets(): if isinstance(window, QBzrHelpWindow) and window.parentWidget()==parent: break else: # create a new one. window = QBzrHelpWindow(parent) window.load_help_topic(topic) # If a parent is specified and the window isn't visible, move it next to # the parent before displaying it. If the window is visible, its probably # exactly where the user wants it already... if parent is not None and not window.isVisible(): window.move_next_to(parent) window.show() return window ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/html_log.py0000644000000000000000000000617514556556456013600 0ustar00# Copyright (C) 2009 Canonical Ltd # # 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from html import escape import codecs from io import StringIO, BytesIO from breezy import log # def log_as_html(branch, rqst): # """Get the log for a branch as HTML text.""" # sio = codecs.getwriter('utf-8')(StringIO()) # #sio.encoding = 'utf-8' # try: # lf = HtmlLogFormatter(sio) # log.Logger(branch, rqst).show(lf) # return sio.getvalue().decode('utf-8') # finally: # sio.close() def log_as_html(branch, rqst): """Get the log for a branch as HTML text.""" sio = codecs.getwriter('utf-8')(BytesIO()) #sio.encoding = 'utf-8' try: lf = HtmlLogFormatter(sio) log.Logger(branch, rqst).show(lf) return sio.getvalue().decode('utf-8') finally: sio.close() class HtmlLogFormatter(log.LineLogFormatter): def __init__(self, *args, **kwargs): super(HtmlLogFormatter, self).__init__(*args, **kwargs) self.show_markers = False def begin_log(self): self.to_file.write('\n') headers = ['Rev', 'Message', 'Date', 'Author'] if self.show_markers: headers.append('Markers') self.to_file.write(self._make_row(headers, header=True)) def end_log(self): self.to_file.write("
\n") def log_revision(self, revision): rev = revision.rev cells = [] if revision.revno: # Is it worth doing anything smart with depth here? revno_str = "%s" % revision.revno else: # don't show revno when it is None revno_str = "" cells.append(revno_str) cells.append(rev.get_summary()) cells.append(self.date_string(rev)) cells.append(self.author_string(rev)) if self.show_markers: markers = [] if len(rev.parent_ids) > 1: markers.append('[merge]') if revision.tags: markers.append('{%s} ' % (', '.join(revision.tags))) cells.append(" ".join(markers)) self.to_file.write(self._make_row(cells)) def author_string(self, rev): return self.short_author(rev) def _make_row(self, cells, header=False): if header: cells = ['%s' % escape(cell) for cell in cells] else: cells = ["%s " % escape(cell) for cell in cells] return "%s\n" % ''.join(cells) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/i18n.py0000644000000000000000000000626514556556456012552 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2007 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. """I18N and L10N support""" import gettext as _gettext import os import sys _null_translation = _gettext.NullTranslations() _translation = _null_translation def gettext(s): return _translation.gettext(s) def ngettext(s, p, n): return _translation.ngettext(s, p, n) def N_(s): return s def install(): global _translation if not os.environ.get('LANGUAGE'): from breezy 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('qbrz', localedir=_get_locale_dir(), fallback=True) def uninstall(): global _translation _translation = _null_translation def _get_locale_dir(): 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'): if os.environ.get(i): break else: lang = None import locale try: import ctypes except ImportError: # use only user's default locale lang = locale.getdefaultlocale()[0] else: # using ctypes to determine all locales lcid_user = ctypes.windll.kernel32.GetUserDefaultLCID() lcid_system = ctypes.windll.kernel32.GetSystemDefaultLCID() if lcid_user != lcid_system: lcid = [lcid_user, lcid_system] else: lcid = [lcid_user] lang = [locale.windows_locale.get(i) for i in lcid] lang = ':'.join([i for i in lang if i]) # set lang code for gettext if lang: os.environ['LANGUAGE'] = lang # additional strings for translation if 0: # file kinds N_('file') N_('directory') N_('symlink') # bugs status N_('fixed') # qcat titles for various file types N_('View text file') N_('View image file') N_('View binary file') N_('View symlink') N_('View directory') # N_("No changes selected to commit") N_("No changes selected to revert") ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/ignore.py0000644000000000000000000002221414556556456013246 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2012 QBzr Developers # # 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. import os from PyQt5 import QtCore, QtWidgets from breezy.globbing import Globster from breezy.plugins.qbrz.lib.i18n import gettext, N_, ngettext from breezy.plugins.qbrz.lib.subprocess import SubProcessDialog from breezy.plugins.qbrz.lib.util import file_extension ACTION_NONE = 'none' ACTION_BY_EXT = 'ext' ACTION_BY_EXT_CASE_INSENSITIVE = 'ext,case-insensitive' ACTION_BY_BASENAME = 'basename' ACTION_BY_FULLNAME = 'fullname' class IgnoreWindow(SubProcessDialog): def __init__(self, tree, ui_mode=False, parent=None): super(IgnoreWindow, self).__init__( gettext("Ignore"), name="ignore", default_size=(400,400), ui_mode=ui_mode, dialog=False, parent=parent, hide_progress=True, ) self.wt = tree self.unknowns = {} groupbox = QtWidgets.QGroupBox(gettext("Unknown Files"), self) vbox = QtWidgets.QVBoxLayout(groupbox) self.unknowns_list = QtWidgets.QTreeWidget(groupbox) self.unknowns_list.setRootIsDecorated(False) self.unknowns_list.setUniformRowHeights(True) self.unknowns_list.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.unknowns_list.setHeaderLabels([gettext("File"), gettext("Extension"), gettext("Ignore as"),]) self.unknowns_list.setSortingEnabled(True) self.unknowns_list.sortByColumn(0, QtCore.Qt.AscendingOrder) self.unknowns_list.itemClicked[QTreeWidgetItem, int].connect(self.item_clicked) self.no_action = QtWidgets.QRadioButton(gettext('No action'), groupbox) self.no_action.setChecked(True) self.no_action.clicked[bool].connect(self.select_no_action) self.by_extension = QtWidgets.QRadioButton(gettext('Ignore all files with this extension'), groupbox) self.by_extension.clicked[bool].connect(self.select_by_extension) hbox = QtWidgets.QHBoxLayout() hbox.insertSpacing(0, 20) self.case_insensitive = QtWidgets.QCheckBox(gettext('Case-insensitive pattern'), groupbox) self.case_insensitive.clicked[bool].connect(self.select_case_insensitive) hbox.addWidget(self.case_insensitive) self.by_basename = QtWidgets.QRadioButton(gettext('Ignore by basename'), groupbox) self.by_basename.clicked[bool].connect(self.select_by_basename) self.by_fullname = QtWidgets.QRadioButton(gettext('Ignore by fullname'), groupbox) self.by_fullname.clicked[bool].connect(self.select_by_fullname) self._disable_actions() vbox.addWidget(self.unknowns_list) vbox.addWidget(self.no_action) vbox.addWidget(self.by_extension) vbox.addLayout(hbox) vbox.addWidget(self.by_basename) vbox.addWidget(self.by_fullname) layout = QtWidgets.QVBoxLayout(self) layout.addWidget(groupbox) layout.addWidget(self.make_default_status_box()) layout.addWidget(self.buttonbox) def _disable_actions(self): self._set_disabled_for_actions(True) def _enable_actions(self): self._set_disabled_for_actions(False) def _set_disabled_for_actions(self, flag): self.no_action.setDisabled(flag) self.by_extension.setDisabled(flag) self.case_insensitive.setDisabled(flag) self.by_basename.setDisabled(flag) self.by_fullname.setDisabled(flag) def show(self): SubProcessDialog.show(self) QtCore.QTimer.singleShot(1, self.load) def load(self): self.set_title([gettext("Ignore"), self.wt.basedir]) items = [] for i in self.wt.unknowns(): item = QtWidgets.QTreeWidgetItem() item.setText(0, i) item.setText(1, file_extension(i)) item.setData(0, QtCore.Qt.UserRole, i) item.setData(2, QtCore.Qt.UserRole, ACTION_NONE) items.append(item) self.unknowns[i] = item self.unknowns_list.clear() self.unknowns_list.addTopLevelItems(items) def _filename_from_item(self, item): return item.data(0, QtCore.Qt.UserRole) def _action_from_item(self, item): return item.data(2, QtCore.Qt.UserRole) def item_clicked(self, item, column): self._enable_actions() action = self._action_from_item(item) self._widgets_for_action(action) def _widgets_for_action(self, action): self.case_insensitive.setChecked(False) if action == ACTION_NONE: self.no_action.setChecked(True) elif action == ACTION_BY_EXT: self.by_extension.setChecked(True) elif action == ACTION_BY_EXT_CASE_INSENSITIVE: self.by_extension.setChecked(True) self.case_insensitive.setChecked(True) elif action == ACTION_BY_BASENAME: self.by_basename.setChecked(True) elif action == ACTION_BY_FULLNAME: self.by_fullname.setChecked(True) def select_no_action(self, checked): self.case_insensitive.setChecked(False) self.change_action(ACTION_NONE) def select_by_extension(self, checked): self.change_action(ACTION_BY_EXT) def select_case_insensitive(self, checked): if checked: self.by_extension.setChecked(True) self.change_action(ACTION_BY_EXT_CASE_INSENSITIVE) else: self.change_action(ACTION_BY_EXT) def select_by_basename(self, checked): self.case_insensitive.setChecked(False) self.change_action(ACTION_BY_BASENAME) def select_by_fullname(self, checked): self.case_insensitive.setChecked(False) self.change_action(ACTION_BY_FULLNAME) def change_action(self, new_action): item = self.unknowns_list.currentItem() old_action = self._action_from_item(item) if old_action == new_action: return filename = self._filename_from_item(item) if old_action != ACTION_NONE: old_pattern = self._pattern_for_action(filename, old_action) self._update_items(old_pattern, ACTION_NONE, self._clear_action_for_item) if new_action != ACTION_NONE: new_pattern = self._pattern_for_action(filename, new_action) self._update_items(new_pattern, new_action, self._set_pattern_action_for_item) def _update_items(self, pattern, action, method): globster = Globster([pattern]) for filename, item in self.unknowns.items(): if globster.match(filename) is not None: method(item, pattern, action) def _clear_action_for_item(self, item, pattern, action): item.setText(2, '') item.setData(2, QtCore.Qt.UserRole, action) def _set_pattern_action_for_item(self, item, pattern, action): item.setText(2, pattern) item.setData(2, QtCore.Qt.UserRole, action) # ignore pattern for *.foo case-insensitive RE:(?i).*\.foo # ignore pattern for files without extension (.first dot allowed though) RE:\.?[^.]+ def _pattern_for_action(self, filename, action): if action == ACTION_NONE: return '' elif action == ACTION_BY_EXT: ext = file_extension(filename) if ext: return '*'+ext else: return 'RE:\\.?[^.]+' elif action == ACTION_BY_EXT_CASE_INSENSITIVE: ext = file_extension(filename) if ext: return 'RE:(?i).*\\'+ext.lower() else: return 'RE:\\.?[^.]+' elif action == ACTION_BY_BASENAME: return os.path.basename(filename) elif action == ACTION_BY_FULLNAME: return './'+filename def validate(self): patterns = self._collect_patterns() if not patterns: self.operation_blocked(gettext("No action selected")) return False self.args = ['ignore'] + patterns self.process_widget.force_passing_args_via_file = True return True def _collect_patterns(self): patterns = set() for filename, item in self.unknowns.items(): action = self._action_from_item(item) if action != ACTION_NONE: pattern = self._pattern_for_action(filename, action) patterns.add(pattern) return sorted(list(patterns)) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/info.py0000644000000000000000000000465714556556456012731 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2008 Lukáš Lalinský # # 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 breezy import controldir, osutils from breezy.info import show_bzrdir_info from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.ui_info import Ui_InfoForm from breezy.plugins.qbrz.lib.util import ( BTN_CLOSE, QBzrWindow, url_for_display, ) import io class QBzrInfoWindow(QBzrWindow): def __init__(self, location, parent=None): QBzrWindow.__init__(self, [gettext("Info")], parent) self.restoreSize("info", (580, 250)) self.buttonbox = self.create_button_box(BTN_CLOSE) self.ui = Ui_InfoForm() self.ui.setupUi(self.centralwidget) self.ui.verticalLayout.addWidget(self.buttonbox) self.refresh_view(location) self.ui.tabWidget.setCurrentIndex(0) def refresh_view(self, location): self._set_location(location) self.populate_unparsed_info(location) def _set_location(self, location): if not location: self.ui.local_location.setText('-') return if location != '.': self.ui.local_location.setText(url_for_display(location)) return self.ui.local_location.setText(osutils.abspath(location)) def populate_unparsed_info(self, location): basic = io.StringIO() detailed = io.StringIO() a_controldir = controldir.ControlDir.open_containing(location)[0] show_bzrdir_info(a_controldir, 0, basic) show_bzrdir_info(a_controldir, 2, detailed) self.ui.basic_info.setText(basic.getvalue()) self.ui.detailed_info.setText(detailed.getvalue()) basic.close() detailed.close() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/init.py0000644000000000000000000001116114556556456012725 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # # 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 PyQt5 import QtCore import os from breezy.commands import get_cmd_object from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.subprocess import SubProcessDialog from breezy.plugins.qbrz.lib.ui_init import Ui_InitForm from breezy.plugins.qbrz.lib.util import ( hookup_directory_picker, DIRECTORYPICKER_TARGET, ) class QBzrInitWindow(SubProcessDialog): def __init__(self, localdir=".", parent=None, ui_mode=False): super(QBzrInitWindow, self).__init__( gettext("Initialize"), name = "init", ui_mode = ui_mode, dialog = True, parent = parent, hide_progress=True) self.ui = Ui_InitForm() self.ui.setupUi(self) # and add the subprocess widgets. for w in self.make_default_layout_widgets(): self.layout().addWidget(w) # One directory picker self.ui.location.setText(os.path.abspath(localdir)) hookup_directory_picker(self, self.ui.location_picker, self.ui.location, DIRECTORYPICKER_TARGET) # Combo box for repo format. cmd = get_cmd_object('init') opt = cmd.options()['format'] fill_option_combo(self.ui.combo_format, opt, 'default', self.ui.format_desc) self.ui.but_append_only.setToolTip(cmd.options()['append-revisions-only'].help) cmd = get_cmd_object('init-repo') opt = cmd.options()['no-trees'] self.ui.but_no_trees.setToolTip(opt.help) def _get_location(self): return str(self.ui.location.text()) def validate(self): if not self._get_location(): self.operation_blocked(gettext("You should specify a location")) return False return True def do_start(self): if self.ui.but_init.isChecked(): args = ['init'] if self.ui.but_append_only.isChecked(): args.append('--append-revisions-only') else: args = ['init-repo'] if self.ui.but_no_trees.isChecked(): args.append('--no-trees') args.append('--format=' + self.ui.combo_format.currentText()) args.append(self._get_location()) self.process_widget.do_start(None, *args) # TODO: Move this to the 'utils' module - but let's wait until we have another # user for this function, and we can see if it makes more sense to just # pass the command and option names rather than the option object itself? def fill_option_combo(combo, option, default, desc_widget=None): """Fill a widget with the values specified in a bzr.options.Option object. If default is specified, a string match is made. Otherwise, the first option is the default. If desc_widget is specified, it is a widget which will be updated with the help text for the option as each option is selected. """ def index_changed(index, combo=combo, desc_widget=desc_widget): help = combo.itemData(index) desc_widget.setText(help) default_index = 0 for i, info in enumerate(option.iter_switches()): if i==0: # this is the option itself continue name, short_name, argname, help = info if option.is_hidden(name): continue user_data = help or '' combo.addItem(name, user_data) if name == default: default_index = combo.count() - 1 if desc_widget is not None: combo.currentIndexChanged[int].connect(index_changed) combo.setCurrentIndex(default_index) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/lazycachedrevloader.py0000644000000000000000000001036114556556456015776 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2006-2007 Gary van der Merwe # # 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. #import weakref import time from PyQt5 import QtCore from breezy.transport.local import LocalTransport from breezy.repository import Repository from breezy.bzr.remote import RemoteRepository from breezy.plugins.qbrz.lib.uifactory import current_throbber cached_revisions = {} #weakref.WeakValueDictionary() """Global cache of revisions.""" def load_revisions(revids, repo, time_before_first_ui_update = 0.5, local_batch_size = 30, remote_batch_size = 5, before_batch_load = None, revisions_loaded = None, pass_prev_loaded_rev = False): start_time = time.process_time() showed_throbber = False revids = [revid for revid in revids if not revid == "root:"] return_revisions = {} throbber = current_throbber() try: for revid in [revid for revid in revids if revid in cached_revisions]: return_revisions[revid] = cached_revisions[revid] if pass_prev_loaded_rev: if revisions_loaded is not None: revisions_loaded(return_revisions, False) revs_loaded = {} revids = [revid for revid in revids if revid not in cached_revisions] if revids: if isinstance(repo, Repository) or isinstance(repo, RemoteRepository): repo_revids=((repo, revids),) else: repo_revids = repo(revids) for repo, revids in repo_revids: repo_is_local = isinstance(repo.controldir.transport, LocalTransport) if repo_is_local: batch_size = local_batch_size else: batch_size = remote_batch_size if revids: with repo.lock_read(): if not repo_is_local: update_ui() for offset in range(0, len(revids), batch_size): running_time = time.process_time() - start_time if time_before_first_ui_update < running_time: if revisions_loaded is not None: revisions_loaded(revs_loaded, False) revs_loaded = {} if not showed_throbber: if throbber: throbber.show() showed_throbber = True update_ui() batch_revids = revids[offset:offset+batch_size] if before_batch_load is not None: stop = before_batch_load(repo, batch_revids) if stop: break for rev in repo.get_revisions(batch_revids): cached_revisions[rev.revision_id] = rev return_revisions[rev.revision_id] = rev revs_loaded[rev.revision_id] = rev rev.repository = repo if revisions_loaded is not None: revisions_loaded(revs_loaded, True) finally: if showed_throbber: throbber.hide() return return_revisions def update_ui(): QtCore.QCoreApplication.processEvents() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/log.py0000644000000000000000000010607614556556456012555 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2006-2007 Lukáš Lalinský # # 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 PyQt5 import QtCore, QtGui, QtWidgets from breezy.revision import CURRENT_REVISION from breezy.plugins.qbrz.lib.util import ( BTN_CLOSE, BTN_REFRESH, QBzrWindow, ThrobberWidget, StandardButton, url_for_display, runs_in_loading_queue, get_set_encoding, ) from breezy.plugins.qbrz.lib.trace import reports_exception from breezy.plugins.qbrz.lib.uifactory import ui_current_widget from breezy.plugins.qbrz.lib.loggraphviz import GhostRevisionError import re from breezy import errors from breezy import osutils from breezy.controldir import ControlDir from breezy.urlutils import determine_relative_path, join, split from breezy.plugins.qbrz.lib.logwidget import LogList from breezy.plugins.qbrz.lib import logmodel from breezy.plugins.qbrz.lib.loggraphviz import BranchInfo from breezy.plugins.qbrz.lib.diff import has_ext_diff, ExtDiffMenu, DiffButtons from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.revisionmessagebrowser import LogListRevisionMessageBrowser from breezy.plugins.qbrz.lib.cat import QBzrCatWindow from breezy.plugins.qbrz.lib.annotate import AnnotateWindow QStringList = list PathRole = QtCore.Qt.UserRole + 1 file_idRole = QtCore.Qt.UserRole + 2 AliveRole = QtCore.Qt.UserRole + 3 have_search = None class Compleater(QtWidgets.QCompleter): def splitPath(self, path): return QStringList([path.split(" ")[-1]]) class LogWindow(QBzrWindow): FilterIdRole = QtCore.Qt.UserRole + 100 FilterMessageRole = QtCore.Qt.UserRole + 101 FilterAuthorRole = QtCore.Qt.UserRole + 102 FilterRevnoRole = QtCore.Qt.UserRole + 103 FilterSearchRole = QtCore.Qt.UserRole + 104 FilterTagRole = QtCore.Qt.UserRole + 105 FilterBugRole = QtCore.Qt.UserRole + 106 def __init__(self, locations=None, branch=None, tree=None, specific_file_ids=None, parent=None, ui_mode=True, no_graph=False, show_trees=False): """Create qlog window. Note: you must use either locations or branch+tree+specific_file_id arguments, but not both. @param locations: list of locations to show log (either list of URL/paths for several branches, or list of filenames from one branch). This list used when branch argument is None. @param branch: branch object to show the log. Could be None, in this case locations list will be used to open branch(es). @param specific_file_ids: file ids from the branch to filter the log. @param parent: parent widget. @param ui_mode: for compatibility with TortoiseBzr. @param no_graph: don't show the graph of revisions (make sense for `bzr qlog FILE` to force plain log a-la `bzr log`). """ self.title = gettext("Log") QBzrWindow.__init__(self, [self.title], parent, ui_mode=ui_mode) self.restoreSize("log", (710, 580)) self.no_graph = no_graph self.show_trees = show_trees if branch: self.branch = branch self.tree = tree self.locations = (branch,) self.specific_file_ids = specific_file_ids assert locations is None, "can't specify both branch and locations" else: self.branch = None self.locations = locations # if self.locations is None: # self.locations = [u"."] assert specific_file_ids is None, "specific_file_ids is ignored if branch is None" self.branches = None self.replace = {} self.throbber = ThrobberWidget(self) logwidget = QtWidgets.QWidget() logbox = QtWidgets.QVBoxLayout(logwidget) logbox.setContentsMargins(0, 0, 0, 0) searchbox = QtWidgets.QHBoxLayout() self.search_label = QtWidgets.QLabel(gettext("&Search:")) self.search_edit = QtWidgets.QLineEdit() self.search_label.setBuddy(self.search_edit) self.search_edit.textEdited['QString'].connect(self.set_search_timer) self.search_timer = QtCore.QTimer(self) self.search_timer.setSingleShot(True) self.search_timer.timeout.connect(self.update_search) searchbox.addWidget(self.search_label) searchbox.addWidget(self.search_edit) self.searchType = QtWidgets.QComboBox() self.searchType.addItem(gettext("Messages"), self.FilterMessageRole) self.searchType.addItem(gettext("Authors"), self.FilterAuthorRole) self.searchType.addItem(gettext("Revision IDs"), self.FilterIdRole) self.searchType.addItem(gettext("Revision Numbers"), self.FilterRevnoRole) self.searchType.addItem(gettext("Tags"), self.FilterTagRole) self.searchType.addItem(gettext("Bugs"), self.FilterBugRole) searchbox.addWidget(self.searchType) self.searchType.currentIndexChanged[int].connect(self.updateSearchType) logbox.addLayout(searchbox) self.log_list = LogList(self.processEvents, self.throbber, self, action_commands=True) logbox.addWidget(self.throbber) logbox.addWidget(self.log_list) self.current_rev = None self.message = QtGui.QTextDocument() self.message_browser = LogListRevisionMessageBrowser(self.log_list, self) self.message_browser.setDocument(self.message) self.file_list_container = FileListContainer(self.log_list, self) self.log_list.selectionModel().selectionChanged[QtCore.QItemSelection, QtCore.QItemSelection].connect(self.file_list_container.revision_selection_changed) hsplitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal) hsplitter.addWidget(self.message_browser) hsplitter.addWidget(self.file_list_container) hsplitter.setStretchFactor(0, 3) hsplitter.setStretchFactor(1, 1) splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical) splitter.addWidget(logwidget) splitter.addWidget(hsplitter) splitter.setStretchFactor(0, 5) splitter.setStretchFactor(1, 3) buttonbox = self.create_button_box(BTN_CLOSE) self.refresh_button = StandardButton(BTN_REFRESH) buttonbox.addButton(self.refresh_button, QtWidgets.QDialogButtonBox.ActionRole) self.refresh_button.clicked.connect(self.refresh) self.diffbuttons = DiffButtons(self.centralwidget) self.diffbuttons.setEnabled(False) self.diffbuttons._triggered['QString'].connect(self.log_list.show_diff_specified_files_ext) vbox = QtWidgets.QVBoxLayout(self.centralwidget) vbox.addWidget(splitter) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(self.diffbuttons) hbox.addWidget(buttonbox) vbox.addLayout(hbox) self.windows = [] # set focus on search edit widget self.log_list.setFocus() @ui_current_widget @reports_exception() def load(self): self.refresh_button.setDisabled(True) self.throbber.show() self.processEvents() try: # Set window title. lt = self._locations_for_title(self.locations) if lt: self.set_title((self.title, lt)) branches, primary_bi, file_ids = self.get_branches_and_file_ids() if self.show_trees: gz_cls = logmodel.WithWorkingTreeGraphVizLoader else: gz_cls = logmodel.GraphVizLoader self.log_list.load(branches, primary_bi, file_ids, self.no_graph, gz_cls) self.log_list.selectionModel().selectionChanged[QtCore.QItemSelection, QtCore.QItemSelection].connect(self.update_selection) self.load_search_indexes(branches) finally: self.refresh_button.setDisabled(False) self.throbber.hide() self.processEvents() def get_branches_and_file_ids(self): if self.branch: if self.tree is None: try: self.tree = self.branch.controldir.open_workingtree() except (errors.NoWorkingTree, errors.NotLocalUrl): pass label = self.branch_label(None, self.branch) bi = BranchInfo(label, self.tree, self.branch) return [bi], bi, self.specific_file_ids else: primary_bi = None branches = set() file_ids = [] if self.locations is not None: locations = self.locations else: locations = ['.'] # Branch names that indicated primary branch. # TODO: Make config option. primary_branch_names = ('trunk', 'bzr.dev') for location in locations: tree, br, repo, fp = ControlDir.open_containing_tree_branch_or_repository(location) self.processEvents() if br is None: if fp: raise errors.NotBranchError(fp) # RJLRJL: bzr-3.1 # * ``Repository.find_branches`` now returns an iterator rather than a # list. (Jelmer Vernooij, #413970) repo_branches = list(repo.find_branches(using=True)) if not repo_branches: raise errors.NotBranchError(fp) for br in repo_branches: self.processEvents() try: tree = br.controldir.open_workingtree() self.processEvents() except errors.NoWorkingTree: tree = None label = self.branch_label(None, br, location, repo) bi = BranchInfo(label, tree, br) branches.add(bi) if not primary_bi and br.nick in primary_branch_names: primary_bi = bi else: if len(locations) > 1: label = self.branch_label(location, br) else: label = None bi = BranchInfo(label, tree, br) if len(branches) == 0: # The first sepecified branch becomes the primary # branch. primary_bi = bi branches.add(bi) # 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. if fp != '' and self.locations is None: fp = '' if fp != '': # TODO: Have a way to specify a revision to find to file # path in, so that one can show deleted files. if tree is None: tree = br.basis_tree() file_id = tree.path2id(fp) if file_id is None: raise errors.BzrCommandError("Path does not have any revision history: %s" % location) file_ids.append(file_id) if file_ids and len(branches) > 1: raise errors.BzrCommandError(gettext( 'It is not possible to specify different file paths and different branches at the same time.')) return tuple(branches), primary_bi, file_ids def load_search_indexes(self, branches): global have_search, search_errors, search_index if have_search is None: have_search = True try: from breezy.plugins.search import errors as search_errors from breezy.plugins.search import index as search_index except ImportError: have_search = False if have_search: indexes_availble = False for bi in branches: try: bi.index = search_index.open_index_branch(bi.branch) indexes_availble = True except (search_errors.NoSearchIndex, errors.IncompatibleAPI): pass if indexes_availble: self.searchType.insertItem(0, gettext("Messages and File text (indexed)"), self.FilterSearchRole) self.searchType.setCurrentIndex(0) self.completer = Compleater(self) self.completer_model = QStringListModel(self) self.completer.setModel(self.completer_model) self.search_edit.setCompleter(self.completer) self.search_edit.textChanged['QString'].connect(self.update_search_completer) self.suggestion_letters_loaded = {"":QStringList()} self.suggestion_last_first_letter = "" self.completer.activated['QString'].connect(self.set_search_timer) 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: directory, name = split(path) directory = elided_text(directory, 10) name = elided_text(name) return join(directory, name) return path if shared_repo_location and shared_repo and not location: # Once we depend on breezy 2.2, this can become .user_url branch_rel = determine_relative_path(shared_repo.controldir.root_transport.base, branch.controldir.root_transport.base) if shared_repo_location == 'colo:': location = shared_repo_location + branch_rel else: location = join(shared_repo_location, branch_rel) if location is None: return elided_text(branch.nick) has_explicit_nickname = getattr(branch.get_config(), 'has_explicit_nickname', lambda: False)() append_nick = (location.startswith(':') or bool(self.no_usefull_info_in_location_re.match(location)) or has_explicit_nickname) if append_nick: return '%s (%s)' % (elided_path(location), branch.nick) return elided_text(location) def refresh(self): self.file_list_container.drop_delta_cache_with_wt() self.replace = {} self.load() def replace_config(self, branch): if branch.base not in self.replace: config = branch.get_config() replace = config.get_user_option("qlog_replace") if replace: replace = replace.split("\n") replace = [tuple(replace[2 * i:2 * i + 2]) for i in range(len(replace) // 2)] self.replace[branch.base] = replace return self.replace[branch.base] def show(self): # we show the bare form as soon as possible. super().show() # QBzrWindow.show(self) QtCore.QTimer.singleShot(0, self.load) def update_selection(self, selected, deselected): indexes = self.log_list.get_selection_indexes() if not indexes: self.diffbuttons.setEnabled(False) else: self.diffbuttons.setEnabled(True) @ui_current_widget def update_search(self): # TODO in_paths = self.search_in_paths.isChecked() gv = self.log_list.log_model.graph_viz role = self.searchType.itemData(self.searchType.currentIndex()) search_text = str(self.search_edit.text()) if search_text == "": self.log_list.set_search(None, None) elif role == self.FilterIdRole: self.log_list.set_search(None, None) self.log_list.select_revid(search_text) elif role == self.FilterRevnoRole: self.log_list.set_search(None, None) try: revno = tuple((int(number) for number in search_text.split('.'))) except ValueError: revno = () # Not sure what to do if there is an error. Nothing for now if revno in gv.revno_rev: rev = gv.revno_rev[revno] index = self.log_list.log_model.index_from_rev(rev) self.log_list.setCurrentIndex(index) else: if role == self.FilterMessageRole: field = "message" elif role == self.FilterAuthorRole: field = "author" elif role == self.FilterSearchRole: field = "index" elif role == self.FilterTagRole: field = 'tag' elif role == self.FilterBugRole: field = 'bug' else: raise Exception("Not done") self.log_list.set_search(search_text, field) self.log_list.scrollTo(self.log_list.currentIndex()) # Scroll to ensure the selection is on screen. @ui_current_widget def update_search_completer(self, text): gv = self.log_list.log_model.graph_viz # We only load the suggestions a letter at a time when needed. term = str(text).split(" ")[-1] if term: first_letter = term[0] else: first_letter = "" if first_letter != self.suggestion_last_first_letter: self.suggestion_last_first_letter = first_letter if first_letter not in self.suggestion_letters_loaded: suggestions = set() indexes = [bi.index for bi in gv.branches if bi.index is not None] for index in indexes: for s in index.suggest(((first_letter,),)): # if suggestions.count() % 100 == 0: # QtCore.QCoreApplication.processEvents() suggestions.add(s[0]) suggestions = QStringList(list(suggestions)) suggestions.sort() self.suggestion_letters_loaded[first_letter] = suggestions else: suggestions = self.suggestion_letters_loaded[first_letter] self.completer_model.setStringList(suggestions) def updateSearchType(self, index=None): self.update_search() def set_search_timer(self): self.search_timer.start(200) def _locations_for_title(self, locations): if locations is None: return osutils.getcwd() else: from breezy.branch import Branch def title_for_location(location): if isinstance(location, str): return url_for_display(location) if isinstance(location, Branch): return url_for_display(location.base) return str(location) return ", ".join(title_for_location(location) for location in locations) class FileListContainer(QtWidgets.QWidget): def __init__(self, log_list, parent=None): QtWidgets.QWidget.__init__(self, parent) self.log_list = log_list self.throbber = ThrobberWidget(self) self.throbber.hide() self.file_list = QtWidgets.QListWidget() self.file_list.doubleClicked[QtCore.QModelIndex].connect(self.show_diff_files) self.file_list.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.file_list_context_menu = QtWidgets.QMenu(self) if has_ext_diff(): diff_menu = ExtDiffMenu(self) self.file_list_context_menu.addMenu(diff_menu) diff_menu._triggered.connect(self.show_diff_files_ext) else: show_diff_action = self.file_list_context_menu.addAction(gettext("Show &differences..."), self.show_diff_files) self.file_list_context_menu.setDefaultAction(show_diff_action) self.file_list_context_menu_annotate = self.file_list_context_menu.addAction(gettext("Annotate"), self.show_file_annotate) self.file_list_context_menu_cat = self.file_list_context_menu.addAction(gettext("View file"), self.show_file_content) self.file_list_context_menu_save_old_file = self.file_list_context_menu.addAction( gettext("Save file on this revision as..."), self.save_old_revision_of_file) self.file_list_context_menu_revert_file = self.file_list_context_menu.addAction(gettext("Revert to this revision"), self.revert_file) self.file_list.customContextMenuRequested[QtCore.QPoint].connect(self.show_file_list_context_menu) vbox = QtWidgets.QVBoxLayout(self) vbox.setContentsMargins(0, 0, 0, 0) vbox.addWidget(self.throbber) vbox.addWidget(self.file_list) self.delta_load_timer = QtCore.QTimer(self) self.delta_load_timer.setSingleShot(True) self.delta_load_timer.timeout.connect(self.load_delta) self.current_revids = None self.tree_cache = {} self.delta_cache = {} def processEvents(self): self.window().processEvents() def revision_selection_changed(self, selected, deselected): revids, count = self.log_list.get_selection_top_and_parent_revids_and_count() if revids != self.current_revids: self.file_list.clear() self.current_revids = None self.delta_load_timer.start(200) @runs_in_loading_queue @ui_current_widget def load_delta(self): revids, count = self.log_list.get_selection_top_and_parent_revids_and_count() if revids == self.current_revids: return graph_viz = self.log_list.log_model.graph_viz is_working_tree_graph_viz = isinstance(graph_viz, logmodel.WithWorkingTreeGraphVizLoader) if self.log_list.log_model.file_id_filter: specific_file_ids = self.log_list.log_model.file_id_filter.file_ids else: specific_file_ids = [] if not revids or revids == (None, None): return if revids not in self.delta_cache: self.throbber.show() try: repos = [graph_viz.get_revid_branch(revid).repository for revid in revids] except GhostRevisionError: delta = None else: 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/qbrz/+bug/450225 # If only 1 revision is selected, use a optimized svn method # which actualy gets the server to do the delta, # else, don't do any delta. if count == 1: delta = repos[0].get_revision_delta(revids[0]) else: delta = None else: if len(repos) == 2 and repos[0].base == repos[1].base: # Both revids are from the same repository. Load together. repos_revids = [(repos[0], revids)] else: repos_revids = [(repo, [revid]) for revid, repo in zip(revids, repos)] for repo, repo_revids in repos_revids: repo_revids = [revid for revid in repo_revids if revid not in self.tree_cache] if repo_revids: with repo.lock_read(): self.processEvents() for revid in repo_revids: if revid.startswith(CURRENT_REVISION) and is_working_tree_graph_viz: tree = graph_viz.working_trees[revid] else: tree = repo.revision_tree(revid) self.tree_cache[revid] = tree self.processEvents() self.processEvents() delta = self.tree_cache[revids[0]].changes_from(self.tree_cache[revids[1]]) self.delta_cache[revids] = delta finally: self.throbber.hide() self.processEvents() else: delta = self.delta_cache[revids] new_revids, count = self.log_list.get_selection_top_and_parent_revids_and_count() if new_revids != revids: return # Jelmer's commit 7389 states: TreeDelta holds TreeChange objects rather than tuples of various sizes # # It used to be seven lists:-- # # added # (path, id, kind) # removed # (path, id, kind) # renamed # (oldpath, newpath, id, kind, text_modified, meta_modified) # kind_changed # (path, id, old_kind, new_kind) # modified # (path, id, kind, text_modified, meta_modified) # unchanged # (path, id, kind) # unversioned # (path, None, kind) # # Now they are TreeChange objects in the lists added[], removed[] renamed[], copied[] and modified[] # # self.file_id = file_id # self.path = path # self.changed_content = changed_content # self.versioned = versioned # self.parent_id = parent_id # self.name = name # self.kind = kind # self.executable = executable # if delta: items = [] # each item is 6-tuple: (id, path, is_not_specific_file_id, display, color, is_alive) if delta.added: for tree_change in delta.added: items.append( (tree_change.file_id, tree_change.path[1], tree_change.file_id not in specific_file_ids, tree_change.path[1], 'blue', True)) if delta.modified: for tree_change in delta.modified: items.append( (tree_change.file_id, tree_change.path[0], tree_change.file_id not in specific_file_ids, tree_change.path[0], None, True)) if delta.removed: for tree_change in delta.removed: items.append( (tree_change.file_id, tree_change.path[0], tree_change.file_id not in specific_file_ids, tree_change.path[0], 'red', False)) if delta.renamed: for tree_change in delta.renamed: items.append( (tree_change.file_id, tree_change.path[0], tree_change.file_id not in specific_file_ids, tree_change.path[1], None, True)) # for (oldpath, newpath, id, kind, text_modified, meta_modified) in delta.renamed: # for tree_change in delta.renamed: # items.append( # (tree_change.file_id, tree_change.path, # tree_change.file_id not in specific_file_ids, # tree_change.path, 'purple', True)) # items.append((id, # newpath, # id not in specific_file_ids, # "%s => %s" % (oldpath, newpath), # "purple", # True)) for (id, path, is_not_specific_file_id, display, color, is_alive) in sorted(items, key=lambda x: (x[2],x[1])): item = QtWidgets.QListWidgetItem(display, self.file_list) item.setData(PathRole, path) item.setData(file_idRole, id) item.setData(AliveRole, is_alive) if color: item.setForeground(QtGui.QColor(color)) if not is_not_specific_file_id: f = item.font() f.setBold(True) item.setFont(f) self.current_revids = revids def drop_delta_cache_with_wt(self): gv = self.log_list.log_model.graph_viz if not isinstance(gv, logmodel.WithWorkingTreeGraphVizLoader): return cache = self.delta_cache keys = [k for k in cache.keys() if k[0].startswith(CURRENT_REVISION)] for key in keys: del(cache[key]) def show_file_list_context_menu(self, pos): (top_revid, old_revid), count = self.log_list.get_selection_top_and_parent_revids_and_count() if count == 0: return # XXX - We should also check that the selected file is a file, and # not a dir paths, file_ids, alives = self._get_file_selection_paths_ids_and_alives() is_single_file = len(paths) == 1 wt_selected = top_revid.startswith(CURRENT_REVISION) menu_enabled = is_single_file and alives[0] self.file_list_context_menu_annotate.setEnabled(menu_enabled) self.file_list_context_menu_cat.setEnabled(menu_enabled) menu_enabled = is_single_file and alives[0] and not wt_selected self.file_list_context_menu_save_old_file.setEnabled(menu_enabled) self.file_list_context_menu_save_old_file.setVisible(menu_enabled) gv = self.log_list.log_model.graph_viz # 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. menu_enabled = (len(gv.branches) == 1 and gv.branches[0].tree is not None and not wt_selected) self.file_list_context_menu_revert_file.setEnabled(menu_enabled) self.file_list_context_menu_revert_file.setVisible(menu_enabled) self.file_list_context_menu.popup(self.file_list.viewport().mapToGlobal(pos)) def get_file_selection_indexes(self, index=None): if index is None: return self.file_list.selectionModel().selectedRows(0) else: return [index] def get_file_selection_paths_and_ids(self, index=None): paths, ids, alives = self._get_file_selection_paths_ids_and_alives(index) return paths, ids def _get_file_selection_paths_ids_and_alives(self, index=None): indexes = self.get_file_selection_indexes(index) # paths = [] ids = [] alives = [] # for index in indexes: item = self.file_list.itemFromIndex(index) paths.append(str(item.data(PathRole))) ids.append(item.data(file_idRole)) alives.append(bool(item.data(AliveRole))) return paths, ids, alives @ui_current_widget def show_diff_files(self, index=None, ext_diff=None): """Show differences of a specific file in a single revision""" paths, ids = self.get_file_selection_paths_and_ids(index) self.log_list.show_diff(specific_files=paths, specific_file_ids=ids, ext_diff=ext_diff) @ui_current_widget def show_diff_files_ext(self, ext_diff=None): """Show differences of a specific file in a single revision""" self.show_diff_files(ext_diff=ext_diff) @runs_in_loading_queue @ui_current_widget def show_file_content(self): """Launch qcat for one selected file.""" 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() gv = self.log_list.log_model.graph_viz branch = gv.get_revid_branch(top_revid) if top_revid.startswith(CURRENT_REVISION): tree = gv.working_trees[top_revid] else: tree = branch.repository.revision_tree(top_revid) encoding = get_set_encoding(None, branch) window = QBzrCatWindow(filename = paths[0], tree = tree, parent=self, encoding=encoding) window.show() self.window().windows.append(window) @ui_current_widget def save_old_revision_of_file(self): """Saves the selected file in its revision to a directory.""" 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() branch = self.log_list.log_model.graph_viz.get_revid_branch(top_revid) tree = branch.repository.revision_tree(top_revid) path = paths[0] with tree.lock_read(): kind = tree.kind(path) if kind == 'file': file_content_bytes = tree.get_file_text(path) if kind != 'file': QtWidgets.QMessageBox.information(self, gettext("Not a file"), gettext("Operation is supported for a single file only,\nnot for a %s." % kind)) return filename = QtWidgets.QFileDialog.getSaveFileName(self, gettext("Save file in this revision as..."))[0] if filename: with open(str(filename), 'wb') as f: f.write(file_content_bytes) @ui_current_widget def revert_file(self): """Reverts the file to what it was at the selected revision.""" res = QtWidgets.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?"), QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) if res == QtWidgets.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() gv = self.log_list.log_model.graph_viz assert(len(gv.branches) == 1) branch_info = gv.branches[0] rev_tree = gv.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.""" 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() branch_info = self.log_list.log_model.graph_viz.get_revid_branch_info(top_revid) if top_revid.startswith(CURRENT_REVISION): tree = branch_info.tree else: tree = branch_info.branch.repository.revision_tree(top_revid) window = AnnotateWindow(branch_info.branch, branch_info.tree, tree, paths[0], file_ids[0]) window.show() self.window().windows.append(window) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/loggraphviz.py0000644000000000000000000016765214556556456014337 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2006-2010 Gary van der Merwe # # 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. """ Layout a revision graph for visual representation, allowing for filtering and collapsible branches. Usage example ============= .. python:: bi = loggraphviz.BranchInfo('branch-label', tree, branch) graph_viz = loggraphviz.GraphVizLoader([bi], bi, False) graph_viz.load() state = loggraphviz.GraphVizFilterState(graph_viz) computed = graph_viz.compute_viz(state) """ import gc from functools import reduce from breezy import errors from breezy.controldir import ControlDir from breezy.transport.local import LocalTransport from breezy.revision import NULL_REVISION, CURRENT_REVISION from breezy.graph import ( Graph, StackedParentsProvider, KnownGraph, DictParentsProvider, ) class BranchInfo(object): """Wrapper for a branch, it's working tree, if available, and a label.""" def __init__(self, label, tree, branch, index=None): self.label = label self.tree = tree self.branch = branch self.index = index def __hash__(self): return self.branch.base.__hash__() def __eq__(self, other): if isinstance(other, BranchInfo): return self.branch.base.__eq__(other.branch.base) return False class RevisionData(object): """ Container for data for a revision in the graph that gets calculated when the graph is loaded. """ # Instance of this object are typically named "rev". __slots__ = ["index", "_merge_sort_node", "branch", "_revno_str", "merges", "merged_by", 'branch_id', 'color'] def __init__(self, index, merge_sort_node): """Create a new RevisionData instance.""" self.index = index self._merge_sort_node = merge_sort_node self.branch = None self._revno_str = None self.merges = [] """Revision indexes that this revision merges""" self.merged_by = None """Revision index that merges this revision.""" self.branch_id = self._merge_sort_node.revno[0:-1] self.color = reduce(lambda x, y: x + y, self.branch_id, 0) 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 for revno in self.revno_sequence]) if self.revid.startswith(CURRENT_REVISION): self._revno_str += " ?" return self._revno_str revno_str = property(get_revno_str) def __repr__(self): return "%s <%s %s>" % (self.__class__.__name__, self.revno_str, self.revid) class BranchLine(object): """Container for data for a branch line, aka merge line.""" __slots__ = ["branch_id", "revs", "merges", "merged_by", "color", "merge_depth"] def __init__(self, branch_id): self.branch_id = branch_id self.revs = [] self.merges = [] self.merged_by = [] self.merge_depth = 0 def __repr__(self): return "%s <%s>" % (self.__class__.__name__, self.branch_id) 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 class GraphVizLoader(object): """ Loads graph for branches and provides computed layout for visual representation. """ # 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 collapsed). # * We have a specified 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. # # The main list of unfiltered revisions is self.revisions. A revisions # index in revisions are normally called index. The main list of filtered # revisions is filtered_revs. Revision indexes in this list are called # f_index. def __init__(self, branches, primary_bi, no_graph): self.branches = branches """List of BranchInfo for each branch.""" self.primary_bi = primary_bi self.no_graph = no_graph self.repos = [] self.local_repo_copies = [] """A list of repositories that revisions will be attempted to be loaded from first.""" self.revid_head_info = {} """Dict with a keys of head revid and value of (list of (branch, label), list of revids that are unique to this head) We can't just store the BranchInfo, because the label may have have addition text in it, e.g. "Working Tree", "Pending Merges" """ self.revid_branch_info = {} self.ghosts = set() self.revisions = [] """List of RevisionInfo from merge_sort.""" self.revid_rev = {} self.graph_children = {} self.tags = {} # map revid -> tags set def load(self): # Get a unique list of repositories. If the url is the same, # we consider it the same repositories repo_urls = set() for bi in self.branches: repo = bi.branch.repository if repo.base not in repo_urls: repo_urls.add(repo.base) self.repos.append(repo) no_local_repos = True for repo in self.repos: if repo_is_local(repo): no_local_repos = False if no_local_repos: self.load_current_dir_repo() self.repos.sort(key=lambda repo: not repo_is_local(repo)) self.lock_read_branches() try: head_revids, graph_parents = self.load_graph_parents() self.process_graph_parents(head_revids, graph_parents) self.compute_head_info() del self.graph if not self.no_graph: self.compute_branch_lines() self.compute_merge_info() self.load_tags() finally: self.unlock_branches() def load_current_dir_repo(self): # There are no local repositories. Try open the repository # of the current directory, and try load revisions data from # this before trying from remote repositories. This makes # the common use case of viewing a remote branch that is # related to the current branch much faster, because most # of the revision can be loaded from the local repository. try: controldir, relpath = ControlDir.open_containing(".") repo = controldir.find_repository() self.repos.add(repo) self.local_repo_copies.append(repo) except Exception: pass def update_ui(self): pass def throbber_show(self): pass def throbber_hide(self): pass def lock_read_branches(self): for bi in self.branches: bi.branch.lock_read() for repo in self.repos: repo.lock_read() def unlock_branches(self): for bi in self.branches: bi.branch.unlock() for repo in self.repos: repo.unlock() def load_tags(self): self.tags = {} for bi in self.branches: # revid to tags map branch_tags = bi.branch.tags.get_reverse_tag_dict() for revid, tags in branch_tags.items(): if revid in self.tags: self.tags[revid].update(set(tags)) else: self.tags[revid] = set(tags) def append_head_info(self, revid, branch_info, tag): if not revid == NULL_REVISION: if revid not in self.revid_head_info: self.revid_head_info[revid] = ([], []) self.revid_head_info[revid][0].append((branch_info, tag)) # So that early calls to get_revid_branch work self.revid_branch_info[revid] = branch_info def load_branch_heads(self, bi): branch_heads = [] def append_head_info(revid, branch_info, label): self.append_head_info(revid, branch_info, label) branch_heads.append(revid) if len(self.branches) > 0: label = bi.label else: label = None branch_last_revision = bi.branch.last_revision() append_head_info(branch_last_revision, bi, bi.label) self.update_ui() if bi.tree: parent_ids = bi.tree.get_parent_ids() if parent_ids: # first parent is last revision of the tree revid = parent_ids[0] if revid != branch_last_revision: # working tree is out of date if label: wt_label = "%s - Working Tree" % label else: wt_label = "Working Tree" append_head_info(revid, bi, wt_label) # other parents are pending merges for revid in parent_ids[1:]: if label: pm_label = "%s - Pending Merge" % label else: pm_label = "Pending Merge" append_head_info(revid, bi, pm_label) self.update_ui() return branch_heads, branch_heads, () def load_graph_parents(self): """Load the heads of the graph, and the graph parents""" extra_parents = {} branches_heads = [] def load_branch_heads(bi, insert_at_begin=False): load_heads, sort_heads, extra_parents_ = self.load_branch_heads(bi) for key, parents in extra_parents_: extra_parents[key] = parents if insert_at_begin: branches_heads.insert(0, (load_heads, sort_heads)) else: branches_heads.append((load_heads, sort_heads)) for bi in self.branches: # Don't do the primary branch, as that will be inserted later at # the first position. if bi != self.primary_bi: load_branch_heads(bi) if len(branches_heads) >= 2: head_revids = [revid for load_heads, sort_heads in branches_heads for revid in load_heads] head_revs = self.load_revisions(head_revids) get_max_timestamp = lambda branch_heads: max([head_revs[revid].timestamp for revid in branch_heads[0]]) branches_heads.sort(key=get_max_timestamp, reverse=True) if self.primary_bi: load_branch_heads(self.primary_bi, True) load_heads = [revid for load_heads_, sort_heads_ in branches_heads for revid in load_heads_] sort_heads = [revid for load_heads_, sort_heads_ in branches_heads for revid in sort_heads_] parents_providers = [repo._make_parents_provider() for repo in self.repos] parents_providers.append(DictParentsProvider(extra_parents)) self.graph = Graph(StackedParentsProvider(parents_providers)) return sort_heads, self.graph.iter_ancestry(sort_heads) def process_graph_parents(self, head_revids, graph_parents_iter): graph_parents = {} self.ghosts = set() for (revid, parent_revids) in graph_parents_iter: if revid == NULL_REVISION: continue if parent_revids is None: # Ghost graph_parents[revid] = () self.ghosts.add(revid) elif parent_revids == (NULL_REVISION,): graph_parents[revid] = () else: graph_parents[revid] = parent_revids if len(graph_parents) % 100 == 0: self.update_ui() graph_parents["top:"] = 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 = [RevisionData(index, node) for index, node in enumerate(merge_sorted_revisions)] if enabled: gc.enable() else: self.revisions = () self.revid_rev = {} self.revno_rev = {} self.max_mainline_revno = 0 for rev in self.revisions: self.max_mainline_revno = max(self.max_mainline_revno, rev.revno_sequence[0]) self.revid_rev[rev.revid] = rev self.revno_rev[rev.revno_sequence] = rev def branch_id_sort_key(self, x): merge_depth = self.branch_lines[x].merge_depth # Note: This greatly affects the layout of the graph. # # Branch line that have a smaller merge depth should be to the left # of those with bigger merge depths. # # For branch lines that have the same parent in the mainline - # those with bigger branch numbers to be to the rights. E.g. for # the following dag, you want the graph to appear as on the left, # not as on the right: # # 3 F_ F # | \ |\ # 1.2.1 | E | E # | | | \ # 2 D | D_| # |\ | | +_ # 1.1.2 | C| | | C # | |/ | \| # 1.1.1 | B | B # |/ | / # 1 A A # # Otherwise, those with a greater mainline parent revno should # appear to the left. if len(x) == 0: return merge_depth, 0, 0 else: return merge_depth, -x[0], x[1] def compute_branch_lines(self): self.branch_lines = {} """A list of branch lines (aka merge lines). For a revisions, the revision number less the least significant digit is the branch_id, and used as the key for the dict. Hence revision with the same revision number less the least significant digit are considered to be in the same branch line. e.g.: for revisions 290.12.1 and 290.12.2, the branch_id would be 290.12, and these two revisions will be in the same branch line. """ self.branch_ids = [] """List of branch ids, sorted in the order that the branches will be shown, from left to right on the graph.""" for rev in self.revisions: branch_line = None if rev.branch_id not in self.branch_lines: branch_line = BranchLine(rev.branch_id) self.branch_lines[rev.branch_id] = branch_line else: branch_line = self.branch_lines[rev.branch_id] branch_line.revs.append(rev) branch_line.merge_depth = max(rev.merge_depth, branch_line.merge_depth) rev.branch = branch_line self.branch_ids = list(self.branch_lines.keys()) self.branch_ids.sort(key=self.branch_id_sort_key) def compute_merge_info(self): def set_merged_by(rev, merged_by, merged_by_rev, do_branches=False): if merged_by is None: return if merged_by_rev is None: merged_by_rev = self.revisions[merged_by] rev.merged_by = merged_by merged_by_rev.merges.append(rev.index) if do_branches: branch_id = rev.branch_id branch_merged_by = self.branch_lines[branch_id].merged_by merged_by_branch_id = self.revisions[merged_by].branch_id merged_by_branch_merges = self.branch_lines[merged_by_branch_id].merges if branch_id not in merged_by_branch_merges: merged_by_branch_merges.append(branch_id) if merged_by_branch_id not in branch_merged_by: branch_merged_by.append(merged_by_branch_id) for rev in self.revisions: 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: set_merged_by(parents[0], rev.merged_by, None) for parent in parents[1:]: if rev.merge_depth <= parent.merge_depth: set_merged_by(parent, rev.index, rev, do_branches=True) def compute_head_info(self): def get_revid_head(heads): revision_map = {} for i in range(len(heads)): prev_revids = [revid for revid, head in heads[:i]] unique_ancestors = self.graph.find_unique_ancestors( heads[i][0], prev_revids) for ancestor_revid in unique_ancestors: revision_map[ancestor_revid] = heads[i][1] return revision_map if len(self.branches) > 1: head_revid_branch_info = sorted( [(revid, branch_info) for revid, (head_info, ur) in self.revid_head_info.items() for (branch_info, tag) in head_info], key=lambda x: not repo_is_local(x[1].branch.repository)) self.revid_branch_info = get_revid_head(head_revid_branch_info) else: self.revid_branch_info = {} head_count = 0 for head_info, ur in self.revid_head_info.values(): head_count += len(head_info) if head_count > 1: # Populate unique revisions for heads for revid, (head_info, ur) in self.revid_head_info.items(): rev = None if revid in self.revid_rev: rev = self.revid_rev[revid] if rev and rev.merged_by: # This head has been merged. # d # |\ # b c # |/ # a # if revid == c,then we want other_revids = [b] merged_by_revid = self.revisions[rev.merged_by].revid 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.keys() if not other_revid == revid] ur.append(revid) ur.extend([revid for revid in self.graph.find_unique_ancestors(revid, other_revids) if not revid == NULL_REVISION and revid in self.revid_rev]) ur.sort(key=lambda x: self.revid_rev[x].index) def compute_viz(self, state): # Overview: # Work out which revision need to be displayed. # Create ComputedGraphViz and ComputedRevisionData objects # Assign columns for branches, and lines that go between branches. # These are intermingled, because some of the lines need to come # before it's branch, and others need to come after. Other lines # (such a the line from the last rev in a branch) are treated a # special cases. # Return ComputedGraphViz object gc_enabled = gc.isenabled() gc.disable() try: computed = ComputedGraphViz(self) computed.filtered_revs = [ComputedRevisionData(rev) for rev in state.get_filtered_revisions()] c_revisions = computed.revisions for f_index, c_rev in enumerate(computed.filtered_revs): c_revisions[c_rev.rev.index] = c_rev c_rev.f_index = f_index for (revid, (head_info, unique_revids)) in self.revid_head_info.items(): for unique_revid in unique_revids: rev = self.revid_rev[unique_revid] c_rev = c_revisions[rev.index] if c_rev is not None: c_rev.branch_labels.extend(head_info) break finally: if gc_enabled: gc.enable() if self.no_graph: for c_rev in computed.filtered_revs: c_rev.col_index = c_rev.rev.merge_depth * 0.5 return computed # This will hold a tuple of (child, parent, col_index, direct) for each # line that needs to be drawn. If col_index is not none, then the line # is drawn along that column, else the the line can be drawn directly # between the child and parent because either the child and parent are # in the same branch line, or the child and parent are 1 row apart. lines = [] lines_by_column = [] def branch_line_col_search_order(start_col_index): for col_index in range(start_col_index, len(lines_by_column)): yield col_index #for col_index in range(parent_col_index-1, -1, -1): # yield col_index def line_col_search_order(parent_col_index, child_col_index): if parent_col_index is not None and child_col_index is not None: max_index = max(parent_col_index, child_col_index) min_index = min(parent_col_index, child_col_index) # First yield the columns between the child and parent. for col_index in range(max_index, min_index - 1, -1): yield col_index elif child_col_index is not None: max_index = child_col_index min_index = child_col_index yield child_col_index elif parent_col_index is not None: max_index = parent_col_index min_index = parent_col_index yield parent_col_index else: max_index = 0 min_index = 0 yield 0 i = 1 # then yield the columns on either side. while max_index + i < len(lines_by_column) or min_index - i > -1: if max_index + i < len(lines_by_column): yield max_index + i #if min_index - i > -1: # yield min_index - i i += 1 def is_col_free_for_range(col_index, child_f_index, parent_f_index): return not any( range_overlaps(child_f_index, parent_f_index, line_child_f_index, line_parent_f_index) for line_child_f_index, line_parent_f_index in lines_by_column[col_index]) def find_free_column(col_search_order, child_f_index, parent_f_index): for col_index in col_search_order: if is_col_free_for_range(col_index, child_f_index, parent_f_index): break else: # No free columns found. Add an empty one on the end. col_index = len(lines_by_column) lines_by_column.append([]) return col_index def append_line(child, parent, direct, col_index=None): lines.append((child, parent, col_index, direct)) if col_index is not None: lines_by_column[int(round(col_index))].append( (child.f_index, parent.f_index)) def find_visible_parent(c_rev, parent, twisty_hidden_parents): if c_revisions[parent.index] is not None: return (c_rev, c_revisions[parent.index], True) else: if parent.index in twisty_hidden_parents: # no need to draw a line if there is a twisty, # except if this is the last in the branch. return None # The parent was not visible. Search for a ancestor # that is. Stop searching if we make a hop, i.e. we # go away from our branch, and we come back to it. has_seen_different_branch = False while c_revisions[parent.index] is None: if not parent.branch_id == c_rev.rev.branch_id: has_seen_different_branch = True # find grand parent. g_parent_ids = (self.known_graph.get_parent_keys(parent.revid)) if len(g_parent_ids) == 0: return None else: parent = self.revid_rev[g_parent_ids[0]] if has_seen_different_branch and parent.branch_id == branch_id: # We have gone away and come back to our # branch. Stop. return None if parent: # Not Direct return c_rev, c_revisions[parent.index], False def append_branch_parent_lines(branch_rev_visible_parents): groups = group_overlapping(branch_rev_visible_parents) for parents, start, end, group_key in groups: # Since all parents go from the same branch line to the # same branch line, we can use the col indexes of the # parent. if end - start == 1: col_index = None else: col_search_order = line_col_search_order(parents[0][1].col_index, parents[0][0].col_index) col_index = find_free_column(col_search_order, start, end) col_offset_increment = 1.0 / len(parents) for i, (c_rev, parent_c_rev, direct) in enumerate(parents): if col_index is None: col_index_offset = None else: col_index_offset = (col_index - 0.5 + (i * col_offset_increment) + (col_offset_increment / 2)) append_line(c_rev, parent_c_rev, direct, col_index_offset) for branch_id in self.branch_ids: if branch_id not in state.branch_line_state: continue branch_line = self.branch_lines[branch_id] branch_revs = [c_revisions[rev.index] for rev in branch_line.revs if c_revisions[rev.index] is not None] if not branch_revs: continue branch_rev_visible_parents_post = [] branch_rev_visible_parents_pre = [] # Lists of ([(c_rev, parent_c_rev, is_direct)], # start, end, group_key] last_c_rev = branch_revs[-1] last_rev_left_parents = (self.known_graph.get_parent_keys(last_c_rev.rev.revid)) if last_rev_left_parents: last_parent = find_visible_parent(last_c_rev, self.revid_rev[last_rev_left_parents[0]], []) else: last_parent = None sprout_with_lines = {} merged_by_max_col_index = 0 # In this loop: # * Populate twisty_branch_ids and twisty_state # * Find visible parents. # * Append lines that go before the branch line. # * Append lines to children for sprouts. for c_rev in branch_revs: rev = c_rev.rev if rev.merged_by is not None: merged_by_c_rev = c_revisions[rev.merged_by] if merged_by_c_rev: merged_by_max_col_index = max(merged_by_max_col_index, merged_by_c_rev.col_index) parents = [self.revid_rev[parent_revid] for parent_revid in self.known_graph.get_parent_keys(rev.revid)] twisty_hidden_parents = [] # Find and add necessary twisties for parent in parents: if parent.branch_id == branch_id: continue if parent.branch_id == (): continue if parent.branch_id in branch_line.merged_by: continue parent_branch = self.branch_lines[parent.branch_id] # Does this branch have any visible revisions pb_visible = (parent_branch.branch_id in state.branch_line_state) for pb_rev in parent_branch.revs: if pb_visible: visible = c_revisions[pb_rev.index] is not None else: visible = state.get_revision_visible_if_branch_visible(pb_rev) if visible: (c_rev.twisty_expands_branch_ids.append(parent_branch.branch_id)) if not pb_visible: twisty_hidden_parents.append(parent.index) break # Work out if the twisty needs to show a + or -. If all # twisty_branch_ids are visible, show - else +. if len(c_rev.twisty_expands_branch_ids) > 0: c_rev.twisty_state = True for twisty_branch_id in c_rev.twisty_expands_branch_ids: if twisty_branch_id not in state.branch_line_state: c_rev.twisty_state = False break # Don't include left hand parents All of these parents in the # branch can be drawn with one line. parents = parents[1:] branch_id_sort_key = self.branch_id_sort_key(branch_id) for i, parent in enumerate(parents): parent_info = find_visible_parent(c_rev, parent, twisty_hidden_parents) if parent_info: c_rev, parent_c_rev, direct = parent_info if (last_parent and parent_c_rev.f_index <= last_parent[1].f_index and self.branch_id_sort_key(parent_c_rev.rev.branch_id) < branch_id_sort_key): # This line goes before the branch line dest = branch_rev_visible_parents_pre else: # This line goes after dest = branch_rev_visible_parents_post line_len = parent_c_rev.f_index - c_rev.f_index if line_len == 1: group_key = None else: group_key = parent_c_rev.rev.branch_id dest.append(([parent_info], c_rev.f_index, parent_c_rev.f_index, group_key)) # This may be a sprout. Add line to first visible child if c_rev.rev.merged_by is not None: merged_by = self.revisions[c_rev.rev.merged_by] if c_revisions[merged_by.index] is None and branch_revs[0].f_index == c_rev.f_index: # The revision that merges this revision is not # visible, and it is the first visible revision in # the branch line. This is a sprout. # # XXX What if multiple merges with --force, # aka octopus merge? # # Search until we find a descendant that is visible. while merged_by is not None and c_revisions[merged_by.index] is None: if merged_by.merged_by is not None: merged_by = self.revisions[merged_by.merged_by] else: merged_by = None if merged_by is not None: # Ensure only one line to a descendant. if merged_by.index not in sprout_with_lines: sprout_with_lines[merged_by.index] = True parent = c_revisions[merged_by.index] if parent is not None: if c_rev.f_index - parent.f_index == 1: col_index = None else: col_search_order = line_col_search_order(parent.col_index, c_rev.col_index) col_index = find_free_column(col_search_order, parent.f_index, c_rev.f_index) append_line(parent, c_rev, False, col_index) # Find a column for this branch. # # Find the col_index for the direct parent branch. This will # be the starting point when looking for a free column. append_branch_parent_lines(branch_rev_visible_parents_pre) if branch_id == (): start_col_index = 0 else: start_col_index = 1 if last_parent and last_parent[0].col_index is not None: parent_col_index = last_parent[1].col_index start_col_index = max(start_col_index, parent_col_index) start_col_index = max(start_col_index, merged_by_max_col_index) col_search_order = branch_line_col_search_order(start_col_index) if last_parent: col_index = find_free_column(col_search_order, branch_revs[0].f_index, last_parent[1].f_index) else: col_index = find_free_column(col_search_order, branch_revs[0].f_index, branch_revs[-1].f_index) # Free column for this branch found. Set node for all # revision in this branch. for rev in branch_revs: rev.col_index = col_index append_line(branch_revs[0], branch_revs[-1], True, col_index) if last_parent: append_line(last_parent[0], last_parent[1], last_parent[2], col_index) branch_rev_visible_parents_post.reverse() append_branch_parent_lines(branch_rev_visible_parents_post) # It has now been calculated which column a line must go into. Now # copy the lines in to computed_revisions. for (child, parent, line_col_index, direct) in lines: parent_color = parent.rev.color line_length = parent.f_index - child.f_index if line_length == 0: # Nothing to do pass elif line_length == 1: child.lines.append((child.col_index, parent.col_index, parent_color, direct)) else: # line from the child's column to the lines column child.lines.append((child.col_index, line_col_index, parent_color, direct)) # lines down the line's column for line_part_f_index in range(child.f_index + 1, parent.f_index - 1): computed.filtered_revs[line_part_f_index].lines.append((line_col_index, line_col_index, parent_color, direct)) # line from the line's column to the parent's column computed.filtered_revs[parent.f_index - 1].lines.append((line_col_index, parent.col_index, parent_color, direct)) return computed def get_revid_branch_info(self, revid): """This returns a branch info whos branch contains the revision. If the revision exists more than one branch, it will only return the first branch info. """ 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): return self.get_revid_branch_info(revid).branch def get_revid_repo(self, revid): return self.get_revid_branch_info(revid).branch.repository def get_repo_revids(self, revids): """Returns list of tuple of (repo, revids)""" repo_revids = {} for repo in self.repos: repo_revids[repo.base] = [] for local_repo_copy in self.local_repo_copies: for revid in self.repos[local_repo_copy].has_revisions(revids): revids.remove(revid) repo_revids[local_repo_copy].append(revid) for revid in revids: 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] def load_revisions(self, revids): return_revisions = {} for repo, revids in self.get_repo_revids(revids): if revids: with repo.lock_read(): self.update_ui() for rev in repo.get_revisions(revids): return_revisions[rev.revision_id] = rev return return_revisions def repo_is_local(repo): return isinstance(repo.controldir.transport, LocalTransport) def group_overlapping(groups): """ Groups items with overlapping ranges together. :param groups: List of uncollapsed groups. :param group: (start of range, end of range, items in group) :return: List of collapsed groups. """ has_change = True while has_change: has_change = False a = 0 while a < len(groups): inner_has_change = False items_a, start_a, end_a, group_key_a = groups[a] if group_key_a is not None: b = a + 1 while b < len(groups): items_b, start_b, end_b, group_key_b = groups[b] if group_key_a == group_key_b and range_overlaps(start_a, end_a, start_b, end_b): # overlaps. Merge b into a items_a.extend(items_b) start_a = min(start_a, start_b) end_a = max(end_a, end_b) del groups[b] has_change = True inner_has_change = True else: b += 1 if inner_has_change: groups[a] = (items_a, start_a, end_a, group_key_a) a += 1 return groups def range_overlaps(start_a, end_a, start_b, end_b): """Tests if two ranges overlap.""" return start_b < start_a < end_b or start_b < end_a < end_b or (start_a <= start_b and end_a >= end_b) class PendingMergesGraphVizLoader(GraphVizLoader): """GraphVizLoader that only loads pending merges. As only the pending merges are passed to merge_sort, the revno are incorrect, and should be ignored. Only works on a single branch. """ def load_graph_parents(self): if not len(self.branches) == 1 or not len(self.repos) == 1: AssertionError("load_graph_pending_merges should only be called when 1 branch and repo has been opened.") bi = self.branches[0] if bi.tree is None: AssertionError("PendingMergesGraphVizLoader must have a working tree.") self.graph = bi.branch.repository.get_graph() tree_heads = bi.tree.get_parent_ids() other_revisions = [tree_heads[0], ] self.update_ui() self.append_head_info('root:', bi, None) pending_merges = [] for head in tree_heads[1:]: self.append_head_info(head, bi, None) pending_merges.extend(self.graph.find_unique_ancestors(head, other_revisions)) other_revisions.append(head) self.update_ui() graph_parents = self.graph.get_parent_map(pending_merges) graph_parents["root:"] = () self.update_ui() for (revid, parents) in list(graph_parents.items()): new_parents = [] for index, parent in enumerate(parents): if parent in graph_parents: new_parents.append(parent) elif index == 0: new_parents.append("root:") graph_parents[revid] = tuple(new_parents) return ["root:", ] + tree_heads[1:], list(graph_parents.items()) class WithWorkingTreeGraphVizLoader(GraphVizLoader): """ GraphVizLoader that shows uncommitted working tree changes as a node in the graph, as if it was already committed. """ def tree_revid(self, tree): return CURRENT_REVISION + tree.basedir.encode('utf-8') def load(self): self.working_trees = {} for bi in self.branches: if bi.tree is not None: self.working_trees[self.tree_revid(bi.tree)] = bi.tree super(WithWorkingTreeGraphVizLoader, self).load() def load_branch_heads(self, bi): # returns load_heads, sort_heads and also calls append_head_info. # # == For branch with tree == # Graph | load_heads | sort_heads | append_head_info # wt | No | Yes | Yes # | \ | | | # | 1.1.2 pending merge | Yes | No | Yes # 2 | basis rev | Yes | No | Yes # # == For branch with tree not up to date == # Graph | load_heads | sort_heads | append_head_info # wt | No | Yes | Yes # | \ | | | # | 1.1.2 pending merge | Yes | No | Yes # 3/ | branch tip | Yes | Yes | Yes # 2 | basis rev | Yes | No | No # # == For branch without tree == # branch tip | Yes | head | yes load_heads = [] sort_heads = [] extra_parents = [] if len(self.branches) > 0: label = bi.label else: label = None branch_last_revision = bi.branch.last_revision() self.append_head_info(branch_last_revision, bi, bi.label) load_heads.append(branch_last_revision) self.update_ui() if bi.tree: wt_revid = self.tree_revid(bi.tree) if label: wt_label = "%s - Working Tree" % label else: wt_label = "Working Tree" self.append_head_info(wt_revid, bi, wt_label) parent_ids = bi.tree.get_parent_ids() extra_parents.append((wt_revid, parent_ids)) load_heads.extend(parent_ids) if parent_ids: # first parent is last revision of the tree if parent_ids[0] != branch_last_revision: # tree is not up to date. sort_heads.append(branch_last_revision) # other parents are pending merges for revid in parent_ids[1:]: if label: pm_label = "%s - Pending Merge" % label else: pm_label = "Pending Merge" self.append_head_info(revid, bi, pm_label) sort_heads.append(wt_revid) self.update_ui() else: sort_heads.append(branch_last_revision) return load_heads, sort_heads, extra_parents class GraphVizFilterState(object): """ Records the state of which branch lines are expanded, and what filters are applied. """ def __init__(self, graph_viz, filter_changed_callback=None): self.graph_viz = graph_viz self.filter_changed_callback = filter_changed_callback self.branch_line_state = {} "If a branch_id is in this dict, it is visible. The value of the dict " "indicates which branches expanded this branch." for revid in self.graph_viz.revid_head_info: rev = self.graph_viz.revid_rev[revid] self.branch_line_state[rev.branch_id] = None self.filters = [] # This keeps a cache of the filter state so that when one of the # filters notifies us of a change, we can check if anything did change. self.filter_cache = [None for rev in self.graph_viz.revisions] def get_filtered_revisions(self): if self.graph_viz.no_graph: rev_whos_branch_is_visible = self.graph_viz.revisions else: rev_whos_branch_is_visible = [] for branch_id in self.branch_line_state.keys(): try: branch_line = self.graph_viz.branch_lines[branch_id] except KeyError: continue rev_whos_branch_is_visible.extend(branch_line.revs) rev_whos_branch_is_visible.sort(key=lambda rev: rev.index) visible = self.get_revision_visible_if_branch_visible return (rev for rev in rev_whos_branch_is_visible if visible(rev)) def get_revision_visible_if_branch_visible(self, rev): rev_filter_cache = self.filter_cache[rev.index] if rev_filter_cache is None: rev_filter_cache = self._get_revision_visible_if_branch_visible(rev) self.filter_cache[rev.index] = rev_filter_cache return rev_filter_cache def _get_revision_visible_if_branch_visible(self, rev): filters_value = True for filter in self.filters: if not filter.get_revision_visible(rev): filters_value = False break if filters_value: return True if not self.graph_viz.no_graph: for merged_index in rev.merges: merged_rev = self.graph_viz.revisions[merged_index] if self.get_revision_visible_if_branch_visible(merged_rev): return True return False def filter_changed(self, revs=None, last_call=True): if revs is None: self.filter_cache = [None for rev in self.graph_viz.revisions] if self.filter_changed_callback: self.filter_changed_callback() else: pending_revs = revs processed_revs = set() prev_cached_revs = [] while pending_revs: rev = pending_revs.pop(0) if rev in processed_revs: continue processed_revs.add(rev) rev_filter_cache = self.filter_cache[rev.index] if rev_filter_cache is not None: prev_cached_revs.append((rev, rev_filter_cache)) self.filter_cache[rev.index] = None if not self.graph_viz.no_graph: if rev.merged_by is not None: pending_revs.append(self.graph_viz.revisions[rev.merged_by]) # Check if any visibilities have changes. If they have, call # filter_changed_callback for rev, prev_visible in prev_cached_revs: visible = self.get_revision_visible_if_branch_visible(rev) if visible != prev_visible: if self.filter_changed_callback: self.filter_changed_callback() break def ensure_rev_visible(self, rev): if self.graph_viz.no_graph: return False branch_id = rev.branch_id if branch_id not in self.branch_line_state: self.branch_line_state[branch_id] = None if self.filter_changed_callback: self.filter_changed_callback() return True return False def collapse_expand_rev(self, c_rev): if c_rev is None: return False visible = not c_rev.twisty_state branch_ids = list(zip( c_rev.twisty_expands_branch_ids, [c_rev.rev.branch_id] * len(c_rev.twisty_expands_branch_ids))) seen_branch_ids = set(branch_id for branch_id, expanded_by in branch_ids) has_change = False while branch_ids: branch_id, expanded_by = branch_ids.pop() if (branch_id in self.branch_line_state) != visible: has_change = True if not visible: del self.branch_line_state[branch_id] parents = self.graph_viz.branch_lines[branch_id].merges for parent_branch_id in parents: parent_visible = parent_branch_id in self.branch_line_state if not parent_visible or parent_branch_id in seen_branch_ids: continue if self.branch_line_state[parent_branch_id] == branch_id: # This branch expanded the parent branch, so we must # collapse it. branch_ids.append((parent_branch_id, branch_id)) seen_branch_ids.add(parent_branch_id) else: # Check if this parent has any other visible branches # that merge it. has_visible = False parent = self.graph_viz.branch_lines[parent_branch_id] for merged_by_branch_id in parent.merged_by: if merged_by_branch_id in self.branch_line_state: has_visible = True break if not has_visible: branch_ids.append((parent_branch_id, branch_id)) seen_branch_ids.add(parent_branch_id) else: self.branch_line_state[branch_id] = expanded_by if has_change and self.filter_changed_callback: self.filter_changed_callback() def expand_all_branch_lines(self): for branch_id in list(self.graph_viz.branch_lines.keys()): if branch_id not in self.branch_line_state: self.branch_line_state[branch_id] = None class FileIdFilter (object): """ Filter that only shows revisions that modify one of the specified files. """ def __init__(self, graph_viz, filter_changed_callback, file_ids): self.graph_viz = graph_viz self.filter_changed_callback = filter_changed_callback self.file_ids = file_ids self.has_dir = False self.filter_file_id = [False for rev in self.graph_viz.revisions] # don't filter working tree nodes if isinstance(self.graph_viz, WithWorkingTreeGraphVizLoader): for wt_revid in self.graph_viz.working_trees.keys(): try: rev_index = self.graph_viz.revid_rev[wt_revid].index self.filter_file_id[rev_index] = True except KeyError: pass def uses_inventory(self): return self.has_dir def load(self, revids=None): """Load which revisions affect the file_ids""" if self.file_ids: self.graph_viz.throbber_show() for bi in self.graph_viz.branches: tree = bi.tree if tree is None: tree = bi.branch.basis_tree() with tree.lock_read(): for file_id in self.file_ids: if tree.kind(tree.id2path(file_id)) in ('directory', 'tree-reference'): self.has_dir = True break if self.has_dir: break if revids is None: revids = [rev.revid for rev in self.graph_viz.revisions] revids = [revid for revid in revids if not revid.startswith(CURRENT_REVISION)] for repo, revids in self.graph_viz.get_repo_revids(revids): if self.uses_inventory(): chunk_size = 200 else: chunk_size = 500 for start in range(0, len(revids), chunk_size): self.load_filter_file_id_chunk(repo, revids[start:start + chunk_size]) self.load_filter_file_id_chunk_finished() def load_filter_file_id_chunk(self, repo, revids): graph = repo.get_file_graph() def check_text_keys(text_keys): changed_revs = [] for file_id, revid in graph.get_parent_map(text_keys): rev = self.graph_viz.revid_rev[revid] self.filter_file_id[rev.index] = True changed_revs.append(rev) self.graph_viz.update_ui() self.filter_changed_callback(changed_revs, False) self.graph_viz.update_ui() with repo.lock_read(): if not self.uses_inventory(): text_keys = [(file_id, revid) for revid in revids for file_id in self.file_ids] check_text_keys(text_keys) else: text_keys = [] # We have to load the inventory for each revisions, to find # the children of any directories. for inv, revid in zip(repo.iter_inventories(revids), revids): entries = inv.iter_entries_by_dir(specific_file_ids=self.file_ids) for path, entry in entries: text_keys.append((entry.file_id, revid)) if entry.kind == "directory": sub_entries = inv.iter_entries(from_dir=entry) for rc_path, rc_entry in sub_entries: text_keys.append((rc_entry.file_id, revid)) self.graph_viz.update_ui() check_text_keys(text_keys) def load_filter_file_id_chunk_finished(self): self.filter_changed_callback([], True) self.graph_viz.throbber_hide() def get_revision_visible(self, rev): return self.filter_file_id[rev.index] class WorkingTreeHasChangeFilter(object): """ Filter out working trees that don't have any changes. """ def __init__(self, graph_viz, filter_changed_callback, file_ids): self.graph_viz = graph_viz self.file_ids = file_ids if not isinstance(graph_viz, WithWorkingTreeGraphVizLoader): raise TypeError('graph_viz expected to be a WithWorkingTreeGraphVizLoader') self.filter_changed_callback = filter_changed_callback self.tree_revids_with_changes = set() def load(self): """Load if the working trees have changes.""" self.tree_revids_with_changes = set() self.graph_viz.throbber_show() try: for wt_revid, tree in self.graph_viz.working_trees.items(): if self.has_changes(tree): self.tree_revids_with_changes.add(wt_revid) rev = self.graph_viz.revid_rev[wt_revid] self.filter_changed_callback([rev], False) self.filter_changed_callback([], True) finally: self.graph_viz.throbber_hide() def has_changes(self, tree): """Quickly check that the tree contains at least one commitable change. :param _from_tree: tree to compare against to find changes (default to the basis tree and is intended to be used by tests). :return: True if a change is found. False otherwise """ with tree.lock_read(): # Copied from mutabletree, cause we need file_ids too. # Check pending merges if len(tree.get_parent_ids()) > 1: return True from_tree = tree.basis_tree() specific_files = None if self.file_ids: specific_files = [tree.id2path(file_id) for file_id in self.file_ids] changes = tree.iter_changes(from_tree, specific_files=specific_files) try: change = next(changes) # Exclude root (talk about black magic... --vila 20090629) if change.name == (None, None): change = next(changes) return True except StopIteration: # No changes return False def get_revision_visible(self, rev): if rev.revid.startswith(CURRENT_REVISION): return rev.revid in self.tree_revids_with_changes else: return True class ComputedRevisionData(object): """Container for computed layout data for a revision. :ivar rev: Reference to RevisionData. Use to get revno, revid, color and others. :ivar f_index: Index in `ComputedGraphViz.filtered_revs`. :ivar col_index: Column index to place node for revision in. :ivar lines: Lines that need to be drawn from from this revision's line to the next revision's line. Note that not all these lines relate to this revision, but be a part of a longer line that is passing this revision. Each line is a tuple of `(end col_index, start col_index, color, direct)`. If direct is False, it indicates that this line represents an ancestry, with revisions that are filtered. This should be shown as a dotted line. :ivar branch_labels: Labels for branch tips. :ivar twisty_state: State of the revision: * None: No twisty. * True: There are branch lines that this revision merges that can expanded. Show a '+'. * False: All branches that this revision merges are already expanded. Show a '-'. :ivar twisty_expands_branch_ids: Branch lines that will be expanded if the twisty is clicked. """ # Instance of this object are typically named "c_rev". __slots__ = ['rev', 'f_index', 'lines', 'col_index', 'branch_labels', 'twisty_state', 'twisty_expands_branch_ids'] def __init__(self, rev): self.rev = rev self.lines = [] self.col_index = None self.twisty_state = None self.twisty_expands_branch_ids = [] self.branch_labels = [] class ComputedGraphViz(object): """Computed layout data for a graph. :ivar graph_viz: Reference to parent `GraphVizLoader`. :ivar filtered_revs: List `ComputedRevisionData`. Only visible revisions are included. :ivar revisions: List `ComputedRevisionData`. Revision that are not visible are None. """ def __init__(self, graph_viz): self.graph_viz = graph_viz self.filtered_revs = [] self.revisions = [None] * len(graph_viz.revisions) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/logmodel.py0000644000000000000000000004545114556556456013575 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2006-2007 Gary van der Merwe # # 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 PyQt5 import QtCore, QtGui from time import (strftime, localtime) import time import re import fnmatch from breezy.revision import Revision from breezy.plugins.qbrz.lib.bugs import get_bug_id from breezy.plugins.qbrz.lib import loggraphviz from breezy.plugins.qbrz.lib.lazycachedrevloader import (load_revisions, cached_revisions) from breezy.plugins.qbrz.lib.revtreeview import RevIdRole as im_RevIdRole from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.util import ( extract_name, get_apparent_author, runs_in_loading_queue, ) RevIdRole = im_RevIdRole GraphDataRole = QtCore.Qt.UserRole + 2 header_labels = (gettext("Rev"), gettext("Message"), gettext("Date"), gettext("Author"), ) COL_REV = 0 COL_MESSAGE = 1 COL_DATE = 2 COL_AUTHOR = 3 class WorkingTreeRevision(Revision): def __init__(self, revid, tree): super(WorkingTreeRevision, self).__init__(revid) self.parent_ids = tree.get_parent_ids() self.committer = tree.branch.get_config().username() self.message = "" # todo: try load saved commit message self.timestamp = None self.tree = tree class GraphVizLoader(loggraphviz.GraphVizLoader): def __init__(self, branches, primary_bi, no_graph, processEvents, throbber): self.processEvents = processEvents self.throbber = throbber loggraphviz.GraphVizLoader.__init__(self, branches, primary_bi, no_graph) def update_ui(self): self.processEvents() def throbber_show(self): self.throbber.show() def throbber_hide(self): self.throbber.hide() def revisions_filter_changed(self): self.on_filter_changed() def load_revisions(self, revids): return load_revisions(revids, self.get_repo_revids) class PendingMergesGraphVizLoader( loggraphviz.PendingMergesGraphVizLoader, GraphVizLoader): pass class WithWorkingTreeGraphVizLoader(loggraphviz.WithWorkingTreeGraphVizLoader, GraphVizLoader): def load(self): super(WithWorkingTreeGraphVizLoader, self).load() for wt_revid, tree in self.working_trees.items(): # bla - nasty hack. cached_revisions[wt_revid] = WorkingTreeRevision(wt_revid, tree) class FileIdFilter(loggraphviz.FileIdFilter): @runs_in_loading_queue def load(self, revids=None): super(FileIdFilter, self).load(revids) class WorkingTreeHasChangeFilter(loggraphviz.WorkingTreeHasChangeFilter): @runs_in_loading_queue def load(self): super(WorkingTreeHasChangeFilter, self).load() class FilterScheduler(object): def __init__(self, filter_changed_callback): self.pending_revs = [] self.last_run_time = 0 self.last_call_time = 0 self.filter_changed_callback = filter_changed_callback def filter_changed(self, revs, last_call=True): if revs is None: self.pending_revs = None else: self.pending_revs.extend(revs) # Only notify that there are changes every so often. # GraphVizFilterState.filter_changed invaladates it's cache, and # causes compute_viz to run, and it runs slowly because it has # to update the filter cache. How often we update is bases on a ratio of # 10:1. If we spend 1 sec calling invaladate_filter_cache_revs, don't # call it again until we have spent 10 sec else where. if last_call or revs is None or time.process_time() - self.last_call_time > self.last_run_time * 10: start_time = time.process_time() self.filter_changed_callback(self.pending_revs, last_call) self.pending_revs = [] self.last_run_time = time.process_time() - start_time self.last_call_time = time.process_time() if last_call: self.last_run_time = 0 self.last_call_time = 0 class LogModel(QtCore.QAbstractTableModel): layoutAboutToBeChanged = QtCore.pyqtSignal() layoutChanged = QtCore.pyqtSignal() dataChanged = QtCore.pyqtSignal(QtCore.QModelIndex, QtCore.QModelIndex) def __init__(self, processEvents, throbber, parent=None): QtCore.QAbstractTableModel.__init__(self, parent) self.processEvents = processEvents self.throbber = throbber self.graph_viz = GraphVizLoader((), None, False, processEvents, throbber) self.state = loggraphviz.GraphVizFilterState( self.graph_viz, self.compute_lines) self.computed = loggraphviz.ComputedGraphViz(self.graph_viz) self.clicked_f_index = None self.last_rev_is_placeholder = False self.bugtext = gettext("bug #%s") def load(self, branches, primary_bi, file_ids, no_graph, graph_provider_type): self.throbber.show() self.processEvents() try: graph_viz = graph_provider_type(branches, primary_bi, no_graph, processEvents=self.processEvents, throbber=self.throbber) graph_viz.load() graph_viz.on_filter_changed = self.on_filter_changed state = loggraphviz.GraphVizFilterState(graph_viz, self.compute_lines) # Copy the expanded branches from the old state to the new. for (branch_id, value) in self.state.branch_line_state.items(): if branch_id in graph_viz.branch_lines: state.branch_line_state[branch_id] = value # for branch_id in graph_viz.branch_lines.keys(): # state.branch_line_state[branch_id] = None scheduler = FilterScheduler(state.filter_changed) if file_ids: file_id_filter = FileIdFilter(graph_viz, scheduler.filter_changed, file_ids) state.filters.append(file_id_filter) else: file_id_filter = None if isinstance(graph_viz, WithWorkingTreeGraphVizLoader): working_tree_filter = WorkingTreeHasChangeFilter(graph_viz, scheduler.filter_changed, file_ids) state.filters.append(working_tree_filter) else: working_tree_filter = None prop_search_filter = PropertySearchFilter(graph_viz,scheduler.filter_changed) state.filters.append(prop_search_filter) self.layoutAboutToBeChanged.emit() self.graph_viz = graph_viz self.state = state self.file_ids = file_ids self.file_id_filter = file_id_filter self.working_tree_filter = working_tree_filter self.prop_search_filter = prop_search_filter self.computed = loggraphviz.ComputedGraphViz(graph_viz) self.layoutChanged.emit() self.compute_lines() # Start later so that it does not run in the loading queue. if self.working_tree_filter: QtCore.QTimer.singleShot(1, self.working_tree_filter.load) if self.file_id_filter: QtCore.QTimer.singleShot(1, self.file_id_filter.load) finally: self.throbber.hide() def compute_lines(self): computed = self.graph_viz.compute_viz(self.state) if self.last_rev_is_placeholder: computed.filtered_revs[-1].col_index = None self.layoutAboutToBeChanged.emit() self.computed = computed self.layoutChanged.emit() def collapse_expand_rev(self, c_rev): self.clicked_f_index = c_rev.f_index clicked_row_index = self.createIndex(c_rev.f_index, COL_MESSAGE, QtCore.QModelIndex()) self.dataChanged.emit(clicked_row_index, clicked_row_index) self.graph_viz.update_ui() self.clicked_f_index = None self.state.collapse_expand_rev(c_rev) self.dataChanged.emit(clicked_row_index, clicked_row_index) def ensure_rev_visible(self, rev): self.state.ensure_rev_visible(rev) def columnCount(self, parent): if parent.isValid(): return 0 return len(header_labels) def rowCount(self, parent): if parent.isValid(): return 0 return len(self.computed.filtered_revs) def data(self, index, role): if not index.isValid(): return None def blank(): if role == QtCore.Qt.DisplayRole: return "" return None c_rev = self.computed.filtered_revs[index.row()] if c_rev is None: return blank() if c_rev.rev.revid in cached_revisions: revision = cached_revisions[c_rev.rev.revid] else: revision = None if role == GraphDataRole: prev_c_rev = None prev_c_rev_f_index = c_rev.f_index - 1 if prev_c_rev_f_index >= 0: prev_c_rev = self.computed.filtered_revs[prev_c_rev_f_index] tags = [] # Branch labels tags.extend([(label, QtGui.QColor(24, 80, 200), QtGui.QColor(QtCore.Qt.white)) for (branch_info, label) in c_rev.branch_labels if label]) # Tags if c_rev.rev.revid in self.graph_viz.tags: tags.extend([(tag, QtGui.QColor(80, 128, 32), QtGui.QColor(QtCore.Qt.white)) for tag in self.graph_viz.tags[c_rev.rev.revid]]) # Bugs if revision: if hasattr(revision, '_qlog_bugs'): bugs = revision._qlog_bugs else: bugs = [] for bug in revision.properties.get('bugs', '').split('\n'): if bug: url = bug.split(' ', 1)[0] bug_id = get_bug_id(url) if bug_id: bugs.append(self.bugtext % bug_id) revision._qlog_bugs = bugs tags.extend([ (bug, QtGui.QColor(164, 0, 0), QtGui.QColor(QtCore.Qt.white)) for bug in bugs]) is_clicked = c_rev.f_index == self.clicked_f_index return c_rev, prev_c_rev, tags, is_clicked if role == QtCore.Qt.DisplayRole and index.column() == COL_REV: return c_rev.rev.revno_str if role == QtCore.Qt.ToolTipRole and index.column() == COL_MESSAGE: urls = [branch_info.branch.base for (branch_info, label) in c_rev.branch_labels if label] return '\n'.join(urls) if role == RevIdRole: return c_rev.rev.revid # Everything from here foward will need to have the revision loaded. if revision is None: return blank() if role == QtCore.Qt.DisplayRole and index.column() == COL_DATE: return strftime("%Y-%m-%d %H:%M", localtime(revision.timestamp)) if role == QtCore.Qt.DisplayRole and index.column() == COL_AUTHOR: return extract_name(get_apparent_author(revision)) if role == QtCore.Qt.DisplayRole and index.column() == COL_MESSAGE: return revision.get_summary() return blank() def flags(self, index): if not index.isValid(): return QtCore.Qt.ItemIsEnabled return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable def headerData(self, section, orientation, role): if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole: return header_labels[section] return None def on_revisions_loaded(self, revisions, last_call): for revid in revisions.keys(): rev = self.graph_viz.revid_rev[revid] self.dataChanged.emit(self.index(rev.index, COL_MESSAGE, QtCore.QModelIndex()), self.index(rev.index, COL_AUTHOR, QtCore.QModelIndex())) def on_filter_changed(self): self.compute_lines() def get_repo(self): return self.graph_viz.get_repo_revids def index_from_revid(self, revid, column=0): try: rev = self.graph_viz.revid_rev[revid] except KeyError: return return self.index_from_rev(rev) def index_from_rev(self, rev, column=0): try: c_rev = self.computed.revisions[rev.index] except IndexError: return if c_rev is None: return return self.index_from_c_rev(c_rev, column) def index_from_c_rev(self, c_rev, column=0): return self.index(c_rev.f_index, column, QtCore.QModelIndex()) def c_rev_from_index(self, index): f_index = index.row() try: return self.computed.filtered_revs[f_index] except IndexError: return None class PropertySearchFilter (object): def __init__(self, graph_viz, filter_changed_callback): self.graph_viz = graph_viz self.filter_changed_callback = filter_changed_callback self.field = None self.filter_re = None self.cache = None self.index_matched_revids = None self.loading_revisions = False def set_search(self, s, field): """Set search string for specified kind of data. @param s: string to search (interpreted based on field value) @param field: kind of data to search, based on some field of revision metadata. Possible values: - message - index (require bzr-search plugin) - author - tag - bug Value of `str` interpreted based on field value. For index it's used as input value for bzr-search engine. For message, author, tag and bug it's used as shell pattern (glob pattern) to search in corresponding metadata of revisions. """ self.field = field def revisions_loaded(revisions, last_call): revs = [self.graph_viz.revid_rev[revid] for revid in revisions.keys()] self.filter_changed_callback(revs, last_call) def before_batch_load(repo, revids): if self.filter_re is None: return True return False def wildcard2regex(wildcard): """Translate shel pattern to regexp.""" return fnmatch.translate(wildcard + '*') if s is None or s == "": self.filter_re = None self.index_matched_revids = None self.filter_changed_callback(None, True) else: if self.field == "index": from breezy.plugins.search import index as search_index self.filter_re = None indexes = [bi.index for bi in self.graph_viz.branches if bi.index is not None] if not indexes: self.index_matched_revids = None else: s = s.strip() query = [(query_item,) for query_item in s.split(" ")] self.index_matched_revids = {} for index in indexes: for result in index.search(query): if isinstance(result, search_index.RevisionHit): self.index_matched_revids[result.revision_key[0]] = True if isinstance(result, search_index.FileTextHit): self.index_matched_revids[result.text_key[1]] = True if isinstance(result, search_index.PathHit): pass elif self.field == "tag": self.filter_re = None filter_re = re.compile(wildcard2regex(s), re.IGNORECASE) self.index_matched_revids = {} for revid in self.graph_viz.tags: for t in self.graph_viz.tags[revid]: if filter_re.search(t): self.index_matched_revids[revid] = True break else: self.filter_re = re.compile(wildcard2regex(s), re.IGNORECASE) self.index_matched_revids = None self.filter_changed_callback(None, True) if self.filter_re is not None and not self.loading_revisions: self.loading_revisions = True try: revids = [rev.revid for rev in self.graph_viz.revisions ] load_revisions(revids, self.graph_viz.get_repo_revids, time_before_first_ui_update = 0, local_batch_size = 100, remote_batch_size = 10, before_batch_load = before_batch_load, revisions_loaded = revisions_loaded) finally: self.loading_revisions = False def get_revision_visible(self, rev): if self.filter_re: revid = rev.revid if revid not in cached_revisions: return False revision = cached_revisions[revid] filtered_str = None if self.field == "message": filtered_str = revision.message elif self.field == "author": filtered_str = get_apparent_author(revision) elif self.field == "bug": rbugs = revision.properties.get('bugs', '') if rbugs: filtered_str = rbugs.replace('\n', ' ') else: return False if filtered_str is not None: if self.filter_re.search(filtered_str) is None: return False if self.index_matched_revids is not None: revid = rev.revid if revid not in self.index_matched_revids: return False return True ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/logwidget.py0000644000000000000000000010430314556556456013750 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2006-2007 Gary van der Merwe # # 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 PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.revtreeview import (RevisionTreeView, RevNoItemDelegate, get_text_color) from breezy.revision import NULL_REVISION, CURRENT_REVISION from breezy.plugins.qbrz.lib.util import ( runs_in_loading_queue, ) from breezy.plugins.qbrz.lib.trace import reports_exception, SUB_LOAD_METHOD from breezy.plugins.qbrz.lib.uifactory import ui_current_widget from breezy.controldir import ControlDir from breezy.revisionspec import RevisionSpec from breezy.plugins.qbrz.lib.tag import TagWindow, CallBackTagWindow from breezy.plugins.qbrz.lib import logmodel from breezy.plugins.qbrz.lib import diff from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.subprocess import SimpleSubProcessDialog class LogList(RevisionTreeView): """TreeView widget to show log with metadata and graph of revisions.""" def __init__(self, processEvents, throbber, parent=None, view_commands=True, action_commands=False): """Costructing new widget. @param throbber: throbber widget in parent window @param parent: parent window """ RevisionTreeView.__init__(self, parent) self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.setSelectionMode(QtWidgets.QAbstractItemView.ContiguousSelection) self.setUniformRowHeights(True) self.setAllColumnsShowFocus(True) self.setRootIsDecorated(False) self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) self.setItemDelegateForColumn(logmodel.COL_MESSAGE, GraphTagsBugsItemDelegate(self)) self.rev_no_item_delegate = RevNoItemDelegate(parent=self) self.setItemDelegateForColumn(logmodel.COL_REV, self.rev_no_item_delegate) self.log_model = logmodel.LogModel(processEvents, throbber, self) self.lines_updated_selection = [] self.lines_updated_selection_current = None self.setModel(self.log_model) self.log_model.layoutAboutToBeChanged.connect(self.lines_updated_remember_selection) self.log_model.layoutChanged.connect(self.lines_updated_restore_selection) header = self.header() header.setStretchLastSection(False) # RJLRJL: for PyQt5, use setSectionResizeMode header.setSectionResizeMode(logmodel.COL_REV, QtWidgets.QHeaderView.Interactive) header.setSectionResizeMode(logmodel.COL_MESSAGE, QtWidgets.QHeaderView.Stretch) header.setSectionResizeMode(logmodel.COL_DATE, QtWidgets.QHeaderView.Interactive) header.setSectionResizeMode(logmodel.COL_AUTHOR, QtWidgets.QHeaderView.Interactive) fm = self.fontMetrics() col_margin = (self.style().pixelMetric(QtWidgets.QStyle.PM_FocusFrameHMargin, None, self) + 1) *2 header.resizeSection(logmodel.COL_REV, fm.width("8888.8.888") + col_margin) # [bialix 2013/07/11] v I've added a space to sample string below to workaround bug https://bugs.launchpad.net/qbrz/+bug/430502 # v If this is a problem on non-Windows platforms - please let me know and I'll add a platform check header.resizeSection(logmodel.COL_DATE, fm.width("88-88-8888 88:88 ") + col_margin) header.resizeSection(logmodel.COL_AUTHOR, fm.width("Joe I have a Long Name") + col_margin) self.view_commands = view_commands self.action_commands = action_commands if self.view_commands: self.doubleClicked[QtCore.QModelIndex].connect(self.default_action) self.context_menu = QtWidgets.QMenu(self) self.context_menu_initialized = False def load(self, *args, **kargs): self.load_args = (args, kargs) self.log_model.load(*args, **kargs) self.create_context_menu() self._adjust_revno_column() @runs_in_loading_queue @ui_current_widget def refresh(self, b=True): (args, kargs) = self.load_args self.load(*args, **kargs) def create_context_menu(self, diff_is_default_action=True): if self.context_menu_initialized: return self.context_menu_initialized = True branch_count = len(self.log_model.graph_viz.branches) has_file_filter = bool(self.log_model.file_id_filter) self.context_menu = QtWidgets.QMenu(self) self.customContextMenuRequested[QtCore.QPoint].connect(self.show_context_menu) if self.view_commands: if has_file_filter: if diff.has_ext_diff(): diff_menu = diff.ExtDiffMenu(self, set_default=diff_is_default_action) diff_menu.setTitle(gettext("Show file &differences")) self.context_menu.addMenu(diff_menu) diff_menu.triggered['QString'].connect(self.show_diff_specified_files_ext) all_diff_menu = diff.ExtDiffMenu(self, set_default=False) all_diff_menu.setTitle(gettext("Show all &differences")) self.context_menu.addMenu(all_diff_menu) all_diff_menu.triggered['QString'].connect(self.show_diff_ext) else: show_diff_action = self.context_menu.addAction(gettext("Show file &differences..."), self.show_diff_specified_files) 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, set_default=diff_is_default_action) self.context_menu.addMenu(diff_menu) diff_menu._triggered.connect(self.show_diff_ext) else: show_diff_action = self.context_menu.addAction(gettext("Show &differences..."), self.show_diff) if diff_is_default_action: self.context_menu.setDefaultAction(show_diff_action) 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.log_model.graph_viz.branches[0].tree is None) else: menu = BranchMenu(text, self, self.log_model.graph_viz, require_wt) menu.bm_triggered.connect(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_reverse_cherry_pick = add_branch_action(gettext("Re&verse Cherry pick"), self.reverse_cherry_pick, require_wt=True) def _adjust_revno_column(self): # update the data max_mainline_digits = self.rev_no_item_delegate.set_max_revno( self.log_model.graph_viz.max_mainline_revno) # resize the column header = self.header() fm = self.fontMetrics() col_margin = (self.style().pixelMetric(QtWidgets.QStyle.PM_FocusFrameHMargin, None, self) + 1) *2 header.resizeSection(logmodel.COL_REV, fm.width(("8" * max_mainline_digits)+".8.888") + col_margin) def refresh_tags(self): self.log_model.graph_viz.lock_read_branches() try: self.log_model.graph_viz.load_tags() finally: self.log_model.graph_viz.unlock_branches() def get_c_rev_under_twisty_pos(self, pos): index = self.indexAt(pos) rect = self.visualRect(index) boxsize = rect.height() c_rev = self.log_model.c_rev_from_index(index) if c_rev and c_rev.twisty_state is not None: twistyRect = QtCore.QRect(rect.x() + boxsize * c_rev.col_index, rect.y(), boxsize, boxsize) if twistyRect.contains(pos): return c_rev def mousePressEvent(self, e): collapse_expand_click = False if e.button() & QtCore.Qt.LeftButton: c_rev = self.get_c_rev_under_twisty_pos(e.pos()) if c_rev: collapse_expand_click = True self.log_model.collapse_expand_rev(c_rev) new_index = self.log_model.index_from_rev(c_rev.rev) if new_index: self.scrollTo(new_index) e.accept() if not collapse_expand_click: QtWidgets.QTreeView.mousePressEvent(self, e) def mouseMoveEvent(self, e): # This prevents the selection from changing when the mouse is over # a twisty. if not self.get_c_rev_under_twisty_pos(e.pos()): QtWidgets.QTreeView.mouseMoveEvent(self, e) def keyPressEvent(self, e): e_key = e.key() if e_key in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return) and self.view_commands: e.accept() self.default_action() elif e_key in (QtCore.Qt.Key_Left, QtCore.Qt.Key_Right): e.accept() indexes = self.get_selection_indexes() if not indexes: return c_rev = self.log_model.c_rev_from_index(indexes[0]) if (e.key() == QtCore.Qt.Key_Right and c_rev and not c_rev.twisty_state): self.log_model.collapse_expand_rev(c_rev) if e.key() == QtCore.Qt.Key_Left: if c_rev and c_rev.twisty_state: self.log_model.collapse_expand_rev(c_rev) else: # Find the revision the merges us. if c_rev.rev.merged_by: merged_by = self.log_model.computed.revisions[ c_rev.rev.merged_by] self.setCurrentIndex(self.log_model.index_from_c_rev(merged_by)) self.scrollTo(self.currentIndex()) else: QtWidgets.QTreeView.keyPressEvent(self, e) def select_revid(self, revid): try: rev = self.log_model.graph_viz.revid_rev[revid] except KeyError: return self.log_model.ensure_rev_visible(rev) index = self.log_model.index_from_rev(rev) if index: self.setCurrentIndex(index) # Remember the selection across layout changes. # This use to be handeled by the fact that we use to use a proxy model to # do filtering, but even that did not work 100%. I trided doing this by # updating the models QPersistentModelIndex, but there is a bug with # that in qt that not all columns are remembered. def lines_updated_remember_selection(self): selection_model = self.selectionModel() rows = selection_model.selectedRows() expand_indexes_to_ids = \ lambda l: [str(i.data(logmodel.RevIdRole)) for i in l] # Note: we don't do anything is there are 0 selected rows if rows: self.lines_updated_selection = \ expand_indexes_to_ids((rows[0], rows[-1])) current_index = self.currentIndex() if current_index.isValid(): self.lines_updated_selection_current = \ str(current_index.data(logmodel.RevIdRole)) else: self.lines_updated_selection_current = None def lines_updated_restore_selection(self): selection_model = self.selectionModel() indexes = [self.log_model.index_from_revid(revid) for revid in self.lines_updated_selection] selection_model.clear() if self.lines_updated_selection_current: current_index = self.log_model.index_from_revid( self.lines_updated_selection_current) if current_index: self.setCurrentIndex(current_index) if not len(indexes) == 0 and indexes[0]: if not indexes[1]: indexes[1] = indexes[0] selection = QtCore.QItemSelection(*indexes) selection_model.select(selection, (QtCore.QItemSelectionModel.SelectCurrent | QtCore.QItemSelectionModel.Rows)) def get_selection_indexes(self, index=None): if index is None: return sorted(self.selectionModel().selectedRows(0), key=lambda x: x.row()) else: return [index] def get_selection_and_merged_revids(self, index=None): indexes = self.get_selection_indexes(index) revids = set() for index in indexes: revid = index.data(logmodel.RevIdRole) revids.add(revid) merges = [self.log_model.graph_viz.revisions[rev_index].revid for rev_index in self.log_model.graph_viz.revid_rev[revid].merges] revids.update(set(merges)) return revids def get_selection_top_and_parent_revids_and_count(self, index=None): indexes = self.get_selection_indexes(index) if len(indexes) == 0: return (None, None), 0 top_revid = indexes[0].data(logmodel.RevIdRole) bot_revid = indexes[-1].data(logmodel.RevIdRole) parents = self.log_model.graph_viz.known_graph.get_parent_keys(bot_revid) if parents: # We need a ui to select which parent. parent_revid = parents[0] # This is ugly. It is for the PendingMergesList in commit/revert. if parent_revid == "root:": parent_revid = self.log_model.graph_viz.graph.get_parent_map([bot_revid])[bot_revid][0] else: parent_revid = NULL_REVISION return (top_revid, parent_revid), len(indexes) def set_search(self, str, field): self.log_model.prop_search_filter.set_search(str, field) def default_action(self, index=None): self.show_diff_specified_files() def tag_revision(self, selected_branch_info=None): gv = self.log_model.graph_viz if selected_branch_info: selected_branch_info = selected_branch_info else: assert(len(gv.branches)==1) selected_branch_info = gv.branches[0] revid = self.currentIndex().data(logmodel.RevIdRole) revno = gv.revid_rev[revid].revno_str revs = [RevisionSpec.from_string(revno)] 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): gv = self.log_model.graph_viz (top_revid, old_revid), rev_count = \ self.get_selection_top_and_parent_revids_and_count() top_revno_str = gv.revid_rev[top_revid].revno_str if old_revid==NULL_REVISION: old_revno_str = 0 else: old_revno_str = gv.revid_rev[old_revid].revno_str if selected_branch_info: single_branch = False else: assert(len(gv.branches)==1) selected_branch_info = gv.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: dialog.subprocessFinished[bool].connect(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.log_model.graph_viz.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): (new_revid, old_revid), count = \ self.get_selection_top_and_parent_revids_and_count(index) if new_revid is None and old_revid is None: # No revision selection. return new_branch = self.log_model.graph_viz.get_revid_branch(new_revid) old_branch = self.log_model.graph_viz.get_revid_branch(old_revid) def get_tree_if_current(revid): if (revid.startswith(CURRENT_REVISION) and isinstance(self.log_model.graph_viz, logmodel.WithWorkingTreeGraphVizLoader)): return self.log_model.graph_viz.working_trees[revid] arg_provider = diff.InternalDiffArgProvider( old_revid, new_revid, old_branch, new_branch, old_tree=get_tree_if_current(old_revid), new_tree=get_tree_if_current(new_revid), specific_files = specific_files, specific_file_ids = specific_file_ids) diff.show_diff(arg_provider, ext_diff=ext_diff, parent_window=self.window(), context=self.diff_context) def show_diff_specified_files(self, ext_diff=None): if self.log_model.file_id_filter: self.show_diff( ext_diff=ext_diff, specific_file_ids = self.log_model.file_id_filter.file_ids) else: self.show_diff(ext_diff=ext_diff) def show_diff_ext(self, ext_diff): self.show_diff(ext_diff=ext_diff) def show_diff_specified_files_ext(self, ext_diff=None): self.show_diff_specified_files(ext_diff=ext_diff) def show_revision_tree(self): from breezy.plugins.qbrz.lib.browse import BrowseWindow revid = self.currentIndex().data(logmodel.RevIdRole) gv = self.log_model.graph_viz if revid.startswith(CURRENT_REVISION): location = gv.working_trees[revid].abspath('') window = BrowseWindow(location=location, parent=self) else: revno = gv.revid_rev[revid].revno_str branch = gv.get_revid_branch(revid) window = BrowseWindow(branch=branch, revision_id=revid, revision_spec=revno, parent=self) window.show() self.window().windows.append(window) def show_context_menu(self, pos): branch_count = len(self.log_model.graph_viz.branches) (top_revid, old_revid), count = \ self.get_selection_top_and_parent_revids_and_count() wt_selected = top_revid.startswith(CURRENT_REVISION) def filter_rev_ancestor(action, is_ancestor=True): branch_menu = action.menu() if branch_menu: vis_branch_count = branch_menu.filter_rev_ancestor( top_revid, is_ancestor) 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 and not wt_selected) if count == 1: filter_rev_ancestor(self.context_menu_tag) self.context_menu_revert.setVisible(count == 1 and not wt_selected) self.context_menu_update.setVisible(count == 1 and not wt_selected) if branch_count > 1: if wt_selected: self.context_menu_cherry_pick.setVisible(False) else: filter_rev_ancestor(self.context_menu_cherry_pick, is_ancestor=False) if wt_selected: self.context_menu_reverse_cherry_pick.setVisible(False) else: filter_rev_ancestor(self.context_menu_reverse_cherry_pick) self.context_menu.popup(self.viewport().mapToGlobal(pos)) class BranchMenu(QtWidgets.QMenu): bm_triggered = QtCore.pyqtSignal() def __init__(self, text, parent, graphprovider, require_wt): QtWidgets.QMenu.__init__(self, text, parent) self.graphprovider = graphprovider for branch in self.graphprovider.branches: action = QtWidgets.QAction(branch.label, self) action.setData(branch) self.addAction(action) if require_wt and branch.tree is None: action.setDisabled(True) self.triggered[QAction].connect(self.triggered) def filter_rev_ancestor(self, rev, is_ancestor=True): visible_action_count = 0 for action in self.actions(): branch_info = action.data() branch_tip = branch_info.branch.last_revision() is_ancestor_ = ( frozenset((branch_tip,)) == self.graphprovider.known_graph.heads((branch_tip, rev))) visible = is_ancestor_ == is_ancestor action.setVisible(visible) if visible: visible_action_count += 1 return visible_action_count def triggered(self, action): branch_info = action.data() self.bm_triggered.emit(branch_info) class GraphTagsBugsItemDelegate(QtWidgets.QStyledItemDelegate): _twistyColor = QtCore.Qt.black def paint(self, painter, option, index): if index.isValid(): draw_graph = True data = index.data(logmodel.GraphDataRole) c_rev, prev_c_rev, labels, is_clicked = data else: draw_graph = False option = QtWidgets.QStyleOptionViewItem(option) self.initStyleOption(option, index) widget = self.parent() style = widget.style() text_margin = style.pixelMetric(QtWidgets.QStyle.PM_FocusFrameHMargin, None, widget) + 1 painter.save() painter.setClipRect(option.rect) style.drawPrimitive(QtWidgets.QStyle.PE_PanelItemViewItem, option, painter, widget) graphCols = 0 rect = option.rect if draw_graph: painter.save() try: painter.setRenderHint(QtGui.QPainter.Antialiasing) boxsize = float(rect.height()) dotsize = 0.7 pen = QtGui.QPen() penwidth = 1 pen.setWidth(penwidth) pen.setCapStyle(QtCore.Qt.FlatCap) # 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 if prev_c_rev: for start, end, color, direct in prev_c_rev.lines: self.drawLine(painter, pen, rect, boxsize, rect.y(), boxsize, start, end, color, direct) graphCols = max((graphCols, min(start, end))) # Draw lines out of the cell if c_rev: for start, end, color, direct in c_rev.lines: self.drawLine(painter, pen, rect,boxsize, rect.y() + boxsize, boxsize, start, end, color, direct) graphCols = max((graphCols, min(start, end))) # Draw the revision node in the right column if c_rev.col_index is not None: graphCols = max((graphCols, c_rev.col_index)) pen.setColor(self.get_color(c_rev.rev.color, False)) painter.setPen(pen) if not is_clicked: painter.setBrush(QtGui.QBrush( self.get_color(c_rev.rev.color,True))) else: painter.setBrush(QtGui.QBrush(QtCore.Qt.white)) centerx = rect.x() + boxsize * (c_rev.col_index + 0.5) centery = rect.y() + boxsize * 0.5 painter.drawEllipse( QtCore.QRectF(centerx - (boxsize * dotsize * 0.5), centery - (boxsize * dotsize * 0.5), boxsize * dotsize, boxsize * dotsize)) # Draw twisty if not is_clicked and c_rev.twisty_state is not None: linesize = 0.35 pen.setColor(self._twistyColor) painter.setPen(pen) painter.drawLine(QtCore.QLineF (centerx - boxsize * linesize / 2, centery, centerx + boxsize * linesize / 2, centery)) if not c_rev.twisty_state: painter.drawLine(QtCore.QLineF (centerx, centery - boxsize * linesize / 2, centerx, centery + boxsize * linesize / 2)) finally: painter.restore() rect.adjust(int((graphCols + 1.5) * boxsize), 0, 0, 0) painter.save() x = 0 try: tagFont = QtGui.QFont(option.font) tagFont.setPointSizeF(tagFont.pointSizeF() * 9 / 10) for label, bg_color, text_color in labels: tagRect = rect.adjusted(1, 1, -1, -1) tagRect.setWidth(QtGui.QFontMetrics(tagFont).width(label) + 6) tagRect.moveLeft(tagRect.x() + x) painter.setPen(bg_color) painter.fillRect(tagRect.adjusted(1, 1, -1, -1), bg_color) tl = tagRect.topLeft() br = tagRect.bottomRight() painter.drawLine(tl.x(), tl.y() + 1, tl.x(), br.y() - 1) painter.drawLine(br.x(), tl.y() + 1, br.x(), br.y() - 1) painter.drawLine(tl.x() + 1, tl.y(), br.x() - 1, tl.y()) painter.drawLine(tl.x() + 1, br.y(), br.x() - 1, br.y()) painter.setFont(tagFont) painter.setPen(text_color) painter.drawText(tagRect.left() + 3, tagRect.bottom() - option.fontMetrics.descent() + 1, label) x += tagRect.width() + text_margin finally: painter.restore() rect.adjust(x, 0, 0, 0) if option.text: painter.setPen(get_text_color(option, style)) text_rect = rect.adjusted(0, 0, -text_margin, 0) painter.setFont(option.font) fm = painter.fontMetrics() text_width = fm.width(option.text) text = option.text if text_width > text_rect.width(): # RJLRJL changed to fm (fontMetrics) instead text = fm.elidedText(text, QtCore.Qt.ElideRight, text_rect.width()) painter.drawText(text_rect, QtCore.Qt.AlignLeft, text) painter.restore() def get_color(self, color, back): qcolor = QtGui.QColor() if color == 0: if back: qcolor.setHsvF(0,0,0.8) else: qcolor.setHsvF(0,0,0) else: h = float(color % 6) / 6 if back: qcolor.setHsvF(h,0.4,1) else: qcolor.setHsvF(h,1,0.7) return qcolor def drawLine(self, painter, pen, rect, boxsize, mid, height, start, end, color, direct): pen.setColor(self.get_color(color,False)) if direct: pen.setStyle(QtCore.Qt.SolidLine) else: pen.setStyle(QtCore.Qt.DotLine) painter.setPen(pen) startx = round(rect.x() + boxsize * start + boxsize / 2) endx = round(rect.x() + boxsize * end + boxsize / 2) path = QtGui.QPainterPath() path.moveTo(QtCore.QPointF(startx, mid - height / 2)) if start - end == 0: path.lineTo(QtCore.QPointF(endx, mid + height / 2)) else: path.cubicTo(QtCore.QPointF(startx, mid - height / 5), QtCore.QPointF(startx, mid - height / 5), QtCore.QPointF(startx + (endx - startx) / 2, mid)) path.cubicTo(QtCore.QPointF(endx, mid + height / 5), QtCore.QPointF(endx, mid + height / 5), QtCore.QPointF(endx, mid + height / 2 + 1)) painter.drawPath(path) pen.setStyle(QtCore.Qt.SolidLine) def sizeHint(self, option, index): size = QtWidgets.QStyledItemDelegate.sizeHint(self, option, index) height = size.height() # sizes smaller that this are to small. if height < 14: height = 14 # even sizes blur less if height % 2 == 1: height += 1 size.setHeight(height) return size ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/main.py0000644000000000000000000005325614556556456012721 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2007 Lukáš Lalinský # # 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. import os.path import sys from base64 import b64encode, b64decode from PyQt5 import QtCore, QtGui, QtWidgets from breezy import ( errors, osutils, ) import breezy from breezy.plugins import qbrz from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.statuscache import StatusCache from breezy.plugins.qbrz.lib.ui_bookmark import Ui_BookmarkDialog from breezy.plugins.qbrz.lib.util import ( QBzrWindow, get_qbrz_config, open_browser, StandardButton, BTN_OK, BTN_CANCEL, ) def formatFileSize(size): if size < 1024: return "%d B" % (size,) else: return "%0.1f KB" % (size / 1024.0,) class BookmarkDialog(QtWidgets.QDialog): def __init__(self, title, parent=None): QtWidgets.QDialog.__init__(self, parent) self.setWindowTitle(title) self.ui = Ui_BookmarkDialog() self.ui.setupUi(self) self.ui.buttonBox.addButton(StandardButton(BTN_OK), QtWidgets.QDialogButtonBox.AcceptRole) self.ui.buttonBox.addButton(StandardButton(BTN_CANCEL), QtWidgets.QDialogButtonBox.RejectRole) def setValues(self, name, location): self.ui.name.setText(name) self.ui.location.setText(location) def values(self): return (str(self.ui.name.text()), str(self.ui.location.text())) class SideBarItem(object): def __init__(self): self.icon = None self.text = None self.parent = None self.children = [] def loadChildren(self, sidebar): pass def showContextMenu(self, sidebar, pos): pass def __repr__(self): return '<%s ("%s")>' % (self.__class__.__name__, self.text) class DirectoryItem(SideBarItem): def __init__(self, fileInfo, parent, sidebar): self.path = fileInfo.filePath() self.icon = sidebar.window.icons['folder'] self.text = fileInfo.fileName() or fileInfo.path() self.parent = parent self.children = None def load(self, sidebar): self.children = [] fileInfoList = QtCore.QDir(self.path).entryInfoList( QtCore.QDir.Dirs | QtCore.QDir.Drives | QtCore.QDir.NoDotAndDotDot) for fileInfo in fileInfoList: #print fileInfo.fileName(), sidebar.window.getDirectoryStatus(pathParts, unicode(fileInfo.fileName())) item = DirectoryItem(fileInfo, self, sidebar) self.children.append(item) def refresh(self): self.children = None class FileSystemItem(DirectoryItem): def __init__(self, sidebar): self.isBranch = False self.icon = sidebar.window.icons['computer'] self.text = gettext("Computer") self.parent = sidebar.root self.children = None def load(self, sidebar): self.children = [] if sys.platform == 'win32': fileInfoList = QtCore.QDir.drives() else: fileInfoList = QtCore.QDir.root().entryInfoList( QtCore.QDir.Dirs | QtCore.QDir.Drives | QtCore.QDir.NoDotAndDotDot) for fileInfo in fileInfoList: item = DirectoryItem(fileInfo, self, sidebar) self.children.append(item) class BookmarkItem(DirectoryItem): def __init__(self, name, path, parent, sidebar): self.path = path self.icon = sidebar.window.icons['folder'] self.text = name self.parent = parent self.children = None def showContextMenu(self, sidebar, pos): self.contextMenu = QtWidgets.QMenu() self.contextMenu.addAction(gettext("&Edit Bookmark..."), self.edit) self.contextMenu.addAction(gettext("&Remove Bookmark..."), self.remove) self.contextMenu.popup(pos) def edit(self): self.parent.window.editBookmark(self.parent.children.index(self)) def remove(self): self.parent.window.removeBookmark(self.parent.children.index(self)) class BookmarksItem(SideBarItem): def __init__(self, sidebar): self.window = sidebar.window self.icon = sidebar.window.icons['bookmark'] self.text = gettext("Bookmarks") self.parent = sidebar.root self.children = None self.contextMenu = QtWidgets.QMenu() self.contextMenu.addAction(sidebar.window.actions['add-bookmark']) def load(self, sidebar): config = get_qbrz_config() self.children = [] for name, path in config.get_bookmarks(): item = BookmarkItem(name, path, self, sidebar) self.children.append(item) def refresh(self): self.children = None def showContextMenu(self, sidebar, pos): self.contextMenu.popup(pos) class SideBarModel(QtCore.QAbstractItemModel): layoutAboutToBeChanged = QtCore.pyqtSignal() layoutChanged = QtCore.pyqtSignal() def __init__(self, parent=None): QtCore.QAbstractItemModel.__init__(self, parent) self.window = parent self.root = SideBarItem() self.bookmarksItem = BookmarksItem(self) self.root.children.append(self.bookmarksItem) self.fileSystemItem = FileSystemItem(self) self.root.children.append(self.fileSystemItem) def itemFromIndex(self, index): if not index.isValid(): return self.root else: return index.internalPointer() def data(self, index, role): item = self.itemFromIndex(index) if role == QtCore.Qt.DecorationRole: return item.icon elif role == QtCore.Qt.DisplayRole: return item.text return None def columnCount(self, parent): return 1 def rowCount(self, index): item = self.itemFromIndex(index) if item.children is None: item.load(self) return len(item.children) def hasChildren(self, index): children = self.itemFromIndex(index).children return children is None or bool(children) def index(self, row, column, parent): return self.createIndex(row, column, self.itemFromIndex(parent).children[row]) def parent(self, index): item = self.itemFromIndex(index).parent if item is None or item.parent is None: return QtCore.QModelIndex() else: row = item.parent.children.index(item) return self.createIndex(row, 0, item) def refresh(self, item=None): if item is None: items = self.root.children else: items = [item] self.layoutAboutToBeChanged.emit() for row, item in enumerate(items): if item.children: parent = self.createIndex(row, 0, item) self.beginRemoveRows(parent, 0, len(item.children) - 1) item.refresh() self.endRemoveRows() self.layoutChanged.emit() def showContextMenu(self, pos): index = self.window.sideBarView.indexAt(pos) if not index.isValid(): return pos = self.window.sideBarView.viewport().mapToGlobal(pos) self.itemFromIndex(index).showContextMenu(self, pos) class QBzrMainWindow(QBzrWindow): def __init__(self, parent=None): QBzrWindow.__init__(self, [], parent) self.loadIcons() self.createActions() self.createMenuBar() self.createToolBar() self.createStatusBar() self.createUi() self.restoreSize("main", (800, 600)) self.cache = StatusCache(self) self.currentDirectory = None def createActions(self): self.actions = {} action = QtWidgets.QAction(self.icons['view-refresh'], gettext("&Refresh"), self) action.setShortcut("Ctrl+R") action.setStatusTip(gettext("Refresh the directory tree")) action.triggered[bool].connect(self.refresh) self.actions['refresh'] = action action = QtWidgets.QAction(self.icons['image-missing'], gettext("&Commit"), self) action.setStatusTip(gettext("Commit changes into a new revision")) action.triggered[bool].connect(self.commit) self.actions['commit'] = action action = QtWidgets.QAction(self.icons['qbrz-push'], gettext("&Push"), self) action.setStatusTip(gettext("Turn this branch into a mirror of another branch")) action.triggered[bool].connect(self.push) self.actions['push'] = action action = QtWidgets.QAction(self.icons['qbrz-pull'], gettext("Pu&ll"), self) action.setStatusTip(gettext("Update a mirror of this branch")) action.triggered[bool].connect(self.pull) self.actions['pull'] = action action = QtWidgets.QAction(gettext("&Add Bookmark..."), self) action.triggered[bool].connect(self.addBookmark) self.actions['add-bookmark'] = action def createMenuBar(self): # FIXME: this maybe needs a special version for OS X mainMenu = self.menuBar() fileMenu = mainMenu.addMenu(gettext("&File")) fileMenu.addAction(gettext("&Configure..."), self.configure) fileMenu.addSeparator() fileMenu.addAction(gettext("&Quit"), self.close, "Ctrl+Q") viewMenu = mainMenu.addMenu(gettext("&View")) viewMenu.addAction(self.actions['refresh']) branchMenu = mainMenu.addMenu(gettext("&Branch")) branchMenu.addAction(self.actions['commit']) branchMenu.addAction(self.actions['push']) branchMenu.addAction(self.actions['pull']) bookmarksMenu = mainMenu.addMenu(gettext("&Bookmarks")) bookmarksMenu.addAction(self.actions['add-bookmark']) helpMenu = mainMenu.addMenu(gettext("&Help")) helpMenu.addAction(gettext("&Help..."), self.showHelp, "F1") helpMenu.addSeparator() helpMenu.addAction(gettext("&About..."), self.showAboutDialog) def createToolBar(self): self.setUnifiedTitleAndToolBarOnMac(True) self.toolBar = self.addToolBar("Main") self.toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) self.toolBar.addAction(self.actions['refresh']) self.toolBar.addSeparator() self.toolBar.addAction(self.actions['commit']) self.toolBar.addAction(self.actions['pull']) self.toolBar.addAction(self.actions['push']) def createStatusBar(self): self.statusBar().showMessage("Ready") def createUi(self): self.vsplitter = QtWidgets.QSplitter(QtCore.Qt.Vertical) self.sideBarView = QtWidgets.QTreeView() self.sideBarModel = SideBarModel(self) self.sideBarView.setModel(self.sideBarModel) self.sideBarView.setTextElideMode(QtCore.Qt.ElideLeft) self.sideBarView.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.sideBarView.customContextMenuRequested[QPoint].connect(self.sideBarModel.showContextMenu) self.sideBarView.selectionModel().selectionChanged[QItemSelection, QItemSelection].connect(self.updateFileList) header = self.sideBarView.header() header.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents) header.setStretchLastSection(False) header.setVisible(False) self.fileListView = QtWidgets.QTreeWidget() self.fileListView.setRootIsDecorated(False) self.fileListView.setHeaderLabels([ gettext("Name"), gettext("Size"), gettext("Status"), ]) self.fileListView.itemDoubleClicked[QTreeWidgetItem, int].connect(self.onFileActivated) self.hsplitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal) self.hsplitter.addWidget(self.sideBarView) self.hsplitter.addWidget(self.fileListView) self.console = QtWidgets.QTextBrowser() self.vsplitter.addWidget(self.hsplitter) self.vsplitter.addWidget(self.console) self.setCentralWidget(self.vsplitter) def _saveSize(self, config): super(type(self),self)._saveSize(config) name = self._window_name # The splitter stuff returns bytes in (apparently) base64 - we use b64encode from base64 # then turn it into a utf-8 string, then strip and concat with name, like this: # # main_vsplitter_state = AAAA/wAAAAAAAAACAAAAwAAAAMABAAAABgEAAAAC # config.set_option(name + "_vsplitter_state", str(b64encode(self.vsplitter.saveState()), 'utf-8').strip()) config.set_option(name + "_hsplitter_state", str(b64encode(self.hsplitter.saveState()), "utf-8").strip()) config.set_option(name + "_file_list_header_state", str(b64encode(self.fileListView.header().saveState()), "utf-8").strip()) # config.set_option(name + "_vsplitter_state", str(self.vsplitter.saveState()).encode("base64").strip()) # config.set_option(name + "_hsplitter_state", str(self.hsplitter.saveState()).encode("base64").strip()) # config.set_option(name + "_file_list_header_state", str(self.fileListView.header().saveState()).encode("base64").strip()) def restoreSize(self, name, defaultSize): config = QBzrWindow.restoreSize(self, name, defaultSize) name = self._window_name value = config.get_option(name + "_vsplitter_state") # We get a utf-8 string, but need some bytes... if value: self.vsplitter.restoreState(b64decode(value)) value = config.get_option(name + "_hsplitter_state") if value: self.hsplitter.restoreState(b64decode(value)) value = config.get_option(name + "_file_list_header_state") if value: self.fileListView.header().restoreState(b64decode(value)) def showHelp(self): open_browser("http://bazaar-vcs.org/QBzr/Documentation") def showAboutDialog(self): tpl = { 'qbrz_version': qbrz.__version__, 'breezy_version': breezy.__version__, } QtWidgets.QMessageBox.about(self, gettext("About QBrz"), gettext("QBrz \u2014 A graphical user interface for Breezy
" "Version %(qbrz_version)s (breezy %(breezy_version)s)
" "
" "Copyright \u00A9 2006-2008 Luk\xe1\u0161 Lalinsk\xfd and others
" "
" 'http://bazaar-vcs.org/QBzr') % tpl) def loadIcons(self): icons = [ ('view-refresh', ('16x16', '22x22'), None), ('bookmark', ('16x16',), None), ('computer', ('16x16',), None), ('qbrz-pull', ('22x22',), None), ('qbrz-push', ('22x22',), None), ('image-missing', ('22x22',), None), ('folder', ('16x16',), 'folder-open'), ('folder-branch', ('16x16',), None), ('folder-unchanged', ('16x16',), None), ('folder-modified', ('16x16',), None), ('folder-added', ('16x16',), None), ('folder-conflict', ('16x16',), None), ('file', ('16x16',), None), ('file-unchanged', ('16x16',), None), ('file-modified', ('16x16',), None), ('file-added', ('16x16',), None), ('file-conflict', ('16x16',), None), ] self.icons = {} for name, sizes, name_on in icons: icon = QtGui.QIcon() for size in sizes: icon.addFile('/'.join([':', size, name]) + '.png') if name_on is not None: for size in sizes: icon.addFile('/'.join([':', size, name_on]) + '.png', QtCore.QSize(), QtGui.QIcon.Normal, QtGui.QIcon.On) self.icons[name] = icon def commit(self): from breezy.workingtree import WorkingTree from breezy.plugins.qbrz.lib.commit import CommitWindow tree = WorkingTree.open_containing(self.currentDirectory)[0] self.window = CommitWindow(tree, [], parent=self) self.window.show() def push(self): from breezy.workingtree import WorkingTree from breezy.plugins.qbrz.lib.pull import QBzrPushWindow tree = WorkingTree.open_containing(self.currentDirectory)[0] self.window = QBzrPushWindow(tree.branch, parent=self) self.window.show() def pull(self): from breezy.workingtree import WorkingTree from breezy.plugins.qbrz.lib.pull import QBzrPullWindow tree = WorkingTree.open_containing(self.currentDirectory)[0] self.window = QBzrPullWindow(tree.branch, parent=self) self.window.show() def configure(self): from breezy.plugins.qbrz.lib.config import QBzrConfigWindow window = QBzrConfigWindow(self) window.exec_() def addBookmark(self): dialog = BookmarkDialog(gettext("Add Bookmark"), self) if dialog.exec_() == QtWidgets.QDialog.Accepted: name, location = list(dialog.values()) config = get_qbrz_config() config.add_bookmark(name, location) config.save() self.sideBarModel.refresh(self.sideBarModel.bookmarksItem) def editBookmark(self, pos): config = get_qbrz_config() bookmarks = list(config.getBookmarks()) dialog = BookmarkDialog(gettext("Edit Bookmark"), self) dialog.setValues(*bookmarks[pos]) if dialog.exec_() == QtWidgets.QDialog.Accepted: bookmarks[pos] = list(dialog.values()) config.set_bookmarks(bookmarks) config.save() self.sideBarModel.refresh(self.sideBarModel.bookmarksItem) def removeBookmark(self, pos): res = QtWidgets.QMessageBox.question(self, gettext("Remove Bookmark"), gettext("Do you really want to remove the selected bookmark?"), QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) if res == QtWidgets.QMessageBox.Yes: config = get_qbrz_config() bookmarks = list(config.getBookmarks()) del bookmarks[pos] config.set_bookmarks(bookmarks) config.save() self.sideBarModel.refresh(self.sideBarModel.bookmarksItem) def updateFileList(self, selected, deselected): items = list(map(self.sideBarModel.itemFromIndex, self.sideBarView.selectedIndexes())) if not items: return item = items[0] # RJL This should be type, I suspect, as FileSystemItems haven't got a path # if not isinstance(item, DirectoryItem): if type(item) is not DirectoryItem: return self.setDirectory(str(item.path)) def onFileActivated(self, item, column): path = item.data(0, QtCore.Qt.UserRole) if path: # directory self.setDirectory(str(path)) else: # file basename = str(item.text(0)) filepath = osutils.pathjoin(self.currentDirectory, basename) url = QtCore.QUrl(filepath) QtGui.QDesktopServices.openUrl(url) def refresh(self): if self.currentDirectory: self.setDirectory(self.currentDirectory) self.sideBarModel.refresh() def autoRefresh(self, path): try: self.setDirectory(self.currentDirectory) except errors.PathNotChild: pass def setDirectory(self, path): self.currentDirectory = path self.setWindowTitle("QBrz - %s" % path) QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor)) try: pathParts = osutils.splitpath(path) self.fileListView.invisibleRootItem().takeChildren() item = QtWidgets.QTreeWidgetItem(self.fileListView) item.setText(0, '..') item.setIcon(0, self.icons['folder']) item.setData(0, QtCore.Qt.UserRole, os.path.dirname(path)) fileInfoList = QtCore.QDir(path).entryInfoList( QtCore.QDir.AllEntries | QtCore.QDir.NoDotAndDotDot, QtCore.QDir.DirsFirst) for fileInfo in fileInfoList: item = QtWidgets.QTreeWidgetItem(self.fileListView) item.setText(0, fileInfo.fileName()) if fileInfo.isDir(): status = self.cache.getDirectoryStatus(pathParts, str(fileInfo.fileName())) if status == 'non-versioned': icon = 'folder' else: icon = 'folder-' + status item.setData(0, QtCore.Qt.UserRole, fileInfo.filePath()) item.setIcon(0, self.icons[icon]) else: status = self.cache.getFileStatus(pathParts, str(fileInfo.fileName())) if status == 'non-versioned': icon = 'file' else: icon = 'file-' + status item.setIcon(0, self.icons[icon]) item.setText(1, formatFileSize(fileInfo.size())) item.setTextAlignment(1, QtCore.Qt.AlignRight) item.setText(2, status) finally: QtWidgets.QApplication.restoreOverrideCursor() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/plugins.py0000644000000000000000000000722114556556456013445 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2009 Canonical Ltd # # 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 inspect import getdoc from PyQt5 import QtGui, QtWidgets from breezy import ( _format_version_tuple, osutils, plugin as mod_plugin, ) from breezy.plugins.qbrz.lib.conditional_dataview import ( QBzrConditionalDataView, ) from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.util import ( BTN_CLOSE, QBzrWindow, ) class QBzrPluginsWindow(QBzrWindow): def __init__(self, parent=None): QBzrWindow.__init__(self, [], parent) self.set_title(gettext("Plugins")) self.restoreSize("plugins", (400,256)) view = self.build_view() btns = self.create_button_box(BTN_CLOSE) layout = QtWidgets.QVBoxLayout(self.centralWidget()) layout.addWidget(view) layout.addWidget(btns) self.refresh_view() def build_view(self): """Build and return the widget displaying the data.""" summary_headers = [ gettext("Name"), gettext("Version"), gettext("Description"), ] locations_headers = [ gettext("Name"), gettext("Directory"), ] footer = gettext("Plugins installed: %(rows)d") details = None self._summary_viewer = QBzrConditionalDataView("tree", summary_headers, footer, details) self._locations_viewer = QBzrConditionalDataView("tree", locations_headers, footer, details) tabs = QtWidgets.QTabWidget() tabs.addTab(self._summary_viewer, gettext("Summary")) tabs.addTab(self._locations_viewer, gettext("Locations")) return tabs def refresh_view(self): """Update the data in the view.""" plugins = mod_plugin.plugins() summary_data = [] locations_data = [] for name in sorted(plugins): plugin = plugins[name] version = format_plugin_version(plugin) description = format_plugin_description(plugin) directory = osutils.dirname(plugin.path()) summary_data.append((name, version, description)) locations_data.append((name, directory)) self._summary_viewer.setData(summary_data) self._locations_viewer.setData(locations_data) def format_plugin_version(plugin): """Return the version of a plugin as a formatted string.""" version_info = plugin.version_info() if version_info is None: result = '' else: try: result = _format_version_tuple(version_info) except (ValueError, IndexError): # Version info fails the expected rules. # Format it nicely anyhow. result = ".".join([str(part) for part in version_info]) return result def format_plugin_description(plugin): d = getdoc(plugin.module) if d: doc = d.split('\n')[0] else: doc = gettext('(no description)') return doc ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/pull.py0000644000000000000000000003043114556556456012737 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2007 Lukáš Lalinský # # 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. import os from PyQt5 import QtCore from breezy import ( errors, osutils, urlutils, ) from breezy.commands import get_cmd_object from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.subprocess import SubProcessDialog from breezy.plugins.qbrz.lib.ui_pull import Ui_PullForm from breezy.plugins.qbrz.lib.ui_push import Ui_PushForm from breezy.plugins.qbrz.lib.ui_merge import Ui_MergeForm from breezy.plugins.qbrz.lib.util import ( iter_branch_related_locations, save_pull_location, fill_pull_combo, fill_combo_with, hookup_directory_picker, DIRECTORYPICKER_SOURCE, DIRECTORYPICKER_TARGET, url_for_display, ) class QBzrPullWindow(SubProcessDialog): NAME = "pull" def __init__(self, branch, tree=None, location=None, revision=None, remember=None, overwrite=None, ui_mode=True, parent=None): self.branch = branch self.tree = tree super(QBzrPullWindow, self).__init__(name = self.NAME, ui_mode = ui_mode, parent = parent) self.ui = Ui_PullForm() self.setupUi(self.ui) # add the subprocess widgets. for w in self.make_default_layout_widgets(): self.layout().addWidget(w) self.default_location = fill_pull_combo(self.ui.location, self.branch) if location: self.ui.location.setEditText(location) else: self.ui.location.setFocus() if remember: self.ui.remember.setCheckState(QtCore.Qt.Checked) if overwrite: self.ui.overwrite.setCheckState(QtCore.Qt.Checked) if revision: self.ui.revision.setText(revision) # One directory picker for the pull location. hookup_directory_picker(self, self.ui.location_picker, self.ui.location, DIRECTORYPICKER_SOURCE) def do_start(self): if self.tree: dest = self.tree.basedir else: dest = self.branch.base args = [] if dest != osutils.getcwd(): args.extend(('--directory', dest)) if self.ui.overwrite.isChecked(): args.append('--overwrite') if self.ui.remember.isChecked(): args.append('--remember') revision = str(self.ui.revision.text()) if revision: args.append('--revision') args.append(revision) location = str(self.ui.location.currentText()) if location and location != self.default_location: args.insert(0, location) self.process_widget.do_start(None, 'pull', *args) save_pull_location(self.branch, location) class QBzrPushWindow(SubProcessDialog): NAME = "push" def __init__(self, branch, tree=None, location=None, create_prefix=None, use_existing_dir=None, remember=None, overwrite=None, ui_mode=True, parent=None): self.branch = branch self.tree = tree self._no_strict = None super(QBzrPushWindow, self).__init__(name = self.NAME, ui_mode = ui_mode, parent = parent) self.ui = Ui_PushForm() self.setupUi(self.ui) # and add the subprocess widgets. for w in self.make_default_layout_widgets(): self.layout().addWidget(w) self.default_location = self.branch.get_push_location() df = url_for_display(self.default_location or self._suggested_push_location()) fill_combo_with(self.ui.location, df, iter_branch_related_locations(self.branch)) if location: self.ui.location.setEditText(location) else: self.ui.location.setFocus() if remember: self.ui.remember.setCheckState(QtCore.Qt.Checked) if overwrite: self.ui.overwrite.setCheckState(QtCore.Qt.Checked) if create_prefix: self.ui.create_prefix.setCheckState(QtCore.Qt.Checked) if use_existing_dir: self.ui.use_existing_dir.setCheckState(QtCore.Qt.Checked) # One directory picker for the push location. hookup_directory_picker(self, self.ui.location_picker, self.ui.location, DIRECTORYPICKER_TARGET) def _suggested_push_location(self): """Suggest a push location when one is not already defined. @return: a sensible location as a string or '' if none. """ # If this is a feature branch and its parent exists locally, # its grandparent is likely to be the hosted master branch. # If so, suggest a push location, otherwise don't. parent_url = self.branch.get_parent() if parent_url and parent_url.startswith("file://"): from breezy.branch import Branch try: parent_branch = Branch.open(parent_url) except errors.NotBranchError: return '' master_url = (parent_branch.get_parent() or parent_branch.get_bound_location()) if master_url and not master_url.startswith("file://"): if master_url.find("launchpad") >= 0: suggest_url = self._build_lp_push_suggestion(master_url) if suggest_url: return suggest_url # XXX we can hook in there even more specific suggesters # XXX maybe we need registry? suggest_url = self._build_generic_push_suggestion(master_url) if suggest_url: return suggest_url return '' def _build_lp_push_suggestion(self, master_url): try: from breezy.plugins.launchpad import account except ImportError: # yes, ImportError is possible with bzr.exe, # because user has option to not install launchpad plugin at all return '' from breezy.plugins.qbrz.lib.util import launchpad_project_from_url user_name = account.get_lp_login() project_name = launchpad_project_from_url(master_url) branch_name = urlutils.basename(self.branch.base) if user_name and project_name and branch_name: return "lp:~%s/%s/%s" % (user_name, project_name, branch_name) else: return '' def _build_generic_push_suggestion(self, master_url): master_parent = urlutils.dirname(master_url) branch_name = urlutils.basename(self.branch.base) return urlutils.join(master_parent, branch_name) def do_start(self): if self.tree: dest = self.tree.basedir else: dest = self.branch.base args = [] if dest != osutils.getcwd(): args.extend(('--directory', dest)) if self.ui.overwrite.isChecked(): args.append('--overwrite') if self.ui.remember.isChecked(): args.append('--remember') if self.ui.create_prefix.isChecked(): args.append('--create-prefix') if self.ui.use_existing_dir.isChecked(): args.append('--use-existing-dir') 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') location = str(self.ui.location.currentText()) if location and location != self.default_location: args.insert(0, location) self.process_widget.do_start(None, 'push', *args) def validate(self): """Check working tree for blocking conditions (such as uncommitted changes or out of date) and return True if we can push anyway or False if push operation should be aborted. """ if self._no_strict: return True # check blocking conditions in the tree if self.tree is None: return True # no tree - no check cfg = self.branch.get_config() strict = cfg.get_user_option('push_strict') if strict is not None: bools = dict(yes=True, no=False, on=True, off=False, true=True, false=False) strict = bools.get(strict.lower(), None) if strict == False: return True # don't check blocking conditions # the code below based on check in from breezy/builtins.py: cmd_push tree = self.tree blocker = None if (tree.has_changes(tree.basis_tree()) or len(tree.get_parent_ids()) > 1): blocker = gettext('Working tree has uncommitted changes.') if tree.last_revision() != tree.branch.last_revision(): # The tree has lost sync with its branch, there is little # chance that the user is aware of it but he can still force # the push with --no-strict blocker = gettext("Working tree is out of date, please run 'brz update'.") # if blocker is None: return True if self.ask_confirmation(blocker + "\n\n" + gettext("Do you want to continue anyway?"), type='warning'): self._no_strict = True return True return False class QBzrMergeWindow(SubProcessDialog): NAME = "merge" def __init__(self, branch, tree=None, location=None, revision=None, remember=None, force=None, uncommitted=None, ui_mode=True, parent=None): super(QBzrMergeWindow, self).__init__(name = self.NAME, ui_mode = ui_mode, parent = parent) self.branch = branch self.tree = tree self.ui = Ui_MergeForm() self.setupUi(self.ui) # and add the subprocess widgets. for w in self.make_default_layout_widgets(): self.layout().addWidget(w) fill_pull_combo(self.ui.location, self.branch) if location: self.ui.location.setEditText(location) else: self.ui.location.setFocus() if remember: self.ui.remember.setCheckState(QtCore.Qt.Checked) if force: self.ui.force.setCheckState(QtCore.Qt.Checked) if uncommitted: self.ui.uncommitted.setCheckState(QtCore.Qt.Checked) if revision: self.ui.revision.setText(revision) # One directory picker for the pull location. hookup_directory_picker(self, self.ui.location_picker, self.ui.location, DIRECTORYPICKER_SOURCE) def do_start(self): if self.tree: dest = self.tree.basedir else: dest = self.branch.base if dest == os.getcwd(): args = [] else: args = ['--directory', dest] if self.ui.remember.isChecked(): args.append('--remember') if self.ui.force.isChecked(): args.append('--force') if self.ui.uncommitted.isChecked(): args.append('--uncommitted') rev = str(self.ui.revision.text()).strip() if rev: args.extend(['--revision', rev]) location = str(self.ui.location.currentText()) self.process_widget.do_start(None, 'merge', location, *args) save_pull_location(None, location) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/resources.py0000644000000000000000000051124614556556456014005 0ustar00# -*- coding: utf-8 -*- # Resource object code # # Created: ? 5 25 07:13:26 2011 # by: The Resource Compiler for PyQt (Qt v4.5.2) # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore qt_resource_data = b"\ \x00\x00\x09\xe5\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x09\x77\x49\x44\x41\x54\x78\xda\xd4\ \x5a\x09\x50\x55\xd7\x19\xfe\xee\x5b\xe0\x3d\xb6\xc7\x03\xd1\x44\ \x04\x4d\x52\x89\x51\xe3\x32\x93\xc4\x41\xab\xa6\xa6\xd5\x4e\x6b\ \x9d\x49\x5b\xdb\xc4\x36\xad\x33\xc9\xc4\x11\x2b\xae\x28\xa0\xac\ \x56\x04\x89\x41\x9e\xc1\x28\x2a\x8b\x4b\x5c\x4a\x62\xa3\x26\x31\ \x8e\x99\x6a\x12\xb5\x6a\x55\x0c\xb8\xa0\xd5\xba\xe0\x16\x45\x22\ \x8b\x2c\x6f\x39\xbd\xff\xc5\x73\x3d\xef\xbe\x47\x23\x02\xd6\x1c\ \xe7\xce\x3d\xef\x7a\xef\xb9\xff\xf7\xfd\xfb\xb9\x48\x8c\x31\xfc\ \x90\x87\x0e\x3f\xf0\x61\xe8\xcc\xc5\xcb\xcb\xd6\xb1\x1d\xdb\x3f\ \x46\x60\x60\x20\xa6\x4c\x2d\x94\x3a\xe3\x1d\x52\x67\x99\xd0\xfe\ \xbd\x19\x2c\x3e\xe5\x33\x84\x58\x25\xd4\xd4\x35\xc3\x1a\x02\xcc\ \x4f\x88\xc5\xe0\x41\x13\xa4\xc7\xde\x84\x36\x14\x4d\x62\xd3\xe6\ \x6f\x47\xdf\x3e\x12\x0a\x96\x84\xa0\xe8\xdd\x30\x98\x74\x06\xcc\ \x8a\xb3\xe1\x5f\xfb\xb3\xd9\x63\xad\x81\xd5\x85\x6f\xb1\xe5\xef\ \x97\x63\x44\xb4\x2f\x32\xe7\x04\xc3\x68\x74\x28\xd7\xbf\xab\xd1\ \x63\xc6\x5f\x6f\xa3\xe2\xbc\x0b\x79\x99\xaf\xe2\x85\xa1\x71\xd2\ \x63\xa7\x81\xa2\xd5\x6f\xb2\xbc\xfc\xe3\x18\xf3\x72\x8b\xf0\x92\ \x24\xc1\xe1\x30\x2a\xff\x17\xe0\xa7\x43\xfe\xc2\x50\x0c\xee\x6b\ \xc0\xb4\xc4\x92\x0e\xd3\x44\x87\x69\xa0\xa0\xf8\x6d\xb6\x72\x45\ \x29\x46\x0e\xf5\x45\x46\x5c\x20\x24\xdd\x7d\x82\x09\x84\xc1\x60\ \x07\x73\x31\xd8\x1d\x06\xcc\x4c\xa9\xc2\xd1\xb3\xac\x43\x34\xd1\ \x21\x00\xc8\xe6\x73\x56\x94\x29\xcc\x27\x4d\x0d\x52\x98\x57\xc3\ \x9c\x2c\x38\xd7\x02\x1f\xf4\xce\xbf\xa4\xd5\xe0\xd4\x99\xbb\xc8\ \xcd\xf8\x6d\xbb\x40\xb4\x1b\x00\x09\x6f\x5b\x79\x0c\x3f\x1d\xe9\ \x8f\xe4\x58\x8b\x2a\xb4\x96\x7d\x55\x78\x59\x0b\xa4\x9d\xe6\x66\ \xbd\xaa\x89\x65\x59\xaf\xe1\xa5\xe8\x58\xe9\x91\xfb\xc0\xba\x0d\ \x31\x6c\xe9\xca\x72\xbc\x32\xc2\x4f\x11\x9e\x0b\x4a\x42\xd3\xb1\ \xfe\x43\x07\x6e\x54\x39\xd5\xdf\x74\x38\x5d\x3e\x2d\x2f\xd6\xe9\ \x90\x93\xde\x05\xcf\x3f\x2b\x61\x46\xc2\x06\x1c\x3a\x60\x63\x8f\ \x14\xc0\xc6\xb5\x93\x59\x5e\xde\x11\x8c\x1e\xe9\x83\x94\x69\xc1\ \xaa\xa9\xd0\x99\x8e\xe2\xad\xbe\xf8\x64\xaf\x05\x29\x4b\xec\xa8\ \x6f\x84\x7a\x5d\xbc\x8f\x4c\x6d\x69\x92\x15\x03\x9e\x31\x28\x20\ \x0e\x7c\x9d\xc3\x1e\x09\x80\x0f\x36\x4d\x65\xb9\x2b\x8e\xaa\xcc\ \x6b\xc7\x91\x72\x27\x76\x7e\x51\xab\xcc\xeb\x1b\x83\x90\x9e\x5b\ \xad\x6a\x40\x3b\x8c\x06\x03\x16\xce\x0b\x53\x40\x4c\x4f\xfc\x5b\ \x9b\x41\xe8\x1e\x46\x78\x9b\xed\x10\x5e\x1e\x6e\x41\xfa\x4c\x3f\ \x0f\x56\xef\xd4\x19\x91\x5b\x20\xc1\xe0\x13\x00\x47\x73\x9d\xf2\ \xcc\xe5\xab\xa1\xf8\xf8\xf3\x06\xb7\xfb\x38\x18\x9a\x5b\x02\xec\ \x0a\x88\x7e\x51\x46\xcc\x4e\xda\x8c\x63\x87\x97\xb3\x4e\x01\xb0\ \x79\xfd\x14\x96\xbb\xfc\x88\x9c\xa4\x7c\x90\x1a\x6b\xf6\x60\x95\ \xe6\xc5\x1f\x19\xd0\x70\xb7\xc5\x1f\x39\x08\xe6\x6c\xc4\xfa\x1d\ \x7a\x54\x9c\xae\x71\x8b\x4e\xfc\x19\x1a\x41\x7e\xcd\x78\x27\xd1\ \x8a\x88\xee\x72\x98\x4d\x28\x46\x79\xe9\x2a\xd6\xa1\x00\x48\xb5\ \xef\xe6\x1f\x43\xf4\x60\x23\x16\xcc\x0a\x55\xec\x57\xcb\xfe\xe1\ \x72\x3b\xf6\x1d\x64\x8a\xe0\xaa\xa0\xf2\x9c\x0e\x93\x31\x00\xcb\ \x8a\x5d\xea\xfd\xa2\xbf\xd0\x9c\x22\x13\x81\xb0\xa5\x04\x23\xd4\ \x22\xfb\x44\x7c\x11\x4e\x96\xad\x61\x1d\x02\x80\xaa\xca\xb8\xe4\ \x2d\x4a\x16\x4d\x9e\x66\xf5\x60\x8f\xcf\x57\x6d\x6e\x82\xcb\xd9\ \xd0\xea\x3a\x55\xf5\xe1\xd8\xf4\xd1\xf5\x56\x9f\x27\x10\x96\x00\ \x03\x6c\xe9\x01\xf0\x95\x83\x55\x5c\xc2\x1a\x9c\x3e\x51\xc8\xda\ \x05\x80\x54\x19\x3b\x33\x0f\xfd\x65\xfb\xcc\x98\x13\xa2\xd8\xab\ \x96\x3d\x3a\xaf\x2d\x69\x44\x43\x7d\x88\xc2\xb6\xd1\x50\x7b\xcf\ \x41\x6b\xd5\x75\x5c\xac\x65\xbe\xf5\x1f\x5d\x71\xe3\xa6\xc3\xe3\ \x79\x71\x1e\x6a\x35\x23\x27\xd9\x1f\xcd\x0e\x09\xf1\xf3\x0b\x71\ \xfa\xd4\x46\xf6\x50\x00\x88\xf9\xd9\x89\xab\xd1\xa3\xab\x8f\x6c\ \x9f\x41\xf0\x37\xc1\x8d\x31\x71\xfe\xd9\x9e\xfb\x4b\xd9\x1d\x81\ \x6e\x67\xe5\x45\x52\xa0\x7a\x5e\x55\x78\x15\x76\xbb\xc1\xeb\x5a\ \x7c\x3c\x1d\x69\xc4\xd2\x54\x0b\xaa\x6a\x1c\x48\x4c\x7b\x1f\x27\ \x4e\x96\xb0\x36\x01\x20\xd4\xf1\xf3\x56\x20\xd8\x2a\x9b\x46\x76\ \x88\x12\xee\x78\x26\xd5\x32\xb6\xe7\x70\x13\x24\xbd\x49\x8d\x3a\ \xfc\x2c\x6a\x80\xae\x29\x0e\xed\x72\xe1\xdc\x35\x2b\xee\xdc\xba\ \xec\x95\x7d\xf1\xfc\xa3\x48\x1f\xd8\x52\xfd\x70\xeb\x3a\x43\xd6\ \x42\x1b\xca\x4e\x6e\x63\x0f\x54\x4a\x54\xfc\x7b\x27\x9b\x97\x94\ \x09\x83\x2c\xac\x6d\x41\x20\x42\x83\x99\xca\x94\x5e\xd7\xac\xde\ \xc7\xb3\x2a\x8d\xe3\xa5\x17\x71\xf3\xd2\x19\xd4\x37\x48\xf8\xe0\ \xab\x57\xe0\xe3\xe3\xab\x08\xcc\x1d\xba\x77\xd7\x43\x18\xf8\xd4\ \x2d\xe8\x4d\xfe\xe8\x16\xe4\x40\xef\xfe\x3d\x11\x1c\x16\xe9\x56\ \x2f\x89\x67\xb1\x0c\xd9\x77\xd4\x85\xb9\x0b\xaa\x11\xd5\x27\x00\ \xc5\x6b\x76\x4b\xdf\x0b\x60\xca\xd4\x9f\xb3\x73\xe7\xaa\x51\x90\ \x1d\xac\xd8\x23\x0d\x51\x70\x2e\xbc\xb6\xc6\xe1\x80\xc6\xc7\x38\ \x61\x32\x99\xdd\xb4\x11\x33\xf6\x73\xbc\xf0\xf2\xcf\x10\x18\xa0\ \x77\xcb\x01\xa2\xa0\xde\x72\x04\x5f\x7b\xfb\x1e\x17\xb2\x6c\xd5\ \x18\x3e\x2c\x14\xd9\xd9\x9f\x4a\xad\x9a\x50\x5a\xca\x38\x76\xfc\ \xc4\x1d\x2c\x49\x0e\x45\xb7\x30\x83\x9b\x90\x2a\x6a\x39\x5a\x10\ \x20\xb1\xc6\xa1\x6b\x74\x2f\x5d\x97\x58\xb3\x2a\x38\x0f\xa3\x95\ \xb7\x7b\xc0\x6c\x32\x79\xcd\x01\xf4\x0c\x09\xd9\x5a\x8e\xa0\xb5\ \xc7\x8d\xd2\xe3\xcd\xdf\xfb\x61\xcf\xd7\xb2\x6c\xd9\xaf\x33\xaf\ \x00\xa8\xb2\xdc\xb9\xfb\x5b\x64\xc6\x87\x28\xf6\x47\x0b\x70\x9b\ \x17\xcd\x45\x64\x5b\xb4\x61\x0e\x84\x49\x3e\x6e\xb9\x80\x46\xe9\ \xd9\x20\xf5\x3e\xd1\x8f\xb4\x82\x7b\xcb\x11\xfc\xf8\xd3\x78\x0b\ \x7e\x32\x54\x87\x4d\xdb\x2e\xe0\xab\x3d\x2d\x0d\x91\x0a\xe0\xda\ \x95\x4f\x98\xad\xa0\x0c\x33\xde\xb2\x20\x7a\x90\x97\xed\x8b\x7b\ \x20\x78\xa3\x42\xac\x71\x2d\x78\x63\x4d\x1c\xa4\x8d\x4b\x37\x23\ \x50\x79\xa1\x56\x35\x3f\x12\x5c\x14\x5e\x0c\x10\xe2\x3a\x62\x11\ \x48\x63\xdc\x98\x20\x38\x9b\x18\xca\xbf\x39\xe8\xae\x81\x93\x27\ \x4a\xe1\xb2\x4b\xe8\xd5\x53\x52\x9d\x55\xa9\x18\x75\x92\x87\x50\ \x74\x8d\x0e\xee\x07\x5a\xd6\xc8\x84\x78\xdc\x17\xcd\xa8\x68\x4b\ \xb5\x7a\x0f\x27\x43\xd4\xac\xb7\x28\x27\x1e\xe4\xaf\xf9\xc5\xb5\ \xca\x4e\xc7\xe4\xd8\x12\xc9\x0d\x40\x44\x78\x17\x98\x7d\xe5\x1a\ \xbd\xe0\xae\x5b\x84\xf1\xca\xa8\xc6\x76\xb5\x7d\x00\x99\x10\x8f\ \xfb\x22\x90\xe3\xe7\x23\x94\x7a\x48\x1b\xcd\x38\x10\xae\x5d\xae\ \x1d\x2d\xfb\x8b\xf3\x9b\x70\xb6\xb2\x11\xd9\xa9\xbf\xf2\xcc\x03\ \x51\xfd\x26\x49\x93\x26\xf6\xc5\x95\x4a\x86\x9c\xa2\xfb\x49\x86\ \xbf\x88\x2f\xa8\xed\xb0\xc4\x28\x22\x6a\x40\x9b\xc0\xb8\x26\x0a\ \xb7\x07\x2a\x4c\x6a\x99\xf7\x36\x44\xf6\x57\x6f\xac\xc3\xd6\x5d\ \x55\x98\x3f\x3d\x1a\x83\xa3\x13\xbd\x47\xa1\x3f\x4c\x5c\x29\xfd\ \xf1\x77\x4f\xe1\xc3\xed\xd7\x94\x07\x44\xa6\xb5\xe1\x8e\x6b\x49\ \x1b\x91\x14\xb0\xb2\x06\x78\x14\x12\xb5\x40\xd7\x2e\x5e\x0e\x90\ \xd7\xaf\x54\xd7\xf1\x16\x9e\xb9\x89\x72\x3f\xa3\x52\x7c\xcd\xe6\ \x3a\x4c\x7e\xe3\x39\xfc\xf2\xd5\x5c\xe9\x7f\x66\xe2\xb7\x63\xd6\ \x4a\x13\x27\x44\xa1\xa8\xa4\x01\x9f\x7e\xd9\xe8\xb6\xa0\xd6\xa4\ \xb8\x26\xc4\x88\xa4\x80\xd4\x39\xdd\xa2\x10\xd7\x02\x5d\xa3\x4c\ \x4c\xf5\xd0\x95\x1b\x3a\x37\x1f\xf3\x96\xc4\x68\x5d\x8a\xff\xd9\ \xf9\x75\x78\xed\xd7\x91\x8a\x6c\x0f\x54\x4a\xd0\x3e\x26\x81\xc8\ \xc8\xad\x55\x40\xf0\xd0\xc7\xd9\x12\x35\x22\x46\x24\x6d\x43\x2f\ \xda\x3f\xd7\x88\x24\xf7\xc2\x04\xe8\xbd\xa2\xef\x94\x35\xb5\x84\ \x88\xd1\x87\x4a\x14\x92\x61\xec\xe8\x50\xcc\x89\xdf\x22\xb5\xa9\ \x16\x22\x10\x84\x7a\xd5\x3a\x49\x01\x21\xbe\x44\x64\x8d\x87\x42\ \x62\x8b\x9b\x91\xce\xc8\x54\xe6\x79\x0d\x34\x66\xe0\x41\x98\xf4\ \xd7\xd5\xdf\xe7\x2f\x75\xc5\x99\x33\xb5\x6a\xb4\x13\xc9\xa0\xf9\ \xee\x03\x2e\xa4\x2e\xae\xc6\xa8\x11\x56\xa4\xa4\x6d\x93\x1e\xaa\ \x1a\x9d\x15\xb7\x51\x1a\x31\xcc\x1f\x99\xcb\x6b\xf0\xc5\x41\xe6\ \xb5\x7a\xe4\x26\xa6\x8d\x18\xa2\xe3\x3a\x5c\x7a\x0c\x79\x1e\xc8\ \x49\x0b\x46\x64\xe4\xbd\xf2\x40\xfe\x77\x78\x7f\x99\x87\xf9\xd1\ \xef\xe3\xa7\x1b\x91\x9b\x0f\x0c\x1e\x14\x84\xac\xac\x1d\x52\xbb\ \xfa\x81\xf8\xc4\x12\x69\xd4\xb0\x2e\xca\x82\xff\xfc\x46\xf2\xa8\ \x8b\x78\x28\x15\x23\x86\xaf\xd1\x3d\x89\x51\x54\x32\x07\xe9\xe1\ \x6f\x96\xb0\x68\xb6\x19\xc3\x5f\xac\xc3\x8b\x91\xfb\x30\x72\xa8\ \xd5\x83\x7d\x12\x7e\x76\x7a\x3d\xc2\x9e\xb0\x63\x79\xde\xae\xef\ \xdd\x2b\x7a\xa0\x8e\x6c\xd1\xa2\x6d\xd2\xc0\x01\x46\x24\x66\xd4\ \x28\x3b\x0e\xc4\x92\xb7\xfa\x85\xb3\xef\x63\x60\x6e\x1a\xd0\xeb\ \xf5\x72\x87\xe5\x0f\x83\xde\x2e\x57\xa9\x4e\xc4\xfc\x39\x04\x13\ \x5e\xef\x83\x27\x9e\x19\xe0\xe6\xb8\x67\x2f\xe9\x90\x66\x63\xe8\ \x15\x2e\x79\x54\x9d\xed\xee\x89\x09\x44\xf4\x10\x0b\xd2\x72\x74\ \x38\x5f\xe9\xf0\x08\x7d\x62\x36\xee\x12\xa6\x53\x7b\x01\xd2\x40\ \x93\xcb\x89\x9a\x3a\x87\x9b\xef\x84\x47\x06\x28\x80\xb8\xcd\x53\ \x54\x8a\x4d\xae\x86\x59\x5f\x87\xb5\x1b\xbe\x7c\xe0\x5d\xba\x36\ \xed\x4a\x90\x3d\xf6\x8c\x74\x60\xd2\x9c\x3b\x28\xad\x70\xb7\x7f\ \xb1\x36\x7a\x3a\xc2\x4f\xee\x0b\x1c\xf7\x1b\x1b\xbd\xab\xd5\x6c\ \x4e\x83\x08\x99\x96\xde\x2c\x9b\x98\x1e\xb9\x39\xd3\x3b\x7f\x6f\ \x94\xfa\x85\x0b\x17\x74\x78\x27\x49\x87\xde\x91\x2e\xb7\x5c\x40\ \x20\x68\x5e\x51\x7a\x04\xb7\xef\xd4\xc3\xd1\xe0\x03\x93\xaf\xdd\ \xad\x81\x11\x7d\xe8\xea\x4d\xb9\x4c\x8e\xbb\x0d\x8b\x3f\x14\xe1\ \xc3\x23\xc7\x4b\x9d\x0e\x40\x69\x50\xa6\x8c\x66\x67\xcf\xd5\x63\ \x51\x82\x05\x83\x9e\x85\x47\x42\xf2\x16\xd7\xc5\xae\x8e\xee\x57\ \xcc\x26\xb5\x51\x0e\xbb\x4d\x58\xb6\x78\x6a\x9b\x85\x6f\xf7\xee\ \xf4\xdc\xb9\x63\x59\x79\x85\x5d\x6e\xf8\x65\xb3\xe9\x61\x68\xb5\ \x56\xd2\xb6\xa3\x0e\xa7\x11\xdf\xde\x76\xb5\x8b\xf9\x0e\xdb\x5e\ \x27\x4d\x5c\xbc\x22\x29\x20\xa2\x7a\x31\xaf\xd5\xab\xb6\xee\x21\ \xb3\x21\x9b\xd7\x1b\x5a\x98\x7f\x32\xe2\x37\xff\xbf\xef\x03\x34\ \xe2\xe2\x7e\xc1\x2a\x4e\x3b\xf0\x5e\x86\x2f\xba\x85\xea\x3d\x34\ \x20\x66\x6b\xda\x6e\x27\xe6\x43\x83\x5c\xd8\xb4\xe5\x40\xbb\xbf\ \x93\x75\xc8\x37\x32\x6a\xb2\xfb\xf5\x37\x29\x82\x51\x44\x51\xfb\ \x02\x4d\xd7\x45\xc2\x13\xf3\x16\xab\x51\x36\x9b\x39\x8f\xdf\x57\ \xca\x84\x84\x71\xec\xd4\x99\x06\xd8\x52\x4d\xe8\x1e\xe6\xbc\x6f\ \xff\x82\xcd\x3f\x29\x6b\xa8\x2d\x71\xfe\x91\x7e\xa5\xa4\x64\xf7\ \x5c\x94\x59\x89\x2c\x64\xe7\x24\x38\x8d\xff\x5c\x71\x62\x72\x52\ \x33\xba\x87\x9b\x3b\x54\xf8\x4e\xf9\x4e\x4c\x83\xb6\x3d\xf6\xee\ \xab\xc3\xfc\xd8\x16\x5f\xa0\xda\x66\xe8\x10\x33\x32\xb3\x76\x75\ \xfc\x9f\x1b\x10\x80\xce\x38\xfe\xbe\x25\x86\x0d\x1f\xf9\x63\xf6\ \xd2\xf0\x68\xb6\x32\xef\x0d\xd6\x59\xef\x91\x3a\xf3\xcf\x6d\xaa\ \x6e\x6c\x63\x55\xb7\xae\x29\xfd\x76\x67\xbd\xe3\xbf\x02\x0c\x00\ \x9c\x1e\x2f\xdc\x5a\xba\x11\x34\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x02\x8c\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x02\x1e\x49\x44\x41\x54\x78\xda\xa4\ \x53\x5d\x48\x53\x71\x14\xff\xfd\xef\xdd\xdd\x76\xaf\x0f\x5a\x4d\ \x4c\x4c\x50\x18\xd1\x43\x8f\x06\x49\x0f\x25\x04\x7e\x3c\x88\x65\ \x51\x12\xb1\x1a\x12\xbd\xf4\x65\x36\x88\x82\x5e\xa2\xb2\x09\x86\ \xb5\x06\x71\x8d\x86\xa5\xb0\x87\x1c\x06\x05\x96\x16\x88\xd0\x97\ \x45\x4f\x19\x44\x0f\x25\xac\x58\x73\x4e\xef\xee\xe6\xe6\xdd\x69\ \xbb\x03\xc7\xd8\x9d\x3e\x74\xe0\xf0\xff\x73\xce\xef\xfc\xce\xe1\ \x7c\x30\x22\xc2\xff\x88\x69\x3d\xe7\xed\x3e\x27\x6d\xb3\xfd\x42\ \x45\xf5\x31\xb4\xb5\x9d\x60\x46\x18\x56\xaa\x82\x9b\x37\x1c\xe4\ \xec\x8c\xc0\xb6\x89\xc3\x9b\xb7\x09\xa4\x84\x2e\xb4\xb4\x3a\x8a\ \x48\x38\xa3\xe0\xbe\x5b\x4e\x3a\x79\x70\x01\xcb\x0a\xb0\xb0\x98\ \xc6\xbe\xdd\x56\xb0\xc4\x28\x5e\x4e\x8c\xd0\x86\x04\x6e\xf7\x29\ \x3a\xde\x1e\x42\x99\xc8\xc1\xfd\x80\xc3\x80\xbc\x8a\x74\x9a\xb0\ \x7f\x8f\x15\xc9\xa8\x0f\x53\x93\x7e\x2a\x49\xe0\xb9\x77\x91\x8e\ \x34\x07\x51\x65\xe3\x31\x32\x4e\x88\x44\x4d\xf8\xfe\x53\xc2\xf3\ \xa9\xb8\xee\x6f\xd9\x2b\xe2\xef\xbc\x8c\x99\x99\x71\x2a\x22\x18\ \x92\xaf\x52\x73\xe3\x37\xd4\x6c\xe5\xa1\xc6\x09\xef\x67\x55\xe4\ \xfa\xa3\x61\xe2\xb5\x8a\xd4\xca\x8a\x8e\xeb\x6c\x95\x30\xf7\xe5\ \x2e\x3e\x7c\x7c\x45\x6b\x04\x63\x63\x1e\x6a\xd8\xf1\x19\xf5\xb5\ \xb9\xa1\x48\x22\x83\xe7\xba\x00\x4d\xd3\x50\x5d\x11\x86\xfb\x8a\ \x04\x93\xd9\xbc\x56\xa9\xe3\x50\x19\xa6\x27\xfb\xf3\x15\x44\x82\ \x01\xec\xdc\x2e\x14\xf4\x42\x30\x5b\xf4\x37\x18\xd9\x82\x3f\x61\ \x02\x63\xf9\x01\x64\x7f\x4d\x8d\x1c\x02\x01\x99\x74\x82\xb0\x62\ \xc7\xef\x90\x66\xbc\x0c\x8c\xc7\xe3\x00\x5f\x60\x0a\x85\x35\x4c\ \x7f\xaa\x43\x47\x47\x37\xd3\x09\x2e\xb9\xbc\xcc\xff\xa2\x12\x8b\ \x4b\xe9\xc2\xd8\x8c\x57\x32\x2b\xf8\xfa\xc3\x82\x77\xb3\x31\xdd\ \x16\x5d\x4e\x63\xf8\xd9\x66\x9c\x3d\x7f\x9f\x15\x34\xf1\x42\xef\ \x43\xe6\x0b\x94\x43\x51\xf3\x53\x32\x65\x12\xd7\x56\x29\xb8\x76\ \x6e\x15\xe5\x62\x0c\xf1\x04\x41\xf6\x5b\x33\x09\x7d\xcc\x70\x8c\ \x3d\xbd\xc3\x6c\xc8\x2f\xea\xc0\xac\x34\xed\x5a\x82\xbd\x26\x06\ \x7b\x9d\x80\x7a\x7b\x25\xbc\x4f\x78\xb8\x2e\xfb\xd9\x86\xab\x3c\ \x38\xd0\x45\xdd\x87\x55\x58\xcc\x39\x6c\x32\x45\x7a\x70\x8f\xeb\ \x69\xf1\x3d\x64\x09\x8c\xd4\x3b\x78\x94\xd4\xf9\x76\x5d\xef\xf4\ \x1f\xa0\x52\x38\xb6\xde\x39\x3f\x92\x1d\x94\x88\x27\x71\xfa\xcc\ \x28\x2b\x85\xf9\x27\xc0\x00\x2f\x57\xf6\x04\xe3\x5b\xab\x6c\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\xa8\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \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\x0b\x13\x00\x00\ \x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd7\x02\x01\x11\x1d\x02\x0d\x15\x76\x45\x00\x00\x06\x35\x49\x44\ \x41\x54\x58\xc3\xbd\x96\x7b\x50\x54\x75\x14\xc7\xbf\xbf\xbb\xf7\ \xee\x7b\x97\x15\xcd\xeb\x0b\x15\x6b\x34\x29\xcd\xc9\x1e\x52\xa9\ \x28\xec\xc2\x52\xb8\x58\xa6\x39\xbe\xc6\xc4\x50\x28\x54\x4a\x1e\ \x39\x58\x29\x22\xe0\x90\xf8\x00\x31\x1b\x53\x08\x0b\x24\x73\x11\ \x69\x22\x52\x33\x33\x73\x46\xca\x1c\x5f\x29\x45\x9a\xe0\x12\x2c\ \xcb\x5d\x44\x16\xee\xdd\xdb\x1f\x29\x0f\x97\xc5\x15\xb3\x33\x73\ \x67\xee\xfd\xfd\x7e\xe7\x7c\x3f\xbf\xfb\xbb\xe7\x9c\x4b\xd0\x4b\ \x3b\x5e\x16\x62\x2c\x2c\x69\xce\xa6\x25\xb0\x2f\x9a\xa5\x8e\x18\ \x3d\xa1\xf4\x64\x6f\xe2\x50\xbd\x71\x2a\xdc\xad\x8f\x4a\xde\xd2\ \x58\x32\x78\x00\x3d\x9c\xa6\xc9\x98\xc4\x74\xdb\xd1\xaf\x8a\x0c\ \x33\xf0\x7f\xd8\xde\x5c\xfd\x8a\x29\xfa\x09\x62\xde\x8e\x20\x91\ \xb7\x98\x44\xde\x62\x12\x73\x36\x05\x8a\xc6\x17\xfd\x85\xd2\xbd\ \xc1\xb3\x1f\xa8\x78\xe1\x6e\xfd\xf2\x80\xa0\x09\xe2\x81\x02\x43\ \xbb\xf8\xed\x6b\x5f\xbe\x41\x0c\x79\xd1\x5f\x28\x29\x34\xcc\xb9\ \x97\x98\x92\x7b\x11\xdf\x96\x67\xdf\xb8\x32\x52\x8b\x90\xc9\x0a\ \x97\xf9\x51\x23\x18\xa8\x95\x84\x64\xe7\x35\x4d\xcf\x4c\xf6\xfb\ \xe3\xb3\xa2\xca\xd3\xff\x19\x40\xc1\x6e\xfd\xb2\x9c\x4f\xed\x99\ \x2b\x97\x68\x11\x3c\xa9\x43\xdc\xd1\x2a\x82\x96\x90\x0e\x88\x87\ \x19\x68\x54\x84\x64\xe7\x35\x85\x6f\x4c\xf6\xbb\xf2\x59\x51\xe5\ \x2f\xf7\x0d\x50\xb8\x4b\x1f\x93\x93\x6f\xdf\x14\x1f\xa9\x85\x7e\ \x62\x87\x78\xe6\x27\x0e\x14\x7f\x7d\x13\x53\xfc\x25\xa0\x24\x54\ \x17\x08\xb5\x8a\x90\xec\xdc\xa6\x69\x1b\xd7\xfa\x5d\xfb\xfc\x8b\ \xca\x8a\x5e\x03\x14\xec\xd2\xbf\xb9\x3d\xdf\xbe\x39\x7e\xa9\x17\ \x82\x5e\xe8\x10\x2f\xfb\xbe\x15\x07\xca\x15\x68\x6c\x52\xa0\xa6\ \xba\x0e\x13\xc6\xab\xba\xf8\x3d\xda\x01\x11\xb6\x31\xb9\x67\x08\ \xb7\x00\xa5\x7b\x0d\xf3\xb3\x72\x9b\xb6\xc7\x2e\xd6\x12\x43\xa7\ \x9d\x5f\xbb\x2e\x20\xe3\x23\x09\x44\xd0\x20\x84\xe0\xea\x75\x39\ \xbc\x55\xf5\xf0\x1d\xae\x74\x81\x90\xcb\x41\x3e\xda\xd3\x14\x96\ \x95\xf6\xd8\xa5\x4f\x0b\x2b\xcf\x78\x5c\x07\x8e\x96\x06\x9b\xb6\ \xe6\xda\x77\x46\xce\x51\x93\xce\x67\x0e\x00\xbb\xbf\x10\x20\x88\ \xd2\xf6\x67\x42\x31\xd8\xb9\x4f\x01\x6b\x9d\xdd\x25\xce\x0c\xa3\ \x0a\xaf\x85\xa9\xc8\x96\x5d\x5c\xee\x91\x92\x90\xe9\x1e\x01\x54\ \x1c\x31\x06\x7c\xf8\xb1\xbd\x70\x46\xa8\x4a\x32\x3d\xb8\xeb\xae\ \x2a\xce\xb6\xe1\xd7\x8b\x32\x97\x20\x82\xe8\x85\xdc\x22\x7b\xb7\ \x6f\x72\xfe\x2b\x2a\x04\x4f\x52\x48\x32\x77\x72\x05\x3f\x7e\x63\ \x0c\xe9\x11\xe0\xe2\xc9\xd0\xf1\xa9\xdb\xb8\x03\x53\x9f\x93\x4b\ \xe7\xbf\xdc\xf5\x5c\x9d\x4e\x11\xbb\xf6\x02\xc4\xcd\xa9\xfd\x78\ \xe6\x21\x5c\x38\x5f\xdf\xed\x5c\xd4\x7c\x0d\x9e\x79\x42\xc6\x64\ \xec\xe0\xbe\xac\xf8\xce\x18\xd0\x2d\x40\xf5\xb9\x97\x46\xae\xdd\ \xc2\x7d\x35\x76\x34\xa3\x8e\x9a\xa7\x71\x09\xc2\xd9\x45\xf0\x8e\ \x1b\x50\xd2\x16\x08\x42\x4b\xfb\xb8\x28\x3a\x41\xa3\x1e\xac\xd6\ \x82\x33\x3f\x5f\x86\x28\x8a\xdd\x42\xac\x8c\xd4\x62\xa4\x2f\x23\ \x4f\xcf\xb1\x97\x9c\x3d\x1e\xfa\x6c\xfb\x11\x02\x00\x57\x15\x36\ \x24\x36\xd9\x76\xac\x5f\x1f\x6a\xd8\xda\xb7\x75\x20\xa4\xfb\x0f\ \xb3\xa5\xf9\x06\x9a\xed\x1c\x12\x33\x75\xe0\x6e\xfc\x0b\xc9\x90\ \x3a\xac\x8e\xf8\x03\xde\xfd\x59\x68\xfa\xf4\x05\x23\x95\xb9\xcd\ \x2a\xa7\x53\xc4\xb2\x0f\x6c\x68\x71\xa0\x2e\x6b\x8d\xee\x09\xa5\ \x4f\x71\x35\xc5\x5b\x4c\xba\xa4\x8c\xc6\x32\x85\x9c\x0c\xfb\x60\ \x85\x97\x5b\x71\x00\x90\x2b\x55\xf0\x66\x07\x42\x42\xd3\xed\x63\ \xad\x82\x14\x2a\xed\x43\xf0\x66\x07\xf5\x28\x0e\x00\x14\x45\x90\ \x12\xe7\x85\x46\xce\xd9\x2f\xe3\x63\xae\x80\xb7\x98\x24\x92\xc1\ \x43\x87\xa4\xfc\x7e\x85\x0f\xcb\x5c\xdd\x07\x34\x4d\x3c\x2a\xcb\ \x07\x0f\x3b\xd1\xe2\x60\x6e\x3d\x49\x21\xa7\x1b\x30\xe6\x31\x2f\ \x8f\x7c\x65\x52\x82\xc7\x47\x31\x58\x9f\xcd\x0d\x1d\x39\x82\xb6\ \x50\x17\x2a\xf9\x88\x67\xc6\xc9\xc0\x30\xa4\x57\x0d\x8a\x10\x82\ \xd2\x63\xde\xb0\x59\xed\x9e\x37\xb5\x83\xcd\x18\xe7\xc7\x5c\x7b\ \xe1\x29\x59\x11\xe5\x33\x50\x72\xa8\xf0\xa0\x03\x55\x7f\xf1\xbd\ \xee\x92\xbc\xa8\xc3\x9e\xfd\x9c\x47\x6b\x4b\xbe\xbd\x89\xd3\xe7\ \x5a\xf9\xd8\xc5\xda\x99\xb2\x41\xc5\xb5\x54\xcc\x42\xcd\xdc\x89\ \x4f\xd3\x3f\xc5\xbc\xdf\x80\x9a\x5a\xc1\xb3\x5d\xc3\xf5\x6d\x1d\ \xad\xe8\x87\xaa\xaa\x86\x1e\xfd\x7e\x38\xe5\x40\xc6\x0e\x0e\xaf\ \xcf\x52\x2f\x7f\xdc\xbf\xf4\x38\x00\x50\x34\x6b\x6e\x4a\x8a\xf1\ \x32\x8c\xf3\x93\x9e\x7a\x73\xb5\x15\xf5\x0d\x77\x87\x90\xd0\xae\ \xa9\x46\x28\x15\x3e\x29\x70\xb8\x4d\xc3\x53\x67\x5a\xb1\x2a\xdd\ \x86\x37\x66\xab\x37\x84\xcf\x2e\xcb\xea\x52\x07\x68\xd6\xcc\xad\ \x89\xf5\xd2\x8f\x1a\xc1\x9c\x8e\x4e\xb2\x82\x6b\x72\xf6\x08\x20\ \x67\x3a\x09\x3b\x6d\xe8\xaf\xf9\x13\xa2\x28\xe2\xe2\x55\x16\xc7\ \x4f\xd4\xba\xac\x3f\xfb\x5b\x1b\xde\x5e\xd7\x80\x85\x33\x55\x39\ \xb3\x4d\xaa\xb8\x6e\x0b\x11\xcd\x9a\x1b\x52\xe2\x74\x41\x3e\x83\ \xe8\xb3\xd1\x49\x56\x34\xdf\x14\xdd\x03\x74\x6a\x0f\x4a\x99\x03\ \x89\x91\x3c\x9e\x7c\xb4\x16\xbc\x20\xe0\xf2\x85\x6b\x5d\xd6\x5e\ \xaa\x6a\xc3\x5b\xef\x59\x31\x37\x5c\x95\xbf\xe0\x15\x75\x14\xcd\ \x9a\xdd\x97\x62\x9a\x35\xd7\xa5\x26\xe8\x02\xfb\x79\x4b\x2e\x2e\ \x7b\xdf\x8a\xd6\xd6\xee\x21\x94\xf2\x4e\xf7\xd2\x16\x28\x54\x4a\ \xc4\x45\xf7\xc5\x9a\xa5\x57\x61\x0c\xf2\x6e\x9f\xbb\x52\x2d\x20\ \x3a\xc9\x8a\x19\xa1\xca\xfd\x11\xaf\xa9\x17\xd0\xac\x59\xbc\x6b\ \x33\x92\x0d\x2c\xb6\xa4\xc5\xeb\xa6\x2a\x14\xe4\x72\x6c\x72\x03\ \xda\x78\x57\x08\xa5\xa2\x63\x8c\x22\x62\x7b\x61\xf2\x1b\xeb\x8b\ \xfe\x3e\xc3\x01\x00\x35\xb5\x02\x96\xae\xaa\x47\x68\x80\xa2\x2c\ \x6a\x9e\x66\x26\xcd\x9a\x05\x8f\xdb\xb1\xd2\xa7\xb8\x3a\x2d\x41\ \x17\x28\x8a\xa8\x7a\x67\x9d\x0d\xfc\x1d\x10\x93\x9e\x76\xe2\xd9\ \x47\x7e\xc5\xa8\x01\xe7\xe1\x3b\xe0\xba\x4b\x56\xd4\xd4\x0a\x58\ \x9c\x50\x8f\x00\x7f\xd9\xe1\xe5\x8b\xb4\x26\x9a\x35\xb7\xb9\xcf\ \xa8\x1e\xac\xee\x52\xd8\xd0\xc4\x74\xdb\x21\xb9\x94\x3c\xbc\x61\ \x95\xae\xcb\xff\x1f\x00\xf0\x6d\x6d\x70\x3a\x9d\x60\xa4\x52\x90\ \x5b\x35\xbc\xda\x22\xe0\x8d\xc4\x7a\x04\x3e\x27\x2f\x5f\x11\xa1\ \x0d\xa3\x59\x73\x4b\xcf\x29\x7d\x17\xe3\xaa\xc2\x06\xc7\xa5\xda\ \x0e\xc9\x18\x32\x32\x3d\x51\x07\x89\xc4\xbd\xcb\x6d\x71\xc3\x44\ \xf9\xd7\x31\x0b\xb5\x26\x9a\x35\x3b\xee\x5e\x53\x3c\xb0\x1b\x57\ \xa7\x0d\x48\x48\xb5\x1d\xa2\x69\x8c\x4e\x8d\xef\x1e\xe2\xb6\xb8\ \x71\xb2\xe2\x60\xf4\x02\xcd\xcb\x34\x6b\x6e\xf5\xac\xa8\x79\x68\ \x8e\xea\x69\xfd\x13\xd2\x6c\xe5\x14\xc1\x98\xf5\xf1\x3a\x50\x14\ \xe9\xf2\x9f\xb8\x64\x55\x3d\x42\xa7\x28\xcc\x4b\xe7\x6a\x5e\xed\ \xe9\xcc\x7b\x0d\x00\x00\xbc\xc5\xd4\xf7\xdd\x0d\xb6\x72\xd1\x89\ \x71\xeb\x56\x7a\x81\xa2\x08\x2e\x54\xb6\x21\x2e\xc5\x06\x93\x41\ \xf1\xf9\xa2\x59\xea\x79\x34\x6b\xbe\xa7\xa6\x72\xcf\x2d\x90\xb7\ \x98\xfa\xac\xcf\x6a\x3c\x50\xf3\xb7\xf3\xf9\x69\x41\x0a\x6c\xdf\ \x63\x17\xe7\x84\xab\x12\xc3\x0d\xca\xb4\x3b\x8b\xcc\x03\x33\xde\ \x62\x92\x6e\xdf\x1c\xb8\x35\x76\xd9\x24\xeb\x89\x72\x63\xe8\xfd\ \xc4\xfa\x07\x16\xd6\x69\xc5\x45\xde\xc7\x7f\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\x0c\ \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\x1b\xaf\x00\x00\ \x1b\xaf\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd7\x0c\x1c\x0b\x31\x3b\x67\xd3\x82\x66\x00\x00\x04\x99\x49\x44\ \x41\x54\x78\xda\xa5\x55\x5d\x48\x64\x65\x18\x7e\xe6\xcc\x9f\xff\ \x4e\x88\xbf\xad\x4e\xce\xe8\xec\x68\xe9\x62\x20\x76\xb1\x26\x95\ \xe0\xb6\x5d\x2d\x6d\xc4\xae\x17\xe1\x55\x14\xe6\x85\x8a\x46\x17\ \xe2\x7a\x25\x4a\x48\x17\x11\x0a\x09\x11\x11\xc4\x8a\x11\x2b\xe5\ \x4f\xcb\x6a\x8b\xcb\x48\x6a\xd6\xd8\x34\xea\xe8\x8e\xab\xe3\xff\ \xfc\xff\x9e\x99\x39\xa7\xf7\x3b\x71\x16\xd4\xc2\xa2\x07\x1e\xe6\ \xcc\xf9\xbe\x79\xbf\xf7\x7d\xde\xe7\x7b\x47\x81\x7f\x81\xf1\xf1\ \xf1\xb7\xd2\xd3\xd3\xcb\x95\x4a\x25\xf6\xf7\xf7\xd7\x9a\x9b\x9b\ \xef\xe2\xff\xa2\xba\xba\x5a\x65\xb1\x58\x62\xa1\x50\x48\x64\x5c\ \x58\x58\x88\xd5\xd6\xd6\xaa\x70\x01\x38\x9c\x41\x4f\x4f\x4f\xfd\ \xd0\xd0\x50\x93\xfc\xbd\xb0\xb0\xb0\x88\xb2\x55\xb3\x6c\x19\xd3\ \xd2\xd2\xd4\x45\x04\x79\x7d\x72\x72\xf2\xda\xe8\xe8\x68\x3d\xce\ \xe0\x94\x14\x7d\x7d\x7d\xb7\x08\x5f\xa8\x54\x2a\x6e\x6c\x6c\xec\ \x4e\x59\x59\x59\xa5\xc9\x64\xba\x51\x52\x52\xa2\x05\x41\x14\x45\ \x89\xbb\xbb\xbb\x31\x87\xc3\x31\xae\xd1\x68\x6c\x54\x51\x4f\x22\ \x91\x10\xa6\xa7\xa7\xdf\x69\x69\x69\xf9\x1a\x67\xd1\xde\xde\x5e\ \xbf\xba\xba\xca\xfb\x7c\x3e\x51\x2e\x3b\x1c\x0e\x4b\x9f\xc1\x60\ \x50\x0c\x04\x02\xa2\xdf\xef\x17\xbd\x5e\xaf\xe8\xf1\x78\x44\xb7\ \xdb\x2d\x9e\x9c\x9c\x88\xc7\xc7\xc7\x22\xe9\x2e\xda\xed\x76\xbe\ \xbb\xbb\xfb\xaa\x1c\xef\xa9\x56\x54\x6e\x1a\x65\xc3\x45\x22\x11\ \x64\x64\x64\x80\xb2\x06\x43\x38\x1c\x81\xc3\xe9\x82\x3f\x18\x41\ \x32\x29\x20\x3d\x55\x03\xfd\xb3\xb9\xd0\x68\xd4\x2c\x7b\x7a\x97\ \x04\xcf\xf3\xa0\x24\x38\x42\x86\x1c\x4f\x29\x3f\xcc\xcd\xcd\x39\ \x8c\x46\x23\xca\xcb\xcb\x5f\x11\x04\x01\xa9\xa9\xa9\xb0\x3b\xb6\ \x61\x59\x71\x20\x29\x72\x10\x88\x7c\x42\xc0\x89\x37\x8c\xe5\xdf\ \xb7\xc0\x21\x89\x67\xb2\x33\x10\x8b\xc5\x58\x50\x4c\x4c\x4c\xdc\ \xe9\xed\xed\xfd\xfc\x5c\xc6\x0c\x59\x59\x59\x2f\x50\x50\x69\xf3\ \xe2\x8a\x0d\x6b\xce\x13\x6a\x56\x0a\x3c\xbe\x20\xe2\x89\xa4\x44\ \x9e\x4f\xd0\x01\x22\xee\x2f\x6c\x20\xc6\xc7\x71\x29\x5f\xc7\xf6\ \xb3\x2a\xcd\x90\x21\x67\x5c\x57\x57\xa7\x22\x16\x37\x36\x36\x7e\ \x9a\x9d\x9d\xad\x64\x25\xff\x68\xb1\xb3\xde\x4a\x52\x94\x17\xeb\ \x00\x21\x86\x9d\x7d\x2f\x42\x31\x01\x5e\x7f\x08\xc1\x50\x04\x36\ \x87\x0b\x95\x86\x5c\x30\x68\xb5\x5a\x33\xf5\xe7\x4b\x9d\x4e\x17\ \xa4\xe6\x0a\x8a\xe1\xe1\xe1\x9b\x55\x55\x55\x5f\x69\x48\x34\x5a\ \x54\x30\x6d\x1f\xbb\xdc\x78\xb8\xb4\x05\x25\x3d\xd7\x3c\x6f\xc4\ \xeb\x2f\x57\x81\x9a\x08\xb7\xc7\x83\x9f\x7f\xdd\x80\xc5\xea\xc2\ \x91\x3b\x80\x60\x30\x84\xdb\xd7\x6b\x70\xd9\x50\x28\x59\x31\x1a\ \x8d\x8a\xe4\x90\x38\x79\xbd\x99\xa3\xee\x9a\x48\x74\x0d\x4b\x8f\ \x35\x82\xf1\xf1\xce\x31\xf6\x0e\x3d\xf0\xf8\xa3\x88\x0b\xdc\xd3\ \x26\x69\x35\x1a\xbc\x76\xf5\x45\xbc\x7f\xfb\x55\x7a\xaf\x80\xeb\ \xd0\x0d\xdb\xd6\x01\x0b\x2a\xad\x2b\xfe\x82\x86\x1c\x64\xe2\x98\ \x3e\xf1\x78\x1c\x74\x12\xa3\xb4\xe1\xe0\xd8\x8b\xbb\xdf\x3f\xc2\ \xdc\xd2\x26\x5c\x27\x61\xc8\x20\xfd\xa5\x75\x97\x3b\x86\x95\xb5\ \x3d\xd8\x37\x5d\x14\x8c\x63\xef\xe5\xdf\xb3\x58\x8c\x0a\x15\x95\ \xe8\x20\x2f\xc6\xc9\x6e\xaa\xcc\xcc\x4c\x05\x08\xa6\xd2\x02\x29\ \xcb\x48\x94\x47\x30\x92\x80\x0c\x7f\x8c\xc3\xec\xe2\x21\x7e\x98\ \xfb\x4d\xd2\x9f\xb6\xe0\x32\xed\x95\x03\x32\xaf\x53\xbc\x04\xf9\ \x7e\x43\x35\x38\x38\xf8\x4d\x4e\x4e\xce\x77\x15\x15\x15\x97\x3a\ \x3b\x3b\xad\xf9\xf9\xf9\x1a\xf3\x73\xb9\x30\x96\xe4\xe1\xd0\xe7\ \xc3\x4f\xcb\x5b\x28\x2b\x2d\x86\x36\x2d\x0b\xf6\x9d\x04\x9c\x4f\ \xfc\xa4\x65\x04\xa1\x80\x0f\x65\xfa\x3c\x98\xf4\xb9\xe4\x94\x18\ \x0e\x0e\x0e\xf8\xfe\xfe\xfe\x6a\x9b\xcd\xf6\x84\x9a\x18\x91\x5c\ \x41\x97\x22\xb1\xbd\xbd\xed\x6e\x68\x68\xb8\x92\x97\x97\x57\x09\ \xc2\x15\xb3\x1e\xf7\xee\x2f\x92\x2b\xa2\xd8\xf7\x09\xf0\x47\x15\ \xf0\xf9\x03\x70\x3a\x9d\xd8\x5c\xb7\x21\x1a\xf2\xe2\xe3\x0f\x6f\ \x21\x3d\x85\x93\x32\x5e\x5f\x5f\x1f\x1f\x19\x19\xf9\x8c\xa4\x8d\ \x9f\xf3\x31\x5d\x51\x2b\x2d\xdc\x64\x37\x29\x37\x5b\x8d\x4f\x3e\ \x7a\x1b\x83\xa3\x53\x78\x34\x37\x03\xeb\x2f\x3a\x30\x04\xfc\x3e\ \xe8\x0b\xb3\x31\x3c\xf4\x01\xcc\x86\x02\x96\xa9\x14\x98\xe4\xb4\ \xfe\xed\x10\xa2\xd3\x9a\xe8\xd6\x4d\xa8\xd5\x6a\x25\x81\x5d\x69\ \x89\x6a\x72\xc2\x1f\x9b\xfb\x58\x77\x1e\x82\x53\x28\x60\x36\x16\ \x51\x35\x25\xcc\x01\x60\x60\x49\xd0\xfc\x00\xe9\x9a\x5c\x5a\x5a\ \x7a\xa3\xa3\xa3\x63\xf2\x54\xc6\x54\x4a\xc2\x60\x30\x88\x34\x16\ \x21\x8f\x48\xb2\x21\x44\xea\xb8\xb9\x34\x9f\x91\x05\x63\x64\xd2\ \x9d\x72\x0a\x25\xc3\xdc\x22\xba\x5c\xae\xc4\xb9\x59\x31\x3f\x3f\ \xbf\x45\xe3\xd1\xa5\xd7\xeb\xaf\xd3\x66\x91\x66\xc7\x20\x35\x61\ \x2f\x25\x25\xc5\x48\x73\x43\xc5\x02\xca\x81\x8e\x8e\x8e\xa2\x56\ \xab\xf5\xdb\xe5\xe5\xe5\x7b\xd4\x93\x97\xe8\x20\x61\x66\x66\xe6\ \xbd\x81\x81\x81\x31\xfc\x13\xda\xda\xda\x9a\xba\xba\xba\x6e\x30\ \x99\x18\x6b\x6a\x6a\x4c\xb3\xb3\xb3\x02\x8d\x54\x91\xf1\xc1\x83\ \x07\x02\x7b\x27\xaf\x53\xe9\x6f\xb6\xb6\xb6\x5e\xc3\x7f\x45\x41\ \x41\x81\x76\x6a\x6a\x8a\x27\x1b\x89\x8c\xf4\x8f\xc1\xd3\x1f\x88\ \x16\x17\x40\x85\x0b\x40\x43\x9c\xa7\x8c\xdf\xa5\x60\x26\x10\x48\ \xc7\x35\x22\x8f\x0b\xf0\x27\x9b\x2f\xb2\xa4\xb3\x87\x63\xc7\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x21\ \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\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\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\x01\x9e\x49\x44\ \x41\x54\x38\x8d\xd5\xd5\x5d\x4f\xa3\x40\x14\x80\xe1\xf7\x0c\x38\ \x6d\x19\x1a\x5d\x13\xdb\x78\xe1\x57\xff\x28\xe1\x77\x9a\x88\xbd\ \x30\xc6\x26\xab\x75\x57\x40\xed\x30\xb3\x17\xa4\xd4\x0a\xdd\xb0\ \x6b\x7a\xe1\x5c\x0d\x73\x98\x27\x87\x33\x70\x10\xef\x3d\xfb\x18\ \x6a\x2f\xea\x3e\xe1\x70\x3d\x49\xd3\xf4\x01\x98\x7c\xc1\x5a\x24\ \x49\x32\x5d\x5f\x7c\xcc\xf8\x2b\x68\x6b\x7f\xf8\x39\x9a\x24\x49\ \x2f\xa5\x3e\x73\x8f\x88\x90\xa6\x69\x2b\xde\x82\x01\x16\x8b\xc5\ \x4e\x50\x44\x88\xe3\x98\xb7\x37\x47\x10\x08\x71\x1c\x75\xde\xf7\ \x4f\x87\x27\x22\x18\x53\xa3\xb7\xb7\x4b\xb2\x6c\x89\xb5\xae\x3f\ \xac\xb5\xc6\x98\x18\xa5\x36\xe1\x75\xa6\xd6\x7a\xe6\xf3\x67\x9c\ \xf3\x58\xeb\xb8\xbb\xfb\xd5\x0f\xf6\x1e\xa2\x28\xa2\xaa\x20\x8a\ \x4c\x83\x46\x91\xc1\x5a\x4f\x96\x2d\xa9\xaa\x3a\xcb\xc1\x20\xe0\ \xec\xec\xb0\x1f\xec\x9c\xe7\xe6\xe6\x89\x2c\x5b\xe2\x3d\x8c\x46\ \x23\x8c\x31\x78\x2f\x5b\xa8\xd6\x01\x57\x57\xc7\xa8\x1d\xc5\x6c\ \x2d\xdf\xdf\xff\xa6\x28\x56\x54\x95\x63\x3e\x7f\x46\xeb\x01\xa0\ \xc8\xb2\xa7\xa6\x9e\x07\x07\x8a\xd9\xec\x07\xce\xad\x10\x91\x4e\ \xb8\xf5\x56\x9c\x9e\x8e\x79\x7c\x7c\xc1\x5a\xc7\xeb\xab\xe5\xfa\ \xfa\x67\x53\x4f\x80\x30\x54\xcc\x66\xc7\x78\xef\x28\x8a\x82\x38\ \x8e\xfb\x65\xac\x14\x9c\x9f\x6f\xea\xf6\xfe\x5e\x35\x68\x10\xd4\ \x99\x8a\x38\xf2\xfc\xa5\xbb\x06\xbb\x60\x11\x61\x38\x0c\x98\x4e\ \xcd\xd6\x7a\x8d\x1e\xa1\x94\x27\xcf\xf3\xbf\xa2\x9d\x30\x40\x51\ \x14\x9c\x9c\x18\xc6\xe3\x41\x83\x5e\x5e\x1e\x11\x04\x42\x9e\xe7\ \xf4\x69\xb5\x9d\x5f\x9e\xb5\x96\xb2\x2c\xb9\xb8\x38\xa4\x2c\x57\ \x0c\x87\x21\x55\x55\x3f\x7e\xdf\xfe\xdd\x09\x4f\x26\x9b\x7e\xa2\ \xb5\x6e\xe6\x51\x34\xea\x85\x76\xc2\x5d\x0d\xe5\x7f\xc6\xc7\x1a\ \xef\xee\x3c\xfd\xc6\xd6\x7e\xf9\x76\xff\xbc\x3f\xef\x17\xab\xe2\ \x01\x51\x83\x55\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x01\x3c\ \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\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\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\x06\xec\x00\x00\x06\xec\x01\ \x1e\x75\x38\x35\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd8\x0c\x1c\ \x14\x18\x23\xd6\xd5\xd3\x43\x00\x00\x00\xbc\x49\x44\x41\x54\x38\ \xcb\xed\x95\xc1\x0a\x82\x40\x14\x45\xcf\xe8\xe4\x62\x92\x90\x96\ \x05\xf5\x0b\xd1\xb7\x4b\xbf\xd1\x1f\x08\xba\x6a\x6d\xe5\x62\xe6\ \x4d\xb6\x28\xb4\x85\x88\x81\x42\x90\x77\x75\x07\xce\x3b\x0c\xbc\ \xc5\x53\xbc\xa2\x18\x37\xb5\x02\x56\xc0\x1e\x58\x8c\x24\x75\x40\ \xae\x81\x5d\x55\x55\xe7\xc7\xa3\x0e\xc7\xb0\x06\x81\xf2\xc6\x98\ \x83\x06\xa2\xb2\xbc\x86\x5a\x6b\x00\x6e\xb7\x7b\xef\x60\x1c\x2f\ \x1b\xae\xab\x8b\x48\x08\x44\xfa\xfd\xa0\x28\x72\x00\x92\x64\xdd\ \x2b\xce\xb2\x4b\xc3\x75\xf5\xcd\x66\x0b\x80\x06\x70\x4e\x30\x26\ \x06\xc0\x5a\xdb\x2b\xfe\xe4\xba\xba\x73\xd2\x8a\xbd\x17\x44\x64\ \x94\xcd\x79\xdf\x7a\x8e\xf5\xc0\xa4\xe9\x69\x10\x07\x1c\x83\xef\ \x36\x3e\x1c\x9f\xc5\xb3\xf8\x0f\xc5\xfc\xc6\x8f\xed\x04\x62\x3b\ \xd9\x69\x52\x53\x1d\xd3\x27\xd3\xf0\x95\x3a\x8b\x52\x56\x44\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x7e\ \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\x0a\x0d\x34\x15\x48\x65\x72\x06\x00\x00\x04\x0b\x49\x44\ \x41\x54\x38\xcb\xad\x95\x5d\x6c\x14\x55\x14\xc7\x7f\x33\xfb\x39\ \x9d\x6d\xbb\xd3\x65\x97\xdd\xd6\x65\x59\x3e\x96\x22\x05\xda\x92\ \x56\x8b\x1f\x58\x13\x1f\x30\x42\x34\x46\x7c\xd0\x17\xd3\xf8\x00\ \x35\x48\x55\x52\x03\xfa\x20\x46\x02\x18\x8b\x69\x6c\x1f\x44\x1f\ \x34\x8a\x92\xc8\x8b\x0f\x68\x0c\x31\x36\xc6\x88\x34\x41\x54\xac\ \x25\xb4\xb5\x36\xc5\xd6\xdd\xb6\xd3\x76\xbf\x67\x67\x77\x7c\x68\ \x77\x6c\xa9\x50\x4c\xfc\x27\x37\xe7\xe6\x9e\x73\xfe\xf7\x7f\xcf\ \x3d\x33\x57\x60\x01\x9e\x7b\xa3\xfd\xfd\x3f\x12\x95\x8f\xc6\xa6\ \xb4\x8a\x85\xeb\x92\xcd\x48\xfa\x5c\xf1\xbe\x95\xf2\x6f\x6d\x9d\ \xaf\x7e\xf6\x1d\xb7\x01\xa1\x38\xe9\xfa\xa0\xad\xf6\xec\x8f\xe1\ \x8b\xab\x23\x1b\xb3\xa1\x95\x3e\x31\x9e\x13\x9d\x55\x65\x4e\xf1\ \xcf\xb8\xc6\x54\x3a\xcb\xf4\xd5\xf3\x43\xa9\x64\xc6\x11\x56\xfa\ \xdb\xbb\x5f\x3b\xfd\xf1\x72\xc4\x96\x22\xe9\xf9\xfe\xc0\xd9\x55\ \x5b\x1e\x70\x0f\x0f\xf4\xdb\x07\x87\x87\x6d\x23\xbf\x0f\x8a\x23\ \x13\x93\xd8\x4a\x2b\x50\x9c\x76\x9c\xde\x75\xca\x74\xba\x50\x76\ \x3d\xe6\xdc\xb9\xeb\x11\xcf\xa5\x8b\xdf\xfc\x3a\x70\x2b\x62\x11\ \xe0\x87\x6b\xce\xe3\x77\xac\xb0\x0e\x27\x06\xbe\xba\xda\xe8\xbd\ \xf0\x74\x4f\xc7\x3e\xf1\xbe\x50\xef\xce\xdc\xcc\xf5\xd9\xd1\xc1\ \x2b\x46\x74\x36\x4e\x3c\x99\x40\xf1\x05\x90\x7d\x41\xc7\x2f\xb1\ \xad\x9f\xbe\xf4\xfa\x2e\x79\x59\x62\x35\x25\xad\xb3\xe4\x13\x33\ \xf7\xaf\x1f\x7d\xe8\xe8\x8b\xef\x7d\x02\x70\xec\xe0\x47\x5f\x36\ \x04\x47\x8f\x24\x54\x55\x48\xce\x4e\xa1\x65\x52\x00\xf8\x82\xeb\ \x45\xaf\xac\x8d\x4c\x68\xe1\xee\x65\x6b\xfc\xd4\xa1\x17\x3e\x0f\ \x3b\x72\x3f\xcf\xaa\x85\xc3\x0b\x9d\x0e\x49\xe0\xdb\xa9\x10\xab\ \x37\xd5\x2f\x4a\x72\xa7\xfb\x98\xf8\x6b\x9c\xca\xc2\xf4\x8d\x7c\ \xed\x9d\x6f\x77\x9d\x00\xb0\x02\x04\xcb\xe2\x5f\xa4\x26\xed\xdd\ \xc7\x8e\xbe\xb9\x64\xe7\x07\xdb\xba\x96\xac\x65\x3c\x77\x31\x3a\ \xd4\xc3\x87\x27\x17\xe9\xe0\xe5\x43\x07\x8f\x03\x27\xcc\x52\xa4\ \xc6\xed\xd7\x14\xb7\x97\x54\x6a\xee\xb8\xc9\x64\xd2\x1c\x26\x59\ \xfa\x9f\xb9\xc5\x66\x5f\x14\x37\x32\x3a\x42\x32\x99\xc4\xeb\xf5\ \xb2\xff\x40\x6b\xad\xa9\x18\x58\xeb\xf7\x07\x00\x48\x24\x13\xb8\ \x64\xd7\xbf\x2a\x2d\xc2\x28\x14\x00\x78\xec\xc8\x69\x74\x4d\xe3\ \xcc\xe1\x3d\x00\x28\x8a\x42\x2c\x16\x8b\x00\x97\xc5\xf9\xd8\xdd\ \x75\x5b\xeb\x49\xa7\xd3\x08\x08\xa6\xd2\xea\x86\x1d\x54\x37\xec\ \xa0\x5c\xf1\x02\x90\xcd\x66\xe6\x6c\x3a\xce\xba\xda\xbb\x59\x53\ \xd3\x00\x40\x89\x54\x02\xc0\x3d\x4d\xf7\x02\x6c\x36\x4b\x01\x3c\ \x5c\x59\x59\xb5\x48\xd5\xbb\xcf\x37\x33\xf0\xd3\xf7\x00\x8c\x8d\ \x0e\x81\x61\x90\xd7\x73\x64\xd2\x49\xe2\x33\x2a\x00\x43\x57\x7a\ \x79\x67\xdf\x76\x33\x27\x18\x0c\x01\xbc\x02\x20\xee\x3f\xd0\x5a\ \x2b\x49\x25\xd8\xed\x76\x3c\x1e\x8f\x19\x14\xf0\x86\xe8\x68\xd9\ \x46\x7f\x6f\x0f\x15\xde\x4a\x0a\x86\x31\x5f\x07\x83\x32\xb7\x87\ \x81\xcb\x17\xe8\x68\xd9\x46\xa8\x32\x02\x80\x2c\xcb\xf3\xe5\xf0\ \xb0\xff\x40\x6b\xad\x08\x44\x56\xfa\xfc\x00\xa8\xaa\x8a\x2c\xcb\ \xc8\xb2\x8c\x28\x8a\x84\xab\x36\xd0\xb9\xb7\xc9\x24\x17\x05\x01\ \x57\x79\x05\x03\x97\x2f\xd0\xb9\xb7\x89\x70\xd5\x06\x33\x5e\x55\ \xe7\x4e\x51\x5e\x56\x0e\x10\x11\x81\xcd\x77\x6e\xdc\x44\x2e\x97\ \x33\xac\x56\x0b\x33\x33\x33\xa8\xaa\x8a\x24\x49\xc8\xb2\x4c\x4d\ \xa4\x9e\x53\x6d\xcd\xf4\xf7\xf6\xe0\x5e\x11\x60\xb8\xef\x12\xa7\ \xda\x9a\xa9\x89\xd4\x9b\x84\xaa\xaa\x92\xcf\xeb\x24\x12\x09\x63\ \xed\x9a\xb5\x00\x4d\x62\x36\x9b\xdd\xe2\xf7\xfb\x71\xb9\x5c\x82\ \xae\xe7\x29\xcc\xdf\x78\x31\x41\x55\x55\x2a\x4a\x03\x74\x3c\xdb\ \x40\x7f\x6f\x0f\x6f\x3d\x53\x4f\x45\x69\xc0\xf4\x01\xe4\xf3\x3a\ \x08\xa0\x28\x8a\x10\x0c\xae\x22\x93\xc9\x96\x5a\x1d\x0e\xc7\xee\ \x48\x24\x62\xb6\xcb\xcd\xa0\x28\x8d\x7c\x7d\xb2\x71\xd9\xdf\x65\ \x75\x75\x35\x4e\xa7\xa3\xc5\x0a\x10\x8b\xc5\x98\x9c\x9c\xbc\x79\ \xdf\x16\x2f\xee\x36\x7c\x5e\xef\x5c\x6b\x16\x3f\x10\x34\x4d\xc3\ \xe3\xf1\x70\xee\xdc\x39\x1c\x0e\x07\xb2\xab\x84\x52\x57\x19\xa2\ \x28\x22\x49\x12\x82\x20\x20\x49\x12\x2e\x97\x0b\x55\x55\xf1\xf9\ \x7c\x44\xa3\xd1\x25\xb6\x48\x2c\x2e\xdc\x4d\xd7\x75\x2c\x16\x0b\ \x86\x61\x20\x0a\x16\xb2\xd9\x2c\x9a\xa6\x61\x18\x06\x36\x9b\xed\ \x96\xca\x6f\x84\xa9\x58\x10\x04\xd2\xe9\x34\x75\x75\xb5\xe8\x7a\ \x1e\x8b\xc5\x82\xae\xeb\x66\xa0\xdd\x6e\xe7\xbf\xc0\x0a\x10\x8d\ \x46\x0d\xbf\xdf\x3f\xff\x4c\x79\x96\x4d\x72\xbb\xdd\x00\x84\xc3\ \xe1\x25\x76\x6c\x6c\xcc\x00\x04\xe1\x89\x27\x1f\xdf\x13\x08\xf8\ \xcf\xf0\x3f\x62\x6c\x6c\x7c\xfb\xdf\xe7\x60\x9f\x53\x70\x22\xd1\ \x6a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\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\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\ \xbb\x7f\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\ \x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd6\x06\x13\x0e\x09\x04\x19\x6e\x0a\x19\x00\x00\x00\x0f\x74\x45\ \x58\x74\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x69\x64\x20\x6c\x6f\x67\ \x6f\x86\xc6\x77\xb9\x00\x00\x04\x2d\x49\x44\x41\x54\x38\xcb\xad\ \x94\x6d\x68\x5b\x55\x18\xc7\xff\xe7\xdc\x7b\x93\xa6\x6d\x5e\x7a\ \x6f\xfa\x92\x6c\xb6\xb7\xa9\x6d\xad\xdb\x2c\x1b\x56\x3b\x69\xe9\ \x60\x2f\xe0\x14\x75\x8a\x53\x14\xfd\xa0\x68\x15\xf4\x83\x30\xdf\ \xf0\xad\x20\xa3\xc3\x2f\x22\x83\xe1\x9c\x08\x7e\x11\x67\x4b\x37\ \x05\xab\x22\xd2\x95\x34\x1d\x6a\x05\x3b\x66\x2d\xeb\xda\x94\x36\ \x36\x4d\xba\x34\xe9\x4d\x9b\x9b\xb7\x7b\x8e\x1f\x9a\xa6\x8d\x19\ \x0a\x6e\x7f\x38\xdc\xe7\xf9\x5f\xce\x8f\x87\xe7\x3c\x3c\x04\x5b\ \xf4\xd1\xc9\x0f\x87\x74\x3d\xb1\x0f\xff\x43\x02\xa5\x9f\xbc\x7a\ \xec\xcd\xee\x8d\x5c\xdc\xfa\x53\xd7\x13\xfb\x5e\xec\x7e\x09\xe9\ \x74\x3a\xef\x71\xce\x8b\x20\x1b\x1e\x21\x04\x00\x20\x49\x12\x4e\ \x9f\x39\xf5\x3c\x80\x4d\xb0\x7a\xb8\xf7\x3d\x00\x3d\xeb\x29\x43\ \x22\x91\x40\x2c\x16\x2b\x02\x6e\xe4\x92\x24\x81\x52\x5a\xe0\x39\ \x1c\x0e\x00\x80\x7a\xb8\x77\xe3\x52\x8f\x08\xa0\xe7\xed\x57\x8e\ \x62\x22\xa0\x41\x9b\xfe\x12\x9a\xa6\x61\x61\x61\xe1\xba\x50\x00\ \x10\x04\x01\x84\x10\x58\x2c\x96\xbc\xc7\x18\x83\xa6\x69\x78\xf8\ \xd1\xc7\x01\x00\x03\x7d\xdf\xf7\xe4\x5b\x31\x17\xd4\x91\xf6\xc7\ \x11\x8b\xc5\xe0\xf7\xfb\xff\xb5\x15\x00\xf2\x55\x03\x80\xc7\xe3\ \xc1\xdc\x62\x1c\x86\x2d\x03\x57\xa5\x54\xd8\x63\x49\x14\xf1\x67\ \x62\x3b\x9e\x39\xf1\x53\x01\x20\xd7\xc6\xff\x50\x08\xc0\x76\xec\ \xdc\x52\x43\x1e\xcc\x01\xec\xda\x7b\x00\x37\xa2\x43\x9f\xbd\x8c\ \xcb\xaf\x7f\x5c\x08\x3e\xb0\x5b\xc1\x8d\x8a\x9d\xfc\x02\x08\x68\ \x85\xe0\x89\x9c\x71\xb3\x44\xd4\x7b\x7b\x2f\x80\xa0\xeb\x66\x42\ \x39\xb8\x8f\x00\xc0\x89\x0f\x8e\xf3\xc7\x8e\x3e\x71\x6d\x39\x12\ \xb1\x9f\xf9\xf4\x74\x7a\xff\xfe\x83\xd2\xd8\xd8\xaf\x68\x6f\xdf\ \x4b\xbd\x5e\x6f\xaa\xab\xab\xcb\x34\x7e\xe9\xf7\xcc\xee\xd6\x3d\ \x26\xdf\x45\x5f\xaa\xed\xce\x36\x69\x7c\x7c\x3c\xdd\xda\xda\x6a\ \x0a\x87\x97\xd8\xe5\x3f\x2e\x65\x9f\x7a\xf2\x69\x8b\x2c\xcb\xd1\ \x81\xf3\xfd\xce\x37\x5e\x7b\x8b\xd0\xcd\xf1\x21\xd9\x4c\x36\xb3\ \xa2\x54\x3a\x57\xe3\xf1\xd5\x58\x4d\xb5\xcb\x60\x8c\x6b\x6e\xf7\ \x36\xc3\x30\x58\xa4\xa2\x42\x36\x44\x49\x8a\xb9\xaa\xdd\x2b\x7a\ \x42\x0f\xc9\xb2\x0c\x23\xcb\x96\x5c\x2e\x17\xb7\xd9\xac\x11\x9b\ \xc3\xbe\x62\x36\x97\x90\xa2\xa9\x10\x05\xc9\x18\xfd\x79\xe4\x47\ \x45\x56\x0e\x35\x35\x36\x61\x76\xce\x9f\xae\xad\xbd\x85\x45\xa3\ \xcb\xba\x5c\x21\x27\xe3\x71\xcd\x52\x53\x53\xcd\xd6\xd6\xd6\x58\ \x4d\x4d\x35\x21\x14\x44\xad\x57\x85\xaa\xaa\x2a\x3a\x1f\x98\x65\ \xb2\x2c\x33\x8b\xd9\x22\xe5\x0b\xcd\x07\x02\xcd\x80\xa1\xad\xe3\ \x9e\xce\x88\xb3\xd2\x99\x51\xeb\xea\x75\x45\x71\x52\x4a\xc9\x8c\ \xd5\x56\x9e\x95\x2b\x64\xdd\x66\xb5\x1b\x6e\xb7\x6b\x59\x51\x9c\ \x84\x71\xc6\xec\x36\xbb\x51\x56\x56\xc6\x14\xc5\x89\xc9\xc9\x09\ \x81\x0a\x34\x5b\x04\x26\x20\x19\x41\x14\xd0\xd4\xdc\xac\x5e\x9d\ \xba\x32\xa9\xd6\xa9\x19\x87\xdd\x2e\x86\x23\xa1\x71\x45\x71\x96\ \xaa\xaa\xba\x6a\xb3\x59\x05\xbf\x7f\xe6\x8e\xb1\xb1\x5f\xb6\x99\ \x4c\x12\xac\xd6\x72\x63\xea\xea\x94\xe5\xc8\x43\x8f\xd4\x07\x17\ \x82\x15\xa1\xd0\x62\xaa\x08\x9c\xd0\x13\x61\x49\x94\x78\x5f\xff\ \xd9\x68\x3a\x9b\x9a\xd1\xb4\x58\xb4\x7f\xe0\x2b\xad\xbc\xb4\xbc\ \x6d\x39\xb2\x34\x4b\x08\x49\x7c\xf7\xc3\xb7\xf4\xf6\x1d\x2d\xd8\ \xb9\x6b\x07\x92\xc9\x54\x2a\xbc\x14\x0e\xce\xfa\xa7\x31\x3a\xea\ \xc3\x83\x0f\x1c\x59\x89\xc5\x62\xee\xe2\xb5\xc9\x91\x6e\x6a\x69\ \xba\x98\xd4\xf5\xc0\xf4\xd4\xcc\xfd\xfe\x19\xbf\x51\xe7\xa9\xfd\ \x5c\x14\x45\x3e\x3c\x32\x7c\x1f\xe7\x9c\xdd\xd6\xd2\x7c\x8a\x73\ \xfe\x2e\x21\x04\x65\xd6\xd2\xf3\x5e\xdf\xf0\x1e\x02\xf2\x9b\xa9\ \xc4\x94\xfd\xfa\x9b\x73\x77\x77\x76\x76\x8d\x00\xe8\x28\x00\x33\ \x66\x64\x58\x8a\x59\x38\xe7\xb4\xa1\xd1\x33\xb8\x75\x2e\x6f\x6d\ \x6c\x18\x04\x00\xc3\x30\x84\xbf\x82\x81\xe3\x00\x60\x36\x9b\x50\ \xef\x51\x07\x29\xa5\xdc\x6a\x75\x54\x36\x37\x36\x97\xa6\x92\xa9\ \xd4\xd6\x8a\x45\x00\xf0\xfa\xbc\xa5\x8d\x8d\x4d\x1d\x62\xca\x8c\ \x64\x2a\xb9\xbe\x3c\xd6\x97\x39\xa1\x94\x80\x10\x80\x73\x60\x3d\ \x26\xe0\x9c\x83\x52\x0a\x41\x10\x51\x66\x2e\x85\xbe\xa6\xd3\xa1\ \x0b\x43\xc9\x1c\xd7\x2c\x02\x28\x0b\x06\x17\xdf\x07\xf0\x4e\xfb\ \x5d\xed\x11\x42\x60\x89\xc7\xe3\xc8\x64\x32\xe0\x9c\x43\x10\x04\ \x6e\x18\x1c\x06\x33\xd6\x1f\x85\x50\x08\xc2\x26\x58\x14\x45\x98\ \x4c\x25\x08\x04\xe6\xa3\x8b\xa1\x85\xb6\x68\x34\x7a\x0e\x80\x8b\ \x00\xb0\x00\x70\x3f\xd7\xfd\xec\xb1\x86\x06\xcf\x0b\xd7\x5b\xf0\ \xff\xfc\x16\xae\x55\x92\x3f\xe1\xf0\xd2\x60\xdf\xd9\xfe\xde\xf9\ \xf9\xc0\x15\x02\x80\x00\x30\x01\x50\x00\xd8\x73\x31\xcd\xf9\x04\ \x00\x43\xbe\x31\x20\xb9\x98\x03\x30\x72\xb9\x90\x8b\x0d\x00\x49\ \x00\xd7\x00\xe8\x7f\x03\x8a\xcb\xca\xec\x2d\xad\x62\x4b\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x90\ \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\x09\x1b\x14\x0f\x34\xb9\x2c\x76\x05\x00\x00\x02\x1d\x49\x44\ \x41\x54\x38\xcb\xb5\x54\x4b\x8b\x13\x41\x10\xfe\xaa\x6a\xb2\xd1\ \x24\xec\x21\x24\x4e\x50\x36\x88\x18\x0f\x4a\x2e\xfa\x13\x16\xbd\ \xe4\x62\x7c\xfd\x82\xfc\x02\x05\x15\xd7\xe3\x2e\x2c\x39\xf9\xb8\ \x26\x4b\xd6\x9b\x07\xfd\x0d\x7a\xd0\x6b\x84\x2c\xe2\x69\x09\x01\ \x61\x06\xc2\x3a\x24\x64\x48\xd8\x99\x6e\x0f\x79\x4e\x5e\x1a\x37\ \x16\x34\xdd\x5d\xdd\xf5\xd5\x57\xd5\xd5\x05\xfc\x27\x21\x00\xd8\ \x2f\xee\x3d\x02\xf0\x7e\x4d\x98\xcf\x9e\x3f\xdd\x29\x62\x00\xac\ \x2d\xcb\xd2\x67\x95\x76\xbb\xad\xf7\x8b\x7b\x1a\x00\x8c\xa1\x1b\ \xd3\x34\x51\xab\xd5\xc6\xa1\x10\x8d\xe6\x45\xeb\x69\x5d\x26\x93\ \x01\x00\x14\x0a\x05\x36\x26\x63\xc8\x66\xb3\x6b\x4b\x71\x00\xf8\ \xe8\xc7\xb7\x99\x27\x10\x66\x30\x33\x88\x18\x2c\x02\xa6\xb1\x8e\ \xd9\x18\xcc\x04\x26\x41\x32\x61\x8e\x2c\x8d\x69\x57\x97\xcc\xad\ \x7f\xa2\xa8\xa1\x02\x7b\x5e\x57\xec\xcc\xb2\x1a\xf0\x71\x3c\x81\ \xe3\x78\x02\xee\xa7\xcf\x00\x80\x9f\xb7\xef\xa0\x7e\xf5\xda\x1c\ \x60\x5e\x0c\x4c\x4c\x33\x06\x17\xca\x25\x00\x80\x75\xef\x3e\x5a\ \x95\x43\xf8\xb6\x8d\xc8\xf6\xf6\x6a\x8c\x65\xea\x10\x00\x62\xf9\ \xbb\x48\x7d\xfc\x00\x00\x68\x3e\x7e\x02\xff\xe4\x17\x36\x6e\x5c\ \x5f\x8d\xf1\xf4\xe1\x50\xbc\x7a\x1d\xe1\x5b\x37\xfb\x8f\xe4\xba\ \xe0\xcd\xcd\x99\x3b\xb2\x8c\x31\xcf\x61\xec\xbc\x79\x0b\xe7\xd5\ \x6b\xa8\x76\x1b\xe9\xef\x47\x23\xe6\xad\xca\x61\xb0\x30\x25\x68\ \x6b\x2c\x62\xec\x59\x16\x5a\xe5\x03\x74\xbf\x7c\x45\xec\xe1\x03\ \xc4\xf2\x79\x18\xa9\x14\xae\x9c\x34\xe7\x46\x25\xc4\x4b\x80\x69\ \xec\xd5\x48\xa5\x10\xdf\x79\xf1\xf7\xe5\x26\x4b\x80\x45\x18\x6e\ \xd7\xed\xff\x24\x16\x08\x33\x88\xb9\xbf\x26\x06\x09\x83\x49\xc0\ \xc2\xfd\xfd\xf0\x07\x92\x60\xba\x9e\x02\xc0\x5b\x17\x2f\xaf\xad\ \x1f\x07\x80\x1b\x8d\xc6\xd2\xee\xf5\xa7\x4e\x97\x4c\x26\x67\x81\ \x6d\xdb\x46\x3a\x9d\x3e\x13\x4b\xdb\xb6\x87\x4b\x35\x04\xde\xad\ \xbc\x2b\xbf\x5c\x53\x16\x76\x4b\xa5\x92\x1e\xe5\x3c\x97\xcb\x9d\ \x57\x4a\x99\x8e\xe3\x44\x3a\x9d\x4e\xa4\xdb\xed\x46\x3c\xcf\x3b\ \xe7\xfb\x7e\xd8\xf7\xfd\x0d\xad\xb5\xa1\xb5\x16\x22\xd2\x44\xe4\ \x31\xf3\xa9\x88\xf4\x42\xa1\x90\x1b\x0e\x87\xdd\x68\x34\xda\xe9\ \xf5\x7a\x56\xb5\x5a\x75\x26\x19\x03\xc0\x29\x80\xe6\x20\x3d\x02\ \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\x26\ \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\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\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\xdb\x05\x16\ \x06\x08\x13\x41\x55\x76\x1b\x00\x00\x03\xa6\x49\x44\x41\x54\x38\ \xcb\xad\x94\x4d\x4c\x1c\x65\x18\xc7\x7f\x33\x3b\xb3\xbb\xb3\xb3\ \xc0\x4e\xdb\xa5\xbb\x18\xa4\x14\x58\xbe\x02\x5d\xe1\xb0\x56\x9a\ \x78\xd0\x84\xa4\xa4\xbd\x6c\x8b\x37\x93\xc6\x83\x1a\x22\x12\x13\ \xfb\x61\xec\x45\x9b\x9a\x70\x30\x0d\x09\xf1\x80\x8d\xf5\x56\x4d\ \x38\x61\x8c\x26\x0d\xc6\xf8\x11\x89\x89\x69\x6a\x21\x0a\x48\x29\ \x01\x96\xec\x14\xc6\x05\x16\xd8\xd9\x9d\x19\x0f\xca\xca\xba\x20\ \x96\xf8\xbf\xbc\xc9\xfb\xbc\xcf\x2f\xcf\xfb\x3c\xef\xfb\x87\x7d\ \xf4\xed\x2d\x1c\x0e\x20\x69\xaf\xc0\x57\x37\x39\x22\xbb\xd0\x39\ \xa0\xc4\xdd\x36\xaf\x5e\x91\x35\xd9\x85\x1e\x8b\x0f\x1f\x94\x5b\ \x5c\xf1\xd5\x2b\xb2\xd6\x59\x9f\x5d\x89\xc5\x87\x21\x75\x39\xdf\ \x0e\x53\x38\xbc\x64\xd9\xe2\x12\xa2\x7b\xfc\xeb\x5f\xf5\x97\xaf\ \x5d\x37\xd3\xff\x06\x16\xf6\x82\x66\x57\xae\x21\x89\x06\x28\x71\ \x70\x72\x58\x96\x03\xd8\x99\xef\xbe\xbc\x3d\x2d\x8b\x08\x77\x26\ \x52\x9d\xef\xbe\x97\x9d\xdf\x17\xfc\x7a\xdf\x85\xd7\xce\x47\x3f\ \x1a\x88\xc5\x87\xc9\x2e\xbf\x83\x20\xba\x30\x33\x9b\x48\xb2\x9b\ \x5c\xd6\x64\x75\x75\x19\xc5\x7f\x0c\x5f\x69\x3b\x8f\x16\x7f\x61\ \xe2\xee\x14\x5f\xdc\xef\xc0\x76\x8e\xec\xe4\x5d\x1a\xb8\x31\xd8\ \x9f\x07\xf7\xf6\xf5\x84\xbb\xa3\x83\x8b\xdb\x50\x51\x74\xe5\x9f\ \x82\x6d\x5b\xe4\xb2\x26\x9b\x9b\xeb\x7f\xf7\xcf\x13\x26\xbd\xee\ \x23\xb1\x20\xd1\xf8\xec\x6d\x64\xd9\x07\xc0\xe5\xb7\xde\x64\xe0\ \xc6\xa0\xb0\x73\x78\xcd\xa3\xf3\x97\x18\x1b\x8e\x23\x97\x9c\x06\ \xc0\xb2\x4c\x1e\xcc\xdc\xe3\xe1\xec\x38\x0b\x0b\x53\x05\xd7\x5c\ \x33\xc6\x39\x14\x6a\xc2\x36\xa7\xb9\x3f\x7a\x8e\xb9\xf9\x39\xd2\ \xe9\x34\xc1\x60\x90\xde\xbe\x9e\xe8\xce\xe1\xd5\x84\xc3\xc7\x39\ \xf6\xfc\x34\x63\x23\xb5\xc4\xce\x5c\x64\x6e\xe2\x7d\xea\x5a\xde\ \xc0\xb6\xd6\x0a\xa0\xf6\xda\x87\x6c\x6e\xc8\x2c\xfc\x76\x93\xba\ \xe8\x2b\x8c\x8f\x7d\x86\xe2\x55\x00\xd0\x34\x0d\x5d\xd7\x23\xc0\ \xdd\x6d\xf0\xd9\xa7\x4e\xb4\xe1\x38\x1e\xaa\x9e\x9b\x62\x6c\xa4\ \x8e\xd8\x99\x8b\x00\xfc\xf8\xf9\x07\x85\x53\x51\x04\x9a\x9e\x7e\ \x95\xd4\xd2\xc7\x78\xbc\x26\x02\x39\x7c\xca\x9f\xad\xe8\x38\x79\ \x8a\xc9\xc9\xc9\x16\xe0\xd3\xed\x56\x9c\xae\xa8\x78\x02\x00\xaf\ \x37\xf0\x17\xbc\x3f\xcf\xaa\xef\xd2\xa9\xef\xd2\xa9\x3a\x35\xca\ \xd1\x86\x5b\xcc\xfc\xf4\x0d\xe5\x95\x2f\x62\xd9\x25\x60\x9b\xf9\ \x73\x95\x95\x55\x00\x6f\x03\x48\xbd\x7d\x3d\x51\x45\xf1\xe1\x76\ \xbb\xf1\xf9\x7c\xa4\xd3\x69\xbc\xde\x00\xf5\x5d\x3a\x63\x23\xc1\ \x82\x62\xbd\x65\x2d\x78\xcb\x5a\x50\x0f\xb5\xf1\xf3\xf7\x27\x68\ \xec\xb8\x8e\xe0\x6c\x01\xa0\xaa\x2a\x1b\x1b\x1b\x68\xda\x61\x7a\ \xfb\x7a\xa2\x22\x10\x39\x5a\x1e\x02\xc0\x30\x0c\x54\x55\x45\x55\ \x55\x44\x51\xa4\xbe\x6b\xf7\x1f\x2d\x7b\x43\xb8\x6c\x3f\x5b\x6b\ \xe3\x08\x4a\x15\xaa\xaa\x62\x18\x06\x00\x65\xa5\x65\x00\x11\x09\ \x68\x69\x6a\x6c\x26\x9b\xcd\x3a\x92\xe4\x12\x52\xa9\x14\xb6\x6d\ \xa3\x69\x1a\x00\x6d\xdd\x1b\x45\xe0\xcc\xfa\x03\x02\x15\x31\x0c\ \x7d\x91\xb2\x8a\x73\x18\x86\x81\x65\xe5\x58\x5f\xcf\x3a\x35\xc7\ \x6b\x84\xd9\x87\x33\x27\xa5\x4c\x26\xd3\x1a\x0a\x85\xf0\xfb\xfd\ \xc2\xea\xea\x6a\x3e\x79\xbb\x82\xdd\xb4\xb6\x78\x87\x40\x45\x27\ \x0b\xd3\x3f\x10\x6a\xbe\x80\x65\xe5\x40\x00\x4d\xd3\x84\xca\xca\ \x27\xd9\xda\xca\x94\x48\x1e\x8f\xe7\x6c\x24\x12\xc9\x3f\x97\xff\ \xa2\xdc\xef\x0a\x99\x4d\x1f\xb5\xed\xfd\xc8\x4a\x61\x4e\x43\x43\ \x03\x5e\xaf\xe7\x25\x09\x40\xd7\x75\x96\x97\x97\xf7\x04\x39\xce\ \x3f\x2d\xb9\x1d\x80\x47\xb3\x06\x8e\xb3\x52\x10\x09\x06\x83\x85\ \xee\x66\x9a\x26\xad\xad\xad\x0c\x0d\x0d\xe1\xf1\x78\x50\xfd\x3e\ \x4a\xfc\xa5\x88\xa2\x88\xa2\x28\x08\x82\x80\xa2\x28\xf8\xfd\x7e\ \x0c\xc3\xa0\xbc\xbc\x9c\x64\x32\x59\xb4\x6e\x83\x8b\xfc\xd8\xe5\ \x72\xe1\x38\x0e\xa2\xe0\x22\x93\xc9\x60\x9a\x26\x8e\xe3\x20\xcb\ \xf2\x2e\x95\x3f\x86\x1f\x37\x36\x36\xe0\x38\x20\x49\x85\x21\xb7\ \xdb\xfd\xf8\x46\x9f\x4c\x26\x9d\x70\x38\x2c\xe8\xba\x4e\x6d\x6d\ \xdd\xbe\x49\x81\x40\x00\x80\xea\xea\xea\xa2\x35\x91\x48\x38\x80\ \x20\x9c\x7f\x21\xde\x1d\x0e\x87\x3e\xe1\x7f\x54\x22\xb1\xf4\xcc\ \x1f\xdd\xc1\x60\x94\x84\x01\xca\x23\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\x02\x76\ \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\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\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\x01\xf3\x49\x44\ \x41\x54\x38\x8d\xd5\xd5\xcf\x4b\xdb\x60\x18\xc0\xf1\x6f\x7e\xf4\ \x57\xd2\xd6\x0e\x67\x73\xb0\x0c\x9d\xd0\xad\xb8\x0e\x44\xaf\x05\ \x29\x78\x51\xff\x0f\x4f\xde\xbd\x85\xfc\x0b\xfe\x13\x1e\xbc\x79\ \xf6\x20\xd6\x4b\x11\x94\x11\x9d\x28\x6c\xa0\x07\xa1\xc1\x1f\xb4\ \xdd\x62\x6b\xda\x64\x87\x2a\x53\xfb\x76\x0b\x93\x1e\xf6\x9c\x92\ \x3c\x79\x3f\x3c\xbc\xef\x93\x27\x52\x10\x04\x0c\x23\xe4\xa1\xa8\ \xc3\x84\xd5\xc7\x0b\xcb\xb2\x6a\x40\xf6\x15\x96\x63\x9a\xa6\xf1\ \x78\xf3\xb4\xe2\xd7\xa0\x7d\xeb\xd5\x97\x59\xd3\x34\x43\x29\x7e\ \xbb\x8d\x24\x49\x48\xd1\x28\x96\x65\xf5\xe5\xfb\x60\x00\xc7\x71\ \x06\x82\xb2\x2c\x33\xa2\x69\xb8\xfb\xfb\x44\x0c\x83\xc4\xd4\x94\ \xf0\x3d\x21\x3c\x28\x24\x49\x62\x44\xd3\x68\xd9\x36\x5f\x17\x17\ \x51\x92\x49\x3e\x57\xab\xe2\x02\x44\x0f\xe3\xf1\x38\x19\x4d\x43\ \x51\x94\xe7\xa8\xae\xd3\x3e\x3b\xe3\x78\x61\x01\xdf\x75\xf1\x1c\ \x87\x6f\x2b\x2b\x21\x61\xdf\x27\x95\x48\x70\x7f\x7a\x4a\x2a\x1e\ \xef\xed\xe3\x43\xa5\x9d\xf3\x73\x8e\xcb\x65\xba\xcd\x26\x00\x89\ \x7c\x9e\x0f\x1b\x1b\xe1\xe0\x4e\xbd\x8e\x5d\x2a\x71\x54\x2e\xe3\ \x5f\x5f\x93\xd4\x34\xd2\xba\x8e\x5f\xab\x71\x34\x3f\x4f\xe7\xf6\ \x16\x80\xd8\xc4\x04\xc5\x4a\x05\x25\x9d\x0e\x07\x7f\x5f\x5d\xa5\ \x59\xad\xd2\x6d\x34\x38\x59\x5e\x26\xa6\xaa\x70\x73\x83\x5d\x2a\ \xe1\x3d\x1c\x6a\x34\x97\xa3\xb8\xb7\x47\x57\xd3\x90\x54\xf1\x31\ \xf5\xc1\xef\xd7\xd7\x89\x18\xbd\x3e\x77\x6d\x9b\x83\x7c\x9e\x2f\ \x33\x33\xdc\x5f\x5e\x02\x10\x31\x0c\x8a\x95\x0a\x41\x26\x43\xc3\ \x75\x85\xa8\x10\x96\x75\x9d\x8f\x9b\x9b\x20\xf7\x52\xed\x8b\x0b\ \xbc\xab\x2b\x00\xd4\xd1\x51\x8a\xbb\xbb\x48\x63\x63\x34\xff\x80\ \x8a\xe1\x58\x0c\x7d\x6e\x8e\x77\x2f\x9a\x5e\xcd\x64\xf8\xb4\xb3\ \x83\x32\x3e\x4e\xc3\x75\xf9\xdb\x54\x14\xb6\x5b\xa3\xd5\x22\xb7\ \xb6\xc6\x9b\xa5\x25\x00\x94\x54\x8a\xe9\xed\x6d\x22\x93\x93\xd4\ \x43\xa0\x30\xe0\x03\xf1\x3c\x8f\x1f\xae\x4b\x61\x6b\x8b\x9f\x87\ \x87\x24\x0a\x05\xfc\x20\xa0\x7e\x77\x17\x0a\x1d\x08\x67\xb3\xbf\ \xe7\x49\x72\x76\xb6\x57\x35\xf0\x56\xd7\x43\xa1\x42\x58\x34\x50\ \xfe\x25\x9e\xee\xf1\xe0\xc9\x13\x2e\x9e\xad\x97\xfe\xbb\x7f\xde\ \x2f\xf2\xee\xa2\xd5\xb2\x5f\x77\x9c\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\x02\x74\ \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\x00\x00\x00\x00\x00\xf9\x43\ \xbb\x7f\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\ \x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd5\x03\x0b\x0b\x08\x04\xdd\x67\x7b\x1d\x00\x00\x00\x3e\x74\x45\ \x58\x74\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\ \x64\x20\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\x0a\ \x0a\x28\x63\x29\x20\x32\x30\x30\x33\x20\x4a\x61\x6b\x75\x62\x20\ \x27\x6a\x69\x6d\x6d\x61\x63\x27\x20\x53\x74\x65\x69\x6e\x65\x72\ \x27\x33\xef\x58\x00\x00\x01\xb7\x49\x44\x41\x54\x38\xcb\xb5\x94\ \x41\x6b\x1a\x41\x18\x86\x9f\x71\x45\x4a\x54\xf4\xd2\x45\x50\x4f\ \x1e\x2a\x88\x36\x67\x2f\x7b\xf4\x0f\xf4\x2f\xf8\x07\x4a\x49\x2b\ \x3d\x07\xd3\x50\xfa\x7f\x3c\x7a\xf1\x2c\x6a\xc1\x06\x44\x10\xbc\ \xa8\xe9\x6e\x8a\x61\x45\x9d\x9d\x1e\xd4\xe0\xc4\x35\xdd\xa2\xf9\ \xd8\xc3\xec\x37\xef\xfb\xce\x33\x03\x33\xf0\x4a\x25\x6e\x6e\xaf\ \xd5\xb9\x43\xbf\x5c\x7d\xbd\x08\x03\x7c\xfa\xf8\xf9\x6c\xa1\xdf\ \x7f\x7c\x03\xc8\x85\x77\x8d\xf9\x7c\x7e\x72\x68\x2c\x16\xdb\x0d\ \xdf\x84\xf7\x27\xea\xf5\x3a\x96\x65\xd1\x6c\x36\x35\x43\xa9\x54\ \xa2\xd3\xe9\x00\x50\xab\xd5\x00\x68\xb5\x5a\x98\xa6\x89\xe3\x38\ \xa4\x52\x29\x32\x99\x8c\xe6\x09\x3d\x5f\x75\x3f\xb4\x58\x2c\x6e\ \x44\xa1\x8d\x2c\x9d\x4e\x6b\xda\xc9\x64\xc2\x72\xb9\x64\x34\x1a\ \x1d\xd0\x87\x5e\xda\x5a\xb7\xdb\xc5\xb2\x2c\xda\xed\x36\x00\xe3\ \xf1\xf8\x40\x13\x89\x44\x88\xc7\xe3\x07\x7d\xed\x28\x76\xdb\x7c\ \x5e\xe5\x72\x39\x50\x2f\x30\xf1\x29\xa5\x11\x37\x1a\x0d\x5f\x51\ \xa5\x52\x39\x3a\xb7\xaf\x39\x1a\x0c\x90\xcb\xe5\xb4\xff\xc1\x60\ \xe0\x6b\xfc\x2f\x62\x80\xe9\x74\xea\x2b\x0c\x42\xac\x94\xf2\x0f\ \x76\x5d\xf7\xc0\xb0\x5a\xad\x02\x13\x7b\x9e\xe7\x1f\xbc\x58\x2c\ \xb4\x55\x01\xa4\x94\x81\x89\x8f\x1e\x85\xeb\xba\x4f\x41\xff\x32\ \x02\x08\x21\x00\x9e\x60\xd6\xeb\xb5\x1e\x2c\xa5\x64\x36\x9b\x61\ \x9a\x26\xc9\x64\x52\x33\xdb\xb6\xcd\xfd\xfd\x6f\xee\xee\x7e\xbd\ \x48\x5c\x28\x14\x48\x24\x12\x7a\xb0\xe3\x38\xd8\xb6\xcd\x70\x38\ \x44\x4a\x89\xe7\x79\x28\xa5\x30\x0c\x03\x21\x04\x97\xef\x2f\xc9\ \x66\xb3\x5b\x3a\x10\x42\xa1\x94\x80\xcd\x87\x52\xf0\xf0\xf0\x87\ \x68\x34\xaa\x07\xf7\xfb\x7d\xf2\xf9\x3c\xd5\x6a\xf5\xa4\x4b\xd1\ \xeb\xf5\x76\x43\x25\x80\x77\x37\xb7\xd7\xfd\x33\x3e\xf2\x1f\x80\ \x9f\x02\x30\x80\x24\xf0\x16\xb8\x38\xf1\x9a\x2b\xe0\x11\x98\x8a\ \x6d\xc3\xd8\x1e\x8b\x71\x06\x68\x09\xac\x5f\xeb\x0d\xe2\x2f\x4b\ \x5a\xa1\xe6\x54\xae\x32\x6e\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\ \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\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\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\x05\xd1\x49\x44\ \x41\x54\x38\x8d\x7d\x95\x5b\x6c\x5c\x47\x19\xc7\x7f\x73\xf6\xec\ \xcd\x6b\xef\x7a\xd7\x8e\xef\xb1\xe3\xf8\x92\x3a\xc6\x72\x62\x9c\ \x16\xb9\x4d\x8c\x1c\x12\xa7\x01\x05\xa8\x94\x54\xb4\x11\x0f\x21\ \xa9\xca\x43\x40\x42\x8a\x80\x27\x88\x68\x25\x4a\xc4\x03\xf2\x6b\ \x51\xd5\xc2\x03\x12\x55\xa1\x95\xa0\x49\x9a\x9a\x42\x62\xb7\x29\ \x26\xb1\x13\x7b\x7d\x5d\xdf\xbd\xbe\xec\xdd\x7b\x39\x7b\x39\xe7\ \x0c\x0f\x8e\xa3\x14\x10\xff\xa7\xd1\x8c\xe6\x37\xdf\xf7\xff\xbe\ \x99\x11\x52\x4a\x9e\xd0\x15\x0a\xa9\x54\xe6\xf6\x4f\xfe\x70\xea\ \x67\x82\x12\x6f\xe9\x09\xab\xdd\xd1\xdf\xb0\xaf\xea\xe0\x97\x3a\ \x1a\xeb\xe3\x89\xb4\x3e\x33\xbb\xb6\xba\xbc\xb8\x3e\xa9\x6d\xa7\ \x3e\xd4\xf3\xf9\xc1\xe1\xe1\x81\x18\xff\x43\xe2\x49\xb0\x19\x1a\ \x3d\xa3\xf8\xda\x5e\x0f\x2e\x06\xd8\x5c\x99\x6d\x72\xd8\x0c\x87\ \xcd\x66\x17\x15\x75\x2d\x38\xbd\xb5\x2c\x05\xc3\x04\xe2\x36\x0c\ \xdd\x20\x12\x8a\x99\x93\xf7\xfd\xeb\x77\x3e\xb9\xff\xf3\xbf\x7f\ \xf4\xcb\x37\xff\x2f\xf8\xfd\x37\x2e\x74\xb5\xf7\x5f\x18\xdc\xbb\ \xaf\xd1\x2d\x8d\x9c\x30\xf5\x2c\x42\x4f\x22\x32\x1b\x44\x37\x16\ \x98\x9b\xf8\x9c\xec\xfe\xf3\xe4\x7d\x87\x88\x6e\xa7\xd9\xe7\x2e\ \xa0\x6b\x59\xe3\xad\xb7\x6f\x8e\x04\xfc\x6b\x5f\x1f\x1e\x1e\x88\ \xfc\x17\xb8\xa7\xe7\x72\xd9\x2b\xdf\xff\xc6\x74\xef\xc1\x5c\x99\ \x0d\x8d\xb2\x9a\x56\x64\x2e\x8e\x6a\xa6\x90\x5a\x14\x8b\x99\x46\ \x11\x30\x33\x71\x8f\x80\xde\x4c\x6b\xcf\xcb\x4c\xcc\xcc\xd3\xdd\ \x71\x80\x54\x3a\xc3\x5b\xbf\xbf\x19\xf9\xc7\x47\x13\x07\x76\xe1\ \xca\xee\x09\xbd\xc7\x0f\x5f\x7f\xe9\xc5\xbe\xb2\xa9\x74\x1d\x1b\ \x29\x95\xd0\xd8\x7b\x58\x0a\x31\x2c\xda\x3a\xd6\xec\x1a\x8a\xb6\ \x01\xc9\x25\x5a\x5b\x9a\xa8\x36\xa6\x08\x2c\x2c\xe2\xf1\x78\xa8\ \xaa\xdc\x43\x45\xb9\x97\x57\x2f\x9c\x2e\xab\x6f\xa9\xf8\x70\x97\ \xa7\x00\x7c\xfb\xec\x6b\xaf\xfe\xf4\xca\xb9\x2f\x5b\xad\x2a\x27\ \x9f\xed\xa4\xf3\xd9\x6f\xb2\x56\xdc\xc7\x9d\xbf\xbe\x8d\x96\xcd\ \x82\x91\x03\x5d\x03\x3d\x03\x89\x79\x9e\x6a\x6d\xa6\x26\x71\x9d\ \xde\x67\x3a\x51\x14\x05\xab\xd5\x8a\xcd\xaa\x72\xe5\x87\x67\xba\ \x7b\x4f\xfc\xe8\x32\x80\xd2\xd3\x73\xd9\x7b\xf1\x7b\xc7\xaf\x95\ \x94\xb8\x04\x80\xa2\x28\x8c\x8d\xfb\xd1\x6c\x15\x34\x7d\xf7\x3d\ \xee\x8d\x3e\xa4\x80\x6d\x07\xaa\x67\xc0\xd0\x70\x98\xdb\x24\x82\ \x93\xcc\xcd\x2f\x92\xcb\xe7\xb1\x58\x2c\x28\x8a\x82\xcf\xeb\x16\ \xc7\x8e\xb5\xbc\xd6\xd3\x73\xd9\xab\x58\x1d\xf6\xbe\xa3\x3d\x1d\ \xc5\xbb\x29\x0c\x7d\x36\x82\xb3\xfa\x29\x1a\x5b\xdb\x41\x58\xa8\ \xea\x7f\x9d\xc0\xfc\x3c\x20\xa0\x90\x81\x42\x06\x99\x5c\xc0\xe3\ \xab\xe2\xd3\x99\x18\x6f\xfe\x79\x98\xdb\x9f\x3f\x40\x08\x41\x3e\ \x9f\xa7\xbb\xab\xd9\x8d\xc5\xd2\xa7\x76\x1c\x6a\x3a\x57\x52\xe2\ \x62\x72\x7a\x96\x6c\x2e\x4f\x5c\xad\xa4\x54\x5a\xd8\xed\x15\x6b\ \x71\x05\xe1\x68\x04\xea\x9b\x91\x7a\x66\xc7\x16\x33\x8f\xb7\xa4\ \x96\xae\x4a\x0d\x6b\x4b\x23\x86\x69\x02\x90\xce\x68\x34\x35\xd4\ \x60\x77\x9a\x2f\xaa\x5d\x87\xeb\xbf\x32\x3a\x3e\xc5\xfd\x90\x13\ \x97\xdd\x81\xcf\x5b\x4a\x32\xab\x63\x51\x04\x0e\xeb\xa3\xda\x5a\ \x9c\x48\x3d\xfb\xc8\x8a\x1c\x14\x52\x38\x9c\x71\x3c\x22\x4a\x5d\ \x53\x0f\xa3\xe3\x93\x8c\x4f\x6f\xa2\xe7\x73\x4c\x2e\x85\x29\x2b\ \x77\xb5\xa9\xaa\x6a\x75\x15\xbb\x8a\xa8\x89\x85\x88\x89\x5a\x12\ \x43\xd7\x30\x23\x43\xb8\xf7\x1f\x44\x13\x02\x10\x54\xd5\xd4\x82\ \x1e\xdd\x29\xa0\xa1\x41\x36\x8c\xbb\xa2\x98\xf8\xd2\x27\xcc\xaf\ \x0e\xe1\x56\x54\xec\xb9\x02\xfe\x4f\xff\x44\xc4\xf5\x1d\x5c\xa5\ \x35\x4e\x75\x6e\x29\x91\xd4\x9c\x5b\x65\x4d\xe5\x82\xe4\xe6\x3c\ \x0d\x1d\x2f\xa3\x3f\xd4\xf0\xba\xf2\x54\xdb\xc2\xc8\x5c\x02\x8c\ \x2c\xc4\x35\xd0\xb3\x90\x8b\x81\xae\xa1\x2e\xbc\xcb\x7e\xb1\x93\ \x91\xdc\x7b\x8a\xd1\xad\x02\xe1\x86\x4b\x3c\x58\xdd\x8b\xdb\xd8\ \x94\xca\xe2\xc2\xc6\x9a\xd3\xed\x63\x64\xb3\x08\xa7\xdd\xca\xc9\ \x67\x0e\x70\xfa\xe2\x35\x46\xd7\x60\x35\xe3\xd9\xb1\xa2\x90\x82\ \x42\x1a\xb2\xa1\x9d\x31\x80\x34\xc0\x2c\x40\xf5\x51\x26\xd6\x81\ \xc6\x17\xd8\x36\x3c\x78\x5d\x36\x22\xa1\xd8\xba\xb2\xba\xb2\x35\ \xa9\x48\x83\x74\x36\x8f\xc3\xa6\x3e\xbe\xde\xcf\x5f\xfa\x0d\xe3\ \x5b\x4e\x96\x73\xd5\x60\xb1\x81\x16\xda\x89\xf8\x49\x55\x3d\x87\ \x3f\x5c\x82\xd9\x70\x06\xcd\x5a\xc9\x8d\xf1\x24\x45\xaa\x24\x11\ \xdd\x9e\x56\xf2\x99\xcc\xf5\x64\x6c\xdb\x4c\x6b\x79\xdc\x8e\x2f\ \xee\x3b\x75\xf1\xd7\x64\x8a\xda\x58\xc8\x37\x82\xdd\xfb\xc5\xc5\ \xca\xa7\xf1\xc7\xcb\x30\xea\x4f\x23\xdc\x8d\xdc\xbd\xef\xa7\x60\ \xf1\x20\x33\x69\x53\xea\xfa\x75\xc5\xcc\xe7\x07\xfd\x23\xe3\xc1\ \xf2\x12\x1b\xb7\xa7\x12\x24\x93\x49\xcc\x47\xed\x03\x50\x7a\xe8\ \x3c\x1f\x04\xca\x99\xe3\x08\xb8\x6a\x77\x26\xf7\x74\xf1\xaf\x50\ \x05\xab\xb6\x6e\x70\x37\x91\x4a\xa5\xd0\x0b\x79\xaa\x4b\x6d\x44\ \x57\xd6\x57\x31\xe5\xa0\x32\x3c\x3c\x10\x1b\xfd\xe7\xe4\x55\x6b\ \x3a\xae\x85\x35\x95\x37\xde\xf9\x98\x68\x34\x4a\x22\x91\x20\x95\ \x4a\x11\x58\x5c\x66\xde\x77\x96\x77\x03\x35\x4c\xcb\x6e\x44\xdd\ \xd7\xb8\x17\xa9\xe1\xb7\xb3\x07\x71\xec\x69\x27\x99\x4c\xb2\xb1\ \xb9\xc5\x5d\xff\x06\xe5\x8a\x9e\x5e\x09\x04\x7f\x31\x3c\x3c\x10\ \x7b\xfc\xba\xf5\x7f\xeb\xea\xad\xaf\x9e\x7b\xfe\xf8\xd8\x52\x82\ \xab\x2f\x34\x60\xb7\xdb\x58\x5b\xdf\xe2\x9d\x5b\x53\x64\x8b\xf6\ \x62\x18\x92\xba\xed\x1b\x1c\x2b\x19\xe5\xfd\x58\x2f\x01\xda\x39\ \xdd\x10\xa7\x6d\x5f\x05\x13\x53\x73\xcc\xc5\xdd\xcc\x7c\x36\x71\ \x6b\xf0\xc6\xaf\x4e\x00\x3c\xae\xd6\xc6\xc2\xe4\xf9\xb1\x8f\xdd\ \x77\x0f\x1c\x7d\xba\x7e\x6e\x71\x85\x9a\x0a\x1f\x77\x46\xc6\xd9\ \x92\x35\xc8\x54\x16\xc3\x94\x44\x78\x8e\x87\xd1\x4e\xd2\xba\x0d\ \x59\x48\xe1\x5f\x8a\x51\xe6\x52\x08\xc6\x4d\xd6\x27\x16\x96\x17\ \x67\xef\xbe\x22\x84\xb0\x48\x29\x0d\x15\x40\x08\x51\x0c\x28\xc1\ \xe0\xbd\x73\x1b\x6b\xc1\x81\x23\x3f\x38\xd9\x3d\x3e\x1d\x10\x37\ \xe6\x14\xb0\x67\x91\x52\x22\x4d\x13\x4c\x1d\xa9\x9b\x48\x63\x1b\ \x59\xc8\x91\xb6\x17\x31\xf4\x60\x3b\xe7\x1f\x99\x79\x38\x31\xf6\ \x97\x1f\xc7\xe3\x4b\x2a\x50\x2e\x84\xd8\xb1\x42\x08\xa1\x02\xc5\ \x80\x17\x28\x6e\xef\x3c\xfb\x52\xe7\x91\xc3\x97\xf6\x34\xb5\xf9\ \xa4\xdd\x2e\x92\x5a\x9e\x48\x3c\x8d\x34\x0d\x4a\x8b\x54\x8a\x54\ \x90\x5a\xc6\x0c\x2f\x05\x23\xfe\x07\x23\xbf\x9b\x9a\xf8\xe0\x8f\ \x40\x12\x08\x03\x71\x29\x65\x4e\xfc\xc7\x67\x8a\x10\x42\x01\x2c\ \xcd\xcd\xc7\x2b\x3c\xde\x86\x3e\x8b\xbd\xa8\xbf\xd4\xe7\x69\xf6\ \x95\x79\xaa\x90\x92\x48\x38\xb6\x91\x88\x26\xe6\xf4\x5c\xe6\x66\ \x3c\xb6\x3c\x38\x3f\xff\xb7\x10\xa0\x03\xa6\x7c\x02\xf6\x6f\xff\ \xac\xe5\xa6\x9c\xf2\xd5\xdb\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ \x42\x60\x82\ \x00\x00\x05\x54\ \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\x04\xe6\x49\x44\x41\x54\x38\x8d\xb5\ \x95\x69\x4c\x14\x67\x18\xc7\xff\xef\x3b\x33\x3b\xbb\xb3\x4b\x39\ \x96\x5b\xe4\x10\x6b\x91\xa0\x16\x45\xa8\x68\x1b\x8f\x9a\x26\xad\ \x31\x69\xda\x10\x82\x9a\x98\xa6\x02\xd6\x4f\xb6\x4d\x13\x93\x26\ \xfd\xd2\x34\x31\x35\x69\xd2\x5a\x14\x24\x35\xb6\x80\xa4\x34\x69\ \xb5\xb1\x47\x62\x3c\x4a\xad\x0a\x04\x41\x5b\x05\x42\x3d\x10\x16\ \x01\x71\x81\xbd\xe7\x78\x9f\x7e\x60\x21\x1c\x7e\xf0\x4b\x27\xf9\ \x67\x92\x99\x67\x7e\xf3\x9b\x67\x9e\x99\x97\x11\x11\xfe\x8f\x8d\ \x3f\x4b\x51\x59\x59\x8b\xf4\x2c\x75\x1b\xf6\x37\x67\x97\xbe\xdb\ \x92\x00\x00\xec\x69\xc6\x25\x95\xdf\xae\x50\x14\xf5\x23\x30\x6c\ \x35\x4d\x2b\x4d\x10\x14\x89\x33\x3f\xe7\x6c\xd4\x12\x74\x41\x90\ \x68\x11\x14\xf8\xa3\xa3\xb6\xd2\x98\xb9\xe6\xa5\x7d\xa7\x53\x04\ \xa7\xbf\x4c\x0b\x5b\x3b\xeb\x2b\x1e\xcc\x03\x33\x06\x56\xfa\x5e\ \x73\x3d\xc0\xca\x5f\x7e\x71\xa9\x6d\x65\x4e\xb2\xec\x72\xaa\xe0\ \x9c\x41\xd7\x0d\x04\x42\x06\x1e\x3c\x9a\xb4\x6e\xf4\x7a\x02\x23\ \xe3\x01\x89\x31\x1c\xf6\x73\xe5\x0b\x97\xa4\x73\xe8\xbc\xdd\x12\ \x62\x05\x31\x91\xd5\x51\xbb\x67\x60\x1e\x78\xe3\x81\xe6\x93\xd9\ \x69\x71\x65\x7b\x5e\x5f\xad\x45\x0c\x0b\x13\xfe\x30\x62\x34\x15\ \x9a\xaa\x40\xe2\x00\xe3\x0c\xa0\x69\x03\x7f\x30\x82\x4b\x9d\xf7\ \xc3\xd7\xff\x1e\xd2\x49\xc0\xb3\xa9\x30\x6b\xd9\xad\xfe\x11\x63\ \x72\x22\x98\x77\xed\xc4\xae\x41\x79\x06\x5a\x54\xf5\x5d\x49\x82\ \x4b\x7b\x7b\x7b\xf1\x32\xed\xeb\x96\x76\x31\xe6\x0d\x72\xce\x01\ \x61\x11\x11\x83\x99\xea\x76\x85\x4a\x0a\x32\x9c\x85\x2f\xa4\x4a\ \x44\x40\xc8\x20\x6c\x5d\x9f\x6b\x2f\xca\xcf\xb0\xf7\x3f\x7c\x12\ \xf3\x6a\x51\x16\xeb\xea\x1d\x36\x75\x21\x89\x79\x2f\xcf\x2e\x2b\ \xd5\xcf\xb9\x54\x67\xfd\x99\x4e\x9a\x0a\x18\xcc\x61\x57\xc2\x96\ \x10\xdf\x5f\xab\xad\xe0\x21\x8e\x14\xcf\x88\x7f\xfb\xb9\xd6\xbe\ \x1f\x3e\xfd\xa6\x35\xd8\xd6\x33\x4c\x4e\x55\xc2\xd0\x78\x08\x4f\ \x02\x26\xd6\xe7\xa7\x33\x45\xe6\xb0\x2c\x01\xd9\x1e\x9e\x0f\x06\ \xc3\x6b\x03\xc3\x93\xcc\x1d\x17\xe3\x5d\x9e\x9d\x7a\x43\xd7\x4d\ \x2f\x20\x3e\x07\x80\x9b\x35\x15\xde\xf6\xfa\x8a\xb6\x2b\x35\xe5\ \xe5\x86\x6e\x6d\xfc\xfd\x4a\x5f\xfb\x89\x1f\x3b\x82\xf1\x0e\x8e\ \xcc\x24\x0d\x97\x6e\x8d\x42\x91\x38\x2c\x21\x58\x64\xa1\x31\x09\ \xa8\x9a\x43\x1d\xca\xcc\x48\xae\x8d\xd5\xec\x0d\x60\xbc\xcf\x22\ \x9b\x77\xe1\xc4\xb4\xd5\x55\x74\xe9\x86\x79\x68\x2a\xa0\x4b\x31\ \x0e\x05\x43\xe3\x21\x08\x00\x76\x85\xc3\xb2\x88\x29\x42\x16\x00\ \x30\xdb\x63\x4b\x88\x60\xa2\xcb\xf1\x65\x8c\xc3\xfe\xb3\xae\xab\ \x8f\x29\xc2\x4e\xc5\x2c\x4d\x9e\x5a\x08\x2e\xaa\x6a\x5c\xa5\xc8\ \xd2\xd9\xea\xb7\x8a\xd4\xa4\x78\x0d\x69\x89\x4e\x6c\x2e\x48\x86\ \xaa\x48\x30\x05\x31\x9b\xb5\x00\xec\x48\x4b\xcf\x39\x8b\xcb\xe2\ \xcc\xde\x37\x04\x00\xa0\x72\xc5\xa2\xf9\x2e\xaa\x6a\x48\x63\xc4\ \x7f\xb3\x2c\xd2\x8e\xb6\xb4\x47\x48\x10\x88\x00\xc2\xf4\x5e\x08\ \xb2\xe9\x56\x40\x00\x73\x3e\x90\xe2\xaa\xa6\x31\x06\xb8\x16\xd1\ \x00\x10\xc1\xc7\xb8\xd8\xfe\xc4\xe6\xee\x71\xf9\x46\x1c\x4f\xab\ \x01\x00\x85\xa0\xb6\x9f\xda\x3b\x4a\x04\x92\xe7\x1c\x8f\x6b\xf8\ \x64\x87\x6c\x93\x39\x00\x06\xc6\x80\xb0\x6e\xe2\xe3\xba\xd6\xc8\ \xfd\x91\xc9\xf7\xaf\x1f\xdf\xdd\x1d\xad\x8b\x4c\xdb\xd7\x29\x40\ \xbc\x56\x5a\x50\x18\x76\xc7\xe8\xf1\xdd\xff\x3e\x2c\x1d\x1c\x7d\ \x5c\x47\x84\xc4\x79\xad\x00\x11\xb3\xdb\x64\x5c\xb8\x35\x02\x06\ \x42\x69\x5e\x12\x9a\xce\xdf\x89\x0c\x8c\xfa\x8e\xb6\x1d\xdf\xd5\ \xb0\xd0\x4e\x16\xce\x14\x49\x15\xc7\x54\x87\xef\xa7\xc9\xb0\x48\ \x9a\xf0\xfb\xab\x6c\xb2\x6c\xcd\x9c\x9f\x33\x6e\xd3\x96\x86\x29\ \x90\x91\xe8\x04\x03\xd0\xdd\x3f\x46\x9c\xb1\x55\xc5\xef\x34\x2f\ \x5d\xf4\xdc\x12\x9e\xb3\x2c\xb1\x61\xd2\x17\xdc\x7d\xfb\xde\xe0\ \x87\xbe\x40\x38\x9b\x71\xdc\x9d\xbd\xf1\xac\x30\x88\x31\x00\x6b\ \x72\xe2\x30\x38\x1e\xc4\x90\x97\xe3\xc8\x81\x2d\xf6\xa6\xf3\x3d\ \xdb\xce\x5d\xe9\xef\x29\xa9\x6e\xfa\x4a\x58\xd4\x01\x62\x03\x5c\ \xb1\x64\x22\xe9\x88\x43\x55\xe2\x7a\xee\x0e\x6d\xb6\x29\x12\xb9\ \x63\x35\xc3\x3b\x11\xaa\x5f\x04\x9e\x96\x66\x08\x86\x74\xe4\x2f\ \x89\x45\xc4\xb4\xd0\x79\xcf\x8b\x57\x0a\x33\xa5\xe2\xfc\x74\xad\ \xe3\xce\xf0\x07\x9e\xc7\xbe\xb0\x67\xcc\xc7\xc6\x27\x82\x4e\xc9\ \xc6\x90\xe2\xd6\x90\x97\x93\x8c\xc4\x38\x27\x6b\xfc\xa5\x2b\xac\ \x99\x7a\xe3\x22\x30\x67\x8c\xdd\x7f\x34\x85\x43\x35\x97\x26\x38\ \x03\xdf\xb1\x69\xb9\x6d\xcb\xba\x2c\xbb\x37\x60\xc2\x22\xa0\x30\ \x2f\x4d\x2e\xb0\x52\x5d\x8c\x4d\xf7\xcf\x10\x04\xd3\x14\x98\xf0\ \x47\xd0\xf8\xeb\x0d\xbf\x65\x18\x07\x2f\x9e\xdc\x1b\x9e\x95\x24\ \x22\x30\xc6\xa4\xf5\x95\x0d\x46\xac\xd3\x16\xe8\xef\xba\xb8\xc3\ \xd3\x71\xe6\x51\xee\x96\xca\x9d\xee\x25\xb9\xd5\xab\x9f\x4f\xcb\ \xc8\xcf\x4d\x51\x32\x53\x63\x99\xd3\x61\x43\xc4\x10\x30\x4c\x0b\ \x93\x01\x1d\x5d\xbd\x1e\x71\xf5\xe6\x43\x3d\x38\x31\x72\xb8\xfb\ \xf4\xc1\x1a\x00\x61\x00\x61\x22\xd2\x67\xc0\xf6\x75\xfb\x1a\xbc\ \x7e\xcf\xed\xb2\xde\x73\x9f\xfd\x03\xc0\x11\x8d\x3d\x7d\xed\xce\ \x35\x29\x2b\xb7\x95\x2b\x5a\xfc\x5a\x70\xa6\x3a\x55\xc5\x08\x46\ \x4c\x89\x08\x10\x11\xdf\x9f\xa3\x7d\xad\xc7\x06\xae\x36\x75\x03\ \x08\x45\x13\x24\xa2\xe0\x0c\x98\xad\xde\x7d\xec\xcd\x9b\x0d\xfb\ \x2f\x03\xb0\x03\x50\xe7\x44\x89\x46\x92\x9c\x6e\x25\x21\xa3\x20\ \x21\xe8\x1d\xf6\x06\x46\xfb\xbc\x00\xf4\xe8\x5c\x47\xa2\x50\x1f\ \x80\x08\x11\xd1\xa2\xa5\x89\x31\x26\xcd\x81\xcd\x44\x06\x20\x61\ \xfa\x37\x6f\x45\x63\x44\xa3\x03\x30\x89\xc8\x9a\xcb\xf9\x0f\x29\ \x69\x5c\x9a\x72\xdc\xdf\x60\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ \x42\x60\x82\ \x00\x00\x06\x63\ \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\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\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\x05\xe0\x49\x44\ \x41\x54\x38\x8d\x7d\x95\x5b\x6c\x54\xe7\x11\xc7\x7f\xdf\xd9\x73\ \xf6\x6e\xaf\xf7\x62\x7b\xb1\x8d\xd7\x60\x53\xd7\x06\xe3\xda\xe1\ \x16\x73\x6b\x4c\x1a\x44\x89\x52\x8a\x1a\xa2\x22\xfa\x52\xf5\x92\ \xaa\xa2\x4a\x9e\xaa\xaa\x51\x55\x84\x54\x51\xa9\x0f\xad\xe8\x43\ \x90\x8a\x50\x09\xa9\xd4\x26\x6a\x13\xaa\x8a\xbb\x03\x09\x38\x81\ \xba\xd8\x06\x63\x1b\x63\x1b\x1b\xdf\xed\xf5\xde\x2f\xc7\xbb\x67\ \xcf\xd7\x87\x80\x1b\x14\xd4\x91\xe6\x71\x7e\x33\xff\x99\xd1\x8c\ \x90\x52\xf2\x2c\x6b\x6b\x3b\xec\xf5\x06\x4a\xbe\xa1\xd9\xec\xbb\ \x43\x35\xc1\xc6\x75\x4d\xab\xaa\x63\xf1\xb4\x31\xf4\x60\x6a\xf2\ \xd1\xd8\xcc\x40\x36\x91\x3a\x67\xe4\x72\x1d\x9d\x9d\xc7\xa3\xcf\ \x8a\x17\xcf\x02\xef\xde\xfb\xd6\x0f\xbe\x7b\x70\xe7\xb1\x86\xb5\ \x21\x5f\xa9\xb7\x48\xac\xac\x08\x60\xe6\x52\x4c\xce\x27\x18\x89\ \x59\x29\x18\x05\x16\x17\xa2\xe6\x40\x77\xff\xcc\xf5\xab\xdd\xbf\ \xbe\x76\xe9\xd8\x9f\xfe\x2f\xb8\xad\xed\xb0\xff\xe5\x6f\xb7\x5d\ \xd9\xf7\xca\xf3\xeb\x72\x86\x61\x59\x88\xa5\x28\x09\x04\x71\x8f\ \x9c\x62\x6e\xf0\x2a\xd3\x81\xfd\x94\xb7\xec\x27\xbb\x94\x27\x92\ \x48\x53\x53\x9c\xc7\xc8\xea\x85\x53\x7f\xbe\xd8\x35\xd2\x3f\xb5\ \xb7\xb3\xf3\xf8\xe2\x97\xc0\x6d\x6d\x87\xfd\x3f\xfa\xc9\xcb\xf7\ \x5f\x78\x61\xbd\xbf\x6b\x70\x82\x72\xbf\x07\x5d\xcf\xa1\x3d\xfa\ \x80\x1a\xfb\x2c\x55\x8e\x08\xdd\xe3\x05\xe6\x2a\x0f\x61\xad\xdc\ \xcc\xaa\xe2\x1c\xf7\x86\x46\xd9\xd0\x54\x4f\x2a\x9d\xe1\xd4\x99\ \x8b\x8b\x1f\x5f\xba\x57\xff\x04\xae\x3c\xc9\xb0\x73\x57\xcb\xf9\ \x83\xaf\xb5\xfb\xfb\x47\x67\xa8\xad\x0c\xb0\xa5\xa9\x16\x1e\xbc\ \xc7\x2a\x57\x84\x95\xfa\x0d\xc4\xe4\x65\x5a\x4b\x17\x09\x4e\x9f\ \xa1\x30\x76\x85\xd1\xc9\x79\x3c\x1e\x0f\xc1\xf2\x52\xca\x02\x5e\ \x5e\xff\xfe\x37\xfd\xd5\x6b\xca\xce\x2d\xcb\x97\x52\xb2\xef\x3b\ \x47\x5f\x8f\xc7\x93\xa6\x69\x9a\xd2\x30\x0c\x99\xcf\xe7\x65\xc7\ \x99\x5f\xc9\x87\x1f\xbe\x21\x0b\x7f\x6b\x95\x85\x93\x81\xff\xf9\ \xdf\xb7\xcb\xdb\x27\x5f\x95\xb3\x03\x57\xa5\x69\x9a\xd2\x34\x4d\ \x99\x4c\x26\xe5\xd4\xd4\x94\xec\xfa\x4f\x8f\xb9\xe3\xc5\x37\x0f\ \x4b\x29\xb1\x5c\xbc\xb8\xe8\x7d\xe3\xcd\x6f\x9d\x5b\xd7\xb8\xda\ \x06\x20\x84\xe0\x93\xf7\x8f\x51\xe3\x4e\x10\xca\xdd\x80\xe4\xd8\ \xd3\x53\x31\xd2\x04\x4b\x7d\x0c\x0f\xde\x65\x3a\xba\x84\xaf\xb2\ \x1e\x21\x04\xb9\x5c\x0e\x4d\xb5\x88\x48\x3c\xba\xf5\xad\x5f\x9c\ \x3e\xa1\x68\x76\x5b\xfb\xf6\xb6\x26\xf7\x93\xb8\xcb\x7f\xf9\x0d\ \x21\x77\x82\x50\xfe\x53\x48\x8c\x3e\x0d\xd5\x8a\xc0\xee\x07\x3d\ \x4c\x73\x95\x89\x3a\x79\x81\x77\x4e\xfe\x9e\x4f\x6e\xdd\x59\x86\ \x6f\x68\xad\x2b\xc6\x62\x69\x57\x9b\xbe\x56\x7b\xa0\xa8\xc8\xc5\ \xc0\xfd\x07\x84\xfb\xff\xc5\xea\xe2\x04\xa1\xfc\x67\x10\x1b\xfa\ \xe2\xf2\x80\xad\x04\xac\x45\x60\xb1\x83\xc5\x06\xb9\x24\xeb\xab\ \xdd\xd8\xe7\x87\x89\xa6\x7d\x40\x0d\xe9\x4c\x96\xda\x50\x05\x36\ \x87\xf9\x9a\xda\xda\x52\xbd\xa5\xa7\x6f\x90\x9e\xde\x2e\x7c\x43\ \xef\x12\xdc\xb4\x87\x61\xe5\x79\xf0\x6f\x46\x14\x74\xea\x8a\xc2\ \xc8\xb9\x5b\x60\xf5\x80\x6a\xc7\x0c\x6c\x64\x74\x4e\x87\xbc\x02\ \xba\x44\x28\x92\xb9\x1b\x7f\x24\x1c\x4d\xa2\x95\xb7\x32\x30\x1e\ \xc6\x1f\x70\x35\xa8\xaa\xaa\xb9\xdc\x2e\x27\xc1\xaa\x3a\x62\xa1\ \xf7\x19\x70\x58\x71\xda\xac\xd8\xad\x2a\xfa\xc7\xbf\xa4\xda\x6d\ \x43\xb3\xfb\x41\xb5\x83\xc5\x8e\x50\x54\x62\x89\x34\xad\x87\xde\ \x5e\xd6\x53\xba\x2b\xc5\x5f\xff\x79\x8d\xb6\x32\x1f\x1d\x37\xfb\ \x70\x95\x54\x38\x94\xe1\xf1\x78\xb2\xe3\xce\x3c\x9a\xaa\x91\x0c\ \x4f\x61\x37\x12\xe4\xb3\x29\x12\xd9\x3c\xba\xb7\x99\x25\xe1\x02\ \xd5\x09\xaa\x0b\xa1\x3a\x51\x2c\x2a\x32\x97\xc2\xa2\xd9\xb1\x68\ \x76\x4c\x2c\x14\x4c\x41\xed\xca\x72\xae\x77\xf5\x31\x98\x0c\x60\ \x16\x4c\xa9\x8c\x3d\x9c\x9d\x72\x14\xfb\xe8\x9a\x73\xe2\xb0\x69\ \xbc\xb4\xb9\x9e\x3d\x1b\x43\x58\x93\xe3\x24\x6d\xab\x48\x9b\x6e\ \xd0\x9c\x08\xd5\xf1\x79\x02\x04\xd9\x6c\x8a\x9e\xbb\xfd\x00\xe8\ \xba\x8e\xae\xeb\x54\x06\xfd\xa4\x92\x29\xbc\x2e\x2b\x8b\x0b\xd1\ \x19\x65\x72\x62\x7e\x40\x91\x05\xd2\x7a\x0e\xbb\x55\x5d\x96\xf7\ \xe2\xb6\xe7\x28\x2f\x72\x10\x89\x25\x10\xce\x15\x8f\xab\x76\x82\ \x91\xa1\xa9\x79\x13\xb7\x2f\x9c\x20\x9d\x4e\x93\xc9\x64\xc8\x66\ \xb3\x44\xa2\x31\x2e\xf4\x25\x71\xaa\x92\x78\x24\x71\x5f\xc9\x65\ \x32\xe7\x93\xd1\x84\x99\xce\xe6\x28\xb6\x3f\xbd\x5d\xed\x3b\xb7\ \x92\x8a\x2d\x20\x8b\x6b\x1f\x83\x1d\xa0\x68\xf8\x3c\x76\xf6\x6e\ \xaa\xa0\xfb\xdd\x1f\x93\x4a\xc4\xc8\x64\x32\xdc\xec\xee\x27\x6f\ \xf1\x20\x33\x69\x53\x1a\xc6\x79\x4b\x55\xc5\x73\xb3\x9a\xa6\x1e\ \x2a\x0f\x55\x16\x8f\x4c\xc7\xd8\xb8\xc6\x8f\xa6\x69\x08\x21\x00\ \x48\xc9\x12\x32\x73\xfd\x78\x4a\x4a\x40\xb1\x80\xea\x40\x2a\x56\ \xac\x45\x65\x04\x43\x8d\xcc\xf5\xfe\x83\x14\x5e\xc6\x66\x62\xa4\ \x0a\x0e\xb2\xd3\x33\x13\x89\x70\xe2\xe7\x4a\x67\xe7\xf1\x68\xcf\ \xbf\x07\x8e\x68\xe9\x58\x36\x9c\x55\xf9\xed\xe9\x2b\x44\x22\x11\ \xe2\xf1\x38\xa9\x54\x8a\x05\xc3\xcb\xb9\x5b\x23\xcc\x25\x4c\xa4\ \xab\x92\x25\xad\x8c\xb4\x56\x45\x5a\xf8\x51\xdc\x15\xac\xd9\xfe\ \x3d\xca\xc4\x38\x13\xe3\x23\x04\x14\x23\x3d\x31\x32\x7d\xb4\xb3\ \xf3\x78\x74\xf9\xba\xed\xde\x77\xe4\xf2\xd7\x0f\xec\xd9\xd5\x3b\ \x1e\xe7\xc8\xfe\x10\x36\x9b\x95\xa9\x99\x79\x4e\x5f\x1e\x44\x77\ \xae\x64\x75\xea\x12\x5b\xca\xc3\x54\xaf\x69\xa6\xc8\xbb\x02\xe1\ \x5e\x81\xd3\xee\x40\xb3\x39\xd0\x0d\x41\x6f\xef\x5d\xfe\xf0\xf6\ \xa7\x1f\x9d\x3d\xfb\xbb\x76\x80\xe5\x69\xcd\x3e\x1c\x38\xd4\x7b\ \xa5\xf8\x66\xfd\xf6\x4d\xd5\xc3\x63\x13\x54\x94\xf9\xb8\xde\xd5\ \xc7\xbc\xac\x40\xa6\x74\xba\xcc\x6d\x7c\x36\x59\xc0\x3a\x9e\xa6\ \x44\xcc\x50\xae\xf5\xb3\x76\x85\x42\x4b\xe3\x57\x70\x05\x1b\x59\ \xfd\xd5\x0d\xb9\x57\xb6\xf5\x1c\x15\x42\x58\xa4\x94\x05\xf5\xf1\ \xe1\x71\x03\xca\xf4\xf4\xed\x03\xb3\x53\xd3\xc7\x37\xfe\xec\xa5\ \x0d\x7d\xf7\x47\xc4\x85\x61\x05\x6c\x3a\x52\x4a\xa4\x69\x82\x69\ \x90\x31\x0c\xa2\x05\x07\xa3\x79\x85\x89\x8c\x85\xce\x91\xb9\xa5\ \xf9\xa1\x6b\x03\xc7\x8e\xfd\x74\xb4\x6a\xfd\xd6\x10\x10\x10\x42\ \x7c\xde\x0a\x21\x84\x0a\xb8\x01\x2f\xe0\x5e\xdb\xfc\xea\xc1\xe6\ \x8d\x2d\x3f\x2c\xad\x6d\xf0\x49\x9b\x4d\x24\xb3\x39\x16\x63\x69\ \xa4\x59\xa0\xc4\xa9\xe2\x54\x41\x66\x33\x66\x78\x7c\x7a\xb1\xff\ \x4e\xd7\x3b\x83\xf7\xce\xbe\xd7\xd0\xd0\x90\x3b\x71\xe2\xc4\x8a\ \x1d\x3b\x76\x5c\x96\x52\x2e\x7d\xe9\xe7\x09\x21\x14\xc0\x52\x57\ \xb7\xab\xcc\xe3\x0d\xb5\x5b\x6c\xce\xdd\x25\x3e\x4f\x9d\xcf\xef\ \x09\x22\x25\x8b\xe1\xe8\x6c\x3c\x12\x1f\x36\x96\x32\x17\x63\xd1\ \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\x02\xd0\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\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\x02\x4d\x49\x44\ \x41\x54\x38\x8d\x8d\x92\x4b\x48\x94\x61\x14\x86\x9f\x6f\xfc\xe7\ \xf2\x8f\x3a\x9a\x58\x86\x89\x83\xe5\x05\x5a\x68\x57\x49\x14\xac\ \x55\x60\x41\x0c\x26\x15\x51\x66\x41\x04\x95\x15\xe1\xa6\x84\x5c\ \xe5\x22\x82\x88\x16\x09\x85\xb4\xa8\x28\x89\x68\x19\x59\x79\x6d\ \x53\xd6\x30\x86\x56\x0c\x53\x44\x03\xe9\xd4\x28\x73\xfb\x67\xfe\ \xb9\x7c\x2d\x06\x27\x94\x19\xf0\xdd\x1d\xce\x77\x9e\xf3\x7e\xe7\ \x1c\xf1\x74\xe8\xc9\xb5\xf1\x89\xb1\x3e\x56\x48\xd7\x75\x00\x0e\ \x1f\x3a\x72\x66\x77\xeb\x9e\x81\x95\xf9\x25\x29\xe3\x13\x63\x7d\ \x5d\x9d\xa7\xb2\x26\xa3\x51\x8d\xfb\x83\xf7\xee\x1a\x15\x63\xa0\ \xb9\xb9\xe5\x71\xb6\x37\xe2\xfc\x85\xb3\xb2\xdd\x71\x90\x99\xd9\ \x99\x5c\x4d\x78\x3b\xf2\x66\x59\xbc\xaf\x6d\xff\xad\xce\xe3\x27\ \x2e\x01\x28\x00\xaa\x6a\xa5\xb8\x68\x4d\x4e\x80\xe3\x40\x7b\xba\ \x9b\x10\x08\x21\x78\xf6\x7c\xe8\x62\x06\xa0\xeb\x3a\x9a\x16\xe1\ \xd5\xe7\x10\xd3\x3e\x6b\x4e\xc8\x32\xd9\x1c\xec\x3c\xfd\x50\xd6\ \x57\x9a\xbf\x66\x1c\x4c\xfb\xac\xdc\xbe\xbc\x97\xa8\x9e\x5c\x15\ \xc3\x62\xca\xa3\xfb\xe6\xcb\x3a\x05\x40\xd3\x22\x00\xfc\x5e\x88\ \xe2\x99\x0f\xaf\x0a\xb0\x71\x5d\x3e\x00\x4a\x34\x1a\x45\x55\x73\ \x5b\x4f\xa5\x24\xa3\x93\x6e\xa6\x9c\x5e\x02\x81\x10\x36\x5b\x01\ \xdb\xb7\x6c\xc0\xee\x68\x48\x03\x22\x91\x48\xc6\x41\xb6\xe2\x81\ \xc1\x49\x8c\x96\x42\x1a\x76\x35\x21\x14\x33\xbe\xbf\x41\x3e\xce\ \x7c\xc1\xe3\x79\x8d\xb5\xc4\x88\x61\x69\x06\xd9\x34\x3a\xe9\x4e\ \x17\x37\x36\x52\x6b\x2f\xe1\xc5\xd5\x5a\x6a\xab\x4a\xb1\xda\xb7\ \x31\x1f\x14\xf8\xe6\x42\x69\x40\x2e\x07\x53\x4e\x2f\x95\x35\x75\ \xac\xb5\x29\xd4\x94\x9b\x31\x29\x82\xcd\x15\x2a\x95\xa5\x46\xc2\ \x6a\x15\x0b\xfe\xd8\xff\x3b\x30\x1a\x52\x48\x40\x4a\x89\x10\x02\ \x29\x25\x81\x40\x08\x14\x0b\xfd\xc7\xca\x29\xb0\x18\x00\xe8\xed\ \x28\xe3\x5c\x5b\x29\x25\x47\x17\x10\x31\x9d\xcc\x16\xec\x45\x31\ \xfc\x21\x1d\xaf\x5f\x03\x29\x48\x21\xb1\x16\x58\xf1\xfd\x09\x72\ \xf2\xce\x4f\xea\xed\x16\x7a\x3b\xd6\xd3\xf3\xc0\xcb\xb0\x2b\x88\ \x88\x47\x50\xcc\xa6\xf4\x17\xe6\x7c\xf3\x6c\x6d\x6a\xc1\xf9\x63\ \x91\x78\x42\xa2\x27\x53\xc4\x13\x92\xea\xea\x32\xbc\x9e\x59\xde\ \xbb\xc3\x0c\xbb\x82\x2c\x86\x93\x0c\xbb\x82\x38\xbf\x6b\x98\x83\ \x6e\xea\xab\xcc\x9f\x44\x77\xff\xa3\x91\x77\x9e\x54\x6b\xb6\x19\ \x48\x09\x9e\x6f\x7e\x12\x86\x7c\x62\x85\x9b\x88\x1b\x54\x44\x3c\ \x82\x29\xe0\xa6\xd8\x18\x0e\x2f\x06\xf4\x62\x21\xa5\xcc\x79\x03\ \x00\xea\x8e\x1b\x0a\x22\xef\x0a\x42\x74\x91\x4a\x56\x60\xc8\xfb\ \x85\x94\x83\xc8\xe4\x75\xed\x43\x4f\xe2\x1f\x46\x03\xef\x1d\x6f\ \x58\xa2\x9f\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\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\ \xbb\x7f\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\ \x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd5\x0b\x04\x15\x33\x13\x1c\xad\xc4\x0f\x00\x00\x01\x48\x49\x44\ \x41\x54\x38\xcb\xa5\x93\x41\x4b\x02\x51\x10\xc7\x7f\x6f\x77\xf5\ \x4b\x78\x94\x95\xee\x11\xf4\x01\x22\xea\x2c\x11\x14\xde\xed\x14\ \x41\x41\x87\x50\x12\x6f\x7d\x80\x24\xba\x45\xa2\x29\x5d\x83\xbe\ \x41\xd4\x35\xe8\xb2\xc4\x26\xa2\x6c\x0a\xa5\x54\x76\xd8\x9d\x0e\ \xae\xaf\xc4\x24\xb5\xb9\xbc\x99\xc7\xfb\xff\xe6\xcd\x7b\x33\xf0\ \x4f\x53\x00\xb9\x7c\xb6\x0a\x24\xa7\xd4\x16\x32\x07\x87\x5b\x56\ \x18\x24\x97\x97\x56\xb0\xed\xc4\x44\xca\x76\xbb\x45\xe9\xa2\x98\ \x06\x34\x00\xdb\x4e\xb0\xba\x79\x34\x11\xe0\xba\xb4\xaf\x7d\x0d\ \x88\x46\xa3\x00\x2c\x2e\xcc\x21\x63\x6a\x15\xe0\xe6\xf6\x61\x68\ \x5f\x03\x7c\xdf\x07\xc0\xb0\x4c\x90\xfe\x61\xa5\xc2\x15\x41\x50\ \x78\xde\xcb\x08\x58\x03\x82\x20\xe8\x03\x0c\x13\x94\xfc\xc8\xa9\ \x00\x78\x7c\xf2\x78\xed\xf6\x00\x10\x91\x51\xc0\xc0\x4c\xcb\x0c\ \x3d\xa1\xf9\xdc\xe1\xfd\xe3\x93\xee\x5b\x0f\x50\x58\x11\xeb\x6f\ \x80\x61\x1a\x78\xed\x0e\xcd\x56\x07\x44\x85\xd0\x08\x20\x28\xc5\ \xf8\x12\x06\xd4\x7b\xa7\x39\x24\xfa\x7e\x40\xa5\xe3\x5f\x6f\x30\ \xf8\x05\xcf\xad\x4f\xd5\x4d\x1a\x50\xab\xd5\xb8\x3a\xdf\x9b\x48\ \xd4\x68\x34\x46\x00\x85\xea\x65\x39\x3d\x65\x2b\x67\x00\x54\x2e\ \x9f\x9d\x07\xee\x76\xb6\x77\xf1\x7d\x1f\xd7\x75\x89\xc5\x62\x43\ \x75\x02\x38\x8e\xa3\x7b\x25\x1e\x8f\x73\x72\x7a\x0c\x90\x52\xb9\ \x7c\x56\xd6\xd7\x36\x66\x9a\xc4\x72\xa5\x88\x05\xa4\xca\x95\xe2\ \xd9\x8c\xd3\x9c\xfa\x02\xfc\xc1\x78\x3b\xf4\x23\x18\xf8\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\xf2\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\ \xbb\x7f\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\x0a\x12\x39\x0d\xf9\xdd\x70\x50\x00\x00\x01\x7f\x49\x44\ \x41\x54\x38\xcb\xa5\x91\x4d\x88\x52\x51\x18\x86\x9f\x63\x2a\xfe\ \x40\xa6\x8b\x10\x5a\x04\x41\xb4\x0e\x82\x99\x20\x9a\xe5\x2c\xe3\ \x62\x11\xb4\xa9\x88\x20\x88\xfe\x98\xdd\x6c\x66\xb6\xb3\x08\xa2\ \x5d\x50\x33\xce\x2a\x44\xa4\x65\x49\x50\xb6\x6c\x17\x18\x46\x9b\ \x88\x22\x28\x05\x0b\xb1\x7b\x8f\x47\xcf\xfd\x66\x71\xed\x0a\xe2\ \x05\xcd\x97\x0f\x0e\x9c\xc3\xf7\xbc\x2f\xef\x51\x97\x2e\x97\xb6\ \x8a\xc5\xe2\x36\x53\x32\xc6\x04\xe7\xc0\xdc\xda\xdb\xdd\x7f\x42\ \x84\xd4\x9d\x7b\xb7\xe5\xfa\xd5\x1b\x33\x1f\xb5\xf6\x78\xb6\xf7\ \x94\x5e\xaf\x77\xa5\x5a\xa9\x3d\x8f\x04\x94\x9c\x8b\xb4\x3e\xb5\ \xa2\x4c\x78\xdb\x78\x33\x7d\xf5\xa8\x5a\xa9\x3d\x00\x88\x03\xa4\ \xd3\x19\x8e\xe4\xf2\x91\x00\xe7\x42\x29\x70\x53\x0a\xa5\x14\xb5\ \x17\xd5\xfb\x40\x00\x30\xc6\xe0\x79\x2e\xaf\x3f\xf6\x69\x76\x32\ \xcc\xa5\xc3\x0e\x67\x6e\x3a\x52\x48\xe9\xcf\x61\x82\x66\x27\xc3\ \xe3\x8d\x75\xb4\xb1\x73\x31\x52\xc9\x43\xdc\x7d\x58\x3f\x15\x07\ \xf0\x3c\x17\x80\x9f\xbf\x35\x5f\xda\x7f\xe7\x02\x9c\x38\x9a\x05\ \x20\xa6\xb5\x26\x9d\x9e\x33\xfa\x0c\xc5\x5c\xd7\x0d\x13\xfc\x17\ \xe0\x5f\x07\x4b\x01\x16\x4d\x60\xad\x8f\x1e\x06\x65\x87\xbf\x90\ \x88\xf9\x08\x20\x22\x28\xa5\x10\x11\x44\xc0\x17\xc1\x5a\x61\x68\ \x7d\xcc\x48\x18\x8c\x2c\x43\x2b\xe4\xb2\xc9\x09\xc0\xf3\x5c\x8e\ \xe7\x06\x74\xfb\x86\x1f\x5d\x0f\x44\xe1\x23\x8c\x07\x11\x10\x04\ \x91\x31\x18\x18\x59\x99\x00\x7e\x75\xda\x9c\x3e\x7b\x8e\x0f\x5f\ \xff\x8c\x97\x02\x77\x11\xf0\x11\x04\x05\x22\x61\xaa\x95\x93\x05\ \xea\x2f\x5f\x91\xd7\xdf\xcb\xea\xfc\xb5\x9d\x86\x9b\x38\xb6\xb6\ \x68\x79\xd9\xe1\xb7\xf7\xef\xca\x9b\xab\x2c\xab\x03\xc2\x87\xb4\ \xca\xa7\xb0\xe2\xf8\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ \x82\ \x00\x00\x01\x56\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\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\x00\xd3\x49\x44\ \x41\x54\x38\x8d\x9d\x53\x39\x0e\x84\x30\x0c\x9c\x58\xe4\x0b\xb0\ \x25\xdf\x40\xbc\x1f\x21\x3a\x1a\xfe\xb0\xbc\x00\x82\x1c\x7b\x2b\ \x10\x21\xe1\xda\x69\xa2\x8c\x33\xe3\x23\xb2\x51\x55\xb4\x6d\xfb\ \x15\x91\x02\x2f\x40\x44\x63\x55\x55\x9f\x0c\x00\x44\xa4\xa8\xeb\ \xfa\x8d\x1e\x4d\xd3\x14\x00\x90\xed\x49\x55\xbd\x14\xad\x71\x22\ \xda\xb8\x2c\xf5\xd0\x18\x93\x14\x1a\x63\xa2\x24\x84\x1b\x1c\x05\ \xc7\x7b\xd4\x42\x2a\xcb\x99\xf8\x51\x05\x47\x30\xf3\xff\x06\xcc\ \x8c\x65\x59\x02\x2e\xf9\x0b\xfb\x21\xae\x9c\xaa\xc2\x7b\x1f\x19\ \x04\x15\x30\x33\xfa\xbe\x87\xaa\x42\x55\x21\x22\xdb\x29\x22\x18\ \x86\x01\xde\xfb\xf3\x0a\xe6\x79\xc6\x34\x4d\x10\x91\x28\x3b\x00\ \x38\xe7\xa2\xb6\x02\x03\xe7\x1c\xac\xb5\xe8\xba\x2e\x35\x02\x58\ \x6b\xaf\x0d\x00\xa0\x2c\xcb\xa4\xf8\x0c\x81\x41\x9e\xe7\xaf\xc4\ \x9b\x01\x11\x8d\xeb\x72\x3c\x05\x11\x8d\x00\x60\xee\x16\xe8\x0e\ \x3f\x66\x9a\x7f\xb3\x7a\xd3\x63\xe4\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x02\xab\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \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\x02\x3d\x49\x44\x41\x54\x38\x8d\x85\ \x93\x4d\x68\x13\x41\x18\x86\xdf\x99\xec\xe6\x0f\x6b\xc0\x60\xd2\ \x43\xfc\xc1\xaa\xf5\x22\x1a\x8f\x49\xb4\xe0\xc1\x8b\xf1\x22\x14\ \x2f\x1e\x2a\xe2\x41\x14\xea\xa1\x55\xf1\x2a\x08\xd2\x15\x3c\xa9\ \x50\x84\x9c\x14\x21\xa2\x52\x53\x5b\x72\xb1\xd6\x55\x08\xb5\x2d\ \x14\x7b\xa8\x55\xb4\x54\xcd\x9a\xae\xfd\x0b\xe9\x26\xb3\xb3\x9f\ \x87\xd6\x1a\x9b\x18\xdf\xe3\x37\xdf\x3c\xf3\xbe\xf3\xcd\x30\x22\ \x42\xb5\xe2\xdd\x6a\x1e\x84\x30\xea\x89\xc1\xd0\x7b\x44\x73\x75\ \x49\xa9\x69\x22\x84\x6f\x5d\x48\xc3\x76\x04\x6c\x47\x60\xc9\x2a\ \x60\xc9\x32\x01\x00\x77\x1f\xdd\xa8\x01\xd7\x02\x00\x30\xc6\x90\ \x9b\x79\x8e\xb2\x5d\x42\xa1\x38\x83\x8f\x73\x63\x68\x3f\x78\xb5\ \xae\x29\x5e\xaf\x58\x1d\xca\xa3\xf8\xeb\x6e\x6c\x08\x00\x11\x88\ \x1c\x10\x11\x14\xee\x6e\x08\x50\x12\x97\x55\x9d\x1c\xc4\xd6\xed\ \xbb\x60\x39\x24\xbd\x92\x6c\x48\xb2\xb1\x5c\x36\x51\xbd\x16\xef\ \x52\xd7\x0d\x32\x8e\x37\x0a\x39\x48\x45\x42\x2d\xd1\x8b\x27\xaf\ \xfb\x14\x97\x0a\x22\xc7\x2b\x49\x82\x98\x04\xb8\x44\x51\x16\xa0\ \x7a\x39\xb8\xc2\x70\xfe\xd4\x35\x2f\x08\x10\xa2\x82\x74\x36\x55\ \x9a\x5f\x9c\x4b\x31\x22\x42\xa2\x5b\x4d\xb7\x45\x8f\x27\x8f\x44\ \x93\x9e\xf7\xf9\x57\x90\x5c\x40\xa2\x8c\x15\x7b\x11\xd3\xf3\x39\ \x10\x68\x2d\x16\x47\xdb\xf6\xd3\x18\x9d\x18\x29\x4f\x4e\x8d\xf7\ \xbd\xee\x11\xed\x7c\x2d\x72\xc7\xcb\xb1\x8c\xf1\xc5\x98\xa2\x48\ \x70\x2f\x88\x57\x00\x97\x8d\x42\x65\x1a\xaa\x8f\xc1\xed\xe3\x50\ \x7d\x2e\x44\x23\x47\x61\x2e\x98\x34\xf9\x61\xdc\x20\xc2\x99\xf5\ \x4b\xd4\x35\x51\x04\x21\xf9\x70\xf0\x9e\xe5\xe5\x4d\x08\xf8\x83\ \x28\xd1\x4f\x94\x5d\x8b\x70\x7b\x39\xdc\x3e\x17\xb6\x6d\xd9\x83\ \x90\xaf\x05\xd9\xa1\x8c\x45\x0e\x92\xba\x26\x8a\x7f\x4d\x41\xd7\ \xc4\x44\x45\xac\x74\x3e\x18\xbc\x53\xda\x11\x38\x00\x9b\x95\xa0\ \x7a\x56\x4f\xde\xbc\x29\x80\xfd\xa1\x63\xe8\xcb\x3e\x2e\x09\x51\ \xe9\xd4\x35\x31\x51\x77\x8c\xba\x26\x7a\x67\x8d\x4f\x2f\x86\xc7\ \x06\x44\x6b\x30\x01\xae\x30\x28\x6e\x8e\x43\xe1\x13\xc8\xbd\x7b\ \x5b\xf9\x61\x7e\xeb\xd7\x35\xd1\xdb\xf0\x1d\x90\x83\x8e\xa1\x91\ \x81\xef\xa6\xb1\x40\xbb\x9b\x62\xd8\xe5\x8f\xc1\xfc\xba\x4c\xb9\ \x51\x3d\xef\xc8\xd5\xdc\x0d\x01\xba\x26\x8a\x24\x91\xcc\x64\x9f\ \x59\x5b\xb1\x0f\x41\xa7\x15\x4f\xfb\x9f\x58\x8e\xfc\x93\xbb\x5a\ \x6c\xe3\x6f\xfc\xad\x78\x97\x7a\x2e\xd2\xbc\xf3\x36\x00\xcc\xe6\ \x3f\x5f\xda\x68\xfd\xbf\x00\x00\x38\x7c\x45\xbd\x0f\x00\xc3\x37\ \xc5\xd9\x7f\xf5\xfc\x02\x73\x4a\x12\x2a\x86\x68\x1c\xcb\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x7d\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\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\x01\xfa\x49\x44\ \x41\x54\x38\x8d\x95\x91\xbd\x6b\x53\x51\x18\xc6\x7f\xe7\xde\x24\ \x8d\x49\x4c\x6e\x22\x42\x41\x02\xd6\x4a\xbe\x44\x44\x5c\xaa\x83\ \x20\xc5\x41\x1c\x4d\x51\x27\x97\x4e\x0e\x0e\x82\x53\x07\x09\x45\ \xa1\x83\xf8\x07\x28\xb4\x0a\x2e\x1a\x50\x68\x16\x03\x5a\x10\x35\ \xa2\x64\xe9\xa2\x49\x90\x88\xc5\x8f\xb4\xc4\x04\x73\xc1\xe4\x26\ \xf7\x1c\x17\x13\x72\x9b\x50\xec\x03\x07\xce\xcb\x39\xcf\xf3\xfe\ \x5e\x5e\x91\xcf\xe7\xb3\x85\x42\xe1\x02\xbb\x50\x3a\x9d\xbe\x98\ \x4a\xa5\x1e\x03\x90\xc9\x64\xd4\x6e\xf5\xcf\x83\x52\x0a\x57\x3f\ \xb5\x5e\xaf\x23\xa5\x04\x40\x08\x31\xe8\xd6\xbf\x0b\x21\xd0\x75\ \x9d\x50\x28\xe4\xa0\x19\x04\x48\x29\x29\x97\xcb\x0e\xc3\xb0\x84\ \x10\x24\x93\xc9\x91\x71\x5c\xc3\x45\x3c\x1e\xdf\x91\x60\x9c\x5c\ \xc3\x1f\x87\x09\xb6\xeb\xbf\x08\x62\xb1\xd8\x98\x8e\x6d\x94\x9a\ \x40\xd3\x34\xa4\x92\x3b\x07\x54\x2a\x15\xc7\x63\x22\x91\xc0\xea\ \xe9\x2c\xad\x2e\xf2\xe4\xdd\x53\x6a\x8d\x4d\x26\xf7\x4d\x72\x48\ \x9f\x62\x31\x7d\xdb\xd3\xcd\xb6\x2d\xc7\x08\xdb\x09\xac\x5e\x97\ \xd9\x5b\x67\xd1\x82\x70\xfc\xcc\x11\x84\x27\xc5\x66\x63\x8b\xd2\ \xfa\x47\xd0\x29\xba\xd3\xde\x13\x0e\x82\x72\xb9\xec\x98\xf9\xde\ \x9b\xfb\x28\x9f\xcd\xb1\x99\xa3\x98\x56\x8b\x96\x65\x22\xbd\x3d\ \xa6\x67\xa2\x98\xaf\xcc\x83\xed\x5f\xdd\x85\x91\x2d\x0c\x13\xbc\ \x7c\xb8\x46\xea\xd4\x61\x5a\x9d\xdf\xb4\xba\x2d\x4c\xab\x85\xdf\ \x1d\x60\x2e\x7e\x89\xf5\xea\x8d\x00\x4d\x2e\x6b\xc3\x1d\x4b\xa5\ \x92\xe3\xfc\xa8\xff\xc4\xef\xf3\xb3\x70\xf2\x26\x28\xd8\xeb\x09\ \xb2\x72\xee\x11\x6f\xbf\xbd\xa6\xeb\xee\x80\x24\x3a\x96\xa0\x4f\ \x11\xdd\x7f\x80\x6a\xad\x8a\x31\x11\xe6\xf9\xdc\x1a\x2e\xcd\x45\ \xb3\xd3\x60\xf5\xf3\x33\xd4\x1f\x01\x1a\xd5\x01\x41\x24\x12\x21\ \x12\x89\x10\x0e\x87\x31\x0c\x03\xc3\x30\x98\x9f\x9d\xe7\xfb\xa7\ \x2d\xee\x7c\x58\x42\x08\x81\xad\x6c\xae\xbd\xb8\x4a\xc7\xee\x20\ \xbf\xe8\x26\x36\x2b\x22\x97\xcb\xe5\x8a\xc5\xe2\xf9\x91\x05\x03\ \x4a\x29\x96\xab\x0f\x68\x7a\x1a\xf8\xa6\xdd\x04\x82\x3e\xbe\xd6\ \x36\xd0\x37\xf6\xf4\x2c\xb3\xf7\x1e\x9b\xd3\x42\x29\x35\xce\x3b\ \x90\x3b\xed\xd5\xd1\xb8\x8e\xa6\xae\x20\xc5\x14\x9a\xaa\x62\x8b\ \x65\x14\x77\xbb\xd9\xb6\xfc\x0b\xe9\xb0\xf7\x9f\x1d\xb8\x7d\xd3\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x1c\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \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\ \xd6\x01\x0b\x0e\x00\x2d\xad\x93\x8a\x5c\x00\x00\x01\xa9\x49\x44\ \x41\x54\x38\xcb\xad\x91\x4f\x28\xa4\x61\x1c\xc7\x3f\xcf\xfb\x0e\ \x92\x03\x87\x41\x89\x52\x52\x43\x6a\x46\xe1\xc8\x65\x94\xa6\xec\ \x61\xf7\x60\x0f\x6e\x73\xb0\x38\x70\x92\xd9\xe2\x66\xc9\x41\x4e\ \x84\x26\x24\x17\x93\xdb\xee\x64\x1b\x6d\x39\xec\x61\x85\x31\x4b\ \x11\x8a\x22\x8b\x79\x22\x6a\xa6\xa5\xf1\xbe\x0e\xe6\x9d\x5e\x7f\ \x66\xc6\xc1\xf7\xf2\x3c\xdf\x7e\xbf\xef\xa7\xef\xd3\x23\x30\xa9\ \xd4\x35\xe8\x04\x02\x71\x5b\x7d\xe4\xf7\x6c\x92\x46\xca\xf3\xf0\ \xd7\xf6\xa6\xc8\x48\xef\x27\x80\x60\xa9\x6b\xd0\xf1\x26\x80\x11\ \xf6\xb4\xb9\xe4\x8f\xd5\xd3\x9c\xc0\xfa\x31\x63\xfd\x2d\x6f\x82\ \x08\x23\xdc\xd9\xea\x3c\xff\xf5\xf7\xac\xd0\x3c\xfc\xd2\x5c\x49\ \xd7\xc0\x42\xca\xe7\x28\x40\xa0\xc7\xed\x0c\xdf\xdc\x69\x85\x35\ \xb6\x82\xc4\xa0\xc6\x56\xc0\xda\xbe\x64\xf6\x5b\x2b\x40\x30\x55\ \x03\x1d\x20\xc3\xa2\xf2\xf9\x63\x03\x6b\xbb\x17\x68\xc4\xa8\xb3\ \x15\xb1\x14\xf8\x43\xf8\x2a\x02\x40\xf4\xec\x30\x11\xba\xd8\x98\ \x14\xc6\xdd\x72\xe4\xf7\x08\x80\xb2\x0f\xc3\x3a\x00\xba\x86\x2e\ \x04\xaa\xa2\x71\x79\x1d\xa5\xd6\x5e\xf1\xb8\x19\x3f\x57\x7e\xfa\ \x5f\xff\x85\x64\xca\xcc\x56\xd9\xdd\x3f\x61\x6f\xef\x14\x35\x2b\ \xe3\xc5\xdc\x62\x36\xb1\xbb\x18\x8e\x32\x2b\x00\xb7\xff\x35\x50\ \xd2\xf2\x9f\x02\x16\xbe\xff\x7e\xb1\x70\xaf\x29\x80\x0e\xe2\x11\ \x26\x00\xab\xdd\xad\x03\xc8\x90\x57\x88\xd7\xa8\x56\xbb\x5b\x1f\ \x1f\xed\x61\x71\xe5\x00\x80\x9d\xed\x63\x00\x2a\xaa\x4a\x00\x28\ \xce\x53\xc3\x33\xd3\xbe\x7c\x19\xf2\x8a\x64\x1d\xab\xdb\xbb\x87\ \xa9\x77\x14\x27\xc2\x06\x28\x37\x4b\x3d\x9f\x99\xf6\xe5\x03\x8d\ \x46\x23\x92\xb4\x70\x00\xc1\xa1\x81\x2e\x7c\x4b\x5b\x48\x19\xc5\ \x59\x5f\x2e\xbd\x13\x73\x56\xa0\x51\x86\xbc\xcb\x29\x01\x66\x48\ \x7f\x5f\x07\xff\xe4\x75\x64\x6a\x7c\x3e\xc7\x1c\x4e\x0b\x30\x43\ \xe2\xf6\x49\xf8\x5d\xf4\x00\xa8\x9e\x9d\x76\x42\x9c\x4d\xd8\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\xc1\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \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\x0b\x13\x00\x00\ \x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd6\x01\x04\x0f\x21\x1e\xc7\x7d\x84\xc8\x00\x00\x02\x4e\x49\x44\ \x41\x54\x38\xcb\xc5\x92\x3f\x4c\x53\x51\x14\xc6\xbf\x7b\x6f\xdb\ \x57\xaa\xb4\xa5\xd0\x82\xf2\x27\x29\xe8\x50\x63\x8d\xd1\x49\xa3\ \x83\x26\x26\x9a\x40\x18\x48\x70\x20\x1a\x13\x6d\x5c\x75\xc2\x98\ \x38\x29\x83\x95\x41\x93\xc6\x81\x68\x62\x34\x61\x70\x72\x80\x38\ \x3a\x32\xd5\x28\x41\x43\x0c\x08\x15\x10\xa1\x2d\xed\xe3\xf5\xcf\ \x7b\x7d\xef\x9e\xeb\x40\x02\x45\x70\x72\xf0\x6c\xe7\x4b\xce\x2f\ \xdf\x39\xdf\x01\xfe\xb1\xd8\x9f\xc2\xe9\x5b\x6f\x82\x9c\xb3\x2c\ \x91\x72\xd5\xeb\x9c\x33\x87\x48\x85\xd3\x2f\xae\x15\xeb\x75\xd7\ \x1e\x22\x43\xa2\xef\xdc\x51\x9e\xe8\x8d\x83\xb1\x2d\xbe\x52\x0a\ \xcf\xdf\x7d\xe2\xef\xa7\xe6\x13\x00\x9e\xfc\xd5\xc1\xa9\x9b\xaf\ \xb9\x4b\xf0\xea\xd8\xf0\x15\xcf\xec\xcf\x12\x3e\xa4\x17\x08\x00\ \xce\x9e\xe8\xe0\x21\x2f\xc3\xc3\x57\x53\x35\x47\x52\xc3\xc7\x97\ \xd7\x69\xdb\x59\x3d\x80\xa4\xbc\x70\x3c\xda\x22\x7c\x5e\x17\x96\ \xf3\x65\xa4\x67\x32\x48\xcf\x64\xb0\x5a\xb0\x60\xd9\x84\x70\xc0\ \x2b\x48\xca\x8b\xbb\x56\xab\x6f\xdc\x02\xcf\x2e\x9f\x89\x8a\xe9\ \xc5\x0d\xfc\x58\xc9\x03\x44\xcb\x20\x5a\x9a\x5b\xcc\x62\x7e\xdd\ \xc4\x91\xae\x16\x21\x18\x9e\xee\x0b\x88\x0f\x8d\x75\xba\x05\x8b\ \x85\x03\x1a\x32\x39\x0b\x9f\xbf\x2e\x49\xcb\xb2\xef\x58\x96\x7d\ \x77\x76\x6e\x45\xfe\xd2\x1d\x78\xbc\x07\xe0\x38\x4e\x2c\x3e\x34\ \xd6\xb9\x07\xc0\x99\xba\x77\xfe\x64\x17\xfb\xbe\x56\xc5\xca\x9a\ \x81\x8d\xa2\x01\x22\x39\x49\x24\x27\xf5\x4d\x03\xd9\x42\x05\xd9\ \x32\xd0\x14\x0a\x31\xa5\xd4\xfd\x5d\x80\xd8\x60\x4a\x93\x8e\xbc\ \xdd\x79\xa8\x89\x65\x72\x35\xe4\x0a\x25\x38\xb6\x2d\x48\x4a\x8b\ \xa4\xb4\x1c\xdb\x11\x45\xbd\x8c\x8a\x49\xf0\xf9\x9b\x19\x49\x27\ \x11\x1b\x4c\x69\xdb\x31\x12\xc9\x81\x68\x7b\x08\xba\xc9\x50\xac\ \x28\xb4\x46\x9a\x71\xe3\xea\x25\x84\x0e\xba\x11\xf6\x6b\x08\x07\ \x34\x30\x00\x23\x6f\xbf\x41\x71\x0f\xdc\x5a\x03\xcc\x8a\x31\x00\ \x60\xdc\xb5\x65\x9f\xa5\xda\x0f\x47\xc4\x6a\x51\xa2\x6a\x03\xc5\ \x92\x8d\xe5\x9c\x09\xdb\x51\xb0\x1d\x82\x2d\x15\x94\xda\x39\x5c\ \xa0\xb9\x55\x98\xe5\x52\x0a\xc0\xb8\xab\xa7\x7f\x34\xce\x99\xf2\ \x33\xcd\x0f\xbd\x4a\xf8\x32\x3d\x2d\xf5\x42\x41\xec\xf7\xb6\xbe\ \xc6\xa0\xec\xe8\x39\x26\x7c\x8d\x41\x28\x28\x7f\x4f\xff\x68\xdc\ \xc5\x80\x64\xa4\xad\x5d\x6c\x9a\x80\x61\x18\x28\xe6\x37\xa0\x14\ \x69\x0b\x13\xc3\xb5\xfa\xe1\x68\xef\x63\x4f\x59\x2f\x54\x6a\x66\ \x15\x1e\x6f\x03\x82\x2d\x6d\x22\xbf\xba\x94\x64\xdd\x7d\xc9\x35\ \x92\x32\xb2\xfd\x9a\x9c\x3f\x5a\x98\x18\x7e\xb0\x9f\x83\xee\xde\ \xe4\x08\x91\xdc\x49\x80\x8b\x75\xfc\xf7\xfa\x0d\x49\x31\x0d\x6b\ \x63\x0d\xcf\x0b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x02\xa8\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\x8d\x00\x8e\x00\x8b\x21\xf4\ \xa3\x7e\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\ \x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd6\x06\x13\x0f\x1d\x09\x48\xb3\xcb\xc6\x00\x00\x00\x0f\x74\x45\ \x58\x74\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x69\x64\x20\x6c\x6f\x67\ \x6f\x86\xc6\x77\xb9\x00\x00\x02\x1a\x49\x44\x41\x54\x38\xcb\xa5\ \x90\xbf\x4f\x13\x71\x18\xc6\x9f\xfb\xa5\x77\x2d\xb4\xa5\xd7\xd6\ \x5a\x2a\x14\xa2\x0c\xb4\x0e\x6e\x6e\x50\x28\x83\xec\x9a\x38\x69\ \x6a\x7f\x80\x11\x4d\x4d\xdc\x1a\xe9\x60\x52\x07\x93\x42\xd4\x34\ \xc5\x46\x05\x37\x27\x75\x31\x31\xb6\x16\xf9\x03\x64\x30\xba\xb5\ \x8b\xa9\x18\x13\x38\xae\x72\x57\xee\x7a\x77\x0e\x72\x17\x43\x89\ \x51\x7c\xa7\xf7\xfb\xe6\x79\x3e\xef\xfb\x7c\x09\xec\xd5\xe2\xfd\ \xc2\x3b\x59\x96\xc6\xf1\x17\xc5\x71\xb6\xda\x8d\xb9\x4c\x14\x00\ \x68\x73\x28\xcb\xd2\xf8\x6c\xfa\x1a\x14\x45\xb1\x84\x86\x61\x74\ \x99\x0d\xc3\xc0\x93\xe5\xb2\xb5\x88\x0e\x4d\xe7\xe7\x01\xe4\x00\ \x1d\x92\x24\x41\x10\x84\x2e\xa3\xf9\x66\x18\x06\x24\x49\x02\x00\ \x42\xd3\x79\x03\x40\x8e\x06\x90\xcb\x66\x2e\xa0\xbe\xba\x04\x51\ \x14\xd1\x6c\x36\x0f\x34\x03\x00\x45\x51\x20\x08\x02\xa2\x28\x22\ \x9b\x49\xe1\x4e\xe1\x79\xce\x8a\xf0\xb1\xd1\x82\x20\x08\x68\x34\ \x1a\x7f\x8c\x60\x6a\x87\xc7\xf6\x22\x98\xc3\xba\x1c\x44\xfc\x6e\ \xa5\x4b\x4c\x10\x07\x21\x82\x56\x67\x01\x22\x67\x63\x38\x4c\x59\ \x80\xd8\x19\xfe\xff\x00\x9f\xbe\x88\xff\x64\x1c\x0d\x3a\x7e\x45\ \x0c\x9d\xcb\xd7\x40\x60\xec\x50\xeb\x0d\xac\x5a\x5f\x34\x77\xfd\ \xaa\x71\xf9\x52\x5c\x7d\x54\x2e\x29\x93\x93\x53\xcc\xda\xda\x7b\ \x26\x1a\x9d\xd0\xaa\xd5\x0a\x19\x8b\x4d\x69\xb5\x5a\x95\x9a\x88\ \xc6\xf4\xb7\x95\x37\xe4\xe2\xc2\x03\xaa\x2b\x02\xcb\xb2\xaa\xda\ \x51\xb7\x79\xaf\x47\x6b\xb5\x7e\x10\x43\xa1\xe1\x5e\x5d\x37\xe4\ \xc1\xc1\x21\x5a\xd3\x74\xc9\xe1\x70\xf8\x69\x86\xd9\xe4\x38\x9b\ \xed\xf7\x23\x48\xb3\xe1\x79\x7e\x87\x24\xc9\xd7\x36\x9b\x0d\x23\ \xa7\x46\x20\xed\xee\x28\x03\x03\x27\x74\x97\xcb\x29\xbb\xfb\xdc\ \x6d\x00\x88\x84\xc3\x47\xbd\x5e\xaf\xda\x05\x28\x2c\xdc\x2b\x01\ \xd0\x22\xe1\xd3\x17\x7d\x1e\xdf\xb1\x8d\x6f\x5f\x7d\x00\x64\x9e\ \xf7\x90\x24\x49\xd4\x7b\x1d\x3d\x9d\xfe\xfe\x20\x58\x96\xd3\xed\ \x76\xbb\x54\x2c\x3e\x4c\xef\xbf\x20\x71\x33\x73\x8b\x5f\x5e\x79\ \xac\x03\xf8\xbc\xb5\xb5\x29\xf0\x6e\xde\xef\x72\x3a\xe9\x5d\xa5\ \xcd\xac\xaf\x7f\x38\x09\x00\x2b\xcf\x9e\x3a\xd3\xa9\xd9\xb6\xda\ \x51\xce\xef\x07\x94\x4b\x4b\x45\xf8\xfd\xc7\x8f\x24\x13\xe9\xd1\ \x64\x22\xdd\xa7\x28\x0a\x5e\xbe\x7a\xd1\x43\x51\x74\xe0\x4a\x3c\ \x49\xa4\x92\x33\x44\x20\x10\x98\xb9\x3d\x9f\xfd\xce\xb2\xdc\x86\ \x09\xf8\x09\xe4\xcc\xc3\x08\xa5\xf7\x2c\x65\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x8c\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \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\x02\x1e\x49\x44\x41\x54\x38\x8d\x95\ \x93\x4f\x68\x13\x41\x14\xc6\xbf\x37\xbb\x33\xd9\x8d\x85\x7a\x68\ \x4c\xff\xd1\x82\x04\xed\xc1\x40\x2a\xa8\xd0\xd5\x8a\x68\x44\x62\ \x45\x2d\x14\x72\x6b\x4a\xc9\x49\x90\x62\x16\xc1\xab\xc7\x52\x91\ \xa0\x17\x0f\x45\x4f\x1e\xa5\x42\xf1\xe2\x4d\x2a\x5e\x44\x50\xd0\ \x43\x29\xb4\x2a\x95\x94\x34\x89\xa6\x9a\x26\xd9\xd9\x19\x0f\x51\ \xac\x21\xa9\xf6\x1d\xdf\xfb\xe6\xc7\x7c\xdf\x9b\x21\xad\x35\xda\ \xd5\xc9\x9b\x7c\x1e\x00\x96\x66\xbd\xe9\x76\x1a\xd6\x6e\xe0\xb8\ \x3c\xdd\xdf\x15\x49\xf6\x75\x1d\x4c\x3a\x2e\x4f\xef\x09\xe0\xb8\ \x3c\x1a\x10\xfb\xb2\x57\xce\x4c\x06\xc7\x46\x93\xc1\x80\x08\x66\ \x1d\x97\x47\xff\x0b\xe0\xb8\xbc\x03\x84\xc5\x89\x73\xd3\xd6\x96\ \x97\xc7\x96\xb7\x89\xf8\xc8\x25\x0b\x84\x45\xc7\xe5\x1d\xff\x04\ \x10\xe1\xd1\xe8\x70\xa2\xa7\x37\x34\x48\x9f\x4b\x1f\xf0\xb1\xf4\ \x1e\x9d\x9d\x9d\x14\x1b\x3a\xd1\x0d\xc2\xc3\x5d\x01\x8e\xcb\xd3\ \xfd\x07\x22\x89\xb3\x47\xc7\xf9\x4a\xfe\x0d\x0c\xc6\x61\x32\x8e\ \x57\x6b\x0b\x88\x0d\x1d\x17\xa1\xfd\x3d\x89\xe6\x3c\xd8\x8e\xc3\ \x51\xc1\xed\x6c\x2a\xe1\xda\xeb\xe5\x65\x68\xf2\x20\x84\x89\x3a\ \x7d\xc7\x36\x15\xf1\x2e\xff\x1c\x17\x4e\x5f\x0d\x9a\xa6\xf8\x2b\ \x0f\xb6\xd3\xf7\xd4\x58\xc6\x52\xe4\xa1\x22\x4b\x10\x01\x01\x1e\ \xe0\x28\xcb\x75\x08\xdb\x40\x41\xae\xa2\xa8\x56\x71\xfe\xd4\x45\ \x8b\xd8\x9f\x3c\xd8\x6f\xdf\xf1\x63\xe3\xdd\x87\xfa\x62\x94\xaf\ \xac\xc1\xe4\x06\x38\x37\x50\x51\x05\x54\x8d\xaf\x10\x36\x83\xb0\ \x19\x96\xbf\xbd\x40\xb8\x37\x44\x47\x0e\x0f\x87\x89\x35\xf2\xa0\ \x91\x8c\x99\x1e\xe8\x8e\x64\x6f\x4c\xdc\xb1\x05\x0f\x40\x41\xc2\ \x87\x87\xd7\xb9\x05\xbc\x2d\x3c\x83\x64\x15\x10\x23\x24\x06\x32\ \xd0\x5a\x43\x29\xa0\x5e\xaf\xe1\xf1\xd3\xf9\x4a\xb1\xb4\x39\x63\ \x12\x43\xea\x53\x6e\xc5\x9e\xb9\x77\xb9\xe1\x89\xa3\x7a\xf7\xfa\ \x13\xab\x2c\x73\xf0\x8d\x6d\x70\xc1\xc0\x4c\x82\xc1\x09\x73\x0f\ \x6e\x57\x65\x4d\x5b\xbf\xec\x07\x89\x21\x65\x2e\xcd\x7a\x4e\xd3\ \x26\xb4\xd6\x0a\xa5\xfa\x17\x30\x83\x60\x70\x06\x1e\x68\x40\x64\ \x4d\x5b\x2f\xe7\x3c\xda\xf5\x1d\x00\x80\xd2\x3e\x7e\xd4\x8b\x8d\ \x2b\xfb\x1a\xb2\xae\xa0\x55\xeb\x3f\x63\xb6\x6a\xfa\x4a\xa2\x5a\ \xdb\x86\x32\x35\xa0\x15\x7c\x49\xf0\xbd\x3d\x00\xa4\x2f\x11\x1f\ \xbc\x06\x62\x00\x31\x02\x11\xf6\x00\x20\x6c\xdc\xba\x3f\x19\x6e\ \x25\x26\xc2\x46\x73\xef\x27\x30\xf7\xc5\xdb\xb6\xd0\x9a\x22\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\x90\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \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\x22\x49\x44\x41\x54\x38\x8d\x6d\ \x52\x4d\x6c\x54\x65\x14\x3d\xf7\x7b\xef\x95\xf9\xad\x33\x6d\x07\ \x5b\xa8\xb6\x0a\x86\x12\xa6\xa1\xa2\x33\x8d\x7f\xd1\x98\x46\x37\ \xc4\x60\x58\xa8\xbc\x44\x8c\x90\x81\xf0\xb3\x61\x07\x1b\x0c\x4d\ \x0c\x11\x74\x61\xa2\xe0\x03\xa3\x31\x4c\x25\x98\x34\x01\x37\xfc\ \x04\x21\x92\xd4\xc2\xab\x71\xd1\xd0\x92\xd4\xd2\xc6\x01\x46\x3b\ \xb4\x1d\xe8\xcc\xb4\xf3\xde\xfb\xbe\xeb\xa2\xf3\x92\x59\x70\x92\ \x9b\xdc\xc5\x3d\x27\x27\xe7\x5c\x62\x66\xf8\x48\x65\xb2\xcf\x34\ \xe8\xda\x11\x10\xde\xf4\xa4\x6a\xd5\x84\x98\x27\xc2\xb8\xe3\xca\ \x13\x00\x2e\xd8\x96\xe9\xd6\xdd\x1e\x04\x70\x82\x7c\x81\x74\x26\ \xbb\x45\xd3\xc4\x40\x4f\xd7\x2a\x7d\x5d\x67\xb3\xd1\xd6\x14\x01\ \x98\x51\x28\x56\x30\x32\x76\xbf\x7c\x67\xfa\xa1\x27\x15\xef\xb6\ \x2d\xf3\x6c\x7a\x57\x36\xc3\x8c\xef\x00\xc4\x88\x99\x91\xca\x64\ \xd7\x1b\xba\x18\xd9\xda\xd7\x1d\x8a\xc7\x82\xd0\x89\xd0\x1c\x0d\ \x20\x1c\xd0\x11\x0d\x19\x08\x1a\x02\x33\xc5\x45\x1c\xcf\x0e\x57\ \x0a\xc5\x8a\x1d\x0d\x35\xf4\x3e\x2e\x57\x0d\x66\x34\x11\x33\xe3\ \xd5\x3d\x67\x4f\xf5\xac\x6b\xfb\x34\x18\x30\xc4\xad\xd1\x1c\xaa\ \xae\x07\x43\xd7\xe4\x9a\xd5\xb1\xc5\xbe\xf4\xf3\xe1\xde\xf5\xad\ \xa4\x09\x82\x10\x84\x5f\xae\x4d\xa8\xb7\x5e\x6c\x17\x07\xbe\xbe\ \xea\x38\xae\x6c\xd1\x01\x80\x99\x3f\xbc\x33\x5d\x10\xae\xa7\x58\ \x31\x2f\x32\xe3\x33\xc7\x95\x67\xc6\xa7\x67\x93\x13\xf7\xe6\x8f\ \x5e\xef\x68\xee\xda\xb7\x75\x53\x28\x11\x0b\xe1\xe3\x77\xbb\x44\ \x2d\x06\x02\xa0\x04\x00\x48\xa9\xc2\x55\xc7\xf3\x92\x2f\x3c\xfb\ \x83\x94\xea\x11\x80\x41\xdb\x32\xf3\xb6\x65\x5e\xf9\xe3\xdb\x8f\ \x5e\x1a\x9d\x2c\xec\xdd\x7d\xec\x12\xee\x3f\x2c\x61\x7a\xa6\x0c\ \xa9\x18\x00\x03\x00\x0b\x2c\xaf\xaa\xe9\xa9\x48\x7f\x63\x24\xf0\ \x55\x67\xfb\xca\x6e\x00\x53\x75\x69\xeb\xba\x26\x76\x6e\x7b\x27\ \xe9\x76\x3e\x1d\x45\xa2\x71\x05\x34\x41\xbe\x03\xd6\x6b\x77\xf1\ \x5f\x3f\xdf\xbc\x80\x27\xe3\xb4\x27\xd5\x6b\x17\x87\x27\xab\x57\ \xed\xa9\x25\xdf\xbc\xe3\xaa\x00\x00\xf6\x5b\xa8\x02\x30\x6a\x04\ \xae\x9b\xdf\x00\xec\x04\xe0\x3e\x41\x58\xb7\x2d\xf3\x9e\x2f\xe0\ \x9d\x3f\xfa\xbe\x06\x10\x98\x19\x17\xed\x7f\xd4\xa9\xf3\x7f\xe5\ \xa4\x54\x3d\xb6\x65\x16\xeb\x59\x87\xb3\x63\xab\x4a\xe5\xa5\x8e\ \xdf\x47\xc6\x6f\x00\x88\xe9\x00\x40\x04\x10\x11\xee\xfe\x57\x86\ \x21\x18\x27\x07\xff\x24\x00\x5f\xd4\x93\x53\x99\x6c\x98\x88\xee\ \xf6\x6e\x5c\x7b\x26\x3f\x33\x97\x02\xa0\x01\xa8\x0a\x00\x10\x44\ \x04\x00\x1d\x89\x10\x56\xb7\x84\xf1\xe5\xfe\xb7\xa9\xad\x25\x72\ \xec\x95\x3d\x3f\xdf\x4a\x65\xb2\xe9\x9a\xc6\xf6\x15\x86\xae\xe7\ \xf2\xb3\x07\xf2\x85\xe2\xeb\x9a\x46\xae\x6d\x99\xae\x58\x76\x40\ \x78\x5c\x71\x71\x61\x68\x8a\x3d\x8f\xd1\xbe\x32\x8a\xc3\x3b\xde\ \x08\x7d\xd0\x97\x7c\xb9\xb5\x39\x72\x2d\xbd\x6b\xc0\x35\x74\xf1\ \x8d\x54\x32\x3e\xf7\x68\x01\x4d\x8d\x41\xd2\x84\x18\x04\x00\xff\ \x91\xa8\xff\xc7\xa1\xa5\x89\xdc\xdc\xe4\xa5\xe1\xc9\xce\xcc\x96\ \x4d\xe1\x44\x2c\x88\xee\xb5\x09\x7a\xae\x3d\x1e\x2a\x96\x5d\xfc\ \x3b\x5b\x82\xe3\x78\x14\x09\x1a\x38\x77\x79\xb4\xe2\x49\x75\x04\ \x00\x96\x1f\x49\x31\x4d\xe4\xe6\x4e\xdf\x3c\xb9\x2d\xf9\xa0\xb0\ \xf0\x49\xff\xf7\x37\xe6\x8f\x0f\xdc\x2c\x0d\xdf\xce\x23\x3f\x5b\ \x46\xd5\x95\x10\x44\x28\xcc\x97\xe4\xb9\xcb\xa3\x8b\x52\xa9\x8c\ \x6d\x99\x63\x00\xe0\xb7\xf0\x13\x80\xed\xb6\x65\x72\x2d\x30\x03\ \xc0\x7b\x0d\x86\xb6\x57\x31\x6f\x90\x52\xc5\x0d\x5d\x9b\x21\xc2\ \x50\xd5\x91\x87\x6c\xcb\xfc\xdb\x0f\xf7\x7f\x2e\x55\x76\x6a\x13\ \x65\xcc\xc6\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x3e\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \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\x0b\x13\x00\x00\ \x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd5\x09\x16\x12\x37\x29\x3b\x52\x02\x48\x00\x00\x01\xcb\x49\x44\ \x41\x54\x38\xcb\xa5\x93\x4d\x68\x13\x41\x14\xc7\x7f\x33\xdd\xa3\ \x48\x16\x22\x2d\xe2\xb1\xe0\x29\xa0\x58\x2b\x01\x0f\x82\x15\x84\ \x78\xec\x45\xd0\xb6\x27\xaf\xa5\x17\x15\x3c\x8a\x20\xc5\x20\xf5\ \x22\x7e\x80\x9a\x16\x8a\x31\xbd\x5b\x1a\x11\x4d\x5c\x10\xed\xc1\ \x62\xd3\x8d\x1b\x4c\xfd\xc0\xd5\x6c\xeb\x10\x15\x5a\x91\xcd\x78\ \x30\x43\xb3\x6d\x6a\x2b\xbe\xcb\xff\x0d\xcc\xfb\xcf\x6f\x66\xde\ \x83\xff\x0c\x61\x92\xe2\x5d\xfa\x80\x19\xe0\xd8\x56\x7a\x78\x88\ \xbc\xa9\x93\x00\x97\x47\x2f\x9d\x01\x66\x0e\x1e\x77\xd8\x8e\xb6\ \x12\x58\x4d\xbd\x01\xf0\xed\xf9\x39\xb6\xa3\x57\x4f\x4a\xdd\xac\ \x3b\x2d\x8d\xd3\xde\x54\x40\x59\x15\x58\xdd\x93\xa7\xac\x0a\xfc\ \xe8\x7a\xd8\x56\x5f\x4c\x4b\x06\xc7\x8a\x1c\xe9\x1f\x06\x18\x37\ \x04\xc4\xe3\x71\xc4\x89\xa5\x3f\x8b\x7d\x4d\x65\x4d\x7d\xdf\x27\ \x7f\x4f\x32\x74\xed\x19\x1f\x9e\x8c\x33\xb7\x10\x84\x40\x87\xd5\ \x7a\x1f\xa5\x14\xf5\x7a\x7d\xc3\x4b\x07\x41\x80\x9b\x49\xad\x15\ \x7b\xcb\x7c\x2d\x4d\x75\x00\x3d\x11\x03\xdb\xb6\xb1\x6d\x3b\x52\ \xec\xfb\x3e\x6e\x26\xc5\xe0\x58\x91\xc5\xc7\x19\x5e\x95\x97\x51\ \xa5\x1c\x40\xcf\xc8\x64\x63\xf6\xaf\x04\xe6\xe4\x81\x74\x81\xc5\ \x7c\x86\xb9\xb7\x0a\x55\xca\xf1\x73\xff\x45\xce\x9f\xbd\x30\x0b\ \x88\x4d\x09\xb4\xd6\x14\xd2\xbd\x0c\x5c\x79\x8a\x37\x7d\x87\xca\ \xe7\xef\xa8\xf9\x07\xbc\xef\x1a\xa6\xb3\xcd\x37\x46\x08\xb4\xd6\ \x64\xb3\x59\x7e\xc9\x43\xcc\x3b\x0e\xef\x3e\xd5\x59\x7a\x3d\x05\ \xbd\x69\x76\xad\xac\x00\xda\x34\xa1\x6e\x4b\x10\x86\x21\xbb\x3f\ \xa6\x79\xf4\xa5\x9b\xfb\xb9\x1c\xdd\xf2\x25\x3b\xfb\x6e\x91\x4c\ \x26\x71\x5d\x97\x37\x95\x05\x8c\x8b\x5c\x4f\x50\xad\x56\xf1\x3c\ \x8f\x91\xc9\x06\x47\x3b\x2b\xac\xee\x48\x10\x1e\x18\x25\x91\x48\ \x60\x59\x16\x96\x65\x45\xba\x78\x03\x41\x2c\x16\x43\x6b\x4d\xad\ \x56\x43\x6b\x8d\x94\x12\xad\x35\x42\x08\x84\x10\xad\xdb\x1b\x11\ \x03\xa5\x14\x8e\xe3\x6c\x3a\x75\xc6\x64\x7d\x18\x83\x89\x9b\xb7\ \xaf\x9f\xfa\x87\x29\x9e\x30\xc9\x6f\x5a\x9d\xe8\x98\x79\x09\xfc\ \x12\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x78\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\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\x01\xf5\x49\x44\ \x41\x54\x38\x8d\x95\x91\xbf\x6b\x13\x61\x1c\xc6\x3f\xef\x7b\xf1\ \xda\x7a\xd5\x5c\x6f\x51\x68\x0a\x09\x4a\xd2\xd6\x1f\x20\x1d\x74\ \x10\x37\x71\x70\xf4\x40\x37\x41\xfa\x07\x14\x57\xa1\x10\x04\x27\ \xc1\x0e\xdd\x54\x54\xa4\x8b\x14\x5c\x32\x65\x51\xa7\x50\x9b\x38\ \x94\x50\x4d\x32\x58\x3a\xd5\x86\x34\xc9\x25\xd1\x26\xb9\xbb\xd7\ \x25\x29\xb9\x36\x15\xfb\x4c\xef\xcb\xfb\x3e\xcf\xf7\xf3\xbc\xaf\ \x48\xa7\xd3\xab\x99\x4c\xe6\x1e\x27\x90\x6d\xdb\xf7\x67\x67\x67\ \x3f\x00\x90\x4c\x26\xd5\x49\xd5\xf3\xa0\x94\x22\xd4\x4f\xad\x54\ \x2a\xf8\xbe\x0f\x80\x10\xe2\x60\x5a\x7f\x2d\x84\x40\xd3\x34\xc2\ \xe1\x70\x80\xe6\x20\xc0\xf7\x7d\x8a\xc5\x62\xc0\x30\x28\x21\x04\ \x33\x33\x33\x47\xea\x84\x06\x37\x89\x44\xe2\x9f\x04\xc3\x14\x1a\ \xbc\x38\x48\x70\x58\xff\x45\x10\x8f\xc7\x87\x4c\xdc\x47\xa9\x11\ \xa4\x94\xa8\xde\x1b\x1d\x1b\x50\x2a\x95\x02\x87\xd3\xd3\xd3\x78\ \x1d\x8d\xcf\xcf\x9f\x92\x5f\xfd\x48\xbd\xbc\x8b\x79\xee\x3c\xed\ \x68\x8c\x05\xe3\x99\xbe\xd4\xda\xef\x04\x2a\x1c\x26\xf0\xba\x5d\ \x5e\xde\xb9\xcd\x59\xe0\xe6\xe5\xab\x8c\x48\x49\x7d\xf7\x17\xf9\ \x1f\xdf\x69\x43\x6e\xc1\x18\x9d\x0b\x10\x14\x8b\xc5\x40\xe7\xfc\ \xeb\x57\x18\x9e\xc7\xdc\xa5\x2b\x44\x6c\x9b\x88\x6d\xb3\xbd\xb2\ \x82\x5c\x5c\xe4\x5b\xa8\x19\xdd\x73\xbb\x4f\x8e\xfc\xc2\x20\x41\ \xfa\xcb\x27\xae\xc7\x2e\xd2\x75\x1c\x1a\xbd\xf0\xda\xc6\x06\xae\ \xe3\x10\xe9\xb8\xe3\x35\xc1\x83\x40\x85\x42\xa1\x10\x08\xa8\xed\ \xec\x70\x2a\x7a\x01\xd7\x71\x70\x36\x37\x01\xa8\x66\xb3\x74\x1b\ \x0d\xf4\x4e\x07\x7f\x4c\x9f\x1a\x4a\xd0\x0f\xb1\x26\x27\xa9\x95\ \xcb\x8c\x7b\x1e\xd5\xf5\x75\xb2\xf3\xf3\xec\xad\xad\xe1\xb7\xdb\ \xfc\x91\x12\xa9\xd8\x92\x7d\xb3\x65\x59\x58\x96\xc5\xc4\xc4\x04\ \xa6\x69\x62\x9a\x26\x37\x1e\xcd\x53\xaa\x94\x71\x1b\x0d\xa4\xae\ \x73\x6d\x79\x19\xcd\x30\x00\xd8\xd2\xb5\xa6\x27\x78\x2b\x52\xa9\ \x54\x2a\x97\xcb\xdd\x3d\xf2\xc1\x00\x4a\xd1\x7c\xff\x0e\xa3\x5a\ \x65\xaa\xf5\x9b\x33\xc6\x38\xf5\x7a\x8d\xed\xd3\x63\x6e\xcb\x75\ \xbf\x7a\x82\x5b\x42\x29\x35\xd4\xdb\xd7\x82\x31\xaa\x49\x78\x2c\ \x95\x7a\xe8\x0b\x11\x93\x4a\xfd\xf4\x84\x78\xa3\xe0\xc5\x52\x6b\ \xdf\xff\x0b\x27\x85\xf5\x33\x94\x52\x3e\x6e\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x69\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\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\x00\xe6\x49\x44\ \x41\x54\x38\x8d\x9d\x92\x31\x6e\x84\x30\x10\x45\xdf\x00\x52\xb2\ \x15\x12\x87\xc0\x40\x4b\xc3\x1d\x52\x06\x29\xe7\x81\xdb\x24\x4a\ \x9b\x86\x0b\x70\x06\xcc\x19\xe8\xb7\xb2\xb7\x48\x40\x10\x66\xd9\ \x90\x5f\x8d\x65\xcf\xff\x6f\x46\x96\xae\xeb\x3e\xfb\xbe\x7f\xe5\ \x84\xea\xba\x7e\x2b\x8a\xe2\x03\x80\xa6\x69\xfc\x59\xfd\xf4\xe0\ \xbd\x27\x9a\x5d\xa7\x69\xc2\x39\x07\x80\x88\x2c\x69\x73\x2d\x22\ \x84\x61\x48\x1c\xc7\x1b\x9a\xc5\xc0\x39\x87\xb5\x76\xd3\xb0\x96\ \x88\x90\xe7\xf9\x6e\x9c\x68\x7d\x30\xc6\x1c\x12\x68\x8a\xd6\x0f\ \xd7\x04\xbf\xf5\x27\x82\x34\x4d\x95\xc4\x2b\xde\x3f\x11\x04\xc1\ \x31\x01\xc0\x38\x8e\x9b\xcb\x2c\xcb\x80\x0b\x70\x05\x9e\x1f\x8f\ \xa0\x11\x88\x08\x22\x17\xb5\x79\x47\x60\xad\x5d\x6a\x6d\x79\xdf\ \x44\x07\x06\xc6\x98\x3b\x04\xfa\x62\x77\x23\x0c\xc3\xa0\x26\xcf\ \xdb\xd7\x8c\x54\x02\xcd\xe4\xe1\x3f\x48\x92\xe4\x2e\xe6\x91\xa2\ \xb2\x2c\xbf\xda\xb6\x7d\x39\xd3\x54\x55\xd5\xfb\x42\xe6\xbd\xff\ \x57\xf2\xac\x1b\xb7\x37\x69\x77\x68\x01\xa1\x8d\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x0b\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\ \xbb\x7f\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\x0a\x13\x00\x30\xae\xf3\xdb\xcc\x00\x00\x01\x98\x49\x44\ \x41\x54\x38\xcb\xa5\x91\x4d\x4b\x5b\x41\x18\x85\x9f\x91\xd4\x92\ \x08\xa6\x29\x28\xb1\x4a\xc1\xd2\x2e\x5d\x08\x42\x2d\x94\xe6\x27\ \x94\x60\x55\x70\xe3\x47\x29\x48\xab\xa8\x5b\xbb\x68\xb7\xdd\xb9\ \x12\x84\x1a\x75\x55\x24\x04\x97\xea\xc2\x6a\x57\xe2\x42\x97\xba\ \x13\xf1\xa3\xa0\x12\x35\x29\xe6\xde\x3b\xb9\x73\x5f\x17\x37\x5a\ \x12\x12\xd4\xf6\x30\x30\x30\xc3\xfb\x9c\x33\x67\x54\x67\x77\xc7\ \x97\x68\x34\xfa\x95\x12\x69\xad\xfd\xdd\xd1\x83\x33\x89\xb9\x29\ \x2a\x48\x0d\x8f\x7c\x92\xfe\xde\xf7\x65\x2f\x6d\xdb\x62\x7a\xe6\ \x3b\xd9\x6c\xb6\x27\x39\x9f\xfa\x51\x16\xf0\x71\x68\x50\xba\xde\ \x75\xb3\xbd\xb3\x5d\xc9\x84\xd5\xb5\x9f\xa5\x47\x13\xc9\xf9\xd4\ \x18\x40\xc0\x18\x43\x30\x18\xe2\x51\x38\x52\x11\x10\x7f\xdb\xe1\ \xbb\x29\x85\x52\x8a\xd4\x42\x72\x14\xf0\x01\x5a\x6b\x2c\x2b\xc7\ \x45\xe6\x9c\x7f\x51\xc0\x75\xdd\x5b\x13\xdc\xbc\xb7\x90\xa0\x08\ \x00\xdc\x24\x48\x6c\x85\xef\x66\x5b\x1b\xa7\xed\x43\x5c\xc2\xd5\ \x4e\x69\x02\x8f\xf1\x81\x18\x25\x26\x65\x15\x7a\x18\xe0\xf3\xe4\ \x8a\x0f\xb8\x4e\xf0\xa4\xae\x09\xc7\x35\x1c\x9d\xd9\xb7\x02\x9e\ \xd5\xd7\x00\x50\x05\x10\x0c\x86\xf8\x6d\x85\xa9\x0d\x55\xdf\xbb\ \xc4\xaa\xeb\x0e\x32\x16\x34\x37\xdc\xad\x03\x63\x3c\xec\xbc\x29\ \x4e\xb0\xbe\x07\x6d\x2d\x4f\x39\x4c\x5b\x00\x88\x08\x9e\x27\xb8\ \xc6\xc3\xc9\x1b\x2e\x6d\x97\x8b\x4b\xcd\x49\xc6\xe6\x38\xe3\x90\ \x73\x4c\xf1\x2f\x3c\x8f\x58\xa4\xff\x68\x8e\xce\x2c\x10\x85\x87\ \x50\x58\x88\x80\x20\x88\x28\x44\x04\x01\xec\xbc\xf7\x17\x70\x7c\ \x7a\x42\xeb\xab\xd7\x6c\xee\x9e\x17\x86\xc4\x1f\x12\xf0\x10\x04\ \x05\x22\xfe\xb0\xc0\xcb\x17\x8f\x59\x5e\x5c\x22\x62\x1f\xcc\xaa\ \x37\x7d\xdf\xd6\x72\x0f\x1a\x63\xf7\x2d\xaf\x26\xbf\xbf\xf1\x6b\ \x76\xbc\x9d\xff\xd5\x15\x26\x94\xc3\xfa\x0c\x4b\xb2\xef\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\xd0\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \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\x0b\x13\x00\x00\ \x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd5\x0b\x04\x0a\x15\x1b\xc6\xd2\x2b\x54\x00\x00\x01\x5d\x49\x44\ \x41\x54\x38\xcb\xad\x93\xbd\x6a\xc2\x50\x18\x86\x9f\xaf\xba\x19\ \x0d\x91\x6c\x0e\x0e\x82\x22\xde\x82\x66\x75\xe8\xd8\xa1\xd7\xe0\ \x2d\x38\x28\x71\xc8\x25\x88\x2e\x5d\x74\x69\xe9\xda\xc1\x51\x70\ \xf5\x02\x4e\x44\xe8\xa2\x64\xd0\x9c\xd5\x29\x76\x10\x83\x31\xa2\ \x08\x7d\xa7\xc3\xfb\x71\x9e\xef\xef\x1c\x01\x18\x8f\xc7\xdf\x41\ \x10\xbc\xf1\x9c\xde\xfb\xfd\xfe\x17\x00\xae\xeb\x1e\x9f\x95\xeb\ \xba\x47\x80\xec\x25\x72\xbf\xdf\x13\x45\x11\x00\x22\x12\xfb\xe7\ \xb3\x88\x90\xc9\x64\x30\x4d\x33\x8e\x25\x00\x51\x14\xe1\xfb\x7e\ \xe2\xc2\xa5\x44\x84\x7a\xbd\x9e\xf0\xb2\xd7\x8d\xd5\x6a\x35\x00\ \x7a\xbd\x5e\xec\x75\x3a\x1d\x4a\xa5\x52\x0a\x08\xf0\x72\x9d\xc1\ \xf7\x7d\x56\xab\x15\xed\x76\x1b\xad\x35\x5a\x6b\x3c\xcf\x43\x29\ \x85\x52\xea\x3e\x00\x60\x3a\x9d\x62\x18\x06\xcd\x66\x93\x6e\xb7\ \x8b\x65\x59\x58\x56\x81\x6a\xb5\x1a\x57\x77\x17\x70\xce\xb8\x58\ \x2c\xf0\x3c\x0f\x11\x41\x24\xcb\x76\xfb\x7b\x73\x97\xa9\x16\x4e\ \x19\x2d\x66\xb3\x19\xc5\x62\x31\x8e\x8d\x46\x1f\x04\x41\xf0\xb8\ \x82\xcb\xde\xc3\x30\x24\x0c\x43\xb4\xd6\x1c\x0e\x07\x86\xc3\x21\ \xbb\xdd\xee\xfe\x16\x5a\xad\x16\x8e\xe3\xc4\x15\x6d\x36\x1b\x26\ \x93\x09\x85\x42\x81\x5c\x2e\xc7\x7c\x3e\xa7\x52\xa9\xdc\x06\x88\ \x08\x4a\xa9\xd4\x3b\x70\x1c\x87\xf5\x7a\x8d\x61\x18\xe4\xf3\xf9\ \xc7\xef\xe0\x34\xb8\x24\xa4\xd1\x68\xb0\x5c\x2e\xef\x03\x2e\x87\ \x76\x2d\xd3\x34\x29\x97\xcb\x29\x3f\x0b\x60\xdb\xf6\xcf\x60\x30\ \x78\x7d\xe6\x2b\xda\xb6\xfd\xc9\x7f\xe8\x0f\xe0\x8e\xa3\xe6\x6d\ \x31\x9b\x24\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\xcd\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\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\x02\x4a\x49\x44\ \x41\x54\x38\x8d\x8d\x91\x5d\x48\x14\x51\x18\x86\x9f\x19\x67\xdc\ \xdd\x71\xdb\x35\xaa\x4d\x42\x12\x8c\x32\x22\x8b\x20\xa5\x50\x32\ \xbb\x29\x32\x28\x51\xa8\xa0\x32\x09\x22\x08\x35\xe9\x22\xa8\x20\ \x6f\xaa\x9b\x02\xe9\x22\x0a\x2c\x21\xe8\x57\x43\x2f\x0a\x0a\xa1\ \x15\x95\x20\x12\x0c\x5c\x8c\x12\xd6\x8c\x7e\xdc\x5d\x58\x7f\x66\ \xdd\x99\x9d\xd9\x9d\xe9\x62\xd3\x50\x76\xa1\xf7\xe6\x70\xf8\xce\ \x79\xbe\xe7\x7c\x47\x78\xd1\xf5\xfc\xda\xe0\xd0\x40\x1b\xcb\x62\ \x18\x06\x00\xc7\x8e\x1e\x3f\xb7\xb7\xaa\xfa\xfe\xf2\xfa\x42\xa4\ \xc1\xa1\x81\xb6\xc6\x86\x33\x19\x8b\xba\xae\xf1\xa0\xb3\xe3\x9e\ \x2c\xc9\x73\x15\x15\x95\x4f\x33\x9d\x11\x9a\x5a\xce\xdb\x75\xb5\ \xf5\x8c\x7d\x1e\xcb\xd6\x04\x7f\xff\xbb\x25\xfb\x9a\x83\x87\xda\ \x1b\x4e\x9d\x6e\x05\x90\x00\x5c\x2e\x85\x7c\xef\xca\xac\x80\xda\ \xc3\x75\xe9\x6e\x82\x80\x20\x08\xbc\xec\xe9\xba\xb0\x08\x30\x0c\ \x03\x4d\x8b\xd3\x17\x88\x31\x1a\x51\xb2\x42\x96\xc4\x53\x4b\xd9\ \xd9\xc7\xf6\xb6\xf5\x8e\x2f\x8b\x06\xa3\x11\x85\x3b\x17\xf7\xa3\ \x1b\xa9\xff\x62\x38\x73\x73\x68\xbe\xfd\xb6\x44\x02\xd0\xb4\x38\ \x00\x53\xd3\x3a\xc1\xf0\xfc\x7f\x01\x8a\x7d\x79\x00\x48\xba\xae\ \xe3\x72\x65\x57\xb7\xec\x14\xfe\x40\x07\xc3\xc1\x5e\x66\xd5\x30\ \xde\x15\x3e\x76\x16\x1f\xa1\xa8\xba\x25\x0d\x88\xc7\xe3\x8b\x06\ \x99\x2e\xdf\x7d\x73\x02\x87\x37\x41\xf9\xbe\x4d\x88\x8e\x12\xc2\ \xd1\x08\x23\x81\x2e\xae\x3e\x1b\xc0\x4d\x0b\xe2\xc2\x0c\x32\xc5\ \x1f\xe8\xc0\xe1\x4d\x50\xb6\xa7\x14\x39\x2f\x87\xb8\x35\x8f\xad\ \xa4\x28\xde\xb5\x96\x48\xea\x3b\x21\xfd\x55\x1a\x90\xcd\x60\x38\ \xd8\xcb\x86\xad\x85\xc4\x0c\x15\xd5\x50\x51\x8d\x39\x64\x51\xe6\ \xe4\x96\x46\xcc\x75\x2a\x51\x73\xe8\x9f\x81\x2c\x5a\xd8\x80\x6d\ \xdb\xf0\x77\x9d\x55\x43\xb8\xdd\x6e\x2e\x95\x5f\xc1\xb6\x2d\x64\ \x31\x97\x87\x07\x1e\xf1\x71\xea\x03\x66\x6e\x02\x33\x39\xc3\xe2\ \x2f\x14\x79\x13\x44\x63\x06\x3f\xa3\x1a\xd8\x02\x16\x36\x6e\xc5\ \xc7\x44\x68\x82\x35\x8a\x8f\xd7\x75\x7d\x38\x24\x27\x31\x43\xa5\ \x67\xbc\x1b\x5b\x13\x90\xa5\xfc\xb4\x41\x28\x12\x66\xc7\xee\x4a\ \x3e\x7d\x9b\xc1\x4c\xda\x18\x29\x0b\x33\x69\xb3\xb1\xa0\x86\xc9\ \x40\x88\xf6\xe1\x5b\x38\x24\x27\x00\xad\xfe\x26\xb4\xa4\x86\x38\ \xa9\xb0\xbd\xa0\x74\x44\x68\xbe\xf9\xa4\xff\x7d\xd0\xaa\xca\x34\ \x03\x1b\x8b\xf1\xd8\x75\x2c\x77\x98\x55\x9b\x15\x3c\x1e\x37\x5f\ \x7f\x8d\xc3\xa4\x82\xc7\x5c\x3d\x3f\x1d\xff\x9d\x2f\x2c\xbc\x39\ \x5b\xe4\x7a\xa7\x84\xc8\x65\x44\x1a\x49\x51\x48\x0e\x3f\xb0\xe8\ \xc4\xe2\x86\xd9\xad\x27\xff\x00\xd1\x6f\xf8\x15\x16\x3e\x02\x36\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x5a\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\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\x01\xd7\x49\x44\ \x41\x54\x38\x8d\x95\x90\x41\x48\x54\x51\x14\x86\xbf\x3b\x6f\x94\ \x16\xe6\xbc\x9e\x11\x82\x08\xe1\xd0\xdc\x37\x63\x22\x16\xb5\x32\ \x82\x62\x20\x68\x51\xd4\x40\xd0\xb2\x56\x6d\xda\xe4\x32\x82\x59\ \x99\x0b\x83\x5a\x69\x69\xd4\x26\x2a\x5a\xb8\x18\x2a\x66\x40\x22\ \xa5\xb1\x68\xa0\x85\x34\xbd\x37\x46\x8a\x58\x4a\x8c\x91\xd1\x30\ \x59\xdd\xdb\x46\x5f\xef\xd5\xcc\x80\xff\xea\x5c\xce\x3d\xff\xf9\ \xce\x2f\xb2\xd9\xec\xa3\x7c\x3e\x7f\x9a\x2d\x28\x95\x4a\x9d\x49\ \x24\x12\x0f\x01\x48\xa7\xd3\x7a\xab\xda\x98\x41\x6b\x4d\x78\xd3\ \xb5\x5c\x2e\xa3\x94\x02\x40\x08\xe1\x6d\xdb\xac\x85\x10\x18\x86\ \x41\x24\x12\x09\xd0\x78\x06\x4a\x29\x5c\xd7\x0d\x0c\xf8\x25\x84\ \x20\x1e\x8f\xff\x77\x4e\xd8\xff\x90\x52\x36\x24\xa8\xa5\xb0\xff\ \xa3\x9f\x20\x28\x8d\xae\x3a\x74\xef\x3b\xd5\x98\x20\x16\x8b\xd5\ \xd8\x58\xe5\xcb\xe2\x63\x56\x16\xaf\xa1\xf5\x89\xc6\x06\xa5\x52\ \x29\xd0\xb4\x6d\x1b\xad\xc2\x2c\x17\xaf\xb2\x5e\xf9\xc8\xea\xc2\ \x03\x4c\xf3\x42\xfd\x13\x6a\x11\xac\x2e\xdc\x23\x14\x12\xd8\xfd\ \x69\xde\xbf\x1e\x62\xf7\xde\x73\xf5\x09\x5c\xd7\xf5\x6a\x21\x04\ \xa8\x2a\x3f\xe6\x86\x58\xfa\x79\x92\xf9\x42\x33\xdb\xbe\x36\xb3\ \x54\x1c\xad\x6f\x20\xa5\x0c\x10\x2c\xbf\xbb\xce\x5a\xcb\x2e\xee\ \x8c\xcc\x92\xcb\x8d\x30\x71\x7f\x80\xf9\x37\x83\x18\xe2\x7c\xed\ \x13\x1c\xc7\xf9\x1b\x9e\xfa\x4e\xd5\xbd\x41\xcf\xd1\x61\xba\xa7\ \xa6\xc8\xe5\xa6\x39\x94\x3c\xcb\x87\xe9\xe7\x74\xb4\xcc\x78\x06\ \xa1\x7f\x09\xa4\x94\xd8\xb6\x4d\xab\x7a\xc2\xf6\xb6\x18\x6d\x9d\ \x87\xe9\xeb\x4b\x60\xdb\x51\x2c\xcb\x24\x7a\xf0\x12\x9d\xad\x2f\ \x99\x1c\x6b\xda\x19\x20\xb0\x2c\xcb\x33\x5a\xaf\x7c\xe2\xf3\xdc\ \x4d\x7a\x8f\x8d\x03\x90\x4c\xf6\x63\x18\x06\x00\x66\xfb\x01\xcc\ \xf6\xfd\xac\xad\xbc\xba\x02\x5c\x14\x99\x4c\x26\x53\x28\x14\x8e\ \xfb\x49\xf6\xec\x78\x4a\x57\x47\x85\x9e\x23\xc3\x00\xbc\x98\x99\ \x65\xf4\xd6\x04\x77\xc7\x2f\x03\xf0\xad\x5c\xe4\xed\xb3\x81\x5f\ \x5a\xff\x8e\x0a\xad\x75\x20\xd5\xc9\xb1\xa6\x2e\x10\x0e\xe8\x40\ \xc0\x75\x74\xfb\x0f\xbf\x09\xcf\xe7\xda\xb9\x46\xf0\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\xb7\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\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\x02\x34\x49\x44\ \x41\x54\x38\x8d\xa5\x93\x4d\x48\x54\x51\x18\x86\x9f\x7b\xe7\xc7\ \x99\xd1\x72\x66\xcc\x9f\x42\x13\x0c\x75\x48\x94\x24\xa4\xc2\x09\ \x33\x18\x82\x0a\x6a\x30\xa8\x5c\xa4\x11\x44\x10\x99\xfd\x41\xbb\ \x6c\x15\x2d\x82\x68\x91\x45\x66\x22\xa9\x98\x65\xb6\x8c\xa8\x44\ \x25\xda\x04\x85\x66\xb5\x99\xfe\x10\x6c\x06\x6d\x4a\xef\x3d\xb7\ \xeb\xcf\x69\x31\x29\x8c\x5e\x57\xbd\xbb\x73\xde\x8f\xf7\x7b\xce\ \x39\xdf\x51\xa4\x94\xfc\x8f\xec\x3d\x0f\x1f\x5c\x1a\x1c\x1a\x68\ \x5a\x6a\x98\xa6\x09\xc0\xa1\x83\x87\x4f\xec\xa8\xaa\xbe\xbd\x62\ \xc0\xe0\xd0\x40\xd3\xd1\xba\x63\x96\xa6\x61\x08\xee\xde\x6b\xb9\ \xe5\xb0\x3b\x7e\x57\x56\x06\xbb\xac\x6a\x94\x53\xa7\x4f\xca\x9a\ \xf0\x01\x46\x3f\x8c\xae\x88\xf9\xb2\xff\x45\xd2\x7a\xcf\xee\xbd\ \xd7\xeb\x8e\xd4\x9f\x01\xb0\x03\xb8\xdd\x1e\xbc\xe9\xbe\x15\x03\ \xc2\xfb\x6a\x12\xdd\x14\x05\x45\x51\x78\xf4\xb8\xa7\x71\x31\xc0\ \x34\x4d\x84\xd0\x79\x36\x32\xcd\x70\xcc\x63\x19\xa0\x20\xc9\x4d\ \xfd\xcc\x77\xad\x20\xb1\xb1\x3a\x4c\xc5\xf1\x0e\x59\xb6\x3e\xe5\ \xd3\x22\xc1\x70\xcc\xc3\x8d\x73\xbb\x30\xcc\xb9\xe5\x09\x13\x7d\ \x30\xd6\x09\xa5\xcf\x41\xb1\x01\xe0\x72\xda\x68\xb8\xf6\xb4\xd8\ \x0e\x20\x84\x0e\xc0\xf8\x4f\x83\x48\x54\x5b\xd2\x7d\x96\xd2\xf8\ \x55\xec\xb3\xe3\x7c\xfd\xd8\xce\x84\x2b\x0c\x40\x41\x56\x2a\x00\ \xaa\x61\x18\xb8\xdd\xd6\xe8\x00\x19\xa2\x17\xb7\x53\x25\x10\xbc\ \x4c\xae\xb8\x89\x22\xcd\x24\x5f\xd5\x75\x7d\x91\x60\xa9\x54\x69\ \x90\x6b\x34\xf3\x4d\x0b\xd1\xff\xc6\x49\x7c\x2a\x85\x4c\xd1\x9d\ \x5c\xb3\x70\x07\x56\xca\x12\xf7\xf1\xa4\xae\xa1\xad\x7b\x84\xda\ \xda\x46\x1c\x99\xfb\x59\x67\xdc\x41\x95\x5a\x72\x80\x15\x81\x4d\ \x4e\x91\x23\x5a\x29\xda\x72\x96\x92\x92\x22\x00\xb6\x87\x6a\x49\ \xf3\xe6\x93\xa9\xb5\x61\xcc\xcc\x25\x13\x38\xd4\x79\x24\xb0\xf0\ \x37\xb2\xf5\x16\x56\xf9\x0b\xc9\xc8\xab\xa2\xbc\x7c\x23\x81\xc0\ \x06\xfc\x7e\x2f\xc5\x5b\xcf\xb3\xd6\x68\x47\xd3\x62\xc0\xbf\x41\ \x12\x42\x27\x3f\xfd\x0f\x93\xd3\x26\x63\x93\x02\x97\x9c\x60\x13\ \x1d\x14\x55\xb7\x02\x10\x0a\x05\xb1\xd9\x12\xcf\xe7\xcd\xa9\x20\ \x3d\x7b\x33\xbe\x5f\xcd\xc0\xce\x04\xc1\x8f\x58\x94\xf2\x6d\x41\ \xde\x7e\x89\x33\x33\x2b\x29\x94\x2d\xa4\xf9\x0a\x71\xba\xfc\xe8\ \xf1\x08\xef\xdf\xbd\xa6\xaf\xf7\x09\x7a\x3c\x82\x1e\x8f\x90\x17\ \x08\xe3\x9d\xee\xa2\xbe\x22\xda\xa3\x34\x5c\xe9\xec\x7f\x15\x99\ \xaf\x5a\x38\xbb\x3f\x25\xc6\x85\xb2\x8b\xa8\x8a\xc5\x40\x2d\x57\ \xeb\x5f\xe1\x5b\xcd\xf5\x7c\x98\x69\xf7\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x9e\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\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\x02\x1b\x49\x44\ \x41\x54\x38\x8d\x8d\x92\x4d\x48\x54\x51\x18\x86\x9f\x73\xe7\xc7\ \xb9\xa3\xa4\x16\x06\x93\x89\x11\x45\x51\x0b\x67\x86\xac\x0c\x2b\ \x8a\x48\x5a\x44\x8c\x8a\x41\x9b\x8c\x40\x84\x28\x8b\x56\xad\x6a\ \xdb\x42\x90\x70\x51\x60\xa9\x90\xd4\xa0\x21\x54\xf4\x83\x50\xd3\ \xc6\x34\xa8\x26\xc6\x8c\xa0\xcc\x30\xc1\x51\x53\xe7\xa7\xb9\x77\ \xae\x3a\xa7\xc5\xa8\x83\xd2\xd5\xde\xcd\xc7\xf9\x0e\xdf\x73\x9e\ \xc3\x39\xa2\xba\xa6\xf2\xba\xcb\xe5\xba\xc1\x8a\x18\x86\xb1\x50\ \x93\xf5\xf7\x5a\xda\xef\xac\xdc\x5f\x8c\xb8\xd8\x70\x41\x9e\x3b\ \x7b\xfe\x9f\x9b\xba\xae\x71\xb7\xb5\x85\x58\x24\x7a\xc6\xef\xef\ \x7a\x60\x0a\xa8\xf2\x55\x33\xf8\x65\xd0\xec\x10\x5e\x07\x5e\x2d\ \x1f\x42\x34\xf9\x1f\x76\x5e\x01\xb0\x02\xa8\xaa\x93\xbc\xdc\x7c\ \x53\x80\xef\x54\x55\x7a\x50\x08\x84\x10\x3c\xea\xee\xbc\x0c\xa4\ \x01\x86\x61\xa0\x69\x09\x7a\x06\xe2\x84\x26\x9c\xa6\x90\x65\x59\ \xe7\xa3\xb4\xae\x43\xae\x77\xe8\x5f\x97\x0c\x42\x13\x4e\x6e\x5d\ \xad\x40\x37\xe6\xff\x8b\xe1\xb0\x5b\xb8\xd4\xf8\x72\x87\x15\x40\ \xd3\x12\x00\x8c\x4d\xeb\x0c\x8d\xff\x31\x1d\x52\xe5\x08\x9a\x28\ \x02\x60\xeb\xc6\x6c\x00\x14\x5d\xd7\x51\xd5\xb5\xd5\xd5\x99\x4e\ \x8a\x8c\x66\xc4\xc8\xed\x65\x7d\x25\x91\x48\x2c\x19\x98\xc5\x16\ \x6e\xc7\xed\x7a\x87\x98\x8d\x52\xe1\xfd\x8e\xf2\xb3\x29\x03\x00\ \x56\x35\xc8\x9a\xbc\xcf\xde\x2d\x03\x04\x3f\xc5\xe9\x78\x92\xcd\ \x9c\x16\xe3\x98\x77\x94\xb1\x50\x63\x06\x60\x66\xa0\x46\x1e\x53\ \xb2\x79\x80\xd2\x12\x85\x59\x23\x89\x45\xa4\x08\x87\xe3\xec\xda\ \xae\xb0\x67\xdb\x10\x47\x8b\xfb\x33\x06\x36\x25\x85\x04\xa4\x94\ \xb0\x50\xe5\xf4\x7b\x0e\xb8\xd3\x6b\x8f\x3b\x07\x23\xa5\x62\xb3\ \x59\x00\xf0\xee\x16\x14\x38\xc2\x19\x83\xe2\xdc\x24\x53\x71\x83\ \xd1\x29\x8d\x5f\x93\x1a\x23\xbf\x35\xe2\xd9\xa5\x74\xf7\x28\x00\ \x58\x2d\x02\xbb\xa2\xd1\x17\x4c\x01\xf0\xac\x77\x03\x4f\x7f\x1c\ \x4f\xff\xc4\xf0\xc4\x38\x9e\xb2\x72\x82\xc3\x33\x20\x41\x22\x91\ \x12\x86\xe5\x11\xe6\x62\x1a\xbd\xc1\x0f\xe4\xe7\x08\x36\xe5\x8f\ \x53\x5f\x9b\x47\x6f\xa8\x80\xae\xbe\x9d\xd8\xa3\xdf\xda\xc4\xa1\ \xda\x9b\x81\x84\xad\xf0\xf0\x6a\xaf\x50\x56\xf8\x91\xca\x7d\x43\ \x94\x7b\xe6\x79\xfe\x36\x87\xe6\xc0\x41\xf4\xc8\x74\xff\x9b\xd6\ \x6b\xfb\xc5\xe2\x9d\xd7\x8a\xbf\xed\x44\x83\xc5\x22\xeb\xb2\xec\ \xd4\x9c\x3c\xfd\xe2\xf3\x62\xff\x2f\x23\xd3\xd8\xa3\xe1\xf7\x88\ \x77\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\xd0\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\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\x02\x4d\x49\x44\ \x41\x54\x38\x8d\x8d\x92\x5d\x48\x93\x61\x14\xc7\x7f\xcf\xbb\x0f\ \xdd\x66\xa9\x24\x4a\x0c\x0c\xbb\xe9\xc3\x18\x1a\x54\x88\x86\x75\ \x15\x54\x18\x62\x60\xdd\xb4\x22\x89\xa8\x34\xcb\x6e\xba\xca\x3b\ \xaf\x22\x09\x21\x83\xc2\xab\x8a\x32\x09\xfb\xb8\x90\xa0\xc4\x49\ \x60\x0e\x2a\x15\x23\x21\x13\x22\x68\x5b\xcd\xed\x7d\xe7\xf6\xee\ \xdd\xf6\x3e\x5d\x0c\x17\xda\x06\xfd\x6f\x1e\x1e\xce\x73\xfe\xe7\ \x77\xce\x79\xc4\x93\xe1\xc7\x37\x7c\x93\x13\xbd\xac\x93\x61\x18\ \x00\x9c\x68\x3f\x79\xfe\x40\xf3\xc1\xbb\xeb\xe3\xab\xb2\xfa\x26\ \x27\x7a\xcf\x78\xcf\xe6\x0d\xea\x7a\x82\xfb\x43\xf7\x06\x6d\x56\ \x9b\xda\xd8\xd8\xf4\x28\xdf\x1b\xd1\x79\xf9\xa2\x6c\x6b\x3d\xce\ \xfc\xe7\xf9\x42\x45\x78\x3b\xfe\x66\xcd\xfd\xc8\xe1\xa3\xfd\xde\ \x53\xa7\xaf\x00\x58\x01\x1c\x0e\x27\x65\xa5\xe5\x05\x0d\x5a\x8f\ \xb5\x65\xab\x09\x81\x10\x82\x91\x67\xc3\xdd\x39\x03\xc3\x30\x48\ \x24\xe2\xbc\x9e\x8b\x31\x1b\x72\x16\x34\x59\xa3\x8d\xad\xec\x39\ \xf7\x40\x7a\xaa\x8b\xbe\xe4\x08\x66\x43\x4e\x6e\xf7\x1c\x42\x37\ \x32\xff\xe5\x51\x6c\xb7\xd0\x75\x73\x6c\x9b\x15\x20\x91\x88\x03\ \xf0\x73\x59\x67\x31\xb8\x52\x38\x4b\x9a\x20\x14\x00\xb6\x56\xba\ \x00\xb0\xea\xba\x8e\xc3\x51\x18\x5d\xa6\x0c\xb4\xa7\x77\x48\x4c\ \xbc\x20\x15\xfd\x85\xad\xb4\x02\x47\x73\x0b\xf2\xc2\xb5\xac\x41\ \x3c\x1e\xcf\x11\xfc\x93\x9c\x4e\x11\xba\xde\x8e\xbb\xc8\xc2\xce\ \xdd\x75\x14\x29\x0a\xd1\x60\x80\xb9\xc9\xe7\x7c\xf8\xe4\x43\x34\ \xf4\xa0\xac\xce\x20\x9f\xb4\x91\x41\x36\xdb\x15\xf6\xd6\xd6\xb2\ \xdd\xeb\x65\xff\xe8\x28\x9e\x4b\x9d\x78\x6c\x76\x8a\x7f\x07\xa8\ \x9e\x7b\x99\x35\x28\x44\xa0\xfb\x5e\xb1\xc3\xed\x26\xa5\xaa\x68\ \x0b\x0b\x00\x44\x66\x66\x48\xab\x2a\xee\xa8\x4a\xe5\xd2\xfb\xbf\ \x04\x36\xc5\x44\x02\x52\xca\x2c\xbe\x94\x18\x91\x20\x36\x29\x49\ \xab\x2a\xea\x7c\xf6\xa3\x2d\xfb\xfd\xa4\x34\x0d\x7b\x32\x89\x2d\ \x1e\x26\xb7\x85\x2d\xa5\x49\xc2\x31\x83\x1f\xe1\x04\x48\x81\x89\ \xc4\x5a\x56\x45\x24\x14\xa2\x24\x93\x61\x79\x7a\x1a\x7f\x47\x07\ \xe1\xa9\x29\xcc\x64\x92\x84\xa2\x90\x72\x55\x64\x09\x02\xa1\x20\ \xf5\x0d\x4d\x7c\x5c\x8a\x90\x4a\x4b\x8c\x8c\x99\x3d\xf7\xb5\x30\ \x17\x08\x90\xd6\x34\x14\xbb\x9d\xfa\x81\x01\x2c\xae\xec\xfa\x16\ \x5d\x4e\x36\x79\x76\xf9\x45\x57\xdf\xc3\xf1\x77\x8b\x66\x73\xbe\ \x19\x08\x69\x52\x37\xd6\x47\x55\x2c\x40\x4d\x3c\xc6\x06\x57\x09\ \xd1\x68\x84\xaf\x0e\x17\x7a\x45\x95\x26\x83\xdf\xcb\xc5\x6a\xcf\ \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\x02\x68\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\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\x01\xe5\x49\x44\ \x41\x54\x38\x8d\x95\x93\xbd\x6b\x53\x51\x18\x87\x9f\xf3\x75\x6f\ \xd2\x18\x4a\x15\xb1\xd4\x26\x20\x22\x34\x5a\x07\x1d\x54\x70\x69\ \x11\xba\xb8\x94\x86\xaa\x08\xe2\xa4\x82\x68\x3b\xe8\xe2\xe0\x24\ \x82\xff\x40\x04\xc1\xc1\x8f\xb1\x88\xc5\xa1\x53\x47\x87\xda\x52\ \x89\xd4\x14\x1c\x4a\xa5\x2d\x58\x2c\x46\x03\x6d\x62\x6f\x92\x73\ \x1c\x92\x86\xda\x7b\x03\xfa\xc2\xbb\xbc\x1f\xcf\xf9\xbd\x3f\x38\ \xe2\xea\xd9\x9b\x83\xd2\x78\x39\xb6\x83\x0c\xff\x19\xaf\x67\x9f\ \x09\x0d\xfa\xe5\x66\x5f\x7f\xea\xe1\xd8\x00\x47\xd3\xdd\x74\x76\ \x76\x36\xba\xce\x61\x6b\x35\x5c\xbd\xde\x48\x6b\x31\xc9\x64\x6b\ \xf9\xda\x99\x5b\x08\x21\x84\x76\xae\x9e\x5a\xab\x3a\x36\x7e\x6d\ \xd1\x73\xa8\xc6\x8f\xc9\x77\xe4\xc7\xef\x52\x59\x59\x01\x40\x19\ \x83\x54\x0a\x67\x2d\x89\x74\x9a\xbe\x47\x8f\xe9\x1d\x19\x01\x60\ \xf4\xc4\xa8\xd1\xca\xc1\xf1\xf4\x7e\x9e\xbc\x9a\xa7\x6a\xe7\xf8\ \x1d\x54\x89\x0f\x3d\xe0\xe4\xda\x27\x06\xe6\xde\x70\xf1\xca\xa5\ \xd6\xab\xdf\x96\x97\x99\xb9\x7d\x87\xfc\x46\x57\xab\xa6\xc1\x71\ \xb0\xb7\x87\xec\xd0\x69\xba\x12\x1a\xa3\x25\x9b\xe5\x80\xf5\xf5\ \x53\x54\xa7\x9f\x13\xc4\x62\xad\xe1\x03\x99\x0c\x62\x6a\x0a\xa5\ \xc4\x6e\x00\x14\xcb\x16\xfc\x0e\x26\xdf\x7f\x26\xff\x65\x15\xa3\ \x15\x71\x1c\x59\xeb\x28\x16\x0a\x21\xf3\xa4\x94\x7f\x03\x00\x04\ \x2e\x6c\xb3\x73\xfc\x5c\x5c\x0c\x95\x95\xdc\xa3\x00\x40\x0a\x11\ \x1a\x04\xa8\x96\x4a\xff\x06\xa0\x0d\xc0\x28\x15\xaa\x45\x9f\x10\ \xbd\x1f\x09\x88\x56\x10\x61\xc1\x0e\xc0\xba\x46\x73\xe7\xcc\x48\ \x80\x6b\x43\x28\x6d\x07\x7c\x2d\x57\x00\x38\x92\x88\x37\x01\x11\ \x27\x38\x1b\x5e\x16\xce\xb2\xe0\x25\x59\xc8\xde\xc7\x48\x41\xe5\ \x6d\x0e\x9f\x22\x32\x4a\x81\xdd\xa3\xc0\x49\xc9\x87\xe1\x31\xbe\ \xf7\x9f\xc7\x68\x85\x67\x14\xb3\xf7\x9e\x72\x78\x7e\x9a\x7d\xbb\ \x01\x56\xea\x55\xbb\xb4\x94\x4a\x0c\x1e\xc3\x68\x49\x22\xe6\x11\ \xf3\x35\x1d\xbe\x47\x70\xee\x02\xdd\xbe\xc6\xf7\x34\x31\x4f\xe3\ \x1b\x83\x37\x7c\xb9\xa5\x60\xa2\x30\x51\xd5\x50\xbb\x5e\xcf\x7f\ \xcc\xbd\xb8\x31\x93\x01\x68\xfe\x45\xea\xc0\x56\x33\xdb\x85\x73\ \xce\xfd\x01\x4a\xb1\x9e\xb9\x8a\x95\x2d\xe0\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x69\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xf0\x00\xf0\x00\xef\x34\x06\ \x67\x1b\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\ \x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd5\x0b\x05\x10\x0f\x05\x25\xfd\xad\x2f\x00\x00\x01\xf6\x49\x44\ \x41\x54\x38\xcb\x9d\x92\x4d\x6b\x13\x51\x18\x85\x9f\x3b\xc9\x24\ \x4d\x9a\x66\x86\x4a\x52\x0a\x0a\xb5\x5d\x68\x1a\x45\x14\xc1\x85\ \xb8\x14\x0a\x55\x77\xe2\x26\xbf\xc0\x6f\xa9\xf4\x1f\x88\xb6\x24\ \x41\x44\x14\x74\x59\x77\x55\x10\xc5\x4d\xa8\x3b\x41\xec\xa2\x54\ \x28\xa4\x89\x56\xab\x96\x50\x35\x8d\xcd\x47\x27\x4d\x32\x33\xd7\ \x45\x48\x49\x42\x52\xaa\x67\x77\x0f\xef\x3d\xef\xe1\xbc\x47\x3c\ \x79\xfa\x78\x31\xf7\x27\x77\x8c\x3d\x40\x55\xd5\xe7\x13\xb7\x26\ \x2f\xb6\x90\xd3\xd1\xbb\x96\xdc\x23\xee\x4d\xdf\x91\xed\xa2\x4e\ \x29\xeb\x5c\x3e\xbf\xb9\xeb\x76\x4d\xd3\x3b\xf2\x4e\x21\xc4\xce\ \x23\x99\x4c\x76\x1c\x0a\x85\x42\x5d\x85\x77\x1c\xb4\x0f\x66\x32\ \x19\x66\x5f\xcc\x02\x90\x98\x4b\x00\xd0\xb4\x6b\x77\x07\xdf\xbe\ \xaf\x92\x4a\xa7\x39\x7a\x6a\x8c\x6d\xc5\x8b\x69\x2b\xb8\x64\x85\ \xd4\xfc\x6b\x26\x6e\xdf\x8c\xc4\xa2\xf7\x9f\x35\xfe\x28\xed\x0e\ \x34\x5d\x23\x95\x4e\x73\xe8\xe4\x18\x9f\x0b\x5e\x06\x07\x02\x8c\ \x1c\x08\x52\x12\x3e\xb4\xd1\x71\xfc\x9a\x3e\x73\xed\xc6\x95\xe3\ \x5d\x1d\x24\xe6\x12\x0c\x87\x4f\xb3\x52\x70\x73\xe9\xcc\x10\xbe\ \x1e\x15\xd3\xb6\x51\x1d\x0a\xef\x96\x25\xc1\x23\xe3\x36\x4b\x6f\ \x16\x00\x01\xa0\x74\x0a\x4b\x7a\x03\x0c\x0d\xe8\x58\xb6\x64\xdb\ \x34\xa9\xd4\x2c\xca\x55\x8b\x7e\x9f\x9b\x5f\x65\xb5\x25\x09\x45\ \x4a\x89\x94\x76\x4b\x30\x6e\xb7\x0b\x84\xa0\x5c\xb5\xa8\xd6\x24\ \x9b\x5b\x35\xdc\xaa\x83\xfd\xfd\x1e\xa4\x10\x2d\x5d\x70\x02\xb6\ \x69\x9a\x2d\x4e\x6c\x63\x83\x35\xa3\x8a\xdf\xa3\xa2\xf7\xb9\xb0\ \x2d\x89\xdf\xe3\xe4\xd3\x46\x81\x7d\x3d\x96\x9d\x6b\x72\xae\xd4\ \x2b\xea\x42\xd3\x74\x34\x4d\xe7\xc2\xb9\xf3\xa4\x17\xde\x12\xec\ \x13\x7c\xf9\x99\x27\x9b\x2b\x91\x37\x2a\x7c\x5c\x59\xa7\x54\xae\ \x90\x5b\x7a\xe5\x2c\x15\x8b\x3f\x1a\x02\x22\x1a\x9f\x9a\xb1\x2c\ \x2b\xd2\x7c\x0d\xc3\x30\x70\x38\x54\x4e\x9c\x8d\xb0\xbc\x56\x64\ \xcb\x54\x18\xec\x95\xac\x2f\xbe\x64\xf8\xe0\x08\x00\x1f\xe6\xdf\ \xa7\x1e\x3e\x78\x74\x58\x74\x6b\xd8\xd5\xeb\x97\xa7\x02\x81\xe0\ \x64\x33\xe7\xeb\xf5\x11\x1e\x0d\xf3\x3b\x9b\xad\xf7\x65\xf5\x2b\ \x82\x7f\x44\x2c\x1e\x95\x0d\x91\xff\x12\x00\x94\x58\x3c\x6a\x01\ \x94\x0d\x83\xbf\x06\x8c\xf6\xd3\x7f\x33\xe7\x2e\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\ \xee\xee\xdd\xdd\xdd\xbb\xbb\xbb\xaa\xaa\xaa\x99\x99\x99\x88\x88\ \x88\x77\x77\x77\x66\x66\x66\x55\x55\x55\x44\x44\x44\x33\x33\x33\ \x22\x22\x22\x11\x11\x11\x00\x11\x00\x00\x00\x00\xff\xff\xff\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\xff\x0b\x4e\ \x45\x54\x53\x43\x41\x50\x45\x32\x2e\x30\x03\x01\x00\x00\x00\x21\ \xf9\x04\x05\x07\x00\x10\x00\x2c\x00\x00\x00\x00\x10\x00\x10\x00\ \x00\x05\x77\x20\x24\x42\x01\x89\x24\xe5\xa8\x42\x02\x23\x04\xcf\ \x23\x90\xab\x28\x3c\x4c\xe0\xc8\xc1\xac\x0a\x33\xc3\xc3\xb0\x03\ \xa6\x44\x01\xc5\x10\xe6\x48\x24\x5e\xb6\x94\x40\xe9\x18\xf8\x90\ \x50\x64\x80\xb0\xb8\x22\x55\x06\x85\xb3\x50\x23\x05\xce\x61\x85\ \x82\x5c\x3b\x9f\xcd\x83\xc3\x31\xaa\x0a\x18\x1a\x0a\x6f\xcf\x3a\ \x3a\x30\x0a\x76\x06\x40\x02\x04\x24\x7c\x2c\x33\x02\x0b\x03\x04\ \x05\x02\x82\x5f\x23\x01\x09\x07\x10\x05\x64\x02\x80\x35\x02\x07\ \x33\x97\x22\x03\x73\x35\x03\x03\x65\x21\x00\x21\xf9\x04\x05\x07\ \x00\x10\x00\x2c\x00\x00\x00\x00\x0f\x00\x10\x00\x00\x05\x63\x20\ \x24\x8e\xd0\x81\x88\x01\x39\x2a\x22\x23\x0a\x0d\xa1\x8a\x0b\xc4\ \x38\xf6\x33\xcc\x62\xc1\x34\x85\x07\x6b\x94\x00\x42\x1a\x0b\xd3\ \xe3\x91\x4a\x89\x12\x90\x85\x60\x34\x98\xf2\x86\x3c\x08\x01\x71\ \x38\xec\xb2\x90\x42\x02\x81\xf8\x82\x5f\x85\x99\x73\x44\x50\x40\ \x55\x01\x81\xd3\xa0\x90\x15\x64\xaf\xd7\x5a\x84\x10\x0c\x08\x01\ \x66\x2a\x07\x69\x7f\x22\x82\x28\x05\x29\x86\x10\x56\x59\x02\x8e\ \x23\x21\x00\x21\xf9\x04\x05\x07\x00\x10\x00\x2c\x00\x00\x00\x00\ \x10\x00\x0f\x00\x00\x05\x60\x20\x24\x8e\x50\x61\x90\xa8\x88\x88\ \x0a\x13\x04\x4b\x2a\x3a\x09\xd4\x06\x75\x1a\x94\x10\xd1\x12\x23\ \xc1\x40\x74\x58\x00\x17\x0a\x83\x21\x26\x30\x3c\x1e\x02\x55\x23\ \x27\x12\x14\x9e\x8f\xe1\x68\x80\xd8\x6d\x1f\x27\xd1\x40\x59\x88\ \xa2\x5e\x68\xc2\x61\x2d\x6b\xf7\xdc\x28\x84\xc1\xeb\x2e\x1c\x86\ \x83\x01\x9a\x4e\xf2\x1a\x04\x80\x10\x02\x7c\x24\x05\x43\x81\x01\ \x66\x29\x40\x82\x66\x7c\x21\x00\x21\xf9\x04\x05\x07\x00\x10\x00\ \x2c\x00\x00\x00\x00\x10\x00\x10\x00\x00\x05\x62\x20\x24\x8e\x62\ \x41\x9e\xe2\x11\x40\x89\x22\x26\x03\x0a\x2d\x07\xeb\x22\xe8\x2a\ \x36\x43\x1b\xe3\x01\x81\xc8\x80\x10\x2a\x0e\x85\x82\x2b\x60\x6a\ \xe8\x0e\x34\x88\x0e\x32\x60\xc8\x20\x35\x92\xb0\x18\x58\x15\x08\ \x04\x19\xa2\xd1\x70\xc0\x92\x05\xe1\x09\xf1\x68\x2f\x48\xb1\x93\ \x60\x2e\xd0\x09\x0c\xa6\xeb\x68\x90\x86\xcc\xf5\x52\x22\x01\x03\ \x5d\x53\x57\x03\x42\x5d\x80\x7e\x82\x86\x80\x8a\x28\x21\x00\x21\ \xf9\x04\x05\x07\x00\x10\x00\x2c\x00\x00\x00\x00\x10\x00\x0e\x00\ \x00\x05\x49\x20\x24\x8e\xd0\x71\x90\xa8\x98\x88\xcf\xc3\xa6\xec\ \xda\x42\x0d\x2c\x1e\x6e\x5b\xd0\x68\xd2\x0c\x90\xc7\xc2\xe4\x2a\ \x05\x47\x89\xc7\x0a\x55\xdc\x91\x96\xa8\xc5\x48\x00\x29\x38\xa3\ \xad\x47\xcd\x74\x4a\xd5\x5e\x53\xd4\x40\x98\xba\x8e\xc6\x2d\x2a\ \x44\x6d\xcb\xa6\xd8\xa4\x01\x54\x04\x87\x85\x00\x00\x21\xf9\x04\ \x05\x07\x00\x10\x00\x2c\x00\x00\x00\x00\x10\x00\x10\x00\x00\x05\ \x71\x20\x24\x8e\xd0\x30\x90\x28\x14\x10\xa2\x71\x88\x87\x90\x06\ \x07\x6b\x18\x90\xc1\xc8\xa9\x80\x08\x37\x41\x03\x47\x1a\x10\x64\ \x86\x82\xe9\xb0\x28\x31\x14\xa2\xc0\xc0\x30\x08\x8c\x02\x82\x04\ \x64\xc1\x13\x09\x58\xa4\x80\xa2\x60\x55\x09\xce\x65\x52\x21\x91\ \x50\x18\xce\xe8\x54\x81\xc1\x68\x20\xc2\x28\xc1\xa2\x80\xc2\x76\ \x21\x5f\x22\x50\x51\x02\x56\x01\x65\x0d\x0f\x59\x10\x0d\x69\x29\ \x04\x0f\x5a\x10\x60\x78\x23\x0c\x0f\x27\x33\x79\x0f\x7c\x29\x9e\ \x8e\x21\x00\x21\xf9\x04\x05\x07\x00\x10\x00\x2c\x00\x00\x00\x00\ \x10\x00\x10\x00\x00\x05\x60\x20\x24\x8e\x90\x20\x90\xa8\x38\x88\ \x45\xc1\xa6\xec\x49\xb8\x85\x02\x8b\x46\x30\x43\x0a\x81\x9a\x01\ \xdd\xc0\x54\x40\x88\x14\x46\x91\x60\x98\x42\x34\x12\xa8\xc0\x09\ \x85\xf0\x89\x82\x41\x18\x01\x81\x80\x62\x03\x5a\xc5\x62\x71\xb8\ \x8d\x12\x04\xac\x19\xb2\x82\x20\xc0\xb0\x03\x82\x01\x09\x18\x17\ \xb7\xc6\xc3\x00\x29\x2f\x61\x01\x7a\x53\x53\x80\x0e\x0f\x26\x0e\ \x56\x80\x09\x0b\x70\x24\x21\x00\x21\xf9\x04\x05\x07\x00\x10\x00\ \x2c\x00\x00\x01\x00\x10\x00\x0f\x00\x00\x05\x5e\x20\x24\x42\x82\ \x38\x0c\x22\x31\xae\x10\xda\xa2\x03\xc2\xae\x30\x8a\xb8\x81\x98\ \x8b\x42\x09\x11\x07\x52\xc2\x30\x0a\x08\x76\xab\xc3\x22\xc8\x42\ \x8e\x0c\xae\xd9\x6c\x70\xa8\xaa\xa4\xa3\x58\x62\x88\xd5\xdd\xa4\ \x46\x9f\x91\x01\x61\xb2\x1e\x0f\x83\x41\x41\x26\x2a\x58\x86\xc7\ \x81\xc1\x28\x40\x88\x33\x01\xba\xd4\x08\x2c\xb0\x04\x0f\x28\x0d\ \x7d\x10\x0c\x51\x2b\x3e\x10\x09\x52\x21\x00\x21\xf9\x04\x05\x07\ \x00\x10\x00\x2c\x00\x00\x00\x00\x10\x00\x10\x00\x00\x05\x63\x20\ \x24\x8e\x50\x10\x90\xa8\x78\x42\x82\x20\x0e\x2b\x2a\x9c\x2d\x5b\ \xc4\x64\xe0\xb6\x81\xe1\xa2\x2b\x93\x69\x40\x10\x19\x0a\x29\x60\ \x01\x81\x4c\xa2\x0a\x3f\x27\x49\x60\xa8\x4a\x47\x82\x83\xb6\xf8\ \x62\x0c\x50\xbe\xa9\xe2\xf1\x68\x8e\x14\x0d\x83\xca\xf1\x58\xb8\ \x18\x05\x02\x42\x01\x29\x30\x10\xa2\xc2\xd7\xb8\x58\x14\x9b\x51\ \x23\x0c\x01\x7d\x10\x09\x0e\x4e\x0e\x6f\x0b\x22\x74\x49\x2b\x5a\ \x49\x21\x00\x21\xf9\x04\x05\x07\x00\x10\x00\x2c\x00\x00\x01\x00\ \x10\x00\x0f\x00\x00\x05\x5c\x20\x24\x8e\x50\x60\x06\x02\xa9\x8a\ \xa6\x38\xac\xea\xf9\xae\xa9\x2a\xd4\xc5\x0c\x8f\x84\x31\x04\xb6\ \x95\x0e\x82\x68\x18\x11\x30\x82\x72\xb0\x78\x38\x15\xb0\x42\xc1\ \x87\x12\x14\x1a\xb5\x51\x61\x07\xf9\x8d\x02\x88\xc5\x56\xc4\x20\ \x06\x18\x0a\xa5\x21\xd1\x4d\x1c\x44\x84\x6c\x21\xa1\x18\x34\x08\ \x25\xd8\x02\x42\x87\x1c\xf6\x42\x65\x10\x0a\x50\x44\x59\x30\x06\ \x06\x30\x21\x00\x21\xf9\x04\x05\x07\x00\x10\x00\x2c\x00\x00\x01\ \x00\x10\x00\x0f\x00\x00\x05\x5d\x20\x24\x8e\x24\x14\x94\xe8\x18\ \x08\xa5\xc0\xa2\xc2\x49\x3e\x8f\x51\xca\xc1\xf0\x0e\xf4\xf3\x8e\ \x02\x5d\xe9\xf0\x20\xb4\x64\x22\x86\x32\x05\x19\x38\x05\x09\x47\ \xa3\x71\x48\x39\x09\xaf\x00\x41\x81\x32\x96\x12\xa2\x9f\xc8\x80\ \xf0\x42\x16\x90\xaa\x22\xe1\x2c\x20\x44\x87\x82\x48\x28\x27\x1c\ \x10\x02\x34\xb3\xc1\xbd\x43\x0a\x5c\x30\x81\x08\x60\x01\x55\x4c\ \x22\x05\x72\x28\x21\x00\x21\xf9\x04\x09\x07\x00\x10\x00\x2c\x00\ \x00\x00\x00\x10\x00\x10\x00\x00\x05\x64\x20\x24\x8e\x64\x49\x0e\ \x8d\x60\xae\xc3\xc3\xac\x6b\xf2\x10\xb0\xf8\x42\xc2\xf3\x98\x42\ \x20\x0a\xb7\x02\x6d\x14\xe8\x95\x0a\x8e\x41\xc9\x37\x32\x2c\x14\ \x0a\x83\xa9\x28\x50\x1d\x18\x58\xe9\xb2\xaa\x82\xf8\x06\x09\x93\ \x92\x14\x38\x40\x52\x25\x82\x61\x0c\x09\x4b\x11\x87\x2a\xa1\x80\ \x13\xfe\x44\xa8\x81\xc1\x8c\xe8\x32\x45\x01\x0b\x08\x10\x7b\x10\ \x04\x07\x7f\x24\x83\x84\x66\x10\x74\x35\x86\x43\x25\x21\x00\x3b\ \ \x00\x00\x01\x50\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\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\x00\xcd\x49\x44\ \x41\x54\x38\x8d\xa5\x93\x31\x0e\x83\x30\x0c\x45\x7f\x90\x25\xc6\ \x6e\xd0\x39\x5c\x80\xfb\x31\x20\x06\x0e\xc7\x01\xd8\x60\x2f\x3d\ \x01\x01\x27\xee\x84\x4a\x45\x92\x42\xfb\xa7\x24\xd6\x7f\xfe\xb1\ \x12\x25\x22\x68\xdb\xf6\xc1\xcc\x39\x2e\x88\x88\xa6\xaa\xaa\xee\ \x04\x00\xcc\x9c\xd7\x75\x7d\xc5\x8f\xa6\x69\x72\x00\xa0\xfd\xa1\ \x88\x04\x0d\xfb\x5a\x92\x24\xef\x75\xac\x8b\xd6\x0a\x5a\xab\x28\ \x38\x0a\xf8\x96\x04\x08\x5c\xa1\x28\x3e\xb9\xdb\x7e\x18\xec\xff\ \x09\x98\x39\x9c\x60\xd3\x38\xba\x43\x67\xe7\x1c\x96\x85\xc1\xcc\ \x48\xd3\xd4\x0f\x08\x0d\x6b\x5d\x57\x30\x33\xac\xb5\xf1\x04\x5b\ \x51\x44\x20\x22\xe8\x7b\x81\xb5\x16\xc6\x38\xaf\xf9\x00\x98\xe7\ \x19\x00\x70\x2b\x4b\x6f\x92\x67\xd7\xc5\x01\xc6\x18\xaf\x31\x26\ \xef\x10\x7d\x9d\x4e\x01\xb2\x2c\xfb\x2d\x01\x11\x4d\xdb\xe7\x38\ \x6d\x24\x9a\x00\x40\xc5\xde\xf9\x19\xbd\x00\x7a\xc4\x6d\xe9\x1c\ \xa0\x2c\xd8\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x7b\ \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\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\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\x01\xf8\x49\x44\ \x41\x54\x38\x8d\x95\x92\x3d\x68\x13\x71\x18\xc6\x9f\xf7\x2e\xc9\ \x35\xa9\x9a\x90\xf8\xd1\x5a\x95\x7e\x91\x2f\x2c\x7e\x05\x5d\xc4\ \xb1\x8b\x53\x31\x60\xb5\x83\x43\xc1\xc1\x45\x10\x8a\x43\xa7\x88\ \xe8\x10\xb0\xe2\x5c\x50\x3a\x4a\x26\xb9\x29\x3a\x74\x91\x40\x6d\ \x16\xab\x68\x2e\x88\x41\x8a\x16\xdb\x6b\x43\x72\xa1\x21\x77\xf7\ \x7f\x1d\x34\xe1\xae\x09\xc5\x3e\xd3\xff\xeb\x7d\xde\xdf\xc3\xfb\ \xa7\x7c\x3e\x9f\x2b\x14\x0a\x37\x70\x00\xa5\xd3\xe9\x9b\xc9\x64\ \xf2\x35\x00\x20\x93\xc9\xf0\x41\xf5\xaf\x06\xcc\x0c\x4f\xdb\x55\ \xd7\x75\x08\x21\x00\x00\x44\xd4\xe9\xd6\x5e\x13\x11\x64\x59\x46\ \x30\x18\x74\xd1\x74\x0c\x84\x10\xd0\x34\xcd\x55\xe0\x14\x11\x21\ \x91\x48\x74\xc5\xf1\x38\x37\xb1\x58\x6c\x5f\x82\x5e\xf2\x38\x1f\ \x3a\x09\xf6\xea\xbf\x08\xa2\xd1\x68\x8f\x8e\x4d\x30\x2b\x90\x24\ \x09\x82\x79\x7f\x83\x72\xb9\xec\xba\x8c\xc7\xe3\x68\x99\x3e\x64\ \x97\x3e\x20\xf7\xae\x82\xdf\xba\x81\x13\xc7\x8e\x60\x24\xe4\xc3\ \xd3\x54\xd6\xb7\xbb\x3a\xd7\x72\x45\xd8\x4b\x60\x5a\x02\x93\xf7\ \xde\x80\xfb\x42\x48\x5e\xb9\x8a\x84\xac\x60\x4b\xaf\xe3\x6b\xf9\ \x13\x40\x5b\x45\x7f\x2a\x7b\xc9\x45\xa0\x69\x9a\x2b\xf3\xa2\xfa\ \x03\xb6\xf7\x30\xce\x5e\xb8\x88\x81\x90\x07\xcf\x67\x4f\xe1\xf6\ \x42\x05\xdb\xad\x14\x8c\xe6\xca\xb0\x59\xd7\xe7\xbb\xa6\xe0\x24\ \x58\x7e\xbc\x86\xb1\xf3\x97\x31\x14\xf1\x62\x7c\x50\x01\x00\x9c\ \x1b\x0e\x60\xdb\xb0\xf1\xf3\xd7\xe8\x21\x36\x76\xa6\x5d\x11\x4a\ \xa5\x92\xcb\x60\x63\xb3\x86\x51\x59\xc1\x93\x99\x93\x50\xbc\x7f\ \xcf\x1f\x4e\x1d\xc7\xdd\xc9\x08\x22\x33\x3a\x14\x16\xa7\x7b\x12\ \xb4\x4d\x86\x06\xd6\xb0\xa9\xd7\x30\xfd\xac\x82\x89\x33\x7d\x78\ \x74\x6b\x10\xf7\x17\xd7\xf1\xf6\x63\x1d\x64\x36\xc0\x24\x57\x3a\ \x06\xe1\x70\xb8\x6b\x44\xb3\x53\x13\x78\x91\x2b\xa1\x6a\xf5\x43\ \xaf\x99\xd8\xa8\x1e\xc5\xf2\x67\x03\x5f\xd6\x9b\xf0\x55\xcb\x06\ \xb1\xfd\x8a\x54\x55\x55\x8b\xc5\xe2\xf5\xae\x6a\x00\xcc\xc0\xd2\ \xfb\x00\x76\xac\x10\x1a\xfd\x63\x30\x25\x3f\xc8\x6c\x20\x60\x7c\ \xb3\xac\xa6\xb1\x02\x61\x5f\x23\xee\xf1\x39\x9c\xf2\xa7\xb2\x32\ \x48\x7a\xc0\x24\xdf\x21\xb6\x47\x98\xe4\xef\xc4\xf6\x4b\xb0\x58\ \xd8\x5d\x9d\x13\x7f\x00\x70\x45\xf0\x0c\xcd\xc0\xad\x0d\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ " qt_resource_name = b"\ \x00\x05\ \x00\x34\xdb\x46\ \x00\x31\ \x00\x36\x00\x78\x00\x31\x00\x36\ \x00\x05\ \x00\x35\x9b\x52\ \x00\x32\ \x00\x32\x00\x78\x00\x32\x00\x32\ \x00\x0a\ \x00\x76\x15\xe7\ \x00\x62\ \x00\x7a\x00\x72\x00\x2d\x00\x34\x00\x38\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0a\ \x00\x44\x15\xe7\ \x00\x62\ \x00\x7a\x00\x72\x00\x2d\x00\x31\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0a\ \x00\x68\x15\xe7\ \x00\x62\ \x00\x7a\x00\x72\x00\x2d\x00\x33\x00\x32\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x09\x14\x31\x07\ \x00\x73\ \x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x2d\x00\x72\x00\x75\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x10\ \x00\x67\x0f\x67\ \x00\x75\ \x00\x6e\x00\x73\x00\x65\x00\x6c\x00\x65\x00\x63\x00\x74\x00\x2d\x00\x61\x00\x6c\x00\x6c\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x19\ \x01\x7d\x34\xe7\ \x00\x76\ \x00\x69\x00\x65\x00\x77\x00\x2d\x00\x73\x00\x70\x00\x6c\x00\x69\x00\x74\x00\x2d\x00\x6c\x00\x65\x00\x66\x00\x74\x00\x2d\x00\x72\ \x00\x69\x00\x67\x00\x68\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0a\ \x03\xcb\x6a\xc7\ \x00\x73\ \x00\x68\x00\x65\x00\x6c\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0a\ \x0c\xad\x0f\x07\ \x00\x64\ \x00\x65\x00\x6c\x00\x65\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x01\x82\x9d\x27\ \x00\x69\ \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\x0c\ \x0c\x4f\x6a\xc7\ \x00\x75\ \x00\x6e\x00\x73\x00\x68\x00\x65\x00\x6c\x00\x76\x00\x65\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\x0e\ \x00\x78\x07\x67\ \x00\x73\ \x00\x65\x00\x6c\x00\x65\x00\x63\x00\x74\x00\x2d\x00\x61\x00\x6c\x00\x6c\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\x18\ \x0d\x3e\x36\x47\ \x00\x69\ \x00\x6e\x00\x74\x00\x65\x00\x72\x00\x6e\x00\x65\x00\x74\x00\x2d\x00\x6e\x00\x65\x00\x77\x00\x73\x00\x2d\x00\x72\x00\x65\x00\x61\ \x00\x64\x00\x65\x00\x72\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\ \x00\x10\ \x08\x15\x13\x67\ \x00\x76\ \x00\x69\x00\x65\x00\x77\x00\x2d\x00\x72\x00\x65\x00\x66\x00\x72\x00\x65\x00\x73\x00\x68\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0d\ \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\x10\ \x0f\x26\x60\xa7\ \x00\x66\ \x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x2d\x00\x61\x00\x64\x00\x64\x00\x65\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x07\x89\xd8\xc7\ \x00\x63\ \x00\x6f\x00\x6d\x00\x70\x00\x75\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0a\ \x0a\xc8\xfb\x07\ \x00\x66\ \x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x09\x85\xdc\xe7\ \x00\x77\ \x00\x68\x00\x69\x00\x74\x00\x65\x00\x73\x00\x70\x00\x61\x00\x63\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0b\ \x06\x3d\x10\x27\ \x00\x67\ \x00\x6f\x00\x2d\x00\x64\x00\x6f\x00\x77\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x12\ \x0e\x64\x26\xe7\ \x00\x66\ \x00\x69\x00\x6c\x00\x65\x00\x2d\x00\x75\x00\x6e\x00\x63\x00\x68\x00\x61\x00\x6e\x00\x67\x00\x65\x00\x64\x00\x2e\x00\x70\x00\x6e\ \x00\x67\ \x00\x0c\ \x01\xec\xd9\x07\ \x00\x63\ \x00\x6f\x00\x6d\x00\x70\x00\x6c\x00\x65\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x14\ \x0d\xf7\x9b\xe7\ \x00\x66\ \x00\x6f\x00\x72\x00\x6d\x00\x61\x00\x74\x00\x2d\x00\x74\x00\x65\x00\x78\x00\x74\x00\x2d\x00\x62\x00\x6f\x00\x6c\x00\x64\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x09\ \x04\xc3\x8b\x07\ \x00\x67\ \x00\x6f\x00\x2d\x00\x75\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x1b\ \x04\xc8\x47\x87\ \x00\x61\ \x00\x63\x00\x63\x00\x65\x00\x73\x00\x73\x00\x6f\x00\x72\x00\x69\x00\x65\x00\x73\x00\x2d\x00\x74\x00\x65\x00\x78\x00\x74\x00\x2d\ \x00\x65\x00\x64\x00\x69\x00\x74\x00\x6f\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x05\x88\x02\xc7\ \x00\x66\ \x00\x69\x00\x6c\x00\x65\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\x08\ \x00\x28\x5a\xe7\ \x00\x66\ \x00\x69\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x04\x18\x42\x07\ \x00\x66\ \x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x2d\x00\x6f\x00\x70\x00\x65\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x14\ \x0d\x8f\xa4\x67\ \x00\x66\ \x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x2d\x00\x75\x00\x6e\x00\x63\x00\x68\x00\x61\x00\x6e\x00\x67\x00\x65\x00\x64\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x08\xa7\xc7\x07\ \x00\x66\ \x00\x69\x00\x6c\x00\x65\x00\x2d\x00\x63\x00\x6f\x00\x6e\x00\x66\x00\x6c\x00\x69\x00\x63\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x13\ \x0d\x61\x7f\x27\ \x00\x66\ \x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x2d\x00\x63\x00\x6f\x00\x6e\x00\x66\x00\x6c\x00\x69\x00\x63\x00\x74\x00\x2e\x00\x70\ \x00\x6e\x00\x67\ \x00\x11\ \x0d\x89\xed\xe7\ \x00\x66\ \x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x2d\x00\x62\x00\x72\x00\x61\x00\x6e\x00\x63\x00\x68\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x13\ \x09\xb6\xba\xe7\ \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\x0c\ \x05\xa2\x93\x27\ \x00\x62\ \x00\x6f\x00\x6f\x00\x6b\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x13\ \x06\x9c\xee\xf6\ \x00\x70\ \x00\x72\x00\x6f\x00\x63\x00\x65\x00\x73\x00\x73\x00\x2d\x00\x77\x00\x6f\x00\x72\x00\x6b\x00\x69\x00\x6e\x00\x67\x00\x2e\x00\x67\ \x00\x69\x00\x66\ \x00\x0b\ \x0f\x31\xc8\x07\ \x00\x75\ \x00\x6e\x00\x69\x00\x64\x00\x69\x00\x66\x00\x66\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x0a\xe7\x23\x47\ \x00\x66\ \x00\x69\x00\x6c\x00\x65\x00\x2d\x00\x61\x00\x64\x00\x64\x00\x65\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ " qt_resource_struct = b"\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x1a\x00\x00\x00\x17\ \x00\x00\x00\x10\x00\x02\x00\x00\x00\x11\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\x90\x00\x00\x00\x00\x00\x01\x00\x00\x18\x35\ \x00\x00\x01\xbc\x00\x00\x00\x00\x00\x01\x00\x00\x32\x93\ \x00\x00\x00\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x1a\x5a\ \x00\x00\x01\x22\x00\x00\x00\x00\x00\x01\x00\x00\x24\xdb\ \x00\x00\x01\x88\x00\x00\x00\x00\x00\x01\x00\x00\x2f\xdf\ \x00\x00\x00\xee\x00\x00\x00\x00\x00\x01\x00\x00\x1b\x9a\ \x00\x00\x02\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x4a\x9a\ \x00\x00\x02\x54\x00\x00\x00\x00\x00\x01\x00\x00\x3e\xea\ \x00\x00\x02\x74\x00\x00\x00\x00\x00\x01\x00\x00\x45\x42\ \x00\x00\x00\x6e\x00\x00\x00\x00\x00\x01\x00\x00\x13\x25\ \x00\x00\x01\x68\x00\x00\x00\x00\x00\x01\x00\x00\x2b\x99\ \x00\x00\x02\x02\x00\x00\x00\x00\x00\x01\x00\x00\x38\xcc\ \x00\x00\x01\x4a\x00\x00\x00\x00\x00\x01\x00\x00\x27\x6f\ \x00\x00\x02\xba\x00\x00\x00\x00\x00\x01\x00\x00\x51\x01\ \x00\x00\x01\x08\x00\x00\x00\x00\x00\x01\x00\x00\x20\x1c\ \x00\x00\x02\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x3c\x72\ \x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x00\x35\x0d\ \x00\x00\x04\x64\x00\x00\x00\x00\x00\x01\x00\x00\x74\xa9\ \x00\x00\x03\x9c\x00\x00\x00\x00\x00\x01\x00\x00\x62\x36\ \x00\x00\x01\x88\x00\x00\x00\x00\x00\x01\x00\x00\x78\x25\ \x00\x00\x04\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x76\x16\ \x00\x00\x03\xe8\x00\x00\x00\x00\x00\x01\x00\x00\x69\xc7\ \x00\x00\x04\x00\x00\x00\x00\x00\x00\x01\x00\x00\x6f\xeb\ \x00\x00\x04\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x72\x2d\ \x00\x00\x05\x74\x00\x00\x00\x00\x00\x01\x00\x00\x87\x59\ \x00\x00\x03\x56\x00\x00\x00\x00\x00\x01\x00\x00\x5d\x06\ \x00\x00\x05\x92\x00\x00\x00\x00\x00\x01\x00\x00\x8c\x32\ \x00\x00\x02\xfc\x00\x00\x00\x00\x00\x01\x00\x00\x57\xf7\ \x00\x00\x02\x74\x00\x00\x00\x00\x00\x01\x00\x00\x6c\x57\ \x00\x00\x04\xcc\x00\x00\x00\x00\x00\x01\x00\x00\x7c\xca\ \x00\x00\x03\x34\x00\x00\x00\x00\x00\x01\x00\x00\x5b\xac\ \x00\x00\x05\x48\x00\x00\x00\x00\x00\x01\x00\x00\x84\x85\ \x00\x00\x03\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x59\xb6\ \x00\x00\x05\xda\x00\x00\x00\x00\x00\x01\x00\x00\x93\x9b\ \x00\x00\x01\x68\x00\x00\x00\x00\x00\x01\x00\x00\x89\xc5\ \x00\x00\x01\x08\x00\x00\x00\x00\x00\x01\x00\x00\x67\x1b\ \x00\x00\x04\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x7f\x28\ \x00\x00\x05\x20\x00\x00\x00\x00\x00\x01\x00\x00\x81\xe3\ \x00\x00\x04\x9e\x00\x00\x00\x00\x00\x01\x00\x00\x79\xf9\ \x00\x00\x03\xba\x00\x00\x00\x00\x00\x01\x00\x00\x64\x56\ \x00\x00\x03\x72\x00\x00\x00\x00\x00\x01\x00\x00\x5f\xb5\ \x00\x00\x02\xd6\x00\x00\x00\x00\x00\x01\x00\x00\x55\x23\ \x00\x00\x05\xbe\x00\x00\x00\x00\x00\x01\x00\x00\x92\x47\ " def qInitResources(): QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) def qCleanupResources(): QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) qInitResources() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/revert.py0000644000000000000000000002746614556556456013310 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands: # # Contributors: # Mark Hammond # # 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 PyQt5 import QtCore, QtGui, QtWidgets from breezy import errors from breezy.plugins.qbrz.lib.diff import ( DiffButtons, show_diff, InternalWTDiffArgProvider, ) from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.subprocess import SubProcessDialog from breezy.plugins.qbrz.lib.treewidget import ( TreeWidget, SelectAllCheckBox, ) from breezy.plugins.qbrz.lib.util import ( ThrobberWidget, runs_in_loading_queue, ) from breezy.plugins.qbrz.lib.uifactory import ui_current_widget from breezy.plugins.qbrz.lib.trace import reports_exception from breezy.plugins.qbrz.lib.commit import PendingMergesList class RevertWindow(SubProcessDialog): def __init__(self, tree, selected_list, dialog=True, parent=None, local=None, message=None, ui_mode=True, backup=True): self.tree = tree self.has_pending_merges = len(tree.get_parent_ids())>1 self.initial_selected_list = selected_list SubProcessDialog.__init__(self, gettext("Revert"), name = "revert", default_size = (400, 400), ui_mode = ui_mode, dialog = dialog, parent = parent, hide_progress=True) self.throbber = ThrobberWidget(self) # Display the list of changed files self.file_groupbox = QtWidgets.QGroupBox(gettext("Select changes to revert"), self) self.filelist = TreeWidget(self.file_groupbox) self.filelist.throbber = self.throbber self.filelist.tree_model.set_select_all_kind('versioned') def filter_context_menu(): TreeWidget.filter_context_menu(self.filelist) self.filelist.action_add.setVisible(False) self.filelist.action_revert.setVisible(False) self.filelist.filter_context_menu = filter_context_menu self.selectall_checkbox = SelectAllCheckBox(self.filelist, self.file_groupbox) self.selectall_checkbox.setEnabled(True) self.no_backup_checkbox = QtWidgets.QCheckBox( gettext('Do not save backups of reverted files')) if not backup: self.no_backup_checkbox.setCheckState(QtCore.Qt.Checked) self.no_backup_checkbox.setEnabled(True) filesbox = QtWidgets.QVBoxLayout(self.file_groupbox) filesbox.addWidget(self.filelist) filesbox.addWidget(self.selectall_checkbox) filesbox.addWidget(self.no_backup_checkbox) if self.has_pending_merges: self.file_groupbox.setCheckable(True) self.merges_groupbox = QtWidgets.QGroupBox(gettext("Forget pending merges")) self.merges_groupbox.setCheckable(True) # This keeps track of what the merges_groupbox was before the # select all changes it, so that it can put it back to the state # it was. self.merges_base_checked = True self.pending_merges = PendingMergesList( self.processEvents, self.throbber, self) merges_box = QtWidgets.QVBoxLayout(self.merges_groupbox) merges_box.addWidget(self.pending_merges) self.selectall_checkbox.stateChanged[int].connect(self.selectall_state_changed) self.merges_groupbox.clicked[bool].connect(self.merges_clicked) self.file_groupbox.clicked[bool].connect(self.file_groupbox_clicked) self.filelist.tree_model.dataChanged[QModelIndex, QModelIndex].connect(self.filelist_data_changed) # groupbox gets disabled as we are executing. self.disableUi[bool].connect(self.file_groupbox.setDisabled) self.splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical) self.splitter.addWidget(self.file_groupbox) if self.has_pending_merges: self.splitter.addWidget(self.merges_groupbox) self.splitter.addWidget(self.make_default_status_box()) self.splitter.setStretchFactor(0, 10) self.restoreSplitterSizes([150, 150]) layout = QtWidgets.QVBoxLayout(self) layout.addWidget(self.throbber) layout.addWidget(self.splitter) # Diff button to view changes in files selected to revert self.diffbuttons = DiffButtons(self) self.diffbuttons.setToolTip( gettext("View changes in files selected to revert")) self.diffbuttons.triggered['QString'].connect(self.show_diff_for_checked) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(self.diffbuttons) hbox.addWidget(self.buttonbox) layout.addLayout(hbox) self.throbber.show() def show(self): SubProcessDialog.show(self) QtCore.QTimer.singleShot(1, self.initial_load) @runs_in_loading_queue @ui_current_widget @reports_exception() def initial_load(self): self.filelist.tree_model.checkable = True #fmodel.setFilter(fmodel.UNVERSIONED, False) if self.initial_selected_list is None and not self.has_pending_merges: self.initial_selected_list = [] self.filelist.set_tree(self.tree, changes_mode=True, want_unversioned=False, initial_checked_paths=self.initial_selected_list) self.filelist_checked_base = list( self.filelist.tree_model.iter_checked()) self.selectall_checkbox.update_state() self.processEvents() if self.has_pending_merges: self.pending_merges.load_tree(self.tree) self.processEvents() self.throbber.hide() # The logic for the next 4 methods is like this: # * Either file_groupbox or merges_groupbox or both must be checked, # never neither. # * If merges_groupbox is checked, all files must be checked. If a file is # unchecked, merges_groupbox must be unchecked. # Unless: # * file_groupbox is unchecked - then all files are unchecked. # # We keep a recored of what was checked, so that we we change something, # and then later we go back to a state where that change was not necessary, # we can return to what it was. This is stored in merges_base_checked, and # filelist_checked_base. def selectall_state_changed(self, state): if state == QtCore.Qt.Checked: self.merges_groupbox.setChecked(self.merges_base_checked) elif self.file_groupbox.isChecked(): self.merges_groupbox.setChecked(False) def merges_clicked(self, state): self.merges_base_checked = state if state: if self.file_groupbox.isChecked(): self.selectall_checkbox.clicked(QtCore.Qt.Checked) else: self.selectall_checkbox.clicked(QtCore.Qt.Unchecked) if not state: self.file_groupbox.setChecked(True) self.filelist.tree_model.set_checked_items( self.filelist_checked_base, ignore_no_file_error=True) def file_groupbox_clicked(self, state): if not state: self.merges_groupbox.setChecked(True) self.selectall_checkbox.clicked(QtCore.Qt.Unchecked) if state: if not self.merges_base_checked: self.filelist.tree_model.set_checked_items( self.filelist_checked_base, ignore_no_file_error=True) else: self.selectall_checkbox.clicked(QtCore.Qt.Checked) def filelist_data_changed(self, start, end): if (self.file_groupbox.isChecked() and not self.merges_groupbox.isChecked()): self.filelist_checked_base = list( self.filelist.tree_model.iter_checked()) def _is_revert_pending_merges(self): """Return True if selected to revert pending merges, False if not selected, None if there is no pending merges. """ if not self.has_pending_merges: return None return bool(self.merges_groupbox.isChecked()) def _get_files_to_revert(self): return [ref.path for ref in self.filelist.tree_model.iter_checked( include_unchanged_dirs=False) ] def validate(self): if (self._is_revert_pending_merges() is False and self.selectall_checkbox.checkState() == QtCore.Qt.Checked): if not self.ask_confirmation( gettext("You have selected revert for all changed paths\n" "but keep pending merges.\n\n" "Do you want to continue?") ): return False # It doesn't matter if selectall_checkbox checkbox is activated or not - # we really need to check if there are files selected, because you can # check the 'select all' checkbox if there are no files selectable. if not self._is_revert_pending_merges() and not self._get_files_to_revert(): self.operation_blocked(gettext("You have not selected anything to revert.")) return False return True def do_start(self): """Revert the files.""" args = ["revert"] if (self._is_revert_pending_merges() is None or (self._is_revert_pending_merges() is False and self.file_groupbox.isChecked())): args.extend(self._get_files_to_revert()) if (self._is_revert_pending_merges() is True and not self.file_groupbox.isChecked()): args.append("--forget-merges") if self.no_backup_checkbox.checkState(): args.append("--no-backup") self.process_widget.do_start(self.tree.basedir, *args) def _saveSize(self, config): SubProcessDialog._saveSize(self, config) self._saveSplitterSizes(config, self.splitter) def show_diff_for_checked(self, ext_diff=None, dialog_action='revert'): """Diff button clicked: show the diff for checked entries. @param ext_diff: selected external diff tool (if any) @param dialog_action: purpose of parent window (main action) """ # XXX make this function universal for both qcommit and qrevert (?) checked = [ref.path for ref in self.filelist.tree_model.iter_checked()] if checked: arg_provider = InternalWTDiffArgProvider( self.tree.basis_tree().get_revision_id(), self.tree, self.tree.branch, self.tree.branch, specific_files=checked) show_diff(arg_provider, ext_diff=ext_diff, parent_window=self, context=self.filelist.diff_context) else: msg = "No changes selected to " + dialog_action QtWidgets.QMessageBox.warning(self, "QBrz - " + gettext("Diff"), gettext(msg), QtWidgets.QMessageBox.Ok) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/revisionmessagebrowser.py0000644000000000000000000003603614556556456016601 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2009 Gary van der Merwe # # 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. import re from PyQt5 import QtCore, QtGui, QtWidgets from breezy.revision import CURRENT_REVISION from breezy import ( config, errors, lazy_regex, log, gpg, ) from breezy.plugins.qbrz.lib.i18n import gettext, ngettext from breezy.plugins.qbrz.lib.lazycachedrevloader import ( load_revisions, cached_revisions) from breezy.plugins.qbrz.lib.util import ( runs_in_loading_queue, format_timestamp, get_message, get_summary, open_browser, ) from breezy import foreign from breezy.plugins.qbrz.lib.uifactory import ui_current_widget from breezy.plugins.qbrz.lib import logmodel _email_re = lazy_regex.lazy_compile(r'([a-z0-9_\-.+]+@[a-z0-9_\-.+]+)', re.IGNORECASE) _link1_re = lazy_regex.lazy_compile(r'([\s>])(https?)://([^\s<>{}()]+[^\s.,<>{}()])', re.IGNORECASE) _link2_re = lazy_regex.lazy_compile(r'(\s)www\.([a-z0-9\-]+)\.([a-z0-9\-.\~]+)((?:/[^ <>{}()\n\r]*[^., <>{}()\n\r]?)?)', re.IGNORECASE) _tag_re = lazy_regex.lazy_compile(r'[, ]') _start_of_line_whitespace_re = lazy_regex.lazy_compile(r'(?m)^ +') def _dummy_gpg_verify(): return False gpg_verify_available_func = getattr(gpg.GPGStrategy, "verify_signatures_available", _dummy_gpg_verify) def htmlencode(s): """Convert single line to html snippet suitable to show in Qt widgets.""" return (s.replace("&", "&") .replace("<", "<") .replace(">", ">") .replace("\"", """) ) def htmlize(text): """Convert multiline text (of commit messages) to valid html snippet suitable to show in revision message browser widget. """ text = htmlencode(text) text = _start_of_line_whitespace_re.sub(lambda m: " " * len(m.group()), text) text = text.replace("\n", '
') text = _email_re.sub('\\1', text) text = _link1_re.sub('\\1\\2://\\3', text) text = _link2_re.sub('\\1www.\\2.\\3\\4', text) return text def quote_tag(tag): if _tag_re.search(tag): return '"%s"' % tag return tag def format_signature_validity(rev_id, repository, gpg_strategy): """get the signature validity :param rev_id: revision id to validate :param repository: branch of revision :param gpg_strategy: GPG strategy :return: human readable string to print to log """ from breezy import gpg result = repository.verify_revision_signature(rev_id, gpg_strategy) if result[0] == gpg.SIGNATURE_VALID: return "valid signature from {0}".format(result[1]) if result[0] == gpg.SIGNATURE_KEY_MISSING: return "unknown key {0}".format(result[1]) if result[0] == gpg.SIGNATURE_NOT_VALID: return "invalid signature!" if result[0] == gpg.SIGNATURE_NOT_SIGNED: return "no signature" class RevisionMessageBrowser(QtWidgets.QTextBrowser): """Widget to display revision metadata and messages.""" def __init__(self, parent=None): super(RevisionMessageBrowser, self).__init__(parent) # TODO(jelmer): Use branch stack conf = config.GlobalStack() self._gpg_strategy = gpg.GPGStrategy(conf) boxsize = self.fontMetrics().ascent() center = boxsize * 0.5 dotsize = 0.7 dot_rect = QtCore.QRectF(center - (boxsize * dotsize * 0.5 ), center - (boxsize * dotsize * 0.5 ), boxsize * dotsize, boxsize * dotsize) self.imagesize = boxsize self.images = [] for color in range(7): image = QtGui.QImage(boxsize, boxsize, QtGui.QImage.Format_ARGB32) image.fill(0) painter = QtGui.QPainter(image) painter.setRenderHint(QtGui.QPainter.Antialiasing) pen = QtGui.QPen() pen.setWidth(1) pen.setColor(self.get_act_color(color,False)) painter.setPen(pen) painter.setBrush(QtGui.QBrush(self.get_act_color(color,True))) painter.drawEllipse(dot_rect) painter.end() self.document().addResource(QtGui.QTextDocument.ImageResource, QtCore.QUrl("dot%d" % color), image) self.images.append(image) # RJLRJL - background() is obsolete in Qt5 - use window() instead # self.props_back_color_str = ("#%02X%02X%02X" % self.palette().background().color().getRgb()[:3]) self.props_back_color_str = ("#%02X%02X%02X" % self.palette().window().color().getRgb()[:3]) def get_act_color(self, color, back): qcolor = QtGui.QColor() if color == 0: if back: qcolor.setHsvF(0,0,0.8) else: qcolor.setHsvF(0,0,0) else: h = float(color % 6) / 6 if back: qcolor.setHsvF(h,0.4,1) else: qcolor.setHsvF(h,1,0.7) return qcolor def set_display_revids(self, revids, repo): self._display_revids = revids self._all_loaded_revs = {} revids_to_load = set(revids) for revid in revids: revids_to_load.update(set(self.get_parents(revid))) revids_to_load.update(set(self.get_children(revid))) load_revisions(list(revids_to_load), repo, revisions_loaded=self.revisions_loaded, pass_prev_loaded_rev=True) def revisions_loaded(self, revs_loaded, last_call): self._all_loaded_revs.update(revs_loaded) rev_html = [] min_merge_depth = min([self.get_merge_depth(revid) for revid in self._display_revids]) for revid in self._display_revids: props = [] message = "" props.append((gettext("Revision:"), "%s revid:%s" % (self.get_revno(revid), revid.decode('ascii')))) parents = self.get_parents(revid) children = self.get_children(revid) def short_text(summary, length): if len(summary) > length: return summary[:length - 1] + "\u2026" else: return summary def revision_list_html(revids): revs = [] for revid in revids: revno = self.get_revno(revid) color = self.get_color(revid) if color is not None: color = '' % (color % 6, self.imagesize, self.imagesize) else: color = "" if revid in self._all_loaded_revs: summary = get_summary(self._all_loaded_revs[revid]) revs.append('%s%s: %s' % (revid.decode('ascii'), htmlencode(summary), color, revno, htmlencode((short_text(summary, 60))))) else: revs.append('%s%srevid: %s' % (revid.decode('ascii'), color, revno, revid)) return '
'.join(revs) if parents: props.append((gettext("Parents:"), revision_list_html(parents))) if children: props.append((gettext("Children:"), revision_list_html(children))) if gpg_verify_available_func(): try: signature_result_text = format_signature_validity(revid, cached_revisions[revid].repository, self._gpg_strategy) props.append((gettext("Signature:"), signature_result_text)) except KeyError: #can't get Repository object for uncached revisions pass # RJLRJL removed # except AttributeError: # # WorkingTreeRevision object has no attribute 'repository' # pass if not revid == CURRENT_REVISION: if revid in self._all_loaded_revs: rev = self._all_loaded_revs[revid] props.extend(self.loaded_revision_props(rev)) message = htmlize(get_message(rev)) search_replace = self.get_search_replace(revid) if search_replace: for search, replace in search_replace: message = re.sub(search, replace, message) else: message = gettext("Uncommited Working Tree Changes") margin_left = (self.get_merge_depth(revid)-min_merge_depth)*20 text = [] text.append('' % (self.props_back_color_str, margin_left)) for prop in props: # white-space: pre is needed because in some languaged, some # prop labels have more than 1 word. white-space: nowrap # does not work for Japanese, but pre does. text.append(('' '' '' '') % prop) text.append('
%s%s
') text.append('
%s
' % (margin_left + 2 , message)) rev_html.append("".join(text)) self.setHtml("
".join(rev_html)) # setHtml creates a new document, so we have to re add the images. for color, image in enumerate(self.images): self.document().addResource(QtGui.QTextDocument.ImageResource, QtCore.QUrl("dot%d" % color), image) def loaded_revision_props(self, rev): props = [] if rev.timestamp is not None: props.append((gettext("Date:"), format_timestamp(rev.timestamp))) if rev.committer: props.append((gettext("Committer:"), htmlize(rev.committer))) authors = rev.properties.get('authors') if not authors: authors = rev.properties.get('author') if authors: props.append((gettext("Author:"), htmlize(authors))) branch_nick = rev.properties.get('branch-nick') if branch_nick: props.append((gettext("Branch:"), htmlize(branch_nick))) tags = self.get_tags(rev.revision_id) if tags: tags = list(map(quote_tag, tags)) props.append((gettext("Tags:"), htmlencode(", ".join(tags)))) bugs = [] for bug in rev.properties.get('bugs', '').split('\n'): if bug: try: url, status = bug.split(' ', 1) bugs.append('%(url)s %(status)s' % (dict(url=url, status=gettext(status)))) except ValueError: bugs.append(bug) # show it "as is" if bugs: props.append((ngettext("Bug:", "Bugs:", len(bugs)), ", ".join(bugs))) foreign_attribs = None if isinstance(rev, foreign.ForeignRevision): foreign_attribs = rev.mapping.vcs.show_foreign_revid(rev.foreign_revid) elif b":" in rev.revision_id: try: foreign_revid, mapping = foreign.foreign_vcs_registry.parse_revision_id(rev.revision_id) foreign_attribs = mapping.vcs.show_foreign_revid(foreign_revid) except errors.InvalidRevisionId: pass if foreign_attribs: keys = list(foreign_attribs.keys()) keys.sort() for key in keys: props.append((key + ":", foreign_attribs[key])) return props def get_parents(self, revid): # Normally, we don't know how to do this. return [] def get_children(self, revid): # Normally, we don't know how to do this. return [] def get_revno(self, revid): # Normally, we don't know how to do this. return "" def get_search_replace(self, revid): # Normally, we don't know how to do this. return None def get_merge_depth(self, revid): # Normally, we don't know how to do this. return 0 def get_color(self, revid): # Normally, we don't know how to do this. return None def get_tags(self, revid): return None def setSource(self, uri): pass class LogListRevisionMessageBrowser(RevisionMessageBrowser): """RevisionMessageBrowser customized to work with LogList""" def __init__(self, log_list, parent=None): super(LogListRevisionMessageBrowser, self).__init__(parent) self.log_list = log_list self.log_list.selectionModel().selectionChanged[QtCore.QItemSelection, QtCore.QItemSelection].connect(self.update_selection) self.anchorClicked[QtCore.QUrl].connect(self.link_clicked) self.throbber = parent.throbber @runs_in_loading_queue @ui_current_widget def update_selection(self, selected, deselected): indexes = self.log_list.get_selection_indexes() if not indexes: self.setHtml("") else: revids = [index.data(logmodel.RevIdRole) for index in indexes] self.set_display_revids( revids, self.log_list.log_model.graph_viz.get_repo_revids) def link_clicked(self, url): scheme = str(url.scheme()) if scheme == 'qlog-revid': revision_id = str(url.path()).encode('ascii') self.log_list.select_revid(revision_id) else: open_browser(str(url.toEncoded())) def get_parents(self, revid): return self.log_list.log_model.graph_viz.known_graph.get_parent_keys(revid) def get_children(self, revid): return [child for child in self.log_list.log_model.graph_viz.known_graph.get_child_keys(revid) if not child == "top:"] def get_revno(self, revid): return self.log_list.log_model.graph_viz.revid_rev[revid].revno_str def get_merge_depth(self, revid): return self.log_list.log_model.graph_viz.revid_rev[revid].merge_depth def get_color(self, revid): return self.log_list.log_model.graph_viz.revid_rev[revid].color def get_tags(self, revid): return self.log_list.log_model.graph_viz.tags.get(revid) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/revisionview.py0000644000000000000000000000535414556556456014522 0ustar00# QBrz - Qt frontend to Breezy commands # # Copyright (C) 2006-2007 Gary van der Merwe # # 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 PyQt5 import QtCore, QtWidgets from breezy.plugins.qbrz.lib.diffwindow import DiffWindow from breezy.plugins.qbrz.lib.diff_arg import InternalDiffArgProvider from breezy.plugins.qbrz.lib.revisionmessagebrowser import RevisionMessageBrowser from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.lazycachedrevloader import load_revisions # DiffWindow has alot of stuff that we need, so we just extend it. class RevisionView(DiffWindow): """Shows information, and a diff for a revision, in a window.""" def __init__(self, revid, branch, parent=None): self.branch = branch self.revid = revid args = InternalDiffArgProvider(None, revid, branch, branch) DiffWindow.__init__(self, args, parent, allow_refresh=False) self.message_browser = RevisionMessageBrowser(self) self.message_browser.set_display_revids([self.revid], branch.repository) vsplitter = QtWidgets.QSplitter(QtCore.Qt.Vertical) vsplitter.addWidget(self.message_browser) vsplitter.addWidget(self.stack) vsplitter.setStretchFactor(0, 1) vsplitter.setStretchFactor(1, 3) self.centralwidget.layout().insertWidget(1, vsplitter) self.centralwidget.layout().removeWidget(self.stack) self.set_diff_title() def initial_load(self): self.throbber.show() load_revisions([self.revid], self.branch.repository, pass_prev_loaded_rev=True, revisions_loaded=self.revisions_loaded) def revisions_loaded(self, loaded_revs, last_call): revision = loaded_revs[self.revid] self.arg_provider.old_revid = revision.parent_ids[0] super(RevisionView, self).initial_load() self.throbber.hide() def set_diff_title(self): title = [gettext("Revision"), self.revid] self.set_title_and_icon(title) def restoreSize(self, name, defaultSize): super(RevisionView, self).restoreSize("revisionview", defaultSize) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/revtreeview.py0000644000000000000000000002355514556556456014343 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2006-2007 Gary van der Merwe # # 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 PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib import MS_WINDOWS from breezy.plugins.qbrz.lib.util import run_in_loading_queue from breezy.plugins.qbrz.lib.lazycachedrevloader import load_revisions from breezy.plugins.qbrz.lib.diff import ExtDiffContext from breezy.transport.local import LocalTransport RevIdRole = QtCore.Qt.UserRole + 1 class RevisionTreeView(QtWidgets.QTreeView): """TreeView widget to shows revisions. Only revisions that are visible on screen are loaded. The model for this tree view must have the following methods: def on_revisions_loaded(self, revisions, last_call) def get_revid(self, index) def get_repo(self) """ def __init__(self, parent=None): QtWidgets.QTreeView.__init__(self, parent) self.verticalScrollBar().valueChanged[int].connect(self.scroll_changed) self.collapsed[QtCore.QModelIndex].connect(self.collapsed_expanded) self.expanded[QtCore.QModelIndex].connect(self.collapsed_expanded) self.load_revisions_call_count = 0 self.load_revisions_throbber_shown = False self.revision_loading_disabled = False self.diff_context = ExtDiffContext(self) def setModel(self, model): # QtWidgets.QTreeView.setModel(self, model) # Do NOT be tempted to simplify this back to the old version if isinstance(model, QtCore.QAbstractProxyModel): # Connecting the below signal has funny results when we connect to to a ProxyModel, so connect to the source model. # RJLRJL: This is because, if you are doing things on the proxy rather than the source, you need to update the # source using sourceModel(). You might also need to use sourceModel().layoutChanged.emit() too. Doing # model = model.sourceModel() is not quite the same thing. QtWidgets.QTreeView.setModel(self, model.sourceModel()) model.sourceModel().dataChanged[QtCore.QModelIndex, QtCore.QModelIndex].connect(self.data_changed) model.sourceModel().layoutChanged.connect(self.layout_changed) else: QtWidgets.QTreeView.setModel(self, model) model.dataChanged[QtCore.QModelIndex, QtCore.QModelIndex].connect(self.data_changed) model.layoutChanged.connect(self.layout_changed) def scroll_changed(self, value): self.load_visible_revisions() def data_changed(self, start_index, end_index): self.load_visible_revisions() def layout_changed(self): self.load_visible_revisions() def collapsed_expanded(self, index): self.load_visible_revisions() def resizeEvent(self, e): self.load_visible_revisions() QtWidgets.QTreeView.resizeEvent(self, e) def load_visible_revisions(self): if not self.revision_loading_disabled: run_in_loading_queue(self._load_visible_revisions) def _load_visible_revisions(self): model = self.model() index = self.indexAt(self.viewport().rect().topLeft()) if not index.isValid(): return # if self.throbber is not None: # throbber_height = self.throbber. etc... bottom_index = self.indexAt(self.viewport().rect().bottomLeft()) # + throbber_height revids = [] while True: revid = index.data(RevIdRole) if revid is not None: if revid not in revids: revids.append(revid) if index == bottom_index: break index = self.indexBelow(index) if not index.isValid(): break revids = list(revids) if len(revids) == 0: return self.load_revisions_call_count += 1 current_call_count = self.load_revisions_call_count def before_batch_load(repo, revids): if current_call_count < self.load_revisions_call_count: return True repo_is_local = isinstance(repo.controldir.transport, LocalTransport) if not repo_is_local: # Disable this until we have thobber that does not irratate # users when we show and hide quickly. # if not self.load_revisions_throbber_shown \ # and hasattr(self, "throbber"): # self.throbber.show() # self.load_revisions_throbber_shown = True # Allow for more scrolling to happen. self.delay(500) return False try: load_revisions(revids, model.get_repo(), revisions_loaded=model.on_revisions_loaded, before_batch_load=before_batch_load) finally: self.load_revisions_call_count -= 1 if self.load_revisions_call_count == 0: # This is the last running method if self.load_revisions_throbber_shown: self.load_revisions_throbber_shown = False self.throbber.hide() def delay(self, timeout): def null(): pass QtCore.QTimer.singleShot(timeout, null) QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.WaitForMoreEvents) has_vista_style = hasattr(QtGui, "QWindowsVistaStyle") AERO_ENABLED = False if MS_WINDOWS: from breezy.plugins.qbrz.lib import win32util # it seems that latest available bzr distributives for Windows # contain a bit outdated version of PyQt which does not support Win8 styles well. # But it does support Vista/Win7 good enough. # So we enable our hack with selected text color only on Vista/Win7 if win32util.is_vista_or_win7(): AERO_ENABLED = win32util.is_aero_enabled() def get_text_color(option, style): # cg == ColorGroup if option.state & QtWidgets.QStyle.State_Enabled: if option.state & QtWidgets.QStyle.State_Active: cg = QtGui.QPalette.Active else: cg = QtGui.QPalette.Inactive else: cg = QtGui.QPalette.Disabled if option.state & QtWidgets.QStyle.State_Selected: if has_vista_style and isinstance(style, QtGui.QWindowsVistaStyle): # QWindowsVistaStyle normally modifies it palette, # but as we can't reuse that code, we have to reproduce # what it does here. # https://bugs.edge.launchpad.net/qbrz/+bug/457895 return option.palette.color(cg, QtGui.QPalette.Text) elif AERO_ENABLED: # hack-hack-hack for Vista/Win7: we need to use the black text # when aero selection of light blue with gradient is used return option.palette.color(cg, QtGui.QPalette.Text) return option.palette.color(cg, QtGui.QPalette.HighlightedText) else: return option.palette.color(cg, QtGui.QPalette.Text) class RevNoItemDelegate(QtWidgets.QStyledItemDelegate): def __init__(self, max_mainline_digits=4, parent=None): QtWidgets.QItemDelegate.__init__(self, parent) self.max_mainline_digits = max_mainline_digits def paint(self, painter, option, index): # option = QtGui.QStyleOptionViewItemV4(option) option = QtWidgets.QStyleOptionViewItem(option) self.initStyleOption(option, index) widget = self.parent() style = widget.style() painter.save() painter.setClipRect(option.rect) style.drawPrimitive(QtWidgets.QStyle.PE_PanelItemViewItem, option, painter, widget) text_margin = style.pixelMetric(QtWidgets.QStyle.PM_FocusFrameHMargin, None, widget) + 1 text_rect = option.rect.adjusted(text_margin, 0, -text_margin, 0) painter.setPen(get_text_color(option, style)) if option.text: text = option.text paint_revno(painter, text_rect, text, self.max_mainline_digits) painter.restore() def set_max_revno(self, revno): """Update max_mainline_digits based on max revno. Return the new value of max_mainline_digits to caller. """ mainline_digits = len("%d" % revno) self.max_mainline_digits = max(mainline_digits, 4) return self.max_mainline_digits def paint_revno(painter, rect, revno, max_mainline_digits): splitpoint = revno.find(".") if splitpoint == -1: splitpoint = len(revno) mainline, therest = revno[:splitpoint], revno[splitpoint:] if mainline.endswith(" ?"): mainline = mainline[:-2] therest = " ?" fm = painter.fontMetrics() mainline_width = fm.width("8"*max_mainline_digits) therest_width = fm.width(therest) if mainline_width + therest_width > rect.width(): text = revno if fm.width(text) > rect.width(): text = fm.elidedText(text, QtCore.Qt.ElideRight, rect.width()) painter.drawText(rect, QtCore.Qt.AlignRight, text) else: mainline_rect = QtCore.QRect(rect.x(), rect.y(), mainline_width, rect.height()) therest_rect = QtCore.QRect(rect.x() + mainline_width, rect.y(), rect.width() - mainline_width, rect.height()) painter.drawText(mainline_rect, QtCore.Qt.AlignRight, mainline) painter.drawText(therest_rect, QtCore.Qt.AlignLeft, therest) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/run.py0000644000000000000000000002701414556556456012572 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # # Contributor: # Alexander Belchenko, 2009 # # 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. """Dialog to run arbitrary bzr command.""" import os from PyQt5 import QtCore, QtGui, QtWidgets from breezy import osutils from breezy.plugins.qbrz.lib import MS_WINDOWS from breezy.plugins.qbrz.lib.help import get_help_topic_as_html from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.subprocess import SubProcessDialog from breezy.plugins.qbrz.lib.ui_run import Ui_RunDialog from breezy.plugins.qbrz.lib.util import hookup_directory_picker, shlex_split_unicode class QBzrRunDialog(SubProcessDialog): def __init__(self, command=None, parameters=None, workdir=None, category=None, ui_mode=False, parent=None, execute=False): """Build dialog. @param command: initial command selection. @param parameters: initial options and arguments (string) for command. @param workdir: working directory to run command. @param category: initial category selection. @param ui_mode: wait after the operation is complete. @param parent: parent window. @param execute: True => run command immediately """ super(QBzrRunDialog, self).__init__(name="run", ui_mode=ui_mode, dialog=True, parent=parent) self.ui = Ui_RunDialog() self.ui.setupUi(self) if workdir is None: workdir = osutils.getcwd() self.ui.wd_edit.setText(workdir) # set help_browser with some default text self.set_default_help() # cmd_combobox should fill all available space self.ui.cmd_layout.setColumnStretch(1, 1) self.ui.cmd_layout.setColumnStretch(2, 1) # fill cmd_combobox with available commands self.collect_command_names() # RJL in python 2 we could do this quite happily, even if a key were None # # categories = sorted(self.all_cmds.keys()) # # Python3 spits a TypeError at you, though, so convert None to '' categories = sorted(self.all_cmds, key=lambda k: '' if k is None else k) self.ui.cat_combobox.insertItems(0, categories) self.set_cmd_combobox(cmd_name=command) # add the parameters, if any if parameters: self.ui.opt_arg_edit.setText(parameters) # and add the subprocess widgets for w in self.make_default_layout_widgets(): 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 self.ui.hidden_checkbox.stateChanged[int].connect(self.set_show_hidden) self.ui.cmd_combobox.currentIndexChanged['QString'].connect(self.set_cmd_help) self.ui.cmd_combobox.editTextChanged['QString'].connect(self.set_cmd_help) self.ui.cat_combobox.currentIndexChanged['QString'].connect(self.set_category) hookup_directory_picker(self, self.ui.browse_button, self.ui.wd_edit, gettext("Select working directory")) self.ui.directory_button.clicked.connect(self.insert_directory) self.ui.filenames_button.clicked.connect(self.insert_filenames) # Init the category if set. # (This needs to be done after the signals are hooked up) if category: cb = self.ui.cat_combobox index = cb.findText(category) if index >= 0: cb.setCurrentIndex(index) # ready to go if execute: # hide user edit fields self.ui.run_container.hide() self.ui.help_browser.hide() # create edit button self.editButton = QtWidgets.QPushButton(gettext('&Edit')) self.editButton.clicked.connect(self.enable_command_edit) # cause edit button to be shown if command fails self.subprocessFailed[bool].connect(self.editButton.setHidden) # add edit button to dialog buttons self.buttonbox.addButton(self.editButton, QtWidgets.QDialogButtonBox.ResetRole) # setup initial dialog button status self.closeButton.setHidden(True) self.okButton.setHidden(True) self.editButton.setHidden(True) # cancel button gets hidden when finished. self.subprocessFinished[bool].connect(self.cancelButton.setHidden) # run command self.do_start() else: if command: self.ui.opt_arg_edit.setFocus() else: self.ui.cmd_combobox.setFocus() def enable_command_edit(self): """Hide Edit button and make user edit fields visible""" self.editButton.setHidden(True) self.subprocessFailed[bool].disconnect(self.editButton.setHidden) self.ui.run_container.show() self.ui.help_browser.show() self.okButton.setVisible(True) def set_default_help(self): """Set default text in help widget.""" self.ui.help_browser.setHtml("%s" % gettext("Help for command")) def collect_command_names(self): """Collect names of available bzr commands.""" from breezy import commands as _mod_commands names = list(_mod_commands.all_command_names()) self.cmds_dict = dict((n, _mod_commands.get_cmd_object(n)) for n in names) # Find the commands for each category, public or otherwise builtins = _mod_commands.builtin_command_names() self.all_cmds = {'All': []} self.public_cmds = {'All': []} for name, cmd in self.cmds_dict.items(): # If a command is builtin, we always put it into the Core # category, even if overridden in a plugin if name in builtins: category = 'Core' else: category = cmd.plugin_name() # RJLRJL Removed # if category is None: # continue self.all_cmds['All'].append(name) self.all_cmds.setdefault(category, []).append(name) if not cmd.hidden: self.public_cmds['All'].append(name) self.public_cmds.setdefault(category, []).append(name) # Sort them for category in self.all_cmds: self.all_cmds[category].sort() try: self.public_cmds[category].sort() except KeyError: # no public commands - that's ok pass def set_category(self, category): cmd_name = self._get_cmd_name() all = self.ui.hidden_checkbox.isChecked() category = str(category) self.set_cmd_combobox(cmd_name=cmd_name, all=all, category=category) def set_show_hidden(self, show): cmd_name = self._get_cmd_name() all = bool(show) category = str(self.ui.cat_combobox.currentText()) self.set_cmd_combobox(cmd_name=cmd_name, all=all, category=category) def set_cmd_combobox(self, cmd_name=None, all=False, category=None): """Fill command combobox with bzr commands names. @param cmd_name: if not None, the command to initially select if it exists in the list. @param all: show all commands including hidden ones. @param category: show commands just for this category. If None, commands in all categories are shown. """ cb = self.ui.cmd_combobox cb.clear() if all: lookup = self.all_cmds else: lookup = self.public_cmds if category is None: category = 'All' cb.addItems(lookup.get(category, [])) if cmd_name is None: index = -1 else: index = cb.findText(cmd_name) if index >= 0: self.set_cmd_help(cmd_name) cb.setCurrentIndex(index) def _get_cmd_name(self): """Return the command name.""" return str(self.ui.cmd_combobox.currentText()).strip() def set_cmd_help(self, cmd_name): """Show help for selected command in help widget. @param cmd_name: name of command to show help. """ cmd_name = str(cmd_name) # XXX handle command aliases??? cmd_object = self.cmds_dict.get(cmd_name) if cmd_object: # [Bug #963542] get_help_topic_as_html returns valid utf-8 encoded # HTML document, but QTextBrowser expects unicode. # (actually QString which is unicode in PyQt4). html_utf8 = get_help_topic_as_html("commands/" + cmd_name) if isinstance(html_utf8, str): html_unicode = html_utf8 else: html_unicode = html_utf8.decode('utf-8') self.ui.help_browser.setHtml(html_unicode) else: self.set_default_help() def _get_cwd(self, default=None): """Return selected working dir for command. @param default: if working dir is not exists then return this default value. """ cwd = str(self.ui.wd_edit.text()) if not os.path.isdir(cwd): cwd = default return cwd def _prepare_filepath(self, path): """Ensure path is safe to insert to options/arguments command line. On Windows convert backslashes to slashes; if path contains spaces we need to quote it. @return: path string suitable to insert to command line. """ if MS_WINDOWS: path = path.replace('\\', '/') if " " in path: path = '"%s"' % path return path def insert_directory(self): """Select existing directory and insert it to command line.""" cwd = self._get_cwd("") path = QtWidgets.QFileDialog.getExistingDirectory(self, gettext("Select path to insert"), cwd) if path: self.ui.opt_arg_edit.insert(self._prepare_filepath(str(path)) + " ") def insert_filenames(self): """Select one or more existing files and insert them to command line.""" cwd = self._get_cwd("") filenames = QtWidgets.QFileDialog.getOpenFileNames(self, gettext("Select files to insert"), cwd)[0] for i in filenames: self.ui.opt_arg_edit.insert( self._prepare_filepath(str(i)) + " ") def validate(self): """Validate before launch command: start command only if there is one.""" if self._get_cmd_name(): return True return False def do_start(self): """Launch command.""" cwd = self._get_cwd() args = [self._get_cmd_name()] opt_arg = self.ui.opt_arg_edit.text() args.extend(shlex_split_unicode(opt_arg)) self.process_widget.do_start(cwd, *args) def _saveSize(self, config): SubProcessDialog._saveSize(self, config) self._saveSplitterSizes(config, self.splitter) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/send.py0000644000000000000000000002552014556556456012717 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # # Contributors: # Javier Derderian # # 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. import re from PyQt5 import QtCore, QtGui, QtWidgets from breezy import errors from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.subprocess import SubProcessDialog from breezy.plugins.qbrz.lib.util import url_for_display class SendWindow(SubProcessDialog): def __init__(self, branch, ui_mode=False, parent=None): title = "%s: %s" % (gettext("Send"), url_for_display(branch.base)) super(SendWindow, self).__init__( title, name = "send", default_size = (400, 400), ui_mode = ui_mode, dialog = True, parent = parent, hide_progress=False, ) self.branch = branch gbMergeDirective = QtWidgets.QGroupBox(gettext("Merge Directive Options"), self) vboxMergeDirective = QtWidgets.QVBoxLayout(gbMergeDirective) vboxMergeDirective.addStrut(0) submit_hbox = QtWidgets.QHBoxLayout() submit_branch_label = QtWidgets.QLabel(gettext("Submit Branch:")) submit_branch_combo = QtWidgets.QComboBox() submit_branch_combo.setEditable(True) submitbranch = branch.get_submit_branch() if submitbranch != None: submit_branch_combo.addItem(submitbranch) self.submit_branch_combo = submit_branch_combo # to allow access from another function browse_submit_button = QtWidgets.QPushButton(gettext("Browse")) browse_submit_button.clicked[bool].connect(self.browse_submit_clicked) submit_hbox.addWidget(submit_branch_label) submit_hbox.addWidget(submit_branch_combo) submit_hbox.addWidget(browse_submit_button) submit_hbox.setStretchFactor(submit_branch_label,0) submit_hbox.setStretchFactor(submit_branch_combo,1) submit_hbox.setStretchFactor(browse_submit_button,0) vboxMergeDirective.addLayout(submit_hbox) public_hbox = QtWidgets.QHBoxLayout() public_branch_label = QtWidgets.QLabel(gettext("Public Branch:")) public_branch_combo = QtWidgets.QComboBox() public_branch_combo.setEditable(True) publicbranch = branch.get_public_branch() if publicbranch != None: public_branch_combo.addItem(publicbranch) self.public_branch_combo = public_branch_combo # to allow access from another function browse_public_button = QtWidgets.QPushButton(gettext("Browse")) browse_public_button.clicked[bool].connect(self.browse_public_clicked) public_hbox.addWidget(public_branch_label) public_hbox.addWidget(public_branch_combo) public_hbox.addWidget(browse_public_button) public_hbox.setStretchFactor(public_branch_label,0) public_hbox.setStretchFactor(public_branch_combo,1) public_hbox.setStretchFactor(browse_public_button,0) vboxMergeDirective.addLayout(public_hbox) remember_check = QtWidgets.QCheckBox(gettext("Remember these locations as defaults")) self.remember_check = remember_check vboxMergeDirective.addWidget(remember_check) bundle_check = QtWidgets.QCheckBox(gettext("Include a bundle in the merge directive")) bundle_check.setChecked(True) self.bundle_check = bundle_check vboxMergeDirective.addWidget(bundle_check) patch_check = QtWidgets.QCheckBox(gettext("Include a preview patch in the merge directive")) patch_check.setChecked(True) self.patch_check = patch_check vboxMergeDirective.addWidget(patch_check) gbAction = QtWidgets.QGroupBox(gettext("Action"), self) vboxAction = QtWidgets.QVBoxLayout(gbAction) submit_email_radio = QtWidgets.QRadioButton("Send e-mail") submit_email_radio.toggle() self.submit_email_radio = submit_email_radio vboxAction.addWidget(submit_email_radio) mailto_hbox = QtWidgets.QHBoxLayout() mailto_label = QtWidgets.QLabel(gettext("Address:")) mailto_edit = QtWidgets.QLineEdit() self.mailto_edit = mailto_edit mailto_hbox.insertSpacing(0,50) mailto_hbox.addWidget(mailto_label) mailto_hbox.addWidget(mailto_edit) vboxAction.addLayout(mailto_hbox) message_hbox = QtWidgets.QHBoxLayout() message_label = QtWidgets.QLabel(gettext("Message:")) message_edit = QtWidgets.QLineEdit() self.message_edit = message_edit message_hbox.insertSpacing(0,50) message_hbox.addWidget(message_label) message_hbox.addWidget(message_edit) vboxAction.addLayout(message_hbox) save_file_radio = QtWidgets.QRadioButton("Save to file") self.save_file_radio = save_file_radio vboxAction.addWidget(save_file_radio) savefile_hbox = QtWidgets.QHBoxLayout() savefile_label = QtWidgets.QLabel(gettext("Filename:")) savefile_edit = QtWidgets.QLineEdit() self.savefile_edit = savefile_edit # to allow access from callback function savefile_button = QtWidgets.QPushButton(gettext("Browse")) savefile_button.clicked[bool].connect(self.savefile_button_clicked) savefile_hbox.insertSpacing(0,50) savefile_hbox.addWidget(savefile_label) savefile_hbox.addWidget(savefile_edit) savefile_hbox.addWidget(savefile_button) vboxAction.addLayout(savefile_hbox) revisions_hbox = QtWidgets.QHBoxLayout() revisions_label = QtWidgets.QLabel(gettext("Revisions:")) revisions_edit = QtWidgets.QLineEdit() self.revisions_edit = revisions_edit revisions_hbox.addWidget(revisions_label) revisions_hbox.addWidget(revisions_edit) vboxAction.addLayout(revisions_hbox) layout = QtWidgets.QVBoxLayout(self) self.splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical) self.splitter.addWidget(gbAction) self.splitter.addWidget(gbMergeDirective) self.splitter.addWidget(self.make_default_status_box()) self.splitter.setStretchFactor(0, 10) self.restoreSplitterSizes([150, 150]) layout.addWidget(self.splitter) layout.addWidget(self.buttonbox) def savefile_button_clicked(self): fileName = QtWidgets.QFileDialog.getSaveFileName(self, ("Select save location"));[0] if fileName != '': self.savefile_edit.setText(fileName) def browse_submit_clicked(self): fileName = QtWidgets.QFileDialog.getExistingDirectory(self, ("Select Submit branch")); if fileName != '': self.submit_branch_combo.insertItem(0,fileName) self.submit_branch_combo.setCurrentIndex(0) def browse_public_clicked(self): fileName = QtWidgets.QFileDialog.getExistingDirectory(self, ("Select Public branch")); if fileName != '': self.public_branch_combo.insertItem(0,fileName) self.public_branch_combo.setCurrentIndex(0) def validate(self): if self.submit_email_radio.isChecked(): location = str(self.mailto_edit.text()) if not location: self.mailto_edit.setFocus() self.operation_blocked(gettext("Email address not entered.")) return False if re.match("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", location) is None: self.mailto_edit.setFocus() self.operation_blocked(gettext("Email address is not valid.")) return False else: location = str(self.savefile_edit.text()) if not location: self.savefile_edit.setFocus() self.operation_blocked(gettext("Filename not entered.")) return False submit_branch = str(self.submit_branch_combo.currentText()) if not submit_branch: self.submit_branch_combo.setFocus() self.operation_blocked(gettext("No submit branch entered.")) return False return True def do_start(self): args = [] submit_branch = str(self.submit_branch_combo.currentText()) public_branch = str(self.public_branch_combo.currentText()) if public_branch: args.append(public_branch) mylocation = url_for_display(self.branch.base) args.append("-f") args.append(mylocation) if self.submit_email_radio.isChecked(): location = str(self.mailto_edit.text()) args.append("--mail-to=%s" % location) else: location = str(self.savefile_edit.text()) args.append("-o") args.append(location) if self.remember_check.isChecked(): args.append("--remember") if not self.patch_check.isChecked(): args.append("--no-patch") if not self.bundle_check.isChecked(): args.append("--no-bundle") if str(self.message_edit.text()): args.append("--message=%s" % str(self.message_edit.text())) revision = str(self.revisions_edit.text()) if revision == '': args.append("--revision=-1") else: args.append("--revision=%s" % revision) self.process_widget.do_start(None, 'send', submit_branch, *args) def _saveSize(self, config): SubProcessDialog._saveSize(self, config) self._saveSplitterSizes(config, self.splitter) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/shelvewindow.py0000644000000000000000000001134614556556456014505 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2011 QBzr Developers # # 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 PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext, N_ from breezy.plugins.qbrz.lib.util import ( QBzrWindow, ToolBarThrobberWidget, get_apparent_author_name, get_set_encoding, runs_in_loading_queue, get_icon, get_monospace_font, StandardButton, get_tab_width_pixels, ) from breezy.plugins.qbrz.lib.uifactory import ui_current_widget from breezy.plugins.qbrz.lib.trace import reports_exception from breezy.plugins.qbrz.lib.logwidget import LogList from breezy import transform from breezy.workingtree import WorkingTree from breezy.revisiontree import RevisionTree from breezy.plugins.qbrz.lib.encoding_selector import EncodingMenuSelector from breezy.plugins.qbrz.lib.widgets.shelve import ShelveWidget from breezy.plugins.qbrz.lib.widgets.shelvelist import ShelveListWidget from breezy.plugins.qbrz.lib.widgets.splitters import Splitters from patiencediff import PatienceSequenceMatcher as SequenceMatcher from breezy.shelf import Unshelver from breezy.shelf_ui import Unshelver as Unshelver_ui class ShelveWindow(QBzrWindow): def __init__(self, initial_tab=0, directory=None, file_list=None, complete=False, ignore_whitespace=False, encoding=None, parent=None, ui_mode=True, select_all=False, message=None): QBzrWindow.__init__(self, [gettext("Shelve Manager")], parent, ui_mode=ui_mode) self.restoreSize("shelve", (780, 680)) vbox = QtWidgets.QVBoxLayout(self.centralwidget) vbox.setContentsMargins(2, 2, 2, 2) self.throbber = ToolBarThrobberWidget(self) vbox.addWidget(self.throbber) self.tab = QtWidgets.QTabWidget(self) vbox.addWidget(self.tab) self.splitters = Splitters("shelve") self.directory = directory or '.' shelve_view = ShelveWidget(file_list=file_list, directory=self.directory, complete=complete, encoding=encoding, splitters=self.splitters, parent=self, select_all=select_all, init_msg=message) shelvelist_view = ShelveListWidget(directory=self.directory, complete=complete, ignore_whitespace=ignore_whitespace, encoding=encoding, splitters=self.splitters, parent=self) self.tab.addTab(shelve_view, gettext('Shelve')) self.tab.addTab(shelvelist_view, gettext('View shelved changes')) self.tab.setCurrentIndex(initial_tab) self.tab.currentChanged[int].connect(self.current_tab_changed) shelve_view.shelfCreated[int].connect(self.shelf_created) shelvelist_view.unshelved[int, 'QString'].connect(self.unshelved) self.splitters.restore_state() def show(self): QBzrWindow.show(self) QtCore.QTimer.singleShot(0, self.initial_load) @runs_in_loading_queue @ui_current_widget @reports_exception() def initial_load(self): try: self.throbber.show() self.processEvents() view = self.tab.currentWidget() view.refresh() if hasattr(view, "files_str") and view.files_str: self.setWindowTitle(gettext("Shelve Manager") + " - %s" % view.files_str) finally: self.throbber.hide() def current_tab_changed(self, index): view = self.tab.currentWidget() if not view.loaded: view.refresh() if hasattr(view, "files_str") and view.files_str: self.setWindowTitle(gettext("Shelve Manager") + " - %s" % view.files_str) else: self.setWindowTitle(gettext("Shelve Manager")) def shelf_created(self, id): # Refresh shelf list after new shelf created. self.tab.widget(1).refresh() self.tab.setCurrentIndex(1) def unshelved(self, id, action): if action in ('apply', 'keep'): self.tab.widget(0).loaded = False def hideEvent(self, event): self.splitters.save_state() QBzrWindow.hideEvent(self, event) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/spellcheck.py0000644000000000000000000000363714556556456014110 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2008 Lukáš Lalinský # # 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 PyQt5 import QtGui # TODO Enchant supports OpenOffice dictionaries, make it easy to use them on Windows # TODO custom words # TODO integrate into the text editor's context menu class SpellCheckHighlighter(QtGui.QSyntaxHighlighter): def __init__(self, document, checker): QtGui.QSyntaxHighlighter.__init__(self, document) self.checker = checker self.format = QtGui.QTextCharFormat() self.format.setUnderlineColor(QtGui.QColor('red')) self.format.setUnderlineStyle(QtGui.QTextCharFormat.SpellCheckUnderline) def highlightBlock(self, text): for index, length in self.checker.check(str(text)): self.setFormat(index, length, self.format) class DummySpellChecker(object): def __init__(self, language): pass def check(self, text): return [] def suggest(self, text): return [] @classmethod def list_languages(cls): return [] try: from breezy.plugins.qbrz.lib.spellcheck_enchant import EnchantSpellChecker as SpellChecker except ImportError: SpellChecker = DummySpellChecker ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/spellcheck_enchant.py0000644000000000000000000000416614556556456015606 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2008 Lukáš Lalinský # # 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. import re import enchant from enchant.checker import SpellChecker from enchant.tokenize import EmailFilter, URLFilter, Filter, tokenize class camel_case_tokenize(tokenize): def __next__(self): offset = self.offset text = self._text[offset:] if not text: raise StopIteration() match = re.match(br'(\w+?)[A-Z]', text) if match is None: word = text else: word = match.group(1) self.offset += len(word) return word, offset class CamelCaseFilter(Filter): def _split(self, word): return camel_case_tokenize(word) class EnchantSpellChecker(object): def __init__(self, language): try: self.dict = enchant.Dict(language) self.checker = SpellChecker(language, filters=[EmailFilter, URLFilter, CamelCaseFilter]) except enchant.DictNotFoundError: self.checker = None def check(self, text): if self.checker is None: return self.checker.set_text(text) for err in self.checker: yield err.wordpos, len(err.word) def suggest(self, text): return self.dict.suggest(text) @classmethod def list_languages(cls): return list(set(lang.replace("_", "-") for lang in enchant.list_languages())) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/statuscache.py0000644000000000000000000001425014556556456014273 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2007 Lukáš Lalinský # # 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. import sys from breezy import ( errors, osutils, workingtree, ) from PyQt5 import QtCore class CacheEntry(object): __slots__ = ['status', 'children'] def __init__(self): self.status = 'unknown' self.children = {} def __repr__(self): return '(%s, %r)' % (self.status, self.children) class StatusCache(QtCore.QObject): def __init__(self, window): QtCore.QObject.__init__(self) self.fileSystemWatcher = QtCore.QFileSystemWatcher(self) self.fileSystemWatcher.directoryChanged['QString'].connect(self.invalidateDirectory) self.autoRefreshPath = None self.autoRefreshTimer = QtCore.QTimer(self) self.autoRefreshTimer.setSingleShot(True) self.autoRefreshTimer.timeout.connect(self.autoRefresh) self.window = window self.cache = CacheEntry() def _cacheStatus(self, path, status, root=None): if root is None: root = self.cache entry = root for part in path: if part not in entry.children: entry.children[part] = CacheEntry() entry = entry.children[part] entry.status = status return entry def _getCacheEntry(self, parts): entry = self.cache for part in parts: entry = entry.children[part] return entry def _cacheDirectoryStatus(self, path): p = '/'.join(path) if sys.platform != 'win32': p = '/' + p # print "caching", p try: # to stop bzr-svn from trying to give status on svn checkouts # if not QtCore.QDir(p).exists('.bzr'): # raise errors.NotBranchError(p) working_tree, relpath = workingtree.WorkingTree.open_containing(p) except errors.BzrError: self.fileSystemWatcher.addPath(p) return self._cacheStatus(path, 'non-versioned') self.fileSystemWatcher.addPath(working_tree.basedir) basis_tree = working_tree.basis_tree() root = self._cacheStatus(osutils.splitpath(working_tree.basedir), 'branch') # delta will be a TreeDelta: commit 7389 makes TreeDelta HOLD TreeChange objects in # list member variables called added, removed, renamed, copied, kind_changes, modified # unchanged, unversioned and missing delta = working_tree.changes_from(basis_tree, want_unchanged=True, want_unversioned=True) # ... and thus entry will be a TreeChange object, with the path in, # perhaps unsurprisingly, 'path' rather than entry[0]. Path is a tuple of # old and new path, so get whatever works for entry in delta.added: self._cacheStatus(osutils.splitpath(entry.path[0] or entry.path[1]), 'added', root=root) for entry in delta.removed: # BUGBUG - RJLRJL this FIXME might be why the test_tree_widget rename and # move_and_rename and its cousins are failing # FIXME self._cacheStatus(osutils.splitpath(entry.path[0] or entry.path[1]), 'modified', root=root) # self._cacheStatus(osutils.splitpath(entry[0]), 'removed', root=root) for entry in delta.modified: self._cacheStatus(osutils.splitpath(entry.path[0] or entry.path[1]), 'modified', root=root) for entry in delta.unchanged: self._cacheStatus(osutils.splitpath(entry.path[0] or entry.path[1]), 'unchanged', root=root) # self._cacheStatus(osutils.splitpath(entry[0]), 'unchanged', root=root) for entry in delta.unversioned: self._cacheStatus(osutils.splitpath(entry.path[0] or entry.path[1]), 'non-versioned', root=root) try: return self._getCacheEntry(path) except KeyError: self.fileSystemWatcher.addPath(p) return self._cacheStatus(path, 'non-versioned') def getFileStatus(self, path, name): try: parent_entry = self._getCacheEntry(path) except KeyError: parent_entry = None if parent_entry is None or parent_entry.status == 'unknown': parent_entry = self._cacheDirectoryStatus(path) try: entry = parent_entry.children[name] except KeyError: if parent_entry.status == 'non-versioned': return 'non-versioned' else: if sys.platform == 'win32': return 'non-versioned' print("NOW WHAT??") return entry.status def getDirectoryStatus(self, path, name): path = path + [name] try: entry = self._getCacheEntry(path) except KeyError: entry = self._cacheDirectoryStatus(path) else: if entry.status == 'unknown': entry = self._cacheDirectoryStatus(path) # print path, entry.status return entry.status def invalidateDirectory(self, path): path = str(path) try: parts = osutils.splitpath(path) entry = self.cache for part in parts[:-1]: entry = entry.children[part] print("Removing", path, "from the cache") del entry.children[parts[-1]] except KeyError: pass else: self.autoRefreshPath = path self.autoRefreshTimer.start(1000) def autoRefresh(self): self.window.autoRefresh(self.autoRefreshPath) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/subprocess.py0000644000000000000000000015041514556556456014160 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2006 Lukáš Lalinský # Copyright (C) 2008 Gary van der Merwe # Copyright (C) 2009 Alexander Belchenko # Copyright (C) 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 # 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. import os import sys import time from PyQt5 import QtCore, QtGui, QtWidgets from contextlib import contextmanager from breezy.plugins.qbrz.lib import MS_WINDOWS from breezy.plugins.qbrz.lib.i18n import gettext, N_ from breezy.plugins.qbrz.lib.util import ( BTN_CANCEL, BTN_CLOSE, BTN_OK, QBzrDialog, QBzrWindow, StandardButton, ensure_unicode, InfoWidget, ) from breezy.ui.text import TextProgressView, TextUIFactory import fastbencode as bencode import codecs import re import signal import tempfile if MS_WINDOWS: import thread from breezy import commands, errors, osutils, ui # Subprocess service messages markers SUB_PROGRESS = "qbrz:PROGRESS:" SUB_GETPASS = "qbrz:GETPASS:" SUB_GETUSER = "qbrz:GETUSER:" SUB_GETBOOL = "qbrz:GETBOOL:" SUB_CHOOSE = "qbrz:CHOOSE:" SUB_ERROR = "qbrz:ERROR:" SUB_NOTIFY = "qbrz:NOTIFY:" NOTIFY_CONFLICT = "conflict:" class WarningInfoWidget(InfoWidget): def __init__(self, parent): InfoWidget.__init__(self, parent) layout = QtWidgets.QVBoxLayout(self) label_layout = QtWidgets.QHBoxLayout() icon = QtWidgets.QLabel() icon.setPixmap(self.style().standardPixmap(QtWidgets.QStyle.SP_MessageBoxWarning)) label_layout.addWidget(icon) self.label = QtWidgets.QLabel() label_layout.addWidget(self.label, 2) layout.addLayout(label_layout) self.button_layout = QtWidgets.QHBoxLayout() self.button_layout.addStretch(1) layout.addLayout(self.button_layout) self.buttons = [] def add_button(self, text, on_click): button = QtWidgets.QPushButton(gettext(text)) button.clicked[bool].connect(on_click) self.button_layout.addWidget(button) self.buttons.append((button, on_click)) def remove_all_buttons(self): for button, on_click in self.buttons: button.clicked[bool].disconnect(on_click) self.button_layout.removeWidget(button) button.close() del(self.buttons[:]) def set_label(self, text): self.label.setText(gettext(text)) def setup_for_uncommitted(self, on_commit, on_revert, on_shelve): self.remove_all_buttons() self.set_label(N_('Working tree has uncommitted changes.')) self.add_button(N_('Commit'), on_commit) self.add_button(N_('Revert'), on_revert) self.add_button(N_('Shelve'), on_shelve) def setup_for_conflicted(self, on_conflict, on_revert): self.remove_all_buttons() self.set_label(N_('Working tree has conflicts.')) self.add_button(N_('Resolve'), on_conflict) self.add_button(N_('Revert'), on_revert) def setup_for_locked(self, on_retry): self.remove_all_buttons() self.set_label(N_('Could not acquire lock. Please retry later.')) self.add_button(N_('Retry'), on_retry) class SubProcessWindowBase: subprocessStarted = QtCore.pyqtSignal(bool) disableUi = QtCore.pyqtSignal(bool) subprocessFinished = QtCore.pyqtSignal(bool) subprocessFailed = QtCore.pyqtSignal(bool) subprocessError = QtCore.pyqtSignal(bool) def __init_internal__(self, title, name="genericsubprocess", args=None, dir=None, default_size=None, ui_mode=True, dialog=True, parent=None, hide_progress=False, immediate=False): self.restoreSize(name, default_size) self._name = name self._default_size = default_size self.args = args self.dir = dir self.ui_mode = ui_mode self.return_code = 1 if dialog: flags = (self.windowFlags() & ~QtCore.Qt.Window) | QtCore.Qt.Dialog self.setWindowFlags(flags) self.process_widget = SubProcessWidget(self.ui_mode, self, hide_progress) self.process_widget.finished.connect(self.on_finished) self.process_widget.failed['QString'].connect(self.on_failed) self.process_widget.error.connect(self.on_error) self.process_widget.conflicted['QString'].connect(self.on_conflicted) self.closeButton = StandardButton(BTN_CLOSE) self.okButton = StandardButton(BTN_OK) self.cancelButton = StandardButton(BTN_CANCEL) # ok button gets disabled when we start. self.subprocessStarted[bool].connect(self.okButton.setDisabled) # ok button gets hidden when we finish. self.subprocessFinished[bool].connect(self.okButton.setHidden) # close button gets shown when we finish. self.subprocessFinished[bool].connect(self.closeButton.setVisible) # cancel button gets disabled when finished. self.subprocessFinished[bool].connect(self.cancelButton.setDisabled) # ok button gets enabled when we fail. self.subprocessFailed[bool].connect(self.okButton.setDisabled) # Change the ok button to 'retry' if we fail. self.subprocessFailed[bool].connect(lambda failed: self.okButton.setText(gettext('&Retry'))) self.buttonbox = QtWidgets.QDialogButtonBox(self) self.buttonbox.addButton(self.okButton, QtWidgets.QDialogButtonBox.AcceptRole) self.buttonbox.addButton(self.closeButton, QtWidgets.QDialogButtonBox.AcceptRole) self.buttonbox.addButton(self.cancelButton, QtWidgets.QDialogButtonBox.RejectRole) self.buttonbox.accepted.connect(self.do_accept) self.buttonbox.rejected.connect(self.do_reject) self.closeButton.setHidden(True) # but 'close' starts as hidden. self.infowidget = WarningInfoWidget(self) self.infowidget.hide() self.subprocessStarted[bool].connect(self.infowidget.setHidden) if immediate: self.do_accept() def make_default_status_box(self): panel = QtWidgets.QWidget() vbox = QtWidgets.QVBoxLayout(panel) vbox.setContentsMargins(0, 0, 0, 0) vbox.addWidget(self.infowidget) status_group_box = QtWidgets.QGroupBox(gettext("Status")) status_layout = QtWidgets.QVBoxLayout(status_group_box) status_layout.setContentsMargins(0, 0, 0, 0) status_layout.addWidget(self.process_widget) vbox.addWidget(status_group_box) return panel def make_process_panel(self): panel = QtWidgets.QWidget() vbox = QtWidgets.QVBoxLayout(panel) vbox.setContentsMargins(0, 0, 0, 0) vbox.addWidget(self.infowidget) vbox.addWidget(self.process_widget) return panel def make_default_layout_widgets(self): """Yields widgets to add to main dialog layout: status and button boxes. Status box has progress bar and console area. Button box has 2 buttons: OK and Cancel (after successfull command execution there will be Close and Cancel). """ yield self.make_default_status_box() yield self.buttonbox def validate(self): """Override this method in your class and do any validation there. Return True if all parameters is OK and subprocess can be started. """ return True def _check_args(self): """Check that self.args is not None and return True. Otherwise show error dialog to the user and return False. """ if self.args is None: raise RuntimeError('Subprocess action "%s" cannot be started\n' 'because self.args is None.' % self._name) return True def do_accept(self): if self.process_widget.is_finished: self.close() else: try: if not self.validate(): return except: report_exception(type=SUB_LOAD_METHOD, window=self.window()) return self.subprocessStarted.emit(True) self.disableUi.emit(True) self.do_start() def do_start(self): if self._check_args(): self.process_widget.do_start(self.dir, *self.args) else: self.on_failed('CheckArgsFailed') def do_reject(self): if self.process_widget.is_running(): self.process_widget.abort() else: self.close() def on_finished(self): if hasattr(self, 'setResult'): self.setResult(QtWidgets.QDialog.Accepted) self.subprocessFinished.emit(True) self.disableUi.emit(False) self.return_code = 0 if not self.ui_mode and not self.infowidget.isVisible(): self.close() def on_conflicted(self, tree_path): if tree_path: self.action_url = str(tree_path) # QString -> unicode self.infowidget.setup_for_conflicted(self.open_conflicts_win, self.open_revert_win) self.infowidget.show() def on_failed(self, error): self.subprocessFailed.emit(False) self.disableUi.emit(False) if error == 'UncommittedChanges': self.action_url = self.process_widget.error_data['display_url'] self.infowidget.setup_for_uncommitted(self.open_commit_win, self.open_revert_win, self.open_shelve_win) self.infowidget.show() elif error == 'LockContention': self.infowidget.setup_for_locked(self.do_accept) self.infowidget.show() def on_error(self): self.subprocessError.emit(False) def setupUi(self, ui): ui.setupUi(self) 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 from breezy.plugins.qbrz.lib.commit import CommitWindow tree, branch = BzrDir.open_tree_or_branch(self.action_url) commit_window = CommitWindow(tree=tree, selected_list=None, parent=self) self.windows.append(commit_window) commit_window.show() def open_revert_win(self, b): from breezy.plugins.qbrz.lib.revert import RevertWindow # 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, parent=self) self.windows.append(revert_window) revert_window.show() def open_shelve_win(self, b): from breezy.plugins.qbrz.lib.shelvewindow import ShelveWindow shelve_window = ShelveWindow(directory=self.action_url, parent=self) self.windows.append(shelve_window) shelve_window.show() def open_conflicts_win(self, b): from breezy.plugins.qbrz.lib.conflicts import ConflictsWindow window = ConflictsWindow(self.action_url, parent=self) self.windows.append(window) window.show() window.allResolved[bool].connect(self.infowidget.setHidden) class SubProcessWindow(SubProcessWindowBase, QBzrWindow): def __init__(self, title, name="genericsubprocess", args=None, dir=None, default_size=None, ui_mode=True, dialog=True, parent=None, hide_progress=False): QBzrWindow.__init__(self, title, parent) self.__init_internal__(title, name=name, args=args, dir=dir, default_size=default_size, ui_mode=ui_mode, dialog=dialog, parent=parent, hide_progress=hide_progress) def closeEvent(self, event): if not self.process_widget.is_running(): QBzrWindow.closeEvent(self, event) else: self.process_widget.abort() event.ignore() class SubProcessDialog(SubProcessWindowBase, QBzrDialog): """An abstract base-class for all subprocess related dialogs. It is expected that sub-classes of this will create their own UI, and while doing so, will add the widgets returned by self.make_default_layout_widgets() """ def __init__(self, title=None, name="genericsubprocess", args=None, dir=None, default_size=None, ui_mode=True, dialog=True, parent=None, hide_progress=False, immediate=False): QBzrDialog.__init__(self, title, parent) self.__init_internal__(title, name=name, args=args, dir=dir, default_size=default_size, ui_mode=ui_mode, dialog=dialog, parent=parent, hide_progress=hide_progress, immediate=immediate) def closeEvent(self, event): if not self.process_widget.is_running(): QBzrDialog.closeEvent(self, event) else: self.process_widget.abort() event.ignore() class SimpleSubProcessDialog(SubProcessDialog): """A concrete helper class of SubProcessDialog, which has a single label widget for displaying a simple description before executing a subprocess. """ def __init__(self, title, desc, name="genericsubprocess", args=None, dir=None, default_size=None, ui_mode=True, dialog=True, hide_progress=False, auto_start_show_on_failed=False, parent=None, immediate=False ): super(SimpleSubProcessDialog, self).__init__( title, name=name, args=args, dir=dir, default_size=default_size, ui_mode=ui_mode, dialog=dialog, parent=parent, hide_progress=hide_progress, immediate=immediate) self.desc = desc # create a layout to hold our one label and the subprocess widgets. layout = QtWidgets.QVBoxLayout(self) groupbox = QtWidgets.QGroupBox(gettext('Description')) v = QtWidgets.QVBoxLayout(groupbox) label = QtWidgets.QLabel(self.desc) label.font().setBold(True) v.addWidget(label) layout.addWidget(groupbox) # and add the subprocess widgets. for w in self.make_default_layout_widgets(): layout.addWidget(w) self.auto_start_show_on_failed = auto_start_show_on_failed QtCore.QTimer.singleShot(1, self.auto_start) def auto_start(self): if self.auto_start_show_on_failed: self.subprocessFailed[bool].connect(self.setHidden) self.subprocessError[bool].connect(self.setHidden) self.do_start() class SubProcessWidget(QtWidgets.QWidget): # RJLRJL moved to class members to handle connects to Qt5 # 'a signal needs to be defined on class level' failed = QtCore.pyqtSignal('QString') conflicted = QtCore.pyqtSignal('QString') finished = QtCore.pyqtSignal(bool) error = QtCore.pyqtSignal(bool) def __init__(self, ui_mode, parent=None, hide_progress=False): QtWidgets.QGroupBox.__init__(self, parent) self.ui_mode = ui_mode layout = QtWidgets.QVBoxLayout(self) message_layout = QtWidgets.QHBoxLayout() self.progressMessage = QtWidgets.QLabel(self) # self.progressMessage.setWordWrap(True) -- this breaks minimal window size hint self.progressMessage.setText(gettext("Ready")) message_layout.addWidget(self.progressMessage, 1) self.transportActivity = QtWidgets.QLabel(self) message_layout.addWidget(self.transportActivity) layout.addLayout(message_layout) self.progressBar = QtWidgets.QProgressBar(self) self.progressBar.setMaximum(1000000) layout.addWidget(self.progressBar) self.console = QtWidgets.QTextBrowser(self) self.console.setFocusPolicy(QtCore.Qt.ClickFocus) layout.addWidget(self.console) self.encoding = osutils.get_user_encoding() self.stdout = None self.stderr = None self.process = QtCore.QProcess() self.process.readyReadStandardOutput.connect(self.readStdout) self.process.readyReadStandardError.connect(self.readStderr) self.process.error[QtCore.QProcess.ProcessError].connect(self.reportProcessError) self.process.finished[int, QtCore.QProcess.ExitStatus].connect(self.onFinished) self.defaultWorkingDir = self.process.workingDirectory() self.is_finished = False self.aborting = False self.messageFormat = QtGui.QTextCharFormat() self.errorFormat = QtGui.QTextCharFormat() self.errorFormat.setForeground(QtGui.QColor('red')) self.cmdlineFormat = QtGui.QTextCharFormat() self.cmdlineFormat.setForeground(QtGui.QColor('blue')) if hide_progress: self.hide_progress() self.force_passing_args_via_file = False self._args_file = None # temp file to pass arguments to qsubprocess self.error_class = '' self.error_data = {} self.is_conflicted = False def hide_progress(self): self.progressMessage.setHidden(True) self.progressBar.setHidden(True) def is_running(self): return self.process.state() == QtCore.QProcess.Running or self.process.state() == QtCore.QProcess.Starting def do_start(self, workdir, *args): """Launch one bzr command. @param workdir: working directory for command. Could be None to use self.defaultWorkingDir @param args: bzr command and its arguments @type args: all arguments should be unicode strings (or ascii-only). """ QtWidgets.QApplication.processEvents() # make sure ui has caught up self.start_multi(((workdir, args),)) def start_multi(self, commands): self.setProgress(0, [gettext("Starting...")], "") self.console.setFocus(QtCore.Qt.OtherFocusReason) self.commands = list(commands) self._start_next() def _start_next(self): """Start first command from self.commands queue.""" self._setup_stdout_stderr() self._delete_args_file() directory, args = self.commands.pop(0) # Log the command we about to execute # Interestingly, this puts quotes around any strings in r # but this is not done in the body of the kirk, for some reason def format_args_for_log(args): # r = ['bzr'] r = ['brz'] for a in args: a = str(a).translate({ ord('\n'): '\\n', ord('\r'): '\\r', ord('\t'): '\\t', }) if " " in a: r.append('"%s"' % a) else: r.append(a) s = ' '.join(r) if len(s) > 128: # XXX make it configurable? s = s[:128] + '...' return s self.logMessageEx("Run command: " + format_args_for_log(args), "cmdline", self.stderr) # RJLRJL: these are encoded, just to be decoded again in run_subprocess_command args = bittorrent_b_encode_unicode(args) # win32 has command-line length limit about 32K, but it seems # problems with command-line buffer limit occurs not only on windows. # see bug https://bugs.launchpad.net/qbrz/+bug/396165 # on Linux I believe command-line is in utf-8, # so we need to have some extra space # when converting unicode -> utf8 # XXX make the threshold configurable in qbrz.conf? # # RJL: at this point, args is now a byte string (bencoded) if (len(args) > 10000 or re.search(rb"(?:" rb"\n|\r" # workaround for bug #517420 multi-line comments rb"|\\\\" # workaround for bug #528944 eating backslashes rb")", args) is not None or self.force_passing_args_via_file # workaround for bug #936587 quoted regular expressions ): # save the args to the file fname = self._create_args_file(args) # This: # # args = "@" + fname.replace('\\', '/') # # was bad and caused a bug: args was now no longer a bencoded string... but # the code below would pass it to qsubprocess telling the lie that it was. Tsk. # In Python 2 this sort-of worked: more correctly, nobody noticed the bad behaviour # (bug) for 10 or 12 years. # # Instead, we'll pass a properly constructed, bencoded string # args = "@" + fname.replace('\\', '/') args = bencode.bencode(bytes(args, 'utf-8')) if directory is None: directory = self.defaultWorkingDir self.error_class = '' self.error_data = {} self.process.setWorkingDirectory(directory) if getattr(sys, "frozen", None) is not None: brz_exe = sys.executable if os.path.basename(brz_exe) != "brz.exe": # Was run from bzrw.exe or tbzrcommand. brz_exe = os.path.join(os.path.dirname(sys.executable), "brz.exe") if not os.path.isfile(brz_exe): self.reportProcessError(None, gettext('Could not locate "brz.exe".')) self.process.start(brz_exe, ['qsubprocess', '--bencode', args]) else: # otherwise running as python script. # ensure run from bzr, and not others, e.g. tbzrcommand.py script = sys.argv[0] # make absolute, because we may be running in a different # dir. script = os.path.abspath(script) # allow for bzr or brz with optional extension (such as bzr.py) if os.path.splitext(os.path.basename(script))[0] not in ("brz", "bzr"): import breezy # are we running directly from a bzr directory? script = os.path.join(breezy.__path__[0], "..", "brz") if not os.path.isfile(script): # maybe from an installed bzr? script = os.path.join(sys.prefix, "scripts", "brz") if not os.path.isfile(script): self.reportProcessError(None, gettext('Could not locate "brz" script.')) self.process.start(sys.executable, [script, 'qsubprocess', '--bencode', str(args, 'utf-8')]) def _setup_stdout_stderr(self): if self.stdout is None: writer = codecs.getwriter(osutils.get_terminal_encoding()) self.stdout = writer(sys.stdout.buffer, errors='replace') self.stderr = writer(sys.stderr.buffer, errors='replace') def abort(self): if self.is_running(): self.abort_futher_processes() if not self.aborting: self.aborting = True if MS_WINDOWS: # trying to send signal to our subprocess signal_event(get_child_pid(self.process.pid())) else: # be nice and try to use ^C os.kill(self.process.pid(), signal.SIGINT) self.setProgress(None, [gettext("Aborting...")]) else: self.process.terminate() def abort_futher_processes(self): self.commands = [] def setProgress(self, progress, messages, transport_activity=None): if progress is not None: self.progressBar.setValue(progress) if progress == 1000000 and not messages: text = gettext("Finished!") else: text = " / ".join(messages) self.progressMessage.setText(text) if transport_activity is not None: self.transportActivity.setText(transport_activity) def readStdout(self): # TODO: This will almost certainly fail - see TestSubprocessProgressView in test_subprocess # ensure we read from subprocess plain string. # # ``run_subprocess_command`` seems to end up here # # ``readAllStandardOutput`` is a PyQt4 routine. The docs state that it returns a QByteArray: # testing shows that it does and that its ``.data()`` method returns bytes # data = self.process.readAllStandardOutput().data().decode(self.encoding) for line in data.splitlines(): # Note that bdecode needs bytes so we encode() once we've snipped off the leading SUB_PROGRESS or whatever if line.startswith(SUB_PROGRESS): try: progress, transport_activity, task_info = bencode.bdecode(line[len(SUB_PROGRESS):].encode(self.encoding)) messages = [b.decode("utf-8") for b in task_info] except ValueError as e: # we got malformed data from qsubprocess (bencode failed to decode) # so just show it in the status console self.logMessageEx("qsubprocess error: " + str(e), "error", self.stderr) self.logMessageEx(line, "error", self.stderr) else: self.setProgress(progress, messages, transport_activity.decode("utf-8")) elif line.startswith(SUB_GETPASS): prompt = bittorrent_b_decode_prompt(line[len(SUB_GETPASS):].encode(self.encoding)) passwd, ok = QtWidgets.QInputDialog.getText(self, gettext("Enter Password"), prompt, QtWidgets.QLineEdit.Password) data = str(passwd).encode('utf-8'), int(ok) self.process.write(SUB_GETPASS + bencode.bencode(data) + "\n") if not ok: self.abort_futher_processes() elif line.startswith(SUB_GETUSER): prompt = bittorrent_b_decode_prompt(line[len(SUB_GETUSER):].encode(self.encoding)) passwd, ok = QtWidgets.QInputDialog.getText(self, gettext("Enter Username"), prompt) data = str(passwd).encode('utf-8'), int(ok) self.process.write(SUB_GETUSER + bencode.bencode(data) + "\n") if not ok: self.abort_futher_processes() elif line.startswith(SUB_GETBOOL): prompt = bittorrent_b_decode_prompt(line[len(SUB_GETBOOL):].encode(self.encoding)) button = QtWidgets.QMessageBox.question(self, "Bazaar", prompt, QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) data = (button == QtWidgets.QMessageBox.Yes) self.process.write(SUB_GETBOOL + bencode.bencode(data) + "\n") elif line.startswith(SUB_CHOOSE): msg, choices, default = bittorrent_b_decode_choose_args(line[len(SUB_CHOOSE):].encode(self.encoding)) mbox = QtWidgets.QMessageBox(parent=self) mbox.setText(msg) mbox.setIcon(QtWidgets.QMessageBox.Question) choices = choices.split('\n') index = 0 for c in choices: button = mbox.addButton(c, QtWidgets.QMessageBox.AcceptRole) if index == default: mbox.setDefaultButton(button) index += 1 index = mbox.exec_() self.process.write(SUB_CHOOSE + bencode.bencode(index) + "\n") elif line.startswith(SUB_ERROR): self.error_class, self.error_data = bittorrent_b_decode_exception_instance(line[len(SUB_ERROR):].encode(self.encoding)) elif line.startswith(SUB_NOTIFY): msg = line[len(SUB_NOTIFY):] if msg.startswith(NOTIFY_CONFLICT): self.is_conflicted = True self.conflict_tree_path = bittorrent_b_decode_prompt(msg[len(NOTIFY_CONFLICT):].encode(self.encoding)) else: self.logMessageEx(line, 'plain', self.stdout) def readStderr(self): data = bytes(self.process.readAllStandardError()).decode(self.encoding, 'replace') if data: self.error.emit(True) for line in data.splitlines(): # RJLRJL this should be brz, I think # error = line.startswith("bzr: ERROR:") error = line.startswith("brz: ERROR:") self.logMessage(line, error, self.stderr) def logMessage(self, message, error=False, terminal_stream=None): kind = 'plain' if error: kind = 'error' self.logMessageEx(message, kind, terminal_stream) def logMessageEx(self, message, kind="plain", terminal_stream=None): """Write message to console area. @param kind: kind of message used for selecting style of formatting. Possible kind values: * plain = usual message, written in default style; * error = error message, written in red; * cmdline = show actual command-line, written in blue. @param terminal_stream: if we working in non --ui-mode the message can be echoed to real terminal via specified terminal_stream (e.g. sys.stdout or sys.stderr) """ if kind == 'error': char_format = self.errorFormat elif kind == 'cmdline': char_format = self.cmdlineFormat else: char_format = self.messageFormat self.console.setCurrentCharFormat(char_format) self.console.append(message) scrollbar = self.console.verticalScrollBar() scrollbar.setValue(scrollbar.maximum()) if not self.ui_mode and terminal_stream: terminal_stream.write(message) terminal_stream.write('\n') def reportProcessError(self, error, message=None): self.aborting = False self.setProgress(1000000, [gettext("Failed!")]) if message is None: if error == QtCore.QProcess.FailedToStart: message = gettext("Failed to start brz.") else: message = gettext("Error while running brz. (error code: %d)" % error) self.logMessage(message, True) self.failed.emit(self.error_class) def onFinished(self, exitCode, exitStatus): self._delete_args_file() if self.aborting: self.aborting = False self.setProgress(1000000, [gettext("Aborted!")]) self.failed.emit('Aborted') elif exitCode < 3: if self.commands and not self.aborting: self._start_next() else: self.is_finished = True self.setProgress(1000000, [gettext("Finished!")]) if self.is_conflicted: self.conflicted.emit(self.conflict_tree_path) time.sleep(2) self.finished.emit(True) else: self.setProgress(1000000, [gettext("Failed!")]) self.failed.emit(self.error_class) def _create_args_file(self, text:bytes): """@param text: text to write into temp file, it should be unicode string """ if self._args_file: self._delete_args_file() # RJLRJL check QBzr vs QBrz # qdir = os.path.join(tempfile.gettempdir(), 'QBzr', 'qsubprocess') qdir = os.path.join(tempfile.gettempdir(), 'QBrz', 'qsubprocess') if not os.path.isdir(qdir): os.makedirs(qdir) fd, fname = tempfile.mkstemp(dir=qdir) with os.fdopen(fd, "wb") as f: # f.write(text.decode('utf8')) f.write(text) self._args_file = fname return fname def _delete_args_file(self): if self._args_file: try: os.unlink(self._args_file) except (IOError, OSError): pass else: self._args_file = None class SubprocessProgressView (TextProgressView): def __init__(self, term_file): TextProgressView.__init__(self, term_file) # The TextProgressView does not show the transport activity untill # there was a progress update. This changed because showing the # transport activity before a progress update would cause artifacts to # remain on the screen. We don't have to worry about that self._have_output = True def _repaint(self): if self._last_task: # Since bzr 2.2 _format_task returns a 2-tuple of unicode text, counter = self._format_task(self._last_task) task_info = (text.encode("utf-8"), counter.encode("utf-8")) progress_frac = self._last_task._overall_completion_fraction() if progress_frac is not None: progress = int(progress_frac * 1000000) else: progress = 1 else: task_info = () progress = 0 trans = self._last_transport_msg.encode("utf-8") bdata = bencode.bencode((progress, trans, task_info)) self._term_file.write(SUB_PROGRESS + bdata.decode("utf-8") + '\n') self._term_file.flush() def clear(self): pass class SubprocessUIFactory(TextUIFactory): def make_progress_view(self): return SubprocessProgressView(self.stdout) # This is to be compatabile with bzr less rev 4558 _make_progress_view = make_progress_view def clear_term(self): """ # Prepare the terminal for output. # This will, for example, clear text progress bars, and leave the # cursor at the leftmost position. """ pass def _get_answer_from_main(self, name, arg): self.stdout.write(name + bittorrent_b_encode_prompt(arg) + '\n') self.stdout.flush() line = self.stdin.readline() if line.startswith(name): return bencode.bdecode(line[len(name):].rstrip('\r\n')) raise Exception("Did not receive a answer from the main process.") def _choose_from_main(self, msg, choices, default): name = SUB_CHOOSE self.stdout.write(name + bittorrent_b_encode_choose_args(msg, choices, default) + '\n') self.stdout.flush() line = self.stdin.readline() if line.startswith(name): return bencode.bdecode(line[len(name):].rstrip('\r\n')) raise Exception("Did not receive a answer from the main process.") def get_password(self, prompt='', **kwargs): prompt = prompt % kwargs passwd, accepted = self._get_answer_from_main(SUB_GETPASS, prompt) if accepted: return passwd else: raise KeyboardInterrupt() def get_username(self, prompt='', **kwargs): prompt = prompt % kwargs username, accepted = self._get_answer_from_main(SUB_GETUSER, prompt) if accepted: return username else: raise KeyboardInterrupt() def get_boolean(self, prompt): return self._get_answer_from_main(SUB_GETBOOL, prompt+'?') def choose(self, msg, choices, default=None): if default is None: default = -1 index = self._choose_from_main(msg, choices, default) return index # [bialix 2010/02/04] body of cmd_qsubprocess has moved from commands.py # to see annotation of cmd_qsubprocess before move use: # # bzr qannotate commands.py -r1117 @contextmanager def watch_conflicts(on_conflicted): """ Call on_conflicted when conflicts generated in the context. :on_conflicted: callable with 1 argument(abspath of wt). """ from uuid import uuid1 hook_name = uuid1().hex def post_merge(m): if len(m.cooked_conflicts) > 0: try: abspath = m.this_tree.abspath('') except AttributeError: abspath = "" on_conflicted(abspath) try: from breezy.merge import Merger Merger.hooks.install_named_hook('post_merge', post_merge, hook_name) yield finally: Merger.hooks.uninstall_named_hook('post_merge', hook_name) def run_subprocess_command(cmd, bencoded=False): """The actual body of qsubprocess. Running specified bzr command in the subprocess. @param cmd: string with command line to run. @param bencoded: either cmd_str is bencoded list or not. (RJL: No, I don't know if the above means that it's always a list that's either bencoded or a list that's not, or it's either a bencoded-list or something else bencoded, or something else not bencoded.) NOTE: if cmd starts with @ sign then it used as name of the file where actual command line string is saved (utf-8 encoded)...BUT see below. RJLRJL: Because of the joy of python2 -> python3, but more because there is/was no class for bencoded, we have to fool about with bytes and strings - what larks!. So, one day, we'll make bencoded a class. Strictly, bencoded (python3) *should* be bytes, but you never can tell. Particularly in this code. And don't get me started on rev_ids. Also, the 'starts with @' means it's **NOT BENCODED** (sometimes). How can you tell? Try passing cmd to bdecode: you'll probably get an error about 'identifier 64'. You *can* strip off the leading '@' but what's left behind might or might not be bencoded. I've fixed some of the passing code so that it actually passes bencoded('@'+filename) not '@'+filename, but don't know if I've found it all. Breezy's ``run_bzr`` says we should pass 'valid' strings so we need to get rid of any lurking bytes. Unfortunately, we can no longer trust the bencoded flag as passed. Also, run_bzr is lying: if you read the code it actually calls ``_specified_or_unicode_argv()`` which will: raise errors.BzrError("argv should be list of unicode strings.") so it *actually wants a list of strings*. """ if MS_WINDOWS: thread.start_new_thread(windows_emulate_ctrl_c, ()) else: signal.signal(signal.SIGINT, sigabrt_handler) ui.ui_factory = SubprocessUIFactory(stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr) if not isinstance(cmd, str) and not isinstance(cmd, bytes): raise TypeError('Only string or bytes accepted ({0}, {1})'.format(cmd, type(cmd))) # Right, here we go, we could be a string or bytes # and bencoded might be actually true (it's bytes) or just # pretending (it's not bytes but is bencoded). Also, the cmd might # result in a list once decoded, even though this is not supposed to # be called with one... or perhaps it is (it seems to vary) # Eventually, we need a list in argv to pass to breezy's run_bzr argv = [] if bencoded: # if we are bytes AND bencoded (perhaps), decode properly if isinstance(cmd, bytes): s_cmd = bencode.bdecode(cmd) elif isinstance(cmd, str): # Force to bytes to decode it properly from bencoded format # SOMETIMES it's NOT really bencoded, even when it says it is # in which case we will probably get a ValueError b = bytes(cmd, 'utf-8') s_cmd = bencode.bdecode(b) else: if isinstance(cmd, bytes): s_cmd = cmd.decode('utf-8') else: s_cmd = cmd # Sometimes we get a list, decode each line: note that each LINE might be bencoded too if isinstance(s_cmd, list): for i, s in enumerate(s_cmd): if isinstance(s, bytes): argv.append(s.decode('utf-8')) else: # just put the string into it argv.append(s_cmd) # Now we are looking for '@' at the start if s_cmd[0][0] == '@': fname = s_cmd[1:] # Changed this: it's written in 'b' so must be read that way too with open(fname, 'rb') as f: s_cmd = f.read() # We stored a bencoded string like b'l6:ignore18:qbrz-setup-iss.loge', so...: s_cmd = bencode.bdecode(s_cmd) # ...and again, sometimes we get a list like [b'ignore', b'qbrz-setup-iss.log'], so... argv = [] if isinstance(s_cmd, list): for i, s in enumerate(s_cmd): if isinstance(s, bytes): argv.append(s.decode('utf-8')) else: # just put the string into it argv.append(s_cmd) try: def on_conflicted(wtpath): # See comment re: frankenstrings below for why we cast to string # Yes, that *is* a def... in a try..except block. print("%s%s%s" % (SUB_NOTIFY, NOTIFY_CONFLICT, str(bittorrent_b_encode_prompt(wtpath), 'utf-8'))) with watch_conflicts(on_conflicted): # _specified_or_unicode_argv should raise a BzrError here # if we pass a string return commands.run_bzr(argv) except (KeyboardInterrupt, SystemExit): raise except errors.BzrError as e: print("%s%s" % (SUB_ERROR, str(bittorrent_b_encode_exception_instance(e), 'utf-8'))) raise except Exception as e: # The problem with the original code is that it sends a Frankenstring, for example: # # qbrz:ERROR:b'l18:AlreadyBranchErrordee' # # which is a str, but with a byte-marked string (b'...') inside it, so # force it to be properly bytes OR force the bittorrent to string and let # the receiver sort it out: strictly speaking, it's not really b-encoded # if it has a prefix so make it a string print("%s%s" % (SUB_ERROR, str(bittorrent_b_encode_exception_instance(e), 'utf-8'))) raise def sigabrt_handler(signum, frame): raise KeyboardInterrupt() if MS_WINDOWS: import ctypes if getattr(sys, "frozen", None): # this is needed for custom brz.exe builds (without TortoiseBzr inside) ctypes.__path__.append(os.path.normpath(os.path.join(os.path.dirname(__file__), '..', '_lib', 'ctypes'))) from ctypes import cast, POINTER, Structure from ctypes.wintypes import DWORD, HANDLE class PROCESS_INFORMATION(Structure): _fields_ = [("hProcess", HANDLE), ("hThread", HANDLE), ("dwProcessID", DWORD), ("dwThreadID", DWORD)] LPPROCESS_INFORMATION = POINTER(PROCESS_INFORMATION) def get_child_pid(voidptr): lp = cast(int(voidptr), LPPROCESS_INFORMATION) return lp.contents.dwProcessID def get_event_name(child_pid): return 'qbrz-qsubprocess-%d' % child_pid def signal_event(child_pid): import win32event ev = win32event.CreateEvent(None, 0, 0, get_event_name(child_pid)) try: win32event.SetEvent(ev) finally: ev.Close() def windows_emulate_ctrl_c(): """To emulate Ctrl+C on Windows we have to wait some global event, and once it will trigger we will try to interrupt main thread. IMPORTANT: This function should be invoked as separate thread! """ import win32event ev = win32event.CreateEvent(None, 0, 0, get_event_name(os.getpid())) try: win32event.WaitForSingleObject(ev, win32event.INFINITE) finally: ev.Close() thread.interrupt_main() # === Bncode / Bdecode (B-Encode) # Bencode (pronounced _B-Encode_, not _Ben Code_) is a serialization encoding format used in torrent files for # the BitTorrent protocol. It consists of a series of strings, integers, lists, and dictionaries; since # lists and dictionaries contain multiple elements of the Bencode types, they can be nested hierarchically, # encapsulating complex data structures. # # # # The elements are:- # # * Strings: coded as a decimal number giving the length of the string, then a colon, # then the string itself; e.g., ``5:stuff``. The empty string is ``0:`` # # * Integers: coded as the letter ``i``, then the integer # as a series of decimal digits), then the letter ``e``. E.g., ``i42e`` is 42. # Leading zeroes (e.g. ``i-04e``) are invalid, except for zero itself: ``i0e``. # # * Lists: coded as the letter ``l`` (lower-case L), then the list elements # (each encoded as one of the Bencode types, which can include other lists), then the # letter ``e``. E.g., # # ``li42e5:stuffi666ee`` # # which contains ``42``, ``stuff`` (strictly ``5:stuff``) and ``666`` # as its elements) # # * Dictionaries: pairs of keys and values, where the key is a string # and the value can be any Bencode type; surrounded by an opening letter ``d`` # and closing letter ``e``; keys must appear in alphabetic order; e.g., # # ``d4:testi42e3:zzz4:junke`` # # is a dictionary where key ``test`` has value ``42`` and key ``zzz`` has value ``junk``. def bittorrent_b_encode_unicode(args: list) -> bytes: """ Bencode list of unicode strings as list of utf-8 strings and converting resulting string to unicode. Bencode will only accept bytes """ if isinstance(args, str) or isinstance(args, bytes): raise TypeError('bittorrent_b_encode_unicode only accepts an iterable got ', type(args)) args_utf8 = bencode.bencode([a.encode('utf-8') for a in args]) return args_utf8 def bittorrent_b_encode_prompt(utf_string: str or bytes) -> bytes: # The brz.bencode returns bytes but can be passed # integer, list, bytes, and dictionaries # BUT only those (so NO strings, even in dictionaries) # The problem is that the original code called bencode like so: # # ``bencode.bencode(arg.encode('unicode-escape'))`` # # ...and you can only do encode() with bytes # What we *can* do is insist we only get strings sent to us if not isinstance(utf_string, str) and not isinstance(utf_string, bytes): raise TypeError('bittorrent_b_encode_prompt accepts only strings or bytes') return bencode.bencode(utf_string.encode('utf-8')) def bittorrent_b_decode_prompt(bencoded_bytes: bytes) -> str: # bdecode requires an already bittorrent-encoded bytes # (it'll give a TypeError for plain strings) # So we can insist that we have bytes if not isinstance(bencoded_bytes, bytes): raise TypeError('bittorrent_b_decode_prompt accepts only bytes') # However, it can return bytes, integer, list or dictionary, but here we assume # bytes... and we convert them to a string return bencode.bdecode(bencoded_bytes).decode('utf-8') def bittorrent_b_encode_choose_args(msg, choices, default): if default is None: default = -1 return bencode.bencode([msg.encode('utf-8'), choices.encode('utf-8'), default]) def bittorrent_b_decode_choose_args(s): msg, choices, default = bencode.bdecode(s) msg = msg.decode('utf-8') choices = choices.decode('utf-8') return msg, choices, default def bittorrent_b_encode_exception_instance(e: Exception) -> bytes: """ Serialise the main information about an exception instance with bencode For now, nearly all exceptions just give the exception name as a string, but a dictionary is also given that may contain unicode-escaped attributes. RJLRJL: actually, one has to pass bytes as both dictionary keys and values. For example: ``bencode.bencode((b'something', {b'somekey':b'fred'}))`` gives ``b'l9:somethingd7:somekey4:fredee'`` but if either is a plain string, bencode will choke. b-encoded keys and values are accepted too, so: ``bencode.bencode((b'something', {b'7:somekey':b'4:fred'}))`` ``bencode.bencode((b'something', {b'somekey':b'4:fred'}))`` ``bencode.bencode((b'something', {b'7:somekey':b'fred'}))`` would all work, as does, perhaps unsurprisingly: ``bencode.bencode((b'9:something', {b'7:somekey':b'4:fred'}))`` """ if not isinstance(e, Exception): raise TypeError('Passed {0} instead of exception'.format(type(e))) # GZ 2011-04-15: Could use breezy.trace._qualified_exception_name in 2.4 # Convert to bytes... ename = e.__class__.__name__.encode('utf-8') d = {} # For now be conservative and only serialise attributes that will get used # RJL: in 2020 nothing has yet been added! However, we'll keep the same code keys = [] if isinstance(e, errors.UncommittedChanges): # Keys need to be bytes: however, when we use getattr, we need to use # a string (not bytes). What larks! keys.append("display_url") for key in keys: # getattr and __repr__ can break in lots of ways, so catch everything # but exceptions that occur as interrupts, allowing for Python 2.4 try: # Fetch (presumably) a string val = getattr(e, key) # RJL: the following is to get the representation as a string # the problem is that bytes will get wrapped in ".." which is probably not # what is wanted. # ``if not isinstance(val, str): # val = repr(val) # val = val.decode("ascii", "replace")`` # # We only need to convert things other than bytes if not isinstance(val, bytes): if not isinstance(val, str): val = repr(val) # Now convert to bytes... val = val.encode('utf-8') except (KeyboardInterrupt, SystemExit): raise except KeyError: val = b'[Qbrz could not find the key [%s] to serialize this attribute]' % key except: val = b"[QBrz could not serialize this attribute]" # The key needs to be bytes too d[key.encode('utf-8')] = val return bencode.bencode((ename, d)) def bittorrent_b_decode_exception_instance(bencoded_bytes: bytes) -> (str, list): """ Deserialise information about an exception instance with bdecode Returns a string and a list of strings """ # We'll have something in b-encoded form, such as, for example: # # ``b'l15:PermissionErrordee'`` # # which is 'PermissionError' string and {} (an empty dictionary) # b-decode will return bytes so, from the above example, we'd get: # # ``[b'PermissionError', {}]`` if not isinstance(bencoded_bytes, bytes): raise TypeError('Bytes required for bittorrent_b_decode_exception_instance') ename, d = bencode.bdecode(bencoded_bytes) # # The returned list needs to have entries with strings, not bytes. # **However**, the orignal code didn't try to convert the keys. # Instead, we now create a new_d of the same type as d. # # Get the type via type(d) and then instantiate id via () - hence # new_d = type(d)() # new_d = type(d)() for k in d: # Convert the key and the value to a string from bytes # and put the results into new_d new_d[k.decode('utf-8')] = d[k].decode('utf-8') # And convert the exception name to a string too return ename.decode('utf-8'), new_d ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/switch.py0000644000000000000000000001435514556556456013273 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # # Contributors: # Javier Der Derian # # 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. import os from PyQt5 import QtCore, QtGui, QtWidgets from breezy import errors, osutils from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.subprocess import SubProcessDialog from breezy.plugins.qbrz.lib.util import ( url_for_display, QBzrDialog, runs_in_loading_queue, ThrobberWidget ) from breezy.plugins.qbrz.lib.uifactory import ui_current_widget from breezy.plugins.qbrz.lib.trace import ( reports_exception, SUB_LOAD_METHOD) class QBzrSwitchWindow(SubProcessDialog): def __init__(self, branch, controldir, location, ui_mode = None): super(QBzrSwitchWindow, self).__init__( gettext("Switch"), name = "switch", default_size = (400, 400), ui_mode = ui_mode, dialog = True, parent = None, hide_progress=False, ) self.branch = branch gbSwitch = QtWidgets.QGroupBox(gettext("Switch checkout"), self) switch_box = QtWidgets.QFormLayout(gbSwitch) branchbase = None boundloc = branch.get_bound_location() if boundloc is not None: label = gettext("Heavyweight checkout:") branchbase = branch.base else: if controldir.root_transport.base != branch.controldir.root_transport.base: label = gettext("Lightweight checkout:") boundloc = branch.controldir.root_transport.base branchbase = controldir.root_transport.base else: raise errors.BzrError("This branch is not checkout.") switch_box.addRow(label, QtWidgets.QLabel(url_for_display(branchbase))) switch_box.addRow(gettext("Checkout of branch:"), QtWidgets.QLabel(url_for_display(boundloc))) self.boundloc = url_for_display(boundloc) throb_hbox = QtWidgets.QHBoxLayout() self.throbber = ThrobberWidget(self) throb_hbox.addWidget(self.throbber) self.throbber.hide() switch_box.addRow(throb_hbox) switch_hbox = QtWidgets.QHBoxLayout() branch_label = QtWidgets.QLabel(gettext("Switch to branch:")) branch_combo = QtWidgets.QComboBox() branch_combo.setEditable(True) self.branch_combo = branch_combo if location is not None: branch_combo.addItem(osutils.abspath(location)) elif boundloc is not None: branch_combo.addItem(url_for_display(boundloc)) browse_button = QtWidgets.QPushButton(gettext("Browse")) browse_button.clicked[bool].connect(self.browse_clicked) switch_hbox.addWidget(branch_label) switch_hbox.addWidget(branch_combo) switch_hbox.addWidget(browse_button) switch_hbox.setStretchFactor(branch_label,0) switch_hbox.setStretchFactor(branch_combo,1) switch_hbox.setStretchFactor(browse_button,0) switch_box.addRow(switch_hbox) create_branch_box = QtWidgets.QCheckBox(gettext("Create Branch before switching")) create_branch_box.setChecked(False) switch_box.addRow(create_branch_box) self.create_branch_box = create_branch_box layout = QtWidgets.QVBoxLayout(self) layout.addWidget(gbSwitch) layout.addWidget(self.make_default_status_box()) layout.addWidget(self.buttonbox) self.branch_combo.setFocus() def show(self): QBzrDialog.show(self) QtCore.QTimer.singleShot(0, self.initial_load) def exec_(self): QtCore.QTimer.singleShot(0, self.initial_load) return QBzrDialog.exec_(self) def _load_branch_names(self): branch_combo = self.branch_combo repo = self.branch.controldir.find_repository() if repo is not None: if getattr(repo, "iter_branches", None): for br in repo.iter_branches(): self.processEvents() branch_combo.addItem(url_for_display(br.base)) @runs_in_loading_queue @ui_current_widget @reports_exception(type=SUB_LOAD_METHOD) def initial_load(self): self.throbber.show() self._load_branch_names() self.throbber.hide() def browse_clicked(self): if os.path.exists(self.boundloc): directory = self.boundloc else: directory = os.getcwd() fileName = QtWidgets.QFileDialog.getExistingDirectory(self, gettext("Select branch location"), directory, ) if fileName: self.branch_combo.insertItem(0,fileName) self.branch_combo.setCurrentIndex(0) def validate(self): location = str(self.branch_combo.currentText()) if not location: self.operation_blocked(gettext("Branch location not specified.")) return False return True def do_start(self): location = str(self.branch_combo.currentText()) if self.create_branch_box.isChecked(): self.process_widget.do_start(None, 'switch', '--create-branch', location) else: self.process_widget.do_start(None, 'switch', location) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/syntaxhighlighter.py0000644000000000000000000001542014556556456015531 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2009 Gary van der Merwe # # 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 PyQt5 import QtCore, QtGui, QtWidgets _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(): return try: lexer = get_lexer_for_filename(filename, stripnl=False) except ClassNotFound: return style = get_style_by_name("default") font = doc.defaultFont() base_format = QtGui.QTextCharFormat() base_format.setFont(font) token_formats = {} window = edit.window() if hasattr(window, "processEvents"): processEvents = window.processEvents else: processEvents = QtCore.QCoreApplication.processEvents def get_token_format(token): if token in token_formats: return token_formats[token] if token.parent: parent_format = get_token_format(token.parent) else: parent_format = base_format format = QtGui.QTextCharFormat(parent_format) font = format.font() if style.styles_token(token): tstyle = style.style_for_token(token) if tstyle['color']: format.setForeground (QtGui.QColor("#"+tstyle['color'])) if tstyle['bold']: font.setWeight(QtGui.QFont.Bold) if tstyle['italic']: font.setItalic (True) 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. token_formats[token] = format return format text = str(doc.toPlainText()) block_count = 0 block = doc.firstBlock() assert(isinstance(block, QtGui.QTextBlock)) block_pos = 0 block_len = block.length() block_formats = [] for token, ttext in lex(text, lexer): format_len = len(ttext) format = get_token_format(token) while format_len > 0: format_range = QtGui.QTextLayout.FormatRange() format_range.start = block_pos format_range.length = min(format_len, block_len) format_range.format = format block_formats.append(format_range) block_len -= format_range.length format_len -= format_range.length block_pos += format_range.length if block_len == 0: block.layout().setAdditionalFormats(block_formats) doc.markContentsDirty(block.position(), block.length()) block = block.next() block_pos = 0 block_len = block.length() block_formats = [] block_count += 1 if block_count % 100 == 0: processEvents() if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) python = QtWidgets.QPlainTextEdit() f = open('syntaxhighlighter.py', 'r') python.setPlainText(f.read()) f.close() python.setWindowTitle('python') python.show() highlight_document(python, 'syntaxhighlighter.py') 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 ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/sysinfo.py0000644000000000000000000000454114556556456013460 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2009 Canonical Ltd # # 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 breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.sysinfo_data import get_sys_info from breezy.plugins.qbrz.lib.ui_sysinfo import Ui_MainWindow from breezy.plugins.qbrz.lib.util import BTN_CLOSE, QBzrWindow # RJLRJL check these for bzr / brz issues class QBzrSysInfoWindow(QBzrWindow): def __init__(self, parent=None): QBzrWindow.__init__(self, [], parent) self.ui = Ui_MainWindow() self.ui.setupUi(self) self.set_title(gettext("System Information")) self.restoreSize("sysinfo", (400,256)) btns = self.create_button_box(BTN_CLOSE) self.ui.vboxlayout.addWidget(btns) self.display_sys_info(get_sys_info()) def display_sys_info(self, props): """Update the view. :param props: a dictionary mapping field names to values. """ # Bazaar Library section self.ui.bzr_version.setText(props.get("bzr-version", "?")) breezy_path = props.get("bzr-lib-path") try: breezy_head = breezy_path[0] except IndexError: breezy_head = "" self.ui.bzr_lib_path.setText(breezy_head) # Bazaar Configuration section self.ui.bzr_config_dir.setText(props.get("brz-config-dir", "?")) self.ui.bzr_log_file.setText(props.get("brz-log-file", "?")) # Python Interpreter section self.ui.python_version.setText(props.get("python-version", "?")) self.ui.python_file.setText(props.get("python-file", "?")) self.ui.python_lib_dir.setText(props.get("python-lib-dir", "?")) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/sysinfo_data.py0000644000000000000000000000722214556556456014450 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2009 Lukáš Lalinský # # 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. import os import sys import breezy from breezy import controldir, config, errors, osutils, trace, bedding def get_sys_info(): """Get the system information. :return: a dictionary mapping fields to values. Field names are: * bzr-version - version of Bazaar * bzr-lib-path - paths to breezy roots (a list) * bzr-source-tree - source tree holding Bazaar (None or a Tree object) * bzr-config-dir - configuration directory holding bazaar.conf, etc. * bzr-log-file - path to bzr.log file * python-file - path to Python interpreter * python-version - version of Python interpreter * python-lib-dir - path to Python standard library """ result = {"bzr-version": breezy.__version__, "bzr-lib-path": breezy.__path__} # Bazaar installation # is breezy itself in a branch? source_tree = None # _get_bzr_source_tree() if source_tree: result["bzr-source-tree"] = _source_tree_details() else: result["bzr-source-tree"] = None # Bazaar configuration # config_dir = os.path.normpath(config.config_dir()) # use native slashes config_dir = osutils.normpath(bedding.config_dir()) if not isinstance(config_dir, str): config_dir = config_dir.decode(osutils.get_user_encoding()) result["brz-config-dir"] = config_dir result["brz-log-file"] = trace._brz_log_filename # Python installation # (bzr.exe use python interpreter from pythonXY.dll # but sys.executable point to bzr.exe itself) if not hasattr(sys, 'frozen'): # check for bzr.exe # python executable py_file = sys.executable else: # pythonXY.dll basedir = os.path.dirname(sys.executable) python_dll = "python%d%d.dll" % sys.version_info[:2] py_file = os.path.join(basedir, python_dll) result["python-file"] = py_file result["python-version"] = breezy._format_version_tuple(sys.version_info) result["python-lib-dir"] = os.path.dirname(os.__file__) return result def _get_bzr_source_tree(): """Return the WorkingTree for bzr source, if any. If bzr is not being run from its working tree, returns None. """ try: control = controldir.ControlDir.open_containing(__file__)[0] return control.open_workingtree(recommend_upgrade=False) except (errors.NotBranchError, errors.UnknownFormatError, errors.NoWorkingTree): return None def _source_tree_details(src_tree): """Get details about a source tree. :return: dictionary with keys of path, revno, revision-id, branch-nick. """ result = {} src_revision_id = src_tree.last_revision() revno = src_tree.branch.revision_id_to_revno(src_revision_id) result["path"] = src_tree.basedir result["revno"] = revno result["revision-id"] = src_revision_id result["branch-nick"] = src_tree.branch.nick return result ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tag.py0000644000000000000000000002001314556556456012531 0ustar00 # -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2008 Lukáš Lalinský et al. # # 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 PyQt5 import QtCore, QtGui, QtWidgets from breezy.branch import Branch from breezy import ( errors, ) from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.subprocess import SubProcessDialog from breezy.plugins.qbrz.lib.ui_tag import Ui_TagForm from breezy.plugins.qbrz.lib.util import url_for_display class TagWindow(SubProcessDialog): # indices of actions in action combo box IX_CREATE = 0 IX_MOVE = 1 IX_DELETE = 2 def __init__(self, branch, action=None, tag_name=None, revision=None, parent=None, ui_mode=False): """Create tag edit window. @param action: default action (create, move, delete) """ super(TagWindow, self).__init__(name="tag", ui_mode=ui_mode, dialog=True, parent=parent) self.ui = Ui_TagForm() self.ui.setupUi(self) # keep this after self.ui.setupUi self.restoreSize("tag", (340, 220)) # and add the subprocess widgets. for w in self.make_default_layout_widgets(): self.layout().addWidget(w) self.process_widget.hide_progress() self.ui.cb_tag.setFocus() self.set_branch(branch) self.setup_initial_values(action, tag_name, revision) # setup signals self.ui.cb_action.currentIndexChanged[int].connect(self.on_action_changed) self.ui.cb_tag.currentIndexChanged[int].connect(self.on_tag_changed) self.ui.cb_tag.lineEdit().editingFinished.connect(self.on_tag_changed) self.ui.branch_browse.clicked.connect(self.on_browse) self.ui.branch_location.editingFinished.connect(self.on_editing_branch) def set_branch(self, branch): self.branch = branch self.tags = branch.tags.get_tag_dict() self.revno_map = None # update ui self.ui.branch_location.setText(url_for_display(branch.base)) self.ui.cb_tag.clear() self.ui.cb_tag.addItems(sorted(list(self.tags.keys()), key=str.lower)) self.ui.cb_tag.setEditText("") self.ui.cb_tag.setCurrentIndex(-1) def setup_initial_values(self, action=None, tag_name=None, revision=None): action_index = {'create': self.IX_CREATE, 'move': self.IX_MOVE, 'delete': self.IX_DELETE}.get(action) if action_index is not None: self.ui.cb_action.setCurrentIndex(action_index) self.on_action_changed(action_index) if tag_name: if tag_name not in self.tags: self.ui.cb_tag.setCurrentIndex(-1) self.ui.cb_tag.setEditText(tag_name) self.on_tag_changed() if revision and action_index != self.IX_DELETE: self.ui.rev_edit.setText(revision[0].user_spec) def on_action_changed(self, index): self.ui.cb_tag.setEditText("") self.ui.cb_tag.setCurrentIndex(-1) self.ui.rev_edit.setReadOnly(index == self.IX_DELETE) self.ui.rev_edit.setText('') def on_tag_changed(self, index=None): if self.ui.cb_action.currentIndex() == self.IX_DELETE: tag = str(self.ui.cb_tag.currentText()) revid = self.tags.get(tag) rev_str = '' tooltip = '' if revid: # get revno if self.revno_map is None: # XXX perhaps we need to run this operation in a thread, # because it might take a while for big history self.revno_map = self.branch.get_revision_id_to_revno_map() rt = self.revno_map.get(revid) if rt: rev_str = '.'.join(map(str, rt)) else: rev_str = 'revid:'+revid tooltip = rev_str self.ui.rev_edit.setText(rev_str) self.ui.rev_edit.setToolTip(tooltip) def validate(self): action = self.ui.cb_action.currentIndex() title = self.ui.cb_action.currentText() tag = str(self.ui.cb_tag.lineEdit().text()) has_tag = tag in self.tags rev = str(self.ui.rev_edit.text()) if not tag: self.operation_blocked(gettext('You should specify tag name')) return False if action == self.IX_CREATE and has_tag: if self.ask_confirmation(gettext( 'Tag "%s" already exists.\n' 'Do you want to move existing tag?' ) % tag): # move action = self.IX_MOVE title = self.ui.cb_action.itemText(action) else: # cancel return False if action == self.IX_MOVE and not has_tag: if self.ask_confirmation(gettext( 'Tag "%s" does not exists yet.\n' 'Do you want to create new tag?' ) % tag): # create action = self.IX_CREATE title = self.ui.cb_action.itemText(action) else: # cancel return False if action == self.IX_DELETE and not has_tag: self.operation_blocked(gettext('Tag "%s" does not exists') % tag) return False # create args to run subprocess args = ['tag'] args.append('--directory') args.append(str(self.ui.branch_location.text())) if action != self.IX_CREATE: args.append({self.IX_MOVE: '--force', self.IX_DELETE: '--delete' }[action]) if action != self.IX_DELETE: args.append('--revision') args.append(rev or '-1') args.append(tag) self.args = args # subprocess uses self.args to run command # go! return True def on_browse(self): # browse button clicked directory = QtWidgets.QFileDialog.getExistingDirectory(self, gettext('Select branch location'), self.ui.branch_location.text()) self._try_to_open_branch(directory) def on_editing_branch(self): self._try_to_open_branch(self.ui.branch_location.text()) def _try_to_open_branch(self, location): if location: location = str(location) try: branch = Branch.open_containing(location)[0] except errors.NotBranchError: QtWidgets.QMessageBox.critical(self, gettext('Error'), gettext('Not a branch:\n%s') % location, gettext('&Close')) return self.set_branch(branch) @staticmethod def action_from_options(force=None, delete=None): action = 'create' if force: action = 'move' if delete: action = 'delete' return action class CallBackTagWindow(TagWindow): def __init__(self, branch, closing_function, action=None, tag_name=None, revision=None, parent=None, ui_mode=False): super(CallBackTagWindow, self).__init__(branch, action=action, tag_name=tag_name, revision=revision, parent=parent, ui_mode=ui_mode) self.closing_function = closing_function def closeEvent(self, event): super(CallBackTagWindow, self).closeEvent(event); if self.closing_function: self.closing_function() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/0000755000000000000000000000000014556556456012552 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/texteditannotate.py0000644000000000000000000001121714556556456015350 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2009 Gary van der Merwe # # Some of this code was coppied from # http://john.nachtimwald.com/better-qplaintextedit-with-line-numbers/ # Copyright (C) 2009 John Schember # # 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 PyQt5 import QtCore, QtGui, QtWidgets class AnnotateBarBase(QtWidgets.QWidget): cursorPositionChanged = QtCore.pyqtSignal() def __init__(self, edit, parent): QtWidgets.QWidget.__init__(self, parent) self.edit = edit self.edit.updateRequest[QtCore.QRect, int].connect(self.updateContents) def paintEvent(self, event): current_line = self.edit.document().findBlock( self.edit.textCursor().position()).blockNumber() + 1 block = self.edit.firstVisibleBlock() line_count = block.blockNumber() painter = QtGui.QPainter(self) painter.fillRect(event.rect(), self.palette().window()) # Iterate over all visible text blocks in the document. while block.isValid(): line_count += 1 rect = self.edit.blockBoundingGeometry(block) rect = rect.translated(self.edit.contentOffset()) rect.setWidth(self.width()) # Check if the position of the block is out side of the visible # area. if not block.isVisible() or rect.top() >= event.rect().bottom(): break self.paint_line(painter, rect, line_count, line_count==current_line) block = block.next() painter.end() QtWidgets.QWidget.paintEvent(self, event) def paint_line(self, painter, rect, line_number, is_current): pass def updateContents(self, rect, scroll): if scroll: self.scroll(0, scroll) else: self.update(0, rect.y(), self.width(), rect.height()) def mousePressEvent(self, event): if event.button() == QtCore.Qt.LeftButton: cursor = self.edit.cursorForPosition(event.pos()) cursor.movePosition(QtGui.QTextCursor.StartOfBlock) cursor.movePosition(QtGui.QTextCursor.EndOfBlock, QtGui.QTextCursor.KeepAnchor) self.edit.setTextCursor(cursor) self.cursorPositionChanged.emit() def wheelEvent(self, event): self.edit.wheelEvent(event) class LineNumberBar(AnnotateBarBase): def __init__(self, edit, parent): super(LineNumberBar, self).__init__(edit, parent) self.adjustWidth(1) self.edit.blockCountChanged[int].connect(self.adjustWidth) def adjustWidth(self, count): width = self.fontMetrics().width(str(count)) text_margin = self.style().pixelMetric( QtWidgets.QStyle.PM_FocusFrameHMargin, None, self) + 1 width += text_margin * 2 if self.width() != width: self.setFixedWidth(width) def paint_line(self, painter, rect, line_number, is_current): text_margin = self.style().pixelMetric( QtWidgets.QStyle.PM_FocusFrameHMargin, None, self) + 1 painter.drawText(rect.adjusted(text_margin, 0, -text_margin, 0), QtCore.Qt.AlignRight, str(line_number)) class AnnotateEditerFrameBase(QtWidgets.QFrame): def __init__(self, parent = None): QtWidgets.QFrame.__init__(self,parent) self.setFrameStyle(QtWidgets.QFrame.StyledPanel | QtWidgets.QFrame.Sunken) self.hbox = QtWidgets.QHBoxLayout(self) self.hbox.setSpacing(0) self.hbox.setContentsMargins(0, 0, 0, 0) class LineNumberEditerFrame(AnnotateEditerFrameBase): def __init__(self, parent= None): super(LineNumberEditerFrame, self).__init__(parent) self.edit = QtWidgets.QPlainTextEdit(self) self.edit.setFrameStyle(QtWidgets.QFrame.NoFrame) self.number_bar = LineNumberBar(self.edit, self) self.hbox.addWidget(self.number_bar) self.hbox.addWidget(self.edit) def setFocus(self): self.edit.setFocus() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/trace.py0000644000000000000000000003511214556556456013062 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2009 Mark Hammond # Copyright (C) 2009 Gary van der Merwe # # 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. """Exception handeling and reporting. Please see docs/exception_reporting.txt for info on how to use this. """ import sys import os from io import StringIO import traceback from PyQt5 import QtCore, QtGui, QtWidgets import breezy from breezy import ( errors, osutils, plugin, ) from breezy.trace import ( mutter, note, print_exception as _breezy_print_exception, report_exception as _breezy_report_exception, ) from breezy.plugins.qbrz.lib.i18n import gettext import breezy.plugins.qbrz.lib.resources class StopException(Exception): """A exception that is ignored in our error reporting, which can be used to stop a process due to user action. (Similar to KeyInterupt) """ pass MAIN_LOAD_METHOD = 0 """The exception is beening reported from the main loading method. Causes the window to be closed. """ SUB_LOAD_METHOD = 1 """The exception is beening reported from the sub loading method. Does not cause the window to me closed. This is typicaly used when a user enters a branch location on one of our forms, and we try load that branch. """ ITEM_OR_EVENT_METHOD = 2 """The exception is beening reported from a method that is called per item. The user is allowed to ignore the error, or close the window. """ _file_bugs_url = "https://bugs.launchpad.net/qbrz/+filebug" def set_file_bugs_url(url): global _file_bugs_url _file_bugs_url = url closing_due_to_error = False def create_lockerror_dialog(type, window=None): msgbox = QtWidgets.QMessageBox(parent=window) msgbox.setIcon(QtWidgets.QMessageBox.Warning) msgbox.setText(gettext("Could not acquire lock. Please retry later.")) if type == MAIN_LOAD_METHOD: msgbox.addButton(QtWidgets.QMessageBox.Close) else: msgbox.addButton(QtWidgets.QMessageBox.Ok) return msgbox def report_exception(exc_info=None, type=MAIN_LOAD_METHOD, window=None, ui_mode=False): """Report an exception. The error is reported to the console or a message box, depending on the type. """ # We only want one error to show if the user chose Close global closing_due_to_error # 0.20 special: We check hasattr() first to work around # if closing_due_to_error or (hasattr(window, 'closing_due_to_error') and window.closing_due_to_error): return if exc_info is None: exc_info = sys.exc_info() exc_type, exc_object, exc_tb = exc_info # Don't show error for StopException if isinstance(exc_object, StopException): # Do we maybe want to log this? return # RJLRJL check for bzr / brz issues msg_box = ((type == MAIN_LOAD_METHOD and (window and window.ui_mode or ui_mode)) or not type == MAIN_LOAD_METHOD) pdb = os.environ.get('BZR_PDB') if pdb: msg_box = False if msg_box: err_file = StringIO() else: err_file = sys.stderr # always tell bzr to report it, so it ends up in the log. # See https://bugs.launchpad.net/bzr/+bug/785695 error_type = _breezy_report_exception(exc_info, err_file) backtrace = traceback.format_exception(*exc_info) mutter(''.join(backtrace)) if (type == MAIN_LOAD_METHOD and window): window.ret_code = error_type # XXX This is very similar to breezy.commands.exception_to_return_code. # We shoud get bzr to refactor so that that this is reuseable. if pdb: # With out this - pyQt shows lot of warnings. see: # http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html#using-pyqt-from-the-python-shell QtCore.pyqtRemoveInputHook() print('**** entering debugger') tb = exc_info[2] import pdb if sys.version_info[:2] < (2, 6): # XXX: we want to do # pdb.post_mortem(tb) # but because pdb.post_mortem gives bad results for tracebacks # from inside generators, we do it manually. # (http://bugs.python.org/issue4150, fixed in Python 2.6) # Setup pdb on the traceback p = pdb.Pdb() p.reset() p.setup(tb.tb_frame, tb) # Point the debugger at the deepest frame of the stack p.curindex = len(p.stack) - 1 p.curframe = p.stack[p.curindex][0] # Start the pdb prompt. p.print_stack_entry(p.stack[p.curindex]) p.execRcLines() p.cmdloop() else: pdb.post_mortem(tb) close = True if msg_box: if isinstance(exc_object, errors.LockContention): msg_box = create_lockerror_dialog(error_type, window) elif error_type == errors.EXIT_INTERNAL_ERROR: # this is a copy of breezy.trace.report_bug # but we seperate the message, and the trace back, # and addes a hyper link to the filebug page. traceback_file = StringIO() _breezy_print_exception(exc_info, traceback_file) traceback_file.write('\n') traceback_file.write('brz %s on python %s (%s)\n' % (breezy.__version__, breezy._format_version_tuple(sys.version_info), sys.platform)) traceback_file.write('arguments: %r\n' % sys.argv) traceback_file.write( 'encoding: %r, fsenc: %r, lang: %r\n' % ( osutils.get_user_encoding(), sys.getfilesystemencoding(), os.environ.get('LANG'))) traceback_file.write("plugins:\n") for name, a_plugin in sorted(plugin.plugins().items()): traceback_file.write(" %-20s %s [%s]\n" % (name, a_plugin.path(), a_plugin.__version__)) msg_box = ErrorReport(gettext("Error"), True, traceback_file.getvalue(), exc_info, type, window) else: msg_box = ErrorReport(gettext("Error"), False, err_file.getvalue(), exc_info, type, window) # RJLRJL check for bzr / brz issues if window is None: icon = QtGui.QIcon() icon.addFile(":/bzr-16.png", QtCore.QSize(16, 16)) icon.addFile(":/bzr-32.png", QtCore.QSize(32, 32)) icon.addFile(":/bzr-48.png", QtCore.QSize(48, 48)) msg_box.setWindowIcon(icon) msg_box.exec_() if not msg_box.result() == QtWidgets.QMessageBox.Close: close = False if close: if window is None: closing_due_to_error = True QtCore.QCoreApplication.instance().quit() else: window.closing_due_to_error = True window.close() return error_type class ErrorReport(QtWidgets.QDialog): """A dialogue box for displaying and optionally reporting crashes in bzr/qbrz/bzr explorer.""" def __init__(self, title, message_internal, trace_back, exc_info, type=MAIN_LOAD_METHOD, parent=None): QtWidgets.QDialog.__init__ (self, parent) self.buttonbox = QtWidgets.QDialogButtonBox() if parent: win_title = None if hasattr(parent, 'title'): if isinstance(parent.title, str): win_title = parent.title elif isinstance(title, (list, tuple)): # just the first item is more usefull. win_title = parent.title[0] else: if hasattr(parent, 'windowTitle'): win_title = parent.windowTitle() if win_title: close_label = gettext("Close %s Window") % win_title else: close_label = gettext("Close Window") else: close_label = gettext("Close Application") # PyQt is stupid and thinks QMessageBox.StandardButton and # QDialogButtonBox.StandardButton are different, so we have to # duplicate this :-( if type == MAIN_LOAD_METHOD: button = self.buttonbox.addButton(QtWidgets.QDialogButtonBox.Close) button.setText(close_label) elif type == SUB_LOAD_METHOD: button = self.buttonbox.addButton(QtWidgets.QDialogButtonBox.Ok) button.setText(gettext("Close Error Dialog")) elif type == ITEM_OR_EVENT_METHOD: button = self.buttonbox.addButton(QtWidgets.QDialogButtonBox.Close) button.setText(close_label) button = self.buttonbox.addButton(QtWidgets.QDialogButtonBox.Ignore) button.setText(gettext("Ignore Error")) def report_bug(): from breezy import crash #Using private method because breezy.crash is not currently intended for reuse from GUIs #see https://bugs.launchpad.net/bzr/+bug/785696 crash_filename = crash._write_apport_report_to_file(exc_info) try: import apport except ImportError as e: mutter("No Apport available to Bazaar") if message_internal: message = ('Bazaar has encountered an internal error. Please ' 'report a bug at %s including this ' 'traceback, and a description of what you were doing ' 'when the error occurred.' % (_file_bugs_url, _file_bugs_url)) else: message = ('Bazaar has encountered an environmental error. Please ' 'report a bug if this is not the result of a local problem ' 'at %s including this ' 'traceback, and a description of what you were doing ' 'when the error occurred.' % (_file_bugs_url, _file_bugs_url)) else: report_bug_button = self.buttonbox.addButton(gettext("Report Bazaar Error"), QtWidgets.QDialogButtonBox.ActionRole) report_bug_button.clicked.connect(report_bug) if message_internal: message = ("Bazaar has encountered an internal error. Please report a" " bug.") else: message = ("Bazaar has encountered an environmental error. Please report a" " bug if this is not the result of a local problem.") message = "%s" % (message) label = QtWidgets.QLabel(message) label.setWordWrap(True) label.setAlignment(QtCore.Qt.AlignVCenter|QtCore.Qt.AlignLeft) label.linkActivated['QString'].connect(self.link_clicked) icon_label = QtWidgets.QLabel() icon_label.setPixmap(self.style().standardPixmap( QtWidgets.QStyle.SP_MessageBoxCritical)) self.show_trace_back_button = QtWidgets.QPushButton(gettext("Show Error Details >>>")) self.show_trace_back_button.clicked.connect(self.show_trace_back) self.trace_back_label = QtWidgets.QTextEdit() self.trace_back_label.setPlainText (trace_back) self.trace_back_label.setReadOnly(True) self.trace_back_label.hide() self.buttonbox.clicked [QtWidgets.QAbstractButton].connect(self.clicked) vbox = QtWidgets.QVBoxLayout() hbox = QtWidgets.QHBoxLayout() hbox.addWidget(icon_label) hbox.addWidget(label, 10) vbox.addLayout(hbox) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(self.show_trace_back_button) hbox.addStretch() vbox.addLayout(hbox) vbox.addWidget(self.trace_back_label) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(self.buttonbox) vbox.addLayout(hbox) self.setLayout(vbox) self.setWindowTitle(title) icon = QtGui.QIcon() icon.addFile(":/bzr-16.png", QtCore.QSize(16, 16)) icon.addFile(":/bzr-32.png", QtCore.QSize(32, 32)) icon.addFile(":/bzr-48.png", QtCore.QSize(48, 48)) self.setWindowIcon(icon) def show_trace_back(self): """toggle the text box containing the full exception details""" self.trace_back_label.setVisible(not self.trace_back_label.isVisible()) if self.trace_back_label.isVisible(): self.show_trace_back_button.setText(gettext("<<< Hide Error Details")) else: self.show_trace_back_button.setText(gettext("Show Error Details >>>")) self.resize(self.sizeHint()) def clicked(self, button): self.done(int(self.buttonbox.standardButton(button))) def link_clicked(self, url): # We can't import this at the top of the file because util imports # this file. XXX - The is probably a sign that util is to big, and # we need to split it up. from breezy.plugins.qbrz.lib.util import open_browser open_browser(str(url)) def reports_exception(type=MAIN_LOAD_METHOD): """Decorator to report Exceptions raised from the called method """ def reports_exception_decorator(f): def reports_exception_decorate(*args, **kargs): try: return f(*args, **kargs) except Exception: # args[0] - typycaly self, may be a QWidget. Pass it's window if isinstance(args[0], QtWidgets.QWidget): report_exception(type=type, window=args[0].window()) else: report_exception(type=type) return reports_exception_decorate return reports_exception_decorator def excepthook(type, value, traceback): exc_info = (type, value, traceback) report_exception(exc_info=exc_info, type=ITEM_OR_EVENT_METHOD) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tree_branch.py0000644000000000000000000001113014556556456014232 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # # Contributor: # Alexander Belchenko, 2009 # # 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. """Universal tree and/or branch wrapper object for convenience.""" from PyQt5 import QtGui, QtWidgets from breezy import controldir, errors, osutils, urlutils from breezy.plugins.qbrz.lib.i18n import gettext class TreeBranch(object): """Universal tree and/or branch wrapper object.""" __slots__ = ['location', 'tree', 'branch', 'relpath'] def __init__(self, location, tree, branch, relpath): """Use open_containg method to create the object.""" self.location = location self.tree = tree self.branch = branch self.relpath = relpath @staticmethod def open_containing(location=None, require_tree=False, ui_mode=False, _critical_dialog=QtWidgets.QMessageBox.critical): """Open the branch and tree at location (or in current directory). @return: initialized TreeBranch if opened successfully, None if branch or tree not found. @param location: URL or local path, if None then current working directory will be used. @param require_tree: if True then NoWorkingTree error will be raised if there is no working tree found. Otherwise it's acceptable to open only branch object. @param ui_mode: if True show errors in the GUI error dialogs; otherwise propagate the error up the stack. @param _critical_dialog: hook for testing. """ if location is None: location = osutils.getcwd() try: (tree, branch, relpath) = controldir.ControlDir.open_containing_tree_or_branch(location) if require_tree and tree is None: raise errors.NoWorkingTree(location) except (errors.NotBranchError, errors.NoWorkingTree) as e: if not ui_mode: raise TreeBranch._report_error(location, e, _critical_dialog) return None return TreeBranch(location, tree, branch, relpath) @staticmethod def _report_error(location, err, _critical_dialog=QtWidgets.QMessageBox.critical): """Report error in GUI dialog. @param location: valid location for which error is reported. @param err: error object (NotBranchError or NoWorkingTree). @param _critical_dialog: callable to show error dialog. """ if isinstance(err, errors.NotBranchError): text = gettext('Not a branch "%s"') % location elif isinstance(err, errors.NoWorkingTree): text = gettext('No working tree exists for "%s"') % location _critical_dialog(None, gettext("Error"), text, gettext('&Close')) def is_lightweight_checkout(self): """Return True if location is lightweight checkout.""" if self.tree and self.tree.controldir.root_transport.base != self.branch.controldir.root_transport.base: return True return False def is_bound(self): """Return True if location is bound branch.""" if self.branch.get_bound_location(): return True return False def get_type(self): """Return type of the object as string. @return: type of object ('tree', 'branch', 'light-checkout', 'bound' or None) """ if self.branch is None: return None if self.is_lightweight_checkout(): return 'light-checkout' elif self.is_bound(): return 'bound' else: if self.tree: return 'tree' else: return 'branch' def get_root(self): """Return root working directory (or URL for treeless remote branch).""" if self.tree: return self.tree.basedir else: url = self.branch.base if url.startswith('file://'): return urlutils.local_path_from_url(url) return url ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/treewidget.py0000644000000000000000000025151214556556456014133 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2009 Gary van der Merwe # # 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. import os, sys from typing import Union, Any, Callable from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import QModelIndex from breezy import errors from breezy.bzr.inventorytree import InventoryTreeChange from breezy.osutils import minimum_path_selection try: from breezy.transport.local import file_kind except ImportError: # breezy < 3.5 from breezy.osutils import file_kind try: from breezy.transport import NoSuchFile except ImportError: from breezy.errors import NoSuchFile from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.revtreeview import (RevisionTreeView, RevNoItemDelegate) from breezy.plugins.qbrz.lib.uifactory import ui_current_widget from breezy.plugins.qbrz.lib.lazycachedrevloader import cached_revisions from breezy.plugins.qbrz.lib.trace import report_exception, SUB_LOAD_METHOD from breezy.bzr.conflicts import TextConflict from breezy.transport import NoSuchFile import posixpath # to use '/' path sep in path.join(). from time import (strftime, localtime) from breezy.workingtree import WorkingTree from breezy.revisiontree import RevisionTree from breezy.conflicts import resolve from breezy.tree import TreeChange from breezy.plugins.qbrz.lib.cat import QBzrCatWindow, QBzrViewWindow, cat_to_native_app from breezy.plugins.qbrz.lib.annotate import AnnotateWindow from breezy.plugins.qbrz.lib.log import LogWindow from breezy.plugins.qbrz.lib.util import ( get_set_encoding, get_summary, get_apparent_author_name, ) from breezy.plugins.qbrz.lib.subprocess import SimpleSubProcessDialog from breezy.plugins.qbrz.lib.diff import ( show_diff, has_ext_diff, ExtDiffMenu, InternalWTDiffArgProvider, ) from enum import IntEnum class FilterModelKeys(IntEnum): UNCHANGED = 0 CHANGED = 1 UNVERSIONED = 2 IGNORED = 3 def dict_set_add(d:dict, key, value): if key in d: d[key].add(value) else: d[key] = {value} def group_large_dirs(paths): # XXX - check the performance of this method with lots of paths, and deep paths. all_paths_expanded = {'':('', 0, set([]))} """Dict of all paths expanded, and their depth, and a set of decendents they contain. The key is the path The value is a tuple of (path, depths, decendents) """ if not paths: paths = frozenset(('',)) for path in paths: if path == '': continue parent_paths = [] dir_path = path while True: dir_path, name = os.path.split(dir_path) parent_paths.append(dir_path) if not dir_path: break for i, dir_path in enumerate(parent_paths): depth = len(parent_paths) - i - 1 if dir_path in all_paths_expanded: all_paths_expanded[dir_path][2].add(path) else: all_paths_expanded[dir_path] = [dir_path, depth, set((path,))] container_dirs = {} """Dict of a container dir path, with a set of its decendents""" paths_deep_first = sorted(iter(all_paths_expanded.values()), key=lambda x: -x[1]) def set_dir_as_container(path_to_set): path_to_set_decendents = all_paths_expanded[path_to_set][2] container_dirs[path_to_set] = path_to_set_decendents dir_path_to_set = path_to_set while dir_path_to_set: dir_path_to_set, _ = os.path.split(dir_path_to_set) ancestors_descendents = all_paths_expanded[dir_path_to_set][2] old_len = len(ancestors_descendents) ancestors_descendents.difference_update(path_to_set_decendents) if len(ancestors_descendents) < old_len: ancestors_descendents.add(path_to_set) # directories included in the original paths container. for path, depth, decendents in paths_deep_first: if decendents and (path in paths): set_dir_as_container(path_to_set=path) for path, depth, decendents in paths_deep_first: len_decendents = len(decendents) # Config? if len_decendents >= 4 and path not in container_dirs: has_ancestor_with_others = False dir_path = path while dir_path: dir_path, name = os.path.split(dir_path) if len_decendents < len(all_paths_expanded[dir_path][2]): has_ancestor_with_others = True break if has_ancestor_with_others: set_dir_as_container(path_to_set=path) set_dir_as_container('') return container_dirs def missing_unversioned(missing, unversioned): return (missing.change is not None and missing.change.is_missing() and unversioned.change is not None and unversioned.change[3][1] is False) def move_or_rename(old_path, new_path): old_split = os.path.split(old_path) new_split = os.path.split(new_path) return (old_split[0] != new_split[0], old_split[1] != new_split[1]) class InternalItem: __slots__ = ["name", "kind", "file_id"] def __init__(self, name, kind, file_id): self.name = name self.kind = kind self.file_id = file_id def __repr__(self): return "<%s %r %s>" % (self.__class__.__name__, self.name, self.kind) # RJLRJL: revision doesn't appear to be used anywhere anyway! revision = property(lambda self:None) class ModelItemData: __slots__ = ["id", "item", "change", "checked", "children_ids", "parent_id", "row", "path", "icon", "conflicts"] def __init__(self, path, item=None, change=None, conflicts=None): self.path = path self.item = item self.change = change if conflicts is None: self.conflicts = [] else: self.conflicts = conflicts self.checked = QtCore.Qt.Unchecked self.children_ids = None self.parent_id = None self.id = None self.row = None self.icon = None def dirs_first_sort_key(self): """ Gives a string key that will sort directories before files This works by annotating each path segment with either 'D' or 'F', so that directories compare smaller than files on the same level. """ item = self.item if item.kind == "directory": return "D" + item.name.replace("/", "/D") if "/" not in item.name: return "F" + item.name path, f = item.name.rsplit("/", 1) return "D" + path.replace("/", "/D") + "/F" + f def __repr__(self): return "" % (self.path, self.item,) class PersistantItemReference(object): """This is use to stores a reference to a item that is persisted when we refresh the model.""" __slots__ = ["file_id", "path"] def __init__(self, file_id, path): self.file_id = file_id self.path = path def __repr__(self): return "<%s %s %s>" % (self.__class__.__name__, self.path, self.file_id) class ChangeDescription: """ delta.py's comments and code help here:- `kind` is None if no file is present files are "renamed" if they are moved or if name changes, as long as it had a value versioned_change_map = { (True, True): 'unchanged', (True, False): 'removed', (False, True): 'added', (False, False): 'unversioned', } if change.copied: copied = True renamed = False elif change.renamed: renamed = True copied = False else: copied = False renamed = False if change.kind[0] != change.kind[1]: if change.kind[0] is None: modified = "created" elif change.kind[1] is None: modified = "deleted" else: modified = "kind changed" else: if change.changed_content: modified = "modified" elif change.kind[0] is None: modified = "missing" else: modified = "unchanged" if change.kind[1] == "file": exe_change = (change.executable[0] != change.executable[1]) """ VERSIONED_BUT_REMOVED = (True, False) NEVER_VERSIONED = (False, False) NEWLY_ADDED_THUS_VERSIONED = (False, True) UNCHANGED_VERSIONING_THUS_VERSIONED = (True, True) NO_PARENT = (None, None) def __init__(self, tree_change_object: Union[TreeChange, InventoryTreeChange], ignored_pattern=None): self.tree_change = tree_change_object self._ignored_pattern = ignored_pattern def old_or_new_path(self): # was path() """Return a suitable entry for a 'specific_files' param to bzr functions.""" oldpath, newpath = self.tree_change.path return newpath or oldpath def old_path(self): """Return oldpath for renames.""" return self.tree_change.path[0] def old_or_new_kind(self): # was kind oldkind, newkind = self.tree_change.kind return newkind or oldkind def is_versioned(self) -> bool: return self.tree_change.versioned != self.NEVER_VERSIONED def is_renamed(self) -> bool: return self.tree_change.renamed def been_removed(self) -> bool: return self.tree_change.versioned == self.VERSIONED_BUT_REMOVED def kind_changed(self) -> bool: # Some difference between the old and new values of kind return self.tree_change.kind[0] != self.tree_change.kind[1] def was_created(self) -> bool: return self.kind_changed() and self.tree_change.kind[0] is None def was_deleted(self) -> bool: return self.kind_changed() and self.tree_change.kind[1] is None def was_modified_delta(self) -> bool: return not self.kind_changed() and self.tree_change.changed_content def was_modified(self) -> bool: return self.is_versioned() and self.tree_change.changed_content def is_missing_delta(self) -> bool: # This is a DIFFERENT missing detection to the original one return not self.kind_changed() and self.tree_change.kind[0] is None def is_missing(self) -> bool: return self.tree_change.versioned == self.NEWLY_ADDED_THUS_VERSIONED and self.tree_change.kind[1] is None def is_misadded(self) -> bool: return self.is_missing() def is_tree_root(self) -> bool: return self.is_versioned() and self.tree_change.parent_id == self.NO_PARENT def is_on_disk(self) -> bool: return self.tree_change.kind[1] is not None def ignored_pattern(self): """ The old routine stated: Returns ignore pattern if file is ignored; None if none pattern match; False is there is pattern but file actually versioned. Which was actually untrue, as it returned either True or None. The problem is that in various places `lambda c:not c.ignored_pattern` gets used and as `not True` -> False and `1not None` -> False it basically ended up as False. THIS version now does what the above comment states (whether that is correct or not). """ # if len(self.change._as_tuple()) > 8: # # ignored is when file match ignore pattern and not versioned # # HOWEVER, the old [8] position is now occupied by 'copied' # #return self.change.copied and self.change.versioned == (False, False) # return self.ignored_pattern and self.change.versioned == (False, False) # # return desc[8] and desc[3] == (False, False) # else: # return None # ignored is when file match ignore pattern and not versioned if self.is_versioned() and self._ignored_pattern is not None: return False elif not self.is_versioned() and self._ignored_pattern is not None: return self._ignored_pattern else: return None def status(self) -> str: # is_ignored = self.associated_tree.is_ignored(self.old_or_new_path()) versioned = self.tree_change.versioned is_ignored = self._ignored_pattern is not None if versioned == (False, False): if is_ignored: return gettext("ignored") else: return gettext("non-versioned") elif versioned == (False, True): # if kind[1] is None: if self.tree_change.kind[1] is None: return gettext("added, missing") else: return gettext("added") elif versioned == (True, False): return gettext("removed") elif self.tree_change.kind[0] is not None and self.tree_change.kind[1] is None: return gettext("missing") else: # versioned = True, True - so either renamed or modified # or properties changed (x-bit). mod_strs = [] if self.tree_change.parent_id[0] != self.tree_change.parent_id[1]: mod_strs.append(gettext("moved")) if self.tree_change.name[0] != self.tree_change.name[1]: mod_strs.append(gettext("renamed")) if self.tree_change.changed_content: mod_strs.append(gettext("modified")) if self.tree_change.executable[0] != self.tree_change.executable[1]: mod_strs.append(gettext("x-bit")) return ", ".join(mod_strs) @staticmethod def dump_header_line(): s = f'{"file_id":<22} {"Path_old":<25} {"Path_new":<25} {"Changed?":<9}' s += f' {"V(old)":7} {"V(new)":7} {"Name(old)":25} {"Name(new)":25}' s += f' {"Kind_old":10} {"Kind_new":10} {"Exec_old":10} {"Exec_new":10}' s += f' {"Copied?":10} {"Ignored?":20}' return s def dump_row(self) -> str: c = self.tree_change s = "{0:<22} {1:25} {2:25}".format(str(self.tree_change.file_id)[:21], str(c.path[0]), str(c.path[1])) s += " {:^9} {:^7} {:^7}".format(str(c.changed_content), str(c.versioned[0]), str(c.versioned[1])) s += " {0:25} {1:25}".format(str(c.name[0]), str(c.name[1])) s += " {0:10} {1:10}".format(str(c.kind[0]), str(c.kind[1])) s += " {0:10} {1:10}".format(str(c.executable[0]), str(c.executable[1])) s += " {0:10} {1:20}".format(str(c.copied), str(self._ignored_pattern)) return s class TreeModel(QtCore.QAbstractItemModel): layoutAboutToBeChanged = QtCore.pyqtSignal() layoutChanged = QtCore.pyqtSignal() dataChanged = QtCore.pyqtSignal(QtCore.QModelIndex, QtCore.QModelIndex) HEADER_LABELS = [gettext("File Name"), gettext("Date"), gettext("Rev"), gettext("Message"), gettext("Author"), gettext("Status")] # These are the columns NAME = 0 DATE = 1 REVNO = 2 MESSAGE = 3 AUTHOR = 4 STATUS = 5 REVID = QtCore.Qt.UserRole + 1 FILEID = QtCore.Qt.UserRole + 2 PATH = QtCore.Qt.UserRole + 3 _many_loaddirs_started = False _many_loaddirs_should_start = False def __init__(self, parent=None): # XXX parent object: instance of what class it supposed to be? # QtCore.QAbstractTableModel.__init__(self, parent) super().__init__(parent=parent) self.unver_by_parent = None self.change_load_filter = None self.changes_mode = None self.branch = None self.get_children = None self.is_item_in_select_all: Callable self.revno_map = None self.missing_icon = QtGui.QIcon() if parent is not None: # TreeModel is subclass of QtCore.QAbstractItemModel, # the latter can have parent in constructor # as instance of QtCore.QModelIndex and the latter does not have style() style = parent.style() self.file_icon = style.standardIcon(QtWidgets.QStyle.SP_FileIcon) self.dir_icon = style.standardIcon(QtWidgets.QStyle.SP_DirIcon) self.symlink_icon = style.standardIcon(QtWidgets.QStyle.SP_FileLinkIcon) self.missing_icon.addFile(':/16x16/missing.png') else: self.file_icon = QtGui.QIcon() self.dir_icon = QtGui.QIcon() self.symlink_icon = QtGui.QIcon() self.tree = None self.inventory_data = [] self.inventory_data_by_path = {} self.inventory_data_by_id = {} # Will not contain unversioned items. self.checkable = False self.icon_provider = QtWidgets.QFileIconProvider() self.parent_view = parent self._index_cache = {} self.set_select_all_kind() self.last_item_data = [] def get_name(self, dir_fileid, dir_path, path, basis_tree, change: ChangeDescription): # If we've a name like 'somedir/thisname' then dirpath will be non-empty ('somedir') remove it from the name if dir_path: name = path[len(dir_path) + 1:] else: name = path if change and change.is_renamed(): old_inventory_item = self._get_entry(basis_tree, change.tree_change.file_id) old_names = [old_inventory_item.name] while old_inventory_item.parent_id: if old_inventory_item.parent_id == dir_fileid: break old_inventory_item = self._get_entry(basis_tree, old_inventory_item.parent_id) old_names.append(old_inventory_item.name) old_names.reverse() old_path = "/".join(old_names) name = "%s => %s" % (old_path, name) return name def set_tree(self, tree, branch=None, changes_mode=False, want_unversioned=True, initial_checked_paths=None, change_load_filter=None, load_dirs=None): """ Work out the various filters for display (ignored, select all and so on). Eventually we'll fill self.inventory_data via self.append_item() """ self.tree = tree self.branch = branch self.revno_map = None self.changes_mode = changes_mode self.change_load_filter = change_load_filter # ? sourceModel ? self.layoutAboutToBeChanged.emit() is_refresh = len(self.inventory_data) > 0 if is_refresh: self.beginRemoveRows(QtCore.QModelIndex(), 0, len(self.inventory_data[0].children_ids) - 1) self.inventory_data = [] self._index_cache = {} self.unver_by_parent = {} self.inventory_data_by_path = {} self.inventory_data_by_id = {} if is_refresh: self.endRemoveRows() if isinstance(self.tree, WorkingTree): with tree.lock_read(): root_id = self.tree.path2id('') basis_tree = self.tree.basis_tree() with basis_tree.lock_read(): # Compare the widget's tree with the basis (original tree) # for other_lines, the_change in enumerate(self.tree.iter_changes(basis_tree, want_unversioned=want_unversioned)): the_changes = list(self.tree.iter_changes(basis_tree, want_unversioned=want_unversioned)) for other_lines, the_change in enumerate(the_changes): # iter_changes now seems to appear to return a TreeChange type See Jelmer's 7390. # Handily, it has an as_tuple() function, so we'll cheat for now # change = ChangeDesc(tree_change_object=the_change, associated_tree=self.tree) change = ChangeDescription(the_change) fileid = change.tree_change.file_id if fileid == root_id: continue path = change.old_or_new_path() # tree.is_ignored() doesn't actually return a boolean, instead it # returns either None or the pattern to be ignored. is_ignored = self.tree.is_ignored(path) change._ignored_pattern = is_ignored if self.change_load_filter is not None and not self.change_load_filter(change): continue item = InternalItem("", change.old_or_new_kind(), fileid) item_data = ModelItemData(path, change=change, item=item) self.inventory_data_by_path[path] = item_data if fileid: self.inventory_data_by_id[fileid] = item_data for conflict in self.tree.conflicts(): path = conflict.path if path in self.inventory_data_by_path: self.inventory_data_by_path[path].conflicts.append(conflict) else: item_data = ModelItemData(path, conflicts=[conflict]) fileid = conflict.file_id try: kind = file_kind(self.tree.abspath(path)) except NoSuchFile: kind = '' item_data.item = InternalItem("", kind, fileid) self.inventory_data_by_path[path] = item_data if fileid: self.inventory_data_by_id[fileid] = item_data if initial_checked_paths: # Add versioned directories so that we can easily check them. for path in initial_checked_paths: fileid = self.tree.path2id(path) if fileid: kind = self.tree.kind(path) if kind == "directory": item_data = self.inventory_data_by_path.get(path) if item_data is None: item = InternalItem("", kind, fileid) item_data = ModelItemData(path, item=item) self.inventory_data_by_path[path] = item_data self.inventory_data_by_id[fileid] = item_data if changes_mode: self.unver_by_parent = group_large_dirs(frozenset(iter(self.inventory_data_by_path.keys()))) # Add items for directories added for path in self.unver_by_parent.keys(): if path not in self.inventory_data_by_path: kind = "directory" file_id = self.tree.path2id(path) item = InternalItem("", kind, file_id) item_data = ModelItemData(path, item=item) self.inventory_data_by_path[path] = item_data if file_id: self.inventory_data_by_id[file_id] = item_data # Name setting for dir_path, decendents in self.unver_by_parent.items(): dir_fileid = self.tree.path2id(dir_path) for path in decendents: item_data = self.inventory_data_by_path[path] item_data.item.name = self.get_name(dir_fileid, dir_path, path, basis_tree=basis_tree, change=item_data.change) # RJLRJL: added - original code manipulated item_data but seemed to do nothing with it self.inventory_data_by_path[path] = item_data if dir_fileid: self.inventory_data_by_id[dir_fileid] = item_data # end of RJLRJL added else: # record the unversioned items for item_data in self.inventory_data_by_path.values(): if item_data.change and not item_data.change.is_versioned() or not item_data.change: parent_path, name = os.path.split(item_data.path) dict_set_add(self.unver_by_parent, parent_path, item_data.path) # Name setting for item_data in self.inventory_data_by_path.values(): dir_path, name = os.path.split(item_data.path) dir_fileid = self.tree.path2id(dir_path) item_data.item.name = self.get_name(dir_fileid, dir_path, item_data.path, basis_tree=basis_tree, change=item_data.change) self.process_tree(self.working_tree_get_children, initial_checked_paths, load_dirs) else: self.process_tree(self.revision_tree_get_children, initial_checked_paths, load_dirs) self.layoutChanged.emit() def revision_tree_get_children(self, item_data): path = self.tree.id2path(item_data.item.file_id) for child in self.tree.iter_child_entries(path): path = self.tree.id2path(child.file_id) yield ModelItemData(path, item=child) def working_tree_get_children(self, item_data): item = item_data.item # RJLRJL temp bypass if item.file_id is None: abspath = self.tree.abspath(item_data.path) for name in os.listdir(abspath): path = item_data.path + "/" + name (kind, executable, stat_value) = self.tree._comparison_data(None, path) child = InternalItem(name, kind, None) is_ignored = self.tree.is_ignored(path) # RJL BUGBUG: TreeChange initialisation looks incorrect # tree.iter_changes states: # Changed_content is True if the file's content has changed. This # includes changes to its kind, and to a symlink's target. # # versioned, parent, name, kind, executable are tuples of (from, to). # If a file is missing in a tree, its kind is None. # t = TreeChange((None, path), False, (False, False), (None, None), (None, name), (None, kind), (None, executable)) t = TreeChange(path=(None, path), changed_content=False, versioned=(False, False), name=(None, name), kind=(None, kind), executable=(None, executable)) # change = ChangeDesc(tree_change_object=t, ignored_pattern=is_ignored, associated_tree=self.tree) change = ChangeDescription(tree_change_object=t, ignored_pattern=is_ignored) # change = ChangeDesc((None,(None, path), False, (False, False), # (None, None), # (None, name), (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 item.kind == 'directory' and not self.changes_mode: # Because we create copies, we have to get the real item. item = self._get_entry(self.tree, item.file_id) path = self.tree.id2path(item.file_id) for child in self.tree.iter_child_entries(path): if child.file_id in self.inventory_data_by_id: child_item_data = self.inventory_data_by_id[child.file_id] else: path = self.tree.id2path(child.file_id) child_item_data = ModelItemData(path) # Create a copy so that we don't have to hold a lock of the wt. child = self._get_entry(self.tree, child.file_id).copy() child_item_data.item = child yield child_item_data if item_data.path in self.unver_by_parent: for path in self.unver_by_parent[item_data.path]: yield self.inventory_data_by_path[path] 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 dir_item = self.inventory_data[dir_id] if dir_item.children_ids is not None: return # This dir has already been loaded. if not dir_item.item.kind == 'directory': return if not self._many_loaddirs_started: self.tree.lock_read() if self._many_loaddirs_should_start: self._many_loaddirs_started = True # RJL: the strange construction with self.get_children pointing to # revision_tree_get_children seems to be a hangover from # python 2.4 days when one could not have yield in a try / finally block # nor had context managers. try: dir_item.children_ids = [] child_list = list(self.get_children(dir_item)) children = sorted(child_list, key=ModelItemData.dirs_first_sort_key) parent_model_index = self._index_from_id(dir_id, 0) self.beginInsertRows(parent_model_index, 0, len(children) - 1) try: for child in children: child_id = self.append_item(child, dir_id) dir_item.children_ids.append(child_id) finally: self.endInsertRows() finally: if not self._many_loaddirs_started: self.tree.unlock() def _get_entry(self, tree, file_id): # RJLRJL BUGBUG it looks like requesting specific_files must NOT pass any # We only ever get one entry, so we don't need a loop # entries consist of (path, entry) tuples: entry appears to be an Inventory Directory or Path # actual paths (e.g. dir/movedandrenamed should be stripped to movedandrenamed) # RJLRJL: id2path() seems to be the problem - we are looking at self.tree but then call # iter_entries on the PASSED tree the_path = self.tree.id2path(file_id) entries = list(tree.iter_entries_by_dir(specific_files=[the_path], recurse_nested=True)) if entries: return entries[0][1] else: the_other_path = tree.id2path(file_id) entries = list(tree.iter_entries_by_dir(specific_files=[the_other_path], recurse_nested=True)) if entries: return entries[0][1] raise errors.NoSuchId(tree, (file_id, the_path)) def process_tree(self, get_children, initial_checked_paths, load_dirs): # RJL get_children seems to be a passed function and looks like it is used by load_dir self.get_children = get_children root_item = ModelItemData('', item=self._get_entry(self.tree, self.tree.path2id(''))) root_id = self.append_item(root_item, None) self.load_dir(root_id) if load_dirs: # refs2indexes will load the parents if nesseary. for index in self.refs2indexes(load_dirs, ignore_no_file_error=True): self.load_dir(index.internalId()) if self.checkable: if initial_checked_paths is not None: self.set_checked_paths(initial_checked_paths) else: # RJL initial_checked_paths will be None (I think) if EVERYTHING is to be checked that is, 'select all' self.setData(self._index_from_id(root_id, self.NAME), QtCore.Qt.Checked, QtCore.Qt.CheckStateRole) def append_item(self, item_data, parent_id): item_data.id = len(self.inventory_data) if parent_id is not None: parent_data = self.inventory_data[parent_id] item_data.row = len(parent_data.children_ids) else: # Root Item item_data.row = 0 item_data.parent_id = parent_id self.inventory_data.append(item_data) self.inventory_data_by_path[item_data.path] = item_data if item_data.item.file_id is not None: self.inventory_data_by_id[item_data.item.file_id] = item_data return item_data.id def set_revno_map(self, revno_map): self.revno_map = revno_map for item_data in self.inventory_data[1:0]: index = self.createIndex(item_data.row, self.REVNO, item_data.id) self.dataChanged.emit(index, index) # The ellipsis is to match the QtCore stub def columnCount(self, parent=...) -> int: return len(self.HEADER_LABELS) def rowCount(self, parent=...) -> int: # if 0: parent = QtCore.QModelIndex() # Note, internalID() is part of pyQt4 if parent.column() > 0 or parent.internalId() >= len(self.inventory_data): return 0 parent_data = self.inventory_data[parent.internalId()] if parent_data.children_ids is None: return 0 return len(parent_data.children_ids) def canFetchMore(self, parent): if parent.internalId() >= len(self.inventory_data): return False parent_data = self.inventory_data[parent.internalId()] return parent_data.children_ids is None and parent_data.item.kind == "directory" def fetchMore(self, parent): self.load_dir(parent.internalId()) def _index(self, row, column, parent_id): if parent_id >= len(self.inventory_data): return QtCore.QModelIndex() cache_key = (parent_id, row, column) if cache_key in self._index_cache: return self._index_cache[cache_key] else: parent_data = self.inventory_data[parent_id] if parent_data.children_ids is None: return QtCore.QModelIndex() if row < 0 or row >= len(parent_data.children_ids) or column < 0 or column >= len(self.HEADER_LABELS): return QtCore.QModelIndex() item_id = parent_data.children_ids[row] index = self.createIndex(row, column, item_id) self._index_cache[cache_key] = index return index def _index_from_id(self, item_id, column): if item_id >= len(self.inventory_data): return QtCore.QModelIndex() item_data = self.inventory_data[item_id] return self.createIndex(item_data.row, column, item_id) def index(self, row, column, parent=QtCore.QModelIndex()): if parent.column() > 0: return QtCore.QModelIndex() return self._index(row, column, parent.internalId()) def sibling(self, row, column, index): sibling_id = index.internalId() if sibling_id == 0: return QtCore.QModelIndex() item_data = self.inventory_data[sibling_id] return self._index(row, column, item_data.parent_id) def parent(self, child): child_id = child.internalId() if child_id == 0: return QtCore.QModelIndex() item_data = self.inventory_data[child_id] if item_data.parent_id == 0: return QtCore.QModelIndex() return self._index_from_id(item_data.parent_id, 0) def hasChildren(self, parent=...): if self.tree is None: return False if parent.internalId() == 0: return True item_data = self.inventory_data[parent.internalId()] return item_data.item.kind == "directory" def set_select_all_kind(self, kind='all'): """Set checker function for 'select all' checkbox. Possible kind values: all, versioned.""" def _is_item_in_select_all_all(item): """Returns whether an item is changed when select all is clicked, and whether it's children are looked at.""" return True, True def _is_item_in_select_all_versioned(item): return item.change is None or item.change.is_versioned(), True if kind == 'all': self.is_item_in_select_all = _is_item_in_select_all_all elif kind == 'versioned': self.is_item_in_select_all = _is_item_in_select_all_versioned def set_checked(self, item_data, checked, emit=True) -> bool: old_checked = item_data.checked item_data.checked = checked return not old_checked == checked def set_child_checked_recurse(self, item_data, value): # Recursively set all children to checked. if item_data.children_ids is None and item_data.item.kind == "directory": self.load_dir(item_data.id) if not item_data.children_ids: return False have_changed_item = False for child_id in item_data.children_ids: child = self.inventory_data[child_id] # If unchecking, uncheck everything, but if checking, only check those in "select_all" get checked. if value == QtCore.Qt.Unchecked: change = True lookat_children = True else: (change, lookat_children) = self.is_item_in_select_all(child) self.last_item_data[0] = child if lookat_children: has_children_changed = self.set_child_checked_recurse(child, value) else: has_children_changed = False if change or has_children_changed: have_changed_item = True self.set_checked(child, value, False) return have_changed_item def setData(self, index: QModelIndex, value: Any, role:int = ...) -> bool: # This appears to be used when clicking select / deselect all (at least in qAdd) if index.column() == self.NAME and role == QtCore.Qt.CheckStateRole: # RJLRJL: patch undo # value = int(value) 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) self.set_checked(item_data, value) self.last_item_data = [None] # RJLRJL: this many_loadirs stuff possibly needs a context manager self.start_maybe_many_loaddirs() try: self.set_child_checked_recurse(item_data, value=value) finally: self.end_maybe_many_loaddirs() if self.last_item_data[0]: last_index = self._index_from_id(self.last_item_data[0].id, self.NAME) else: last_index = first_index self.dataChanged.emit(first_index, last_index) # Walk up the tree, and update every dir parent_data = item_data while parent_data.parent_id is not None: (in_select_all, look_at_children) = self.is_item_in_select_all(parent_data) if not in_select_all and value == QtCore.Qt.Unchecked: # Don't uncheck parents if not in "select_all". break parent_data = self.inventory_data[parent_data.parent_id] has_checked = False has_unchecked = False for child_id in parent_data.children_ids: child = self.inventory_data[child_id] (child_in_select_all, child_look_at_children) = self.is_item_in_select_all(parent_data) if child.checked == QtCore.Qt.Checked: has_checked = True elif child.checked == QtCore.Qt.Unchecked and child_in_select_all: has_unchecked = True elif child.checked == QtCore.Qt.PartiallyChecked: has_checked = True if child_in_select_all: has_unchecked = True if has_checked and has_unchecked: break if has_checked and has_unchecked: checked = QtCore.Qt.PartiallyChecked elif has_checked: checked = QtCore.Qt.Checked else: checked = QtCore.Qt.Unchecked if self.set_checked(parent_data, checked): index = self._index_from_id(parent_data.id, self.NAME) self.dataChanged.emit(index, index) return True if index.column() == self.NAME and role == QtCore.Qt.EditRole: if not isinstance(self.tree, WorkingTree): return False # Rename value = str(value) item_data = self.inventory_data[index.internalId()] parent = self.inventory_data[item_data.parent_id] new_path = posixpath.join(parent.path, value) if item_data.path == new_path: return False try: if item_data.item.file_id: # Versioned file self.tree.rename_one(item_data.path, new_path) else: old_path_abs=self.tree.abspath(item_data.path) new_path_abs=self.tree.abspath(new_path) os.rename(old_path_abs, new_path_abs) except Exception: report_exception(type=SUB_LOAD_METHOD, window=self.parent_view.window()) # We do this so that the ref has the new_path, and hence refresh # restores it's state correctly. item_data.path = new_path ref = self.index2ref(index) self.parent_view.refresh() try: new_index = self.ref2index(ref) new_index = self.parent_view.tree_filter_model.mapFromSource(new_index) self.parent_view.scrollTo(new_index) except (errors.NoSuchId, NoSuchFile): pass return True return False def data(self, index, role): # QT function, mostly display stuff as self.inventory_data should have been filled by now if not index.isValid(): return None if role in (QtCore.Qt.FontRole, QtCore.Qt.TextAlignmentRole, QtCore.Qt.BackgroundRole, QtCore.Qt.BackgroundColorRole, QtCore.Qt.ForegroundRole, QtCore.Qt.TextColorRole): return None item_data = self.inventory_data[index.internalId()] item = item_data.item if role == self.FILEID: return QtCore.QByteArray(item.file_id) column = index.column() if column == self.NAME: if role == QtCore.Qt.DisplayRole: return item.name if role == QtCore.Qt.EditRole: path = item_data.path if item_data.parent_id: parent = self.inventory_data[item_data.parent_id] path = path[len(parent.path) + 1:] return path if role == QtCore.Qt.DecorationRole: if item_data.icon is None: if item_data.change and not item_data.change.is_on_disk() or item.kind == '': item_data.icon = self.missing_icon elif isinstance(self.tree, WorkingTree): abspath = self.tree.abspath(item_data.path) info = QtCore.QFileInfo(abspath) item_data.icon = self.icon_provider.icon(info) else: if item.kind == "file": item_data.icon = self.file_icon if item.kind == "directory": item_data.icon = self.dir_icon if item.kind == "symlink": item_data.icon = self.symlink_icon if item_data.icon is None: item_data.icon = None return item_data.icon if role == QtCore.Qt.CheckStateRole: if not self.checkable: return None else: return item_data.checked if column == self.STATUS: if role == QtCore.Qt.DisplayRole: status = [] if item_data.change is not None: status.append(item_data.change.status()) for conflict in item_data.conflicts: status.append(conflict.typestring) return ", ".join(status) # RJLRJL check this before patch changes (patch line ~= 1897) try: revid = item_data.item.revision except AttributeError: # GitTreeDirectory object has no attribute 'repository' return None if role == self.REVID: return revid if column == self.REVNO: if role == QtCore.Qt.DisplayRole: if self.revno_map is not None and revid in self.revno_map: revno_sequence = self.revno_map[revid] return ".".join(["%d" % revno for revno in revno_sequence]) else: return "" if role == QtCore.Qt.DisplayRole: if revid in cached_revisions: rev = cached_revisions[revid] if column == self.AUTHOR: return get_apparent_author_name(rev) if column == self.MESSAGE: return get_summary(rev) if column == self.DATE: return strftime("%Y-%m-%d %H:%M", localtime(rev.timestamp)) if role == self.PATH: return item_data.path if role == QtCore.Qt.DisplayRole: return "" return None def flags(self, index): if not index.isValid(): return QtCore.Qt.NoItemFlags flags = (QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable) if isinstance(self.tree, WorkingTree): flags = flags | QtCore.Qt.ItemIsDragEnabled if index.column() == self.NAME: flags = flags | QtCore.Qt.ItemIsEditable if self.checkable: flags = flags | QtCore.Qt.ItemIsUserCheckable internal_id = index.internalId() if internal_id < len(self.inventory_data): item_data = self.inventory_data[index.internalId()] if item_data.item.kind == "directory": flags = flags | QtCore.Qt.ItemIsDropEnabled return flags def headerData(self, section, orientation, role): if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole: return self.HEADER_LABELS[section] return None def on_revisions_loaded(self, revisions, last_call): for item_data in self.inventory_data: if item_data.id == 0: continue if item_data.item.revision in revisions: self.dataChanged.emit(self.createIndex(item_data.row, self.DATE, item_data.id), self.createIndex(item_data.row, self.AUTHOR, item_data.id)) def get_repo(self): # RJLRJL Check this patch line ~= 1966 if self.branch is not None: return self.branch.repository else: return None @staticmethod def item2ref(item_data): return PersistantItemReference(item_data.item.file_id, item_data.path) def index2ref(self, index): item_data = self.inventory_data[index.internalId()] return self.item2ref(item_data) def indexes2refs(self, indexes): refs = [] for index in indexes: refs.append(self.index2ref(index)) return refs def ref2index(self, ref): if ref.file_id is not None: key = ref.file_id inventory_data_dict = self.inventory_data_by_id def iter_parents(): parent_id = self._get_entry(self.tree, ref.file_id).parent_id parent_ids = [] while parent_id is not None: parent_ids.append(parent_id) parent_id = self._get_entry(self.tree, parent_id).parent_id return reversed(parent_ids) else: key = ref.path inventory_data_dict = self.inventory_data_by_path def iter_parents(): path_split = ref.path.split("/") parent_dir_path = None for parent_name in path_split[:-1]: if parent_dir_path is None: parent_dir_path = parent_name else: parent_dir_path += "/" + parent_name yield parent_dir_path if key not in inventory_data_dict or inventory_data_dict[key].id is None: # Try loading the parents for parent_key in iter_parents(): if parent_key in inventory_data_dict: self.load_dir(inventory_data_dict[parent_key].id) if key not in inventory_data_dict: raise NoSuchFile(ref.path) return self._index_from_id(inventory_data_dict[key].id, self.NAME) def refs2indexes(self, refs, ignore_no_file_error=False): indexes = [] for ref in refs: try: indexes.append(self.ref2index(ref)) except (errors.NoSuchId, NoSuchFile): if not ignore_no_file_error: raise return indexes def iter_checked(self, include_unchanged_dirs=True): """ Iterate over the list of checked items and emit the entires. @param include_unchanged_dirs: should we include unchanged directories or skip them. """ # We have to recurse and load all dirs, because we use --no-recurse # for add, and commit and revert don't recurse. # i = 0 # while i < len(self.inventory_data): # item_data = self.inventory_data[i] # if item_data.children_ids is None and item_data.item.kind == "directory" and item_data.checked: # self.load_dir(item_data.id) # i += 1 for item_data in self.inventory_data: if item_data.children_ids is None and item_data.item.kind == "directory" and item_data.checked: self.load_dir(item_data.id) for item_data in self.inventory_data[1:]: if item_data.checked == QtCore.Qt.Checked: if item_data.change is None and item_data.item.kind == 'directory' and not include_unchanged_dirs: continue yield self.item2ref(item_data) def set_checked_items(self, refs, ignore_no_file_error=True): # set every thing off root_index = self._index_from_id(0, self.NAME) self.setData(root_index, QtCore.Qt.Unchecked, QtCore.Qt.CheckStateRole) for index in self.refs2indexes(refs, ignore_no_file_error): self.setData(index, QtCore.Qt.Checked, QtCore.Qt.CheckStateRole) def set_checked_paths(self, paths): return self.set_checked_items([PersistantItemReference(None, path) for path in paths]) def supportedDropActions(self): return QtCore.Qt.MoveAction class TreeFilterProxyModel(QtCore.QSortFilterProxyModel): source_model = None filters = [True, True, True, False] # Unchanged, Changed, Unversioned, Ignored filter_cache = {} def setSourceModel(self, source_model): self.source_model = source_model QtCore.QSortFilterProxyModel.setSourceModel(self, source_model) def invalidateFilter(self): # self.layoutAboutToBeChanged.emit() self.filter_cache = {} self.source_model.start_maybe_many_loaddirs() try: QtCore.QSortFilterProxyModel.invalidateFilter(self) finally: self.source_model.end_maybe_many_loaddirs() def setFilter(self, the_filter, value): self.filters[the_filter] = value # This is slow. It causes TreeModel.index, and TreeModel.data thousands of times. self.invalidateFilter() def setFilters(self, filters): def iff(b, x, y): if b: return x else: return y self.filters = [iff(f is not None, f, old_f) for f, old_f in zip(filters, self.filters)] self.invalidateFilter() def filterAcceptsRow(self, source_row, source_parent) -> bool: # if all(self.filters): # return True model = self.source_model parent_id = source_parent.internalId() children_ids = model.inventory_data[parent_id].children_ids if len(children_ids) <= source_row: return False child_id = children_ids[source_row] if model.checkable and not model.inventory_data[child_id].checked == QtCore.Qt.Unchecked: return True return bool(self.filter_id_cached(child_id)) def filter_id_cached(self, child_id): if child_id in self.filter_cache: return self.filter_cache[child_id] else: result = self.filter_id_recurse(child_id) self.filter_cache[child_id] = result return result def filter_id_recurse(self, child_id): item_data = self.source_model.inventory_data[child_id] the_filter = self.filter_id(child_id, item_data) if the_filter is not None: return the_filter if item_data.item.kind == "directory": if item_data.children_ids is None: self.source_model.load_dir(child_id) for child_id in item_data.children_ids: if self.filter_id_cached(child_id): return True return False def filter_id(self, child_id, item_data): """Determines whether a item should be displayed. Returns : * True: Show the item * False: Do not show the item * None: Show the item if there are any children that are visible. """ (unchanged, changed, unversioned, ignored) = self.filters is_changed = item_data.change is not None is_versioned = item_data.item.file_id is not None if is_versioned and not is_changed and unchanged: return True if is_versioned and is_changed and changed: return True if not is_versioned: if is_changed and (unversioned or ignored): is_ignored = item_data.change.ignored_pattern() 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) def get_repo(self): return self.source_model.get_repo() def hasChildren(self, parent): return self.source_model.hasChildren(self.mapToSource(parent)) class TreeFilterMenu(QtWidgets.QMenu): triggered = QtCore.pyqtSignal(int, bool) def __init__(self, parent=None): QtWidgets.QMenu.__init__(self, gettext("&Filter"), parent) filters = (gettext("Unchanged"), gettext("Changed"), gettext("Unversioned"), gettext("Ignored")) self.actions = [] for i, text in enumerate(filters): action = QtWidgets.QAction(text, self) action.setData(i) action.setCheckable(True) self.addAction(action) self.actions.append(action) # self.triggered[QtWidgets.QAction].connect(self._triggered) self.triggered.connect(self._triggered) def _triggered(self, action): # filter = action.data().toInt()[0] the_filter = int(action.data()) checked = action.isChecked() self.triggered.emit(the_filter, checked) def set_filters(self, filters): for checked, action in zip(filters, self.actions): action.setChecked(checked) class TreeWidget(RevisionTreeView): dataChanged = QtCore.pyqtSignal(QtCore.QModelIndex, QtCore.QModelIndex) def __init__(self, *args): RevisionTreeView.__init__(self, *args) self.setAlternatingRowColors(True) self.change_load_filter = None self.want_unversioned = None self.changes_mode = None self.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) self.setUniformRowHeights(True) self.setEditTriggers(QtWidgets.QAbstractItemView.SelectedClicked | QtWidgets.QAbstractItemView.EditKeyPressed) self.viewport().setAcceptDrops(True) self.setDropIndicatorShown(True) self.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove) self.tree = None self.branch = None self.tree_model = TreeModel(self) self.tree_filter_model = TreeFilterProxyModel() self.tree_filter_model.setSourceModel(self.tree_model) self.setModel(self.tree_filter_model) # self.setModel(self.tree_model) self.revno_item_delegate = RevNoItemDelegate(parent=self) self.set_header_width_settings() self.setItemDelegateForColumn(self.tree_model.REVNO, self.revno_item_delegate) self.doubleClicked[QtCore.QModelIndex].connect(self.do_default_action) self.context_menu = QtWidgets.QMenu(self) self.action_open_file = self.context_menu.addAction(gettext("&Open"), self.open_file) self.action_show_file = self.context_menu.addAction(gettext("&View file"), self.show_file_content) self.action_show_annotate = self.context_menu.addAction(gettext("Show &annotate"), self.show_file_annotate) self.action_show_log = self.context_menu.addAction(gettext("Show &log"), self.show_file_log) if has_ext_diff(): diff_menu = ExtDiffMenu(self) self.action_show_diff = self.context_menu.addMenu(diff_menu) diff_menu._triggered.connect(self.show_differences) else: self.action_show_diff = self.context_menu.addAction(gettext("Show &differences"), self.show_differences) self.context_menu.addSeparator() self.action_merge = self.context_menu.addAction(gettext("&Merge conflict"), self.merge) self.action_resolve = self.context_menu.addAction(gettext("Mark conflict &resolved"), self.resolve) self.context_menu.addSeparator() self.action_add = self.context_menu.addAction(gettext("&Add"), self.add) self.action_revert = self.context_menu.addAction(gettext("&Revert"), self.revert) self.action_rename = self.context_menu.addAction(gettext("Re&name"), self.rename) self.action_remove = self.context_menu.addAction(gettext("Remove"), self.remove) # The text for this is set per selection, depending on move or rename. self.action_mark_move = self.context_menu.addAction("mv --after", self.mark_move) def set_header_width_settings(self): header = self.header() header.setStretchLastSection(False) header.setSectionResizeMode(self.tree_model.NAME, QtWidgets.QHeaderView.ResizeToContents) header.setSectionResizeMode(self.tree_model.DATE, QtWidgets.QHeaderView.Interactive) header.setSectionResizeMode(self.tree_model.REVNO, QtWidgets.QHeaderView.Interactive) header.setSectionResizeMode(self.tree_model.MESSAGE, QtWidgets.QHeaderView.Stretch) header.setSectionResizeMode(self.tree_model.AUTHOR, QtWidgets.QHeaderView.Interactive) header.setSectionResizeMode(self.tree_model.STATUS, QtWidgets.QHeaderView.Stretch) fm = self.fontMetrics() # XXX Make this dynamic. col_margin = (self.style().pixelMetric(QtWidgets.QStyle.PM_FocusFrameHMargin, None, self) + 1) * 2 header.resizeSection(self.tree_model.REVNO, fm.width("8" * self.revno_item_delegate.max_mainline_digits + ".8.888") + col_margin) header.resizeSection(self.tree_model.DATE, fm.width("88-88-8888 88:88") + col_margin) header.resizeSection(self.tree_model.AUTHOR, fm.width("Joe I have a Long Name") + col_margin) if self.tree and isinstance(self.tree, WorkingTree): header.setSectionResizeMode(self.tree_model.NAME, QtWidgets.QHeaderView.Stretch) header.setSectionResizeMode(self.tree_model.STATUS, QtWidgets.QHeaderView.ResizeToContents) def set_visible_headers(self): header = self.header() if isinstance(self.tree, WorkingTree): # We currently have to hide the revision columns, because the # revision property is not availible from the WorkingTree.inventory. # We may be able to get this by looking at the revision tree for # the revision of the basis tree. header.hideSection(self.tree_model.DATE) header.hideSection(self.tree_model.REVNO) header.hideSection(self.tree_model.MESSAGE) header.hideSection(self.tree_model.AUTHOR) header.showSection(self.tree_model.STATUS) header.setSectionResizeMode(self.tree_model.NAME, QtWidgets.QHeaderView.Stretch) header.setSectionResizeMode(self.tree_model.STATUS, QtWidgets.QHeaderView.ResizeToContents) self.context_menu.setDefaultAction(self.action_open_file) else: header.showSection(self.tree_model.DATE) header.showSection(self.tree_model.REVNO) header.showSection(self.tree_model.MESSAGE) header.showSection(self.tree_model.AUTHOR) header.hideSection(self.tree_model.STATUS) header.setSectionResizeMode(self.tree_model.NAME, QtWidgets.QHeaderView.ResizeToContents) header.setSectionResizeMode(self.tree_model.STATUS, QtWidgets.QHeaderView.Stretch) self.context_menu.setDefaultAction(self.action_show_file) def set_tree(self, tree, branch=None, changes_mode=False, want_unversioned=True, initial_checked_paths=None, change_load_filter=None): """Causes a tree to be loaded, and displayed in the widget. @param changes_mode: If in changes mode, a list of changes, and unversioned items, rather than a tree, is diplayed. e.g., when not in changes mode, one will get: dir1 file1 changed file2 changed but when in changes mode, one will get: dir1/file1 changed file2 changed When in changes mode, no unchanged items are shown. @param initial_checked_paths: list of specific filenames which should be selected in the widget. By default all items selected. Value None or empty list means: all selected. """ self.tree = tree 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 self.change_load_filter = change_load_filter if branch: with branch.lock_read(): last_revno = branch.last_revision_info()[0] self.revno_item_delegate.set_max_revno(last_revno) # update width uncoditionally because we may change the revno column self.set_header_width_settings() self.set_visible_headers() QtCore.QCoreApplication.processEvents() if initial_checked_paths and not self.tree_model.checkable: raise AttributeError("You can't have a initial_selection if tree_model.checkable is not True.") self.tree_model.set_tree(self.tree, self.branch, changes_mode, want_unversioned=want_unversioned, change_load_filter=self.change_load_filter, initial_checked_paths=initial_checked_paths) if self.tree_model.checkable: refs = self.tree_model.iter_checked() indexes = self.tree_model.refs2indexes(refs) self.expanded_to_indexes(indexes) if sys.platform.startswith("win"): # This is to fix Bug 402276, where the treewidget does not get # repainted when you scroll. # (https://bugs.launchpad.net/qbrz/+bug/402276) # I think that this is a bug with qt, and so this is just a work- # arround. We should check when we bump the min qt version to 4.5 if # we can take this out. I think it only happens on windows. This may # need to be checked. # RJLRJL: review this for the ignored / select all checkboxes which # suffer the same non-repainting problem for row in range(len(self.tree_model.inventory_data[0].children_ids)): index = self.tree_model.createIndex(row, self.tree_model.NAME, 0) self.tree_model.dataChanged.emit(index, index) def iter_expanded_indexes(self): parents_to_check = [QtCore.QModelIndex()] while parents_to_check: parent = parents_to_check.pop(0) for row in range(self.tree_filter_model.rowCount(parent)): child = self.tree_filter_model.index(row, 0, parent) if self.isExpanded(child): parents_to_check.append(child) yield self.tree_filter_model.mapToSource(child) def set_expanded_indexes(self, indexes): for index in indexes: self.expand(self.tree_filter_model.mapFromSource(index)) def expanded_to_indexes(self, indexes): for index in indexes: while index.internalId(): self.expand(self.tree_filter_model.mapFromSource(index)) index = self.tree_model.parent(index) def get_state(self): if self.tree_model.checkable: checked = [(self.tree_model.item2ref(item_data), item_data.checked) for item_data in self.tree_model.inventory_data[1:]] else: checked = None expanded = self.tree_model.indexes2refs(self.iter_expanded_indexes()) selected = self.tree_model.indexes2refs(self.get_selection_indexes()) v_scroll = self.verticalScrollBar().value() return checked, expanded, selected, v_scroll def restore_state(self, state): (checked, expanded, selected, v_scroll) = state with self.tree.lock_read(): if self.tree_model.checkable and checked is not None: for (ref, state) in checked: if not state == QtCore.Qt.PartiallyChecked: try: index = self.tree_model.ref2index(ref) self.tree_model.setData(index, state, QtCore.Qt.CheckStateRole) except (errors.NoSuchId, NoSuchFile): pass self.set_expanded_indexes(self.tree_model.refs2indexes(expanded, ignore_no_file_error=True)) for index in self.tree_model.refs2indexes(selected, ignore_no_file_error=True): # XXX This does not work for sub items. I can't figure out why. # GaryvdM - 14/07/2009 # RJLRJL I can't either (2021 / 2023) self.selectionModel().select( self.tree_filter_model.mapFromSource(index), QtCore.QItemSelectionModel.SelectCurrent | QtCore.QItemSelectionModel.Rows) self.verticalScrollBar().setValue(v_scroll) def refresh(self): with self.tree.lock_read(): state = self.get_state() self.tree_model.set_tree(self.tree, self.branch, self.changes_mode, self.want_unversioned, change_load_filter=self.change_load_filter, load_dirs=state[1]) self.restore_state(state) self.tree_filter_model.invalidateFilter() def mousePressEvent(self, event): index = self.indexAt(event.pos()) if not isinstance(self.tree, WorkingTree): self.setDragEnabled(False) if not self.selectionModel().isSelected(index): # Don't drag if we are not over the selection. self.setDragEnabled(False) else: # Don't allow draging a selection that goes across dirs. ok_selection = True item_by_path = {} item_ids = set() for item in self.get_selection_items(): item_by_path[item.path] = item item_ids.add(item.id) root_dir = None for path in minimum_path_selection(list(item_by_path.keys())): dir_path, name = os.path.split(path) if root_dir is None: root_dir = dir_path if dir_path != root_dir: ok_selection = False break item = item_by_path[path] if item.item.kind == "directory" and item.children_ids: # Either all, or none of the children must be selected. first = None for child_id in item.children_ids: this = child_id in item_ids if first is None: first = this if first != this: ok_selection = False break if not ok_selection: break self.setDragEnabled(ok_selection) QtWidgets.QTreeView.mousePressEvent(self, event) def dropEvent(self, event): if not isinstance(self.tree, WorkingTree): return # we should encode the paths list, give it an appropriate mime type, etc. # Easier to just get the selection. drop_index = self.tree_filter_model.mapToSource(self.indexAt(event.pos())) drop_item = self.tree_model.inventory_data[drop_index.internalId()] if drop_item.item.kind == "directory": drop_path = drop_item.path else: drop_path, name = os.path.split(drop_item.path) paths = [item.path for item in self.get_selection_items()] try: self.tree.move(paths, drop_path) except Exception: report_exception(type=SUB_LOAD_METHOD, window=self.window()) self.refresh() def contextMenuEvent(self, event): self.filter_context_menu() self.context_menu.popup(event.globalPos()) event.accept() def keyPressEvent(self, event): """Processing Enter key to launch default action for files and expand/collapse directories. """ e_key = event.key() if e_key in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return): if not self.state() & QtWidgets.QAbstractItemView.EditingState: event.accept() indexes = self.selectionModel().selectedRows(0) if len(indexes) == 1 and self.get_selection_items(indexes)[0].item.kind == 'directory': self.setExpanded(indexes[0], not self.isExpanded(indexes[0])) else: self.do_default_action(None) return QtWidgets.QTreeView.keyPressEvent(self, event) def get_selection_indexes(self, indexes=None): if indexes is None or (len(indexes) == 1 and indexes[0] is None): indexes = self.selectionModel().selectedRows(0) return [self.tree_filter_model.mapToSource(index) for index in indexes] def get_selection_items(self, indexes=None): items = [] indexes = self.get_selection_indexes(indexes) for index in indexes: items.append(self.tree_model.inventory_data[index.internalId()]) return items def filter_context_menu(self): is_working_tree = isinstance(self.tree, WorkingTree) items = self.get_selection_items() versioned = [item.item.file_id is not None for item in items] changed = [item.change is not None for item in items] versioned_changed = [ver and ch for ver,ch in zip(versioned, changed)] conflicts = [len(item.conflicts) > 0 for item in items] text_conflicts = [len([conflicts for conflict in item.conflicts if isinstance(conflict, TextConflict)]) > 0 for item in items] on_disk = [item.change is None or item.change.is_on_disk() for item in items] selection_len = len(items) single_item_in_tree = (selection_len == 1 and (items[0].change is None or items[0].change[6][1] is not None)) single_file = (single_item_in_tree and items[0].item.kind == "file") single_versioned_file = (single_file and versioned[0]) self.action_open_file.setEnabled(single_item_in_tree) self.action_show_file.setEnabled(single_file) self.action_show_annotate.setEnabled(single_versioned_file) self.action_show_log.setEnabled(any(versioned)) self.action_show_diff.setVisible(is_working_tree) self.action_show_diff.setEnabled(any(versioned_changed)) self.action_merge.setVisible(is_working_tree) self.action_merge.setEnabled(any(text_conflicts)) self.action_resolve.setVisible(is_working_tree) self.action_resolve.setEnabled(any(conflicts)) self.action_add.setVisible(is_working_tree) self.action_add.setDisabled(all(versioned)) self.action_revert.setVisible(is_working_tree) self.action_revert.setEnabled(any(versioned_changed)) self.action_rename.setVisible(is_working_tree) self.action_rename.setEnabled(single_item_in_tree) self.action_remove.setVisible(is_working_tree) self.action_remove.setEnabled(any(on_disk)) can_mark_move = (selection_len == 2 and (missing_unversioned(items[0], items[1]) or missing_unversioned(items[1], items[0]))) self.action_mark_move.setVisible(can_mark_move) if can_mark_move: move, rename = move_or_rename(items[0].path, items[1].path) if move and rename: self.action_mark_move.setText(gettext("&Mark as moved and renamed")) elif move: self.action_mark_move.setText(gettext("&Mark as moved")) elif rename: self.action_mark_move.setText(gettext("&Mark as renamed")) if is_working_tree: if any(versioned_changed): self.context_menu.setDefaultAction(self.action_show_diff) else: self.context_menu.setDefaultAction(self.action_open_file) def do_default_action(self, index): # XXX This should be made to handle selections of multiple items. item_data = self.get_selection_items([index])[0] if item_data.item.kind == "directory": # Don't do anything, so that the directory can be expanded. return if isinstance(self.tree, WorkingTree): if item_data.change is not None and item_data.change.is_versioned(): self.show_differences(index=index) else: self.open_file(index) else: self.show_file_content(index) @ui_current_widget def show_file_content(self, index=None): """Launch qcat for one selected file.""" items = self.get_selection_items([index]) if not len(items) == 1: return item = items[0] encoding = get_set_encoding(None, self.branch) if item.item.file_id is not None: window = QBzrCatWindow(filename=item.path, tree=self.tree, parent=self, encoding=encoding) else: abspath = os.path.join(self.tree.basedir, item.path) window = QBzrViewWindow(filename=abspath, encoding=encoding, parent=self) window.show() self.window().windows.append(window) @ui_current_widget def open_file(self, index=None): """Open the file in the os specified editor.""" items = self.get_selection_items([index]) if not len(items) == 1: return item = items[0] if isinstance(self.tree, WorkingTree): with self.tree.lock_read(): abspath = self.tree.abspath(item.path) url = QtCore.QUrl.fromLocalFile(abspath) QtGui.QDesktopServices.openUrl(url) else: cat_to_native_app(self.tree, item.path) @ui_current_widget def show_file_log(self): """Show qlog for one selected file(s).""" items = self.get_selection_items() fileids = [item.item.file_id for item in items if item.item.file_id is not None] window = LogWindow(branch=self.branch,specific_file_ids=fileids) window.show() self.window().windows.append(window) @ui_current_widget def show_file_annotate(self): """Show qannotate for selected file.""" index = self.currentIndex() file_id = bytes(index.data(self.tree_model.FILEID)) path = str(index.data(self.tree_model.PATH)) if isinstance(file_id, str): raise errors.InternalBzrError('file_id should be plain string, not unicode') window = AnnotateWindow(self.branch, None, self.tree, path, file_id) window.show() self.window().windows.append(window) @ui_current_widget def show_differences(self, ext_diff=None, index=None): """Show differences for selected file(s).""" items = self.get_selection_items([index]) if len(items) > 0: # Only paths that have changes. paths = [item.path for item in items if item.change is not None] else: # Show all. paths = None arg_provider = InternalWTDiffArgProvider(None, self.tree, self.tree.branch, self.tree.branch, specific_files=paths) show_diff(arg_provider, ext_diff=ext_diff, parent_window=self.window(), context=self.diff_context) 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): """Add selected file(s).""" items = self.get_selection_items() # Only paths that are not versioned. paths = [] for item in items: paths.extend(self.unversioned_parents_paths(item)) if len(paths) == 0: return try: self.tree.add(paths) except Exception: report_exception(type=SUB_LOAD_METHOD, window=self.window()) # XXX - it would be good it we could just refresh the selected items self.refresh() @ui_current_widget def revert(self): """Revert selected file(s).""" items = self.get_selection_items() # Only paths that have changes. paths = [item.path for item in items if item.change is not None and item.item.file_id is not None] if len(paths) == 0: return res = QtWidgets.QMessageBox.question(self, gettext("Revert"), gettext("Do you really want to revert the selected file(s)?"), QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) if res == QtWidgets.QMessageBox.Yes: try: with self.tree.lock_write(): self.tree.revert(paths, self.tree.basis_tree()) except Exception: report_exception(type=SUB_LOAD_METHOD, window=self.window()) # XXX - it would be good it we could just refresh the selected items self.refresh() @ui_current_widget def merge(self): """Merge conflicting file in external merge app""" items = self.get_selection_items() # Only paths that have text conflicts. paths = [item.path for item in items if len([conflict for conflict in item.conflicts if isinstance(conflict, TextConflict)]) > 0] if len(paths) == 0: return args = ["extmerge"] args.extend(paths) desc = " ".join(args) SimpleSubProcessDialog(gettext("External Merge"), desc=desc, args=args, dir=self.tree.basedir, parent=self, auto_start_show_on_failed=True, hide_progress=True,) # RJLRJL: Check that the comment below is warranted # We don't refesh the tree, because it is very unlikley to have changed. def resolve(self): """Mark selected file(s) as resolved.""" items = self.get_selection_items() # Only paths that have changes. paths = [item.path for item in items if len(item.conflicts) > 0] if len(paths) == 0: return try: resolve(self.tree, paths) except Exception: report_exception(type=SUB_LOAD_METHOD, window=self.window()) self.refresh() def mark_move(self): items = self.get_selection_items() if len(items) != 2: return if missing_unversioned(items[0], items[1]): old = items[0] new = items[1] elif missing_unversioned(items[1], items[0]): old = items[1] new = items[0] else: return try: # add the new parent self.tree.add(self.unversioned_parents_paths(new, False)) self.tree.rename_one(old.path, new.path, after=True) except Exception: report_exception(type=SUB_LOAD_METHOD, window=self.window()) self.refresh() @ui_current_widget def rename(self): """Rename the selected file.""" indexes = self.get_selection_indexes() if len(indexes) != 1: return index = indexes[0] index = self.tree_filter_model.mapFromSource(index) self.edit(index) @ui_current_widget def remove(self): """Remove selected file(s).""" items = self.get_selection_items() # Only paths that are not missing paths = [item.path for item in items if item.change is None or item.change.is_on_disk()] if len(paths) == 0: return try: try: self.tree.remove(paths, keep_files=False) except errors.BzrRemoveChangedFilesError: # RJL: BUGBUG seems to no longer be a BzrRemoveChangedFilesError res = QtWidgets.QMessageBox.question( self, gettext("Remove"), gettext("Some of the files selected cannot be recovered if " "removed. Are you sure you want to remove these " "files?"), QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) if res == QtWidgets.QMessageBox.Yes: self.tree.remove(paths, keep_files=False, force=True) except Exception: report_exception(type=SUB_LOAD_METHOD, window=self.window()) self.refresh() class SelectAllCheckBox(QtWidgets.QCheckBox): clicked = QtCore.pyqtSignal(bool) def __init__(self, tree_widget, parent=None): super().__init__(text=gettext("Select / deselect all"), parent=parent) self.tree_widget = tree_widget # self.setTristate(True) tree_widget.tree_model.dataChanged[QtCore.QModelIndex, QtCore.QModelIndex].connect(self.on_data_changed) # RJLRJL: changed from clicked[bool] to toggled for pyqt5 self.toggled[bool].connect(self._clicked) def on_data_changed(self, start_index, end_index): self.update_state() def update_state(self): model = self.tree_widget.tree_model root_index = model._index_from_id(0, model.NAME) state = model.data(root_index, QtCore.Qt.CheckStateRole) self.setCheckState(QtCore.Qt.CheckState(state)) def _clicked(self, state): model = self.tree_widget.tree_model root_index = model._index_from_id(0, model.NAME) if state: state = QtCore.Qt.Checked else: state = QtCore.Qt.Unchecked model.setData(root_index, state, QtCore.Qt.CheckStateRole) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/ui_bookmark.py0000644000000000000000000000441214556556456014265 0ustar00# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/bookmark.ui' # # Created by: PyQt5 UI code generator 5.12.3 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext class Ui_BookmarkDialog(object): def setupUi(self, BookmarkDialog): BookmarkDialog.setObjectName("BookmarkDialog") BookmarkDialog.resize(354, 90) self.vboxlayout = QtWidgets.QVBoxLayout(BookmarkDialog) self.vboxlayout.setObjectName("vboxlayout") self.gridlayout = QtWidgets.QGridLayout() self.gridlayout.setObjectName("gridlayout") self.label = QtWidgets.QLabel(BookmarkDialog) self.label.setObjectName("label") self.gridlayout.addWidget(self.label, 0, 0, 1, 1) self.name = QtWidgets.QLineEdit(BookmarkDialog) self.name.setObjectName("name") self.gridlayout.addWidget(self.name, 0, 1, 1, 1) self.label_2 = QtWidgets.QLabel(BookmarkDialog) self.label_2.setObjectName("label_2") self.gridlayout.addWidget(self.label_2, 1, 0, 1, 1) self.location = QtWidgets.QLineEdit(BookmarkDialog) self.location.setObjectName("location") self.gridlayout.addWidget(self.location, 1, 1, 1, 1) self.vboxlayout.addLayout(self.gridlayout) spacerItem = QtWidgets.QSpacerItem(336, 16, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem) self.buttonBox = QtWidgets.QDialogButtonBox(BookmarkDialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setObjectName("buttonBox") self.vboxlayout.addWidget(self.buttonBox) self.label.setBuddy(self.name) self.label_2.setBuddy(self.location) self.retranslateUi(BookmarkDialog) self.buttonBox.accepted.connect(BookmarkDialog.accept) self.buttonBox.rejected.connect(BookmarkDialog.reject) QtCore.QMetaObject.connectSlotsByName(BookmarkDialog) def retranslateUi(self, BookmarkDialog): _translate = QtCore.QCoreApplication.translate self.label.setText(_translate("BookmarkDialog", "&Name:")) self.label_2.setText(_translate("BookmarkDialog", "&Location:")) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/ui_branch.py0000644000000000000000000001314114556556456013714 0ustar00# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/branch.ui' # # Created by: PyQt5 UI code generator 5.12.3 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext class Ui_BranchForm(object): def setupUi(self, BranchForm): BranchForm.setObjectName("BranchForm") BranchForm.resize(349, 245) self.verticalLayout = QtWidgets.QVBoxLayout(BranchForm) self.verticalLayout.setObjectName("verticalLayout") self.groupBox = QtWidgets.QGroupBox(BranchForm) self.groupBox.setObjectName("groupBox") self.formLayout = QtWidgets.QFormLayout(self.groupBox) self.formLayout.setFieldGrowthPolicy(QtWidgets.QFormLayout.AllNonFixedFieldsGrow) self.formLayout.setObjectName("formLayout") self.from_label = QtWidgets.QLabel(self.groupBox) self.from_label.setObjectName("from_label") self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.from_label) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.from_location = QtWidgets.QComboBox(self.groupBox) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.from_location.sizePolicy().hasHeightForWidth()) self.from_location.setSizePolicy(sizePolicy) self.from_location.setEditable(True) self.from_location.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToContentsOnFirstShow) self.from_location.setObjectName("from_location") self.horizontalLayout_2.addWidget(self.from_location) self.from_picker = QtWidgets.QPushButton(self.groupBox) self.from_picker.setObjectName("from_picker") self.horizontalLayout_2.addWidget(self.from_picker) self.horizontalLayout_2.setStretch(0, 1) self.formLayout.setLayout(0, QtWidgets.QFormLayout.FieldRole, self.horizontalLayout_2) self.to_label = QtWidgets.QLabel(self.groupBox) self.to_label.setObjectName("to_label") self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.to_label) self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.to_location = QtWidgets.QComboBox(self.groupBox) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.to_location.sizePolicy().hasHeightForWidth()) self.to_location.setSizePolicy(sizePolicy) self.to_location.setEditable(True) self.to_location.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToContentsOnFirstShow) self.to_location.setObjectName("to_location") self.horizontalLayout_3.addWidget(self.to_location) self.to_picker = QtWidgets.QPushButton(self.groupBox) self.to_picker.setObjectName("to_picker") self.horizontalLayout_3.addWidget(self.to_picker) self.horizontalLayout_3.setStretch(0, 1) self.formLayout.setLayout(1, QtWidgets.QFormLayout.FieldRole, self.horizontalLayout_3) self.verticalLayout.addWidget(self.groupBox) self.groupBox_2 = QtWidgets.QGroupBox(BranchForm) self.groupBox_2.setObjectName("groupBox_2") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox_2) self.verticalLayout_2.setObjectName("verticalLayout_2") self.bind = QtWidgets.QCheckBox(self.groupBox_2) self.bind.setObjectName("bind") self.verticalLayout_2.addWidget(self.bind) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.revision_label = QtWidgets.QLabel(self.groupBox_2) self.revision_label.setObjectName("revision_label") self.horizontalLayout.addWidget(self.revision_label) self.revision = QtWidgets.QLineEdit(self.groupBox_2) self.revision.setObjectName("revision") self.horizontalLayout.addWidget(self.revision) spacerItem = QtWidgets.QSpacerItem(78, 37, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.verticalLayout_2.addLayout(self.horizontalLayout) self.verticalLayout.addWidget(self.groupBox_2) self.from_label.setBuddy(self.from_location) self.to_label.setBuddy(self.to_location) self.revision_label.setBuddy(self.revision) self.retranslateUi(BranchForm) BranchForm.disableUi['bool'].connect(self.groupBox.setDisabled) QtCore.QMetaObject.connectSlotsByName(BranchForm) def retranslateUi(self, BranchForm): _translate = QtCore.QCoreApplication.translate BranchForm.setWindowTitle(_translate("BranchForm", "Branch")) self.groupBox.setTitle(_translate("BranchForm", "Locations")) self.from_label.setText(_translate("BranchForm", "&From:")) self.from_picker.setText(_translate("BranchForm", "Browse...")) self.to_label.setText(_translate("BranchForm", "&To:")) self.to_picker.setText(_translate("BranchForm", "Browse...")) self.groupBox_2.setTitle(_translate("BranchForm", "Options")) self.bind.setText(_translate("BranchForm", "Bind new branch to parent location")) self.revision_label.setText(_translate("BranchForm", "&Revision:")) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/ui_info.py0000644000000000000000000001112514556556456013412 0ustar00# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/info.ui' # # Created by: PyQt5 UI code generator 5.12.3 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext class Ui_InfoForm(object): def setupUi(self, InfoForm): InfoForm.setObjectName("InfoForm") InfoForm.resize(579, 266) self.verticalLayout = QtWidgets.QVBoxLayout(InfoForm) self.verticalLayout.setObjectName("verticalLayout") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.label_2 = QtWidgets.QLabel(InfoForm) self.label_2.setObjectName("label_2") self.horizontalLayout.addWidget(self.label_2) self.local_location = QtWidgets.QLabel(InfoForm) self.local_location.setWordWrap(False) self.local_location.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByKeyboard|QtCore.Qt.TextSelectableByMouse) self.local_location.setObjectName("local_location") self.horizontalLayout.addWidget(self.local_location) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.verticalLayout.addLayout(self.horizontalLayout) self.tabWidget = QtWidgets.QTabWidget(InfoForm) self.tabWidget.setObjectName("tabWidget") self.tab_basic = QtWidgets.QWidget() self.tab_basic.setObjectName("tab_basic") self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.tab_basic) self.verticalLayout_5.setObjectName("verticalLayout_5") self.frame = QtWidgets.QFrame(self.tab_basic) self.frame.setFrameShape(QtWidgets.QFrame.NoFrame) self.frame.setFrameShadow(QtWidgets.QFrame.Plain) self.frame.setLineWidth(1) self.frame.setObjectName("frame") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.frame) self.verticalLayout_3.setObjectName("verticalLayout_3") self.basic_info = QtWidgets.QLabel(self.frame) self.basic_info.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.basic_info.setObjectName("basic_info") self.verticalLayout_3.addWidget(self.basic_info) self.verticalLayout_5.addWidget(self.frame) self.tabWidget.addTab(self.tab_basic, "") self.tab_detailed = QtWidgets.QWidget() self.tab_detailed.setObjectName("tab_detailed") self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.tab_detailed) self.verticalLayout_6.setObjectName("verticalLayout_6") self.scrollArea = QtWidgets.QScrollArea(self.tab_detailed) self.scrollArea.setFrameShape(QtWidgets.QFrame.NoFrame) self.scrollArea.setFrameShadow(QtWidgets.QFrame.Plain) self.scrollArea.setLineWidth(1) self.scrollArea.setWidgetResizable(True) self.scrollArea.setObjectName("scrollArea") self.scrollAreaWidgetContents = QtWidgets.QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 539, 179)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents) self.verticalLayout_2.setObjectName("verticalLayout_2") self.detailed_info = QtWidgets.QLabel(self.scrollAreaWidgetContents) self.detailed_info.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.detailed_info.setObjectName("detailed_info") self.verticalLayout_2.addWidget(self.detailed_info) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.verticalLayout_6.addWidget(self.scrollArea) self.tabWidget.addTab(self.tab_detailed, "") self.verticalLayout.addWidget(self.tabWidget) self.retranslateUi(InfoForm) self.tabWidget.setCurrentIndex(1) QtCore.QMetaObject.connectSlotsByName(InfoForm) def retranslateUi(self, InfoForm): _translate = QtCore.QCoreApplication.translate self.label_2.setText(_translate("InfoForm", "Location:")) self.local_location.setText(_translate("InfoForm", "...")) self.basic_info.setText(_translate("InfoForm", "Info")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_basic), _translate("InfoForm", "&Basic")) self.detailed_info.setText(_translate("InfoForm", "Info")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_detailed), _translate("InfoForm", "&Detailed")) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/ui_init.py0000644000000000000000000002161114556556456013423 0ustar00# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/init.ui' # # Created by: PyQt5 UI code generator 5.12.3 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext class Ui_InitForm(object): def setupUi(self, InitForm): InitForm.setObjectName("InitForm") InitForm.resize(417, 351) self.verticalLayout = QtWidgets.QVBoxLayout(InitForm) self.verticalLayout.setContentsMargins(9, 9, 9, 9) self.verticalLayout.setObjectName("verticalLayout") self.groupBox_3 = QtWidgets.QGroupBox(InitForm) self.groupBox_3.setObjectName("groupBox_3") self.horizontalLayout = QtWidgets.QHBoxLayout(self.groupBox_3) self.horizontalLayout.setObjectName("horizontalLayout") self.location = QtWidgets.QLineEdit(self.groupBox_3) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.location.sizePolicy().hasHeightForWidth()) self.location.setSizePolicy(sizePolicy) self.location.setObjectName("location") self.horizontalLayout.addWidget(self.location) self.location_picker = QtWidgets.QPushButton(self.groupBox_3) self.location_picker.setObjectName("location_picker") self.horizontalLayout.addWidget(self.location_picker) self.verticalLayout.addWidget(self.groupBox_3) self.groupBox = QtWidgets.QGroupBox(InitForm) self.groupBox.setObjectName("groupBox") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.groupBox) self.verticalLayout_3.setObjectName("verticalLayout_3") self.but_init = QtWidgets.QRadioButton(self.groupBox) self.but_init.setChecked(True) self.but_init.setObjectName("but_init") self.verticalLayout_3.addWidget(self.but_init) self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") spacerItem = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem) self.but_append_only = QtWidgets.QCheckBox(self.groupBox) self.but_append_only.setObjectName("but_append_only") self.horizontalLayout_3.addWidget(self.but_append_only) self.verticalLayout_3.addLayout(self.horizontalLayout_3) self.radioButton_2 = QtWidgets.QRadioButton(self.groupBox) self.radioButton_2.setObjectName("radioButton_2") self.verticalLayout_3.addWidget(self.radioButton_2) self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_4.setObjectName("horizontalLayout_4") spacerItem1 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_4.addItem(spacerItem1) self.but_no_trees = QtWidgets.QCheckBox(self.groupBox) self.but_no_trees.setEnabled(False) self.but_no_trees.setObjectName("but_no_trees") self.horizontalLayout_4.addWidget(self.but_no_trees) self.verticalLayout_3.addLayout(self.horizontalLayout_4) self.link_help = QtWidgets.QLabel(self.groupBox) self.link_help.setObjectName("link_help") self.verticalLayout_3.addWidget(self.link_help) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.label = QtWidgets.QLabel(self.groupBox) self.label.setObjectName("label") self.horizontalLayout_2.addWidget(self.label) self.combo_format = QtWidgets.QComboBox(self.groupBox) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.combo_format.sizePolicy().hasHeightForWidth()) self.combo_format.setSizePolicy(sizePolicy) self.combo_format.setObjectName("combo_format") self.horizontalLayout_2.addWidget(self.combo_format) self.verticalLayout_3.addLayout(self.horizontalLayout_2) self.scrollArea = QtWidgets.QScrollArea(self.groupBox) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.scrollArea.sizePolicy().hasHeightForWidth()) self.scrollArea.setSizePolicy(sizePolicy) self.scrollArea.setWidgetResizable(True) self.scrollArea.setObjectName("scrollArea") self.scrollAreaWidgetContents = QtWidgets.QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 377, 60)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents) self.verticalLayout_2.setContentsMargins(4, 4, 4, 4) self.verticalLayout_2.setObjectName("verticalLayout_2") self.format_desc = QtWidgets.QLabel(self.scrollAreaWidgetContents) self.format_desc.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.format_desc.setWordWrap(True) self.format_desc.setObjectName("format_desc") self.verticalLayout_2.addWidget(self.format_desc) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.verticalLayout_3.addWidget(self.scrollArea) self.link_help_formats = QtWidgets.QLabel(self.groupBox) self.link_help_formats.setObjectName("link_help_formats") self.verticalLayout_3.addWidget(self.link_help_formats) self.verticalLayout.addWidget(self.groupBox) self.retranslateUi(InitForm) self.link_help.linkActivated['QString'].connect(InitForm.linkActivated) self.link_help_formats.linkActivated['QString'].connect(InitForm.linkActivated) InitForm.disableUi['bool'].connect(self.groupBox_3.setDisabled) InitForm.disableUi['bool'].connect(self.groupBox.setDisabled) self.but_init.toggled['bool'].connect(self.but_append_only.setEnabled) self.radioButton_2.toggled['bool'].connect(self.but_no_trees.setEnabled) QtCore.QMetaObject.connectSlotsByName(InitForm) def retranslateUi(self, InitForm): _translate = QtCore.QCoreApplication.translate InitForm.setWindowTitle(_translate("InitForm", "Initialize")) self.groupBox_3.setTitle(_translate("InitForm", "Local Directory")) self.location_picker.setText(_translate("InitForm", "Browse...")) self.groupBox.setTitle(_translate("InitForm", "Repository")) self.but_init.setText(_translate("InitForm", "Create a new standalone tree")) self.but_append_only.setText(_translate("InitForm", "Ensure all revisions are appended to the log")) self.radioButton_2.setText(_translate("InitForm", "Create a new shared repository")) self.but_no_trees.setText(_translate("InitForm", "Skip the creation of working trees in this repository")) self.link_help.setText(_translate("InitForm", "\n" "\n" "

Tell me more about standalone trees, repositories and branches.

")) self.label.setText(_translate("InitForm", "Repository Format:")) self.format_desc.setText(_translate("InitForm", "Description of format")) self.link_help_formats.setText(_translate("InitForm", "\n" "\n" "

More information about repository formats.

")) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/ui_merge.py0000644000000000000000000000676014556556456013567 0ustar00# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/merge.ui' # # Created by: PyQt5 UI code generator 5.12.3 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext class Ui_MergeForm(object): def setupUi(self, MergeForm): MergeForm.setObjectName("MergeForm") MergeForm.resize(448, 248) self.verticalLayout = QtWidgets.QVBoxLayout(MergeForm) self.verticalLayout.setContentsMargins(9, 9, 9, 9) self.verticalLayout.setObjectName("verticalLayout") self.groupBox = QtWidgets.QGroupBox(MergeForm) self.groupBox.setObjectName("groupBox") self.gridLayout = QtWidgets.QGridLayout(self.groupBox) self.gridLayout.setObjectName("gridLayout") self.label_4 = QtWidgets.QLabel(self.groupBox) self.label_4.setObjectName("label_4") self.gridLayout.addWidget(self.label_4, 0, 0, 1, 1) self.location = QtWidgets.QComboBox(self.groupBox) self.location.setEditable(True) self.location.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToMinimumContentsLength) self.location.setObjectName("location") self.gridLayout.addWidget(self.location, 0, 1, 1, 2) self.location_picker = QtWidgets.QPushButton(self.groupBox) self.location_picker.setObjectName("location_picker") self.gridLayout.addWidget(self.location_picker, 0, 3, 1, 1) self.label_3 = QtWidgets.QLabel(self.groupBox) self.label_3.setObjectName("label_3") self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) self.revision = QtWidgets.QLineEdit(self.groupBox) self.revision.setObjectName("revision") self.gridLayout.addWidget(self.revision, 1, 1, 1, 1) spacerItem = QtWidgets.QSpacerItem(107, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem, 1, 2, 1, 2) self.remember = QtWidgets.QCheckBox(self.groupBox) self.remember.setObjectName("remember") self.gridLayout.addWidget(self.remember, 2, 0, 1, 4) self.force = QtWidgets.QCheckBox(self.groupBox) self.force.setObjectName("force") self.gridLayout.addWidget(self.force, 3, 0, 1, 4) self.uncommitted = QtWidgets.QCheckBox(self.groupBox) self.uncommitted.setObjectName("uncommitted") self.gridLayout.addWidget(self.uncommitted, 4, 0, 1, 4) self.verticalLayout.addWidget(self.groupBox) self.label_4.setBuddy(self.revision) self.label_3.setBuddy(self.revision) self.retranslateUi(MergeForm) MergeForm.disableUi['bool'].connect(self.groupBox.setDisabled) QtCore.QMetaObject.connectSlotsByName(MergeForm) def retranslateUi(self, MergeForm): _translate = QtCore.QCoreApplication.translate MergeForm.setWindowTitle(_translate("MergeForm", "Merge")) self.groupBox.setTitle(_translate("MergeForm", "Options")) self.label_4.setText(_translate("MergeForm", "&Location:")) self.location_picker.setText(_translate("MergeForm", "Browse...")) self.label_3.setText(_translate("MergeForm", "&Revision:")) self.remember.setText(_translate("MergeForm", "Remember this location as a default")) self.force.setText(_translate("MergeForm", "Merge even if the working tree has uncommitted changes")) self.uncommitted.setText(_translate("MergeForm", "Merge uncommitted changes instead of committed ones")) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/ui_merge_config.py0000644000000000000000000000621514556556456015107 0ustar00# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/merge_config.ui' # # Created by: PyQt5 UI code generator 5.12.3 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext class Ui_MergeConfig(object): def setupUi(self, MergeConfig): MergeConfig.setObjectName("MergeConfig") MergeConfig.resize(544, 330) self.verticalLayout = QtWidgets.QVBoxLayout(MergeConfig) self.verticalLayout.setObjectName("verticalLayout") self.groupBox = QtWidgets.QGroupBox(MergeConfig) self.groupBox.setObjectName("groupBox") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox) self.verticalLayout_2.setObjectName("verticalLayout_2") self.tools = QtWidgets.QTableView(self.groupBox) self.tools.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.tools.setShowGrid(False) self.tools.setObjectName("tools") self.tools.horizontalHeader().setHighlightSections(False) self.tools.horizontalHeader().setStretchLastSection(True) self.tools.verticalHeader().setVisible(False) self.tools.verticalHeader().setDefaultSectionSize(15) self.tools.verticalHeader().setMinimumSectionSize(15) self.verticalLayout_2.addWidget(self.tools) self.widget = QtWidgets.QWidget(self.groupBox) self.widget.setObjectName("widget") self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget) self.horizontalLayout.setObjectName("horizontalLayout") spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.add = QtWidgets.QPushButton(self.widget) self.add.setObjectName("add") self.horizontalLayout.addWidget(self.add) self.remove = QtWidgets.QPushButton(self.widget) self.remove.setObjectName("remove") self.horizontalLayout.addWidget(self.remove) self.set_default = QtWidgets.QPushButton(self.widget) self.set_default.setObjectName("set_default") self.horizontalLayout.addWidget(self.set_default) spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem1) self.verticalLayout_2.addWidget(self.widget) self.verticalLayout.addWidget(self.groupBox) self.retranslateUi(MergeConfig) QtCore.QMetaObject.connectSlotsByName(MergeConfig) def retranslateUi(self, MergeConfig): _translate = QtCore.QCoreApplication.translate MergeConfig.setWindowTitle(_translate("MergeConfig", "Form")) self.groupBox.setTitle(_translate("MergeConfig", "External Merge Tools")) self.add.setText(_translate("MergeConfig", "Add")) self.remove.setText(_translate("MergeConfig", "Remove")) self.set_default.setToolTip(_translate("MergeConfig", "Sets the selected merge tool as the default to use in qconflicts.")) self.set_default.setText(_translate("MergeConfig", "Set Default")) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/ui_new_tree.py0000644000000000000000000002757414556556456014306 0ustar00# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/new_tree.ui' # # Created by: PyQt5 UI code generator 5.12.3 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext class Ui_NewWorkingTreeForm(object): def setupUi(self, NewWorkingTreeForm): NewWorkingTreeForm.setObjectName("NewWorkingTreeForm") NewWorkingTreeForm.resize(479, 385) self.verticalLayout = QtWidgets.QVBoxLayout(NewWorkingTreeForm) self.verticalLayout.setContentsMargins(9, 9, 9, 9) self.verticalLayout.setObjectName("verticalLayout") self.groupBox = QtWidgets.QGroupBox(NewWorkingTreeForm) self.groupBox.setObjectName("groupBox") self.gridLayout = QtWidgets.QGridLayout(self.groupBox) self.gridLayout.setObjectName("gridLayout") self.label_4 = QtWidgets.QLabel(self.groupBox) self.label_4.setObjectName("label_4") self.gridLayout.addWidget(self.label_4, 0, 0, 1, 2) self.from_location = QtWidgets.QComboBox(self.groupBox) self.from_location.setEditable(True) self.from_location.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToMinimumContentsLength) self.from_location.setObjectName("from_location") self.gridLayout.addWidget(self.from_location, 1, 0, 1, 1) self.from_picker = QtWidgets.QPushButton(self.groupBox) self.from_picker.setObjectName("from_picker") self.gridLayout.addWidget(self.from_picker, 1, 1, 1, 1) self.label = QtWidgets.QLabel(self.groupBox) font = QtGui.QFont() font.setUnderline(False) self.label.setFont(font) self.label.setOpenExternalLinks(False) self.label.setObjectName("label") self.gridLayout.addWidget(self.label, 2, 0, 1, 2) self.to_location = QtWidgets.QLineEdit(self.groupBox) self.to_location.setObjectName("to_location") self.gridLayout.addWidget(self.to_location, 3, 0, 1, 1) self.to_picker = QtWidgets.QPushButton(self.groupBox) self.to_picker.setObjectName("to_picker") self.gridLayout.addWidget(self.to_picker, 3, 1, 1, 1) self.verticalLayout.addWidget(self.groupBox) self.groupBox_3 = QtWidgets.QGroupBox(NewWorkingTreeForm) self.groupBox_3.setObjectName("groupBox_3") self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox_3) self.gridLayout_2.setObjectName("gridLayout_2") self.but_checkout = QtWidgets.QRadioButton(self.groupBox_3) self.but_checkout.setChecked(True) self.but_checkout.setObjectName("but_checkout") self.gridLayout_2.addWidget(self.but_checkout, 0, 0, 1, 2) spacerItem = QtWidgets.QSpacerItem(18, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.gridLayout_2.addItem(spacerItem, 1, 0, 1, 1) self.but_lightweight = QtWidgets.QCheckBox(self.groupBox_3) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.but_lightweight.sizePolicy().hasHeightForWidth()) self.but_lightweight.setSizePolicy(sizePolicy) self.but_lightweight.setObjectName("but_lightweight") self.gridLayout_2.addWidget(self.but_lightweight, 1, 1, 1, 1) self.but_branch = QtWidgets.QRadioButton(self.groupBox_3) self.but_branch.setObjectName("but_branch") self.gridLayout_2.addWidget(self.but_branch, 2, 0, 1, 2) spacerItem1 = QtWidgets.QSpacerItem(18, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.gridLayout_2.addItem(spacerItem1, 3, 0, 1, 1) self.but_stacked = QtWidgets.QCheckBox(self.groupBox_3) self.but_stacked.setEnabled(False) self.but_stacked.setObjectName("but_stacked") self.gridLayout_2.addWidget(self.but_stacked, 3, 1, 1, 1) self.link_help = QtWidgets.QLabel(self.groupBox_3) font = QtGui.QFont() font.setUnderline(True) self.link_help.setFont(font) self.link_help.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor)) self.link_help.setTextFormat(QtCore.Qt.RichText) self.link_help.setOpenExternalLinks(False) self.link_help.setTextInteractionFlags(QtCore.Qt.TextBrowserInteraction) self.link_help.setObjectName("link_help") self.gridLayout_2.addWidget(self.link_help, 4, 0, 1, 2) self.verticalLayout.addWidget(self.groupBox_3) self.groupBox_2 = QtWidgets.QGroupBox(NewWorkingTreeForm) self.groupBox_2.setObjectName("groupBox_2") self.gridLayout_3 = QtWidgets.QGridLayout(self.groupBox_2) self.gridLayout_3.setObjectName("gridLayout_3") self.but_rev_tip = QtWidgets.QRadioButton(self.groupBox_2) self.but_rev_tip.setChecked(True) self.but_rev_tip.setObjectName("but_rev_tip") self.gridLayout_3.addWidget(self.but_rev_tip, 0, 0, 1, 2) self.but_rev_specific = QtWidgets.QRadioButton(self.groupBox_2) self.but_rev_specific.setObjectName("but_rev_specific") self.gridLayout_3.addWidget(self.but_rev_specific, 1, 0, 1, 1) self.revision = QtWidgets.QLineEdit(self.groupBox_2) self.revision.setEnabled(False) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.revision.sizePolicy().hasHeightForWidth()) self.revision.setSizePolicy(sizePolicy) self.revision.setObjectName("revision") self.gridLayout_3.addWidget(self.revision, 1, 1, 1, 1) self.but_show_log = QtWidgets.QPushButton(self.groupBox_2) self.but_show_log.setEnabled(False) self.but_show_log.setObjectName("but_show_log") self.gridLayout_3.addWidget(self.but_show_log, 1, 3, 1, 1) self.link_help_revisions = QtWidgets.QLabel(self.groupBox_2) self.link_help_revisions.setObjectName("link_help_revisions") self.gridLayout_3.addWidget(self.link_help_revisions, 1, 2, 1, 1) self.verticalLayout.addWidget(self.groupBox_2) self.retranslateUi(NewWorkingTreeForm) self.link_help.linkActivated['QString'].connect(NewWorkingTreeForm.linkActivated) self.link_help_revisions.linkActivated['QString'].connect(NewWorkingTreeForm.linkActivated) self.but_checkout.toggled['bool'].connect(self.but_lightweight.setEnabled) self.but_branch.toggled['bool'].connect(self.but_stacked.setEnabled) self.but_rev_specific.toggled['bool'].connect(self.revision.setEnabled) NewWorkingTreeForm.disableUi['bool'].connect(self.groupBox.setDisabled) NewWorkingTreeForm.disableUi['bool'].connect(self.groupBox_3.setDisabled) NewWorkingTreeForm.disableUi['bool'].connect(self.groupBox_2.setDisabled) QtCore.QMetaObject.connectSlotsByName(NewWorkingTreeForm) def retranslateUi(self, NewWorkingTreeForm): _translate = QtCore.QCoreApplication.translate NewWorkingTreeForm.setWindowTitle(_translate("NewWorkingTreeForm", "Create a new Bazaar Working Tree")) self.groupBox.setTitle(_translate("NewWorkingTreeForm", "Branch")) self.label_4.setText(_translate("NewWorkingTreeForm", "Branch source (enter a URL or select a local directory with an existing branch)")) self.from_picker.setText(_translate("NewWorkingTreeForm", "Browse...")) self.label.setText(_translate("NewWorkingTreeForm", "Local directory where the working tree will be created")) self.to_picker.setText(_translate("NewWorkingTreeForm", "Browse...")) self.groupBox_3.setTitle(_translate("NewWorkingTreeForm", "Working Tree Options")) self.but_checkout.setText(_translate("NewWorkingTreeForm", "Create a checkout")) self.but_lightweight.setToolTip(_translate("NewWorkingTreeForm", "\n" "\n" "

Lightweight checkouts depend on access to the branch for every operation.

\n" "

Normal checkouts can perform common operations like diff and status without such access, and also support local commits.

\n" "

")) self.but_lightweight.setText(_translate("NewWorkingTreeForm", "Light-weight checkout")) self.but_branch.setText(_translate("NewWorkingTreeForm", "Make a local copy of the branch")) self.but_stacked.setToolTip(_translate("NewWorkingTreeForm", "\n" "\n" "

A stacked branch only stores information not in the source branch, and as such, depends on the availability of the source branch

")) self.but_stacked.setText(_translate("NewWorkingTreeForm", "Create a stacked branch referring to the source branch")) self.link_help.setToolTip(_translate("NewWorkingTreeForm", "Click a link for more information about checkouts and branches.")) self.link_help.setText(_translate("NewWorkingTreeForm", "\n" "\n" "

Tell me more about checkouts and branches

")) self.groupBox_2.setTitle(_translate("NewWorkingTreeForm", "Revision")) self.but_rev_tip.setText(_translate("NewWorkingTreeForm", "Most recent (tip) revision")) self.but_rev_specific.setText(_translate("NewWorkingTreeForm", "Revision:")) self.but_show_log.setText(_translate("NewWorkingTreeForm", "Show Log...")) self.link_help_revisions.setText(_translate("NewWorkingTreeForm", "\n" "\n" "

About revision identifiers

")) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/ui_pull.py0000644000000000000000000000634214556556456013440 0ustar00# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/pull.ui' # # Created by: PyQt5 UI code generator 5.12.3 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext class Ui_PullForm(object): def setupUi(self, PullForm): PullForm.setObjectName("PullForm") PullForm.resize(404, 194) self.verticalLayout = QtWidgets.QVBoxLayout(PullForm) self.verticalLayout.setContentsMargins(9, 9, 9, 9) self.verticalLayout.setObjectName("verticalLayout") self.groupBox = QtWidgets.QGroupBox(PullForm) self.groupBox.setObjectName("groupBox") self.gridLayout = QtWidgets.QGridLayout(self.groupBox) self.gridLayout.setObjectName("gridLayout") self.label_2 = QtWidgets.QLabel(self.groupBox) self.label_2.setObjectName("label_2") self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) self.location = QtWidgets.QComboBox(self.groupBox) self.location.setEditable(True) self.location.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToMinimumContentsLength) self.location.setObjectName("location") self.gridLayout.addWidget(self.location, 0, 1, 1, 2) self.location_picker = QtWidgets.QPushButton(self.groupBox) self.location_picker.setObjectName("location_picker") self.gridLayout.addWidget(self.location_picker, 0, 3, 1, 1) self.label_3 = QtWidgets.QLabel(self.groupBox) self.label_3.setObjectName("label_3") self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) self.revision = QtWidgets.QLineEdit(self.groupBox) self.revision.setObjectName("revision") self.gridLayout.addWidget(self.revision, 1, 1, 1, 1) spacerItem = QtWidgets.QSpacerItem(211, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem, 1, 2, 1, 2) self.remember = QtWidgets.QCheckBox(self.groupBox) self.remember.setChecked(False) self.remember.setObjectName("remember") self.gridLayout.addWidget(self.remember, 2, 0, 1, 4) self.overwrite = QtWidgets.QCheckBox(self.groupBox) self.overwrite.setObjectName("overwrite") self.gridLayout.addWidget(self.overwrite, 3, 0, 1, 4) self.verticalLayout.addWidget(self.groupBox) self.label_2.setBuddy(self.location) self.label_3.setBuddy(self.revision) self.retranslateUi(PullForm) PullForm.disableUi['bool'].connect(self.groupBox.setDisabled) QtCore.QMetaObject.connectSlotsByName(PullForm) def retranslateUi(self, PullForm): _translate = QtCore.QCoreApplication.translate PullForm.setWindowTitle(_translate("PullForm", "Pull")) self.groupBox.setTitle(_translate("PullForm", "Options")) self.label_2.setText(_translate("PullForm", "&Location:")) self.location_picker.setText(_translate("PullForm", "Browse...")) self.label_3.setText(_translate("PullForm", "&Revision:")) self.remember.setText(_translate("PullForm", "Remember this location as a default")) self.overwrite.setText(_translate("PullForm", "Overwrite differences between branches")) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/ui_push.py0000644000000000000000000000701714556556456013443 0ustar00# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/push.ui' # # Created by: PyQt5 UI code generator 5.12.3 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext class Ui_PushForm(object): def setupUi(self, PushForm): PushForm.setObjectName("PushForm") PushForm.resize(349, 175) self.verticalLayout = QtWidgets.QVBoxLayout(PushForm) self.verticalLayout.setContentsMargins(9, 9, 9, 9) self.verticalLayout.setObjectName("verticalLayout") self.groupBox = QtWidgets.QGroupBox(PushForm) self.groupBox.setObjectName("groupBox") self.gridLayout = QtWidgets.QGridLayout(self.groupBox) self.gridLayout.setObjectName("gridLayout") self.label_2 = QtWidgets.QLabel(self.groupBox) self.label_2.setObjectName("label_2") self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) self.location = QtWidgets.QComboBox(self.groupBox) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.location.sizePolicy().hasHeightForWidth()) self.location.setSizePolicy(sizePolicy) self.location.setEditable(True) self.location.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToMinimumContentsLength) self.location.setObjectName("location") self.gridLayout.addWidget(self.location, 0, 1, 1, 1) self.location_picker = QtWidgets.QPushButton(self.groupBox) self.location_picker.setObjectName("location_picker") self.gridLayout.addWidget(self.location_picker, 0, 2, 1, 1) self.remember = QtWidgets.QCheckBox(self.groupBox) self.remember.setChecked(False) self.remember.setObjectName("remember") self.gridLayout.addWidget(self.remember, 1, 0, 1, 3) self.overwrite = QtWidgets.QCheckBox(self.groupBox) self.overwrite.setObjectName("overwrite") self.gridLayout.addWidget(self.overwrite, 2, 0, 1, 3) self.use_existing_dir = QtWidgets.QCheckBox(self.groupBox) self.use_existing_dir.setObjectName("use_existing_dir") self.gridLayout.addWidget(self.use_existing_dir, 3, 0, 1, 3) self.create_prefix = QtWidgets.QCheckBox(self.groupBox) self.create_prefix.setObjectName("create_prefix") self.gridLayout.addWidget(self.create_prefix, 4, 0, 1, 3) self.verticalLayout.addWidget(self.groupBox) self.label_2.setBuddy(self.location) self.retranslateUi(PushForm) PushForm.disableUi['bool'].connect(self.groupBox.setDisabled) QtCore.QMetaObject.connectSlotsByName(PushForm) def retranslateUi(self, PushForm): _translate = QtCore.QCoreApplication.translate PushForm.setWindowTitle(_translate("PushForm", "Push")) self.groupBox.setTitle(_translate("PushForm", "Options")) self.label_2.setText(_translate("PushForm", "&Location:")) self.location_picker.setText(_translate("PushForm", "Browse...")) self.remember.setText(_translate("PushForm", "Remember this location as a default")) self.overwrite.setText(_translate("PushForm", "Overwrite differences between branches")) self.use_existing_dir.setText(_translate("PushForm", "Use existing directory")) self.create_prefix.setText(_translate("PushForm", "Create the path up to the branch if it does not exist")) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/ui_run.py0000644000000000000000000001466414556556456013276 0ustar00# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/run.ui' # # Created by: PyQt5 UI code generator 5.12.3 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext class Ui_RunDialog(object): def setupUi(self, RunDialog): RunDialog.setObjectName("RunDialog") RunDialog.resize(473, 367) self.main_v_layout = QtWidgets.QVBoxLayout(RunDialog) self.main_v_layout.setObjectName("main_v_layout") self.splitter = QtWidgets.QSplitter(RunDialog) self.splitter.setOrientation(QtCore.Qt.Vertical) self.splitter.setOpaqueResize(False) self.splitter.setChildrenCollapsible(False) self.splitter.setObjectName("splitter") self.run_container = QtWidgets.QGroupBox(self.splitter) self.run_container.setObjectName("run_container") self.run_container_layout = QtWidgets.QVBoxLayout(self.run_container) self.run_container_layout.setObjectName("run_container_layout") self.wd_layout = QtWidgets.QHBoxLayout() self.wd_layout.setObjectName("wd_layout") self.wd_label = QtWidgets.QLabel(self.run_container) self.wd_label.setObjectName("wd_label") self.wd_layout.addWidget(self.wd_label) self.wd_edit = QtWidgets.QLineEdit(self.run_container) self.wd_edit.setObjectName("wd_edit") self.wd_layout.addWidget(self.wd_edit) self.browse_button = QtWidgets.QPushButton(self.run_container) self.browse_button.setObjectName("browse_button") self.wd_layout.addWidget(self.browse_button) self.run_container_layout.addLayout(self.wd_layout) self.cmd_layout = QtWidgets.QGridLayout() self.cmd_layout.setObjectName("cmd_layout") self.cat_label = QtWidgets.QLabel(self.run_container) self.cat_label.setObjectName("cat_label") self.cmd_layout.addWidget(self.cat_label, 0, 0, 1, 1) self.cat_combobox = QtWidgets.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 = QtWidgets.QLabel(self.run_container) self.cmd_label.setObjectName("cmd_label") self.cmd_layout.addWidget(self.cmd_label, 1, 0, 1, 1) self.cmd_combobox = QtWidgets.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 = QtWidgets.QCheckBox(self.run_container) self.hidden_checkbox.setObjectName("hidden_checkbox") self.cmd_layout.addWidget(self.hidden_checkbox, 1, 2, 1, 1) self.run_container_layout.addLayout(self.cmd_layout) self.opt_arg_label = QtWidgets.QLabel(self.run_container) self.opt_arg_label.setLineWidth(0) self.opt_arg_label.setObjectName("opt_arg_label") self.run_container_layout.addWidget(self.opt_arg_label) self.opt_arg_edit = QtWidgets.QLineEdit(self.run_container) self.opt_arg_edit.setObjectName("opt_arg_edit") self.run_container_layout.addWidget(self.opt_arg_edit) self.opt_arg_btn_layout = QtWidgets.QHBoxLayout() self.opt_arg_btn_layout.setObjectName("opt_arg_btn_layout") self.directory_button = QtWidgets.QPushButton(self.run_container) self.directory_button.setObjectName("directory_button") self.opt_arg_btn_layout.addWidget(self.directory_button) self.filenames_button = QtWidgets.QPushButton(self.run_container) self.filenames_button.setObjectName("filenames_button") self.opt_arg_btn_layout.addWidget(self.filenames_button) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.opt_arg_btn_layout.addItem(spacerItem) self.run_container_layout.addLayout(self.opt_arg_btn_layout) self.help_browser = QtWidgets.QTextBrowser(self.run_container) self.help_browser.setObjectName("help_browser") self.run_container_layout.addWidget(self.help_browser) self.subprocess_container = QtWidgets.QWidget(self.splitter) self.subprocess_container.setObjectName("subprocess_container") self.subprocess_container_layout = QtWidgets.QVBoxLayout(self.subprocess_container) self.subprocess_container_layout.setContentsMargins(0, 0, 0, 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) self.cmd_label.setBuddy(self.cmd_combobox) self.opt_arg_label.setBuddy(self.opt_arg_edit) self.retranslateUi(RunDialog) RunDialog.disableUi['bool'].connect(self.run_container.setDisabled) QtCore.QMetaObject.connectSlotsByName(RunDialog) RunDialog.setTabOrder(self.wd_edit, self.browse_button) RunDialog.setTabOrder(self.browse_button, self.hidden_checkbox) RunDialog.setTabOrder(self.hidden_checkbox, self.cmd_combobox) RunDialog.setTabOrder(self.cmd_combobox, self.opt_arg_edit) RunDialog.setTabOrder(self.opt_arg_edit, self.directory_button) RunDialog.setTabOrder(self.directory_button, self.filenames_button) RunDialog.setTabOrder(self.filenames_button, self.help_browser) def retranslateUi(self, RunDialog): _translate = QtCore.QCoreApplication.translate RunDialog.setWindowTitle(_translate("RunDialog", "Run bzr command")) self.run_container.setTitle(_translate("RunDialog", "Options")) self.wd_label.setText(_translate("RunDialog", "&Working directory:")) self.browse_button.setText(_translate("RunDialog", "&Browse...")) self.cat_label.setText(_translate("RunDialog", "C&ategory:")) self.cmd_label.setText(_translate("RunDialog", "&Command:")) self.hidden_checkbox.setText(_translate("RunDialog", "&Show hidden commands")) self.opt_arg_label.setText(_translate("RunDialog", "&Options and arguments for command:")) self.directory_button.setText(_translate("RunDialog", "Insert &directory...")) self.filenames_button.setText(_translate("RunDialog", "Insert &filenames...")) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/ui_sysinfo.py0000644000000000000000000001373714556556456014164 0ustar00# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/sysinfo.ui' # # Created by: PyQt5 UI code generator 5.12.3 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(404, 288) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.vboxlayout = QtWidgets.QVBoxLayout(self.centralwidget) self.vboxlayout.setObjectName("vboxlayout") self.bazaar_library = QtWidgets.QGroupBox(self.centralwidget) self.bazaar_library.setFlat(False) self.bazaar_library.setObjectName("bazaar_library") self.gridlayout = QtWidgets.QGridLayout(self.bazaar_library) self.gridlayout.setObjectName("gridlayout") self.label = QtWidgets.QLabel(self.bazaar_library) self.label.setObjectName("label") self.gridlayout.addWidget(self.label, 0, 0, 1, 1) self.bzr_version = QtWidgets.QLabel(self.bazaar_library) self.bzr_version.setObjectName("bzr_version") self.gridlayout.addWidget(self.bzr_version, 0, 1, 1, 1) self.label_3 = QtWidgets.QLabel(self.bazaar_library) self.label_3.setObjectName("label_3") self.gridlayout.addWidget(self.label_3, 1, 0, 1, 1) self.bzr_lib_path = QtWidgets.QLabel(self.bazaar_library) self.bzr_lib_path.setMinimumSize(QtCore.QSize(300, 0)) self.bzr_lib_path.setObjectName("bzr_lib_path") self.gridlayout.addWidget(self.bzr_lib_path, 1, 1, 1, 1) self.vboxlayout.addWidget(self.bazaar_library) self.bazaar_configuration = QtWidgets.QGroupBox(self.centralwidget) self.bazaar_configuration.setObjectName("bazaar_configuration") self.gridlayout1 = QtWidgets.QGridLayout(self.bazaar_configuration) self.gridlayout1.setObjectName("gridlayout1") self.label_2 = QtWidgets.QLabel(self.bazaar_configuration) self.label_2.setObjectName("label_2") self.gridlayout1.addWidget(self.label_2, 0, 0, 1, 1) self.bzr_config_dir = QtWidgets.QLabel(self.bazaar_configuration) self.bzr_config_dir.setObjectName("bzr_config_dir") self.gridlayout1.addWidget(self.bzr_config_dir, 0, 1, 1, 1) self.label_4 = QtWidgets.QLabel(self.bazaar_configuration) self.label_4.setObjectName("label_4") self.gridlayout1.addWidget(self.label_4, 1, 0, 1, 1) self.bzr_log_file = QtWidgets.QLabel(self.bazaar_configuration) self.bzr_log_file.setMinimumSize(QtCore.QSize(300, 0)) self.bzr_log_file.setObjectName("bzr_log_file") self.gridlayout1.addWidget(self.bzr_log_file, 1, 1, 1, 1) self.vboxlayout.addWidget(self.bazaar_configuration) self.python_interpreter = QtWidgets.QGroupBox(self.centralwidget) self.python_interpreter.setMinimumSize(QtCore.QSize(0, 0)) self.python_interpreter.setObjectName("python_interpreter") self.gridlayout2 = QtWidgets.QGridLayout(self.python_interpreter) self.gridlayout2.setObjectName("gridlayout2") self.label_5 = QtWidgets.QLabel(self.python_interpreter) self.label_5.setObjectName("label_5") self.gridlayout2.addWidget(self.label_5, 0, 0, 1, 1) self.python_version = QtWidgets.QLabel(self.python_interpreter) self.python_version.setObjectName("python_version") self.gridlayout2.addWidget(self.python_version, 0, 1, 1, 1) self.label_9 = QtWidgets.QLabel(self.python_interpreter) self.label_9.setObjectName("label_9") self.gridlayout2.addWidget(self.label_9, 1, 0, 1, 1) self.python_file = QtWidgets.QLabel(self.python_interpreter) self.python_file.setObjectName("python_file") self.gridlayout2.addWidget(self.python_file, 1, 1, 1, 1) self.label_7 = QtWidgets.QLabel(self.python_interpreter) self.label_7.setObjectName("label_7") self.gridlayout2.addWidget(self.label_7, 2, 0, 1, 1) self.python_lib_dir = QtWidgets.QLabel(self.python_interpreter) self.python_lib_dir.setMinimumSize(QtCore.QSize(300, 0)) self.python_lib_dir.setObjectName("python_lib_dir") self.gridlayout2.addWidget(self.python_lib_dir, 2, 1, 1, 1) self.vboxlayout.addWidget(self.python_interpreter) MainWindow.setCentralWidget(self.centralwidget) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "System Information")) self.bazaar_library.setTitle(_translate("MainWindow", "Breezy Library")) self.label.setText(_translate("MainWindow", "Version:")) self.bzr_version.setText(_translate("MainWindow", "(bzr-version)")) self.label_3.setText(_translate("MainWindow", "Path:")) self.bzr_lib_path.setText(_translate("MainWindow", "(bzr-lib-path)")) self.bazaar_configuration.setTitle(_translate("MainWindow", "Breezy Configuration")) self.label_2.setText(_translate("MainWindow", "Settings:")) self.bzr_config_dir.setText(_translate("MainWindow", "(bzr-config-dir)")) self.label_4.setText(_translate("MainWindow", "Log File:")) self.bzr_log_file.setText(_translate("MainWindow", "(bzr-log-file)")) self.python_interpreter.setTitle(_translate("MainWindow", "Python Interpreter")) self.label_5.setText(_translate("MainWindow", "Version:")) self.python_version.setText(_translate("MainWindow", "(python-version)")) self.label_9.setText(_translate("MainWindow", "Path:")) self.python_file.setText(_translate("MainWindow", "(python-file)")) self.label_7.setText(_translate("MainWindow", "Library:")) self.python_lib_dir.setText(_translate("MainWindow", "(python-lib-dir)")) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/ui_tag.py0000644000000000000000000001256414556556456013242 0ustar00# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/tag.ui' # # Created by: PyQt5 UI code generator 5.12.3 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext class Ui_TagForm(object): def setupUi(self, TagForm): TagForm.setObjectName("TagForm") TagForm.setWindowModality(QtCore.Qt.NonModal) TagForm.resize(340, 220) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(TagForm.sizePolicy().hasHeightForWidth()) TagForm.setSizePolicy(sizePolicy) TagForm.setMinimumSize(QtCore.QSize(0, 0)) TagForm.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu) self.vboxlayout = QtWidgets.QVBoxLayout(TagForm) self.vboxlayout.setContentsMargins(9, 9, 9, 9) self.vboxlayout.setSpacing(6) self.vboxlayout.setObjectName("vboxlayout") self.branch_group = QtWidgets.QGroupBox(TagForm) self.branch_group.setObjectName("branch_group") self.gridlayout = QtWidgets.QGridLayout(self.branch_group) self.gridlayout.setContentsMargins(9, 9, 9, 9) self.gridlayout.setSpacing(6) self.gridlayout.setObjectName("gridlayout") self.branch_location = QtWidgets.QLineEdit(self.branch_group) self.branch_location.setObjectName("branch_location") self.gridlayout.addWidget(self.branch_location, 0, 0, 1, 2) spacerItem = QtWidgets.QSpacerItem(261, 25, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridlayout.addItem(spacerItem, 1, 0, 1, 1) self.branch_browse = QtWidgets.QPushButton(self.branch_group) self.branch_browse.setObjectName("branch_browse") self.gridlayout.addWidget(self.branch_browse, 1, 1, 1, 1) self.vboxlayout.addWidget(self.branch_group) self.tag_group = QtWidgets.QGroupBox(TagForm) self.tag_group.setMinimumSize(QtCore.QSize(0, 0)) self.tag_group.setObjectName("tag_group") self.gridlayout1 = QtWidgets.QGridLayout(self.tag_group) self.gridlayout1.setContentsMargins(9, 9, 9, 9) self.gridlayout1.setSpacing(6) self.gridlayout1.setObjectName("gridlayout1") self.label_action = QtWidgets.QLabel(self.tag_group) self.label_action.setObjectName("label_action") self.gridlayout1.addWidget(self.label_action, 0, 0, 1, 1) self.cb_action = QtWidgets.QComboBox(self.tag_group) self.cb_action.setObjectName("cb_action") self.cb_action.addItem("") self.cb_action.addItem("") self.cb_action.addItem("") self.gridlayout1.addWidget(self.cb_action, 0, 1, 1, 1) self.label_tag_name = QtWidgets.QLabel(self.tag_group) self.label_tag_name.setObjectName("label_tag_name") self.gridlayout1.addWidget(self.label_tag_name, 1, 0, 1, 1) self.cb_tag = QtWidgets.QComboBox(self.tag_group) self.cb_tag.setEditable(True) self.cb_tag.setObjectName("cb_tag") self.gridlayout1.addWidget(self.cb_tag, 1, 1, 1, 1) self.label_revision = QtWidgets.QLabel(self.tag_group) self.label_revision.setObjectName("label_revision") self.gridlayout1.addWidget(self.label_revision, 2, 0, 1, 1) self.rev_edit = QtWidgets.QLineEdit(self.tag_group) self.rev_edit.setObjectName("rev_edit") self.gridlayout1.addWidget(self.rev_edit, 2, 1, 1, 1) self.pick_rev = QtWidgets.QPushButton(self.tag_group) self.pick_rev.setEnabled(False) self.pick_rev.setObjectName("pick_rev") self.gridlayout1.addWidget(self.pick_rev, 2, 2, 1, 1) self.vboxlayout.addWidget(self.tag_group) self.label_action.setBuddy(self.cb_action) self.label_tag_name.setBuddy(self.cb_tag) self.label_revision.setBuddy(self.rev_edit) self.retranslateUi(TagForm) TagForm.disableUi['bool'].connect(self.tag_group.setDisabled) TagForm.disableUi['bool'].connect(self.branch_group.setDisabled) QtCore.QMetaObject.connectSlotsByName(TagForm) TagForm.setTabOrder(self.branch_location, self.branch_browse) TagForm.setTabOrder(self.branch_browse, self.cb_action) TagForm.setTabOrder(self.cb_action, self.cb_tag) TagForm.setTabOrder(self.cb_tag, self.rev_edit) TagForm.setTabOrder(self.rev_edit, self.pick_rev) def retranslateUi(self, TagForm): _translate = QtCore.QCoreApplication.translate TagForm.setWindowTitle(_translate("TagForm", "Edit tag")) self.branch_group.setTitle(_translate("TagForm", "Branch")) self.branch_browse.setText(_translate("TagForm", "&Browse...")) self.tag_group.setTitle(_translate("TagForm", "Tag")) self.label_action.setText(_translate("TagForm", "&Action:")) self.cb_action.setItemText(0, _translate("TagForm", "Create new tag")) self.cb_action.setItemText(1, _translate("TagForm", "Replace existing tag")) self.cb_action.setItemText(2, _translate("TagForm", "Delete existing tag")) self.label_tag_name.setText(_translate("TagForm", "&Tag name:")) self.label_revision.setText(_translate("TagForm", "&Revision:")) self.pick_rev.setText(_translate("TagForm", "&Select...")) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/ui_update_branch.py0000644000000000000000000001274414556556456015266 0ustar00# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/update_branch.ui' # # Created by: PyQt5 UI code generator 5.12.3 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext class Ui_UpdateBranchForm(object): def setupUi(self, UpdateBranchForm): UpdateBranchForm.setObjectName("UpdateBranchForm") UpdateBranchForm.resize(407, 198) self.verticalLayout_3 = QtWidgets.QVBoxLayout(UpdateBranchForm) self.verticalLayout_3.setContentsMargins(9, 9, 9, 9) self.verticalLayout_3.setObjectName("verticalLayout_3") self.label = QtWidgets.QLabel(UpdateBranchForm) self.label.setScaledContents(False) self.label.setWordWrap(False) self.label.setObjectName("label") self.verticalLayout_3.addWidget(self.label) self.groupBox = QtWidgets.QGroupBox(UpdateBranchForm) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(1) sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth()) self.groupBox.setSizePolicy(sizePolicy) self.groupBox.setObjectName("groupBox") self.gridLayout = QtWidgets.QGridLayout(self.groupBox) self.gridLayout.setObjectName("gridLayout") self.location_picker = QtWidgets.QPushButton(self.groupBox) self.location_picker.setObjectName("location_picker") self.gridLayout.addWidget(self.location_picker, 1, 2, 1, 1) self.but_pull = QtWidgets.QRadioButton(self.groupBox) self.but_pull.setChecked(True) self.but_pull.setObjectName("but_pull") self.gridLayout.addWidget(self.but_pull, 0, 0, 1, 3) self.but_pull_remember = QtWidgets.QCheckBox(self.groupBox) self.but_pull_remember.setEnabled(True) self.but_pull_remember.setChecked(False) self.but_pull_remember.setObjectName("but_pull_remember") self.gridLayout.addWidget(self.but_pull_remember, 2, 1, 1, 2) self.but_pull_overwrite = QtWidgets.QCheckBox(self.groupBox) self.but_pull_overwrite.setObjectName("but_pull_overwrite") self.gridLayout.addWidget(self.but_pull_overwrite, 3, 1, 1, 2) spacerItem = QtWidgets.QSpacerItem(17, 18, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem, 3, 0, 1, 1) self.location = QtWidgets.QComboBox(self.groupBox) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.location.sizePolicy().hasHeightForWidth()) self.location.setSizePolicy(sizePolicy) self.location.setEditable(True) self.location.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToMinimumContentsLength) self.location.setObjectName("location") self.location.addItem("") self.gridLayout.addWidget(self.location, 1, 1, 1, 1) spacerItem1 = QtWidgets.QSpacerItem(18, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem1, 1, 0, 1, 1) spacerItem2 = QtWidgets.QSpacerItem(18, 17, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem2, 2, 0, 1, 1) self.but_update = QtWidgets.QRadioButton(self.groupBox) self.but_update.setObjectName("but_update") self.gridLayout.addWidget(self.but_update, 4, 0, 1, 3) self.location_picker.raise_() self.but_pull.raise_() self.but_pull_remember.raise_() self.but_pull_overwrite.raise_() self.location.raise_() self.but_update.raise_() self.verticalLayout_3.addWidget(self.groupBox) self.retranslateUi(UpdateBranchForm) self.but_pull.toggled['bool'].connect(self.but_pull_remember.setEnabled) self.but_pull.toggled['bool'].connect(self.but_pull_overwrite.setEnabled) self.but_pull.toggled['bool'].connect(self.location.setEnabled) self.but_pull.toggled['bool'].connect(self.location_picker.setEnabled) UpdateBranchForm.disableUi['bool'].connect(self.label.setDisabled) UpdateBranchForm.disableUi['bool'].connect(self.groupBox.setDisabled) QtCore.QMetaObject.connectSlotsByName(UpdateBranchForm) def retranslateUi(self, UpdateBranchForm): _translate = QtCore.QCoreApplication.translate UpdateBranchForm.setWindowTitle(_translate("UpdateBranchForm", "Update Branch")) self.label.setText(_translate("UpdateBranchForm", "This directory is a branch. Please select what you would like to update")) self.groupBox.setTitle(_translate("UpdateBranchForm", "Update source")) self.location_picker.setText(_translate("UpdateBranchForm", "Browse...")) self.but_pull.setText(_translate("UpdateBranchForm", "Pull most recent changes from:")) self.but_pull_remember.setText(_translate("UpdateBranchForm", "Remember this as the new parent branch")) self.but_pull_overwrite.setText(_translate("UpdateBranchForm", "Overwrite differences between branches")) self.location.setItemText(0, _translate("UpdateBranchForm", "")) self.but_update.setText(_translate("UpdateBranchForm", "Update working tree to the latest changes in the branch")) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/ui_update_checkout.py0000644000000000000000000001074614556556456015636 0ustar00# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/update_checkout.ui' # # Created by: PyQt5 UI code generator 5.12.3 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext class Ui_UpdateCheckoutForm(object): def setupUi(self, UpdateCheckoutForm): UpdateCheckoutForm.setObjectName("UpdateCheckoutForm") UpdateCheckoutForm.resize(317, 170) self.verticalLayout = QtWidgets.QVBoxLayout(UpdateCheckoutForm) self.verticalLayout.setContentsMargins(9, 9, 9, 9) self.verticalLayout.setObjectName("verticalLayout") self.label = QtWidgets.QLabel(UpdateCheckoutForm) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth()) self.label.setSizePolicy(sizePolicy) self.label.setObjectName("label") self.verticalLayout.addWidget(self.label) self.groupBox = QtWidgets.QGroupBox(UpdateCheckoutForm) self.groupBox.setObjectName("groupBox") self.gridLayout = QtWidgets.QGridLayout(self.groupBox) self.gridLayout.setObjectName("gridLayout") self.but_update = QtWidgets.QRadioButton(self.groupBox) self.but_update.setChecked(True) self.but_update.setObjectName("but_update") self.gridLayout.addWidget(self.but_update, 0, 0, 1, 3) self.but_pull = QtWidgets.QRadioButton(self.groupBox) self.but_pull.setEnabled(True) self.but_pull.setObjectName("but_pull") self.gridLayout.addWidget(self.but_pull, 1, 0, 1, 3) spacerItem = QtWidgets.QSpacerItem(18, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem, 2, 0, 1, 1) self.location = QtWidgets.QComboBox(self.groupBox) self.location.setEnabled(False) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.location.sizePolicy().hasHeightForWidth()) self.location.setSizePolicy(sizePolicy) self.location.setEditable(True) self.location.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToMinimumContentsLength) self.location.setObjectName("location") self.gridLayout.addWidget(self.location, 2, 1, 1, 1) self.location_picker = QtWidgets.QPushButton(self.groupBox) self.location_picker.setEnabled(False) self.location_picker.setObjectName("location_picker") self.gridLayout.addWidget(self.location_picker, 2, 2, 1, 1) spacerItem1 = QtWidgets.QSpacerItem(18, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem1, 3, 0, 1, 1) self.but_pull_overwrite = QtWidgets.QCheckBox(self.groupBox) self.but_pull_overwrite.setEnabled(False) self.but_pull_overwrite.setObjectName("but_pull_overwrite") self.gridLayout.addWidget(self.but_pull_overwrite, 3, 1, 1, 2) self.verticalLayout.addWidget(self.groupBox) self.retranslateUi(UpdateCheckoutForm) self.but_pull.toggled['bool'].connect(self.location.setEnabled) self.but_pull.toggled['bool'].connect(self.location_picker.setEnabled) self.but_pull.toggled['bool'].connect(self.but_pull_overwrite.setEnabled) UpdateCheckoutForm.disableUi['bool'].connect(self.groupBox.setDisabled) QtCore.QMetaObject.connectSlotsByName(UpdateCheckoutForm) def retranslateUi(self, UpdateCheckoutForm): _translate = QtCore.QCoreApplication.translate UpdateCheckoutForm.setWindowTitle(_translate("UpdateCheckoutForm", "Update Checkout")) self.label.setText(_translate("UpdateCheckoutForm", "This directory is a checkout of: %s")) self.groupBox.setTitle(_translate("UpdateCheckoutForm", "Update source")) self.but_update.setText(_translate("UpdateCheckoutForm", "Update the working tree from the bound branch")) self.but_pull.setText(_translate("UpdateCheckoutForm", "Pull a different branch")) self.location_picker.setText(_translate("UpdateCheckoutForm", "Browse...")) self.but_pull_overwrite.setText(_translate("UpdateCheckoutForm", "Overwrite differences between branches")) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/ui_verify-signatures.py0000644000000000000000000000166514556556456016155 0ustar00# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/verify-signatures.ui' # # Created by: PyQt5 UI code generator 5.12.3 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext class Ui_VerifyForm(object): def setupUi(self, VerifyForm): VerifyForm.setObjectName("VerifyForm") VerifyForm.resize(560, 230) self.verticalLayout = QtWidgets.QVBoxLayout(VerifyForm) self.verticalLayout.setObjectName("verticalLayout") self.treeWidget = QtWidgets.QTreeWidget(VerifyForm) self.treeWidget.setObjectName("treeWidget") self.treeWidget.headerItem().setText(0, "1") self.verticalLayout.addWidget(self.treeWidget) self.retranslateUi(VerifyForm) QtCore.QMetaObject.connectSlotsByName(VerifyForm) def retranslateUi(self, VerifyForm): pass ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/ui_verify_signatures.py0000644000000000000000000000231314556556456016226 0ustar00# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/verify-signatures.ui' # # Created by: PyQt4 UI code generator 4.12.3 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets try: _encoding = QtWidgets.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtCore.QCoreApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtCore.QCoreApplication.translate(context, text, disambig) class Ui_VerifyForm(object): def setupUi(self, VerifyForm): VerifyForm.setObjectName("VerifyForm") VerifyForm.resize(560, 230) self.verticalLayout = QtWidgets.QVBoxLayout(VerifyForm) self.verticalLayout.setObjectName("verticalLayout") self.treeWidget = QtWidgets.QTreeWidget(VerifyForm) self.treeWidget.setObjectName("treeWidget") self.treeWidget.headerItem().setText(0, "1") self.verticalLayout.addWidget(self.treeWidget) self.retranslateUi(VerifyForm) QtCore.QMetaObject.connectSlotsByName(VerifyForm) def retranslateUi(self, VerifyForm): pass ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/uifactory.py0000755000000000000000000001221114556556456013767 0ustar00#!/usr/bin/env python # -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2008 Gary van der Merwe # # 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 PyQt5 import QtCore, QtGui, QtWidgets import time from breezy import ui from breezy.plugins.qbrz.lib.i18n import gettext def ui_current_widget(f): def decorate(*args, **kargs): if isinstance(ui.ui_factory, QUIFactory): ui.ui_factory.current_widget_stack.append(args[0]) try: r = f(*args, **kargs) finally: del ui.ui_factory.current_widget_stack[-1] return r else: return f(*args, **kargs) return decorate def quifactory(): if isinstance(ui.ui_factory, QUIFactory): return ui.ui_factory return None def current_throbber(): ui = quifactory() if ui: return ui.throbber() return None class QUIFactory(ui.UIFactory): def __init__(self): super(QUIFactory, self).__init__() self.current_widget_stack = [] self._transport_update_time = 0 self._total_byte_count = 0 self._bytes_since_update = 0 self._transport_rate = None def current_widget(self): if self.current_widget_stack: return self.current_widget_stack[-1] return None def throbber(self): current_widget = self.current_widget() if current_widget and getattr(current_widget, 'throbber', None) is not None: return current_widget.throbber return None def report_transport_activity(self, transport, byte_count, direction): """Called by transports as they do IO. This may update a progress bar, spinner, or similar display. By default it does nothing. """ self._total_byte_count += byte_count self._bytes_since_update += byte_count throbber = self.throbber() if throbber: now = time.time() if self._transport_update_time is None: self._transport_update_time = now elif now >= (self._transport_update_time + 0.2): # guard against clock stepping backwards, and don't update too # often self._transport_rate = self._bytes_since_update / (now - self._transport_update_time) self._transport_update_time = now self._bytes_since_update = 0 if self._transport_rate: msg = ("%6dkB @ %4dkB/s" % (self._total_byte_count>>10, int(self._transport_rate)>>10,)) else: msg = ("%6dkB @ " % (self._total_byte_count>>10,)) throbber.transport.setText(msg) QtCore.QCoreApplication.processEvents() def get_password(self, prompt='', **kwargs): password, ok = QtWidgets.QInputDialog.getText(self.current_widget(), gettext("Enter Password"), (prompt % kwargs), QtWidgets.QLineEdit.Password) if ok: return str(password) else: raise KeyboardInterrupt() def get_username(self, prompt='', **kwargs): username, ok = QtWidgets.QInputDialog.getText(self.current_widget(), gettext("Enter Username"), (prompt % kwargs)) if ok: return str(username) else: raise KeyboardInterrupt() def get_boolean(self, prompt): button = QtWidgets.QMessageBox.question( self.current_widget(), "Bazaar", prompt, QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) return button == QtWidgets.QMessageBox.Yes def clear_term(self): """Prepare the terminal for output. This will, for example, clear text progress bars, and leave the cursor at the leftmost position.""" pass # You can run this file to test the ui factory. This is not in the test suit # because it actualy open the ui, and so user interaction is required to run # the test. if __name__ == "__main__": application = QtWidgets.QApplication([]) ui_factory = QUIFactory() print(ui_factory.get_username("Enter password 123")) #print ui_factory.get_boolean("Question?") ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/unbind.py0000644000000000000000000000467114556556456013251 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # # Contributors: # Javier Der Derian # # 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 PyQt5 import QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.subprocess import SubProcessDialog from breezy.plugins.qbrz.lib.util import ( url_for_display, ) class QBzrUnbindDialog(SubProcessDialog): def __init__(self, branch, ui_mode=None, immediate=False): super(QBzrUnbindDialog, self).__init__( gettext("Unbind branch"), name = "unbind", default_size = (200, 200), ui_mode = ui_mode, dialog = True, parent = None, hide_progress=False, immediate = immediate ) self.branch = branch gbBind = QtWidgets.QGroupBox(gettext("Unbind"), self) bind_box = QtWidgets.QFormLayout(gbBind) info_label = QtWidgets.QLabel(url_for_display(branch.base)) bind_box.addRow(gettext("Branch:"), info_label) self.currbound = branch.get_bound_location() if self.currbound is not None: curr_label = QtWidgets.QLabel(url_for_display(self.currbound)) bind_box.addRow(gettext("Bound to:"), curr_label) layout = QtWidgets.QVBoxLayout(self) layout.addWidget(gbBind) layout.addWidget(self.make_default_status_box()) layout.addWidget(self.buttonbox) def do_start(self): self.process_widget.do_start(None, 'unbind') ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/uncommit.py0000644000000000000000000001265514556556456013626 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2009 Canonical Ltd # # 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 PyQt5 import QtCore, QtGui, QtWidgets from breezy import controldir, errors, log from breezy.revisionspec import RevisionSpec from breezy.plugins.qbrz.lib.html_log import log_as_html from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.subprocess import SubProcessDialog from breezy.plugins.qbrz.lib.trace import reports_exception, SUB_LOAD_METHOD from breezy.plugins.qbrz.lib.util import url_for_display class QBzrUncommitWindow(SubProcessDialog): def __init__(self, location, dialog=True, ui_mode=True, parent=None, local=None, message=None): super(QBzrUncommitWindow, self).__init__( gettext("Uncommit"), name="uncommit", default_size=(400, 400), ui_mode=ui_mode, dialog=dialog, parent=parent, hide_progress=True, ) self.tree, self.branch = controldir.ControlDir.open_tree_or_branch(location) # Display the branch branch_label = QtWidgets.QLabel(gettext("Branch: %s") % url_for_display(self.branch.base)) # Display the revision selection section. We nearly always # want to just uncommit the last revision (to tweak the # commit message say) so we make that the default. groupbox = QtWidgets.QGroupBox(gettext("Move tip to"), self) self.last_radio = QtWidgets.QRadioButton(gettext("Parent of current tip revision")) self.last_radio.setChecked(QtCore.Qt.Checked) self.other_radio = QtWidgets.QRadioButton(gettext("Other revision:")) self.other_revision = QtWidgets.QLineEdit() other = QtWidgets.QHBoxLayout() other.addWidget(self.other_radio) other.addWidget(self.other_revision) vbox = QtWidgets.QVBoxLayout(groupbox) vbox.addWidget(self.last_radio) vbox.addLayout(other) # If the user starts entering a value in the 'other revision' field, # set the matching radio button implicitly self.other_revision.textChanged['QString'].connect(self.do_other_revision_changed) # groupbox gets disabled as we are executing. self.subprocessStarted[bool].connect(groupbox.setDisabled) # Put the form together layout = QtWidgets.QVBoxLayout(self) layout.addWidget(branch_label) layout.addWidget(groupbox) layout.addWidget(self.make_default_status_box()) layout.addWidget(self.buttonbox) def do_other_revision_changed(self, text): if text and not self.other_radio.isChecked(): self.other_radio.setChecked(True) def _revision_identifier(self): """What revision did the user select? :return: None for the last revision. Otherwise the revision identifier as a string. """ if self.other_radio.isChecked(): result = str(self.other_revision.text()) if result: return result else: msg = gettext("No other revision specified.") raise errors.BzrError(msg) # Default is the tip revision return None @reports_exception(type=SUB_LOAD_METHOD) def validate(self): """Check that the user really wants to uncommit the given revisions.""" revision = self._revision_identifier() if revision is None: log_rqst = log.make_log_request_dict(limit=1) else: rev_spec = RevisionSpec.from_string(revision) revno = rev_spec.in_history(self.branch).revno # We need to offset the revno by +1 because we'll be uncommitting # *back* to revno, meaning those after it are 'deleted' log_rqst = log.make_log_request_dict(start_revision=revno + 1) log_data = log_as_html(self.branch, log_rqst) question = gettext("Do you really want to uncommit these revisions?") if self.ask_confirmation('%s
%s' % (question, log_data),type='warning'): return True return False def do_start(self): args = ['--force'] revision = self._revision_identifier() if revision: args.append('--revision') args.append(revision) if self.tree: dest = self.tree.basedir else: dest = self.branch.base args.append(dest) self.process_widget.do_start(None, 'uncommit', *args) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/update.py0000644000000000000000000000303714556556456013247 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2009 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. """Simple GUI for `bzr update` command for updating out-of-date working tree of a branch. """ from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.subprocess import SimpleSubProcessDialog class QBzrUpdateWindow(SimpleSubProcessDialog): def __init__(self, tree, ui_mode=True, immediate=False, parent=None): self.tree = tree super(QBzrUpdateWindow, self).__init__( title=gettext("Update working tree"), desc=gettext("Update tree %s") % tree.basedir, name="update", args=["update"], dir=self.tree.basedir, default_size=(256, 256), ui_mode=ui_mode, parent=parent, immediate=immediate, ) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/util.py0000644000000000000000000011365114556556456012746 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2006 Lukáš Lalinský # Copyright (C) 2007, 2008 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. import os import shlex import sys import itertools from PyQt5 import QtCore, QtGui, QtWidgets from breezy.revision import Revision # RJLRJL: config_dir and ensure_config_dir_exists are now in bedding.. from breezy.config import GlobalConfig from breezy import bedding from breezy import lazy_regex from breezy.plugins.qbrz.lib import MS_WINDOWS from breezy.plugins.qbrz.lib.i18n import gettext, N_ # pyflakes says this is not needed, but it is. import breezy.plugins.qbrz.lib.resources from breezy import errors from functools import reduce from breezy import ( osutils, urlutils, ui, ) from breezy.plugins.qbrz.lib import trace from breezy.workingtree import WorkingTree from breezy.transport import get_transport from breezy.lockdir import LockDir from breezy.plugins.qbrz.lib.compatibility import configobj # standard buttons with translatable labels BTN_OK = 0 BTN_CANCEL = 1 BTN_CLOSE = 2 BTN_HELP = 3 BTN_REFRESH = 4 class StandardButton(QtWidgets.QPushButton): __types = { BTN_OK: (N_('&OK'), 'SP_DialogOkButton'), BTN_CANCEL: (N_('&Cancel'), 'SP_DialogCancelButton'), BTN_CLOSE: (N_('&Close'), 'SP_DialogCloseButton'), BTN_HELP: (N_('&Help'), 'SP_DialogHelpButton'), BTN_REFRESH: (N_('&Refresh'), 'view-refresh'), } def __init__(self, btntype, *args): label = gettext(self.__types[btntype][0]) new_args = [label] if sys.platform != 'win32' and sys.platform != 'darwin': iconname = self.__types[btntype][1] if iconname == 'view-refresh': icon = QtGui.QIcon(':/16x16/view-refresh.png') new_args = [icon, label] elif hasattr(QtWidgets.QStyle, iconname): icon = QtWidgets.QApplication.style().standardIcon(getattr(QtWidgets.QStyle, iconname)) new_args = [icon, label] new_args.extend(args) QtWidgets.QPushButton.__init__(self, *new_args) def config_filename(): return osutils.pathjoin(bedding.config_dir(), 'qbrz.conf') class Config(object): def __init__(self, filename): self._filename = filename self._configobj = None transport = get_transport(osutils.dirname(osutils.safe_unicode(filename))) self._lock = LockDir(transport, 'lock') def _load(self): if self._configobj is not None: return self._configobj = configobj.ConfigObj(self._filename, encoding='utf-8') def set_option(self, name, value, section=None): self._load() if section is None: section = 'DEFAULT' if section not in self._configobj: self._configobj[section] = {} if value: if not isinstance(value, str): # [bialix 2011/02/11] related to bug #716384: if value is bool # then sometimes configobj lost it in the output file value = str(value) self._configobj[section][name] = value else: if name in self._configobj[section]: del self._configobj[section][name] def get_option(self, name, section=None): self._load() if section is None: section = 'DEFAULT' try: return self._configobj[section][name] except KeyError: return None def get_option_as_bool(self, name, section=None): # imitate the code from breezy.config to read option as boolean # until we will switch to use breezy.config instead of our re-implementation value_maybe_str_or_bool = self.get_option(name, section) if value_maybe_str_or_bool not in (None, ''): value = ui.bool_from_string(value_maybe_str_or_bool) return value def set_section(self, name, values): self._load() self._configobj[name] = values def get_section(self, name): self._load() try: return self._configobj[name] except KeyError: return {} def save(self): bedding.ensure_config_dir_exists(os.path.dirname(self._filename)) self._lock.lock_write() try: self._load() f = open(self._filename, 'wb') self._configobj.write(f) f.close() finally: self._lock.unlock() class QBzrConfig(Config): def __init__(self): super(QBzrConfig, self).__init__(config_filename()) def get_bookmarks(self): section = self.get_section('BOOKMARKS') i = 0 while True: try: location = section['bookmark%d' % i] except KeyError: break name = section.get('bookmark%d_name' % i, location) i += 1 yield name, location def set_bookmarks(self, bookmarks): section = {} for i, (name, location) in enumerate(bookmarks): section['bookmark%d' % i] = location section['bookmark%d_name' % i] = name self.set_section('BOOKMARKS', section) def add_bookmark(self, name, location): bookmarks = list(self.get_bookmarks()) bookmarks.append((name, location)) self.set_bookmarks(bookmarks) def get_color(self, name, section=None): """ Get a color entry from the config file. Color entries have the syntax: name = R, G, B Where the color components are integers in the range 0..255. Colors are returned as QtGui.QColor. If input is erroneous, ErrorValue exception is raised. e.g. replace_fill = 255, 0, 128 """ # utility functions. if section is None: name_str = '[DEFAULT]:' + name else: name_str = "[" + section + "]:" + name color_format_err_msg = "Illegal color format for {0}. Given '{1}' expected ', , '." color_range_err_msg = "Color components for {0} should be in the range 0..255 only. Given: {1]." val = self.get_option(name, section) if val is None: return None if list != type(val): raise ValueError(color_format_err_msg.format(name_str, val)) if 3 != len(val) or not reduce(lambda x,y: x and y.isdigit(), val, True): raise ValueError(color_format_err_msg.format(name_str, ", ".join(val))) # Being here guarantees that color_value is a list of three elements that represent numbers. color_components = list(map(int, val)) if not reduce(lambda x,y: x and y < 256, color_components, True): raise ValueError(color_range_err_msg.format(name_str, ", ".join(val))) # Now we know the given color is safe to use. return QtGui.QColor(*color_components) _global_config = None def get_global_config(): global _global_config if _global_config is None or _check_global_config_filename_valid(_global_config): _global_config = GlobalConfig() return _global_config def _check_global_config_filename_valid(config): # before bzr 2.3, there was no file_name attrib, only _get_filename, and checking that would be meaningless. if hasattr(config, 'file_name'): return not config.file_name == config_filename() else: return False _qbrz_config = None def get_qbrz_config(): global _qbrz_config if _qbrz_config is None or not _qbrz_config._filename == config_filename(): _qbrz_config = QBzrConfig() return _qbrz_config def get_branch_config(branch): if branch: # we should check boolean branch value to support 2 fake branch cases: branch is None, branch is FakeBranch return branch.get_config() else: return get_global_config() class _QBzrWindowBase(object): def set_title(self, title=None): if title: if isinstance(title, str): self.setWindowTitle(title) elif isinstance(title, (list, tuple)): self.setWindowTitle(" - ".join(title)) def set_title_and_icon(self, title=None): """Set window title (from string or list) and bzr icon""" self.set_title(title) icon = QtGui.QIcon() icon.addFile(":/bzr-16.png", QtCore.QSize(16, 16)) icon.addFile(":/bzr-32.png", QtCore.QSize(32, 32)) icon.addFile(":/bzr-48.png", QtCore.QSize(48, 48)) self.setWindowIcon(icon) def create_button_box(self, *buttons): """Create and return button box with pseudo-standard buttons @param buttons: any from BTN_OK, BTN_CANCEL, BTN_CLOSE @return: QtGui.QDialogButtonBox with attached buttons and signals RJLRJL: modified this to not do the dictionary dance every time and to work with PyQt5 """ buttonbox = QtWidgets.QDialogButtonBox(self) if BTN_OK in buttons: btn = StandardButton(BTN_OK) buttonbox.addButton(btn, QtWidgets.QDialogButtonBox.AcceptRole) buttonbox.accepted.connect(self.do_accept) if BTN_CANCEL in buttons: btn = StandardButton(BTN_CANCEL) buttonbox.addButton(btn, QtWidgets.QDialogButtonBox.RejectRole) buttonbox.rejected.connect(self.do_reject) if BTN_CLOSE in buttons: btn = StandardButton(BTN_CLOSE) buttonbox.addButton(btn, QtWidgets.QDialogButtonBox.RejectRole) buttonbox.rejected.connect(self.do_close) return buttonbox def _saveSize(self, config): name = self._window_name is_maximized = int(self.windowState()) & QtCore.Qt.WindowMaximized != 0 if is_maximized: # XXX for some reason this doesn't work geom = self.normalGeometry() size = geom.width(), geom.height() else: size = self.width(), self.height() config.set_option(name + "_window_size", "%dx%d" % size) config.set_option(name + "_window_maximized", is_maximized) def saveSize(self): config = get_qbrz_config() self._saveSize(config) config.save() def restoreSize(self, name, defaultSize): self._window_name = name config = get_qbrz_config() size = config.get_option(name + "_window_size") if size: size = size.split("x") if len(size) == 2: try: size = list(map(int, size)) except ValueError: size = defaultSize else: if size[0] < 100 or size[1] < 100: size = defaultSize else: size = defaultSize if size: size = QtCore.QSize(size[0], size[1]) self.resize(size.expandedTo(self.minimumSizeHint())) self._restore_size = size is_maximized = config.get_option_as_bool(name + "_window_maximized") if is_maximized: self.setWindowState(QtCore.Qt.WindowMaximized) return config def _saveSplitterSizes(self, config, splitter): name = self._window_name sizes = ':'.join(map(str, splitter.sizes())) config.set_option(name + "_splitter_sizes", sizes) def restoreSplitterSizes(self, default_sizes=None): name = self._window_name config = get_qbrz_config() sizes = config.get_option(name + "_splitter_sizes") n = len(self.splitter.sizes()) if sizes: sizes = list(map(int, sizes.split(':'))) if len(sizes) != n: sizes = None if not sizes and default_sizes and len(default_sizes) == n: sizes = default_sizes if sizes: self.splitter.setSizes(sizes) def closeEvent(self, event): self.closing = True self.saveSize() for window in self.windows: if window.isVisible(): window.close() event.accept() # custom signal slots. def linkActivated(self, target): """Sent by labels or other rich-text enabled widgets when a link is clicked. """ # Our help links all are of the form 'bzrtopic:topic-name' scheme, link = str(target).split(":", 1) if scheme != "bzrtopic": raise RuntimeError("unknown scheme") from breezy.plugins.qbrz.lib.help import show_help show_help(link, self) def processEvents(self, flags=QtCore.QEventLoop.AllEvents): QtCore.QCoreApplication.processEvents(flags) if self.closing: raise trace.StopException() def do_close(self): self.close() def operation_blocked(self, message): """Use self.operation_blocked in validate methods of q-dialogs to show error message about incorrect or missing parameters. We can easily switch between show_error and show_warning inside this method if we want to change the overall qbrz behavior. """ self.show_warning(message) def show_error(self, message): QtWidgets.QMessageBox.critical(self, gettext("Error"), message) def show_warning(self, message): QtWidgets.QMessageBox.warning(self, gettext("Warning"), message) def ask_confirmation(self, message, type='question'): """Return True if user selected Yes. Optional parameter type selects dialog type. Valid values: question, warning. """ klass = QtWidgets.QMessageBox.question if type == 'warning': klass = QtWidgets.QMessageBox.warning # RJLRJL flake8 doesn't like the following - I suspect it's change from Qt5 button = klass(self, gettext("Confirm"), message, QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No) if button == QtWidgets.QMessageBox.Yes: return True else: return False class QBzrWindow(QtWidgets.QMainWindow, _QBzrWindowBase): def __init__(self, title=None, parent=None, centralwidget=None, ui_mode=True): QtWidgets.QMainWindow.__init__(self, parent) self.ui_mode = ui_mode self.set_title_and_icon(title) if centralwidget is None: centralwidget = QtWidgets.QWidget(self) self.centralwidget = centralwidget self.setCentralWidget(self.centralwidget) self.windows = [] self.closing = False def show(self): QtWidgets.QMainWindow.show(self) self.raise_() # Make sure it displays in the foreground class QBzrDialog(QtWidgets.QDialog, _QBzrWindowBase): def __init__(self, title=None, parent=None, ui_mode=True): self.ui_mode = ui_mode QtWidgets.QDialog.__init__(self, parent) self.set_title_and_icon(title) self.windows = [] self.closing = False # Even though this is a dialog, make it like a window. This allows us # to have the best of both worlds, e.g. Default buttons from dialogs, # and max and min buttons from window. # It also fixes https://bugs.launchpad.net/qbrz/+bug/421039 self.setWindowFlags(QtCore.Qt.Window) def do_accept(self): self.accept() def do_reject(self): self.reject() def reject(self): self.saveSize() QtWidgets.QDialog.reject(self) def show(self): QtWidgets.QMainWindow.show(self) self.raise_() # Make sure it displays in the foreground throber_movie = None class ThrobberWidget(QtWidgets.QWidget): """A widget that indicates activity.""" def __init__(self, parent, timeout=500): QtWidgets.QWidget.__init__(self, parent) global throber_movie if not throber_movie: throber_movie = QtGui.QMovie(":/16x16/process-working.gif") throber_movie.start() self.spinner = QtWidgets.QLabel("", self) self.spinner.setMovie(throber_movie) self.message = QtWidgets.QLabel(gettext("Loading..."), self) self.transport = QtWidgets.QLabel("", self) for widget in (self.spinner, self.message, self.transport): widget.hide() self.widgets = [] self.set_layout() self.num_show = 0 def set_layout(self): layout = QtWidgets.QHBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.spinner) layout.addWidget(self.message, 1) layout.addWidget(self.transport) self.widgets.append(self.spinner) self.widgets.append(self.message) self.widgets.append(self.transport) def hide(self): # if self.is_shown: # QtGui.QApplication.restoreOverrideCursor() self.num_show -= 1 if self.num_show <= 0: self.num_show = 0 QtWidgets.QWidget.hide(self) for widget in self.widgets: widget.hide() def show(self): # QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) # and show ourselves. self.num_show += 1 QtWidgets.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 = QtWidgets.QHBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.transport) layout.addWidget(self.spinner) self.widgets.append(self.spinner) self.widgets.append(self.transport) # Helpers for directory pickers. # We use these items both as 'flags' and as titles! # A directory picker used to select a 'pull' location. DIRECTORYPICKER_SOURCE = N_("Select Source Directory") # A directory picker used to select a destination DIRECTORYPICKER_TARGET = N_("Select Target Directory") def hookup_directory_picker(dialog, chooser, target, chooser_type): """An inline handler that serves as a 'link' between the widgets. @param dialog: dialog window object @param chooser: usually 'Browse' button in a dialog @param target: QLineEdit or QComboBox where location will be shown @param chooser_type: caption string for directory selector dialog """ caption = gettext(chooser_type) def click_handler(dlg=dialog, chooser=chooser, target=target, caption=caption): try: # Might be a QComboBox getter = target.currentText setter = target.setEditText except AttributeError: # Or a QLineEdit getter = target.text setter = target.setText directory = str(getter()) if not os.path.isdir(directory): directory = "" directory = QtWidgets.QFileDialog.getExistingDirectory(dlg, caption, directory) if directory: setter(directory) chooser.clicked.connect(click_handler) def open_browser(url): try: import webbrowser open_func = webbrowser.open except ImportError: try: open_func = os.startfile except AttributeError: open_func = lambda x: None open_func(url) _extract_name_re = lazy_regex.lazy_compile('(.*?) <.*?@.*?>') _extract_email_re = lazy_regex.lazy_compile('<(.*?@.*?)>') def extract_name(author, strict=False): m = _extract_name_re.match(author) if m: name = m.group(1) else: if strict: name = author else: m = _extract_email_re.match(author) if m: name = m.group(1) else: name = author return name.strip() def format_timestamp(timestamp): """Returns unicode string representation of timestamp formatted in user locale""" date = QtCore.QDateTime() date.setTime_t(int(timestamp)) # RJLRJL possible removeal of toString needed return str(date.toString(QtCore.Qt.LocalDate)) def is_valid_encoding(encoding): import codecs try: codecs.lookup(encoding) except LookupError: return False return True def get_set_encoding(encoding, branch): """Return encoding value from branch config if encoding is None, otherwise store encoding value in branch config. """ if encoding is None: config = get_branch_config(branch) encoding = config.get_user_option("encoding") or 'utf-8' if not is_valid_encoding(encoding): from breezy.trace import note note(('NOTE: Invalid encoding value in branch config: %s\n' 'utf-8 will be used instead') % encoding) encoding = 'utf-8' else: if branch: # we should check boolean branch value to support 2 fake branch cases: branch is None, branch is FakeBranch branch.get_config().set_user_option("encoding", encoding) return encoding def file_extension(path): """Return extension of the file. This function is smarter than standard os.path.splitext, because it correctly process filenames with leading dot. (e.g. ".bzrignore") """ basename = os.path.basename(path) ix = basename.rfind('.') if ix > 0: ext = basename[ix:] else: ext = '' return ext class FilterOptions(object): """Filter options container.""" __slots__ = ['deleted', 'added', 'renamed', 'modified'] def __init__(self, all_enable=False, **kw): self.added = False self.deleted = False self.modified = False self.renamed = False if all_enable: self.added = True self.deleted = True self.modified = True self.renamed = True for k in kw: setattr(self, k, kw[k]) def all_enable(self): for i in self.__slots__: setattr(self, i, True) def __bool__(self): return self.added or self.deleted or self.modified or self.renamed def is_all_enable(self): return self.added and self.deleted and self.modified and self.renamed def to_str(self): s = [] if self.deleted: s.append(gettext('deleted files')) if self.added: s.append(gettext('added files')) if self.renamed: s.append(gettext('renamed files')) if self.modified: s.append(gettext('modified files')) return ', '.join(s) def check(self, status): """Check status (string) and return True if enabled. Allowed statuses: added, removed, deleted, renamed, modified, 'renamed and modified' @raise ValueError: when unsupported status given. """ if status == 'added': return self.added elif status in ('removed', 'deleted'): return self.deleted elif status == 'renamed': return self.renamed elif status == 'modified': return self.modified elif status == 'renamed and modified': return self.renamed or self.modified raise ValueError('unknown status: %r' % status) # 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 # branch (eg, creating a new one, pulling from non-parent), the branch # location entered by the user should be remembered *globally* (ie, for # the user rather than just for that branch) # * Pull dialogs almost always want to offer these remembered locations as # options - below the 'related' locations if any exist. # * Push dialogs almost never want to offer these 'global' options - they # only ever want to show 'related' branches plus old push branches # remembered against just this branch. # # We offer a number of iterators to help enumerate the possibilities, # and another helper to take these iterators and fill the combo. def iter_branch_related_locations(branch): for location in [branch.get_parent(), branch.get_bound_location(), branch.get_push_location(), branch.get_submit_branch(), ]: if location is not None: yield url_for_display(location) # A helper to fill a 'pull' combo. Returns the default value. def fill_pull_combo(combo, branch): if branch is None: p = '' related = [] else: p = url_for_display(branch.get_parent() or '') related = iter_branch_related_locations(branch) fill_combo_with(combo, p, related, iter_saved_pull_locations()) return p # A helper to fill a combo with values. Example usage: # fill_combo_with(combo, u'', iter_saved_pull_locations()) def fill_combo_with(combo, default, *iterables): done = set() for item in itertools.chain([default], *iterables): if item is not None and item not in done: done.add(item) combo.addItem(item) def show_shortcut_hint(action): """Show this action's shortcut, if any, as part of the tooltip. Make sure to set the shortcut and tooltip *before* calling this. """ shortcut = action.shortcut() if shortcut: toolTip = action.toolTip() action.setToolTip("%s (%s)" % (toolTip, shortcut)) def iter_saved_pull_locations(): """ Iterate the 'pull' locations we have previously saved for the user. """ config = get_qbrz_config() try: sect = config.get_section('Pull Locations') except KeyError: return [] items = sorted(sect.items()) return [i[1] for i in items] def save_pull_location(branch, location): """ Helper to optionally save the 'pull' location a user specified for a branch. Uses an MRU scheme to avoid runaway growth in the saved locations and keeping the most relevant locations at the top. The location is *not* saved if: * It is related to a branch (ie, the parent) * It is a directory """ if branch is not None and location in iter_branch_related_locations(branch): return if os.path.isdir(location): return existing = list(iter_saved_pull_locations()) try: existing.remove(location) except ValueError: pass existing.insert(0, location) # XXX - the number to save should itself be a preference??? max_items = 20 existing = existing[:max_items] config = get_qbrz_config() # and save it to the ini section = {} for i, save_location in enumerate(existing): # Use a 'sortable string' as the ID to save needing to do an int() # before sorting (you never know what might end up there if the user # edits it) key = "%04d" % i section[key] = save_location config.set_section('Pull Locations', section) config.save() def url_for_display(url): """Return human-readable URL or local path for file:/// URLs. Wrapper around breezy.urlutils.unescape_for_display """ if not url: return url return urlutils.unescape_for_display(url, 'utf-8') # RJL: on further investigation, this appears to be an attempt to detect # some kind of binary content (one assumes a file), so renamed. def content_seems_to_be_binary(lines: list) -> bool: """ Check list of lines for any binary content at all (i.e. presence of 0x00 byte there). @return: True if 0x00 byte found: we have to hope we haven't got binary data that hasn't got a null-byte in it. """ for line in lines: if isinstance(line, bytes) and b'\x00' in line: return True return False class BackgroundJob(object): def __init__(self, parent): self.is_running = False self.stoping = False self.parent = parent self.restart_timeout = None def run(self): pass def run_wrapper(self): try: self.run() except: self.parent.report_exception() self.is_running = False if self.restart_timeout: self.start(self.restart_timeout) def restart(self, timeout=0): self.restart_timeout = timeout raise trace.StopException() def start(self, timeout=0): if not self.is_running: self.is_running = True self.stoping = False QtCore.QTimer.singleShot(timeout, self.run_wrapper) def stop(self): self.stoping = True def processEvents(self, flags=QtCore.QEventLoop.AllEvents): self.parent.processEvents(flags) if self.stoping: self.stoping = False raise trace.StopException() loading_queue = None def runs_in_loading_queue(f): """Methods decorated with this will not run at the same time, but will be queued. Methods decorated with this will not be able to return results, but should rather update the ui themselves. Methods decorated with this should detect, and stop if their execution is no longer required. """ def decorate(*args, **kargs): run_in_loading_queue(f, *args, **kargs) return decorate def run_in_loading_queue(cur_f, *cur_args, **cur_kargs): global loading_queue if loading_queue is None: loading_queue = [] try: loading_queue.append((cur_f, cur_args, cur_kargs)) while len(loading_queue): try: f, args, kargs = loading_queue.pop(0) f(*args, **kargs) except: trace.report_exception() finally: loading_queue = None else: loading_queue.append((cur_f, cur_args, cur_kargs)) def get_apparent_authors_new(rev): return rev.get_apparent_authors() def get_apparent_authors_old(rev): return [rev.properties.get('author', rev.committer)] # RJLRJL WARNING:! This is run on import if hasattr(Revision, 'get_apparent_authors'): get_apparent_authors = get_apparent_authors_new else: get_apparent_authors = get_apparent_authors_old def get_apparent_author(rev): return ', '.join(get_apparent_authors(rev)) def get_apparent_author_name(rev): return ', '.join(map(extract_name, get_apparent_authors(rev))) def get_summary(rev): if rev.message is None: return gettext('(no message)') return rev.get_summary() or gettext('(no message)') def get_message(rev): return rev.message or gettext('(no message)') # RJLRJL not needed for python3 def ensure_unicode(s, encoding='ascii'): # TODO: get rid of this return s def open_tree(directory, ui_mode=False, _critical_dialog=QtWidgets.QMessageBox.critical): """Open working tree with its root at specified directory or above (similar to WorkingTree.open_containing). If there is no working tree and ui_mode is True then show GUI dialog with error message and None will be returned. Otherwise errors (NotBranchError or NoWorkingTree) will be propagated to caller. If directory is None then current directory will be used. @param _critical_dialog: could be used to provide mock object for testing. """ if directory is None: directory = '.' try: return WorkingTree.open_containing(directory)[0] except errors.NotBranchError: if ui_mode: _critical_dialog(None, gettext("Error"), gettext('Not a branch "%s"') % os.path.abspath(directory), gettext('&Close')) return None else: raise except errors.NoWorkingTree: if ui_mode: _critical_dialog(None, gettext("Error"), gettext('No working tree exists for "%s"') % os.path.abspath(directory), gettext('&Close')) return None else: raise def launchpad_project_from_url(url): """If url is a Launchpad code URL, get the project name. @return: project name or None """ # The format ought to be one of the following: # scheme://host/~user-id/project-name/branch-name # scheme://host/+branch/project-name # scheme://host/+branch/project-name/series-name # there could be distro branches, they are very complex, # so we only support upstream branches based on source package # scheme://host/+branch/DISTRO/SOURCEPACKAGE # scheme://host/+branch/DISTRO/SERIES/SOURCEPACKAGE # scheme://host/+branch/DISTRO/POCKET/SOURCEPACKAGE # scheme://host/~USER/DISTRO/SERIES/SOURCEPACKAGE/BRANCHNAME DISTROS = ('debian', 'ubuntu') from urllib.parse import urlsplit scheme, host, path = urlsplit(url)[:3] # Sanity check the host if (host in ('bazaar.launchpad.net', 'bazaar.launchpad.dev', 'bazaar.qastaging.launchpad.net', 'bazaar.staging.launchpad.net')): parts = path.strip('/').split('/') if parts[0].startswith('~'): if len(parts) == 3 and parts[1] not in DISTROS: # scheme://host/~user-id/project-name/branch-name/ return parts[1] elif len(parts) == 5 and parts[1] in DISTROS: # scheme://host/~USER/DISTRO/SERIES/SOURCEPACKAGE/BRANCHNAME return parts[-2] elif parts[0] in ('%2Bbranch', '+branch'): parts_length = len(parts) if parts_length >= 2: part1 = parts[1] if parts_length in (2,3) and part1 not in DISTROS: # scheme://host/+branch/project-name # scheme://host/+branch/project-name/series-name return part1 elif parts_length in (3,4) and part1 in DISTROS: # scheme://host/+branch/DISTRO/SOURCEPACKAGE # scheme://host/+branch/DISTRO/SERIES/SOURCEPACKAGE # scheme://host/+branch/DISTRO/POCKET/SOURCEPACKAGE return parts[-1] return None # RJLRJL: TODO: this lot needs serious updating def _shlex_split_unicode_linux(unicode_string): """Split unicode string to list of unicode arguments.""" return [p for p in shlex.split(unicode_string)] def _shlex_split_unicode_windows(unicode_string): """Split unicode string to list of unicode arguments. Take care about backslashes as valid path separators. """ utf8_string = unicode_string.replace('\\', '\\\\') return [p for p in shlex.split(utf8_string)] if MS_WINDOWS: shlex_split_unicode = _shlex_split_unicode_windows else: shlex_split_unicode = _shlex_split_unicode_linux def get_icon(name, size=22): # TODO: Load multiple sizes # TODO: Try load from system theme return QtGui.QIcon(":/%dx%d/%s.png" % (size, size, name)) class InfoWidget(QtWidgets.QFrame): def __init__(self, parent=None): QtWidgets.QFrame.__init__(self, parent) self.setFrameShape(QtWidgets.QFrame.StyledPanel) self.setAutoFillBackground(True) self.setBackgroundRole(QtGui.QPalette.ToolTipBase) self.setForegroundRole(QtGui.QPalette.ToolTipText) # Hackish test for monospace. Run bzr qcat lib/util.py to check. #888888888888888888888888888888888888888888888888888888888888888888888888888888 # 8 monospace_font = None def get_monospace_font(): global monospace_font if monospace_font is None: monospace_font = _get_monospace_font() return monospace_font def _get_monospace_font(): # TODO: Get font from system settings for Gnome, KDE, Mac. # (no windows option as far as I am aware) # Maybe have our own config setting. # Get the defaul font size size = QtWidgets.QApplication.font().pointSize() for font_family in ("Monospace", "Courier New"): font = QtGui.QFont(font_family, size) # check that this is really a monospace font if QtGui.QFontInfo(font).fixedPitch(): return font # try use style hints to find font. font = QtGui.QFont("", size) font.setFixedPitch(True) return font def get_set_tab_width_chars(branch=None, tab_width_chars=None): """Function to get the tab width in characters from the configuration. @param branch: Use branch.conf as well as bazaar.conf if this is provided. @param tab_width_chars: Number of characters to use as tab width: if branch is provided, the tab width will be stored in branch.conf Both arguments are optional, but if tab_width_chars is provided and branch is not, nothing will be done. @return: Tab width, in characters. """ if tab_width_chars is None: config = get_branch_config(branch) try: tab_width_chars = int(config.get_user_option('tab_width')) if tab_width_chars < 0: raise TypeError("Invalid tab width") except TypeError: tab_width_chars = 8 else: if branch: branch.get_config().set_user_option("tab_width", str(tab_width_chars)) return tab_width_chars def get_tab_width_pixels(branch=None, tab_width_chars=None): """Function to get the tab width in pixels based on a monospaced font. If tab_width_chars is provided, it is simply converted to a value in pixels. If it is not provided, the configuration is retrieved from bazaar.conf. If branch is provided (and tab_width_chars is not), branch.conf is also checked. @param tab_width_chars: Number of characters of tab width to convert to pixels. @param branch: Branch to use when retrieving tab width from configuration. @return: Tab width, in pixels. """ monospacedFont = get_monospace_font() char_width = QtGui.QFontMetrics(monospacedFont).width(" ") if tab_width_chars is None: tab_width_chars = get_set_tab_width_chars(branch=branch) return char_width*tab_width_chars ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/verify_signatures.py0000644000000000000000000001424714556556456015542 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2011 Canonical Ltd # Author Jonathan Riddell # # 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 breezy import controldir, osutils from breezy.info import show_bzrdir_info from breezy.plugins.qbrz.lib.i18n import gettext from breezy.plugins.qbrz.lib.ui_verify_signatures import Ui_VerifyForm from breezy.plugins.qbrz.lib.util import ( BTN_CLOSE, QBzrWindow, QBzrDialog, url_for_display, ThrobberWidget, ) from breezy import ( controldir as _mod_controldir, errors, gpg, revision as _mod_revision, ) from PyQt5.QtCore import * from PyQt5.QtGui import * from io import StringIO class QBzrVerifySignaturesWindow(QBzrDialog): """Show the user information on the status of digital signatures for the commits on this branch""" def __init__(self, acceptable_keys, revision, location, parent=None): """load UI file, add buttons and throbber, run refresh""" QBzrDialog.__init__(self, [gettext("Verify Signatures")], parent) self.restoreSize("verify-signatures", (580, 250)) self.buttonbox = self.create_button_box(BTN_CLOSE) self.ui = Ui_VerifyForm() self.ui.setupUi(self) self.ui.verticalLayout.addWidget(self.buttonbox) self.throbber = ThrobberWidget(self) self.ui.verticalLayout.insertWidget(0, self.throbber) self.acceptable_keys = acceptable_keys self.revision = revision self.location = location QTimer.singleShot(0, self.refresh_view) def refresh_view(self): """get the revisions wanted by the user, do the verifications and popular the tree widget with the results""" self.throbber.show() controldir = _mod_controldir.ControlDir.open_containing(self.location)[0] branch = controldir.open_branch() repo = branch.repository branch_config = branch.get_config_stack() gpg_strategy = gpg.GPGStrategy(branch_config) gpg_strategy.set_acceptable_keys(self.acceptable_keys) if branch.name is None: header = branch.user_url else: header = branch.name self.ui.treeWidget.setHeaderLabels([str(header)]) # get our list of revisions revisions = [] if self.revision is not None: if len(self.revision) == 1: revno, rev_id = self.revision[0].in_history(branch) revisions.append(rev_id) elif len(sel.revision) == 2: from_revno, from_revid = self.revision[0].in_history(branch) to_revno, to_revid = self.revision[1].in_history(branch) if to_revid is None: to_revno = branch.revno() if from_revno is None or to_revno is None: raise errors.BzrCommandError('Cannot verify a range of non-revision-history revisions') for revno in range(from_revno, to_revno + 1): revisions.append(branch.get_rev_id(revno)) else: # all revisions by default including merges graph = repo.get_graph() revisions = [] repo.lock_read() for rev_id, parents in graph.iter_ancestry( [branch.last_revision()]): if _mod_revision.is_null(rev_id): continue if parents is None: # Ignore ghosts continue revisions.append(rev_id) repo.unlock() count, result, all_verifiable = gpg.bulk_verify_signatures(repo, revisions, gpg_strategy, QApplication.processEvents) if all_verifiable: message = QTreeWidgetItem([gettext("All commits signed with verifiable keys")]) self.ui.treeWidget.addTopLevelItem(message) for verbose_message in gpg.verbose_valid_message(result): QTreeWidgetItem(message, [verbose_message]) else: valid_commit_message = QTreeWidgetItem([gpg.valid_commits_message(count)]) self.ui.treeWidget.addTopLevelItem(valid_commit_message) for verbose_message in gpg.verbose_valid_message(result): QTreeWidgetItem(valid_commit_message, [verbose_message]) expired_key_message = QTreeWidgetItem([gpg.expired_commit_message(count)]) self.ui.treeWidget.addTopLevelItem(expired_key_message) for verbose_message in gpg.verbose_expired_key_message(result, repo): QTreeWidgetItem(expired_key_message, [verbose_message]) unknown_key_message = QTreeWidgetItem([gpg.unknown_key_message(count)]) self.ui.treeWidget.addTopLevelItem(unknown_key_message) for verbose_message in gpg.verbose_missing_key_message(result): QTreeWidgetItem(unknown_key_message, [verbose_message]) commit_not_valid_message = QTreeWidgetItem([gpg.commit_not_valid_message(count)]) self.ui.treeWidget.addTopLevelItem(commit_not_valid_message) for verbose_message in gpg.verbose_not_valid_message(result, repo): QTreeWidgetItem(commit_not_valid_message, [verbose_message]) commit_not_signed_message = QTreeWidgetItem([gpg.commit_not_signed_message(count)]) self.ui.treeWidget.addTopLevelItem(commit_not_signed_message) for verbose_message in gpg.verbose_not_signed_message(result, repo): QTreeWidgetItem(commit_not_signed_message, [verbose_message]) self.throbber.hide() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/widgets/0000755000000000000000000000000014556556456013056 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/win32util.py0000644000000000000000000000357214556556456013631 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2013 QBzr Developers # # 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. """Only for Windows.""" import ctypes import platform # Internal versions of Microsoft Windows XP = '5.1' Vista = '6.0' Win7 = '6.1' Win8 = '6.2' def is_vista_or_higher(): win_ver = platform.win32_ver()[1] if win_ver >= Vista: return True else: return False def is_vista_or_win7(): win_ver = platform.win32_ver()[1] if win_ver >= Vista and win_ver < Win8: return True else: return False def is_win8_or_higher(): win_ver = platform.win32_ver()[1] if win_ver >= Win8: return True else: return False def is_aero_enabled(): if not is_vista_or_higher(): return False try: bResult = ctypes.c_int(0) # DwmIsCompositionEnabled function should tell us whether aero is enabled ctypes.windll.dwmapi.DwmIsCompositionEnabled(ctypes.byref(bResult)) return bool(bResult.value) except Exception as e: # that's really bad, I know, shame on me print(e) # if we will be there somebody will let me know which exactly error there is return False ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/extra/__init__.py0000644000000000000000000000000014556556456014632 0ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/extra/bugurl.py0000644000000000000000000000440714556556456014412 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2008 Lukáš Lalinský # # 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 breezy import commands, errors, trace, bugtracker from breezy.config import GlobalConfig from breezy.branch import Branch from breezy.option import Option from breezy.plugins.qbrz.lib.bugs import FakeBranchForBugs class cmd_bug_url(commands.Command): """Print full URL to a specific bug, or open it in your browser.""" takes_args = ['bug_id'] takes_options = [ Option('open', help='Open the URL in a web browser.'), ] def run(self, bug_id, open=False): # we import from qbrz.lib.util here because that module # has dependency on PyQt4 (see bug #327487) from breezy.plugins.qbrz.lib.util import open_browser, url_for_display try: branch = Branch.open_containing('.')[0] except errors.NotBranchError: branch = FakeBranchForBugs() tokens = bug_id.split(':') if len(tokens) != 2: raise errors.BzrCommandError("Invalid bug %s. Must be in the form of 'tag:id'." % bug_id) tag, tag_bug_id = tokens try: bug_url = bugtracker.get_bug_url(tag, branch, tag_bug_id) except errors.UnknownBugTrackerAbbreviation: raise errors.BzrCommandError('Unrecognized bug %s.' % bug_id) except errors.MalformedBugIdentifier: raise errors.BzrCommandError("Invalid bug identifier for %s." % bug_id) self.outf.write(url_for_display(bug_url) + "\n") if open: open_browser(bug_url) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/extra/isignored.py0000644000000000000000000000275014556556456015074 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2008 Lukáš Lalinský # # 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 breezy import commands, workingtree, errors, trace class cmd_is_ignored(commands.Command): """Check if a path is ignored. :Exit values: 0 - not ignored 1 - ignored 3 - error """ takes_args = ['filename'] hidden = True def run(self, filename): tree, relpath = workingtree.WorkingTree.open_containing(filename) if tree.is_ignored(relpath) and not tree.is_versioned(relpath): if not trace.is_quiet(): print('ignored', file=self.outf) return 1 else: if not trace.is_quiet(): print('not ignored', file=self.outf) return 0 ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/extra/isversioned.py0000644000000000000000000000272314556556456015443 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2008 Lukáš Lalinský # # 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 breezy import commands, workingtree, errors, trace class cmd_is_versioned(commands.Command): """Check if a path is versioned. :Exit values: 0 - not versioned 1 - versioned 3 - error """ takes_args = ['filename'] hidden = True def run(self, filename): tree, relpath = workingtree.WorkingTree.open_containing(filename) if tree.is_versioned(relpath): if not trace.is_quiet(): print('versioned', file=self.outf) return 1 else: if not trace.is_quiet(): print('not versioned', file=self.outf) return 0 ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/Makefile0000644000000000000000000000003614556556456014211 0ustar00test: $(MAKE) -C ../../ test ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/__init__.py0000644000000000000000000000636714556556456014677 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2008 Lukáš Lalinský # # 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. # The QBrz makefile # import os import sys from breezy import ( tests, trace, ) try: from PyQt5 import QtGui, QtTest, QtWidgets except ImportError: pass def load_tests(loader, basic_tests, pattern): testmod_names = [ 'mock', 'test_annotate', 'test_autocomplete', 'test_bugs', 'test_cat', 'test_commit', 'test_commit_data', # 'test_diffview', # - broken by API changes 'test_extra_isignored', 'test_extra_isversioned', 'test_i18n', 'test_log', 'test_loggraphviz', 'test_logmodel', 'test_revisionmessagebrowser', # RJLRJL ignore spellcheck for now 'test_spellcheck', 'test_subprocess', 'test_tree_branch', 'test_treewidget', 'test_util', 'test_decorator', 'test_guidebar', 'test_extdiff', ] for name in testmod_names: m = "%s.%s" % (__name__, name) try: basic_tests.addTests(loader.loadTestsFromModuleName(m)) except ImportError as e: if str(e).endswith('PyQt5'): trace.note('QBrz: skip module %s because PyQt5 is not installed' % m) else: raise return basic_tests # The application should be initialized only once pre process, but this should # be delayed until the first tests is run in a given process, doing it when the # tests are loaded is too early and failed for selftest --parallel=fork _qt_app = None class QTestCase(tests.TestCaseWithTransport): def setUp(self): super(QTestCase, self).setUp() global _qt_app if _qt_app is None: _qt_app = QtWidgets.QApplication(sys.argv) def excepthook_tests(eclass, evalue, tb): def _reraise_on_cleanup(): raise eclass(evalue).with_traceback(tb) self.addCleanup(_reraise_on_cleanup) self.overrideAttr(sys, "excepthook", excepthook_tests) def waitUntil(self, break_condition, timeout, timeout_msg=None): erapsed = 0 while (True): if break_condition(): # RJL: Give ourselves a little bit more time. Tests # are less flaky (but still flaky) QtTest.QTest.qWait(200) return if timeout < erapsed: self.fail(timeout_msg or 'Timeout!') QtTest.QTest.qWait(200) erapsed += 200 ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/mock.py0000644000000000000000000000350514556556456014060 0ustar00# -*- coding: utf-8 -*- # # Copyright (C) 2009 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. """Simple mock objects.""" from breezy.tests import TestCase class MockFunction(object): """Mock function object that remember how many times it called and which arguments were used. """ def __init__(self, func=None, ret=None): self.count = 0 self.args = [] self._func = func self.ret = ret def __call__(self, *args, **kw): self.count += 1 self.args.append((args, kw)) if self._func is not None: return self._func(*args, **kw) else: return self.ret class TestMockFunction(TestCase): def test_call(self): mf = MockFunction() self.assertEqual(0, mf.count) self.assertEqual([], mf.args) # 1st call mf(None, 1, 'foo') self.assertEqual(1, mf.count) self.assertEqual([((None, 1, 'foo'), {})], mf.args) # 2nd call mf('bar', baz='spam') self.assertEqual(2, mf.count) self.assertEqual([ ((None, 1, 'foo'), {}), (('bar',), {'baz': 'spam'}), ], mf.args) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/modeltest.py0000644000000000000000000005466414556556456015143 0ustar00############################################################################# ## ## Copyright (C) 2007 Trolltech ASA. All rights reserved. ## ## This file is part of the Qt Concurrent project on Trolltech Labs. ## ## This file may be used under the terms of the GNU General Public ## License version 2.0 as published by the Free Software Foundation ## and appearing in the file LICENSE.GPL included in the packaging of ## this file. Please review the following information to ensure GNU ## General Public Licensing requirements will be met: ## http://www.trolltech.com/products/qt/opensource.html ## ## If you are unsure which license is appropriate for your use, please ## review the following information: ## http://www.trolltech.com/products/qt/licensing.html or contact the ## sales department at sales@trolltech.com. ## ## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ## ############################################################################# from PyQt5 import sip from PyQt5 import QtCore class ModelTest(QtCore.QObject): def __init__(self, _model, parent): """ Connect to all of the models signals, Whenever anything happens recheck everything. """ QtCore.QObject.__init__(self,parent) self._model = _model # QAbstractItemModel gives us a simple table of rows and columns. Each item in it (cell) # has a unique index via QtCore.QModelIndex with row, colum # for example: # 0 1 2 # 0 . , , # 1 . . X <-- this X is at row:1, column:2 # 2 . . . # # Any data associated with X can be retrieved via the data() function # passing it the 'role' that the data plays. The data is set via setData(). # self.model = sip.cast(_model, QtCore.QAbstractItemModel) self.insert = [] self.remove = [] self.fetchingMore = False assert self.model self.model.columnsAboutToBeInserted[QtCore.QModelIndex, int, int].connect(self.runAllTests) self.model.columnsAboutToBeRemoved[QtCore.QModelIndex, int, int].connect(self.runAllTests) self.model.columnsInserted[QtCore.QModelIndex, int, int].connect(self.runAllTests) self.model.columnsRemoved[QtCore.QModelIndex, int, int].connect(self.runAllTests) # self.model.dataChanged[QtCore.QModelIndex, QtCore.QModelIndex].connect(self.runAllTests) self.model.headerDataChanged[QtCore.Qt.Orientation, int, int].connect(self.runAllTests) self.model.layoutAboutToBeChanged.connect(self.runAllTests) self.model.layoutChanged.connect(self.runAllTests) self.model.modelReset.connect(self.runAllTests) self.model.rowsAboutToBeInserted[QtCore.QModelIndex, int, int].connect(self.runAllTests) self.model.rowsAboutToBeRemoved[QtCore.QModelIndex, int, int].connect(self.runAllTests) self.model.rowsInserted[QtCore.QModelIndex, int, int].connect(self.runAllTests) self.model.rowsRemoved[QtCore.QModelIndex, int, int].connect(self.runAllTests) # Special checks for inserting/removing self.model.rowsAboutToBeInserted[QtCore.QModelIndex, int, int].connect(self.rowsAboutToBeInserted) self.model.rowsAboutToBeRemoved[QtCore.QModelIndex, int, int].connect(self.rowsAboutToBeRemoved) self.model.rowsInserted[QtCore.QModelIndex, int, int].connect(self.rowsInserted) self.model.rowsRemoved[QtCore.QModelIndex, int, int].connect(self.rowsRemoved) self.runAllTests() def nonDestructiveBasicTest(self): """ nonDestructiveBasicTest tries to call a number of the basic functions (not all) to make sure the model doesn't outright segfault, testing the functions that makes sense. """ assert(self.model.buddy(QtCore.QModelIndex()) == QtCore.QModelIndex()) self.model.canFetchMore(QtCore.QModelIndex()) assert(self.model.columnCount(QtCore.QModelIndex()) >= 0) # Try to fetch something from nothing - this: # # self.model.data(QtCore.QModelIndex(), QtCore.Qt.DisplayRole) # # reads as: # # from the (.data) table at (an invalid QtCore.QModelIndex) try to get a DisplayRole # # A bare QtCore.QModelIndex() creates a new empty index, and will be invalid: asking for the # displayRole will bring back (or used to bring back) an invalid QVariant rather than # raising an exception. With QVariant(2) set via sip, we don't get QVariants at all # but a NoneType. # Was: assert(self.model.data(QtCore.QModelIndex(), QtCore.Qt.DisplayRole) == QtCore.QVariant()) assert(self.model.data(QtCore.QModelIndex(), QtCore.Qt.DisplayRole) is None) self.fetchingMore = True self.model.fetchMore(QtCore.QModelIndex()) self.fetchingMore = False flags = self.model.flags(QtCore.QModelIndex()) assert(int(flags & QtCore.Qt.ItemIsEnabled) == QtCore.Qt.ItemIsEnabled or int(flags & QtCore.Qt.ItemIsEnabled) == 0) self.model.hasChildren(QtCore.QModelIndex()) self.model.hasIndex(0,0) self.model.headerData(0,QtCore.Qt.Horizontal, QtCore.Qt.DisplayRole) self.model.index(0,0, QtCore.QModelIndex()) self.model.itemData(QtCore.QModelIndex()) # Match returns indices for items were the data role (e.g. DisplayRole) matches the value (QVariant) # # so, this: # cache = QtCore.QVariant() # self.model.match(QtCore.QModelIndex(), -1, cache) # reads as: # Try to get things from the table that match the (non-existent) -1 'role' # where the data stored there matches Qvariant # We haven't got QVariants any more, so just pass anything self.model.match(QtCore.QModelIndex(), -1, 'a string') self.model.mimeTypes() assert(self.model.parent(QtCore.QModelIndex()) == QtCore.QModelIndex()) assert(self.model.rowCount(QtCore.QModelIndex()) >= 0) # setData(index, value, role) sets the (role) data at the index to value. # so, this: # variant = QtCore.QVariant() # self.model.setData(QtCore.QModelIndex(), variant, -1) # reads as: # Put an empty QVariant() at an invalid index as an invalid role self.model.setData(QtCore.QModelIndex(), 'a string', -1) # Sets the data a dummy horizontal section (-1) to an empty QVariant... # self.model.setHeaderData(-1, QtCore.Qt.Horizontal, QtCore.QVariant()) # ...and for section zero # self.model.setHeaderData(0, QtCore.Qt.Horizontal, QtCore.QVariant()) # and for section 999999 # self.model.setHeaderData(999999, QtCore.Qt.Horizontal, QtCore.QVariant()) self.model.setHeaderData(-1, QtCore.Qt.Horizontal, 'a string') self.model.setHeaderData(0, QtCore.Qt.Horizontal, 'a string') self.model.setHeaderData(999999, QtCore.Qt.Horizontal, 'a string') self.model.sibling(0,0,QtCore.QModelIndex()) self.model.span(QtCore.QModelIndex()) self.model.supportedDropActions() def rowCount(self): """ Tests self.model's implementation of QtCore.QAbstractItemModel::rowCount() and hasChildren() self.models that are dynamically populated are not as fully tested here. """ # check top row topindex = self.model.index(0,0,QtCore.QModelIndex()) rows = self.model.rowCount(topindex) assert(rows >= 0) if rows > 0: assert(self.model.hasChildren(topindex) is True) secondlvl = self.model.index(0,0,topindex) if secondlvl.isValid(): # check a row count where parent is valid rows = self.model.rowCount(secondlvl) assert(rows >= 0) if rows > 0: assert(self.model.hasChildren(secondlvl) is True) # The self.models rowCount() is tested more extensively in checkChildren, # but this catches the big mistakes def columnCount(self): """ Tests self.model's implementation of QtCore.QAbstractItemModel::columnCount() and hasChildren() """ # check top row topidx = self.model.index(0,0,QtCore.QModelIndex()) assert(self.model.columnCount(topidx) >= 0) # check a column count where parent is valid childidx = self.model.index(0,0,topidx) if childidx.isValid() : assert(self.model.columnCount(childidx) >= 0) # columnCount() is tested more extensively in checkChildren, # but this catches the big mistakes def hasIndex(self): """ Tests self.model's implementation of QtCore.QAbstractItemModel::hasIndex() """ # Make sure that invalid values returns an invalid index assert(self.model.hasIndex(-2,-2) == False) assert(self.model.hasIndex(-2,0) == False) assert(self.model.hasIndex(0,-2) == False) rows = self.model.rowCount(QtCore.QModelIndex()) cols = self.model.columnCount(QtCore.QModelIndex()) # check out of bounds assert(self.model.hasIndex(rows,cols) == False) assert(self.model.hasIndex(rows+1,cols+1) == False) if rows > 0: assert(self.model.hasIndex(0,0) == True) # hasIndex() is tested more extensively in checkChildren() # but this catches the big mistakes def index(self): """ Tests self.model's implementation of QtCore.QAbstractItemModel::index() """ # Make sure that invalid values returns an invalid index assert(self.model.index(-2,-2, QtCore.QModelIndex()) == QtCore.QModelIndex()) assert(self.model.index(-2,0, QtCore.QModelIndex()) == QtCore.QModelIndex()) assert(self.model.index(0,-2, QtCore.QModelIndex()) == QtCore.QModelIndex()) rows = self.model.rowCount(QtCore.QModelIndex()) cols = self.model.columnCount(QtCore.QModelIndex()) if rows == 0: return # Catch off by one errors assert(self.model.index(rows,cols, QtCore.QModelIndex()) == QtCore.QModelIndex()) assert(self.model.index(0,0, QtCore.QModelIndex()).isValid() == True) # Make sure that the same index is *always* returned a = self.model.index(0,0, QtCore.QModelIndex()) b = self.model.index(0,0, QtCore.QModelIndex()) assert(a==b) # index() is tested more extensively in checkChildren() # but this catches the big mistakes def parent(self): """ Tests self.model's implementation of QtCore.QAbstractItemModel::parent() """ # Make sure the self.model wont crash and will return an invalid QtCore.QModelIndex # when asked for the parent of an invalid index assert(self.model.parent(QtCore.QModelIndex()) == QtCore.QModelIndex()) if self.model.rowCount(QtCore.QModelIndex()) == 0: return; # Column 0 | Column 1 | # QtCore.Qself.modelIndex() | | # \- topidx | topidx1 | # \- childix | childidx1 | # Common error test #1, make sure that a top level index has a parent # that is an invalid QtCore.Qself.modelIndex topidx = self.model.index(0,0,QtCore.QModelIndex()) assert(self.model.parent(topidx) == QtCore.QModelIndex()) # Common error test #2, make sure that a second level index has a parent # that is the first level index if self.model.rowCount(topidx) > 0 : childidx = self.model.index(0,0,topidx) assert(self.model.parent(childidx) == topidx) # Common error test #3, the second column should NOT have the same children # as the first column in a row # Usually the second column shouldn't have children topidx1 = self.model.index(0,1,QtCore.QModelIndex()) if self.model.rowCount(topidx1) > 0: childidx = self.model.index(0,0,topidx) childidx1 = self.model.index(0,0,topidx1) assert(childidx != childidx1) # Full test, walk n levels deep through the self.model making sure that all # parent's children correctly specify their parent self.checkChildren(QtCore.QModelIndex()) def data(self): """ Tests self.model's implementation of QtCore.QAbstractItemModel::data() """ # Invalid index should return an invalid qvariant # assert( not self.model.data(QtCore.QModelIndex(), QtCore.Qt.DisplayRole).isValid()) # # The above is no longer true: it should return None... assert(self.model.data(QtCore.QModelIndex(), QtCore.Qt.DisplayRole) is None) if self.model.rowCount(QtCore.QModelIndex()) == 0: return # A valid index should have a valid QtCore.QVariant data assert(self.model.index(0,0, QtCore.QModelIndex()) is not None) # shouldn't be able to set data on an invalid index assert(self.model.setData(QtCore.QModelIndex(), "foo", QtCore.Qt.DisplayRole) is False) # General Purpose roles that should return a QString variant = self.model.data(self.model.index(0,0,QtCore.QModelIndex()), QtCore.Qt.ToolTipRole) # We no longer use isValid(), so just test it exists if variant: assert( variant.canConvert( QtCore.QVariant.String ) ) variant = self.model.data(self.model.index(0,0,QtCore.QModelIndex()), QtCore.Qt.StatusTipRole) if variant: assert( variant.canConvert( QtCore.QVariant.String ) ) variant = self.model.data(self.model.index(0,0,QtCore.QModelIndex()), QtCore.Qt.WhatsThisRole) if variant: assert( variant.canConvert( QtCore.QVariant.String ) ) # General Purpose roles that should return a QSize variant = self.model.data(self.model.index(0,0,QtCore.QModelIndex()), QtCore.Qt.SizeHintRole) if variant: assert( variant.canConvert( QtCore.QVariant.Size ) ) # General Purpose roles that should return a QFont variant = self.model.data(self.model.index(0,0,QtCore.QModelIndex()), QtCore.Qt.FontRole) if variant: assert( variant.canConvert( QtCore.QVariant.Font ) ) # Check that the alignment is one we know about variant = self.model.data(self.model.index(0,0,QtCore.QModelIndex()), QtCore.Qt.TextAlignmentRole) if variant: # alignment = variant.toInt()[0] alignment = int(variant) assert( alignment == QtCore.Qt.AlignLeft or alignment == QtCore.Qt.AlignRight or alignment == QtCore.Qt.AlignHCenter or alignment == QtCore.Qt.AlignJustify) # General Purpose roles that should return a QColor variant = self.model.data(self.model.index(0,0,QtCore.QModelIndex()), QtCore.Qt.BackgroundColorRole) if variant: assert(variant.canConvert( QtCore.QVariant.Color )) variant = self.model.data(self.model.index(0,0,QtCore.QModelIndex()), QtCore.Qt.TextColorRole) if variant: assert(variant.canConvert( QtCore.QVariant.Color )) # Check that the "check state" is one we know about. variant = self.model.data(self.model.index(0,0,QtCore.QModelIndex()), QtCore.Qt.CheckStateRole) if variant: # state = variant.toInt()[0] state = int(variant) assert( state == QtCore.Qt.Unchecked or state == QtCore.Qt.PartiallyChecked or state == QtCore.Qt.Checked ) def runAllTests(self): if self.fetchingMore: return self.nonDestructiveBasicTest() self.rowCount() self.columnCount() self.hasIndex() self.index() self.parent() self.data() def rowsAboutToBeInserted(self, parent, start, end): """ Store what is about to be inserted to make sure it actually happens """ c = {} c['parent'] = parent c['oldSize'] = self.model.rowCount(parent) c['last'] = self.model.data(model.index(start-1, 0, parent)) c['next'] = self.model.data(model.index(start, 0, parent)) insert.append(c) def rowsInserted(self, parent, start, end): """ Confirm that what was said was going to happen actually did """ c = insert.pop() assert(c['parent'] == parent) assert(c['oldSize'] + (end - start + 1) == self.model.rowCount(parent)) assert(c['last'] == self.model.data(model.index(start-1, 0, c['parent']))) # if c['next'] != self.model.data(model.index(end+1, 0, c['parent'])): # qDebug << start << end # for i in range(0, self.model.rowCount(QtCore.QModelIndex())): # qDebug << self.model.index(i, 0).data().toString() # qDebug() << c['next'] << self.model.data(model.index(end+1, 0, c['parent'])) assert(c['next'] == self.model.data(model.index(end+1, 0, c['parent']))) def rowsAboutToBeRemoved(self, parent, start, end): """ Store what is about to be inserted to make sure it actually happens """ c = {} c['parent'] = parent c['oldSize'] = self.model.rowCount(parent) c['last'] = self.model.data(model.index(start-1, 0, parent)) c['next'] = self.model.data(model.index(end+1, 0, parent)) remove.append(c) def rowsRemoved(self, parent, start, end): """ Confirm that what was said was going to happen actually did """ c = remove.pop() assert(c['parent'] == parent) assert(c['oldSize'] - (end - start + 1) == self.model.rowCount(parent)) assert(c['last'] == self.model.data(model.index(start-1, 0, c['parent']))) assert(c['next'] == self.model.data(model.index(start, 0, c['parent']))) def checkChildren(self, parent, depth = 0): """ Called from parent() test. A self.model that returns an index of parent X should also return X when asking for the parent of the index This recursive function does pretty extensive testing on the whole self.model in an effort to catch edge cases. This function assumes that rowCount(QtCore.QModelIndex()), columnCount(QtCore.QModelIndex()) and index() already work. If they have a bug it will point it out, but the above tests should have already found the basic bugs because it is easier to figure out the problem in those tests then this one """ # First just try walking back up the tree. p = parent; while p.isValid(): p = p.parent() #For self.models that are dynamically populated if self.model.canFetchMore( parent ): self.fetchingMore = True self.model.fetchMore(parent) self.fetchingMore = False rows = self.model.rowCount(parent) cols = self.model.columnCount(parent) if rows > 0: assert(self.model.hasChildren(parent)) # Some further testing against rows(), columns, and hasChildren() assert( rows >= 0 ) assert( cols >= 0 ) if rows > 0: assert(self.model.hasChildren(parent) == True) # qDebug() << "parent:" << self.model.data(parent).toString() << "rows:" << rows # << "columns:" << cols << "parent column:" << parent.column() assert( self.model.hasIndex( rows+1, 0, parent) == False) for r in range(0,rows): if self.model.canFetchMore(parent): self.fetchingMore = True self.model.fetchMore(parent) self.fetchingMore = False assert(self.model.hasIndex(r,cols+1,parent) == False) for c in range(0,cols): assert(self.model.hasIndex(r,c,parent)) index = self.model.index(r,c,parent) # rowCount(QtCore.QModelIndex()) and columnCount(QtCore.QModelIndex()) said that it existed... assert(index.isValid() == True) # index() should always return the same index when called twice in a row modIdx = self.model.index(r,c,parent) assert(index == modIdx) # Make sure we get the same index if we request it twice in a row a = self.model.index(r,c,parent) b = self.model.index(r,c,parent) assert( a == b ) # Some basic checking on the index that is returned # assert( index.model() == self.model ) # This raises an error that is not part of the qbrz code. # see http://www.opensubscriber.com/message/pyqt@riverbankcomputing.com/10335500.html assert( index.row() == r ) assert( index.column() == c ) # While you can technically return a QtCore.QVariant usually this is a sign # if an bug in data() Disable if this really is ok in your self.model # assert( self.model.data(index, QtCore.Qt.DisplayRole).isValid() == True ) # # We no longer check isValid(), just make sure it's not None assert( self.model.data(index, QtCore.Qt.DisplayRole) is not None) #if the next test fails here is some somehwat useful debug you play with # if self.model.parent(index) != parent: # qDebug() << r << c << depth << self.model.data(index).toString() # << self.model.data(parent).toString() # qDebug() << index << parent << self.model.parent(index) # # And a view that you can even use to show the self.model # # view = QtGui.QTreeView() # # view.setself.model(model) # # view.show() # # Check that we can get back our real parent p = self.model.parent( index ) assert( p.internalId() == parent.internalId() ) assert( p.row() == parent.row() ) # recursively go down the children if self.model.hasChildren(index) and depth < 10: # qDebug() << r << c << "hasChildren" << self.model.rowCount(index) self.checkChildren(index, ++depth) #else: # if depth >= 10: # qDebug() << "checked 10 deep" # Make sure that after testing the children that the index doesn't change newIdx = self.model.index(r,c,parent) assert(index == newIdx) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_annotate.py0000644000000000000000000000614114556556456015776 0ustar00# -*- coding: utf-8 -*- # # Copyright (C) 2009 Gary van der Merwe # # 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. # Updated RJL 2020 - added b(ytes) prefix to strings where needed based # upon the same usage in breezy/tests/test_annotate.py # Note that although this was originally copied from the same # (as per the old comment below) this now differs quite a bit # and is closest to test_annotate_author_or_committer in breezy commit # 7513 of 2020-06-11 from breezy.tests import TestCase, TestCaseWithTransport from PyQt5 import QtCore from breezy.conflicts import ConflictList from breezy.plugins.qbrz.lib import tests as qtests from breezy.plugins.qbrz.lib.annotate import AnnotateWindow class TestAnnotate(qtests.QTestCase): # Copied from breezy/tests/test_annotate.py def create_merged_trees(self): """create 2 trees with merges between them. rev-1 --+ | | rev-2 rev-1_1_1 | | +------+ | rev-3 """ tree1 = self.make_branch_and_tree('tree1') self.build_tree_contents([('tree1/a', b'first\n')]) tree1.add(['a'], ids=[b'a-id']) tree1.commit('a', rev_id=b'rev-1', committer="joe@foo5.com", timestamp=1166046000.00, timezone=0) tree2 = tree1.controldir.sprout('tree2').open_workingtree() self.build_tree_contents([('tree1/a', b'first\nsecond\n')]) tree1.commit('b', rev_id=b'rev-2', committer='joe@foo5.com', timestamp=1166046001.00, timezone=0) self.build_tree_contents([('tree2/a', b'first\nthird\n')]) tree2.commit('c', rev_id=b'rev-1_1_1', committer="barry@foo5.com", timestamp=1166046002.00, timezone=0) conflicts = tree1.merge_from_branch(tree2.branch) if isinstance(conflicts, int): # brz < 3.2 self.assertEqual(1, conflicts) else: self.assertEqual(1, len(conflicts)) self.build_tree_contents([('tree1/a', b'first\nsecond\nthird\n')]) tree1.set_conflicts(ConflictList()) tree1.commit('merge 2', rev_id=b'rev-3', committer='sal@foo5.com', timestamp=1166046003.00, timezone=0) return tree1, tree2 def test_just_show_annotate(self): tree1, tree2 = self.create_merged_trees() win = AnnotateWindow(tree1.branch, tree1, tree1, 'a', b'a-id') self.addCleanup(win.close) win.show() # If you want to see the output, add a sleep after this QtCore.QCoreApplication.processEvents() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_autocomplete.py0000644000000000000000000000657514556556456016701 0ustar00# -*- coding: utf-8 -*- # # Copyright (C) 2008 Lukáš Lalinský # # 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. """Tests for QBzr plugin.""" from breezy.tests import TestCase from io import StringIO from breezy.plugins.qbrz.lib.autocomplete import get_wordlist_builder class TestAutocomplete(TestCase): def assertIn(self, item, container): """Assert that `item` is present in `container`.""" if item not in container: raise AssertionError("value(s) %r not present in container %r" % (item, container)) def test_cpp_header(self): source = ''' class ClassName { public: ClassName() { calledFunction(); } }; ''' words = list(get_wordlist_builder('.h').iter_words(StringIO(source))) self.assertIn('ClassName', words) self.assertIn('calledFunction', words) def test_cpp_header_space_after_name(self): # space between function name and opening parenthesis is legal in C source = "void foo_bar (void);" words = list(get_wordlist_builder('.h').iter_words(StringIO(source))) self.assertIn('foo_bar', words) def test_cpp_source(self): source = ''' ClassName::function1() { function2() } ''' words = list(get_wordlist_builder('.cpp').iter_words(StringIO(source))) self.assertIn('ClassName', words) self.assertIn('ClassName::function1', words) self.assertIn('function1', words) self.assertIn('function2', words) def test_c_source_space_after_name(self): # space between function name and opening parenthesis is legal in C source = """ void foo_bar (void) { return; } """ words = list(get_wordlist_builder('.c').iter_words(StringIO(source))) self.assertIn('foo_bar', words) def test_c_header_with_typedef(self): source = """ typedef struct Foo { int i; } Foo; typedef union Bar { int i; float f; } Bar; """ words = list(get_wordlist_builder('.h').iter_words(StringIO(source))) self.assertIn('Foo', words) self.assertIn('Bar', words) def test_java(self): source = ''' package bar.foo; public class ClassName1 extends ClassName2 { public void function1() { } } ''' words = list(get_wordlist_builder('.java').iter_words(StringIO(source))) self.assertIn('ClassName1', words) self.assertIn('ClassName2', words) self.assertIn('function1', words) def test_python(self): source = ''' class ClassName(object): def function(self): self.var = 1 ''' words = list(get_wordlist_builder('.py').iter_words(StringIO(source))) self.assertIn('ClassName', words) self.assertIn('function', words) self.assertIn('var', words) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_bugs.py0000644000000000000000000001643714556556456015136 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # # 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. # Works without changes - RJL 2020s from breezy import config from breezy.tests import TestCase, TestCaseWithTransport from breezy.plugins.qbrz.lib.bugs import ( bug_urls_to_ids, get_branch_bug_tags, get_bug_id, get_global_bug_tags, get_unique_bug_tags, get_user_bug_trackers_tags, ) class TestGetBugId(TestCase): def test_launchpad(self): self.assertEqual('261234', get_bug_id('https://launchpad.net/bugs/261234')) def test_trac(self): self.assertEqual('3852', get_bug_id('http://bugs.musicbrainz.org/ticket/3852')) def test_bugzilla(self): self.assertEqual('169104', get_bug_id('http://bugs.kde.org/show_bug.cgi?id=169104')) def test_redmine(self): self.assertEqual('1832', get_bug_id('http://www.redmine.org/issues/show/1832')) self.assertEqual('6', get_bug_id('https://rm.ftrahan.com/issues/6')) def test_fogbugz(self): self.assertEqual('1234', get_bug_id('http://test.fogbugz.com/default.asp?1234')) def test_roundup(self): self.assertEqual('5243', get_bug_id('http://bugs.python.org/issue5243')) def test_mantis(self): self.assertEqual('7721', get_bug_id('http://www.mantisbt.org/bugs/view.php?id=7721')) self.assertEqual('123', get_bug_id('http://localhost/view.php?id=123')) def test_fusionforge(self): self.assertEqual('292', get_bug_id('https://fusionforge.org/tracker/index.php?func=detail&aid=292')) def test_flyspray(self): self.assertEqual('1234', get_bug_id('https://flyspray.example.com/index.php?do=details&task_id=1234')) self.assertEqual('1234', get_bug_id('https://bugs.flyspray.org/task/1234')) def test_jira(self): self.assertEqual('AB-1234', get_bug_id('http://jiraserver/browse/AB-1234')) self.assertEqual('A_B-1234', get_bug_id('http://jiraserver/browse/A_B-1234')) self.assertEqual('AB_1-1234', get_bug_id('http://jiraserver/browse/AB_1-1234')) self.assertEqual('AB_1A-1234', get_bug_id('http://jiraserver/browse/AB_1A-1234')) self.assertEqual(None, get_bug_id('http://jiraserver/browse/1A-1234')) self.assertEqual(None, get_bug_id('http://jiraserver/browse/_1A-1234')) self.assertEqual(None, get_bug_id('http://jiraserver/browse/A-1234A')) self.assertEqual(None, get_bug_id('http://jiraserver/browse/a-1')) self.assertEqual(None, get_bug_id('http://jiraserver/browse/a')) self.assertEqual(None, get_bug_id('http://jiraserver/browse/A')) self.assertEqual(None, get_bug_id('http://jiraserver/browse/A-')) self.assertEqual(None, get_bug_id('http://jiraserver/browse/A_1')) self.assertEqual('A-1', get_bug_id('http://jiraserver/browse/A-1')) self.assertEqual('ZZ12_SA__2__-122222222', get_bug_id('http://jiras1212erver/browse/ZZ12_SA__2__-122222222')) class TestGetBugTags(TestCase): def test_get_user_bug_trackers_tags(self): self.assertEqual({}, get_user_bug_trackers_tags([])) self.assertEqual({'foo': 'bugtracker', 'bar': 'trac', 'spam': 'bugzilla'}, get_user_bug_trackers_tags([ 'bugtracker_foo_url', 'trac_bar_url', 'bugzilla_spam_url', 'email', 'editor', ])) def test_get_unique_bug_tags(self): self.assertEqual({'lp': 'unique', 'deb': 'unique', 'gnome': 'unique', }, get_unique_bug_tags()) class TestGetBugTagsFromConfig(TestCaseWithTransport): def test_get_global_bug_tags(self): # check empty bazaar.conf self.assertEqual({}, get_global_bug_tags()) # set some options cfg = config.GlobalConfig() cfg.set_user_option('bugtracker_py_url', 'http://bugs.python.org/issue{id}') cfg.set_user_option('bugzilla_kde_url', 'http://bugs.kde.org/') cfg.set_user_option('trac_mbz_url', 'http://bugs.musicbrainz.org/ticket/') self.assertEqual({ 'py': 'bugtracker', 'kde': "bugzilla", 'mbz': 'trac'}, get_global_bug_tags()) def test_get_branch_bug_tags(self): wt = self.make_branch_and_tree('.') branch = wt.branch # check empty branch.conf self.assertEqual({}, get_branch_bug_tags(branch)) # set some options cfg = branch.get_config() cfg.set_user_option('bugtracker_py_url', 'http://bugs.python.org/issue{id}') cfg.set_user_option('bugzilla_kde_url', 'http://bugs.kde.org/') cfg.set_user_option('trac_mbz_url', 'http://bugs.musicbrainz.org/ticket/') self.assertEqual({ 'py': 'bugtracker', 'kde': "bugzilla", 'mbz': 'trac'}, get_branch_bug_tags(branch)) class TestBugUrlsToIds(TestCaseWithTransport): def test_wo_branch(self): bug_urls = [ 'https://launchpad.net/bugs/261234 fixed', 'http://bugs.python.org/issue5243 fixed', ] # w/o global options we can match only unique lp url self.assertEqual(['lp:261234'], bug_urls_to_ids(bug_urls)) # set some options cfg = config.GlobalConfig() cfg.set_user_option('bugtracker_py_url', 'http://bugs.python.org/issue{id}') cfg.set_user_option('bugzilla_kde_url', 'http://bugs.kde.org/') cfg.set_user_option('trac_mbz_url', 'http://bugs.musicbrainz.org/') self.assertEqual(['lp:261234', 'py:5243'], bug_urls_to_ids(bug_urls)) def test_w_branch(self): bug_urls = [ 'https://launchpad.net/bugs/261234 fixed', 'http://bugs.python.org/issue5243 fixed', 'http://bugs.kde.org/show_bug.cgi?id=169104 fixed', ] wt = self.make_branch_and_tree('.') branch = wt.branch # w/o user settings we can match only unique lp url self.assertEqual(['lp:261234'], bug_urls_to_ids(bug_urls, branch)) # set some bugtrackers g_cfg = config.GlobalConfig() g_cfg.set_user_option('bugtracker_py_url', 'http://bugs.python.org/issue{id}') b_cfg = branch.get_config() b_cfg.set_user_option('bugzilla_kde_url', 'http://bugs.kde.org/') self.assertEqual(['kde:169104', 'lp:261234', 'py:5243'], bug_urls_to_ids(bug_urls, branch)) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_cat.py0000644000000000000000000000327514556556456014741 0ustar00# -*- coding: utf-8 -*- # # Copyright (C) 2009 Gary van der Merwe # # 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. # Updated RJL 2020 - added b(ytes) prefix to strings where needed from breezy.tests import TestCase, TestCaseWithTransport from PyQt5 import QtCore from breezy.plugins.qbrz.lib import tests as qtests from breezy.plugins.qbrz.lib.cat import QBzrCatWindow class TestCat(qtests.QTestCase): def test_show_cat_change_encoding(self): tree = self.make_branch_and_tree('branch') self.build_tree_contents([('branch/a', b'foo\n')]) tree.add('a') tree.commit(message='1') win = QBzrCatWindow('a', tree=tree, encoding='utf-8') self.addCleanup(win.close) win.show() QtCore.QCoreApplication.processEvents() # Change the encoding. encode_combo = win.encoding_selector.chooser encode_combo.setCurrentIndex(encode_combo.findText("ascii")) # If you want to see the output, add a sleep after this QtCore.QCoreApplication.processEvents() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_commit.py0000644000000000000000000000251714556556456015460 0ustar00# -*- 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 breezy.tests import TestCase, TestCaseWithTransport from PyQt5 import QtCore from breezy.plugins.qbrz.lib import tests as qtests from breezy.plugins.qbrz.lib.commit import CommitWindow class TestCommit(qtests.QTestCase): 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() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_commit_data.py0000644000000000000000000002346614556556456016457 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2009 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. """Tests for commit data object and operations.""" from breezy.tests import TestCase, TestCaseWithTransport from breezy.plugins.qbrz.lib.commit_data import ( CommitData, QBzrCommitData, ) class TestCommitDataBase(TestCase): def test_empty(self): d = CommitData() # CommitData instance has bool value False if there is no data inside self.assertFalse(bool(d)) self.assertEqual(None, d['message']) self.assertEqual({}, d.as_dict()) self.assertEqual([], list(d.keys())) def test_set_data_dict(self): d = CommitData() d.set_data({'message': 'foo bar'}) # CommitData instance has bool value True if there is some data inside self.assertTrue(bool(d)) self.assertEqual('foo bar', d['message']) self.assertEqual({'message': 'foo bar'}, d.as_dict()) self.assertEqual(['message'], list(d.keys())) def test_set_data_kw(self): d = CommitData() d.set_data(message='foo bar') # CommitData instance has bool value True if there is some data inside self.assertTrue(bool(d)) self.assertEqual('foo bar', d['message']) self.assertEqual({'message': 'foo bar'}, d.as_dict()) self.assertEqual(['message'], list(d.keys())) def test_set_data_dict_and_kw(self): d = CommitData() d.set_data({'fixes': 'lp:123456'}, message='foo bar') # CommitData instance has bool value True if there is some data inside self.assertTrue(bool(d)) self.assertEqual('foo bar', d['message']) self.assertEqual({'message': 'foo bar', 'fixes': 'lp:123456', }, d.as_dict()) self.assertEqual(set(['message', 'fixes']), set(d.keys())) def test_init_with_data(self): d = CommitData(data={'fixes': 'lp:123456', 'message': 'foo bar'}) # CommitData instance has bool value True if there is some data inside self.assertTrue(bool(d)) self.assertEqual('foo bar', d['message']) self.assertEqual({'message': 'foo bar', 'fixes': 'lp:123456', }, d.as_dict()) self.assertEqual(set(['message', 'fixes']), set(d.keys())) def test_compare_data(self): this = CommitData(data={'fixes': 'lp:123456', 'message': 'foo bar'}) self.assertTrue(this.compare_data( CommitData(data={'fixes': 'lp:123456', 'message': 'foo bar'}))) self.assertTrue(this.compare_data({'fixes': 'lp:123456', 'message': 'foo bar'})) other = CommitData(data={'fixes': 'lp:123456', 'message': 'foo bar', 'old_revid': 'xxx', 'new_revid': 'yyy', }) self.assertFalse(this.compare_data(other)) self.assertTrue(this.compare_data(other, all_keys=False)) class TestCommitDataWithTree(TestCaseWithTransport): def test_set_data_on_uncommit(self): wt = self.make_branch_and_tree('.') revid1 = wt.commit(message='1') # imitate uncommit in branch with only one revision d = CommitData(branch=wt.branch) d.set_data_on_uncommit(revid1, None) self.assertEqual({'message': '1', 'old_revid': revid1, 'new_revid': b'null:', }, d.as_dict()) # revid2 = wt.commit(message='2') # imitate uncommit in branch with several revisions d = CommitData(branch=wt.branch) d.set_data_on_uncommit(revid2, revid1) self.assertEqual({'message': '2', 'old_revid': revid2, 'new_revid': revid1, }, d.as_dict()) # RJL: unfortunately, this test is flawed - not in its own right but because # the test version of run_bzr is more forgiving than the 'real' version: # it will accept strings whereas the actual version needs an array. # The test version is in breezy/tests/__init__.py def test_set_data_on_uncommit_bugids(self): wt = self.make_branch_and_tree('.') self.run_bzr('commit --unchanged -m foo --fixes lp:12345 --fixes lp:67890') revid1 = wt.last_revision() d = CommitData(branch=wt.branch) d.set_data_on_uncommit(revid1, None) self.assertEqual({'message': 'foo', 'bugs': 'lp:12345 lp:67890', 'old_revid': revid1, 'new_revid': b'null:', }, d.as_dict()) def test_set_data_on_uncommit_bugids_with_message(self): wt = self.make_branch_and_tree('.') self.run_bzr('commit --unchanged -m "foo with spaces" --fixes lp:12345 --fixes lp:67890') revid1 = wt.last_revision() d = CommitData(branch=wt.branch) d.set_data_on_uncommit(revid1, None) self.assertEqual({'message': 'foo with spaces', 'bugs': 'lp:12345 lp:67890', 'old_revid': revid1, 'new_revid': b'null:', }, d.as_dict()) def test_load_nothing(self): wt = self.make_branch_and_tree('.') d = CommitData(tree=wt) d.load() self.assertEqual({}, d.as_dict()) def test_save_data(self): wt = self.make_branch_and_tree('.') d = CommitData(tree=wt) d.set_data(message='spam', old_revid='foo', new_revid='bar') d.save() # check branch.conf cfg = wt.branch.get_config() self.assertEqual({'message': 'spam', 'old_revid': 'foo', 'new_revid': 'bar', }, cfg.get_user_option('commit_data')) def test_save_message_with_spaces(self): wt = self.make_branch_and_tree('.') d = CommitData(tree=wt) d.set_data(message='spam with spaces', old_revid='foo', new_revid='bar') d.save() # check branch.conf cfg = wt.branch.get_config() self.assertEqual({'message': 'spam with spaces', 'old_revid': 'foo', 'new_revid': 'bar', }, cfg.get_user_option('commit_data')) def test_save_filter_out_empty_data(self): wt = self.make_branch_and_tree('.') d = CommitData(tree=wt) d.set_data({'message': '', 'foo': 'bar'}) d.save() # check branch.conf cfg = wt.branch.get_config() self.assertEqual({'foo': 'bar'}, cfg.get_user_option('commit_data')) def test_load_saved_data(self): wt = self.make_branch_and_tree('.') cfg = wt.branch.get_config() cfg.set_user_option('commit_data', {'message': 'spam', 'old_revid': 'foo', 'new_revid': 'bar', }) d = CommitData(tree=wt) d.load() self.assertEqual({'message': 'spam', 'old_revid': 'foo', 'new_revid': 'bar', }, d.as_dict()) def test_wipe_saved_data(self): wt = self.make_branch_and_tree('.') cfg = wt.branch.get_config() cfg.set_user_option('commit_data', {'message': 'spam', 'old_revid': 'foo', 'new_revid': 'bar', }) d = CommitData(tree=wt) d.wipe() # check branch.conf cfg = wt.branch.get_config() self.assertEqual({}, cfg.get_user_option('commit_data')) class TestQBzrCommitData(TestCaseWithTransport): def test_io_old_data_transition(self): # we should handle old data (i.e. qbrz_commit_message) gracefully wt = self.make_branch_and_tree('.') cfg = wt.branch.get_config() cfg.set_user_option('qbrz_commit_message', 'spam') # load d = QBzrCommitData(tree=wt) d.load() self.assertEqual({'message': 'spam',}, d.as_dict()) # # if here both old and new then prefer new cfg.set_user_option('commit_data', {'foo': 'bar'}) d = QBzrCommitData(tree=wt) d.load() self.assertEqual({'foo': 'bar',}, d.as_dict()) # # on save we should clear old data d = QBzrCommitData(tree=wt) d.set_data(message='eggs', old_revid='foo', new_revid='bar') d.save() # check branch.conf cfg = wt.branch.get_config() self.assertEqual('', cfg.get_user_option('qbrz_commit_message')) self.assertEqual({'message': 'eggs','old_revid': 'foo','new_revid': 'bar',}, cfg.get_user_option('commit_data')) # # on wipe we should clear old data too cfg = wt.branch.get_config() cfg.set_user_option('qbrz_commit_message', 'spam') d = QBzrCommitData(tree=wt) d.wipe() # check branch.conf cfg = wt.branch.get_config() self.assertEqual('', cfg.get_user_option('qbrz_commit_message')) self.assertEqual({}, cfg.get_user_option('commit_data')) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_decorator.py0000644000000000000000000001022514556556456016145 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2011 QBzr Developers # # 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. import time from PyQt5 import QtCore from breezy.plugins.qbrz.lib.decorators import lazy_call from breezy.tests import TestCase, TestCaseWithTransport from breezy.plugins.qbrz.lib import tests as qtests test_value = 0 test2_value = 0 @lazy_call(50) def method_test(arg): global test_value test_value += arg @lazy_call(50) def method_test2(arg): global test2_value test2_value += arg class ClassTest(object): def __init__(self): self.value = 0 self.value2 = 0 @lazy_call(50, per_instance=True) def test(self, value): self.value += value @lazy_call(50) def test2(self, value): self.value2 += value class TestLazyCall(qtests.QTestCase): def setUp(self): qtests.QTestCase.setUp(self) global test_value global test2_value test_value = test2_value = 0 def test_single(self): method_test(1) time.sleep(0.01) QtCore.QCoreApplication.processEvents() method_test(2) time.sleep(0.01) QtCore.QCoreApplication.processEvents() method_test(4) time.sleep(0.1) QtCore.QCoreApplication.processEvents() # Execute only last one call. self.assertEqual(test_value, 4) def test_twice(self): method_test(1) time.sleep(0.01) QtCore.QCoreApplication.processEvents() method_test(2) time.sleep(0.1) QtCore.QCoreApplication.processEvents() method_test(4) time.sleep(0.1) QtCore.QCoreApplication.processEvents() # Execute 2nd and 3rd calls. self.assertEqual(test_value, 6) def test_count_millisec_from_last_call(self): for i in range(5): method_test(1) time.sleep(0.01) QtCore.QCoreApplication.processEvents() # No call is executed self.assertEqual(test_value, 0) time.sleep(0.1) QtCore.QCoreApplication.processEvents() # Execute only last one call. self.assertEqual(test_value, 1) def test_2_methods(self): method_test(1) method_test2(2) time.sleep(0.01) QtCore.QCoreApplication.processEvents() method_test(2) method_test2(4) time.sleep(0.1) QtCore.QCoreApplication.processEvents() self.assertEqual(test_value, 2) self.assertEqual(test2_value, 4) def test_instance_method(self): a = ClassTest() b = ClassTest() a.test(1) b.test(10) time.sleep(0.1) QtCore.QCoreApplication.processEvents() self.assertEqual(a.value, 1) self.assertEqual(b.value, 10) a.test(2) b.test(20) time.sleep(0.01) QtCore.QCoreApplication.processEvents() a.test(3) b.test(30) time.sleep(0.1) QtCore.QCoreApplication.processEvents() self.assertEqual(a.value, 4) self.assertEqual(b.value, 40) def test_without_instance_method_flag(self): a = ClassTest() b = ClassTest() a.test2(1) b.test2(10) time.sleep(0.1) QtCore.QCoreApplication.processEvents() # a.test2 does not called. self.assertEqual(a.value2, 0) self.assertEqual(b.value2, 10) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_diffview.py0000644000000000000000000000520714556556456015772 0ustar00# -*- coding: utf-8 -*- # # Copyright (C) 2008 Lukáš Lalinský # # 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. """Tests for QBrz plugin.""" from breezy.tests import TestCase from breezy.plugins.qbrz.lib.diffview import insert_intraline_changes class FakeCursor(object): def __init__(self): self.text = '' def insertText(self, text, format): self.text += '<%s>%s' % (format, text, format) class TestInsertIntralineChanges(TestCase): def test_no_change(self): cursor1 = FakeCursor() cursor2 = FakeCursor() insert_intraline_changes(cursor1, cursor2, 'foo', 'foo', 'n', 'ins', 'del') self.assertEqual('foo', cursor1.text) self.assertEqual('foo', cursor2.text) def test_whole_line_changed(self): cursor1 = FakeCursor() cursor2 = FakeCursor() insert_intraline_changes(cursor1, cursor2, 'foo', 'bar', 'n', 'ins', 'del') self.assertEqual('foo', cursor1.text) self.assertEqual('bar', cursor2.text) def test_delete_char(self): cursor1 = FakeCursor() cursor2 = FakeCursor() insert_intraline_changes(cursor1, cursor2, 'foo', 'fo', 'n', 'ins', 'del') self.assertEqual('foo', cursor1.text) self.assertEqual('fo', cursor2.text) def test_insert_char(self): cursor1 = FakeCursor() cursor2 = FakeCursor() insert_intraline_changes(cursor1, cursor2, 'fo', 'foo', 'n', 'ins', 'del') self.assertEqual('fo', cursor1.text) self.assertEqual('foo', cursor2.text) def test_replace_2_chars(self): cursor1 = FakeCursor() cursor2 = FakeCursor() insert_intraline_changes(cursor1, cursor2, 'foobar', 'foObAr', 'n', 'ins', 'del') self.assertEqual('foobar', cursor1.text) self.assertEqual('foObAr', cursor2.text) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_extdiff.py0000644000000000000000000002505414556556456015622 0ustar00if __name__ == '__main__': import breezy breezy.initialize() import breezy.plugin breezy.plugin.set_plugins_path() breezy.plugin.load_plugins() import os, tempfile from breezy.plugins.qbrz.lib.tests import QTestCase from breezy.plugins.qbrz.lib.tests.mock import MockFunction from breezy.plugins.qbrz.lib import diff from breezy.workingtree import WorkingTree from contextlib import contextmanager class TestCommandString(QTestCase): def setUp(self): QTestCase.setUp(self) self.tree = self.make_branch_and_tree('tree') self.build_tree_contents([('tree/a', b"content")]) self.tree.add(["a"]) self.tree.commit(message='1') self.differ = diff._ExtDiffer("test", self.tree.basis_tree(), self.tree) self.addCleanup(self.differ.finish) def test_no_arguments(self): self.differ.set_command_string("test") self.assertEqual(self.differ.command_template, ["test", "{old_path}", "{new_path}"]) def test_has_arguments(self): self.differ.set_command_string("test --old {old_path} --new {new_path}") self.assertEqual(self.differ.command_template, ["test", "--old", "{old_path}", "--new", "{new_path}"]) class TestPrefix(QTestCase): def setUp(self): QTestCase.setUp(self) self.tree = self.make_branch_and_tree('tree') self.build_tree_contents([('tree/a', b"content")]) self.tree.add(["a"]) self.tree.commit(message='1') self.build_tree_contents([('tree/a', b"new content")]) self.tree.commit(message='2') self.differ = diff._ExtDiffer("test", self.tree.basis_tree(), self.tree) self.addCleanup(self.differ.finish) def test_same_prefix_for_same_workingtree(self): prefix = self.differ.get_prefix(self.tree) tree2 = WorkingTree.open(self.tree.abspath("")) self.assertEqual(self.differ.get_prefix(tree2), prefix) def test_another_prefix_for_another_workingtree(self): tree2 = self.make_branch_and_tree('tree2') prefix = self.differ.get_prefix(self.tree) self.assertNotEqual(self.differ.get_prefix(tree2), prefix) def test_same_prefix_for_same_revisiontree(self): self.differ = diff._ExtDiffer("test", self.tree.basis_tree(), self.tree) tree1 = self.tree.basis_tree() tree2 = self.tree.basis_tree() self.assertNotEqual(tree1, tree2) prefix = self.differ.get_prefix(tree1) self.assertEqual(self.differ.get_prefix(tree2), prefix) self.assertNotEqual(self.differ.get_prefix(self.tree), prefix) def test_another_prefix_for_another_revtree(self): b = self.tree.branch trees = [b.repository.revision_tree(b.get_rev_id(no)) for no in (1,2)] prefix = self.differ.get_prefix(trees[0]) self.assertNotEqual(self.differ.get_prefix(trees[1]), prefix) def test_same_prefix_for_same_object(self): obj = object() prefix = self.differ.get_prefix(obj) self.assertEqual(self.differ.get_prefix(obj), prefix) def test_another_prefix_for_another_object(self): obj = object() prefix = self.differ.get_prefix(obj) self.assertNotEqual(self.differ.get_prefix(object()), prefix) class TestExtDiffBase(QTestCase): def setUp(self): QTestCase.setUp(self) self.popen_mock = MockFunction() popen = diff.subprocess.Popen diff.subprocess.Popen = self.popen_mock def restore(): diff.subprocess.Popen = popen self.addCleanup(restore) self.tree = self.make_branch_and_tree('tree') self.ctx = self.create_context() self.addCleanup(self.ctx.finish) def create_context(self, parent=None): ctx = diff.ExtDiffContext(parent) self.addCleanup(ctx.finish) return ctx def assertFileContent(self, path, content): self.assertTrue(os.path.isfile(path)) f = open(path) self.assertEqual("\n".join(f.readlines()), content) f.close() class TestCleanup(TestExtDiffBase): def setUp(self): TestExtDiffBase.setUp(self) self.build_tree_contents([('tree/a', b"a")]) self.tree.add(['a']) self.tree.commit(message='1') self.build_tree_contents([('tree/a', b"aa")]) def test_remove_root(self): self.ctx.setup("diff.txt", self.tree.basis_tree(), self.tree) rootdir = self.ctx.rootdir self.assertTrue(len(rootdir) > 0) self.assertTrue(os.path.isdir(rootdir)) self.ctx.finish() self.assertTrue(self.ctx.rootdir is None) self.assertFalse(os.path.exists(rootdir)) def test_dont_remove_root_of_other_context(self): self.ctx.setup("diff.txt", self.tree.basis_tree(), self.tree) ctx2 = self.create_context() ctx2.setup("diff.txt", self.tree.basis_tree(), self.tree) rootdir = self.ctx.rootdir self.assertNotEqual(rootdir, ctx2.rootdir) self.ctx.finish() self.assertTrue(self.ctx.rootdir is None) self.assertTrue(os.path.exists(ctx2.rootdir)) @contextmanager def invalidate_rmtree(self): rmtree = diff.osutils.rmtree def rmtree_mock(path): raise IOError("osutils.rmtree is now invalidated.") try: diff.osutils.rmtree = MockFunction(func=rmtree_mock) yield finally: diff.osutils.rmtree = rmtree def test_mark_deletable_if_delete_failed(self): # If failed to delete tempdir, mark it deletable to delete later. self.ctx.setup("diff.txt", self.tree.basis_tree(), self.tree) rootdir = self.ctx.rootdir self.assertTrue(len(rootdir) > 0) self.assertTrue(os.path.isdir(rootdir)) with self.invalidate_rmtree(): self.ctx.finish() self.assertTrue(self.ctx.rootdir is None) self.assertTrue(os.path.isfile(os.path.join(rootdir, ".delete"))) def test_cleanup_deletable_roots(self): ctx2 = self.create_context() ctx3 = self.create_context() self.ctx.setup("diff.txt", self.tree.basis_tree(), self.tree) ctx2.setup("diff.txt", self.tree.basis_tree(), self.tree) ctx3.setup("diff.txt", self.tree.basis_tree(), self.tree) root = self.ctx.rootdir root2 = ctx2.rootdir root3 = ctx3.rootdir with self.invalidate_rmtree(): self.ctx.finish() self.assertTrue(os.path.isfile(os.path.join(root, ".delete"))) os.chdir(tempfile.gettempdir()) ctx2.finish() self.assertFalse(os.path.exists(root)) self.assertFalse(os.path.exists(root2)) self.assertTrue(os.path.exists(root3)) def test_finish_lazy(self): self.ctx.setup("diff.txt", self.tree.basis_tree(), self.tree) rootdir = self.ctx.rootdir self.assertTrue(len(rootdir) > 0) self.assertTrue(os.path.isdir(rootdir)) self.ctx.finish_lazy() self.assertTrue(self.ctx.rootdir is None) self.assertTrue(os.path.isfile(os.path.join(rootdir, ".delete"))) def test_cleanup_deletable_roots_by_finish_lazy(self): ctx2 = self.create_context() ctx3 = self.create_context() self.ctx.setup("diff.txt", self.tree.basis_tree(), self.tree) ctx2.setup("diff.txt", self.tree.basis_tree(), self.tree) ctx3.setup("diff.txt", self.tree.basis_tree(), self.tree) root = self.ctx.rootdir root2 = ctx2.rootdir root3 = ctx3.rootdir self.ctx.finish_lazy() ctx2.finish() self.assertFalse(os.path.exists(root)) self.assertFalse(os.path.exists(root2)) self.assertTrue(os.path.exists(root3)) class TestWorkingTreeDiff(TestExtDiffBase): def setUp(self): TestExtDiffBase.setUp(self) self.build_tree(['tree/dir1/', 'tree/dir2/']) self.build_tree_contents([ ('tree/a', b"a"), ('tree/dir1/b', b"b"), ('tree/dir1/c', b"c"), ('tree/dir1/d', b"d"), ('tree/dir2/e', b"e"), ('tree/dir2/f', b"f"), ]) self.tree.add(["a", "dir1", "dir2", "dir1/b", "dir1/c", "dir1/d", "dir2/e", "dir2/f"]) self.tree.commit(message='1') self.build_tree_contents([ ('tree/a', b"A"), ('tree/dir1/b', b"B"), ('tree/dir1/c', b"C"), ('tree/dir2/e', b"E"), ]) self.ctx.setup("diff.exe", self.tree.basis_tree(), self.tree) def assertPopen(self, paths, old_contents): for args, path, old_content in zip(self.popen_mock.args, paths, old_contents): # tool, old_path, new_path = args[0][0] tool, old_path, new_path = args[0][0] self.assertEqual(tool, "diff.exe") self.assertFileContent(old_path, old_content) self.assertEqual(new_path, self.tree.abspath(path)) def test_diff_ids(self): paths = ['a', 'dir1/b'] self.ctx.diff_ids([self.tree.path2id(p) for p in paths]) self.assertPopen(paths, ["a", "b"]) def test_diff_paths(self): paths = ['a', 'dir1/b'] self.ctx.diff_paths(paths) self.assertPopen(paths, ["a", "b"]) def test_diff_paths_for_dir(self): paths = ['dir1/b', 'dir1/c'] self.ctx.diff_paths(['dir1']) self.assertPopen(paths, ["b", "c"]) def test_diff_tree(self): paths = ['a', 'dir1/b', 'dir1/c', 'dir2/e'] old_contents = ['a', 'b', 'c', 'e'] self.ctx.diff_tree() self.assertPopen(paths, old_contents) def test_diff_tree_for_dir(self): paths = ['dir1/b', 'dir1/c'] self.ctx.diff_tree(specific_files=['dir1']) self.assertPopen(paths, ["b", "c"]) def test_diff_for_renamed_files(self): self.tree.rename_one('a', 'a2') paths = ['a2'] self.ctx.diff_paths(['a2']) self.assertPopen(paths, ["a"]) def test_skip_added_file(self): self.build_tree_contents([('tree/a2', b"a"),]) self.tree.add(['a2']) self.ctx.diff_paths(['a2']) self.assertPopen([], []) def test_skip_removed_file_1(self): self.tree.remove(['a'], keep_files=True) self.ctx.diff_paths(['a']) self.assertPopen([], []) def test_skip_removed_file_2(self): self.tree.remove(['a'], keep_files=False) self.ctx.diff_paths(['a']) self.assertPopen([], []) if __name__=='__main__': import unittest unittest.main() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_extra_isignored.py0000644000000000000000000000301114556556456017344 0ustar00# -*- coding: utf-8 -*- # # Copyright (C) 2008 Lukáš Lalinský # # 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 breezy.tests import TestCaseWithTransport, KnownFailure # RJLRJL this needs bzr / brz checking class TestIsIgnored(TestCaseWithTransport): def test_is_ignored(self): tree = self.make_branch_and_tree('.') self.build_tree_contents([('a', 'foo\n'), ('b', 'bar\n'), ('.bzrignore', 'b\n')]) tree.add(['a', '.bzrignore']) out, err = self.run_bzr('is-ignored b', retcode=1) self.assertEqual('ignored\n', out) out, err = self.run_bzr('is-ignored a', retcode=0) self.assertEqual('not ignored\n', out) out, err = self.run_bzr('is-ignored -q b', retcode=1) self.assertEqual('', out) out, err = self.run_bzr('is-ignored -q a', retcode=0) self.assertEqual('', out) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_extra_isversioned.py0000644000000000000000000000275114556556456017725 0ustar00# -*- coding: utf-8 -*- # # Copyright (C) 2008 Lukáš Lalinský # # 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 breezy.tests import TestCaseWithTransport, KnownFailure class TestIsVersioned(TestCaseWithTransport): def test_is_versioned(self): tree = self.make_branch_and_tree('.') self.build_tree_contents([('a', 'foo\n'), ('b', 'bar\n')]) tree.add(['a']) tree.commit('init') out, err = self.run_bzr('is-versioned a', retcode=1) self.assertEqual('versioned\n', out) out, err = self.run_bzr('is-versioned b', retcode=0) self.assertEqual('not versioned\n', out) out, err = self.run_bzr('is-versioned -q a', retcode=1) self.assertEqual('', out) out, err = self.run_bzr('is-versioned -q b', retcode=0) self.assertEqual('', out) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_guidebar.py0000644000000000000000000002656614556556456015764 0ustar00if __name__=='__main__': import breezy breezy.initialize() try: from breezy.commands import _register_builtin_commands _register_builtin_commands() except ImportError: pass import breezy.plugin breezy.plugin.set_plugins_path() breezy.plugin.load_plugins() from breezy.plugins.qbrz.lib.tests import QTestCase from PyQt5 import QtCore from PyQt5.QtTest import QTest from breezy.plugins.qbrz.lib.diffwindow import DiffWindow from breezy.plugins.qbrz.lib.shelvewindow import ShelveWindow from breezy.plugins.qbrz.lib.annotate import AnnotateWindow class WtDiffArgProvider(object): # Will be passed to DiffWindow def __init__(self, tree): self.tree = tree def get_diff_window_args(self, processEvents, es): # This will be used by DiffWindow::_initial_load return dict( old_tree=self.tree.basis_tree(), new_tree=self.tree, old_branch=self.tree.branch, new_branch=self.tree.branch ) # RJL: why this was done I have no idea at all, it just results in the lines below # even when posted in the interpreter, which frankly, could have been done at the time. # It's just a-z with newlines # CONTENT = \ # """a b c d e f g h i j k l m n # o p q r s t u v w x y z""".replace(" ", "\n") CONTENT = b'a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nw\nx\ny\nz' # More nonsense: it's a-z with some replacements # NEW_CONTENT = \ # """a b c d e ff g h i J-1 J-2 J-3 k l MN # o p s t 1 2 3 u v w x y z""".replace(" ", "\n") NEW_CONTENT = b'a\nb\nc\nd\ne\nff\ng\nh\ni\nJ-1\nJ-2\nJ-3\nk\nl\nMN\no\np\ns\nt\n1\n2\n3\nu\nv\nw\nx\ny\nz' DIFF = [ (['f'], ['ff']), (['j'], ['J-1', 'J-2', 'J-3']), (['m', 'n'], ['MN']), (['q', 'r'], []), ([], ['1', '2', '3']), ] DIFF_BY_TAGS = dict( replace=[x for x in DIFF if len(x[0]) > 0 and len(x[1]) > 0], delete =[x for x in DIFF if len(x[1]) == 0], insert =[x for x in DIFF if len(x[0]) == 0], ) # RJL added this to easily bump up delays as running the same test # would sometimes result in failures even with the code unchanged. # Original value was 500. Still fails - seems to be a Qt cleanup # thing (on Linux) between runs- for example, TestQAnnotate can be run # 3 times in succession and will often pass twice and fail once, except # when if fails twice and passes once... except when it passes 3 times... # You get the idea. Added QTest.qWaitForWindowExposed here and there # which I suspect was not available when this code was first written. # # N.B. this appears to be missing a binary file test wait_delay_ms = 500 class TestGuideBarBase(QTestCase): def setUp(self): QTestCase.setUp(self) self.tree = self.make_branch_and_tree('tree') self.build_tree_contents([('tree/a', CONTENT)]) self.tree.add(['a']) self.tree.commit(message='1') self.build_tree_contents([('tree/a', NEW_CONTENT)]) def assert_sidebyside_view(self, panels): for pos, panel in enumerate(panels): bar = panel.bar doc = panel.edit.document() # Title self.waitUntil(lambda:len(bar.entries['title'].data) > 0, wait_delay_ms) self.assertEqual(bar.entries['title'].data, [(0, 2)]) # Replace/Delete/Insert for tag, expected in DIFF_BY_TAGS.items(): data = bar.entries[tag].data self.assertEqual(len(data), len(expected)) for texts, (block_no, block_num) in zip(expected, data): self.assertEqual(len(texts[pos]), block_num) for j in range(block_num): text = str(doc.findBlockByNumber(block_no + j).text()) self.assertEqual(texts[pos][j], text, '%s, %s, %r' % (tag, "RL"[pos], data)) def assert_unidiff_view(self, panel): bar = panel.bar doc = panel.edit.document() # Title self.waitUntil(lambda:len(bar.entries['title'].data) > 0, wait_delay_ms) self.assertEqual(bar.entries['title'].data, [(0, 2)]) # Replace/Delete/Insert for tag, expected in DIFF_BY_TAGS.items(): data = bar.entries[tag].data self.assertEqual(len(data), len(expected)) for texts, (block_no, block_num) in zip(expected, data): unidiff_texts = ['-' + x for x in texts[0]] + \ ['+' + x for x in texts[1]] self.assertEqual(len(unidiff_texts), block_num) for j in range(block_num): text = str(doc.findBlockByNumber(block_no + j).text()) self.assertEqual(unidiff_texts[j], text, '%s, %s, %r' % (tag, "U", data)) def set_find_text(self, find_toolbar, text): find_toolbar.show_action_toggle(True) find_toolbar.find_text.setText(text) def assert_find(self, text, bar, edit, expected_num=None): self.waitUntil(lambda:bar.entries['find'].data, wait_delay_ms) # Check side by side view data = bar.entries['find'].data if expected_num is not None: self.assertEqual(len(data), expected_num) for block_no, block_num in data: self.assertEqual(block_num, 1) block_text = str(edit.document().findBlockByNumber(block_no).text()) self.assertTrue(block_text.lower().find(text.lower()) >= 0) class TestQDiff(TestGuideBarBase): def setUp(self): TestGuideBarBase.setUp(self) self.win = DiffWindow(WtDiffArgProvider(self.tree)) self.addCleanup(self.win.close) self.win.show() self.waitUntil(lambda:self.win.view_refresh.isEnabled(), wait_delay_ms) def test_sidebyside(self): self.assert_sidebyside_view(self.win.diffview.guidebar_panels) # show complete self.win.click_complete(True) self.waitUntil(lambda:self.win.view_refresh.isEnabled(), wait_delay_ms) self.assert_sidebyside_view(self.win.diffview.guidebar_panels) def test_unidiff(self): # show unidiff self.win.click_toggle_view_mode(True) self.assert_unidiff_view(self.win.sdiffview) # show complete self.win.click_complete(True) self.waitUntil(lambda:self.win.view_refresh.isEnabled(), wait_delay_ms) self.assert_unidiff_view(self.win.sdiffview) def test_find(self): self.set_find_text(self.win.find_toolbar, "j") panels = self.win.diffview.guidebar_panels # Check side by side view self.assert_find("j", panels[0].bar, panels[0].edit, 1) self.assert_find("j", panels[1].bar, panels[1].edit, 3) # Check unidiff view self.win.click_toggle_view_mode(True) panel = self.win.sdiffview self.waitUntil(lambda:panel.bar.entries['find'].data, wait_delay_ms) self.assert_find("j", panel.bar, panel.edit, 4) class TestQShelve(TestGuideBarBase): def setUp(self): TestGuideBarBase.setUp(self) self.win = ShelveWindow(directory=self.tree.abspath('')) self.addCleanup(self.win.close) self.win.show() self.main_widget = self.win.tab.widget(0) self.waitUntil(lambda:self.main_widget.loaded, wait_delay_ms) def test_hunk(self): self.main_widget.file_view.topLevelItem(0).setSelected(True) guidebar = self.main_widget.hunk_view.guidebar # hunk guide is shown only when complete mode. self.assertEqual(len(guidebar.entries['hunk'].data), 0) self.main_widget.complete_toggled(True) self.waitUntil(lambda:len(guidebar.entries['hunk'].data) > 0, wait_delay_ms) def test_find(self): self.waitUntil(lambda:self.main_widget.loaded, wait_delay_ms) self.main_widget.file_view.topLevelItem(0).setSelected(True) self.set_find_text(self.main_widget.find_toolbar, "j") guidebar = self.main_widget.hunk_view.guidebar edit = self.main_widget.hunk_view.browser self.assert_find("j", guidebar, edit) class TestQUnshelve(TestGuideBarBase): def setUp(self): TestGuideBarBase.setUp(self) self.run_bzr(['shelve', '--all'], working_dir=self.tree.abspath('')) self.win = ShelveWindow(directory=self.tree.abspath(''), initial_tab=1) self.addCleanup(self.win.close) self.win.show() self.main_widget = self.win.tab.widget(1) self.waitUntil(lambda:self.main_widget.loaded, wait_delay_ms) self.main_widget.shelve_view.topLevelItem(0).setSelected(True) def test_sidebyside(self): diffviews = self.main_widget.diffviews self.assert_sidebyside_view(diffviews[0].guidebar_panels) # show complete self.main_widget.complete_toggled(True) self.assert_sidebyside_view(diffviews[0].guidebar_panels) def test_unidiff(self): diffviews = self.main_widget.diffviews self.main_widget.unidiff_toggled(True) self.assert_unidiff_view(diffviews[1]) # show complete self.main_widget.complete_toggled(True) self.assert_unidiff_view(diffviews[1]) def test_find(self): diffviews = self.main_widget.diffviews self.set_find_text(self.main_widget.find_toolbar, "j") panels = diffviews[0].guidebar_panels # Check side by side view self.assert_find("j", panels[0].bar, panels[0].edit, 1) self.assert_find("j", panels[1].bar, panels[1].edit, 3) # Check unidiff view self.main_widget.unidiff_toggled(True) self.waitUntil(lambda:diffviews[1].bar.entries['find'].data, wait_delay_ms) self.assert_find("j", diffviews[1].bar, diffviews[1].edit, 4) class TestQAnnotate(TestGuideBarBase): def load(self): tree = self.tree return tree.branch, tree, tree, 'a', tree.path2id('a') def setUp(self): TestGuideBarBase.setUp(self) self.tree.commit(message='2') self.win = AnnotateWindow(None, None, None, None, None, loader=self.load, loader_args=[]) self.addCleanup(self.win.close) self.win.show() QTest.qWaitForWindowExposed(self.win) # The lambda here just makes an anonymous function that returns not isVisible() # self.waitUntil(lambda:self.win.throbber.isVisible() is False, wait_delay_ms) def test_annotate(self): self.win.log_list.select_revid(self.tree.branch.get_rev_id(2)) QTest.qWait(50) doc = self.win.guidebar_panel.edit.document() data = self.win.guidebar_panel.bar.entries['annotate'].data expected = [x[1] for x in DIFF if len(x[1]) > 0] self.assertEqual(len(data), len(expected)) for (block_no, num), lines in zip(data, expected): self.assertEqual(num, len(lines)) for i in range(num): text = str(doc.findBlockByNumber(block_no+i).text()) self.assertEqual(text, lines[i]) def test_find(self): self.set_find_text(self.win.find_toolbar, "j") guidebar = self.win.guidebar_panel.bar edit = self.win.guidebar_panel.edit self.assert_find("j", guidebar, edit) if __name__=='__main__': import unittest unittest.main() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_i18n.py0000644000000000000000000000271214556556456014744 0ustar00# -*- coding: utf-8 -*- # # Copyright (C) 2008 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. """Tests for i18n module""" from breezy.tests import TestCase from breezy.plugins.qbrz.lib import i18n class TestI18n(TestCase): def setUp(self): TestCase.setUp(self) i18n.uninstall() def tearDown(self): i18n.uninstall() TestCase.tearDown(self) def test_gettext(self): # simple pass-through i18n.install() self.assertEqual('file', i18n.gettext('file')) def test_ngettext(self): i18n.install() self.assertEqual('singular', i18n.ngettext('singular', 'plural', 1)) self.assertEqual('plural', i18n.ngettext('singular', 'plural', 2)) self.assertEqual('plural', i18n.ngettext('singular', 'plural', 0)) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_log.py0000644000000000000000000002077614556556456014760 0ustar00# -*- coding: utf-8 -*- # # Copyright (C) 2009 Gary van der Merwe # # 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 breezy.tests import TestCase, TestCaseWithTransport from breezy import errors from breezy.transport import memory from PyQt5 import QtCore from breezy.plugins.qbrz.lib import tests as qtests from breezy.plugins.qbrz.lib.log import LogWindow class TestLogSmokeTests(qtests.QTestCase): def test_show_log_blank_branch(self): tree1 = self.make_branch_and_tree('tree1') win = LogWindow(['tree1'], None) self.addCleanup(win.close) win.show() QtCore.QCoreApplication.processEvents() QtCore.QCoreApplication.processEvents() def test_show_log_simple_commit(self): wt = self.make_branch_and_tree('.') wt.commit('empty commit') self.build_tree(['hello']) wt.add('hello') wt.commit('add one file', committer='\u013d\xf3r\xe9m \xcdp\u0161\xfam ') win = LogWindow(['.'], None) self.addCleanup(win.close) win.show() QtCore.QCoreApplication.processEvents() QtCore.QCoreApplication.processEvents() class TestLogGetBranchesAndFileIds(qtests.QTestCase): def test_with_branch(self): tree = self.make_branch_and_tree("branch") win = LogWindow(branch=tree.branch, tree=tree) branches, primary_bi, file_ids = win.get_branches_and_file_ids() self.assertLength(1, branches) bi = branches[0] # this is broken because we can't pass a tree to LogWindow self.assertEqual(tree, bi.tree) self.assertEqual(tree.branch, bi.branch) #self.assertEqual(None, bi.index) self.assertEqual(branches[0], primary_bi) self.assertEqual(None, file_ids) def test_open_branch_without_passing_tree(self): tree = self.make_branch_and_tree("branch") win = LogWindow(branch=tree.branch) branches, primary_bi, file_ids = win.get_branches_and_file_ids() self.assertEqual(tree.basedir, branches[0].tree.basedir) def test_open_branch_without_tree(self): branch = self.make_branch("branch") win = LogWindow(branch=branch) branches, primary_bi, file_ids = win.get_branches_and_file_ids() bi = branches[0] self.assertEqual(None, bi.tree) self.assertEqual(branch, bi.branch) def make_branch_and_tree_with_files_and_dir(self): tree = self.make_branch_and_tree("branch") self.build_tree(['branch/file1', 'branch/dir/', 'branch/file3']) tree.add('file1', ids=b'file1-id') tree.add('dir', ids=b'dir-id') tree.add('file3', ids=b'file3-id') tree.commit(message='add files') return tree def check_open_branch_files(self, tree, branch): win = LogWindow(branch=branch, specific_file_ids = ['file1-id']) branches, primary_bi, file_ids = win.get_branches_and_file_ids() self.assertLength(1, branches) bi = branches[0] self.assertEqual(branch, bi.branch) self.assertEqual(['file1-id'], file_ids) def test_open_branch_files(self): tree = self.make_branch_and_tree_with_files_and_dir() self.check_open_branch_files(tree, tree.branch) def test_open_branch_files_with_tree(self): tree = self.make_branch_and_tree_with_files_and_dir() branch = tree.branch tree.controldir.destroy_workingtree() self.check_open_branch_files(None, branch) def branches_to_base(self, branches): for bi in branches: if bi.tree is None: yield (None, bi.branch.base, bi.index) else: yield (bi.tree.basedir, bi.branch.base, bi.index) def test_open_locations_standalone_branches(self): branch1 = self.make_branch("branch1") tree2 = self.make_branch_and_tree("branch2") win = LogWindow(locations=["branch1", "branch2"]) branches, primary_bi, file_ids = win.get_branches_and_file_ids() self.assertEqual(set(((None, branch1.base, None), (tree2.basedir, tree2.branch.base, None) )), set(self.branches_to_base(branches))) def make_branch_in_shared_repo(self, relpath, format=None): """Create a branch on the transport at relpath.""" made_control = self.make_controldir(relpath, format=format) return made_control.create_branch() def test_open_locations_shared_repo(self): self.make_branch = self.make_branch_in_shared_repo repo = self.make_repository("repo", shared=True) branch1 = self.make_branch("repo/branch1") tree2 = self.make_branch_and_tree("repo/branch2") win = LogWindow(locations=["repo"]) branches, primary_bi, file_ids = win.get_branches_and_file_ids() self.assertEqual(set(((None, branch1.base, None), (tree2.basedir, tree2.branch.base, None))), set(self.branches_to_base(branches))) def test_open_locations_in_shared_reporaise_not_a_branch(self): repo = self.make_repository("repo", shared=True) win = LogWindow(locations=["repo"]) self.assertRaises(errors.NotBranchError, win.get_branches_and_file_ids) def test_open_locations_raise_not_a_branch(self): self.vfs_transport_factory = memory.MemoryServer win = LogWindow(locations=[self.get_url("non_existant_branch")]) self.assertRaises(errors.NotBranchError, win.get_branches_and_file_ids) def check_open_location_files(self): win = LogWindow(locations=["branch/file1", 'branch/dir']) branches, primary_bi, file_ids = win.get_branches_and_file_ids() self.assertEqual([b'file1-id', b'dir-id'], file_ids) def test_open_locations_files(self): tree = self.make_branch_and_tree_with_files_and_dir() self.check_open_location_files() def test_open_locations_files_without_tree(self): tree = self.make_branch_and_tree_with_files_and_dir() branch = tree.branch tree.controldir.destroy_workingtree() self.check_open_location_files() def test_open_locations_raise_not_versioned(self): branch = self.make_branch("branch") win = LogWindow(locations=["file-that-does-not-exist"]) self.assertRaises(errors.BzrCommandError, win.get_branches_and_file_ids) def test_branch_label_location(self): branch = self.make_branch("branch") win = LogWindow() self.assertEqual('path', win.branch_label('path', branch)) def test_branch_label_no_location(self): branch = self.make_branch("branch") win = LogWindow() # No location, use nick self.assertEqual('branch', win.branch_label(None, branch)) def test_branch_label_path_location(self): branch = self.make_branch("branch") win = LogWindow() # Location seems like a path - use it self.assertEqual('path-to-branch', win.branch_label('path-to-branch', branch)) def test_branch_label_alias_directory(self): branch = self.make_branch("branch") win = LogWindow() # show shortcut, and nick self.assertEqual(':parent (branch)', win.branch_label(':parent', branch)) def test_branch_label_no_info_locations(self): branch = self.make_branch("branch") win = LogWindow() # locations that don't have a lot of info in them should show the nick self.assertEqual('. (branch)', win.branch_label('.', branch)) self.assertEqual('../ (branch)', win.branch_label('../', branch)) def test_branch_label_explict_nick(self): branch = self.make_branch("branch") branch.nick = "nick" win = LogWindow() self.assertEqual('path (nick)', win.branch_label('path', branch)) def test_branch_label_repository(self): repo = self.make_repository("repo", shared=True) branch = self.make_branch("repo/branch") win = LogWindow() self.assertEqual('./branch', win.branch_label(None, branch, '.', repo)) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_loggraphviz.py0000644000000000000000000013341514556556456016526 0ustar00# -*- coding: utf-8 -*- # # Copyright (C) 2010 Gary van der Merwe # # 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. # RJLRJL a lot of the changes for breezy were changing strings to bytes from breezy.tests import TestCase, TestCaseWithTransport from io import StringIO from breezy.plugins.qbrz.lib import loggraphviz from breezy.revision import NULL_REVISION # TODO: # Tag loading # Branch labels + Filtering # Ghosts # file_ids filtering class TestLogGraphVizMixin(object): def computed_to_list(self, computed, branch_labels=False): if not branch_labels: item = lambda c_rev: (c_rev.rev.revid, c_rev.col_index, c_rev.twisty_state, sorted(c_rev.lines),) else: item = lambda c_rev: (c_rev.rev.revid, c_rev.col_index, c_rev.twisty_state, sorted(c_rev.lines), [label for bi, label in c_rev.branch_labels]) return [item(c_rev) for c_rev in computed.filtered_revs] def assertComputed(self, expected_list, computed, branch_labels=False): computed_list = self.computed_to_list(computed, branch_labels) if not expected_list == computed_list: raise AssertionError( "not equal: \nexpected_list = \n%scomputed_list = \n%s" % (format_graph_lines(expected_list, use_unicode=True), format_graph_lines(computed_list, use_unicode=True),)) class TestLogGraphVizWithBranches(TestCaseWithTransport, TestLogGraphVizMixin): def test_no_commits(self): br = self.make_branch('.') bi = loggraphviz.BranchInfo('', None, br) gv = loggraphviz.GraphVizLoader([bi], bi, False) gv.load() self.assertEqual(len(gv.revisions), 0) state = loggraphviz.GraphVizFilterState(gv) computed = gv.compute_viz(state) self.assertEqual(len(computed.revisions), 0) def make_banches_for_tips_date_sorted(self): builder = self.make_branch_builder('trunk') builder.start_series() rev_a = builder.build_snapshot(None, [('add', ('', b'TREE_ROOT', 'directory', b'')),]) rev_old = builder.build_snapshot([rev_a], []) rev_new = builder.build_snapshot([rev_a], []) rev_trunk = builder.build_snapshot([rev_a], []) builder.finish_series() trunk = builder.get_branch() #trunk.set_last_revision('rev-trunk') old = trunk.controldir.sprout('../old', revision_id=rev_old).open_branch() new = trunk.controldir.sprout('../new', revision_id=rev_new).open_branch() return rev_a, trunk, old, new def test_branch_tips_date_sorted(self): common_rev, trunk, old, new = self.make_banches_for_tips_date_sorted() trunk_bi = loggraphviz.BranchInfo('trunk', None, trunk) gv = loggraphviz.GraphVizLoader( [trunk_bi, loggraphviz.BranchInfo('old', None, old), loggraphviz.BranchInfo('new', None, new),], trunk_bi, False) gv.load() state = loggraphviz.GraphVizFilterState(gv) computed = gv.compute_viz(state) self.assertComputed( [(new.last_revision(), 2, None, [(2, 2, 0, True)]) , # ○ # │ (old.last_revision(), 1, None, [(1, 1, 0, True), (2, 2, 0, True)]), # ○ │ # │ │ (trunk.last_revision(), 0, None, [(0, 0, 0, True), (1, 0, 0, True), # ○ │ │ (2, 0, 0, True)]), # ├─╯─╯ (common_rev, 0, None, []) ],# ○ computed) def test_branch_tips_date_sorted_with_working_tree_provider(self): common_rev, trunk, old, new = self.make_banches_for_tips_date_sorted() trunk_tree = trunk.controldir.create_workingtree() old_tree = old.controldir.open_workingtree() new_tree = new.controldir.open_workingtree() trunk_bi = loggraphviz.BranchInfo('trunk', trunk_tree, trunk) gv = loggraphviz.WithWorkingTreeGraphVizLoader( [trunk_bi, loggraphviz.BranchInfo('old', old_tree, old), loggraphviz.BranchInfo('new', new_tree, new),], trunk_bi, False) gv.load() state = loggraphviz.GraphVizFilterState(gv) computed = gv.compute_viz(state) self.assertComputed( [(gv.tree_revid(new_tree), 2, None, [(2, 2, 3, True)]), # ○ # │ (new.last_revision(), 2, None, [(2, 2, 0, True)]), # ○ # │ (gv.tree_revid(old_tree), 1, None, [(1, 1, 2, True), # ○ │ (2, 2, 0, True)]), # │ │ (old.last_revision(), 1, None, [(1, 1, 0, True), (2, 2, 0, True)]), # ○ │ # │ │ (gv.tree_revid(trunk_tree), 0, None, [ # ○ │ │ (0, 0, 0, True), (1, 1, 0, True), (2, 2, 0, True)]), # │ │ │ (trunk.last_revision(), 0, None, [(0, 0, 0, True), (1, 0, 0, True), # ○ │ │ (2, 0, 0, True)]), # ├─╯─╯ (common_rev, 0, None, [])], # ○ computed) def make_tree_with_pending_merge(self, path): builder = self.make_branch_builder('branch') builder.start_series() rev_a = builder.build_snapshot(None, [('add', ('', b'TREE_ROOT', 'directory', b'')),]) rev_b = builder.build_snapshot([rev_a], []) builder.finish_series() branch = builder.get_branch() branch.set_last_revision_info(1, rev_a) # go back to rev-a tree = branch.controldir.create_workingtree() tree.merge_from_branch(branch, to_revision=rev_b) # RJLRJL WARNING, tree's basedir will be of type str! return tree, [rev_a, rev_b] def make_tree_not_up_to_date(self, path): builder = self.make_branch_builder('branch') builder.start_series() rev_a = builder.build_snapshot(None, [('add', ('', b'TREE_ROOT', 'directory', b'')),]) rev_b = builder.build_snapshot([rev_a], []) builder.finish_series() branch = builder.get_branch() tree = branch.controldir.create_workingtree() tree.update(revision=rev_a) return tree, [rev_a, rev_b] def test_pending_merge(self): tree, [rev_a, rev_b] = self.make_tree_with_pending_merge('branch') bi = loggraphviz.BranchInfo(None, tree, tree.branch) gv = loggraphviz.GraphVizLoader([bi], bi, False) gv.load() state = loggraphviz.GraphVizFilterState(gv) computed = gv.compute_viz(state) self.assertComputed( [(rev_b, 1, None, [(1, 0, 0, True)], ['Pending Merge']), # ○ # ╭─╯ (rev_a, 0, None, [], [None]) ],# ○ computed, branch_labels=True) def test_out_of_date_wt(self): tree, [rev_a, rev_b] = self.make_tree_not_up_to_date('branch') bi = loggraphviz.BranchInfo(None, tree, tree.branch) gv = loggraphviz.GraphVizLoader([bi], bi, False) gv.load() state = loggraphviz.GraphVizFilterState(gv) computed = gv.compute_viz(state) self.assertComputed( [(rev_b, 0, None, [(0, 0, 0, True)], [None]), # ○ # │ (rev_a, 0, None, [], ['Working Tree']) ],# ○ computed, branch_labels=True) def test_with_working_tree_provider(self): # RJLRJL tree.basedir seems to come back as a string here... tree, [rev_a, rev_b] = self.make_tree_with_pending_merge('branch') bi = loggraphviz.BranchInfo('branch', tree, tree.branch) gv = loggraphviz.WithWorkingTreeGraphVizLoader([bi], bi, False) gv.load() state = loggraphviz.GraphVizFilterState(gv) computed = gv.compute_viz(state) # RJLRL Force 'current...' string to bytes self.assertComputed( [(bytes('current:%s' % tree.basedir, 'utf-8'), 0, True, # ⊖ [(0, 0, 0, True), (0, 1, 2, True)], # ├─╮ ['branch - Working Tree']), # │ │ (rev_b, 1, None, [(0, 0, 0, True), (1, 0, 0, True)], # │ ○ ['branch - Pending Merge']), # ├─╯ (rev_a, 0, None, [], ['branch'])], # ○ computed, branch_labels=True) def test_with_working_tree_provider_out_of_date_wt(self): tree, [rev_a, rev_b] = self.make_tree_not_up_to_date('branch') bi = loggraphviz.BranchInfo('branch', tree, tree.branch) gv = loggraphviz.WithWorkingTreeGraphVizLoader([bi], bi, False) gv.load() state = loggraphviz.GraphVizFilterState(gv) computed = gv.compute_viz(state) self.assertComputed( [(bytes('current:%s' % tree.basedir, 'utf-8'), 1, None, [(1, 1, 0, True)], # ○ ['branch - Working Tree']), # │ (rev_b, 0, None, [(0, 0, 0, True), (1, 0, 0, True)], # ○ │ ['branch']), # ├─╯ (rev_a, 0, None, [], []) ], # ○ computed, branch_labels=True) def test_with_working_tree_provider_filtered(self): # This test makes sure that label for a Working Tree shows for on it's # nearest visble unique ansestor when the working tree node is # filtered. builder = self.make_branch_builder('branch') builder.start_series() rev_a = builder.build_snapshot(None, [('add', ('', b'TREE_ROOT', 'directory', b'')),]) rev_b = builder.build_snapshot([rev_a], []) rev_c = builder.build_snapshot([rev_a], []) builder.finish_series() branch = builder.get_branch() tree = branch.controldir.create_workingtree() tree.update(revision=rev_b) bi = loggraphviz.BranchInfo('branch', tree, tree.branch) gv = loggraphviz.WithWorkingTreeGraphVizLoader([bi], bi, False) gv.load() state = loggraphviz.GraphVizFilterState(gv) # state.filters.append(BasicFilterer(set(['current:%s' % tree.basedir.encode('unicode-escape')]))) state.filters.append(BasicFilterer(set([bytes('current:%s' % tree.basedir, 'utf-8')]))) computed = gv.compute_viz(state) self.assertComputed( [(rev_b, 1, None, [(1, 1, 0, True)], ['branch - Working Tree']) , # ○ # │ (rev_c, 0, None, [(0, 0, 0, True), (1, 0, 0, True)], ['branch']), # ○ │ # ├─╯ (rev_a, 0, None, [], []) ],# ○ computed, branch_labels=True) def test_pending_merges_provider(self): tree, [rev_a, rev_b] = self.make_tree_with_pending_merge('branch') bi = loggraphviz.BranchInfo(None, tree, tree.branch) gv = loggraphviz.PendingMergesGraphVizLoader([bi], bi, False) gv.load() state = loggraphviz.GraphVizFilterState(gv) computed = gv.compute_viz(state) self.assertComputed( [(rev_b, 1, None, [(1, 0, 0, True)]), # ○ # ╭─╯ ('root:', 0, None, []) ],# ○ computed) def test_with_ghost(self): tree = self.make_branch_and_tree('tree') rev_a = tree.commit('a') tree.add_parent_tree_id(b'rev-b') rev_c = tree.commit('c') # rev-b is a ghost. We think he is there, but he dose not exist. Boo! bi = loggraphviz.BranchInfo(None, tree, tree.branch) gv = loggraphviz.GraphVizLoader([bi], bi, False) gv.load() state = loggraphviz.GraphVizFilterState(gv) state.expand_all_branch_lines() computed = gv.compute_viz(state) self.assertComputed( [(rev_c, 0, True, [(0, 0, 0, True), (0, 1, 1, True)]), # ⊖ # ├─╮ (b'rev-b', 1, None, [(0, 0, 0, True)]) , # │ ○ # │ (rev_a, 0, None, []) ],# ○ computed) def test_with_ghost_mainline(self): tree = self.make_branch_and_tree('tree') tree.add_parent_tree_id(b'rev-a', allow_leftmost_as_ghost=True) rev_b = tree.commit('b') bi = loggraphviz.BranchInfo(None, tree, tree.branch) gv = loggraphviz.GraphVizLoader([bi], bi, False) gv.load() state = loggraphviz.GraphVizFilterState(gv) computed = gv.compute_viz(state) self.assertComputed( [(rev_b, 0, None, [(0, 0, 0, True)]), # ○ # │ (b'rev-a', 0, None, []) ],# ○ computed) def test_get_revid_branch_info(self): builder = self.make_branch_builder('trunk') builder.start_series() rev_a = builder.build_snapshot(None, [('add', ('', b'TREE_ROOT', 'directory', b'')),]) rev_branch = builder.build_snapshot([rev_a], []) rev_trunk = builder.build_snapshot([rev_a], []) builder.finish_series() # ○ branch # │ # ○ │ trunk # ├─╯ # ○ rev-a trunk = builder.get_branch() #trunk.set_last_revision(rev_trunk) branch = trunk.controldir.sprout('../branch', revision_id=rev_branch).open_branch() trunk_bi = loggraphviz.BranchInfo('trunk', None, trunk) branch_bi = loggraphviz.BranchInfo('branch', None, branch) gv = loggraphviz.GraphVizLoader( [trunk_bi, branch_bi], trunk_bi, False) gv.load() self.assertEqual(trunk_bi, gv.get_revid_branch_info(rev_trunk)) self.assertEqual(branch_bi, gv.get_revid_branch_info(rev_branch)) # may return either self.assertIn(gv.get_revid_branch_info(rev_a), (branch_bi, trunk_bi)) def test_get_revid_branch_info_with_ghost(self): tree = self.make_branch_and_tree('tree') rev_a = tree.commit('a') tree.add_parent_tree_id(b'rev-b') rev_c = tree.commit('c') # rev-b is a ghost. We think he is there, but he does not exist. Boo! # c # ├─╮ # │ b # │ # a bi = loggraphviz.BranchInfo(None, tree, tree.branch) gv = loggraphviz.GraphVizLoader([bi], bi, False) gv.load() self.assertRaises(loggraphviz.GhostRevisionError, gv.get_revid_branch_info, b'rev-b') class TestLogGraphVizLayouts(TestCase, TestLogGraphVizMixin): def test_basic_branch_line(self): gv = BasicGraphVizLoader(('rev-d',), { 'rev-a': (NULL_REVISION, ), 'rev-b': ('rev-a', ), 'rev-c': ('rev-a', ), 'rev-d': ('rev-b', 'rev-c'), }) gv.load() state = loggraphviz.GraphVizFilterState(gv) computed = gv.compute_viz(state) # only mainline. self.assertComputed( [('rev-d', 0, False, [(0, 0, 0, True)]), # ⊕ # │ ('rev-b', 0, None, [(0, 0, 0, True)]) , # ○ # │ ('rev-a', 0, None, []) ],# ○ computed) state.collapse_expand_rev(computed.filtered_revs[0]) computed = gv.compute_viz(state) # expanded branch line. self.assertComputed( [('rev-d', 0, True, [(0, 0, 0, True), (0, 1, 2, True)]), # ⊖ # ├─╮ ('rev-c', 1, None, [(0, 0, 0, True), (1, 1, 0, True)]), # │ ○ # │ │ ('rev-b', 0, None, [(0, 0, 0, True), (1, 0, 0, True)]), # ○ │ # ├─╯ ('rev-a', 0, None, []) ],# ○ computed) def test_branch_line_order(self): gv = BasicGraphVizLoader(('rev-f',), { 'rev-a': (NULL_REVISION, ), 'rev-b': ('rev-a', ), 'rev-c': ('rev-b', ), 'rev-d': ('rev-a', 'rev-c'), 'rev-e': ('rev-b', ), 'rev-f': ('rev-d', 'rev-e' ), }) gv.load() state = loggraphviz.GraphVizFilterState(gv) state.expand_all_branch_lines() computed = gv.compute_viz(state) # branch lines should not cross over self.assertComputed( [('rev-f', 0, True, [(0, 0, 0, True), (0, 2, 3, True)]) , # ⊖ # ├───╮ ('rev-e', 2, True, [(0, 0, 0, True), (2, 2, 2, True)]) , # │ ⊖ # │ │ ('rev-d', 0, True, [(0, 0, 0, True), (0, 1, 2, True), (2, 2, 2, True)]), # ⊖ │ # ├─╮ │ ('rev-c', 1, None, [(0, 0, 0, True), (1, 1, 2, True), (2, 1, 2, True)]), # │ ○ │ # │ ├─╯ ('rev-b', 1, None, [(0, 0, 0, True), (1, 0, 0, True)]) , # │ ○ # ├─╯ ('rev-a', 0, None, []) ],# ○ computed) def test_branch_line_order2(self): gv = BasicGraphVizLoader(('rev-h',), { 'rev-a': (NULL_REVISION, ), 'rev-b': ('rev-a', ), 'rev-c': ('rev-b', ), 'rev-d': ('rev-a', ), 'rev-e': ('rev-d', 'rev-b' ), 'rev-f': ('rev-e', ), 'rev-g': ('rev-e', 'rev-f' ), 'rev-h': ('rev-c', 'rev-g' ), }) gv.load() state = loggraphviz.GraphVizFilterState(gv) state.expand_all_branch_lines() computed = gv.compute_viz(state) # branch lines should not cross over self.assertComputed( [('rev-h', 0, True, [(0, 0, 0, True), (0, 2, 2, True)]) , # ⊖ # ├───╮ ('rev-g', 2, True, [(0, 0, 0, True), (2, 2, 2, True), (2, 3, 3, True)]), # │ ⊖ # │ ├─╮ ('rev-f', 3, None, [(0, 0, 0, True), (2, 2, 2, True), (3, 2, 2, True)]), # │ │ ○ # │ ├─╯ ('rev-e', 2, None, [(0, 0, 0, True), (2, 1, 0, True), (2, 2, 2, True)]), # │ ○ # │ ╭─┤ ('rev-d', 2, None, [(0, 0, 0, True), (1, 1, 0, True), (2, 2, 0, True)]), # │ │ ○ # │ │ │ ('rev-c', 0, None, [(0, 0, 0, True), (1, 0, 0, True), (2, 2, 0, True)]), # ○ │ │ # ├─╯ │ ('rev-b', 0, None, [(0, 0, 0, True), (2, 0, 0, True)]) , # ○ │ # ├───╯ ('rev-a', 0, None, []) ],# ○ computed) def test_octopus_merge(self): gv = BasicGraphVizLoader(('rev-e',), { 'rev-a': (NULL_REVISION, ), 'rev-b': ('rev-a', ), 'rev-c': ('rev-a', ), 'rev-d': ('rev-a', ), 'rev-e': ('rev-a', 'rev-b', 'rev-c', 'rev-d'), }) gv.load() state = loggraphviz.GraphVizFilterState(gv) state.expand_all_branch_lines() computed = gv.compute_viz(state) self.assertComputed( [('rev-e', 0, True, [(0, 0, 0, True), (0, 1, 2, True), (0, 2, 3, True), (0, 3, 4, True)]), # ⊖ # ├─╮─╮─╮ ('rev-b', 3, None, [(0, 0, 0, True), (1, 1, 2, True), (2, 2, 3, True), (3, 3, 0, True)]), # │ │ │ ○ # │ │ │ │ ('rev-c', 2, None, [(0, 0, 0, True), (1, 1, 2, True), (2, 2, 0, True), (3, 3, 0, True)]), # │ │ ○ │ # │ │ │ │ ('rev-d', 1, None, [(0, 0, 0, True), (1, 0, 0, True), (2, 0, 0, True), (3, 0, 0, True)]), # │ ○ │ │ # ├─╯─╯─╯ ('rev-a', 0, None, []) ],# ○ computed) def test_lots_of_merges_between_branch_lines(self): gv = BasicGraphVizLoader(('rev-g',), { 'rev-a': (NULL_REVISION, ), 'rev-b': ('rev-a', ), 'rev-c': ('rev-b', ), 'rev-d': ('rev-a', ), 'rev-e': ('rev-d', 'rev-b',), 'rev-f': ('rev-e', 'rev-c',), 'rev-g': ('rev-c', 'rev-f',), }) gv.load() state = loggraphviz.GraphVizFilterState(gv) state.expand_all_branch_lines() computed = gv.compute_viz(state) self.assertComputed( [('rev-g', 0, True, [(0, 0, 0, True), (0, 2, 2, True)]) , # ⊖ # ├───╮ ('rev-f', 2, None, [(0, 0, 0, True), (2, 0.75, 0, True), (2, 2, 2, True)]) , # │ ○ # │ ╭─┤ ('rev-e', 2, None, [(0, 0, 0, True), (0.75, 0.75, 0, True), (2, 1.25, 0, True), (2, 2, 2, True)]), # │ │ ○ # │ ├─┤ ('rev-d', 2, None, [(0, 0, 0, True), (0.75, 0, 0, True), (1.25, 1.25, 0, True), (2, 2, 0, True)]), # │ │ ○ # ├─┤ │ ('rev-c', 0, None, [(0, 0, 0, True), (1.25, 0, 0, True), (2, 2, 0, True)]) , # ○ │ │ # ├─╯ │ ('rev-b', 0, None, [(0, 0, 0, True), (2, 0, 0, True)]) , # ○ │ # ├───╯ ('rev-a', 0, None, []) ],# ○ computed) def test_hidden_branch_line_hides_child_line(self): gv = BasicGraphVizLoader(('rev-g',), { 'rev-a': (NULL_REVISION, ), 'rev-b': ('rev-a', ), 'rev-c': ('rev-a', ), 'rev-d': ('rev-b', 'rev-c', ), 'rev-e': ('rev-b', 'rev-d', ), 'rev-f': ('rev-c', ), 'rev-g': ('rev-e', 'rev-f', ), }) gv.load() state = loggraphviz.GraphVizFilterState(gv) state.branch_line_state[(2, 1)] = None computed = gv.compute_viz(state) self.assertComputed( [('rev-g', 0, False, [(0, 0, 0, True)]) , # ⊕ # │ ('rev-e', 0, True, [(0, 0, 0, True), (0, 1, 3, True)]) , # ⊖ # ├─╮ ('rev-d', 1, False, [(0, 0, 0, True), (1, 0, 0, True)]), # │ ⊕ # ├─╯ ('rev-b', 0, None, [(0, 0, 0, True)]) , # ○ # │ ('rev-a', 0, None, []) ],# ○ computed) def test_merge_line_hidden(self): gv = BasicGraphVizLoader(('rev-d',), { 'rev-a': (NULL_REVISION, ), 'rev-b': ('rev-a', ), 'rev-c': ('rev-a', 'rev-b'), 'rev-d': ('rev-a', 'rev-c'), }) # d # ├─╮ # │ c # │ ├─╮ # │ │ b # ├─╯─╯ # a gv.load() state = loggraphviz.GraphVizFilterState(gv) state.branch_line_state[(1, 1)] = None computed = gv.compute_viz(state) # when the merge by branch line, we should show a non direct line self.assertComputed( [('rev-d', 0, False, [(0, 0, 0, True), (0, 1, 2, False)]), # ⊕ # ├┄╮ ('rev-b', 1, None, [(0, 0, 0, True), (1, 0, 0, True)]) , # │ ○ # ├─╯ ('rev-a', 0, None, []) ],# ○ computed) def test_merge_line_hidden2(self): gv = BasicGraphVizLoader(('rev-e',), { 'rev-a': (NULL_REVISION, ), 'rev-z': ('rev-a', ), 'rev-y': ('rev-a', 'rev-z', ), 'rev-b': ('rev-a', ), 'rev-c': ('rev-a', ), 'rev-d': ('rev-a', 'rev-c'), 'rev-e': ('rev-y', 'rev-b', 'rev-d'), }) # f # ├─╮─╮ # │ b │ # │ │ │ # │ │ e # │ │ ├─╮ # │ │ │ d # ├─╯─╯─╯ # a gv.load() state = loggraphviz.GraphVizFilterState(gv) #state.expand_all_branch_lines() state.branch_line_state[(1, 1)] = None state.branch_line_state[(1, 2)] = None #state.branch_line_state[(1, 3)] = None state.branch_line_state[(1, 4)] = None computed = gv.compute_viz(state) # when the merge by branch line, we should show a non direct line # this could layout better, but that's another story... self.assertComputed( [('rev-e', 0, False, [(0, 0, 0, True), (0, 1, 3, False), (0, 2, 5, True)]) , # ⊕ # ├┄╮─╮ ('rev-b', 2, None, [(0, 0, 0, True), (1, 3, 3, False), (2, 2, 0, True)]) , # │ ┆ ○ # │ ╰┄┼┄╮ ('rev-c', 3, None, [(0, 0, 0, True), (2, 2, 0, True), (3, 3, 0, True)]) , # │ │ ○ # │ │ │ ('rev-y', 0, True, [(0, 0, 0, True), (0, 1, 2, True), (2, 2, 0, True), (3, 3, 0, True)]), # ⊖ │ │ # ├─╮ │ │ ('rev-z', 1, None, [(0, 0, 0, True), (1, 0, 0, True), (2, 0, 0, True), (3, 0, 0, True)]), # │ ○ │ │ # ├─╯─╯─╯ ('rev-a', 0, None, []) ],# ○ computed) def test_merge_line_hidden_merge_rev_filtered(self): gv = BasicGraphVizLoader(('rev-e',), { 'rev-a': (NULL_REVISION, ), 'rev-b': ('rev-a', ), 'rev-c': ('rev-b', ), 'rev-d': ('rev-a', 'rev-c'), 'rev-e': ('rev-a', 'rev-d'), }) gv.load() state = loggraphviz.GraphVizFilterState(gv) state.filters.append(BasicFilterer(set(['rev-c']))) state.branch_line_state[(1, 1)] = None computed = gv.compute_viz(state) # when the merge by branch line, we should show a non direct line self.assertComputed( [('rev-e', 0, False, [(0, 0, 0, True), (0, 1, 2, False)]), # ⊕ # ├┄╮ ('rev-b', 1, None, [(0, 0, 0, True), (1, 0, 0, True)]) , # │ ○ # ├─╯ ('rev-a', 0, None, []) ],# ○ computed) def test_non_direct_hidden_branch(self): gv = BasicGraphVizLoader(('rev-f',), { 'rev-a': (NULL_REVISION, ), 'rev-b': ('rev-a', ), 'rev-c': ('rev-b', ), 'rev-d': ('rev-a', 'rev-c', ), 'rev-e': ('rev-b', ), 'rev-f': ('rev-d', 'rev-e', ), }) gv.load() state = loggraphviz.GraphVizFilterState(gv) state.branch_line_state[(1, 2)] = None computed = gv.compute_viz(state) self.assertComputed( [('rev-f', 0, True, [(0, 0, 0, True), (0, 1, 3, True)]) , # ⊖ # ├─╮ ('rev-e', 1, False, [(0, 0, 0, True), (1, 1, 0, False)]), # │ ⊕ # │ ┆ ('rev-d', 0, False, [(0, 0, 0, True), (1, 0, 0, False)]), # ⊕ ┆ # ├┄╯ ('rev-a', 0, None, []) ],# ○ computed) def test_non_direct_hidden_parent(self): gv = BasicGraphVizLoader(('rev-e',), { 'rev-a': (NULL_REVISION, ), 'rev-b': ('rev-a', ), 'rev-c': ('rev-b', ), 'rev-d': ('rev-a', 'rev-c'), 'rev-e': ('rev-a', 'rev-d'), }) gv.load() state = loggraphviz.GraphVizFilterState(gv) state.filters.append(BasicFilterer(set(['rev-c']))) state.expand_all_branch_lines() computed = gv.compute_viz(state) self.assertComputed( [('rev-e', 0, True, [(0, 0, 0, True), (0, 1, 3, True)]) , # ⊖ # ├─╮ ('rev-d', 1, True, [(0, 0, 0, True), (1, 1, 0, True), (1, 2, 2, False)]), # │ ⊖ # │ ├┄╮ ('rev-b', 2, None, [(0, 0, 0, True), (1, 0, 0, True), (2, 0, 0, True)]) , # │ │ ○ # ├─╯─╯ ('rev-a', 0, None, []) ],# ○ computed) def test_no_graph(self): gv = BasicGraphVizLoader(('rev-d',), { 'rev-a': (NULL_REVISION, ), 'rev-b': ('rev-a', ), 'rev-c': ('rev-a', ), 'rev-d': ('rev-b', 'rev-c'), }, no_graph=True) gv.load() state = loggraphviz.GraphVizFilterState(gv) computed = gv.compute_viz(state) self.assertComputed( [('rev-d', 0.0, None, []), # ○ # ('rev-c', 0.5, None, []), # ○ # ('rev-b', 0.0, None, []), # ○ # ('rev-a', 0.0, None, [])],# ○ computed) def test_no_graph_filtered(self): gv = BasicGraphVizLoader(('rev-d',), { 'rev-a': (NULL_REVISION, ), 'rev-b': ('rev-a', ), 'rev-c': ('rev-a', ), 'rev-d': ('rev-b', 'rev-c'), }, no_graph=True) gv.load() state = loggraphviz.GraphVizFilterState(gv) state.filters.append(BasicFilterer(set(['rev-b']))) computed = gv.compute_viz(state) self.assertComputed( [('rev-d', 0.0, None, []), # ○ # ('rev-c', 0.5, None, []), # ○ # ('rev-a', 0.0, None, [])],# ○ computed) class TestLogGraphProviderState(TestCase): def assertFilteredRevisions(self, expected_revids, state): revids = [rev.revid for rev in state.get_filtered_revisions()] self.assertEqual(list(expected_revids), revids) def test_collapse_expand_rev_basic(self): gv = BasicGraphVizLoader(('c',), { 'a': (NULL_REVISION, ), 'b': ('a', ), 'c': ('a', 'b'), }) gv.load() # c # ├─╮ # │ b # ├─╯ # a state = loggraphviz.GraphVizFilterState(gv) # just mainline showing self.assertFilteredRevisions('ca', state) # bla - we need a computed to call collapse_expand_rev # expand 'c' state.collapse_expand_rev(gv.compute_viz(state).filtered_revs[0]) # all should be showing self.assertFilteredRevisions('cba', state) # colapse 'c' state.collapse_expand_rev(gv.compute_viz(state).filtered_revs[0]) # just mainline showing self.assertFilteredRevisions('ca', state) def get_expanded_by_graph_provider(self): gv = BasicGraphVizLoader(('f',), { 'a': (NULL_REVISION, ), 'b': ('a', ), 'c': ('a', 'b'), 'd': ('a', 'c', ), 'e': ('b', ), 'f': ('d', 'e') }) gv.load() # f # ├───╮ # │ e # │ │ # d │ # ├─╮ │ # │ c │ # │ │\│ # │ │ b # ├─╯─╯ # a return gv def test_collapse_colapses_sub_expand(self): gv = self.get_expanded_by_graph_provider() state = loggraphviz.GraphVizFilterState(gv) # just mainline showing self.assertFilteredRevisions('fda', state) # expand 'd' state.collapse_expand_rev(gv.compute_viz(state).revisions[2]) # branchline c now showing self.assertFilteredRevisions('fdca', state) # expand 'c' state.collapse_expand_rev(gv.compute_viz(state).revisions[3]) # all showing self.assertFilteredRevisions('fedcba', state) # colapse 'd' state.collapse_expand_rev(gv.compute_viz(state).filtered_revs[2]) # cause c expanded branchline eb, and d expanded c, d colapses # just mainline showing self.assertFilteredRevisions('fda', state) def test_collapse_dosent_colapses_prev_expand(self): gv = self.get_expanded_by_graph_provider() state = loggraphviz.GraphVizFilterState(gv) # just mainline showing self.assertFilteredRevisions('fda', state) # expand 'f' state.collapse_expand_rev(gv.compute_viz(state).revisions[0]) # branchline eb now showing self.assertFilteredRevisions('fedba', state) # expand 'd' state.collapse_expand_rev(gv.compute_viz(state).revisions[2]) # all showing self.assertFilteredRevisions('fedcba', state) # colapse 'd' state.collapse_expand_rev(gv.compute_viz(state).filtered_revs[2]) # cause branchline eb was expanded by f, and not d, collapsing d dose # not collapse branchline eb, even though it expanded it # branchline eb and mainline left showing self.assertFilteredRevisions('fedba', state) def test_collapse_deep_expanded_by(self): # This use to error at one point gv = BasicGraphVizLoader(('g',), { 'a': (NULL_REVISION, ), 'b': ('a', ), 'c': ('a', 'b'), 'd': ('a', 'c', ), 'e': ('b', ), 'f': ('d', 'e'), 'g': ('a', 'f'), }) # g v-----1.3 # ├─╮ # │ f v-1.1 # │ ├───╮ # │ │ e # │ │ │ # │ d v-│-1.2 # │ ├─╮ │ # │ │ c │ # │ │ │\│ # │ │ │ b # ├─╯─╯─╯ # a gv.load() state = loggraphviz.GraphVizFilterState(gv) # just mainline showing self.assertFilteredRevisions('ga', state) # expand 'g' state.collapse_expand_rev(gv.compute_viz(state).revisions[0]) # branchline fd now showing self.assertFilteredRevisions('gfda', state) # expand 'f' state.collapse_expand_rev(gv.compute_viz(state).revisions[1]) # branchline eb now showing self.assertFilteredRevisions('gfedba', state) # expand 'd' state.collapse_expand_rev(gv.compute_viz(state).revisions[3]) # branchline c now showing (all showing) self.assertFilteredRevisions('gfedcba', state) # colapse 'g' state.collapse_expand_rev(gv.compute_viz(state).filtered_revs[0]) # back to just mainline showing self.assertFilteredRevisions('ga', state) def test_filter(self): gv = BasicGraphVizLoader(('e',), { 'a': (NULL_REVISION, ), 'b': ('a', ), 'c': ('a', 'b'), 'd': ('c', ), 'e': ('d', ), }) gv.load() # e # │ # d # │ # c # ├─╮ # │ b # ├─╯ # a state = loggraphviz.GraphVizFilterState(gv) # expand 'c' state.collapse_expand_rev(gv.compute_viz(state).filtered_revs[2]) # all should be showing self.assertFilteredRevisions('edcba', state) state.filters.append(BasicFilterer(('d', 'c', 'a'))) state.filter_changed() # d and a not showing bucause of filter # c shows even though it is filtered, because it merges a revision # that is not filtered. self.assertFilteredRevisions('ecb', state) class BasicGraphVizLoader(loggraphviz.GraphVizLoader): def __init__(self, heads, graph_dict, no_graph=False): self.heads = heads self.graph_dict = graph_dict bi = loggraphviz.BranchInfo(None, None, None) loggraphviz.GraphVizLoader.__init__(self, [bi], bi, no_graph) def load(self): for head in self.heads: self.append_head_info(head, self.branches[0], head) self.process_graph_parents(self.heads, list(self.graph_dict.items())) self.compute_head_info() if not self.no_graph: self.compute_branch_lines() self.compute_merge_info() class BasicFilterer(object): def __init__(self, filtered_revids): self.filtered_revids = filtered_revids def get_revision_visible(self, rev): return rev.revid not in self.filtered_revids def print_computed(computed): print_lines([(c_rev.rev.revid, c_rev.col_index, c_rev.twisty_state, c_rev.lines,) for c_rev in computed.filtered_revs]) def print_lines(list): print('') print(format_graph_lines(list)) def format_graph_lines(list, use_unicode=True): if not list: return list.__repr__() + '\n' s = StringIO() item_repr = [item.__repr__() for item in list] repr_width = max([len(repr) for repr in item_repr]) if use_unicode: twisty_char = {None: '○', True: '⊖', False: '⊕'} ver_char = {True: '│', False: '┆'} hor_char = {True: {' ': '─', '│': '┼', '┆': '┼'}, False: {' ': '┄', '│': '┼', '┆': '┼'}} tl_char = {' ': '╭', '│': '├', '┆': '├', '─': '┬', '┄': '┬', '┴': '┼', '┤': '┼',} tr_char = {' ': '╮', '│': '┤', '┆': '┤', '─': '┬', '┄': '┬', '┴': '┼', '├': '┼',} bl_char = {' ': '╰', '│': '├', '┆': '├', '─': '┴', '┄': '┴', '┬': '┼', '┤': '┼',} br_char = {' ': '╯', '│': '┤', '┆': '┤', '─': '┴', '┄': '┴', '┬': '┼', '├': '┼',} else: twisty_char = {None: '*', True: '~', False: '+'} ver_char = {True: '|', False: ':'} hor_char = {True: {' ': '-',}, False: {' ': '-'}} tl_char = {} tr_char = {} bl_char = {} br_char = {} for row, (item, repr) in enumerate(zip(list, item_repr)): if row == 0: s.write('[') else: s.write(' ') s.write(repr.ljust(repr_width)) if row == len(list)-1: s.write('] # ') else: s.write(', # ') if len(item) == 4: revid, col_index, twisty_state, lines = item if len(item) == 5: revid, col_index, twisty_state, lines, labels = item all_cols = [col_index] all_cols += [start for start, end, color, direct in lines] all_cols += [end for start, end, color, direct in lines] num_cols = (max(all_cols) + 1) * 2 this_line = [' ' for i in range(num_cols)] next_line = [' ' for i in range(num_cols)] for start, end, color, direct in lines: if start is None or end is None: continue start = int(round(start)) end = int(round(end)) if start == end: this_line[start * 2] = ver_char[direct] next_line[start * 2] = ver_char[direct] else: this_line[start * 2] = ver_char[direct] def replace_char(line, i, char_dict): old_char = line[i] if old_char in char_dict: line[i] = char_dict[old_char] for start, end, color, direct in lines: if start is None or end is None: continue start = int(round(start)) end = int(round(end)) if start < end: for i in range(start * 2 + 1, end * 2): replace_char(next_line, i, hor_char[direct]) replace_char(next_line, start * 2, bl_char) replace_char(next_line, end * 2, tr_char) elif start > end: for i in range(end * 2 + 1, start * 2): replace_char(next_line, i, hor_char[direct]) replace_char(next_line, start * 2, br_char) replace_char(next_line, end * 2, tl_char) this_line[int(col_index * 2)] = twisty_char[twisty_state] s.write(''.join(this_line)) s.write('\n') if not row == len(list)-1: s.write('# '.rjust(repr_width + 5)) s.write(''.join(next_line)) s.write('\n') return s.getvalue() class TestGroupOverlapping(TestCase): def test_group_overlapping(self): lines = [ (['a1'], 1, 3, 'a'), (['a2'], 2, 5, 'a'), (['a3'], 4, 6, 'a'), (['a4'], 6, 8, 'a'), (['b1'], 1, 3, 'b'), (['b2'], 2, 5, 'b'), (['n1'], 1, 8, None), (['n2'], 1, 8, None), ] groups = loggraphviz.group_overlapping(lines) self.assertEqual( [(['a1', 'a2', 'a3'], 1, 6, 'a'), (['a4'], 6, 8, 'a'), (['b1', 'b2'], 1, 5, 'b'), (['n1'], 1, 8, None), (['n2'], 1, 8, None)], groups) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_logmodel.py0000644000000000000000000000532714556556456015774 0ustar00# -*- coding: utf-8 -*- # # Copyright (C) 2008 Lukáš Lalinský # # 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 breezy.tests import TestCase, TestCaseWithTransport from PyQt5 import QtCore from breezy.plugins.qbrz.lib import tests as qtests from breezy.plugins.qbrz.lib.logmodel import (LogModel, GraphVizLoader) from breezy.plugins.qbrz.lib.loggraphviz import BranchInfo from breezy.plugins.qbrz.lib.util import ThrobberWidget from breezy.plugins.qbrz.lib.tests.modeltest import ModelTest class TestModel(qtests.QTestCase): def _test(self, wt): def processEvents(): pass throbber = ThrobberWidget(None) log_model = LogModel(processEvents, throbber) modeltest = ModelTest(log_model, None) bi = BranchInfo('', wt, wt.branch) log_model.load((bi,), bi, None, False, GraphVizLoader) def test_empty_branch(self): wt = self.make_branch_and_tree('.') self._test(wt) # Copied for breezy/tests/test_log.py def _prepare_tree_with_merges(self, with_tags=False): wt = self.make_branch_and_memory_tree('.') wt.lock_write() self.addCleanup(wt.unlock) wt.add('') wt.commit('rev-1', rev_id=b'rev-1', timestamp=1132586655, timezone=36000, committer='Joe Foo ') wt.commit('rev-merged', rev_id=b'rev-2a', timestamp=1132586700, timezone=36000, committer='Joe Foo ') wt.set_parent_ids([b'rev-1', b'rev-2a']) wt.branch.set_last_revision_info(1, b'rev-1') wt.commit('rev-2', rev_id=b'rev-2b', timestamp=1132586800, timezone=36000, committer='Joe Foo ') if with_tags: branch = wt.branch branch.tags.set_tag('v0.2', b'rev-2b') wt.commit('rev-3', rev_id=b'rev-3', imestamp=1132586900, timezone=36000, committer='Jane Foo ') branch.tags.set_tag('v1.0rc1', b'rev-3') branch.tags.set_tag('v1.0', b'rev-3') return wt def test_merges(self): wt = self._prepare_tree_with_merges() self._test(wt) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_revisionmessagebrowser.py0000644000000000000000000000271014556556456020772 0ustar00# -*- coding: utf-8 -*- # # Contributors: # 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 breezy import ( tests, ) from breezy.plugins.qbrz.lib.revisionmessagebrowser import ( htmlencode, htmlize, ) class TestHtmlUtils(tests.TestCase): def test_htmlencode(self): self.assertEqual('"&<>', htmlencode('"&<>')) self.assertEqual('\n', htmlencode('\n')) def test_htmlize_convert_leading_spaces_to_nbsp(self): self.assertEqual('foo bar', htmlize('foo bar')) self.assertEqual("0
" " 1
" "  2
" "0", htmlize("0\n 1\n 2\n0")) self.assertEqual(' foo bar', htmlize(' foo bar')) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_spellcheck.py0000644000000000000000000000477114556556456016311 0ustar00# -*- coding: utf-8 -*- # # Copyright (C) 2008 Lukáš Lalinský # # 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. """Tests for QBzr plugin.""" from breezy.tests import TestCase try: from breezy.tests.features import Feature except ImportError: # bzr < 2.5 from breezy.tests import Feature from breezy.plugins.qbrz.lib.spellcheck import SpellChecker class _PyEnchantFeature(Feature): def _probe(self): try: from breezy.plugins.qbrz.lib.spellcheck_enchant import EnchantSpellChecker except ImportError: return False if "en-US" not in EnchantSpellChecker.list_languages(): return False return True PyEnchantFeature = _PyEnchantFeature() class TestSpellcheck(TestCase): _test_needs_features = [PyEnchantFeature] def setUp(self): super(TestSpellcheck, self).setUp() def cleanup(): del self.checker self.checker = SpellChecker("en-US") self.addCleanup(cleanup) def test_correct(self): result = list(self.checker.check("yes")) self.assertEqual([], result) def test_incorrect(self): result = list(self.checker.check("yess")) self.assertEqual([(0, 4)], result) def test_camel_case(self): result = list(self.checker.check("YesNo")) self.assertEqual([], result) def test_camel_case_2(self): result = list(self.checker.check("yesNo")) self.assertEqual([], result) def test_underscores(self): result = list(self.checker.check("Yes_No")) self.assertEqual([], result) def test_email(self): result = list(self.checker.check("yes name@example.com no")) self.assertEqual([], result) def test_url(self): result = list(self.checker.check("yes http://example.com/foo/bar no")) self.assertEqual([], result) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_subprocess.py0000644000000000000000000002114414556556456016355 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # # Contributors: # Alexander Belchenko, 2009 # # 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. import fastbencode as bencode from io import StringIO from breezy import ( errors, progress, urlutils, ) from breezy.tests import ( TestCase, features, ) from breezy.plugins.qbrz.lib.subprocess import ( bittorrent_b_decode_prompt, bittorrent_b_encode_prompt, bittorrent_b_encode_unicode, bittorrent_b_encode_exception_instance, bittorrent_b_decode_exception_instance, # bittorrent_b_encode_unicode_escape, # bittorrent_b_decode_unicode_escape, SubprocessProgressView, SUB_PROGRESS, ) class TestBencode(TestCase): def test_bittorrent_b_encode_unicode(self): # Encoding should ALWAYS give bytes and expects bytes BUT our routines convert self.assertEqual(b"l7:versione", bittorrent_b_encode_unicode(["version"])) # self.assertEqual(b"l3:add3:\u1234e", bittorrent_b_encode_unicode(["add", "\u1234"])) result = bittorrent_b_encode_unicode(["add", "\u1234"]) self.assertEqual(b'l3:add3:\xe1\x88\xb4e', result) # Now check the '\u1234' comes back when it's a string... u = bencode.bdecode(result) self.assertIsInstance(u, list) self.assertEqual("\u1234", u[1].decode('utf-8')) def test_bad_bittorrent_examples(self): self.assertRaises(ValueError, bencode.bdecode, b'@/tmp/QBrz/qsubprocess/tmprkdrsdyi') def test_bittorrent_b_encode_prompt(self): self.assertEqual(b"4:spam", bittorrent_b_encode_prompt(utf_string='spam')) self.assertEqual(b"9:spam\neggs", bittorrent_b_encode_prompt('spam' + '\n' + 'eggs')) # "Р\nС" is NOT "P\nC" it's b'\xd0\xa0\n\xd0\xa1' # CYRILLIC CAPITAL LETTER ER, \n and CYRILLIC CAPITAL LETTER ES self.assertEqual(b'5:\xd0\xa0\n\xd0\xa1', bittorrent_b_encode_prompt("Р\nС")) def test_bittorrent_b_decode_prompt(self): # Decode must always give not-bytes self.assertEqual('spam', bittorrent_b_decode_prompt(b"4:spam")) self.assertEqual('spam'+'\n'+'eggs', bittorrent_b_decode_prompt(b"9:spam\neggs")) # "Р\nС" is NOT "P\nC" it's b'\xd0\xa0\n\xd0\xa1' # CYRILLIC CAPITAL LETTER ER, \n and CYRILLIC CAPITAL LETTER ES self.assertEqual("Р\nС", bittorrent_b_decode_prompt(b'5:\xd0\xa0\n\xd0\xa1')) # def test_bittorrent_b_encode_unicode_escape_dict(self): # self.assertEqual({'key': 'foo\\nbar', 'ukey': '\\u1234'}, # bittorrent_b_encode_unicode_escape({'key': 'foo\nbar', 'ukey': '\u1234'})) # def test_bittorrent_b_decode_unicode_escape_dict(self): # self.assertEqual({'key': 'foo\nbar', 'ukey': '\u1234'}, # bittorrent_b_decode_unicode_escape({'key': 'foo\\nbar', 'ukey': '\\u1234'})) class TestExceptionInstanceSerialisation(TestCase): """Check exceptions can serialised safely with needed details preserved""" def check_exception_instance(self, e): encoded = bittorrent_b_encode_exception_instance(e) name, attr_dict = bittorrent_b_decode_exception_instance(encoded) self.assertEqual(name, e.__class__.__name__) return attr_dict def test_simple_error(self): """A common error with just an args attribute""" self.check_exception_instance(ValueError("Simple")) # TODO: if transmitted assert args/message in return dict def test_non_ascii_bytes(self): """An error with a non-ascii bytestring attribute""" self.check_exception_instance(OSError(13, "Lupa ev\xc3\xa4tty")) # TODO: if transmitted assert errno/strerror/etc in return dict def test_unreprable_obj(self): """Ensure an object with a broken repr doesn't break the exception""" class Bad(object): def __repr__(self): return self.attribute_that_does_not_exist self.check_exception_instance(ValueError(Bad())) # TODO: if transmitted assert message equals the placeholder string def test_uncommittedchanges_display_url(self): """The display_url of UncommittedChanges errors should be serialised""" self.requireFeature(features.UnicodeFilenameFeature) path = "\u1234" class FakeTree(object): def __init__(self, url): self.user_url = url attrs = self.check_exception_instance(errors.UncommittedChanges(FakeTree(urlutils.local_path_to_url(path)))) self.assertIsSameRealPath(path, urlutils.local_path_from_url(attrs["display_url"])) class TestSubprocessProgressView(TestCase): """Check serialisation of progress updates""" def decode_progress(self, bencoded_data:bytes) -> list: """Decodes string of bencoded progress output to list of updates Duplicates logic decoding logic from `SubProcessWidget.readStdout` and `SubProcessWidget.setProgress` which would be good to factor out. bdecode requires bencoded bytes and bencoded_data should BE bytes but doesn't appear to be. """ updates = [] for line in bencoded_data.split("\n"): if line.startswith(SUB_PROGRESS): # bdecode needs bytes, but we need to snip off the leading SUB_PROGRESS first n, transport_activity, task_info = bencode.bdecode(line[len(SUB_PROGRESS):].encode('utf-8')) if n == 1000000 and not task_info: task_message = "Finished!" else: # task_info will be a list of byte-strings, so join and then decode task_message = b" / ".join(task_info).decode("utf-8") # transport_activity will be bytes too... updates.append((n, transport_activity.decode('utf-8'), task_message)) # Now we'll return a list of lines like: (0, '', 'Finding revisions / 0/2') return updates def make_stream_and_task(self): """Create a new output stream and ProgressTask for testing""" sio = StringIO() task = progress.ProgressTask(progress_view=SubprocessProgressView(sio)) return sio, task @staticmethod def refresh(task): """Allow a new update without a time delay""" task.progress_view._last_repaint = 0 def test_task_one_update(self): """Sending a single progress update should work""" sio, task = self.make_stream_and_task() task.update("Finding revisions", 0, 2) self.assertEqual([(0, "", "Finding revisions / 0/2")], self.decode_progress(sio.getvalue())) def test_task_multiple_updates(self): """Sending a single progress update should work""" sio, task = self.make_stream_and_task() task.update("Finding revisions", 0, 2) self.refresh(task) task.update("Finding revisions", 1, 2) self.refresh(task) task.update("Finding revisions", 2, 2) self.assertEqual([ (0, "", "Finding revisions / 0/2"), (500000, "", "Finding revisions / 1/2"), (1000000, "", "Finding revisions / 2/2")], self.decode_progress(sio.getvalue())) def test_task_update_and_finished(self): """Sending a single progress update should work""" sio, task = self.make_stream_and_task() task.update("Finding revisions", 0, 2) self.refresh(task) # RJLRJL task.finished() no longer exists... # try: # task.finished() # except AttributeError: # self.knownFailure("No ui_factory so calls missing task_finished") self.assertEqual([(0, "", "Finding revisions / 0/2")], self.decode_progress(sio.getvalue())) def test_task_non_ascii_message(self): """A localised progress message should be transmitted cleanly""" sio, task = self.make_stream_and_task() # Would be nice to use an actual translation task.update("\u1234", 0, 2) self.assertEqual([(0, "", "\u1234 / 0/2")], self.decode_progress(sio.getvalue())) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_tree_branch.py0000644000000000000000000001327714556556456016451 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # # Contributor: # Alexander Belchenko, 2009 # # 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. """Tests for TreeBranch wrapper object.""" from breezy import ( errors, osutils, tests, ) from breezy.transport import memory from breezy.plugins.qbrz.lib import tree_branch from breezy.plugins.qbrz.lib.tests import mock class TestTreeBranch(tests.TestCaseWithTransport): def test_errors_no_ui_mode_no_branch(self): self.vfs_transport_factory = memory.MemoryServer mf = mock.MockFunction() self.assertRaises(errors.NotBranchError, tree_branch.TreeBranch.open_containing, self.get_url('non/existent/path'), ui_mode=False, _critical_dialog=mf) self.assertEqual(0, mf.count) def test_errors_no_ui_mode_no_tree(self): mf = mock.MockFunction() self.make_branch('a') self.assertRaises(errors.NoWorkingTree, tree_branch.TreeBranch.open_containing, 'a', require_tree=True, ui_mode=False, _critical_dialog=mf) self.assertEqual(0, mf.count) def test_errors_ui_mode_no_branch(self): self.vfs_transport_factory = memory.MemoryServer mf = mock.MockFunction() tb = tree_branch.TreeBranch.open_containing( self.get_url('non/existent/path'), ui_mode=True, _critical_dialog=mf) self.assertEqual(None, tb) self.assertEqual(1, mf.count) def test_errors_ui_mode_no_tree(self): mf = mock.MockFunction() self.make_branch('a') mf = mock.MockFunction() tb = tree_branch.TreeBranch.open_containing('a', require_tree=True, ui_mode=True, _critical_dialog=mf) self.assertEqual(None, tb) self.assertEqual(1, mf.count) def test_open(self): self.make_branch('a') mf = mock.MockFunction() tb = tree_branch.TreeBranch.open_containing('a', require_tree=False, ui_mode=False, _critical_dialog=mf) self.assertNotEqual(None, tb) self.assertEqual('a', tb.location) self.assertNotEqual(None, tb.branch) self.assertEqual(None, tb.tree) self.assertEqual('', tb.relpath) self.assertEqual(0, mf.count) # self.make_branch_and_tree('b') tb = tree_branch.TreeBranch.open_containing('b', require_tree=True, ui_mode=False, _critical_dialog=mf) self.assertNotEqual(None, tb) self.assertEqual('b', tb.location) self.assertNotEqual(None, tb.branch) self.assertNotEqual(None, tb.tree) self.assertEqual('', tb.relpath) self.assertEqual(0, mf.count) # self.build_tree(['b/dir/']) tb = tree_branch.TreeBranch.open_containing('b/dir', require_tree=True, ui_mode=False, _critical_dialog=mf) self.assertNotEqual(None, tb) self.assertEqual('b/dir', tb.location) self.assertNotEqual(None, tb.branch) self.assertNotEqual(None, tb.tree) self.assertEqual('dir', tb.relpath) self.assertEqual(0, mf.count) def test_get_type(self): self.make_branch('a') mf = mock.MockFunction() tb = tree_branch.TreeBranch.open_containing('a', require_tree=False, ui_mode=False, _critical_dialog=mf) self.assertEqual('branch', tb.get_type()) # self.make_branch_and_tree('master') tb = tree_branch.TreeBranch.open_containing('master', require_tree=True, ui_mode=False, _critical_dialog=mf) self.assertEqual('tree', tb.get_type()) self.run_bzr('checkout master slave') tb = tree_branch.TreeBranch.open_containing('slave', require_tree=True, ui_mode=False, _critical_dialog=mf) self.assertEqual('bound', tb.get_type()) self.run_bzr('checkout --lightweight master light') tb = tree_branch.TreeBranch.open_containing('light', require_tree=True, ui_mode=False, _critical_dialog=mf) self.assertEqual('light-checkout', tb.get_type()) def test_get_root(self): mf = mock.MockFunction() self.make_branch('a') tb = tree_branch.TreeBranch.open_containing('a', require_tree=False, ui_mode=False, _critical_dialog=mf) self.assertEqual(osutils.abspath('a')+'/', tb.get_root()) # self.make_branch_and_tree('b') root = osutils.abspath('b') tb = tree_branch.TreeBranch.open_containing('b', require_tree=True, ui_mode=False, _critical_dialog=mf) self.assertEqual(root, tb.get_root()) # self.build_tree(['b/dir/']) tb = tree_branch.TreeBranch.open_containing('b/dir', require_tree=True, ui_mode=False, _critical_dialog=mf) self.assertEqual(root, tb.get_root()) # self.run_bzr('checkout --lightweight b c') tb = tree_branch.TreeBranch.open_containing('c', require_tree=True, ui_mode=False, _critical_dialog=mf) self.assertEqual(osutils.abspath('c'), tb.get_root()) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_treewidget.py0000644000000000000000000005621714556556456016341 0ustar00# -*- coding: utf-8 -*- # # Copyright (C) 2009 Gary van der Merwe # # 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 versio0n 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. import os from breezy.tests import TestCase, TestCaseWithTransport from breezy import tests from breezy.workingtree import WorkingTree from breezy import ignores from breezy.bzr.conflicts import TextConflict from PyQt5 import QtCore from PyQt5.QtTest import QTest from breezy.plugins.qbrz.lib import tests as qtests from breezy.plugins.qbrz.lib.treewidget import ( TreeWidget, TreeModel, TreeFilterProxyModel, ModelItemData, InternalItem, PersistantItemReference, group_large_dirs, ) from breezy.plugins.qbrz.lib.tests.modeltest import ModelTest # The filter_scenarios are at the end of the file def load_tests(loader, basic_tests, pattern): result = loader.suiteClass() tree_tests, remaining_tests = tests.split_suite_by_condition(basic_tests, tests.condition_isinstance((TestTreeWidget,))) 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) return result class TestTreeWidget(qtests.QTestCase): # Set by load_tests make_tree = None modify_tree = None changes_mode = False def setUp(self): super(TestTreeWidget, self).setUp() self.tree, self.branch = self.make_tree(self) def make_working_tree(self): # tree = WorkingTree() tree = self.make_branch_and_tree('trunk') self.build_tree_contents([('trunk/textconflict', b'base'),]) tree.add(['textconflict'], ids=[b'textconflict-id']) tree.commit('a', rev_id=b'rev-a', committer="joe@foo5.com", timestamp=1166046000.00, timezone=0) branch_tree = tree.controldir.sprout('branch').open_workingtree() self.build_tree_contents([('branch/textconflict', b'other'),]) branch_tree.commit('b', rev_id=b'rev-b', committer="joe@foo5.com", timestamp=1166046000.00, timezone=0) self.branch_tree = branch_tree self.build_tree(['trunk/dir/']) self.build_tree_contents([('trunk/dir/dirchild', b''), ('trunk/unmodified', b''), ('trunk/renamed', b''), ('trunk/moved', b''), ('trunk/movedandrenamed', b''), ('trunk/removed', b''), ('trunk/missing', b''), ('trunk/modified', b'old'), ('trunk/textconflict', b'this'), ]) tree.add(['dir'], ids=[b'dir-id']) tree.add(['dir/dirchild'], ids=[b'dirchild-id']) tree.add(['unmodified'], ids=[b'unmodified-id']) tree.add(['renamed'], ids=[b'renamed-id']) tree.add(['moved'], ids=[b'moved-id']) tree.add(['movedandrenamed'], ids=[b'movedandrenamed-id']) tree.add(['removed'], ids=[b'removed-id']) tree.add(['missing'], ids=[b'missing-id']) tree.add(['modified'], ids=[b'modified-id']) tree.commit('c', rev_id=b'rev-c', committer="joe@foo5.com", timestamp=1166046000.00, timezone=0) return tree, tree.branch def modify_working_tree(self, tree): if 0: tree = WorkingTree() # RJLRJL: patched out renames as calls seem to be insoluble # and related to a problem with finding the id vs rel_path tree.merge_from_branch(self.branch_tree.branch, b'rev-b') self.build_tree_contents([('trunk/added', b''), ('trunk/addedmissing', b''), ('trunk/modified', b'new'), ('trunk/unversioned', b''), ]) tree.add(['added'], ids=[b'added-id']) tree.add(['addedmissing'], ids=[b'addedmissing-id']) tree.rename_one('renamed', 'renamed1') tree.move(('moved',), 'dir') tree.rename_one('movedandrenamed', 'movedandrenamed1') tree.move(('movedandrenamed1',), 'dir') tree.remove(('removed',)) os.remove('trunk/missing') os.remove('trunk/addedmissing') # test for https://bugs.launchpad.net/qbrz/+bug/538753 # must sort before trunk/dir self.build_tree(['trunk/a-newdir/']) self.build_tree_contents([('trunk/a-newdir/newdirchild', b'')]) tree.add(['a-newdir'], ids=[b'a-newdir-id']) tree.add(['a-newdir/newdirchild'], ids=[b'newdirchild-id']) # manually add conflicts for files that don't exist # See https://bugs.launchpad.net/qbrz/+bug/528548 tree.add_conflicts([TextConflict('nofileconflict')]) def make_rev_tree(self): tree = self.make_branch_and_tree('tree') self.build_tree(['tree/b/']) self.build_tree_contents([('tree/a', b''), ('tree/b/c', b''), ]) tree.add(['a'], ids=[b'a-id']) tree.add(['b'], ids=[b'b-id']) tree.add(['b/c'], ids=[b'c-id']) tree.commit('a', rev_id=b'rev-1', committer="joe@foo5.com", timestamp=1166046000.00, timezone=0) revtree = tree.branch.repository.revision_tree(b'rev-1') return revtree, tree.branch def run_model_tests(self): # Check that indexes point to their correct items. def check_item_children(index): item = self.widget.tree_model.inventory_data[index.internalId()] if item.children_ids: for row, child_id in enumerate(item.children_ids): child_index = self.widget.tree_model.index(row, 0, index) self.assertEqual(child_index.internalId(), child_id) check_item_children(child_index) if self.widget.tree_model.inventory_data: check_item_children(self.widget.tree_model._index_from_id(0, 0)) # root ModelTest(self.widget.tree_model, None) ModelTest(self.widget.tree_filter_model, None) def test_show_widget(self): widget = TreeWidget() self.widget = widget widget.setGeometry(0, 0, 1000, 1000) QTest.qWaitForWindowExposed(widget) self.widget.show() self.run_model_tests() self.addCleanup(widget.close) # make the widget bigger so that we can see what is going on. widget.setGeometry(0,0,1000,1000) QtCore.QCoreApplication.processEvents() widget.show() QTest.qWaitForWindowExposed(widget) QtCore.QCoreApplication.processEvents() widget.set_tree(self.tree, self.branch, changes_mode=self.changes_mode) self.widget.show() self.run_model_tests() widget.update() QTest.qWaitForWindowExposed(widget) QtCore.QCoreApplication.processEvents() widget.expandAll() QTest.qWaitForWindowExposed(widget) self.run_model_tests() widget.update() QTest.qWaitForWindowExposed(widget) QtCore.QCoreApplication.processEvents() # RJL 2023: self.modify_tree (which is actually # TestTreeWidget.modify_working_tree - see tree_scenarios) fails # or at least the refresh() afterwards does # Suspicion is that remame_one might be faulty # BUGBUG: patched out - rename seems to fail self.modify_tree(self, self.tree) QTest.qWaitForWindowExposed(widget) widget.refresh() QTest.qWaitForWindowExposed(widget) self.run_model_tests() widget.update() QTest.qWaitForWindowExposed(widget) QtCore.QCoreApplication.processEvents() widget.expandAll() QTest.qWaitForWindowExposed(widget) self.run_model_tests() widget.update() QTest.qWaitForWindowExposed(widget) 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(qtests.QTestCase): # 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', b''), ('tree/ignored-dir-with-child/child', b''), ('tree/unchanged', b''), ('tree/changed', b'old'), ('tree/unversioned', b''), ('tree/ignored', b''), ]) tree.add(['dir-with-unversioned'], ids=[b'dir-with-unversioned-id']) tree.add(['unchanged'], ids=[b'unchanged-id']) tree.add(['changed'], ids=[b'changed-id']) ignores.tree_ignores_add_patterns(tree, ['ignored-dir-with-child', 'ignored']) tree.commit('a', rev_id=b'rev-a', committer="joe@foo5.com", timestamp=1166046000.00, timezone=0) self.build_tree_contents([('tree/changed', b'bnew')]) 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.expected_visible.sort() self.assertEqual(self.getVisiblePaths(), self.expected_visible) def getVisiblePaths(self): # RJLRJL this appears to have an off-by-one error which does seem # unlikely - however, changes in both breezy and python might now # be causing problems. In other words, it doesn't seem to handle # children properly visible_paths = [] # New QModelIndex objects are created by the model using the QAbstractItemModel.createIndex() function. # An invalid model index can be constructed with the QModelIndex constructor. Invalid indexes are often # used as parent indexes when referring to top-level items in a model. (from the PyQt4 docs) parent_indexes_to_visit = [QtCore.QModelIndex()] while parent_indexes_to_visit: parent_index = parent_indexes_to_visit.pop() rows = self.filter_model.rowCount(parent_index) for row in range(0, rows): # we get a QModelIndex into index from row, column (0) and the current parent index = self.filter_model.index(row, 0, parent_index) # and the data (the path in this case) the_path = self.filter_model.data(index, self.model.PATH) visible_paths.append(the_path) if self.filter_model.hasChildren(index): # It appears that, although this will be visited, it won't be recorded # as row_count will be zero whereas the first lot are, as they are children # of the base QtCore parent parent_indexes_to_visit.append(index) visible_paths.sort() return visible_paths def test_unversioned_move_conflict(self): """Test for bug reported as lp:557603 lp:712931 lp:815822 lp:876180""" tree = self.make_branch_and_tree("parent") tree.commit("Base revision") childtree = tree.controldir.sprout("child").open_workingtree() self.build_tree(["parent/f", "child/f"]) childtree.add(["f"]) childtree.commit("Adding f") tree.merge_from_branch(childtree.branch) self.assertLength(1, tree.conflicts()) self.assertPathExists("parent/f.moved") os.remove("parent/f.moved") # At this point, the tree has a pending merge adding 'f' and a removed # unversioned duplicate 'f.moved', which is enough to trigger the bug. self.model = TreeModel() load_dirs = [PersistantItemReference(None, "parent")] 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) expected_paths = [] if self.filter[TreeFilterProxyModel.CHANGED]: expected_paths.append("f") self.assertEqual(self.getVisiblePaths(), expected_paths) class TestTreeWidgetSelectAll(qtests.QTestCase): 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', b''), ('tree/ignored-dir-with-child/child', b''), ('tree/unversioned-with-ignored/ignored-dir-with-child/child', b''), ('tree/unchanged', b''), ('tree/changed', b'old'), ('tree/unversioned', b''), ('tree/ignored', b''), ]) tree.add(['dir-with-unversioned'], ids=[b'dir-with-unversioned-id']) tree.add(['unchanged'], ids=[b'unchanged-id']) tree.add(['changed'], ids=[b'changed-id']) ignores.tree_ignores_add_patterns(tree, ['ignored-dir-with-child', 'ignored']) tree.commit('a', rev_id=b'rev-a', committer="joe@foo5.com", timestamp=1166046000.00, timezone=0) self.build_tree_contents([('tree/changed', b'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. self.assertEqual(set(selected), set(paths)) def test_add_selectall(self): import breezy.plugins.qbrz.lib.add self.win = breezy.plugins.qbrz.lib.add.AddWindow(self.tree, None) QTest.qWaitForWindowExposed(self.win) self.win.show() self.addCleanup(self.cleanup_win) self.win.initial_load() QTest.qWaitForWindowExposed(self.win) self.win.show() self.win.show_ignored_checkbox.click() self.win.show() self.assertSelectedPaths(self.win.filelist_widget, ['dir-with-unversioned/child', 'unversioned', 'unversioned-with-ignored']) def test_commit_selectall(self): import breezy.plugins.qbrz.lib.commit self.win = breezy.plugins.qbrz.lib.commit.CommitWindow(tree=self.tree, selected_list=None) self.win.show() QTest.qWaitForWindowExposed(self.win) self.addCleanup(self.cleanup_win) self.win.load() QTest.qWaitForWindowExposed(self.win) self.assertSelectedPaths(self.win.filelist_widget, ['changed']) QTest.qWaitForWindowExposed(self.win) # self.win.show_nonversioned_checkbox.setCheckState(QtCore.Qt.Checked) self.win.show_nonversioned_checkbox.click() QTest.qWaitForWindowExposed(self.win) self.win.show() # self.win.selectall_checkbox.setCheckState(QtCore.Qt.Unchecked) self.win.selectall_checkbox.click() QTest.qWaitForWindowExposed(self.win) # RJLRJL: this import pdb...` commented-out code was already present, so looks like this was always problematic # import pdb; pdb.set_trace() self.assertSelectedPaths(self.win.filelist_widget, ['changed', 'dir-with-unversioned/child', 'unversioned', 'unversioned-with-ignored']) def test_revert_selectall(self): import breezy.plugins.qbrz.lib.revert self.win = breezy.plugins.qbrz.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() try: self.win.filelist_widget.deleteLater() self.win.filelist_widget.tree_model.deleteLater() except AttributeError: self.win.filelist.deleteLater() self.win.filelist.tree_model.deleteLater() QtCore.QCoreApplication.processEvents() class TestModelItemData(TestCase): def _make_unversioned_model_list(self, iterable): return [ModelItemData(path, InternalItem(path, kind, None)) for path, kind in iterable] def test_sort_key_one_dir(self): models = self._make_unversioned_model_list(( ("b", "directory"), ("d", "directory"), ("a", "file"), ("c", "file"))) self.assertEqual(models, sorted(reversed(models), key=ModelItemData.dirs_first_sort_key)) def test_sort_key_sub_dirs(self): models = self._make_unversioned_model_list(( ('a', 'directory'), ('a/f', 'file'), ('b', 'directory'), ('b/f', 'file'))) self.assertEqual(models, sorted(reversed(models), key=ModelItemData.dirs_first_sort_key)) models = self._make_unversioned_model_list(( ('b', 'directory'), ('b/y', 'directory'), ('b/y/z', 'file'), ('b/x', 'file'), ('a', 'file'), ('c', 'file'))) self.assertEqual(models, sorted(reversed(models), key=ModelItemData.dirs_first_sort_key)) # See [[../treewidget.py]] TreeFilterProxyModel # UNCHANGED, CHANGED, UNVERSIONED, IGNORED # RJLRJL check for .bzrignore vs .brzignore 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): paths = frozenset(("a/1", "a/2", "a/3", "b")) self.assertEqual(group_large_dirs(paths), {"":paths}) def test_no_group_no_parents_with_others(self): paths = frozenset(("a/1", "a/2", "a/3", "a/4")) self.assertEqual(group_large_dirs(paths), {"":paths}) def test_group_large_and_parents_with_others(self): paths = frozenset(("a/1", "a/2", "a/3", "a/4", "b")) self.assertEqual(group_large_dirs(paths), {'': set(['a', 'b']), 'a': set(['a/1', 'a/2', 'a/3', 'a/4'])}) def test_group_container(self): paths = frozenset(("a/1", "a/2", "a/3", "a", )) self.assertEqual(group_large_dirs(paths), {'': set(['a']), 'a': set(['a/1', 'a/2', 'a/3'])}) def test_no_paths(self): paths = frozenset() self.assertEqual(group_large_dirs(paths), {'': set([])}) def test_group_deeper_dir(self): paths = frozenset(("a/b/1", "a/b/2", "a/b/3", "a/b/4", "c")) self.assertEqual(group_large_dirs(paths), {'': set(['a/b', 'c']), 'a/b': set(['a/b/1', 'a/b/2', 'a/b/3', 'a/b/4'])}) def test_subdir_included(self): paths = frozenset([ 'b', 'b/1', 'b/2', 'b/3', 'b/4', 'b/c', 'b/c/1', 'b/c/2', 'b/c/3', 'b/c/4', ]) self.assertEqual(group_large_dirs(paths), {'': set(['b']), 'b': set(['b/1', 'b/2', 'b/3', 'b/4', 'b/c']), 'b/c': set(['b/c/1', 'b/c/2', 'b/c/3', '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']), }) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/tests/test_util.py0000644000000000000000000002571414556556456015151 0ustar00# -*- coding: utf-8 -*- # # Copyright (C) 2008 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. """Tests for QBzr plugin.""" import sys from breezy import ( config, errors, tests, ) from breezy.transport import memory from breezy.plugins.qbrz.lib import ( tests as qbrz_tests, util, ) from breezy.plugins.qbrz.lib.fake_branch import FakeBranch from breezy.plugins.qbrz.lib.tests import mock # RJLRJL some bzr... file-names might need changing class TestUtil(qbrz_tests.QTestCase): def test_file_extension(self): self.assertEqual('', util.file_extension('')) self.assertEqual('', util.file_extension('/foo/bar.x/')) self.assertEqual('', util.file_extension('C:/foo/bar.x/')) self.assertEqual('', util.file_extension('.bzrignore')) self.assertEqual('', util.file_extension('/foo/bar.x/.bzrignore')) self.assertEqual('.txt', util.file_extension('foo.txt')) self.assertEqual('.txt', util.file_extension('/foo/bar.x/foo.txt')) def test_filter_options(self): fo = util.FilterOptions() self.assertEqual(False, bool(fo)) self.assertEqual(False, fo.is_all_enable()) self.assertEqual('', fo.to_str()) self.assertEqual(False, fo.check('added')) self.assertEqual(False, fo.check('removed')) self.assertEqual(False, fo.check('deleted')) self.assertEqual(False, fo.check('renamed')) self.assertEqual(False, fo.check('modified')) self.assertEqual(False, fo.check('renamed and modified')) self.assertRaises(ValueError, fo.check, 'spam') fo = util.FilterOptions(deleted=True) self.assertEqual(True, bool(fo)) self.assertEqual(False, fo.is_all_enable()) self.assertEqual('deleted files', fo.to_str()) self.assertEqual(False, fo.check('added')) self.assertEqual(True, fo.check('removed')) self.assertEqual(True, fo.check('deleted')) self.assertEqual(False, fo.check('renamed')) self.assertEqual(False, fo.check('modified')) self.assertEqual(False, fo.check('renamed and modified')) fo = util.FilterOptions(added=True) self.assertEqual(True, bool(fo)) self.assertEqual(False, fo.is_all_enable()) self.assertEqual('added files', fo.to_str()) self.assertEqual(True, fo.check('added')) self.assertEqual(False, fo.check('removed')) self.assertEqual(False, fo.check('deleted')) self.assertEqual(False, fo.check('renamed')) self.assertEqual(False, fo.check('modified')) self.assertEqual(False, fo.check('renamed and modified')) fo = util.FilterOptions(renamed=True) self.assertEqual(True, bool(fo)) self.assertEqual(False, fo.is_all_enable()) self.assertEqual('renamed files', fo.to_str()) self.assertEqual(False, fo.check('added')) self.assertEqual(False, fo.check('removed')) self.assertEqual(False, fo.check('deleted')) self.assertEqual(True, fo.check('renamed')) self.assertEqual(False, fo.check('modified')) self.assertEqual(True, fo.check('renamed and modified')) fo = util.FilterOptions(modified=True) self.assertEqual(True, bool(fo)) self.assertEqual(False, fo.is_all_enable()) self.assertEqual('modified files', fo.to_str()) self.assertEqual(False, fo.check('added')) self.assertEqual(False, fo.check('removed')) self.assertEqual(False, fo.check('deleted')) self.assertEqual(False, fo.check('renamed')) self.assertEqual(True, fo.check('modified')) self.assertEqual(True, fo.check('renamed and modified')) fo = util.FilterOptions(added=True, deleted=True, modified=True, renamed=True) self.assertEqual(True, bool(fo)) self.assertEqual(True, fo.is_all_enable()) self.assertEqual('deleted files, added files, ' 'renamed files, modified files', fo.to_str()) self.assertEqual(True, fo.check('added')) self.assertEqual(True, fo.check('removed')) self.assertEqual(True, fo.check('deleted')) self.assertEqual(True, fo.check('renamed')) self.assertEqual(True, fo.check('modified')) self.assertEqual(True, fo.check('renamed and modified')) fo = util.FilterOptions(all_enable=True) self.assertEqual(True, bool(fo)) self.assertEqual(True, fo.is_all_enable()) fo = util.FilterOptions() fo.all_enable() self.assertEqual(True, bool(fo)) self.assertEqual(True, fo.is_all_enable()) def test_url_for_display(self): self.assertEqual(None, util.url_for_display(None)) self.assertEqual('', util.url_for_display('')) self.assertEqual('http://bazaar.launchpad.net/~qbrz-dev/qbrz/trunk', util.url_for_display('http://bazaar.launchpad.net/%7Eqbrz-dev/qbrz/trunk')) if sys.platform == 'win32': self.assertEqual('C:/work/qbrz/', util.url_for_display('file:///C:/work/qbrz/')) else: self.assertEqual('/home/work/qbrz/', util.url_for_display('file:///home/work/qbrz/')) def test_content_seems_to_be_binary(self): self.assertEqual(False, util.content_seems_to_be_binary([])) self.assertEqual(False, util.content_seems_to_be_binary(['foo\n', 'bar\r\n', 'spam\r'])) self.assertEqual(True, util.content_seems_to_be_binary([b'\x00'])) self.assertEqual(True, util.content_seems_to_be_binary([b'a'*2048 + b'\x00'])) # self.assertEqual(True, util.content_seems_to_be_binary(['a'*2048 + '\x00'])) def test_get_summary(self): import breezy.revision r = breezy.revision.Revision('1') r.message = None self.assertEqual('(no message)', util.get_summary(r)) r.message = '' self.assertEqual('(no message)', util.get_summary(r)) r.message = 'message' self.assertEqual('message', util.get_summary(r)) def test_get_message(self): import breezy.revision r = breezy.revision.Revision('1') r.message = None self.assertEqual('(no message)', util.get_message(r)) r.message = 'message' self.assertEqual('message', util.get_message(r)) def test_ensure_unicode(self): self.assertEqual('foo', util.ensure_unicode('foo')) self.assertEqual('foo', util.ensure_unicode('foo')) self.assertEqual('\u1234', util.ensure_unicode('\u1234')) self.assertEqual(1, util.ensure_unicode(1)) def test__shlex_split_unicode_linux(self): self.assertEqual(['foo/bar', '\u1234'], util._shlex_split_unicode_linux("foo/bar \u1234")) def test__shlex_split_unicode_windows(self): self.assertEqual(['C:\\foo\\bar', '\u1234'], util._shlex_split_unicode_windows("C:\\foo\\bar \u1234")) # RJLRJL bypassed for now # def test_launchpad_project_from_url(self): # fut = util.launchpad_project_from_url # fut = function under test # # classic # self.assertEqual('qbrz', fut('bzr+ssh://bazaar.launchpad.net/~qbrz-dev/qbrz/trunk')) # # lp:qbrz # self.assertEqual('qbrz', fut('bzr+ssh://bazaar.launchpad.net/+branch/qbrz')) # self.assertEqual('qbrz', fut('bzr+ssh://bazaar.launchpad.net/%2Bbranch/qbrz')) # # lp:qbrz/0.20 # self.assertEqual('qbrz', fut('bzr+ssh://bazaar.launchpad.net/%2Bbranch/qbrz/0.20')) # # lp:ubuntu/qbrz # self.assertEqual('qbrz', fut('bzr+ssh://bazaar.launchpad.net/%2Bbranch/ubuntu/qbrz')) # # lp:ubuntu/natty/qbrz # self.assertEqual('qbrz', fut('bzr+ssh://bazaar.launchpad.net/%2Bbranch/ubuntu/natty/qbrz')) # # lp:ubuntu/natty-proposed/qbrz # self.assertEqual('qbrz', fut('bzr+ssh://bazaar.launchpad.net/%2Bbranch/ubuntu/natty-proposed/qbrz')) # # lp:~someone/ubuntu/maverick/qbrz/sru # self.assertEqual('qbrz', fut('bzr+ssh://bazaar.launchpad.net/~someone/ubuntu/maverick/qbrz/sru')) class TestOpenTree(tests.TestCaseWithTransport): def test_no_ui_mode_no_branch(self): self.vfs_transport_factory = memory.MemoryServer mf = mock.MockFunction() self.assertRaises(errors.NotBranchError, util.open_tree, self.get_url('non/existent/path'), ui_mode=False, _critical_dialog=mf) self.assertEqual(0, mf.count) def test_no_ui_mode(self): mf = mock.MockFunction() self.make_branch('a') self.assertRaises(errors.NoWorkingTree, util.open_tree, 'a', ui_mode=False, _critical_dialog=mf) self.assertEqual(0, mf.count) # self.make_branch_and_tree('b') tree = util.open_tree('b', ui_mode=False, _critical_dialog=mf) self.assertNotEqual(None, tree) self.assertEqual(0, mf.count) def test_ui_mode_no_branch(self): self.vfs_transport_factory = memory.MemoryServer mf = mock.MockFunction() tree = util.open_tree(self.get_url('/non/existent/path'), ui_mode=True, _critical_dialog=mf) self.assertEqual(None, tree) self.assertEqual(1, mf.count) def test_ui_mode(self): mf = mock.MockFunction() self.make_branch('a') mf = mock.MockFunction() tree = util.open_tree('a', ui_mode=True, _critical_dialog=mf) self.assertEqual(None, tree) self.assertEqual(1, mf.count) # self.make_branch_and_tree('b') mf = mock.MockFunction() tree = util.open_tree('b', ui_mode=False, _critical_dialog=mf) self.assertNotEqual(None, tree) self.assertEqual(0, mf.count) class TestFakeBranch(tests.TestCaseInTempDir): def test_get_branch_config(self): br = FakeBranch() br_cfg = util.get_branch_config(br) self.assertTrue(isinstance(br_cfg, config.GlobalConfig)) def test_get_set_encoding_get(self): br = FakeBranch() enc = util.get_set_encoding(None, br) self.assertEqual('utf-8', enc) def test_get_set_encoding_set(self): br = FakeBranch() util.get_set_encoding('ascii', br) # check that we don't overwrite encoding vaslue in bazaar.conf self.assertEqual('utf-8', util.get_set_encoding(None,None)) def test_get_set_tab_width_chars(self): br = FakeBranch() w = util.get_set_tab_width_chars(br) self.assertEqual(8, w) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/widgets/__init__.py0000644000000000000000000000142614556556456015172 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # # 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. ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/widgets/shelve.py0000644000000000000000000012502414556556456014722 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2011 QBzr Developers # # 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 contextlib import ExitStack import os from PyQt5 import QtCore, QtGui, QtWidgets try: from breezy.transport import NoSuchFile except ImportError: from breezy.errors import NoSuchFile from breezy.plugins.qbrz.lib.i18n import gettext, ngettext, N_ from breezy.plugins.qbrz.lib.util import ( get_global_config, get_set_encoding, runs_in_loading_queue, get_icon, ToolBarThrobberWidget, get_monospace_font, get_tab_width_pixels, get_set_tab_width_chars, get_qbrz_config, file_extension, ) from breezy.plugins.qbrz.lib.widgets.toolbars import ( FindToolbar, ToolbarPanel, LayoutSelector ) from breezy.plugins.qbrz.lib.widgets.tab_width_selector import TabWidthMenuSelector from breezy.plugins.qbrz.lib.widgets.texteditaccessory import ( GuideBar, setup_guidebar_for_find ) from breezy.plugins.qbrz.lib.decorators import lazy_call from breezy import errors from breezy.plugins.qbrz.lib.uifactory import ui_current_widget from breezy.plugins.qbrz.lib.trace import reports_exception from breezy.patches import HunkLine, ContextLine, InsertLine, RemoveLine from breezy import transform, textfile, patches from breezy.workingtree import WorkingTree from breezy.plugins.qbrz.lib.encoding_selector import EncodingMenuSelector from breezy.plugins.qbrz.lib.commit import TextEdit from breezy.plugins.qbrz.lib.spellcheck import SpellCheckHighlighter, SpellChecker from breezy.plugins.qbrz.lib.autocomplete import get_wordlist_builder from breezy.shelf import ShelfCreator from breezy.shelf_ui import Shelver from breezy.osutils import split_lines from io import StringIO """ TODO:: Wordwrap mode Side by side view External diff (ShelveListWindow) Select hunk by Find. """ # For i18n change_status = ( N_("delete file"), N_("rename"), N_("add file"), N_("modify text"), N_("modify target"), N_("modify binary") ) MAX_AUTOCOMPLETE_FILES = 20 class WorkingTreeHasChanged(errors.BzrError): pass class WorkingTreeHasPendingMarge(errors.BzrError): pass class DummyDiffWriter(object): def __init__(self): pass def write(self, *args, **kwargs): pass class Change(object): def __init__(self, change, shelver, trees): status = change[0] file_id = change[1] def get_kind(tree, path, id): try: return tree.kind(path) except NoSuchFile: return 'file' if status == 'delete file': self.path = trees[0].id2path(file_id) self.kind = get_kind(trees[0], self.path, file_id) self.disp_text = self.path elif status == 'rename': self.path = [tree.id2path(file_id) for tree in trees] self.disp_text = '%s => %s' % (self.path[0], self.path[1]) self.kind = get_kind(trees[1], self.path[1], file_id) else: self.path = trees[1].id2path(file_id) self.disp_text = self.path self.kind = get_kind(trees[1], self.path, file_id) if status == 'modify text': try: paths = [tree.id2path(file_id) for tree in trees] self.sha1 = trees[1].get_file_sha1(paths[1]) target_lines = trees[0].get_file_lines(paths[0]) textfile.check_text_lines(target_lines) work_lines = trees[1].get_file_lines(paths[1]) textfile.check_text_lines(work_lines) self._target_lines = [None, target_lines, None] self._work_lines = [None, work_lines, None] self._edited_lines = [None, None, None] parsed = shelver.get_parsed_patch(file_id, False) for hunk in parsed.hunks: hunk.selected = False self.parsed_patch = parsed self.hunk_texts = [None, None, None] except errors.BinaryFile: status = 'modify binary' self.data = change self.file_id = file_id self.status = status self._words = None def is_same_change(self, other): # NOTE: This does not use __cmp__ because this method does not compare # all data. if self.data != other.data: return False if self.status in ('modify text', 'modify binary'): if self.sha1 != other.sha1: return False return True @property def target_lines(self): """Original file lines""" return self._target_lines[1] @property def work_lines(self): """Working file lines""" return self._work_lines[1] def get_edited_lines(self): return self._edited_lines[1] def set_edited_lines(self, lines): self._edited_lines = [None, lines, None] edited_lines = property(get_edited_lines, set_edited_lines) def encode_hunk_texts(self, encoding): """ Return encoded hunk texts. hunk texts is nested list. Outer is per hunks, inner is per lines. """ if self.hunk_texts[0] == encoding: return self.hunk_texts[2] patch = self.parsed_patch try: texts = [[line.as_bytes().decode(encoding) for line in hunk.lines] for hunk in patch.hunks] except UnicodeError: if self.hunk_texts[1] is None: texts = [[str(line) for line in hunk.lines] for hunk in patch.hunks] self.hunk_texts[1] = texts else: texts = self.hunk_texts[1] self.hunk_texts[0] = encoding self.hunk_texts[2] = texts return texts def encode(self, lines, encoding): if lines[0] == encoding: return lines[2] try: encoded_lines = [line.decode(encoding) for line in lines[1]] except UnicodeError: encoded_lines = lines[1] lines[2] = encoded_lines return encoded_lines def encode_work_lines(self, encoding): """Return encoded working file lines. """ return self.encode(self._work_lines, encoding) def encode_target_lines(self, encoding): """Return encoded original file lines.""" return self.encode(self._target_lines, encoding) def encode_edited_lines(self, encoding): """Return encoded edited lines by editor.""" if self._edited_lines[1] is None: return None return self.encode(self._edited_lines, encoding) def get_words(self): if self._words is not None: return self._words, False # Add path self._words = set() if self.status == 'rename': for path in self.path: self._words.add(path) self._words.add(os.path.split(path)[-1]) else: self._words.add(self.path) self._words.add(os.path.split(self.path)[-1]) if self.status == 'modify text': ext = file_extension(self.path) builder = get_wordlist_builder(ext) if builder is not None: try: self._words.update(builder.iter_words(StringIO("".join(self.work_lines)))) return self._words, True except EnvironmentError: pass return self._words, False class ShelveWidget(ToolbarPanel): shelfCreated = QtCore.pyqtSignal(int) def __init__(self, file_list=None, directory=None, complete=False, encoding=None, splitters=None, parent=None, select_all=False, init_msg=None): ToolbarPanel.__init__(self, slender=False, icon_size=22, parent=parent) self.revision = None self.file_list = file_list self.directory = directory self.message = None self.initial_encoding = encoding self.select_all = select_all self.current_layout = -1 self.load_settings() self.splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical, self) pal = QtGui.QPalette() pal.setColor(QtGui.QPalette.Window, QtGui.QColor(0,0,0,0)) self.splitter.setPalette(pal) self.splitter1 = QtWidgets.QSplitter(QtCore.Qt.Horizontal, self) self.splitter2 = QtWidgets.QSplitter(QtCore.Qt.Horizontal, self) self.splitter.addWidget(self.splitter1) self.splitter.addWidget(self.splitter2) message_groupbox = QtWidgets.QGroupBox(gettext("Message"), self) message_layout = QtWidgets.QVBoxLayout(message_groupbox) self.splitter1.addWidget(message_groupbox) language = get_global_config().get_user_option('spellcheck_language') or 'en' spell_checker = SpellChecker(language) self.message = TextEdit(spell_checker, message_groupbox, main_window=self) self.message.setToolTip(gettext("Enter the shelve message")) self.message.messageEntered.connect(self.do_shelve) self.completer = QtWidgets.QCompleter() self.completer_model = QtCore.QStringListModel(self.completer) self.completer.setModel(self.completer_model) self.message.setCompleter(self.completer) self.message.setAcceptRichText(False) if init_msg is not None: self.message.setText(init_msg) SpellCheckHighlighter(self.message.document(), spell_checker) message_layout.addWidget(self.message) self.file_view = QtWidgets.QTreeWidget(self) self.file_view.setHeaderLabels( [gettext("File Name"), gettext("Status"), gettext("Hunks")]) header = self.file_view.header() header.setStretchLastSection(False) header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents) header.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents) self.splitter1.addWidget(self.file_view) hunk_panel = ToolbarPanel(parent=self) self.hunk_view = HunkView(complete=complete) self.splitter2.addWidget(hunk_panel) # Build hunk panel toolbar show_find = hunk_panel.add_toolbar_button( N_("Find"), icon_name="edit-find", checkable=True, shortcut=QtGui.QKeySequence.Find) hunk_panel.add_separator() view_menu = QtWidgets.QMenu(gettext('View Options'), self) view_menu.addAction( hunk_panel.create_button(N_("Complete"), icon_name="complete", onclick=self.hunk_view.set_complete, checkable=True, checked=complete) ) self.tabwidth_selector = \ TabWidthMenuSelector(label_text=gettext("Tab width"), onChanged=self.on_tabwidth_changed) view_menu.addMenu(self.tabwidth_selector) self.encoding_selector = EncodingMenuSelector(encoding, gettext("Encoding"), self.encoding_changed) self.encoding_selector.setIcon(get_icon("format-text-bold", 16)) view_menu.addMenu(self.encoding_selector) hunk_panel.add_toolbar_menu( N_("&View Options"), view_menu, icon_name="document-properties", shortcut="Alt+V") hunk_panel.add_separator() hunk_panel.add_toolbar_button(N_("Previous hunk"), icon_name="go-up", onclick=self.hunk_view.move_previous, shortcut="Alt+Up") hunk_panel.add_toolbar_button(N_("Next hunk"), icon_name="go-down", onclick=self.hunk_view.move_next, shortcut="Alt+Down") self.editor_button = hunk_panel.add_toolbar_button(N_("Use editor"), icon_name="accessories-text-editor", enabled=False, onclick=self.use_editor, shortcut="Ctrl+E") find_toolbar = FindToolbar(self, self.hunk_view.browser, show_find) hunk_panel.add_widget(find_toolbar) hunk_panel.add_widget(self.hunk_view) find_toolbar.hide() setup_guidebar_for_find(self.hunk_view.guidebar, find_toolbar, index=1) self.find_toolbar = find_toolbar layout = QtWidgets.QVBoxLayout() layout.setContentsMargins(10, 10, 10, 10) layout.addWidget(self.splitter) self.add_layout(layout) shelve_menu = QtWidgets.QMenu(gettext("Shelve"), self) shelve_menu.addAction(self.create_button(N_("Destroy"), onclick=lambda:self.do_shelve(destroy=True))) self.add_toolbar_button(N_('Shelve'), icon_name='shelve', shortcut=QtGui.QKeySequence.Save, onclick=self.do_shelve, menu=shelve_menu) self.add_separator() self.add_toolbar_button(N_('Select all'), icon_name='select-all', onclick=lambda:self.check_all(True)) self.add_toolbar_button(N_('Unselect all'), icon_name='unselect-all', onclick=lambda:self.check_all(False)) layout_selector = \ LayoutSelector(num=3, onchanged=self.set_layout, parent=self, initial_no=self.current_layout) self.add_toolbar_menu(N_("&Layout"), layout_selector, icon_name="internet-news-reader", shortcut="Alt+L") self.add_toolbar_button(N_('&Refresh'), icon_name='view-refresh', shortcut="Ctrl+R", onclick=self.refresh) self.file_view.itemSelectionChanged.connect(self.selected_file_changed) self.file_view.itemChanged[QtWidgets.QTreeWidgetItem, int].connect(self.file_checked) self.hunk_view.selectionChanged.connect(self.selected_hunk_changed) self.set_layout() if splitters: splitters.add("shelve_splitter", self.splitter) splitters.add("shelve_splitter1", self.splitter1) splitters.add("shelve_splitter2", self.splitter2) for sp in (self.splitter, self.splitter1, self.splitter2): sp.setChildrenCollapsible(False) sp.setStretchFactor(0, 3) sp.setStretchFactor(1, 7) self.brushes = { 'add file': QtGui.QBrush(QtCore.Qt.blue), 'delete file': QtGui.QBrush(QtCore.Qt.red), 'rename': QtGui.QBrush(QtGui.QColor(160, 32, 240)), # purple } self.loaded = False def set_layout(self, type=None): if type: self.current_layout = type self.file_view.setParent(None) if self.current_layout == 1: self.splitter.setOrientation(QtCore.Qt.Vertical) self.splitter1.setOrientation(QtCore.Qt.Horizontal) self.splitter1.insertWidget(1, self.file_view) elif self.current_layout == 2: self.splitter.setOrientation(QtCore.Qt.Horizontal) self.splitter1.setOrientation(QtCore.Qt.Vertical) self.splitter1.insertWidget(1, self.file_view) else: self.splitter.setOrientation(QtCore.Qt.Vertical) self.splitter2.setOrientation(QtCore.Qt.Horizontal) self.splitter2.insertWidget(0, self.file_view) for sp in (self.splitter, self.splitter1, self.splitter2): if sp.count() != 2: continue size = sum(sp.sizes()) if size > 0: size1 = int(size * 0.3) sp.setSizes((size1, size - size1)) def _create_shelver_and_creator(self, destroy=False): shelver = Shelver.from_args(DummyDiffWriter(), None, False, self.file_list, None, directory=self.directory, destroy=destroy) try: creator = ShelfCreator( shelver.work_tree, shelver.target_tree, shelver.file_list) except: shelver.finalize() raise return shelver, creator def on_tabwidth_changed(self, width): get_set_tab_width_chars(self.trees[1].branch, tab_width_chars=width) self._on_tabwidth_changed(width) def _on_tabwidth_changed(self, width): pixels = get_tab_width_pixels(tab_width_chars=width) self.hunk_view.set_tab_width(pixels) def refresh(self): with ExitStack() as es: old_rev = self.revision old_changes = self._get_change_dictionary() self.clear(clear_message=False) shelver, creator = self._create_shelver_and_creator() es.callback(shelver.finalize) es.callback(creator.finalize) file_list = shelver.file_list if file_list: nfiles = len(file_list) if nfiles > 2: self.files_str = ngettext("%d file", "%d files", nfiles) % nfiles else: self.files_str = ", ".join(file_list) self.trees = (shelver.target_tree, shelver.work_tree) branch = shelver.work_tree.branch # current branch corresponding to working tree if self.initial_encoding is None: encoding = get_set_encoding(None, branch) self.initial_encoding = encoding # save real encoding for the next time self.encoding_selector.encoding = encoding # set encoding selector self.editor_available = (shelver.change_editor is not None) self.editor_button.setVisible(self.editor_available) tabwidth = get_set_tab_width_chars(branch) self.tabwidth_selector.setTabWidth(tabwidth) self._on_tabwidth_changed(tabwidth) self.revision = self.trees[0].get_revision_id() if self.revision != old_rev: old_changes = None for change in creator.iter_shelvable(): item = self._create_item(change, shelver, self.trees, old_changes) self.file_view.addTopLevelItem(item) if self.select_all: self.check_all(True) self.select_all = False self.loaded = True def _create_item(self, change, shelver, trees, old_changes): """Create QTreeWidgetItem for file list from Change instance.""" ch = Change(change, shelver, trees) item = QtWidgets.QTreeWidgetItem() if ch.kind == 'directory': item.setIcon(0, get_icon("folder", 16)) else: item.setIcon(0, get_icon("file", 16)) item.change = ch item.setText(0, ch.disp_text) item.setText(1, gettext(ch.status)) if ch.status == 'modify text': item.setText(2, '0/%d' % len(ch.parsed_patch.hunks)) brush = self.brushes.get(ch.status) if brush: for i in range(3): item.setForeground(i, brush) item.setCheckState(0, QtCore.Qt.Unchecked) if old_changes: old_change = old_changes.get((ch.file_id, ch.status)) if old_change and old_change.is_same_change(ch): # Keep selection when reloading if ch.status == 'modify text': item.change = old_change self.update_item(item) else: item.setCheckState(0, QtCore.Qt.Checked) return item def selected_file_changed(self): items = self.file_view.selectedItems() if len(items) != 1 or items[0].change.status != 'modify text': self.hunk_view.clear() self.editor_button.setEnabled(False) else: item = items[0] encoding = self.encoding_selector.encoding self.hunk_view.set_parsed_patch(item.change, encoding) self.editor_button.setEnabled(self.editor_available) def selected_hunk_changed(self): for item in self.file_view.selectedItems(): self.update_item(item) def update_item(self, item): change = item.change if change.status != 'modify text': return if change.edited_lines: state = QtCore.Qt.PartiallyChecked item.setText(2, "???") else: hunks = change.parsed_patch.hunks hunk_num = len(hunks) selected_hunk_num = 0 for hunk in hunks: if hunk.selected: selected_hunk_num += 1 item.setText(2, "%d/%d" % (selected_hunk_num, hunk_num)) if selected_hunk_num == 0: state = QtCore.Qt.Unchecked elif selected_hunk_num == hunk_num: state = QtCore.Qt.Checked else: state = QtCore.Qt.PartiallyChecked if item.checkState(0) != state: item.setCheckState(0, state) self.update_compleater_words() def file_checked(self, item, column): if column != 0: return checked = item.checkState(0) if checked == QtCore.Qt.Checked: selected = True elif checked == QtCore.Qt.Unchecked: selected = False else: return if item.change.status == 'modify text': hunk_num = len(item.change.parsed_patch.hunks) for hunk in item.change.parsed_patch.hunks: hunk.selected = selected if item.change.edited_lines: item.change.edited_lines = None self.selected_file_changed() else: self.hunk_view.update() item.setText(2, '%d/%d' % (hunk_num if selected else 0, hunk_num)) self.update_compleater_words() def encoding_changed(self, encoding): self.selected_file_changed() def complete_toggled(self, checked): self.hunk_view.set_complete(checked) def check_all(self, checked): if checked: state = QtCore.Qt.Checked else: state = QtCore.Qt.Unchecked view = self.file_view for i in range(view.topLevelItemCount()): item = view.topLevelItem(i) if item.checkState(0) != state: item.setCheckState(0, state) def clear(self, clear_message=True): if clear_message: self.message.clear() self.file_view.clear() self.file_view.viewport().update() self.hunk_view.clear() self.revision = None self.loaded = False def use_editor(self): items = self.file_view.selectedItems() if len(items) != 1 or items[0].change.status != 'modify text': return else: change = items[0].change with ExitStack() as es: target_tree, work_tree = self.trees es.enter_context(work_tree.lock_read()) es.enter_context(target_tree.lock_read()) config = work_tree.branch.get_config() change_editor = config.get_change_editor(target_tree, work_tree) if change_editor is None: QtWidgets.QMessageBox.information(self, gettext('Shelve'), gettext('Change editor is not defined.'), gettext('&OK')) self.editor_available = False self.editor_button.setEnabled(False) return es.callback(change_editor.finish) lines = split_lines(change_editor.edit_file(change.file_id)) change_count = Shelver._count_changed_regions(change.work_lines, lines) if change_count > 0: change.edited_lines = lines self.update_item(items[0]) self.selected_file_changed() def _get_change_dictionary(self): change_dict = {} for i in range(0, self.file_view.topLevelItemCount()): item = self.file_view.topLevelItem(i) change = item.change if item.checkState(0) == QtCore.Qt.Unchecked: continue change_dict[(change.file_id, change.status)] = change return change_dict def do_shelve(self, destroy=False): change_dict = self._get_change_dictionary() if change_dict: nfiles = len(change_dict) if destroy: prompt = ngettext('Delete changes of %d file without shelving', 'Delete changes of %d files without shelving', nfiles) % nfiles func = QtWidgets.QMessageBox.warning else: prompt = ngettext('Shelve changes of %d file', 'Shelve changes of %d files', nfiles) % nfiles func = QtWidgets.QMessageBox.question ret = func(self, gettext('Shelve'), prompt, QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel) if ret != QtWidgets.QMessageBox.Ok: return else: QtWidgets.QMessageBox.information(self, gettext('Shelve'), gettext('No changes selected.'), gettext('&OK')) return with ExitStack() as es: try: shelver, creator = self._create_shelver_and_creator(destroy=destroy) es.callback(shelver.finalize) es.callback(creator.finalize) trees = (shelver.target_tree, shelver.work_tree) if len(trees[1].get_parent_ids()) > 1: raise WorkingTreeHasPendingMarge if self.revision != trees[0].get_revision_id(): raise WorkingTreeHasChanged changes = [] for ch in creator.iter_shelvable(): change = Change(ch, shelver, trees) key = (change.file_id, change.status) org_change = change_dict.get(key) if org_change is None: continue if not change.is_same_change(org_change): raise WorkingTreeHasChanged del(change_dict[key]) changes.append(org_change) if change_dict: raise WorkingTreeHasChanged for change in changes: if change.status == 'modify text': self.handle_modify_text(creator, change) elif change.status == 'modify binary': creator.shelve_content_change(change.data[1]) else: creator.shelve_change(change.data) manager = shelver.work_tree.get_shelf_manager() message = str(self.message.toPlainText()).strip() or gettext('') if destroy: creator.transform() shelf_id = -1 else: shelf_id = manager.shelve_changes(creator, message) except WorkingTreeHasPendingMarge: QtWidgets.QMessageBox.warning(self, gettext('Shelve'), gettext('Operation aborted because working tree has pending merges.'), gettext('&OK')) return except WorkingTreeHasChanged: QtWidgets.QMessageBox.warning(self, gettext('Shelve'), gettext('Operation aborted because target files has been changed.'), gettext('&OK')) return self.shelfCreated.emit(shelf_id) self.clear() def handle_modify_text(self, creator, change): final_hunks = [] offset = 0 change_count = 0 if change.edited_lines: creator.shelve_lines(change.file_id, change.edited_lines) else: for hunk in change.parsed_patch.hunks: if hunk.selected: offset -= (hunk.mod_range - hunk.orig_range) change_count += 1 else: hunk.mod_pos += offset final_hunks.append(hunk) if change_count == 0: return patched = patches.iter_patched_from_hunks(change.target_lines, final_hunks) creator.shelve_lines(change.file_id, list(patched)) def load_settings(self): config = get_qbrz_config() layout = config.get_option("shelve_layout") if layout not in ("1", "3"): layout = "2" self.current_layout = int(layout) def save_settings(self): config = get_qbrz_config() config.set_option("shelve_layout", str(self.current_layout)) config.save() def hideEvent(self, event): self.save_settings() def update_compleater_words(self): words = set() num_files_loaded = 0 for i in range(0, self.file_view.topLevelItemCount()): item = self.file_view.topLevelItem(i) if item.checkState(0) == QtCore.Qt.Unchecked: continue ch = item.change if num_files_loaded < MAX_AUTOCOMPLETE_FILES: file_words, load_texts_first = ch.get_words() words.update(file_words) if load_texts_first: num_files_loaded += 1 self.window().processEvents() words = list(words) words.sort(key=lambda x: x.lower()) self.completer_model.setStringList(words) class HunkView(QtWidgets.QWidget): selectionChanged = QtCore.pyqtSignal() def __init__(self, complete=False, parent=None): QtWidgets.QWidget.__init__(self, parent) layout = QtWidgets.QHBoxLayout(self) layout.setSpacing(0) layout.setContentsMargins(0, 0, 0, 0) self.browser = HunkTextBrowser(complete, self) self.guidebar = GuideBar(self.browser, parent=self) self.guidebar.add_entry('hunk', self.browser.focus_color) self.selector = HunkSelector(self.browser, self) layout.addWidget(self.selector) layout.addWidget(self.browser) layout.addWidget(self.guidebar) self.browser.focusedHunkChanged.connect(self.update) def selected_hunk_changed(): self.update() self.selectionChanged.emit() self.browser.selectedHunkChanged.connect(selected_hunk_changed) self.change = None self.encoding = None def set_tab_width(self, pixels): self.browser.setTabStopWidth(pixels) def set_complete(self, value): self.browser.complete = value if self.change is not None: self.set_parsed_patch(self.change, self.encoding) def move_previous(self): self.browser.move_previous() def move_next(self): self.browser.move_next() def rewind(self): self.browser.rewind() def set_parsed_patch(self, change, encoding): self.change = change self.encoding = encoding self.browser.set_parsed_patch(change, encoding) self.guidebar.update_data(hunk=self.browser.guidebar_deta) self.update() def update(self): self.selector.update() self.browser.update() def clear(self): self.browser.clear() class HunkSelector(QtWidgets.QFrame): def __init__(self, browser, parent): QtWidgets.QFrame.__init__(self, parent) self.browser = browser self.setFixedWidth(25) self.setStyleSheet("border:1px solid lightgray;") browser.verticalScrollBar().valueChanged[int].connect(self.scrolled) self.frame_width = QtWidgets.QApplication.style().pixelMetric(QtWidgets.QStyle.PM_DefaultFrameWidth) self.checkbox_pen = QtGui.QPen(QtCore.Qt.black) self.checkbox_pen.setWidth(2) def scrolled(self, value): self.update() def paintEvent(self, event): QtWidgets.QFrame.paintEvent(self, event) browser = self.browser if not browser.hunk_list: return scroll_y = browser.verticalScrollBar().value() - self.frame_width painter = QtGui.QPainter(self) rect = event.rect() painter.setClipRect(rect) browser.draw_background(QtCore.QRect(1, rect.top(), self.width() - 2, rect.height()), painter, scroll_y) # draw checkbox top, bottom = rect.top(), rect.bottom() painter.setRenderHint(QtGui.QPainter.Antialiasing, True) painter.setPen(self.checkbox_pen) for hunk, y1, y2 in browser.hunk_list: y1 -= scroll_y y1 += 4 if y1 + 13 < top: continue if bottom < y1: break painter.fillRect(6, int(y1), 13, 13, QtCore.Qt.white) painter.drawRect(6, int(y1), 13, 13) if hunk.selected: painter.drawLine(9, int(y1) + 7, 12, int(y1) + 10) painter.drawLine(16, int(y1) + 3, 12, int(y1) + 10) del painter def mousePressEvent(self, event): if event.button() == QtCore.Qt.LeftButton: browser = self.browser scroll_y = browser.verticalScrollBar().value() y = event.y() + scroll_y - self.frame_width for i, (hunk, top, bottom) in enumerate(browser.hunk_list): if top <= y <= bottom: browser.toggle_selection(i) break elif y < top: break browser.focus_hunk_by_pos(event.y() - self.frame_width) QtWidgets.QFrame.mousePressEvent(self, event) class HunkTextBrowser(QtWidgets.QTextBrowser): documentChangeFinished = QtCore.pyqtSignal() selectedHunkChanged = QtCore.pyqtSignal() focusedHunkChanged = QtCore.pyqtSignal() def __init__(self, complete=False, parent=None): # XXX: This code should be merged with QSimpleDiffView QtWidgets.QTextBrowser.__init__(self, parent) self.hunk_list = [] self.doc = QtGui.QTextDocument(parent) self.doc.setUndoRedoEnabled(False) self.setDocument(self.doc) option = self.doc.defaultTextOption() option.setWrapMode(QtGui.QTextOption.NoWrap) self.doc.setDefaultTextOption(option) self.rewinded = False self.cursor = QtGui.QTextCursor(self.doc) monospacedFont = get_monospace_font() self.monospacedFormat = QtGui.QTextCharFormat() self.monospacedFormat.setFont(monospacedFont) self.monospacedInsertFormat = QtGui.QTextCharFormat(self.monospacedFormat) self.monospacedInsertFormat.setForeground(QtGui.QColor(0, 136, 11)) self.monospacedDeleteFormat = QtGui.QTextCharFormat(self.monospacedFormat) self.monospacedDeleteFormat.setForeground(QtGui.QColor(204, 0, 0)) self.monospacedInactiveFormat = QtGui.QTextCharFormat(self.monospacedFormat) self.monospacedInactiveFormat.setForeground(QtGui.QColor(128, 128, 128)) titleFont = QtGui.QFont(monospacedFont) titleFont.setPointSize(titleFont.pointSize() * 140 // 100) titleFont.setBold(True) titleFont.setItalic(True) self.monospacedHunkFormat = QtGui.QTextCharFormat() self.monospacedHunkFormat.setFont(titleFont) self.monospacedHunkFormat.setForeground(QtCore.Qt.black) from breezy.plugins.qbrz.lib.diffview import colors self.header_color = colors['blank'][0] self.border_pen = QtGui.QPen(QtCore.Qt.gray) self.focus_color = QtGui.QColor(0x87, 0xCE, 0xEB, 0x48) # lightBlue self.focus_color_inactive = QtGui.QColor(0x87, 0xCE, 0xEB, 0x20) # lightBlue self.complete = complete self._focused_index = -1 self.guidebar_deta = [] def rewind(self): if not self.rewinded: self.rewinded = True self.verticalScrollBar().setValue(0) def set_parsed_patch(self, change, encoding): self.clear() cursor = self.cursor if change.edited_lines: cursor.insertText(gettext("Edited by change editor.\n"), self.monospacedHunkFormat) lines = "".join(change.encode_edited_lines(encoding)) if lines: cursor.insertText(lines, self.monospacedInactiveFormat) return patch = change.parsed_patch texts = change.encode_hunk_texts(encoding) if self.complete: work_lines = change.encode_work_lines(encoding) def print_hunk(hunk, hunk_texts): for line, text in zip(hunk.lines, hunk_texts): if isinstance(line, InsertLine): fmt = self.monospacedInsertFormat elif isinstance(line, RemoveLine): fmt = self.monospacedDeleteFormat else: fmt = self.monospacedFormat cursor.insertText(text, fmt) start = 0 for hunk, hunk_texts in zip(patch.hunks, texts): # NOTE: hunk.mod_pos is 1 based value, not 0 based. if self.complete: lines = "".join([' ' + line for line in work_lines[start:hunk.mod_pos - 1]]) if lines: cursor.insertText(lines, self.monospacedInactiveFormat) start = hunk.mod_pos + hunk.mod_range - 1 y1 = cursor.block().layout().position().y() l1 = cursor.block().blockNumber() print_hunk(hunk, hunk_texts) y2 = cursor.block().layout().position().y() l2 = cursor.block().blockNumber() self.guidebar_deta.append((l1, l2 - l1)) else: y1 = cursor.block().layout().position().y() cursor.insertText(hunk.get_header().decode(encoding), self.monospacedHunkFormat) print_hunk(hunk, hunk_texts) cursor.insertText("\n", self.monospacedFormat) y2 = cursor.block().layout().position().y() self.hunk_list.append((hunk, y1, y2)) if self.complete: lines = "".join([' ' + line for line in work_lines[start:]]) if lines: cursor.insertText(lines, self.monospacedInactiveFormat) if self.hunk_list: self._set_focused_hunk(0) self.documentChangeFinished.emit() self.update() def update(self): QtWidgets.QTextBrowser.update(self) self.viewport().update() def clear(self): QtWidgets.QTextBrowser.clear(self) del(self.hunk_list[:]) self._set_focused_hunk(-1) self.guidebar_deta = [] self.documentChangeFinished.emit() def paintEvent(self, event): if not self.hunk_list: QtWidgets.QTextBrowser.paintEvent(self, event) return scroll_y = self.verticalScrollBar().value() painter = QtGui.QPainter(self.viewport()) rect = event.rect() painter.setClipRect(rect) self.draw_background(rect, painter, scroll_y) del painter QtWidgets.QTextBrowser.paintEvent(self, event) def draw_background(self, rect, painter, offset): left, right, width = rect.left(), rect.right(), rect.width() top, bottom = rect.top(), rect.bottom() painter.setPen(self.border_pen) for i, (hunk, y1, y2) in enumerate(self.hunk_list): y1 -= offset y2 -= offset if bottom < y1 or y2 < top: continue if not self.complete: # Fill header rect. painter.fillRect(left, int(y1), width, 20, self.header_color) # Overlay focus rect. if i == self._focused_index: if self.hasFocus(): color = self.focus_color else: color = self.focus_color_inactive painter.fillRect(left, int(y1), width, int(y2 - y1), color) # Draw border. painter.drawLine(left, int(y1), right, int(y1)) painter.drawLine(left, int(y2), right, int(y2)) def move_next(self): index = int(self._focused_index + 1) if index == len(self.hunk_list): index -= 1 self._set_focused_hunk(index) self.setFocus(QtCore.Qt.OtherFocusReason) def move_previous(self): index = int(self._focused_index) if 1 <= index and index == self._focused_index: index -= 1 self._set_focused_hunk(index) self.setFocus(QtCore.Qt.OtherFocusReason) def toggle_selection(self, index): if 0 <= index < len(self.hunk_list) and int(index) == index: self.hunk_list[index][0].selected = not self.hunk_list[index][0].selected self.selectedHunkChanged.emit() def focus_hunk_by_pos(self, y): index = self.hittest(y) self._set_focused_hunk(index, scroll=False) def _set_focused_hunk(self, index, scroll=True): self._focused_index = index self.update() self.focusedHunkChanged.emit() if scroll and int(index) == index: self.scroll_to_hunk(index) def hittest(self, y): # NOTE : Value of y is client coordinate. # If y is between (N)th and (N+1)th hunks, return (N + 0.5) if not self.hunk_list: return -1 y += self.verticalScrollBar().value() for i, (hunk, y1, y2) in enumerate(self.hunk_list): if y1 <= y <= y2: return i elif y < y1: return i - 0.5 return i + 0.5 def scroll_to_hunk(self, index): sbar = self.verticalScrollBar() if index < 0: sbar.setValue(0) elif len(self.hunk_list) <= index: sbar.setValue(sbar.maximum()) else: MARGIN = 24 height = self.viewport().height() cur_pos = sbar.value() max_pos = int(self.hunk_list[index][1] - MARGIN) min_pos = int(self.hunk_list[index][2] - height + MARGIN) if max_pos <= min_pos or max_pos < cur_pos: sbar.setValue(max_pos) elif cur_pos < min_pos: sbar.setValue(min_pos) def mousePressEvent(self, event): if event.button() == QtCore.Qt.LeftButton: self.focus_hunk_by_pos(event.y()) QtWidgets.QTextBrowser.mousePressEvent(self, event) def focusInEvent(self, event): self.parent().update() QtWidgets.QTextBrowser.focusInEvent(self, event) def focusOutEvent(self, event): self.parent().update() QtWidgets.QTextBrowser.focusOutEvent(self, event) def keyPressEvent(self, event): mod, key = int(event.modifiers()), event.key() if mod == QtCore.Qt.NoModifier: if key == QtCore.Qt.Key_Space: self.toggle_selection(self._focused_index) return QtWidgets.QTextBrowser.keyPressEvent(self, event) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/widgets/shelvelist.py0000644000000000000000000005230614556556456015620 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2011 QBzr Developers # # 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 contextlib import ExitStack import sys, time from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtGui import QKeySequence from breezy.revision import CURRENT_REVISION from breezy.errors import ( NoSuchRevision, NoSuchRevisionInTree, PathsNotVersionedError) from breezy.plugins.qbrz.lib.i18n import gettext, N_ from breezy.plugins.qbrz.lib.util import ( ToolBarThrobberWidget, get_apparent_author_name, get_set_encoding, runs_in_loading_queue, get_icon, get_monospace_font, StandardButton, get_tab_width_pixels, get_set_tab_width_chars, get_qbrz_config, ) from breezy.plugins.qbrz.lib.widgets.toolbars import ( FindToolbar, ToolbarPanel, LayoutSelector ) from breezy.plugins.qbrz.lib.widgets.tab_width_selector import TabWidthMenuSelector from breezy.plugins.qbrz.lib.diffview import ( SidebySideDiffView, SimpleDiffView, ) from breezy.plugins.qbrz.lib.uifactory import ui_current_widget from breezy.plugins.qbrz.lib.trace import reports_exception from breezy.plugins.qbrz.lib.logwidget import LogList from breezy.plugins.qbrz.lib.decorators import lazy_call from breezy.plugins.qbrz.lib.widgets.texteditaccessory import setup_guidebar_for_find from breezy.lazy_import import lazy_import lazy_import(globals(), ''' from breezy.workingtree import WorkingTree from breezy.plugins.qbrz.lib.encoding_selector import EncodingMenuSelector from breezy.plugins.qbrz.lib.diff import DiffItem from breezy.shelf import Unshelver from breezy.shelf_ui import Unshelver as Unshelver_ui from breezy.plugins.qbrz.lib.subprocess import SimpleSubProcessDialog from PyQt5 import sip ''') class ShelveListWidget(ToolbarPanel): documentChangeFinished = QtCore.pyqtSignal() unshelved = QtCore.pyqtSignal(int, 'QString') def __init__(self, directory=None, complete=False, ignore_whitespace=False, encoding=None, splitters=None, parent=None): ToolbarPanel.__init__(self, slender=False, icon_size=22, parent=parent) self.initial_encoding = encoding self.directory = directory self.current_diffs = [] self.complete = complete self.ignore_whitespace = ignore_whitespace self.show_files = False self.load_settings() # build main widgets self.shelve_view = QtWidgets.QTreeWidget(self) self.shelve_view.setHeaderLabels([gettext("Id"), gettext("Message")]) header = self.shelve_view.header() header.setSectionResizeMode(0, QtWidgets.QHeaderView.ResizeToContents) self.file_view = QtWidgets.QTreeWidget(self) self.file_view.setHeaderLabels([gettext("File Name"), gettext("Status")]) self.file_view.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) header = self.file_view.header() header.setStretchLastSection(False) header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents) self.stack = QtWidgets.QStackedWidget(self) self.diffviews = (SidebySideDiffView(self), SimpleDiffView(self)) for view in self.diffviews: self.stack.addWidget(view) for browser in self.diffviews[0].browsers: browser.installEventFilter(self) diff_panel = ToolbarPanel(self) # build diffpanel toolbar show_find = diff_panel.add_toolbar_button( N_("Find"), icon_name="edit-find", checkable=True, shortcut=QtGui.QKeySequence.Find) diff_panel.add_separator() diff_panel.add_toolbar_button(N_("Unidiff"), icon_name="unidiff", checkable=True, shortcut="Ctrl+U", onclick=self.unidiff_toggled) view_menu = QtWidgets.QMenu(gettext('View Options'), self) view_menu.addAction( diff_panel.create_button(N_("&Complete"), icon_name="complete", checkable=True, checked=complete, onclick=self.complete_toggled) ) view_menu.addAction( diff_panel.create_button(N_("Ignore whitespace"), icon_name="whitespace", checkable=True, checked=ignore_whitespace, onclick=self.whitespace_toggled) ) self.tabwidth_selector = TabWidthMenuSelector(label_text=gettext("Tab width"), onChanged=self.on_tabwidth_changed) view_menu.addMenu(self.tabwidth_selector) self.encoding_selector = EncodingMenuSelector(encoding, gettext("Encoding"), self.encoding_changed) self.encoding_selector.setIcon(get_icon("format-text-bold", 16)) view_menu.addMenu(self.encoding_selector) diff_panel.add_toolbar_menu( N_("&View Options"), view_menu, icon_name="document-properties", shortcut="Alt+V") self.find_toolbar = FindToolbar(self, self.diffviews[0].browsers, show_find) diff_panel.add_widget(self.find_toolbar) diff_panel.add_widget(self.stack) self.find_toolbar.hide() for gb in self.diffviews[0].guidebar_panels: setup_guidebar_for_find(gb, self.find_toolbar, 1) setup_guidebar_for_find(self.diffviews[1], self.find_toolbar, 1) # Layout widgets self.splitter1 = QtWidgets.QSplitter(QtCore.Qt.Horizontal) self.splitter1.addWidget(self.shelve_view) self.splitter2 = QtWidgets.QSplitter(QtCore.Qt.Horizontal) self.splitter2.addWidget(self.file_view) self.splitter2.addWidget(diff_panel) self.splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical) self.splitter.addWidget(self.splitter1) self.splitter.addWidget(self.splitter2) self.splitter.setStretchFactor(0, 1) if splitters: splitters.add("shelvelist_splitter", self.splitter) splitters.add("shelvelist_splitter1", self.splitter1) splitters.add("shelvelist_splitter2", self.splitter2) for sp in (self.splitter, self.splitter1, self.splitter2): sp.setChildrenCollapsible(False) sp.setStretchFactor(0, 3) sp.setStretchFactor(1, 7) pal = QtGui.QPalette() pal.setColor(QtGui.QPalette.Window, QtGui.QColor(0,0,0,0)) self.splitter.setPalette(pal) layout = QtWidgets.QVBoxLayout() layout.setContentsMargins(10, 10, 10, 10) layout.addWidget(self.splitter) self.add_layout(layout) # build main toolbar unshelve_menu = QtWidgets.QMenu(gettext("Unshelve"), self) unshelve_menu.addAction(self.create_button(N_("Dry run"), onclick=lambda:self.do_unshelve('dry-run'))) unshelve_menu.addAction(self.create_button(N_("Keep"), onclick=lambda:self.do_unshelve('keep'))) unshelve_menu.addAction(self.create_button(N_("Delete"), onclick=lambda:self.do_unshelve('delete-only'))) self.unshelve_button = self.add_toolbar_button(N_("Unshelve"), icon_name="unshelve", enabled=False, onclick=lambda:self.do_unshelve('apply'), menu=unshelve_menu) self.add_separator() layout_selector = \ LayoutSelector(num=3, onchanged=lambda val:self.set_layout(type=val), parent=self, initial_no=self.current_layout) layout_selector.addSeparator() layout_selector.addAction( self.create_button(gettext("Show filelist"), icon_name="file", icon_size=16, checkable=True, checked=self.show_files, shortcut="Ctrl+L", onclick=lambda val:self.set_layout(show_files=val)) ) self.add_toolbar_menu(N_("&Layout"), layout_selector, icon_name="internet-news-reader", shortcut="Alt+L") self.add_toolbar_button(N_("&Refresh"), icon_name="view-refresh", shortcut="Ctrl+R", onclick=self.refresh) self.shelf_id = None self.set_layout() # set signals self.shelve_view.itemSelectionChanged.connect(self.selected_shelve_changed) self.file_view.itemSelectionChanged.connect(self.selected_files_changed) self.loaded = False self._interrupt_switch = False self._need_refresh = False self._selecting_all_files = False self.brushes = { 'added' : QtGui.QBrush(QtCore.Qt.blue), 'removed' : QtGui.QBrush(QtCore.Qt.red), 'renamed' : QtGui.QBrush(QtGui.QColor(160, 32, 240)), # purple 'renamed and modified' : QtGui.QBrush(QtGui.QColor(160, 32, 240)), } def set_layout(self, type=None, show_files=None): if type is not None: self.current_layout = type if show_files is not None: self.show_files = show_files self.file_view.setParent(None) if self.current_layout == 1: self.splitter.setOrientation(QtCore.Qt.Vertical) self.splitter1.setOrientation(QtCore.Qt.Horizontal) if self.show_files: self.splitter1.insertWidget(1, self.file_view) elif self.current_layout == 2: self.splitter.setOrientation(QtCore.Qt.Horizontal) self.splitter1.setOrientation(QtCore.Qt.Vertical) if self.show_files: self.splitter1.insertWidget(1, self.file_view) else: self.splitter.setOrientation(QtCore.Qt.Vertical) self.splitter2.setOrientation(QtCore.Qt.Horizontal) if self.show_files: self.splitter2.insertWidget(0, self.file_view) if type is not None: # Reset splitter pos after changing type. for sp in (self.splitter, self.splitter1, self.splitter2): if sp.count() != 2: continue size = sum(sp.sizes()) if size > 0: size1 = int(size * 0.3) sp.setSizes((size1, size - size1)) if show_files == False: # When filelist is hidden, select all files always. self.select_all_files() def on_tabwidth_changed(self, width): get_set_tab_width_chars(self.tree.branch, tab_width_chars=width) self._on_tabwidth_changed(width) def _on_tabwidth_changed(self, width): pixels = get_tab_width_pixels(tab_width_chars=width) self.diffviews[0].setTabStopWidths((pixels, pixels)) self.diffviews[1].setTabStopWidth(pixels) def refresh(self): self.loaded = False self.clear() tree = WorkingTree.open_containing(self.directory)[0] with tree.lock_read(): manager = tree.get_shelf_manager() shelves = manager.active_shelves() for shelf_id in reversed(shelves): message = manager.get_metadata(shelf_id).get('message') item = QtWidgets.QTreeWidgetItem() item.setText(0, str(shelf_id)) item.setText(1, message or gettext('')) item.setIcon(0, get_icon("folder", 16)) item.shelf_id = shelf_id self.shelve_view.addTopLevelItem(item) self.tree = tree self.manager = manager branch = tree.branch if self.initial_encoding is None: encoding = get_set_encoding(None, branch) self.initial_encoding = encoding # save real encoding for the next time self.encoding_selector.encoding = encoding # set encoding selector tabwidth = get_set_tab_width_chars(branch) self.tabwidth_selector.setTabWidth(tabwidth) self._on_tabwidth_changed(tabwidth) self.update() self.loaded = True def update(self): for view in (self.shelve_view.viewport(), self.file_view.viewport()) + self.diffviews: view.update() def clear(self): self.shelve_view.clear() self.manager = None def show_changes(self, shelf_id): shelf_file = self.manager.read_shelf(shelf_id) with ExitStack() as es: es.callback(shelf_file.close) records = Unshelver.iter_records(shelf_file) revid = Unshelver.parse_metadata(records)[b'revision_id'] try: base_tree = self.tree.revision_tree(revid) except NoSuchRevisionInTree: base_tree = self.tree.branch.repository.revision_tree(revid) preview = base_tree.preview_transform() es.callback(preview.finalize) preview.deserialize(records) tabwidth = get_tab_width_pixels(self.tree.branch) self.diffviews[0].setTabStopWidths((tabwidth, tabwidth)) self.diffviews[1].setTabStopWidth(tabwidth) self.load_diff(preview.get_preview_tree(), base_tree) def load_diff(self, tree, base_tree): self.file_view.clear() for di in DiffItem.iter_items((base_tree, tree), lock_trees=False): di.load() old_path, new_path = di.paths if di.versioned == (True, False): text = old_path elif di.versioned == (False, True): text = new_path elif di.paths[0] != di.paths[1]: text = '%s => %s' % (old_path, new_path) else: text = old_path item = QtWidgets.QTreeWidgetItem() item.setText(0, text) item.setText(1, gettext(di.status)) if (di.kind[1] or di.kind[0]) == 'directory': item.setIcon(0, get_icon("folder", 16)) else: item.setIcon(0, get_icon("file", 16)) item.diffitem = di brush = self.brushes.get(di.status) if brush: item.setForeground(0, brush) item.setForeground(1, brush) self.file_view.addTopLevelItem(item) @lazy_call(100, per_instance=True) @runs_in_loading_queue def _show_selected_diff(self): if sip.isdeleted(self): return self._interrupt_switch = False try: refresh = self._need_refresh self._need_refresh = False diffs = [x.diffitem for x in self.file_view.selectedItems()] diffs.sort(key=lambda x:x.paths[0] or x.paths[1]) cur_len = len(self.current_diffs) if not refresh and cur_len <= len(diffs) and self.current_diffs == diffs[0:cur_len]: appends = diffs[cur_len:] else: for view in self.diffviews: view.set_complete(self.complete) view.clear() self.current_diffs = [] appends = diffs for d in appends: lines = d.lines groups = d.groups(self.complete, self.ignore_whitespace) dates = d.dates[:] # dates will be changed in append_diff ulines = d.get_unicode_lines( (self.encoding_selector.encoding, self.encoding_selector.encoding)) data = [''.join(l) for l in ulines] for view in self.diffviews: view.append_diff(list(d.paths), d.file_id, d.kind, d.status, dates, d.versioned, d.binary, ulines, groups, data, d.properties_changed) self.current_diffs.append(d) if self._interrupt_switch: # Interrupted break finally: self._interrupt_switch = False for view in self.diffviews[0].browsers + (self.diffviews[1],): view.documentChangeFinished.emit() def selected_shelve_changed(self): self._change_current_shelve() @lazy_call(100, per_instance=True) @runs_in_loading_queue def _change_current_shelve(self): if sip.isdeleted(self): return items = self.shelve_view.selectedItems() if len(items) != 1: self.shelf_id = None self.unshelve_button.setEnabled(False) self.file_view.clear() else: self.shelf_id = items[0].shelf_id self.unshelve_button.setEnabled(True) self.show_changes(self.shelf_id) if self.show_files: self.select_first_file() else: self.select_all_files() self.file_view.viewport().update() def selected_files_changed(self): if not self._selecting_all_files: self.show_selected_diff() def select_all_files(self): try: self._selecting_all_files = True for i in range(0, self.file_view.topLevelItemCount()): self.file_view.topLevelItem(i).setSelected(True) finally: self._selecting_all_files = False self.selected_files_changed() def select_first_file(self): if self.file_view.topLevelItemCount() > 0: self.file_view.topLevelItem(0).setSelected(True) def show_selected_diff(self, refresh = False): self._need_refresh = refresh or self._need_refresh self._show_selected_diff() def unidiff_toggled(self, state): index = 1 if state else 0 self.diffviews[index].rewind() if index == 0: self.find_toolbar.set_text_edits(self.diffviews[0].browsers) else: self.find_toolbar.set_text_edits([self.diffviews[1].view]) self.stack.setCurrentIndex(index) def complete_toggled(self, state): self.complete = state self.show_selected_diff(refresh = True) def whitespace_toggled(self, state): self.ignore_whitespace = state self.show_selected_diff(refresh = True) def prompt_bool(self, prompt, warning=False): if warning: func = QtWidgets.QMessageBox.warning else: func = QtWidgets.QMessageBox.question ret = func(self, gettext('Shelve'), gettext(prompt), QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel) return (ret == QtWidgets.QMessageBox.Ok) prompts = { "apply" : N_("Apply changes in shelf[%(id)d], and remove from the shelf"), "dry-run" : N_("Simulate to apply changes in shelf[%(id)d] without changing working tree"), "keep" : N_("Apply changes in shelf[%(id)d], but keep it shelved"), "delete-only" : N_("Remove shelf[%(id)d] without applying"), } def do_unshelve(self, action): if not self.shelf_id: return prompt = gettext(self.prompts[action]) % {"id":self.shelf_id} if action != "dry-run": if not self.prompt_bool(prompt, warning=(action=="delete-only")): return self.unshelve(self.shelf_id, prompt, action) self.refresh() def unshelve(self, id, desc, action): args = ["unshelve", str(id), '--' + action] window = SimpleSubProcessDialog(gettext("Shelve Manager"), desc=gettext(desc), args=args, dir=self.directory, immediate=True, parent=self.window()) def finished(result): if result: self.unshelved.emit(self.shelf_id, action) window.subprocessFinished[bool].connect(finished) window.exec_() self.refresh() def encoding_changed(self, encoding): self.show_selected_diff(refresh = True) def eventFilter(self, object, event): if event.type() == QtCore.QEvent.FocusIn: if object in self.diffviews[0].browsers: self.find_toolbar.set_text_edit(object) return ToolbarPanel.eventFilter(self, object, event) def load_settings(self): config = get_qbrz_config() layout = config.get_option("shelvelist_layout") if layout not in ("2", "3"): layout = "1" self.current_layout = int(layout) self.show_files = not not config.get_option_as_bool("shelvelist_show_filelist") def save_settings(self): config = get_qbrz_config() config.set_option("shelvelist_layout", str(self.current_layout)) config.set_option("shelvelist_show_filelist", str(self.show_files)) config.save() def hideEvent(self, event): self.save_settings() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/widgets/splitters.py0000644000000000000000000000355314556556456015467 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2011 QBzr Developers # # 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 PyQt5 import QtCore from breezy.plugins.qbrz.lib.util import get_qbrz_config class Splitters(object): """Save and restore splitter state.""" def __init__(self, prefix): self.prefix = prefix self.splitters = [] def add(self, name, splitter): self.splitters.append((name, splitter)) def restore_state(self): config = get_qbrz_config() for name, splitter in self.splitters: data = config.get_option('%s_%s' % (self.prefix, name)) if isinstance(data, str): # Tends to look like "b'...'" - yes, a string with b' in it data = bytes(data.lstrip("b'").rstrip("'"), 'utf8') if data: splitter.restoreState(QtCore.QByteArray.fromBase64(data)) def save_state(self): config = get_qbrz_config() for name, splitter in self.splitters: value = splitter.saveState().toBase64().data() config.set_option('%s_%s' % (self.prefix, name), value) config.save() ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/widgets/tab_width_selector.py0000644000000000000000000000637514556556456017310 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # # 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 PyQt5 import QtCore, QtGui, QtWidgets # Range of tab widths to display by default on the menu (if others are # specified in either bazaar.conf or branch.conf they'll be added after # a separator). MIN_TAB_WIDTH = 1 MAX_TAB_WIDTH = 12 class TabWidthMenuSelector(QtWidgets.QMenu): """Menu to control tab width.""" def __init__(self, initial_tab_width=None, label_text=None, onChanged=None, *args): """Create tab width menu. @param label_text: text for label. @param onChanged: callback to processing tab width change. """ QtWidgets.QMenu.__init__(self, *args) self.onChanged = onChanged if onChanged is None: self.onChanged = lambda settabwidth: None self.setTitle(label_text) self.action_group = QtWidgets.QActionGroup(self) self.tabwidth_actions = {} for tabwidth in range(MIN_TAB_WIDTH, MAX_TAB_WIDTH+1): action = QtWidgets.QAction(str(tabwidth), self.action_group) action.setCheckable(True) action.setData(tabwidth) self.addAction(action) self.tabwidth_actions[tabwidth] = action self._tabwidth = None self._has_separator = False # RJLRJL changed triggered to _triggered self.triggered[QtWidgets.QAction].connect(self._triggered) if initial_tab_width is not None: self.setTabWidth(initial_tab_width) self._triggered(self.tabwidth_actions[initial_tab_width]) def _triggered(self, action): tw = action.data() if tw != self._tabwidth: self._tabwidth = tw self.onChanged(tw) def setTabWidth(self, width): if width not in self.tabwidth_actions: action = QtWidgets.QAction(str(width), self.action_group) action.setCheckable(True) action.setData(width) # Find the next highest tab width currently in the menu for tw in sorted(self.tabwidth_actions.keys()): if tw > width: self.insertAction(action, self.tabwidth_actions[tw]) break else: # Not found if not self._has_separator: self.addSeparator() self._has_separator = True self.addAction(action) self.tabwidth_actions[width] = action self.tabwidth_actions[width].setChecked(True) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/widgets/texteditaccessory.py0000644000000000000000000002427314556556456017206 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2011 QBzr Developers # # 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 PyQt5 import QtCore, QtGui, QtWidgets GBAR_LEFT = 1 GBAR_RIGHT = 2 class _Entry(object): """ Represent each group of guide bar. :key: string key to identify this group :color: color or marker :data: marker positions, list of tuple (block index, num of blocks) :index: index of the column to render this entry. * Two or more groups can be rendered on same columns. * If index == -1, the group is renderd on all columns. """ __slots__ = ['key', 'color', 'data', 'index'] def __init__(self, key, color, index=0): self.key = key self.color = color self.data = [] self.index = index class PlainTextEditHelper(QtCore.QObject): """ Helper class to encapsulate gap between QPlainTextEdit and QTextEdit """ updateRequest = QtCore.pyqtSignal() def __init__(self, edit): QtCore.QObject.__init__(self) if not isinstance(edit, QtWidgets.QPlainTextEdit): raise ValueError('edit must be QPlainTextEdit') self.edit = edit edit.updateRequest[QtCore.QRect, int].connect(self.onUpdateRequest) def onUpdateRequest(self, rect, dy): self.updateRequest.emit() def center_block(self, block): """ scroll textarea as specified block locates to center NOTE: This code is based on Qt source code (qplaintextedit.cpp) """ edit = self.edit height = edit.viewport().rect().height() / 2 h = self.edit.blockBoundingRect(block).center().y() def iter_visible_block_backward(b): while True: b = b.previous() if not b.isValid(): return if b.isVisible(): yield b for block in iter_visible_block_backward(block): h += edit.blockBoundingRect(block).height() if height < h: break edit.verticalScrollBar().setValue(block.firstLineNumber()) class TextEditHelper(QtCore.QObject): """ Helper class to encapsulate gap between QPlainTextEdit and QTextEdit """ updateRequest = QtCore.pyqtSignal() def __init__(self, edit): QtCore.QObject.__init__(self) if not isinstance(edit, QtWidgets.QTextEdit): raise ValueError('edit must be QTextEdit') self.edit = edit edit.verticalScrollBar().valueChanged[int].connect(self.onVerticalScroll) def onVerticalScroll(self, value): self.updateRequest.emit() def center_block(self, block): """ scroll textarea as specified block locates to center """ y = block.layout().position().y() vscroll = self.edit.verticalScrollBar() vscroll.setValue(int(y - vscroll.pageStep() / 2)) def get_edit_helper(edit): if isinstance(edit, QtWidgets.QPlainTextEdit): return PlainTextEditHelper(edit) if isinstance(edit, QtWidgets.QTextEdit): return TextEditHelper(edit) raise ValueError("edit is unsupported type.") class GuideBar(QtWidgets.QWidget): """ Vertical bar attached to TextEdit. This shows that where changed or highlighted lines are. Guide bar can have multiple columns. """ def __init__(self, edit, base_width=10, parent=None): """ :edit: target widget, must be QPlainTextEdit or QTextEdit :base_width: width of each column. """ QtWidgets.QWidget.__init__(self, parent) self.base_width = base_width self.edit = edit self._helper = get_edit_helper(edit) self.block_count = 0 edit.documentChangeFinished.connect(self.reset_gui) edit.verticalScrollBar().rangeChanged[int, int].connect(self.vscroll_rangeChanged) self._helper.updateRequest.connect(self.update) self.entries = {} self.vscroll_visible = None def add_entry(self, key, color, index=0): """ Add marker group """ entry = _Entry(key, color, index) self.entries[key] = entry def vscroll_rangeChanged(self, min_scroll, max_scroll): vscroll_visible = (min_scroll < max_scroll) if self.vscroll_visible != vscroll_visible: self.vscroll_visible = vscroll_visible self.reset_gui() self.update() def reset_gui(self): """ Determine show or hide, and num of columns. """ # Hide when vertical scrollbar is not shown. if not self.vscroll_visible: self.setVisible(False) return valid_entries = [e for e in self.entries.values() if e.data] if not valid_entries: self.setVisible(False) return self.setVisible(True) self.repeats = len(set([e.index for e in valid_entries if e.index >= 0])) if self.repeats == 0: self.repeats = 1 self.setFixedWidth(self.repeats * self.base_width + 4) self.block_count = self.edit.document().blockCount() self.update() def update_data(self, **data): """ Update each marker positions. :arg_name: marker key :value: list of marker positions. Each position is tuple of (block index, num of blocks). """ for key, value in data.items(): self.entries[key].data[:] = value self.reset_gui() def get_visible_block_range(self): """ Return tuple of (index of first visible block, num of visible block) """ pos = QtCore.QPoint(0, 1) block = self.edit.cursorForPosition(pos).block() first_visible_block = block.blockNumber() y = self.edit.viewport().height() pos = QtCore.QPoint(0, y) block = self.edit.cursorForPosition(pos).block() if block.isValid(): visible_blocks = block.blockNumber() - first_visible_block + 1 else: visible_blocks = self.block_count - first_visible_block + 1 return first_visible_block, visible_blocks def paintEvent(self, event): QtWidgets.QWidget.paintEvent(self, event) painter = QtGui.QPainter(self) painter.fillRect(event.rect(), QtCore.Qt.white) if self.block_count == 0: return block_height = float(self.height()) / self.block_count def get_top_and_height(index, num): y, height = index * block_height, num * block_height # Inflate height if it is smaller than 1. if height < 1: return y - (1-height)/2, 1 else: return y, height # Draw entries x_origin = 2 index = -1 prev_index = -1 for e in sorted(iter(self.entries.values()), key=lambda x:x.index if x.index >= 0 else 999): if not e.data: continue if e.index < 0: x, width = 0, self.width() else: if e.index != prev_index: index += 1 prev_index = e.index x, width = x_origin + index * self.base_width, self.base_width for block_index, block_num in e.data: y, height = get_top_and_height(block_index, block_num) painter.fillRect(QtCore.QRectF(x, y, width, height), e.color) # Draw scroll indicator. x, width = 0, self.width() first_block, visible_blocks = self.get_visible_block_range() y, height = get_top_and_height(first_block, visible_blocks) painter.fillRect(QtCore.QRectF(x, y, width, height), QtGui.QColor(0, 0, 0, 24)) def mousePressEvent(self, event): QtWidgets.QWidget.mousePressEvent(self, event) if event.button() == QtCore.Qt.LeftButton: self.scroll_to_pos(event.y()) def mouseMoveEvent(self, event): QtWidgets.QWidget.mouseMoveEvent(self, event) self.scroll_to_pos(event.y()) def scroll_to_pos(self, y): block_no = int(float(y) / self.height() * self.block_count) block = self.edit.document().findBlockByNumber(block_no) if not block.isValid(): return self._helper.center_block(block) class GuideBarPanel(QtWidgets.QWidget): """ Composite widget of TextEdit and GuideBar """ def __init__(self, edit, base_width=10, align=GBAR_RIGHT, parent=None): QtWidgets.QWidget.__init__(self, parent) hbox = QtWidgets.QHBoxLayout(self) hbox.setSpacing(0) hbox.setContentsMargins(0, 0, 0, 0) self.bar = GuideBar(edit, base_width=base_width, parent=parent) self.edit = edit if align == GBAR_RIGHT: hbox.addWidget(self.edit) hbox.addWidget(self.bar) else: hbox.addWidget(self.bar) hbox.addWidget(self.edit) def add_entry(self, key, color, index=0): self.bar.add_entry(key, color, index) def reset_gui(self): self.bar.reset_gui() def update_data(self, **data): return self.bar.update_data(**data) def setup_guidebar_for_find(guidebar, find_toolbar, index=0): """ Make guidebar enable to show positions that highlighted by FindToolBar """ def on_highlight_changed(): if guidebar.edit in find_toolbar.text_edits: guidebar.update_data(find=[(n, 1) for n in guidebar.edit.highlight_lines]) guidebar.add_entry('find', QtGui.QColor(255, 196, 0), index) # Gold find_toolbar.highlightChanged.connect(on_highlight_changed) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/lib/widgets/toolbars.py0000644000000000000000000003025214556556456015257 0ustar00# -*- coding: utf-8 -*- # # QBrz - Qt frontend to Breezy commands # Copyright (C) 2011 QBzr Developers # # 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 breezy.plugins.qbrz.lib.util import ( get_icon, show_shortcut_hint ) from PyQt5 import QtCore, QtGui, QtWidgets from breezy.plugins.qbrz.lib.i18n import gettext, N_ from breezy.plugins.qbrz.lib.decorators import lazy_call from PyQt5 import sip # def create_toolbar_button(text, parent=None, icon_name=None, icon_size=22, # enabled=True, checkable=False, checked=False, shortcut=None, onclick=None): # if icon_name: # button = QtWidgets.QAction(get_icon(icon_name, size=icon_size), gettext(text), parent) # else: # button = QtWidgets.QAction(gettext(text), parent) # if checkable: # button.setCheckable(True) # button.setChecked(checked) # signal = "toggled(bool)" # else: # signal = "triggered()" # if not enabled: # button.setEnabled(False) # if shortcut: # button.setShortcut(shortcut) # show_shortcut_hint(button) # if onclick: # button.signal.connect(onclick) # return button def create_toolbar_button(text, parent=None, icon_name=None, icon_size=22, enabled=True, checkable=False, checked=False, shortcut=None, onclick=None): # RJLRJL modified to work with PyQt5 if icon_name: button = QtWidgets.QAction(get_icon(icon_name, size=icon_size), gettext(text), parent) else: button = QtWidgets.QAction(gettext(text), parent) if checkable: button.setCheckable(True) button.setChecked(checked) if not enabled: button.setEnabled(False) if shortcut: button.setShortcut(shortcut) show_shortcut_hint(button) if onclick: if checkable: button.toggled[bool].connect(onclick) else: button.triggered.connect(onclick) return button def add_toolbar_button(toolbar, text, parent, icon_name=None, icon_size=22, enabled=True, checkable=False, checked=False, shortcut=None, onclick=None): button = create_toolbar_button(text, parent, icon_name, icon_size, enabled, checkable, checked, shortcut, onclick) toolbar.addAction(button) return button class FindToolbar(QtWidgets.QToolBar): highlightChanged = QtCore.pyqtSignal() def __init__(self, window, text_edit, show_action): QtWidgets.QToolBar.__init__(self, gettext("Find"), window) self.text_edits = [] if isinstance(text_edit, list) or isinstance(text_edit, tuple): self.set_text_edits(text_edit) else: self.set_text_edits([text_edit]) self.show_action = show_action self.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) self.setMovable (False) find_label = QtWidgets.QLabel(gettext("Find: "), self) self.addWidget(find_label) self.find_text = QtWidgets.QLineEdit(self) self.addWidget(self.find_text) find_label.setBuddy(self.find_text) self.found_palette = QtGui.QPalette() self.not_found_palette = QtGui.QPalette() self.not_found_palette.setColor(QtGui.QPalette.Active, QtGui.QPalette.Base, QtCore.Qt.red) self.not_found_palette.setColor(QtGui.QPalette.Active, QtGui.QPalette.Text, QtCore.Qt.white) prev = self.addAction(get_icon("go-previous"), gettext("Previous")) prev.setShortcut(QtGui.QKeySequence.FindPrevious) show_shortcut_hint(prev) next = self.addAction(get_icon("go-next"), gettext("Next")) next.setShortcut(QtGui.QKeySequence.FindNext) show_shortcut_hint(next) self.case_sensitive = QtWidgets.QCheckBox(gettext("Case sensitive"), self) self.addWidget(self.case_sensitive) self.whole_words = QtWidgets.QCheckBox(gettext("Whole words"), self) self.addWidget(self.whole_words) close_find = QtWidgets.QAction(self) close_find.setIcon(self.style().standardIcon(QtWidgets.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.show_action.toggled [bool].connect(self.show_action_toggle) close_find.triggered[bool].connect(self.close_triggered) self.find_text.textChanged['QString'].connect(self.find_text_changed) next.triggered[bool].connect(self.find_next) prev.triggered[bool].connect(self.find_prev) self.case_sensitive.stateChanged[int].connect(self.find_text_changed) self.whole_words.stateChanged[int].connect(self.find_text_changed) self.find_text.returnPressed.connect(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() self.highlight() 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): 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) # Make find_text background red like Firefox if len(text) > 0: self.find_text.setPalette(self.not_found_palette) else: self.find_text.setPalette(self.found_palette) else: self.text_edit.setTextCursor(cursor) self.find_text.setPalette(self.found_palette) def set_text_edits(self, text_edits): if len(text_edits) == 0: raise ValueError('text_edits is empty.') for t in self.text_edits: t.documentChangeFinished.disconnect(self.highlight) t.setExtraSelections([]) for t in text_edits: t.highlight_lines = [] t.documentChangeFinished.connect(self.highlight) self.text_edits = text_edits self.text_edit = text_edits[0] self.highlight() def set_text_edit(self, text_edit): if text_edit in self.text_edits: self.text_edit = text_edit else: raise ValueError('Invalid text_edit instance.') @lazy_call(200, per_instance=True) def highlight(self): """Highlight matched words in the text edits.""" if sip.isdeleted(self): return text = self.find_text.text() flags = self.find_get_flags() for text_edit in self.text_edits: selections = [] highlight_lines = [] if text: find = text_edit.document().find pos = 0 fmt = QtGui.QTextCharFormat() fmt.setBackground(QtCore.Qt.yellow) while True: cursor = find(text, pos, flags) if cursor.isNull(): break sel = QtWidgets.QTextEdit.ExtraSelection() sel.cursor, sel.format = cursor, fmt selections.append(sel) highlight_lines.append(cursor.blockNumber()) pos = cursor.selectionEnd() text_edit.setExtraSelections(selections) text_edit.highlight_lines = highlight_lines self.highlightChanged.emit() class ToolbarPanel(QtWidgets.QWidget): def __init__(self, slender=True, icon_size=16, parent=None): QtWidgets.QWidget.__init__(self, parent) vbox = QtWidgets.QVBoxLayout(self) vbox.setSpacing(0) vbox.setContentsMargins(0, 0, 0, 0) toolbar = QtWidgets.QToolBar(self) toolbar.setMovable(False) toolbar.setIconSize(QtCore.QSize(icon_size,icon_size)) self.icon_size=icon_size if slender: self.setStyleSheet('QToolBar { margin:1px; padding:0px; border:none; }') toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) vbox.addWidget(toolbar) self.vbox = vbox self.toolbar = toolbar def add_toolbar_button(self, text, icon_name=None, icon_size=0, enabled=True, checkable=False, checked=False, shortcut=None, onclick=None, menu=None): button = create_toolbar_button(text, self, icon_name=icon_name, icon_size=icon_size or self.icon_size, enabled=enabled, checkable=checkable, checked=checked, shortcut=shortcut, onclick=onclick) if menu is not None: button.setMenu(menu) self.toolbar.addAction(button) return button def add_toolbar_menu(self, text, menu, icon_name=None, icon_size=0, enabled=True, shortcut=None): button = self.add_toolbar_button(text, icon_name=icon_name, icon_size=icon_size or self.icon_size, enabled=enabled, menu=menu) widget = self.toolbar.widgetForAction(button) widget.setPopupMode(QtWidgets.QToolButton.InstantPopup) if shortcut: widget.setShortcut(shortcut) show_shortcut_hint(widget) return button def create_button(self, text, icon_name=None, icon_size=0, enabled=True, checkable=False, checked=False, shortcut=None, onclick=None): return create_toolbar_button(text, self, icon_name=icon_name, icon_size=icon_size or self.icon_size, enabled=enabled, checkable=checkable, checked=checked, shortcut=shortcut, onclick=onclick) def add_separator(self): self.toolbar.addSeparator() def add_widget(self, widget): self.vbox.addWidget(widget) def add_layout(self, layout): self.vbox.addLayout(layout) class LayoutSelector(QtWidgets.QMenu): """Menu to select layout.""" def __init__(self, num, onchanged, parent=None, initial_no=1): QtWidgets.QMenu.__init__(self, gettext('Layout'), parent) self.current = initial_no def selected(no): self.current = initial_no onchanged(no) def get_handler(no): return lambda:selected(no) group = QtWidgets.QActionGroup(self) self.buttons = [] for i in range(1, num + 1): btn = create_toolbar_button(gettext("Layout %d") % i, self, checkable=True, shortcut="Ctrl+%d" % i, checked=(i == initial_no), onclick=get_handler(i)) group.addAction(btn) self.addAction(btn) self.buttons.append(btn) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/ar/0000755000000000000000000000000014556556456012503 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/cs/0000755000000000000000000000000014556556456012506 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/da/0000755000000000000000000000000014556556456012465 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/de/0000755000000000000000000000000014556556456012471 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/en/0000755000000000000000000000000014556556456012503 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/en_GB/0000755000000000000000000000000014556556456013053 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/es/0000755000000000000000000000000014556556456012510 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/et/0000755000000000000000000000000014556556456012511 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/fr/0000755000000000000000000000000014556556456012510 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/gl/0000755000000000000000000000000014556556456012503 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/he/0000755000000000000000000000000014556556456012475 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/hu/0000755000000000000000000000000014556556456012515 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/it/0000755000000000000000000000000014556556456012515 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/ja/0000755000000000000000000000000014556556456012473 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/nl/0000755000000000000000000000000014556556456012512 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/pl/0000755000000000000000000000000014556556456012514 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/pt_BR/0000755000000000000000000000000014556556456013107 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/ru/0000755000000000000000000000000014556556456012527 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/sk/0000755000000000000000000000000014556556456012516 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/sl/0000755000000000000000000000000014556556456012517 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/sr/0000755000000000000000000000000014556556456012525 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/sv/0000755000000000000000000000000014556556456012531 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/th/0000755000000000000000000000000014556556456012514 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/tr/0000755000000000000000000000000014556556456012526 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/uk/0000755000000000000000000000000014556556456012520 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/ar/LC_MESSAGES/0000755000000000000000000000000014556556456014270 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/ar/LC_MESSAGES/qbrz.mo0000644000000000000000000000157014556556456015606 0ustar00\  )) 0= FR aoAddAuthorBrowseEncoding:Loading...Location:ShowProject-Id-Version: qbzr Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2010-01-16 13:36+0000 Last-Translator: Ali Sabil Language-Team: Arabic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) أضفالمؤلفتصفحترميز:تحميل ...الموقع:اظهر././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/cs/LC_MESSAGES/0000755000000000000000000000000014556556456014273 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/cs/LC_MESSAGES/qbrz.mo0000644000000000000000000000267014556556456015613 0ustar00l $ ) 3 >H `lq      " BLTqv   &View OptionsAddAnnotateAuthorBranch location:BrowseEncodingFindGoto LineLoading...Location:Nothing selected to addRevision %sShowShow ignored filesStatusUnversioned FilesViewView OptionsWord WrapProject-Id-Version: qbzr Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2012-10-08 21:14+0000 Last-Translator: Zbyněk Schwarz Language-Team: Czech MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) &Možnosti zobrazeníPřidatKomentovatAutorUmístění větve:ProcházetKódováníNajítJít na řádekNačítání...Umístění:NIc není vybráno k řpidáníRevize %sUkázatZobrazit ignorované souboryStavSoubory bez verzeZobrazitMožnosti zobrazeníZalamování slov././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/da/LC_MESSAGES/0000755000000000000000000000000014556556456014252 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/da/LC_MESSAGES/qbrz.mo0000644000000000000000000002476614556556456015604 0ustar00% `a r|     *9Telsy    $5D Sa r      '5<DLa pz      ,17? S_ u %3 -6*=hw)     "7LRXg p{   "!' /;@EM#Sw~      !9Ri     .2KPV Z dr(  - 3?NV h v       $, 1 <HNen s}     & 4 ? F P h v |       !!-!>! B!N! W!c!k!t!|!!!!! ! ! ! !!! "" " ," 7"A"F" N"Y" b"o"w" "" """"""" "" #"#&(#,O#|######7#$%$6$(;$ d$o$$$$$$$$ $ $ $$$% %% % +% 8% D% O%[%_% g% r% }% %%%%!%%% & &&&$&,&$1&V&\&l& r& && & && & &&&& '.'E'\'o't''' '' '' '''''' ((,(4(=(A(J(Y(q(y(((0( (( ( ( (( ))*)=)F)X)g)m) q){)))) )))))))^4Rr?{2tc)uS#-/,ie}qdaT@LU.n W+*]"s gY\`E3ONmF10(C~ x|5<ovyPH:M9Dl b6hJpz [ f$_QXBkZA>!&K%w8I=7jGV;'%d file%d files&About...&Action:&Add&Add Bookmark...&Author:&Bookmarks&Browse...&Cancel&Close&Command:&Configure...&Diff&Edit Bookmark...&Editor:&File&Filter&Help&Help...&Location:&Mark as moved&Mark as moved and renamed&Mark as renamed&Merge&Name:&Open&Push&Quit&Refresh&Remove Bookmark...&Revert&Revision:&Search:&Select...&Show hidden commands&Tag name:&To:&User Interface&View&View file&Working directory:(bzr-config-dir)(bzr-lib-path)(bzr-log-file)(bzr-version)(no description)(no message)(python-file)(python-lib-dir)(python-version)...AbbreviationAborted!Aborting...About QBzrActionAddAdd BookmarkAddress:AliasAliasesAll conflicts resolved.Archive type:AuthorAuthor:AuthorsBazaar ConfigurationBazaar LibraryBookmarksBrowseBrowse...Bug TrackersBug:Bugs:BugsChangedChangesCommandCommitter:CompleteComputerConfigurationConflictConflictsCreate a new shared repositoryCreate new tagDateDate:DefaultDelete existing tagDescriptionDescription of formatDescription:DirectoryDo not save backups of reverted filesDo you really want to remove the selected bookmark?Do you want to continue anyway?E-&mail:E-mail &client:Edit BookmarkEdit tagEditorEncoding "%s" is invalid or not supported.Enter PasswordEnter UsernameErrorError while running bzr. (error code: %d)ExportFailed to start bzr.Failed!FileFile NameFilename:Finished!GeneralHelpIgnoredInfoInitializeInsert &directory...Insert &filenames...KMailKind:Last modified:Library:Loading...Local DirectoryLocation:LocationsLogLog File:MergeMessageMessage:MessagesMove existing tagNameNo changes found.No help can be found for %sOptionsPath:PluginsProperties:PullPushRe&nameReadyRemember this location as a defaultRemoveRemove BookmarkRepositoryRepository Format:RevertRevisionRevision %sRevision IDsRevision NumbersRevision:Revisions:Run bzr commandSelect / deselect allSelect Source DirectorySelect changes to revertSelect files to insertSelect path to insertSelect working directorySendSettings:ShowShow &logShow Log...Show ignored filesSizeSpell check &language:Starting...StatusStatus:SummarySwitchSystem InformationTagTag "%s" does not existsTagsTags:URLUnchangedUpdate sourceUse existing directoryVersionVersion:ViewView binary fileView changes in files selected to revertView directoryView fileView image fileView symlinkView text fileWrong encodingaddedadded filesadded, missingbug #%scontents conflictdeleted filesdirectoryfileignoredmissingmodifiedmodified filesmovedpath conflictremovedrenamedrenamed and modifiedrenamed filestext conflictx-bitProject-Id-Version: qbzr Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2009-12-06 12:51+0000 Last-Translator: nanker Language-Team: Danish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) %d fil%d filer&Om...H&andling:&Tilføj&Tilføj bogmærke...&Forfatter:&Bogmærker&Gennemse...&Afbryd&Luk&Kommando:&Indstil...&DiffR&ediger bogmærker...&Editor:&Fil&Filtrér&Hjælp&Hjælp...P&lacering:&Markér som flyttet&Markér som flyttet og omdøbt&Markér som omdøbt&Flet&Navn:&Åben&Skub&Afslut&OpdaterFje&rn bogmærker...&Tilbageført&Revision:&Søg:&Vælg...&Vis skjulte kommandoer&Mærke navn:&Til:B&ruger interface&Vis&Vis fil&Arbejdsmappe:(bzr-opsæt-map)(bzr-lib-sti)(bzr-log-fil)(bzr-version)(ingen beskrivelse)(ingen meddelelser)(python-fil)(python-bibl-map)(python-version)...ForkortelseAfbrudt!Afbryder...Om QBzrHandlingTilføjTilføj bogmærkeAdresse:AliasAliasserAlle konflikter løst.Arkiv type:ForfatterForfatter:ForfattereBazaar opsætningBazaar BibliotekBogmærkerGennemseGennemse...Bug finderFejlFejlFejlÆndretÆndringerKommandoBidragsyder:FærdigComputerOpsætningKonfliktKonflikterSkab et nyt delt arkivOpret nyt mærkeDatoDato:StandardSlet eksisterede mærkeBeskrivelseBeskrivelse af formatBeskrivelse:MappeGem ikke kopier af tilbageførte filerVil du virkelig fjerne det valgte bogmærke?Vil du fortsætte alligevel?E-&mail:E-mail &klient:Rediger bogmærkeRedigér mærkeEditorKodning "%s" er fejlbehæftet eller ikke understøttet.Angiv adgangskodeAngiv brugernavnFejlFejl ved kørsel af bzr. (fejl kode: %d)EksportérKunne ikke starte bzr.Fejlede!FilFilnavnFilnavn:Færdig!GenereltHjælpIgnoreretInformationInitialiserIndsæt &mappe...Indsæt &filnavne...KMailArt:Sidst ændret:Bibliotek:Indlæser...Lokal mappePlacering:LokaliteterLogLogfil:SammenfletMeddelelseMeddelelse:MeddelelserFlyt eksisterende mærkeNavnIngen ændringer fundet.Ingen hjælp fundet for %sValgmulighederSti:UdvidelserEgenskaber:TrækSkub&OmdøbKlarHusk denne placering som en standardFjernFjern bogmærkeArkivArkiv format:TilbageførRevisionRevision %sRevisions IDsRevisions numreRevision:Revision:Kør bzr kommandoVælg / fravælg alleVælg kilde mappeVælg ændringer at tilbageføreVælg fil at indsætteVælg sti at indsætteVælg arbejdsmappeSendIndstillinger:VisVis &logVis log...Vis afviste filerStørrelseStavekontro&l sprog:Starter...StatusStatus:OversigtSkiftSystem informationMærkeMærke "%s" eksisterer ikkeMærkerMærker:URLUændretOpdatér kildeBrug eksisterende mappeVersionVersion:VisVis binær filVis ændringer i filer der er valgt tilbageførtVis mappeVis filVis billedfilVis symlinkVis tekstfilForkert kodningtilføjettilføjede filertilføjet, manglerfejl #%sindholds konfliktslettede filermappefilignoreretmanglerændretændrede filerflyttetsti konfliktfjernetomdøbtomdøbt og ændretomdøbte filertekst konfliktx-bit././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/de/LC_MESSAGES/0000755000000000000000000000000014556556456014256 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/de/LC_MESSAGES/qbrz.mo0000644000000000000000000010116314556556456015573 0ustar00d(6() ))3)<)A)R)j)s) z)) )))) )) ) ) )))) **$***2* 8*E*L*R*[*o* ** * ******+++#+=+C+I+R+f+m+ u++ ++ +++++ + +,,',6, E,S, d, q,,,,,,, -c-wK. .. . ... .////7/ @/WN//// /#/?/8.0g0|00 0"00 0 000O0D1 L1W1 ^1 h1 u11 1 111111 1?182H2Z2 m2z2 22"2 222 22 22323Q3 c33363354<4P4U4[4c4j4 ~44 444 4%43425/Q55555 5555*5 6,6K6Z6Fi66k657);7(e7 77 7777-78$8,8,18 ^8 h8r8w88 88888 8 888899 9$9 A9K9^9q9999 999[9@:F:K:Q:#`:: :::::: ::T ;6a; ; ;; ; ;;;; <%$<J< P<6^<3<<<< <?=D=_=q=v={= ====<= >(>"=>`>}>>> >8>:???G?&W?~?????? ?????@&@+@>@W@_@e@$@&@#@@@A A&A9A=AXA_A"fA AAAA AA B BB *B 4B?BSBhB}B B BBBB C C7CPCiCCCC C(CCC8-DAfD DDDDDDD E EE 2E>ETEmEE EE5EE FF5FgTFF FFFFFG GG 1G =GKGGG:GG<G(H9H>HDHHH# IM1I I2I0III I JJJ;J CJ QJ ^JjJ|J"J JJJ J-JK?KNK7bK KKKKKK KK(L(+LTL cLmL}L LL L L LLL%L5 M@VMsM NN$,NQNmNNNN NNNN N NO O O $O1O6O_P_/d_______ __ ` `#` (`<4`;q`B`3`!$a FaTa]amaaaaCaaEbFbYbSpbb{bZc5acDc c cc-c'd;d1Od!d dd6d d dee&e/e%7e]e fepe weeeeee ee.ef!'f#Ifmf f%fffff^fUg [ggglg~gg g gg ggh)h1hc@h4h hh hhii%2iXini$iiiBiE j fj pj {j&jEjj k+k0k5k =r)|rrrrrr<sHLsGsHs&t5tDt\tetyttt ttttu0uMuju~uMu!u vvFvavw $w/w6w>wUw ewpwwwwZwxLxcxExx x xxOqy&yKy 4z6@z<wzzz z zz'z{{0{?{Q{ l{.z{{{){{-|'?|g||<|||}}%}.}6}G}>Y}@}} }}$~ ,~:~ J~ X~ f~r~~.~=~Ss\,#(L&e  ׀ #/ 8DJ R\d u ́߁   ",EX `mjm!}) G,owM']\X5sk<hCj xifOHqI B10L43Hn wk#L%^rVTu?D@$:QlOKW{Dz) 5xdJ|m4R P+S>M:/KN>|F@2~aW87 P+JUYs *C?Z(Nd`(A_ByE6pv9b a"SG3!gf~[b-E#"-[,_R8=e&2;{T0\^uyp}h%`zo ;$eZ6F.=/1Y Irv9 AXi]*'ql7ntcQU.ctVg<&%d conflict auto-resolved.%d conflicts auto-resolved.%d file%d files&About...&Action:&Add&Add Bookmark...&Annotate this revision&Author:&Basic&Bookmarks&Branch&Browse...&Cancel&Change the values&Close&Command:&Commit&Complete&Configure...&Detailed&Diff&Edit&Edit Bookmark...&Editor:&External Diff&File&Filter&Find&Fixed bugs:&From:&Help&Help...&Ignore and proceed&Ignore whitespace changes&Launch...&Layout&Local commit&Location:&Mark as moved&Mark as moved and renamed&Mark as renamed&Merge&Merge conflict&Name:&OK&Open&Options and arguments for command:&Push&Quit&Refresh&Remove Bookmark...&Retry&Revert&Revision:&Search:&Select...&Show hidden commands&Tag name:&To:&Update to this revision&User Interface&View&View Options&View file&Working directory:(bzr-config-dir)(bzr-lib-path)(bzr-log-file)(bzr-version)(no description)(no message)(python-file)(python-lib-dir)(python-version)...<<< Hide Error DetailsQBzr — 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/QBzrA commit will be made directly to the master branch, keeping the local and master branches in sync.A local commit to the branch will be performed. The master branch will not be updated until a non-local commit is made.AbbreviationAborted!Aborting...About QBzrActionAddAdd BookmarkAddress:AliasAliasesAll conflicts resolved.AnnotateArchive type:Are you sure you want to revert this file to the state it was at the selected revision?AuthorAuthor:AuthorsAuto-resolveBase directory for &branch sources:Bazaar 2.4 or later is required for external mergetools supportBazaar 2.4 or newer is required to configure mergetools.Bazaar ConfigurationBazaar LibraryBindBind branchBind new branch to parent locationBind to:BookmarksBound to:BranchBranch location:Branch source (enter a URL or select a local directory with an existing branch)Branch:Branch: %sBrowseBrowse...Bug TrackersBug:Bugs:BugsBuiltin DiffC&ategory:Case sensitiveChange editor is not defined.ChangedChangesCheckout of branch:Children:Click a link for more information about checkouts and branches.Close %s WindowClose ApplicationClose Error DialogClose WindowCommandCommand LineCommitCommit changes into a new revisionCommitter:CompleteComputerConfigurationConflictConflictsCould not locate "bzr" script.Could not locate "bzr.exe".Create Branch before switchingCreate a checkoutCreate a new Bazaar Working TreeCreate a new shared repositoryCreate a new standalone treeCreate a stacked branch referring to the source branchCreate new tagCreate the path up to the branch if it does not existCurrently bound to:DateDate:DefaultDeleteDelete existing tagDescriptionDescription of formatDescription:DestroyDiffDirectoryDo not save backups of reverted filesDo you really want to remove the selected bookmark?Do you really want to revert the selected file(s)?Do you really want to uncommit these revisions?Do you want to continue anyway?Dry runE-&mail:E-mail &client:Edit BookmarkEdit tagEditorEncodingEncoding "%s" is invalid or not supported.Encoding:Ensure all revisions are appended to the logEnter PasswordEnter UsernameEnter the author's name, e.g. John Doe <jdoe@example.com>Enter the commit messageEnter the list of bug IDs in format tag:id separated by a space, e.g. project:123 project:765ErrorError while running bzr. (error code: %d)Error while running merge tool (code %d)EvolutionExportExtensionExternal Diff Apps:External MergeExternal Merge ToolsExternal merge tool %(tool)s is not availableFailed to start bzr.Failed!FileFile %s is not versioned. Operation aborted.File NameFilename:FindFind on active panelFind: Finished!Forget pending mergesFormGeneralGoGoto LineGoto Line: Heavyweight checkout:HelpHelp for commandIdIgnoreIgnore ErrorIgnore all files with this extensionIgnore asIgnore by basenameIgnore by fullnameIgnore whitespaceIgnoredImport old external merge toolInfoInitializeInsert &directory...Insert &filenames...It is not possible to specify different file paths and different branches at the same time.KMailKeepKind:Last modified:Launch an external diff applicationLayoutLayout %dLeft side encodingLeft side tab widthLibrary:Light-weight checkoutLightweight checkout:Loading...Local DirectoryLocal commits are not pushed to the master branch until a normal commit is performedLocal directory where the working tree will be createdLocation:LocationsLogLog File:M&erge tool:MAPI e-mail clientMake a local copy of the branchMark as &resolvedMark conflict &resolvedMaster branch location not specified.MergeMerge PreviewMerge even if the working tree has uncommitted changesMerge uncommitted changes instead of committed onesMessageMessage:MessagesMessages and File text (indexed)Missing the flag: %s. Configure in qconfig under the merge tab.Most recent (tip) revisionMove existing tagMuttNameNextNo actionNo action selectedNo changes found.No changes selected to commitNo changes selected to commit. Do you want to commit anyway?No changes selected to revertNo changes selected.No help can be found for %sNo other revision specified.No working tree exists for "%s"Not a branch "%s"Not a branch: %sNot a fileOperation aborted because target files has been changed.Operation aborted because working tree has pending merges.OptionsOther revision:Overwrite differences between branchesParents:Path:Pending MergesPluginsPlugins installed: %(rows)dPreviousProperties:Pu&llPublic Branch:PullPull a different branchPull most recent changes from:PushPython InterpreterR&evert to this revisionRe&nameReadyRefresh the directory treeRemember these locations as defaultsRemember this as the new parent branchRemember this location as a defaultRemoveRemove BookmarkReport Bazaar ErrorRepositoryRepository Format:RevRev %(rev)s for %(branch)sRev %sRevertRevert %s to revision %s revid:%s.Revert FileRevert to revision %s revid:%s.Revert to this revisionRevid: %(revid)s for %(branch)sRevid: %sRevisionRevision %sRevision IDsRevision NumbersRevision:Revisions:Right side encodingRight side tab widthRoot directory name:Run bzr commandSave file in this revision as...Save file on this revision as...Select / deselect allSelect Source DirectorySelect Target DirectorySelect allSelect branch locationSelect changes to revertSelect editor executableSelect files to insertSelect path to insertSelect working directorySendSet DefaultSet the IDs of bugs fixed by this commitSet the author of this change, if it's different from the committerSet up external_merge app in qconfig under the Merge tabSets the selected merge tool as the default to use in qconflicts.Settings:ShelveShelve ManagerShowShow &annotateShow &differencesShow &differences...Show &logShow &tree...Show Error Details >>>Show Log...Show all &differencesShow all &differences...Show file &differencesShow file &differences...Show filelistShow ignored filesShow inter-group inserts and deletes in green and redShow non-versioned filesSignature:SizeSkip the creation of working trees in this repositorySome of the files selected cannot be recovered if removed. Are you sure you want to remove these files?Spell check &language:Starting...StatusStatus:Submit Branch:SummarySwitchSwitch to branch:System InformationTab &Width:Tab widthTab width in characters option is used in qdiff, qannotate and qcat windowsTagTag "%s" already exists. Do you want to move existing tag?Tag "%s" does not existsTag "%s" does not exists yet. Do you want to create new tag?Tag &revision...TagsTags:The extmerge definition: '%(tool)s' is invalid. Missing the flag: %(flags)s. This must be fixed in qconfig under the Merge tab.This directory is a branch. Please select what you would like to updateThis directory is a checkout of: %sThis directory will be automatically filled in your branch source input fieldThunderbirdToggle between Side by side and Unidiff view modesTurn this branch into a mirror of another branchURLUnbindUnbind branchUnchangedUncommitUncommited Working Tree ChangesUnidiffUnknown FilesUnselect allUnversionedUnversioned FilesUpdateUpdate %s to revision %s revid:%s.Update BranchUpdate CheckoutUpdate a mirror of this branchUpdate sourceUpdate the working tree from the bound branchUpdate to revision %s revid:%s.Update tree %sUpdate working treeUpdate working tree to the latest changes in the branchUse editorUse existing directoryVerify SignaturesVersionVersion:ViewView OptionsView binary fileView changes in files selected to commitView changes in files selected to revertView directoryView fileView image fileView shelved changesView symlinkView text fileWhole wordsWord WrapWorking TreeWorking Tree OptionsWorking Tree for %sWorking tree has uncommitted changes.Working tree is out of date, please run 'bzr update'.Working tree is out of date. To commit, update the working tree.Would you like to import your previously configured external merge tool: %(old_cmdline)s as: %(new_cmdline)sWrong encodingXDG e-mail clientYou should provide a commit message.You should specify tag name[binary file (%d bytes)]\ No newline at end of fileadd fileaddedadded filesadded, missingbug #%scontents conflictdelete filedeleted filesdeleting parentdirectoryduplicateduplicate idfilefixedignoredmissingmissing parentmodifiedmodified filesmodify binarymodify targetmodify textmovednon-directory parentnon-versionedparent looppath conflictremovedrenamerenamedrenamed and modifiedrenamed filessymlinktext conflictx-bitProject-Id-Version: qbzr Report-Msgid-Bugs-To: POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2013-03-16 16:55+0000 Last-Translator: André Bachmann Language-Team: German MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) %d Konflikt automatisch aufgelöst.%d Konflikte automatisch aufgelöst.%d Datei%d Dateien&Über...&Aktion&Hinzufügen&Füge ein Lesezeichen hinzu...&Anmerkung zu dieser Revision&Autor:&Grundlegendes&Lesezeichen&ZweigDurchsuchen...&Abbrechen&Werte ändern&Schließen&Befehl:Übertrage&VollständigKonfigurieren...&Detailliert&Diff&BearbeitenBearbeite Lesezeichen&Editor:&Externes Diff-Tool&Datei&Filtern&SuchenBehobene Fehler:&Von:&Hilfe&Hilfe...&Ignorieren und FortfahrenLeerzeichenänderungen &ignorieren&Starten...&Anordnung&Lokaler Commit&OrtAls verschoben &markierenAls verschoben und umbenannt &markierenAls umbenannt &markieren&Zusammenführen&Verschmelzungskonflikt&Name:&OK&Öffnen&Optionen und Argumente für Befehl:&DrückenBeendenAktualisierenEntferne Lesezeichen&Nochmals versuchen&Zurücksetzen&Revision:&Suchen:&AuswählenVer&steckte Befehle zeigenMarkierungsname:&An:Zu dieser Revision &aktualisierenBenutzeroberfläche&Anzeigen&Optionen anzeigenDatei &anzeigen&Arbeitsordner:(bzr-config-dir)(bzr-lib-path)(bzr-log-file)(bzr-version)(keine Beschreibung)(keine Meldung)(Python-file)(Python-Lib-Verzeichnis)(Python-Version)...<<< Fehlerdetails verbergenQBzr — Eine grafische Benutzeroberfläche für Bazaar
Version %(qbzr_version)s (bzrlib %(bzrlib_version)s)

Copyright © 2006-2008 Lukáš Lalinský und andere

http://bazaar-vcs.org/QBzrEin Commit wird direkt in den Hauptzweig gemacht, lokaler und Hauptzweig werden synchron gehalten.Ein lokaler Commit wird durchgeführt. Der Hauptzweig wird solange nicht aktualisiert, wie ein nicht-lokaler Commit ausgeführt wird.AbkürzungAbgebrochen!Bricht ab...Über QBzrAktionHinzufügenFüge Lesezeichen hinzuAdresse:AliasAliaseAlle Konflikte gelöstBeschreibeArchivtyp:Sind Sie sicher, dass Sie diese Datei auf den Stand der gewählten Revision zurücksetzen wollen?AutorAutor:AutorenAutomatisch auflösenBasisverzeichnis für neue &Zweige:Bazaar 2.4 oder neuer wird für die Unterstützung von externen Merge-Tools benötigt.Bazaar 2.4 oder neuer wird benötigt, um Merge-Tools zu konfigurieren.Bazaar EinstellungenBazaar BibliothekBindenZweig bindenNeuen Zweig an den Ursprungsort bindenBinden an:LesezeichenGebunden an:ZweigSpeicherort des Zweigs:Quelle des Zweigs (eine Adresse eingeben oder einen lokalen Ordner mit existierendem Zweig wählen)Zweig:Zweig: %sDurchsuchenDurchsuchen...Bug-TrackerBug:Bugs:FehlerEingebaute Differenzanzeige&Kategorie:Groß-/Kleinschreibung beachtenKein Editor zum Ändern ausgewählt.GeändertÄnderungenCheckout des Zweiges:Kinder:Klicke einen Link an um mehr Informationen über Checkouts und Äste zu erhalten.Fenster %s schließenAnwendung beendenFehlerdialog schließenFenster schließenBefehlKommandozeileCommittenÜbertrage die Änderungen in eine neue RevisionBeitragender:VollständigComputerKonfigurationKonfliktKonflikteDas Skript "bzr" konnte nicht gefunden werden."bzr.exe" konnte nicht gefunden werden.Einen Zweig erstellen vor dem UmschaltenErstelle einen CheckoutErstelle einen neuen Bazaar-ArbeitsbaumErstelle ein neues gemeinsames ProjektarchivErstelle einen neuen eigenständigen BaumErzeuge einen gestapelten Zweig, basierend auf dem Quell-ZweigNeuen Tag erstellenPfad zum Zweig anlegen, wenn er nicht existiertMomentan gebunden an:DatumDatum:StandardLöschenExistierenden Tag löschenBeschreibungBeschreibung des FormatsBeschreibung:ZerstörenDiffVerzeichnisKeine Sicherungskopien von zurückgesetzten Dateien anlegen.Wollen Sie wirklich das ausgewählte Lesezeichen entfernen?Möchten Sie wirklich die ausgewählte(n) Datei(en) zurücksetzen?Wollen Sie diese Revisionen wirklich zurückziehen?Möchten Sie trotzdem fortfahren?TestdurchlaufE-&Mail:E-Mail-&Client:Bearbeite LesezeichenTag bearbeitenEditorZeichenkodierungZeichenkodierung »%s« ist ungültig oder wird nicht unterstützt.Zeichenkodierung:Sicherstellen, dass alle Revisionen zum Protokoll hinzugefügt werdenTrage Passwort einBenutzernamen eingebenGib den Namen des Autoren an, z.B. Hans Müller <hmueller@beispiel.de>Commit-Nachricht eingebenEingeben der Liste der Bugs IDs im Format tag:id abgetrennt durch einen Abstand, z.B. project:123 project:765FehlerFehler bei der Ausführung von bzr. (Fehler-Code: %d)Fehler während der Ausführung vom Verschmelzungswerkzeug (code %d)EvolutionExportierenEndungExterne Applikationen für Dateiunterschiede:Externes Merge-ToolExterne Merge-ToolsExternes Merge-Tool %(tool)s ist nicht verfügbarBzr konnte nicht gestartet werdenMisserfolg!DateiDatei %s ist nicht versioniert. Operation abgebrochen.DateinameDateiname:SuchenIn der aktiven Ansicht suchenSuchen: Fertig!Ausstehende Merge-Vorgänge verwerfenFormularAllgemeinWeiterGehe zu ZeileGehe zu Zeile: Schwergewichtiger Checkout:HilfeHilfe für BefehlIdIgnorierenFehler ignorierenAlle Dateien mit dieser Erweiterung ignorierenIgnorieren alsAnhand des Basisnamens ignorierenAnhand des vollen Namens ignorierenLeerzeichen ignorierenIgnoriertAltes externes Merge-Tool importierenInfoInitialisierenOr&dner einfügen...Dateinamen ein&fügen...Es ist nicht möglich, gleichzeitig verschiedene Dateipfade und verschiedene Zweige anzugeben.KMailBeibehaltenArt:Letzte Änderung:Externes Diff-Tool startenLayoutLayout %dZeichensatzkodierung linke SeiteTabulatorbreite linke SeiteBibliothek:Leichtgewichtiger CheckoutLeichtgewichtiger CheckoutLade...Lokaler OrdnerLokale Commits werden nicht zum Hauptzweig hochgereicht, bis ein normaler Commit durchgeführt wirdLokaler Ordner, in dem der Arbeitsbaum erstellt wirdSpeicherort:OrteProtokollProtokolldatei:V&erschmelzungs-Werkzeug:MAPI-E-Mail-ClientErstelle eine lokale Kopie des ZweigsMarkiere als &gelöstKonflikt als ge&löst markierenOrt des Hauptzweiges nicht angegebenZusammenführenZusammenführungsvorschauZusammenführen auch wenn Arbeitsbaum ungesicherte Änderungen hatZusammenführen von ungesicherten Änderungen anstatt der gesichertenNachrichtNachricht:NachrichtenNachrichten und Datei-Text (indexiert)Fehlender Schalter: %s. Einstellen in qconfig im Zusammenführen-Tab.Letzte Revision (Spitze)Existierenden Tag verschiebenMuttNameWeiterKeine AktionKeine Aktion gewähltKeine Änderungen gefunden.Keine Änderungen für einen CommitKeine Änderungen zum Übertragen ausgewählt. Soll sie dennoch durchgeführt werden?Keine Änderungen zum Zurücksetzen ausgewählt.Keine Änderungen ausgewählt.Es kann keine Hilfe für %s gefunden werdenKeine andere Revision festgelegt.Es existiert kein Arbeitsbaum für "%s"Kein Zweig "%s"Kein Zweig: %sKeine DateiVorgang abgebrochen, weil sich die Zieldateien geändert haben.Vorgang abgebrochen, weil der Arbeitsbaum ausstehende Merges besitzt.OptionenAndere Revision:Unterschiede zwischen Zweigen überschreibenEltern:Pfad:Ausstehende ZusammenführungenErweiterungenInstallierte Erweiterungen: %(rows)dZurückEigenschaften:&HolenÖffentlicher Zweig:Herunterladen (pull)Hole einen anderen ZweigHohle neueste Änderungen von:HochladenPython InterpreterZu dieser Revision &zurücksetzen&UmbenennenBereitAktualisiere den VerzeichnisbaumDiese Orte als Standard merkenDiesen als neuen Elternzweig speichernDiesen Ort als Standard merkenEntfernenEntferne LesezeichenBazaar-Fehler meldenProjektarchivProjektarchiv-Format:RevRev %(rev)s für %(branch)sRev %sZurücksetzen%s zu Revision %s revid:%s zurücksetzen.Datei zurücksetzenZu Revision %s revid:%s zurücksetzen.Bis zu dieser Revision zurücksetzenRevid: %(revid)s für %(branch)sRevid: %sRevisionRevision %sRevisions-IDsRevisionsnummernRevision:Revisionen:Zeichensatzkodierung rechte SeiteTabulatorbreite rechte SeiteName des Wurzelverzeichnises:bzr Kommando ausführenDatei in dieser Revision speichern unter...Datei in dieser Revision speichern unter...Alle an-/abwählenWähle QuellverzeichnisWähle ZielverzeichnisAlle auswählenSpeicherort des Zweiges wählenWählen Sie die Änderungen, die zurückgesetzt werden sollen.Wählen Sie eine Editor AusführungsdateiWähle Dateien zum EinfügenWähle Pfad zum EinfügenArbeitsverzeichnis wählenSendenStandard setzenSetze die IDs der Bugs, die mit diesem Commit behoben wurdenAutor dieser Änderung setzen, falls er sich vom Committer unterscheidetRichten Sie die external_merge-Anwendung in qconfig im Merge-Reiter einSetzt das ausgewählte Merge-Tool als Standardeinstellung in qconflicts.Einstellungen:ZurückstellenZurückstellungsmanagerAnzeigen&Anmerkungen zeigenUnterschie&de zeigenZeige &Unterschiede …&Protokoll anzeigenZeige Baum...Fehlerdetails anzeigen >>>Protokoll anzeigen …Zeige alle &UnterschiedeZeige alle &Unterschiede …Zeige Unterschie&de in DateiZeige Unterschie&de in DateiDateiliste anzeigenIgnorierte Dateien zeigenEinfügungen und Entfernungen innerhalb von Gruppen in Grün und Rot anzeigenNicht versionierte Dateien zeigenSignatur:GrößeÜberspringe die Erstellung von Arbeitsbäumen in diesem ProjektarchivEinige der ausgewählten Dateien können nicht wiederhergestellt werden, nachdem sie gelöscht wurden. Sind Sie sicher, dass diese Dateien gelöscht werden sollen?&Sprache für Rechtschreibung:Startet...StatusStatus:Zu versendenden Zweig:ZusammenfassungUmschaltenWechseln zum Zweig:SysteminformationTabulator&breiteTabulatorbreiteTabulatorbreite in Zeichen Option wird in den qdiff-, qannotate- und qcat-Fenstern benutztTagDer Tag "%s" existiert bereits. Soll der existierende Tag verschoben werden?Der Tag "%s" extistiert nichtDer Tag "%s" existiert noch nicht. Soll ein neuer Tag erzeugt werden?Tag &Revision...StichworteMarkierungen:The extmerge definition: '%(tool)s' is invalid. Missing the flag: %(flags)s. This must be fixed in qconfig under the Merge tab.Dieser Ordner ist ein Zweig. Bitte wählen Sie, was Sie aktualisieren möchten.Dieser Ordner ist ein Checkout von: %sDieser Ordner wird automatisch in das Ursprungsfeld des Zweiges eingetragenThunderbirdZwischen Nebeneinander- und Unidiff-Ansicht umschaltenDiesen Zweig in einen Spiegel eines anderen Zweigs umwandelnURLLösenLöse ZweigUnverändertCommit zurückziehenUngesicherte Änderungen am ArbeitsbaumUnidiffUnbekannte DateienAlle abwählenNicht versioniertNicht versionierte DateienAktualisierenAktualisieren von %s auf Revision %s revid:%s.Zweig aktualisierenAktualisiere CheckoutAktualisiere ein Spiegelbild dieses AstesAktualisiere QuelleArebeitsbaum vom gebundenen Zweig aufdatierenAktualisieren auf Revision %s revid:%s.Arbeitsbaum %s aktualisierenArbeitsbaum aufdatierenArbeitsbaum auf die neusten Änderungen im Zweig aufdatierenEditor benutzenVorhandenen Ordner benutzenSignaturen überprüfenVersionVersion:AnsichtAnsichtsoptionenZeige BinärdateiZeige Änderungen in den für den Commit ausgewählten DateienÄnderungen in den zum Zurücksetzen gewählten Dateien anzeigenZeige VerzeichnisZeige DateiZeige BilddateiZurückgestellte Änderungen ansehenZeige SymlinkZeige TextdateiGanze WörterZeilenumbruchArbeitsbaumArbeitsbaum-OptionenArbeitsbaum für %sArbeitsbaum hat nicht übertragene ÄnderungenArbeitsbaum ist nicht aktuell, bitte 'bzr update' ausführen.Arbeitsbaum ist nicht mehr aktuell. Aktualisieren Sie ihn, um committen zu können.Möchten Sie ihr vorher konfiguriertes externes Merge-Tool importieren: %(old_cmdline)s als: %(new_cmdline)sFalsche ZeichenkodierungXDG-E-Mail-ClientSie sollten einen Commit-Kommentar eingeben.Sie sollten einen Tag-Namen angeben[Binärdatei (%d bytes)]\ Kein Zeilenumbruch am Ende der DateiDatei hinzufügenhinzugefügthinzugefügte Dateienhinzugefügt, fehlendFehler #%sInhaltskonfliktDatei löschengelöschte Dateienlösche ParentVerzeichnisDuplikatDoppelte IDDateibehobenignoriertfehlendfehlender Parentverändertgeänderte DateienBinärdatei ändernZiel ändernText ändernverschobenkein-Ordner parentnicht versioniertEltern-SchleifePfadkonfliktentferntumbenennenumbenanntumbenannt und verändertumbenannte DateienSymlinkTextkonfliktx-Bit././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/en/LC_MESSAGES/0000755000000000000000000000000014556556456014270 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/en/LC_MESSAGES/qbrz.mo0000644000000000000000000010772614556556456015620 0ustar00(\"(.6).`. q.{...... .. ... ./ // !/ +/ 9/C/I/O/a/j/y/// ////// // / 0 0050F0M0]0d0h0#n0000000 00 00 0 11(181 >1 L1W1k1|11 11 1 111112,2 /3c<3w3 4%4 .4 :4E4L4 P4]4f4l4't4449434 +5W95555 5#55?5886q666 6"66 6 666 7O7m7 u77 7 7 77 7 7777 888 08,<8 i8?s88888 8 99 9%9",9 O9Z9c9 l9z99 9+9999: -:N:m:6::5:;;;%;-;V4;; ;; ;;; ;%;5 <7A<3y<2</<=0=8=A= Q=_=h=====*= =,=+>:>FI>>k>?.?)4?(^? ???? ????-@>@S@[@,`@ @@ @@@@ @@@@A A AA4A9AJAPASA ZA$gA AAAAAA'A.BLB QB\BqB[BBBBB#C&C -C7CJC^CgC}C CCCT^D6D D DD E EE,ELE^E%vEEE E6E3E3F;FDF MF?nFFF FFFF F G GG/G<MGGG"GGGH7HIH ZHeH8}H:H<H.I6I&FImIIIIIII I IIIJ J#JBJGJZJsJ{JJJ$J&J#J!K(K%8K^K rK}KKKKKKK%K,K+L"2L ULaLLL LL L LL L M MM4MIM YM zMMMM M#MN'N+@NlNNNNN N(NCO8IOAO OOO4OPP-P?P TP ^PlP PPPPP PP5QFQ _QHjQQ5QgQVR mRyRRRRRRRR R R RKRGS:KSS<SSSSST\#TTHU#IUMmUTU V2V0OVVV V VVVV V VV VWW"W @WNW^W }W-WWWW7W 4X?XVXhXpXyX ~XX(X(XX XYY ,Y9YHY PY \Y fYsYYY%Y5Y@ZsUZZZ)Za[$v['[[ [)\,\H\a\}\\ \\\\ \ \\ \ \ \ ]]]]']6]?] N] \] j]v]|] ] ] ] ]]]]] ]] ^^(^.^6_` `#`,`1`B`Z`c` j`u` }``` `` `` ` ` ```` aa!a'a/a 5aBaIaOaXala aa a aaaaaab bb#b:b@bFbObcbjb rb}b bb bbbbb b bbc$c3c BcPc ac nc|cccccc dcdwHe ee e eee efff'fDf\f9ef3f fWf9g@gHg Pg#]gg?g8gh.h=h Bh"Nhqh zh hhhhOhi i(i /i 9i FiQi Vi cini}iiiii i,i j?j[jkj}jj j jj jj"j jk k k"k*k 3k+=kikkkk kkl62lil5xllllllVl3m GmSm imvm~m m%m5m7m3!n2Un/nnnnn noo*o1oMoho*qo o,oooFo8pkQppp)p(q /q9q@q[q vqqqq-qqqr,r 5r?r Ur_rdryr rrrrr r rrrrrrr s$s 4s>sQsdsvs~s's.ss stt[.ttttt#tt tttuu%u ;uFuVuTv6[v v vv v vvvvw%wDwJw bw6pw3wwww w?xVxqx xxxx x xxxx<x2yPy"eyyyyyy z z8%z:^z<zzz&z{4{={C{R{Z{v{ { {{{{{{{{||#|8|>|$Y|&~|#|||%|} }%}8}@}F}J}e}l}%},}}"} } ~)~A~ a~k~ t~ ~~ ~ ~~~~~  "CYq #+-DZs x(C8A* lv}4ƁՁ  +7Mf} 5 H[5`g !(0?GN^p K:.<G\˅(H#MTc 2ć0(, 3 AKTt |  "ň  %-3a7 ܉! &3(D(m  Ԋ  0D%`5@sq)a$'Ck )ԍ %. 4@OW i u ǎώގ  $ 9 G S _mu|  Џ`.3PZ:S9#'T5!NDBl_,8j+S'z?m$V Q8< Fs1k5""6=61] ivl [{i e&C`%O#A"2 NJa@?g|h<(d)G( /E ^'u %{*\ *M7]}qLRP!zXrc2^e@.hBn_4a k>}\ w G%bU;IHR n#d>xyF!Q~JUXt  KoDxyZsEgmW-fLv$pV:=YO[CY$3,|qcWI&H-4pwb70f+T( j otu/0);r9&MKA~%d conflict auto-resolved.%d conflicts auto-resolved.%d file%d files&About...&Action:&Add&Add Bookmark...&Annotate this revision&Author:&Basic&Bookmarks&Branch&Browse...&Cancel&Change the values&Cherry pick&Close&Command:&Commit&Complete&Configure...&Detailed&Diff&Edit&Edit Bookmark...&Editor:&External Diff&File&Filter&Find&Fixed bugs:&From:&Help&Help...&Ignore and proceed&Ignore whitespace changes&Launch...&Layout&Local commit&Location:&Mark as moved&Mark as moved and renamed&Mark as renamed&Merge&Merge conflict&Name:&OK&Open&Options and arguments for command:&Push&Quit&Refresh&Remove Bookmark...&Retry&Revert&Revision:&Search:&Select...&Show hidden commands&Tag name:&To:&Update to this revision&User Interface&View&View Options&View file&Working directory:(bzr-config-dir)(bzr-lib-path)(bzr-log-file)(bzr-version)(no description)(no message)(python-file)(python-lib-dir)(python-version)...<<< Hide Error DetailsQBzr — 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/QBzrA commit will be made directly to the master branch, keeping the local and master branches in sync.A local commit to the branch will be performed. The master branch will not be updated until a non-local commit is made.AbbreviationAborted!Aborting...About QBzrActionAddAdd BookmarkAddress:AliasAliasesAll commits signed with verifiable keysAll conflicts resolved.AnnotateApply changes in shelf[%(id)d], and remove from the shelfApply changes in shelf[%(id)d], but keep it shelvedArchive type:Are you sure you want to revert this file to the state it was at the selected revision?AuthorAuthor:AuthorsAuto-resolveBase directory for &branch sources:Base directory for &checkouts:Bazaar 2.4 or later is required for external mergetools supportBazaar 2.4 or newer is required to configure mergetools.Bazaar ConfigurationBazaar LibraryBindBind branchBind new branch to parent locationBind to:BookmarksBound to:BranchBranch location not specified.Branch location:Branch source (enter a URL or select a local directory with an existing branch)Branch:Branch: %sBrowseBrowse...Bug TrackersBug:Bugs:BugsBuiltin DiffC&ategory:Case sensitiveCase-insensitive patternChange editor is not defined.ChangedChangesCheckout of branch:Cherry-pickCherry-pick revisions %s - %s from %s to %s.Children:Click a link for more information about checkouts and branches.Close %s WindowClose ApplicationClose Error DialogClose Goto LineClose WindowClose findCommandCommand LineCommitCommit changes into a new revisionCommitter:CompleteComputerConfigurationConfirmConflictConflictsCould not acquire lock. Please retry later.Could not locate "bzr" script.Could not locate "bzr.exe".Create Branch before switchingCreate a checkoutCreate a new Bazaar Working TreeCreate a new shared repositoryCreate a new standalone treeCreate a stacked branch referring to the source branchCreate new tagCreate the path up to the branch if it does not existCurrently bound to:DateDate:DefaultDeleteDelete changes of %d file without shelvingDelete changes of %d files without shelvingDelete existing tagDescriptionDescription of formatDescription:DestroyDiffDirectoryDo not save backups of reverted filesDo you really want to branch into a non-empty folder?Do you really want to checkout into a non-empty folder?Do you really want to remove the selected bookmark?Do you really want to revert the selected file(s)?Do you really want to uncommit these revisions?Do you want to continue anyway?Dry runE-&mail:E-mail &client:Edit BookmarkEdit tagEdited by change editor. EditorEmail address is not valid.Email address not entered.EncodingEncoding "%s" is invalid or not supported.Encoding:Ensure all revisions are appended to the logEnter PasswordEnter UsernameEnter the author's name, e.g. John Doe <jdoe@example.com>Enter the commit messageEnter the list of bug IDs in format tag:id separated by a space, e.g. project:123 project:765Enter the shelve messageErrorError while running bzr. (error code: %d)Error while running merge tool (code %d)EvolutionExportExport location is invalidExport revision is invalidExtensionExternal Diff Apps:External MergeExternal Merge ToolsExternal merge tool %(tool)s is not availableFailed to start bzr.Failed!FileFile %s is not versioned. Operation aborted.File NameFilename not entered.Filename:FindFind on active panelFind: Finished!Forget pending mergesFormGeneralGoGoto LineGoto Line: Heavyweight checkout:HelpHelp for commandHunksIdIgnoreIgnore ErrorIgnore all files with this extensionIgnore asIgnore by basenameIgnore by fullnameIgnore whitespaceIgnoredImport old external merge toolInclude a bundle in the merge directiveInclude a preview patch in the merge directiveInfoInitializeInsert &directory...Insert &filenames...It is not possible to specify different file paths and different branches at the same time.KMailKeepKind:Last modified:Launch an external diff applicationLayoutLayout %dLeft side encodingLeft side tab widthLibrary:Light-weight checkoutLightweight checkout:Loading...Local DirectoryLocal branch is out of date with master branch. To commit to master branch, update the local branch. You can also pass select local to commit to continue working disconnected.Local commits are not pushed to the master branch until a normal commit is performedLocal directory where the working tree will be createdLocation:LocationsLogLog File:M&erge tool:MAPI e-mail clientMake a local copy of the branchMark as &resolvedMark conflict &resolvedMaster branch location not specified.MergeMerge Directive OptionsMerge PreviewMerge even if the working tree has uncommitted changesMerge uncommitted changes instead of committed onesMessageMessage:MessagesMessages and File text (indexed)Missing the flag: %s. Configure in qconfig under the merge tab.Most recent (tip) revisionMove existing tagMove tip toMuttNameNextNext hunkNo actionNo action selectedNo changes found.No changes selected to commitNo changes selected to commit. Do you want to commit anyway?No changes selected to revertNo changes selected.No help can be found for %sNo other revision specified.No submit branch entered.No working tree exists for "%s"Not a branch "%s"Not a branch: %sNot a fileNothing selected to addOperation aborted because target files has been changed.Operation aborted because working tree has pending merges.Operation is supported for a single file only, not for a %s.OptionsOther revision:Overwrite differences between branchesParent of current tip revisionParents:Path:Pending MergesPluginsPlugins installed: %(rows)dPreviousPrevious hunkProperties:Pu&llPublic Branch:PullPull a different branchPull most recent changes from:PushPython InterpreterR&evert to this revisionRe&nameRe&verse Cherry pickReadyRefresh the directory treeRemember these locations as defaultsRemember this as the new parent branchRemember this location as a defaultRemoveRemove BookmarkRemove shelf[%(id)d] without applyingReport Bazaar ErrorRepositoryRepository Format:ResolveRetryRevRev %(rev)s for %(branch)sRev %sReverse cherry-pickReverse cherry-pick revisions %s - %sReverse cherry-pick revisions %s - %s in %s.RevertRevert %s to revision %s revid:%s.Revert FileRevert to revision %s revid:%s.Revert to this revisionRevid: %(revid)s for %(branch)sRevid: %sRevisionRevision %sRevision IDsRevision NumbersRevision:Revisions:Right side encodingRight side tab widthRoot directory name:Run bzr commandSave file in this revision as...Save file on this revision as...Select / deselect allSelect Source DirectorySelect Target DirectorySelect allSelect base directory for checkoutsSelect branch locationSelect changes to revertSelect default directory for branch sourcesSelect editor executableSelect files to insertSelect path to insertSelect working directorySendSet DefaultSet the IDs of bugs fixed by this commitSet the author of this change, if it's different from the committerSet up external_merge app in qconfig under the Merge tabSets the selected merge tool as the default to use in qconflicts.Settings:ShelveShelve ManagerShelve changes of %d fileShelve changes of %d filesShowShow &annotateShow &differencesShow &differences...Show &logShow &tree...Show Error Details >>>Show Log...Show all &differencesShow all &differences...Show file &differencesShow file &differences...Show filelistShow ignored filesShow inter-group inserts and deletes in green and redShow non-versioned filesSignature:Simulate to apply changes in shelf[%(id)d] without changing working treeSizeSkip the creation of working trees in this repositorySome of the files selected cannot be recovered if removed. Are you sure you want to remove these files?Spell check &language:Starting...StatusStatus:Submit Branch:SummarySwitchSwitch checkoutSwitch to branch:System InformationTab &Width:Tab WidthTab widthTab width in characters option is used in qdiff, qannotate and qcat windowsTagTag "%s" already exists. Do you want to move existing tag?Tag "%s" does not existsTag "%s" does not exists yet. Do you want to create new tag?Tag &revision...TagsTags:Take "&OTHER" versionTake "&THIS" versionThe destination folder is not empty. Populating new working tree there may create conflicts.The extmerge definition: '%(tool)s' is invalid. Missing the flag: %(flags)s. This must be fixed in qconfig under the Merge tab.This directory is a branch. Please select what you would like to updateThis directory is a checkout of: %sThis directory will be automatically filled in your branch source input fieldThis directory will be automatically filled in your checkout destination input fieldThunderbirdToggle between Side by side and Unidiff view modesTurn this branch into a mirror of another branchURLUnbindUnbind branchUnchangedUncommitUncommited Working Tree ChangesUnidiffUnknown FilesUnselect allUnshelveUnversionedUnversioned FilesUpdateUpdate %s to revision %s revid:%s.Update BranchUpdate CheckoutUpdate a mirror of this branchUpdate sourceUpdate the working tree from the bound branchUpdate to revision %s revid:%s.Update tree %sUpdate working treeUpdate working tree to the latest changes in the branchUse editorUse existing directoryVerify SignaturesVersionVersion:ViewView OptionsView binary fileView changes in files selected to commitView changes in files selected to revertView directoryView fileView image fileView shelved changesView symlinkView text fileWarningWhole wordsWord WrapWorking TreeWorking Tree OptionsWorking Tree for %sWorking tree has conflicts.Working tree has uncommitted changes.Working tree is out of date, please run 'bzr update'.Working tree is out of date. To commit, update the working tree.Would you like to import your previously configured external merge tool: %(old_cmdline)s as: %(new_cmdline)sWrong encodingXDG e-mail clientYou have not selected anything to revert.You have selected revert for all changed paths but keep pending merges. Do you want to continue?You should provide a commit message.You should select destination directoryYou should specify a locationYou should specify branch sourceYou should specify source branch locationYou should specify tag name[binary file (%d bytes)]\ No newline at end of fileadd fileaddedadded filesadded, missingbug #%scontents conflictdelete filedeleted filesdeleting parentdirectoryduplicateduplicate idfilefixedignoredmissingmissing parentmodifiedmodified filesmodify binarymodify targetmodify textmovednon-directory parentnon-versionedold_cmdlineparent looppath conflictremovedrenamerenamedrenamed and modifiedrenamed filessymlinktext conflictunversioned parentx-bitProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2012-07-12 16:38+0300 Last-Translator: Automatically generated Language-Team: none MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) %d conflict auto-resolved.%d conflicts auto-resolved.%d file%d files&About...&Action:&Add&Add Bookmark...&Annotate this revision&Author:&Basic&Bookmarks&Branch&Browse...&Cancel&Change the values&Cherry pick&Close&Command:&Commit&Complete&Configure...&Detailed&Diff&Edit&Edit Bookmark...&Editor:&External Diff&File&Filter&Find&Fixed bugs:&From:&Help&Help...&Ignore and proceed&Ignore whitespace changes&Launch...&Layout&Local commit&Location:&Mark as moved&Mark as moved and renamed&Mark as renamed&Merge&Merge conflict&Name:&OK&Open&Options and arguments for command:&Push&Quit&Refresh&Remove Bookmark...&Retry&Revert&Revision:&Search:&Select...&Show hidden commands&Tag name:&To:&Update to this revision&User Interface&View&View Options&View file&Working directory:(bzr-config-dir)(bzr-lib-path)(bzr-log-file)(bzr-version)(no description)(no message)(python-file)(python-lib-dir)(python-version)...<<< Hide Error DetailsQBzr — 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/QBzrA commit will be made directly to the master branch, keeping the local and master branches in sync.A local commit to the branch will be performed. The master branch will not be updated until a non-local commit is made.AbbreviationAborted!Aborting...About QBzrActionAddAdd BookmarkAddress:AliasAliasesAll commits signed with verifiable keysAll conflicts resolved.AnnotateApply changes in shelf[%(id)d], and remove from the shelfApply changes in shelf[%(id)d], but keep it shelvedArchive type:Are you sure you want to revert this file to the state it was at the selected revision?AuthorAuthor:AuthorsAuto-resolveBase directory for &branch sources:Base directory for &checkouts:Bazaar 2.4 or later is required for external mergetools supportBazaar 2.4 or newer is required to configure mergetools.Bazaar ConfigurationBazaar LibraryBindBind branchBind new branch to parent locationBind to:BookmarksBound to:BranchBranch location not specified.Branch location:Branch source (enter a URL or select a local directory with an existing branch)Branch:Branch: %sBrowseBrowse...Bug TrackersBug:Bugs:BugsBuiltin DiffC&ategory:Case sensitiveCase-insensitive patternChange editor is not defined.ChangedChangesCheckout of branch:Cherry-pickCherry-pick revisions %s - %s from %s to %s.Children:Click a link for more information about checkouts and branches.Close %s WindowClose ApplicationClose Error DialogClose Goto LineClose WindowClose findCommandCommand LineCommitCommit changes into a new revisionCommitter:CompleteComputerConfigurationConfirmConflictConflictsCould not acquire lock. Please retry later.Could not locate "bzr" script.Could not locate "bzr.exe".Create Branch before switchingCreate a checkoutCreate a new Bazaar Working TreeCreate a new shared repositoryCreate a new standalone treeCreate a stacked branch referring to the source branchCreate new tagCreate the path up to the branch if it does not existCurrently bound to:DateDate:DefaultDeleteDelete changes of %d file without shelvingDelete changes of %d files without shelvingDelete existing tagDescriptionDescription of formatDescription:DestroyDiffDirectoryDo not save backups of reverted filesDo you really want to branch into a non-empty folder?Do you really want to checkout into a non-empty folder?Do you really want to remove the selected bookmark?Do you really want to revert the selected file(s)?Do you really want to uncommit these revisions?Do you want to continue anyway?Dry runE-&mail:E-mail &client:Edit BookmarkEdit tagEdited by change editor. EditorEmail address is not valid.Email address not entered.EncodingEncoding "%s" is invalid or not supported.Encoding:Ensure all revisions are appended to the logEnter PasswordEnter UsernameEnter the author's name, e.g. John Doe <jdoe@example.com>Enter the commit messageEnter the list of bug IDs in format tag:id separated by a space, e.g. project:123 project:765Enter the shelve messageErrorError while running bzr. (error code: %d)Error while running merge tool (code %d)EvolutionExportExport location is invalidExport revision is invalidExtensionExternal Diff Apps:External MergeExternal Merge ToolsExternal merge tool %(tool)s is not availableFailed to start bzr.Failed!FileFile %s is not versioned. Operation aborted.File NameFilename not entered.Filename:FindFind on active panelFind: Finished!Forget pending mergesFormGeneralGoGoto LineGoto Line: Heavyweight checkout:HelpHelp for commandHunksIdIgnoreIgnore ErrorIgnore all files with this extensionIgnore asIgnore by basenameIgnore by fullnameIgnore whitespaceIgnoredImport old external merge toolInclude a bundle in the merge directiveInclude a preview patch in the merge directiveInfoInitializeInsert &directory...Insert &filenames...It is not possible to specify different file paths and different branches at the same time.KMailKeepKind:Last modified:Launch an external diff applicationLayoutLayout %dLeft side encodingLeft side tab widthLibrary:Light-weight checkoutLightweight checkout:Loading...Local DirectoryLocal branch is out of date with master branch. To commit to master branch, update the local branch. You can also pass select local to commit to continue working disconnected.Local commits are not pushed to the master branch until a normal commit is performedLocal directory where the working tree will be createdLocation:LocationsLogLog File:M&erge tool:MAPI e-mail clientMake a local copy of the branchMark as &resolvedMark conflict &resolvedMaster branch location not specified.MergeMerge Directive OptionsMerge PreviewMerge even if the working tree has uncommitted changesMerge uncommitted changes instead of committed onesMessageMessage:MessagesMessages and File text (indexed)Missing the flag: %s. Configure in qconfig under the merge tab.Most recent (tip) revisionMove existing tagMove tip toMuttNameNextNext hunkNo actionNo action selectedNo changes found.No changes selected to commitNo changes selected to commit. Do you want to commit anyway?No changes selected to revertNo changes selected.No help can be found for %sNo other revision specified.No submit branch entered.No working tree exists for "%s"Not a branch "%s"Not a branch: %sNot a fileNothing selected to addOperation aborted because target files has been changed.Operation aborted because working tree has pending merges.Operation is supported for a single file only, not for a %s.OptionsOther revision:Overwrite differences between branchesParent of current tip revisionParents:Path:Pending MergesPluginsPlugins installed: %(rows)dPreviousPrevious hunkProperties:Pu&llPublic Branch:PullPull a different branchPull most recent changes from:PushPython InterpreterR&evert to this revisionRe&nameRe&verse Cherry pickReadyRefresh the directory treeRemember these locations as defaultsRemember this as the new parent branchRemember this location as a defaultRemoveRemove BookmarkRemove shelf[%(id)d] without applyingReport Bazaar ErrorRepositoryRepository Format:ResolveRetryRevRev %(rev)s for %(branch)sRev %sReverse cherry-pickReverse cherry-pick revisions %s - %sReverse cherry-pick revisions %s - %s in %s.RevertRevert %s to revision %s revid:%s.Revert FileRevert to revision %s revid:%s.Revert to this revisionRevid: %(revid)s for %(branch)sRevid: %sRevisionRevision %sRevision IDsRevision NumbersRevision:Revisions:Right side encodingRight side tab widthRoot directory name:Run bzr commandSave file in this revision as...Save file on this revision as...Select / deselect allSelect Source DirectorySelect Target DirectorySelect allSelect base directory for checkoutsSelect branch locationSelect changes to revertSelect default directory for branch sourcesSelect editor executableSelect files to insertSelect path to insertSelect working directorySendSet DefaultSet the IDs of bugs fixed by this commitSet the author of this change, if it's different from the committerSet up external_merge app in qconfig under the Merge tabSets the selected merge tool as the default to use in qconflicts.Settings:ShelveShelve ManagerShelve changes of %d fileShelve changes of %d filesShowShow &annotateShow &differencesShow &differences...Show &logShow &tree...Show Error Details >>>Show Log...Show all &differencesShow all &differences...Show file &differencesShow file &differences...Show filelistShow ignored filesShow inter-group inserts and deletes in green and redShow non-versioned filesSignature:Simulate to apply changes in shelf[%(id)d] without changing working treeSizeSkip the creation of working trees in this repositorySome of the files selected cannot be recovered if removed. Are you sure you want to remove these files?Spell check &language:Starting...StatusStatus:Submit Branch:SummarySwitchSwitch checkoutSwitch to branch:System InformationTab &Width:Tab WidthTab widthTab width in characters option is used in qdiff, qannotate and qcat windowsTagTag "%s" already exists. Do you want to move existing tag?Tag "%s" does not existsTag "%s" does not exists yet. Do you want to create new tag?Tag &revision...TagsTags:Take "&OTHER" versionTake "&THIS" versionThe destination folder is not empty. Populating new working tree there may create conflicts.The extmerge definition: '%(tool)s' is invalid. Missing the flag: %(flags)s. This must be fixed in qconfig under the Merge tab.This directory is a branch. Please select what you would like to updateThis directory is a checkout of: %sThis directory will be automatically filled in your branch source input fieldThis directory will be automatically filled in your checkout destination input fieldThunderbirdToggle between Side by side and Unidiff view modesTurn this branch into a mirror of another branchURLUnbindUnbind branchUnchangedUncommitUncommited Working Tree ChangesUnidiffUnknown FilesUnselect allUnshelveUnversionedUnversioned FilesUpdateUpdate %s to revision %s revid:%s.Update BranchUpdate CheckoutUpdate a mirror of this branchUpdate sourceUpdate the working tree from the bound branchUpdate to revision %s revid:%s.Update tree %sUpdate working treeUpdate working tree to the latest changes in the branchUse editorUse existing directoryVerify SignaturesVersionVersion:ViewView OptionsView binary fileView changes in files selected to commitView changes in files selected to revertView directoryView fileView image fileView shelved changesView symlinkView text fileWarningWhole wordsWord WrapWorking TreeWorking Tree OptionsWorking Tree for %sWorking tree has conflicts.Working tree has uncommitted changes.Working tree is out of date, please run 'bzr update'.Working tree is out of date. To commit, update the working tree.Would you like to import your previously configured external merge tool: %(old_cmdline)s as: %(new_cmdline)sWrong encodingXDG e-mail clientYou have not selected anything to revert.You have selected revert for all changed paths but keep pending merges. Do you want to continue?You should provide a commit message.You should select destination directoryYou should specify a locationYou should specify branch sourceYou should specify source branch locationYou should specify tag name[binary file (%d bytes)]\ No newline at end of fileadd fileaddedadded filesadded, missingbug #%scontents conflictdelete filedeleted filesdeleting parentdirectoryduplicateduplicate idfilefixedignoredmissingmissing parentmodifiedmodified filesmodify binarymodify targetmodify textmovednon-directory parentnon-versionedold_cmdlineparent looppath conflictremovedrenamerenamedrenamed and modifiedrenamed filessymlinktext conflictunversioned parentx-bit././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/en_GB/LC_MESSAGES/0000755000000000000000000000000014556556456014640 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/en_GB/LC_MESSAGES/qbrz.mo0000644000000000000000000007003514556556456016160 0ustar00W h%6i%% %%%%%% %& &&!&4& ;&E& M& W&e&k&q&&&&&& &&&&& & ' ''-'H'Y'`'p'w'{'#''''''' '' '' (("(;(K( Q( _(j(~((( (( ( ((( ) )()c+*w* ++ + )+4+;+ ?+L+U+[+c+{+ +W++++ ,,-,B,Q, V,b, k, u,,,O,, ,, - - -#- (- 5-@-H-P- d-?n---- - -- ..". :.E.N. W.e. n.x.... ./$/6A/x/5////// /0 0'0 ,0%603\020/0011 ,1:1C1J1*S1 ~1,111F12k322)2(2 23 33'363K3S3,X3 3 333 3333333 4$4<4D4'c4.44 444[4P5V5\5#k55 5555 55T56E6 |6 66 6 66666%7.747 L76Z737777 7?8@8[8 m8y8~8888<89"!9D9a999 9<999&:+:J:S:Y:h:p: ::::::::;;";(;$C;&h;#;;;; ;;;<<"<")< L<X<p< << < << < <<< = (=I=_=w=#===+=>(>?>U>n>(s>C>8> ?#?(?7?I? ^? h? v??????5?+@ D@HO@@5@@ @@@AAA#A3AEA XA dA nAKxAA:AB<BYBjBoBuBBBH C#iCMCTC 0D0c Nc occcc#ccd+*dVdodddd(dCd@'e hereweee e e eeeff1f5Dfzf fHff5f"g 9gEgLgTgcgkgrggg g g gKgh:hRh<khhhhhhhHoi#iMiT*j j0jjj j jjjk k k*k?7{fV(83*9 Tz;-hDcJ&Ek)P x8%y}}HsO+phnE=DHU ~ >z%d conflict auto-resolved.%d conflicts auto-resolved.%d file%d files&About...&Action:&Add&Add Bookmark...&Annotate this revision&Author:&Bookmarks&Branch&Browse...&Cancel&Change the values&Close&Command:&Commit&Complete&Configure...&Diff&Edit&Edit Bookmark...&Editor:&External Diff&File&Filter&Find&Fixed bugs:&Help&Help...&Ignore and proceed&Ignore whitespace changes&Launch...&Local commit&Location:&Mark as moved&Mark as moved and renamed&Mark as renamed&Merge&Merge conflict&Name:&OK&Open&Options and arguments for command:&Push&Quit&Refresh&Remove Bookmark...&Retry&Revert&Revision:&Search:&Select...&Show hidden commands&Tag name:&To:&Update to this revision&User Interface&View&View Options&View file&Working directory:(bzr-config-dir)(bzr-lib-path)(bzr-log-file)(bzr-version)(no description)(no message)(python-file)(python-lib-dir)(python-version)...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/QBzrA commit will be made directly to the master branch, keeping the local and master branches in sync.A local commit to the branch will be performed. The master branch will not be updated until a non-local commit is made.AbbreviationAborted!Aborting...About QBzrActionAddAdd BookmarkAddress:AliasAliasesAll conflicts resolved.AnnotateArchive type:Are you sure you want to revert this file to the state it was at the selected revision?AuthorAuthor:AuthorsAuto-resolveBase directory for &checkouts:Bazaar ConfigurationBazaar LibraryBindBind branchBind to:BookmarksBound to:BranchBranch location:Branch source (enter a URL or select a local directory with an existing branch)Branch:Branch: %sBrowseBrowse...Bug TrackersBug:Bugs:BugsBuiltin DiffC&ategory:ChangedChangesCheckout of branch:Children:Click a link for more information about checkouts and branches.Close %s WindowClose ApplicationClose Error DialogClose WindowClose findCommandCommand LineCommitCommit changes into a new revisionCommitter:CompleteComputerConfigurationConflictConflictsCould not locate "bzr" script.Could not locate "bzr.exe".Create Branch before switchingCreate a checkoutCreate a new Bazaar Working TreeCreate a new shared repositoryCreate a new standalone treeCreate a stacked branch referring to the source branchCreate new tagCreate the path up to the branch if it does not existCurrently bound to:DateDate:DefaultDelete existing tagDescriptionDescription of formatDescription:DiffDirectoryDo not save backups of reverted filesDo you really want to remove the selected bookmark?Do you really want to revert the selected file(s)?Do you really want to uncommit these revisions?Do you want to continue anyway?E-&mail:E-mail &client:Edit BookmarkEdit tagEditorEncodingEncoding "%s" is invalid or not supported.Encoding:Ensure all revisions are appended to the logEnter PasswordEnter UsernameEnter the author's name, e.g. John Doe <jdoe@example.com>Enter the commit messageEnter the list of bug IDs in format tag:id separated by a space, e.g. project:123 project:765ErrorError while running bzr. (error code: %d)Error while running merge tool (code %d)EvolutionExportExtensionExternal Diff Apps:External MergeFailed to start bzr.Failed!FileFile %s is not versioned. Operation aborted.File NameFilename:FindFind on active panelFinished!Forget pending mergesGeneralGoHeavyweight checkout:HelpHelp for commandIgnore ErrorIgnore all files with this extensionIgnoredImport old external merge toolInclude a bundle in the merge directiveInclude a preview patch in the merge directiveInfoInitializeInsert &directory...Insert &filenames...It is not possible to specify different file paths and different branches at the same time.KMailKind:Last modified:Launch an external diff applicationLayoutLayout %dLibrary:Light-weight checkoutLightweight checkout:Loading...Local DirectoryLocal commits are not pushed to the master branch until a normal commit is performedLocal directory where the working tree will be createdLocation:LocationsLogLog File:M&erge tool:MAPI e-mail clientMake a local copy of the branchMark as &resolvedMark conflict &resolvedMaster branch location not specified.MergeMerge Directive OptionsMerge PreviewMerge even if the working tree has uncommitted changesMerge uncommitted changes instead of committed onesMessageMessage:MessagesMessages and File text (indexed)Missing the flag: %s. Configure in qconfig under the merge tab.Most recent (tip) revisionMove existing tagMove tip toMuttNameNo action selectedNo changes found.No changes selected to commitNo changes selected to commit. Do you want to commit anyway?No changes selected to revertNo help can be found for %sNo other revision specified.No working tree exists for "%s"Not a branch "%s"Not a branch: %sNot a fileOperation is supported for a single file only, not for a %s.OptionsOther revision:Overwrite differences between branchesParent of current tip revisionParents:Path:Pending MergesPluginsPlugins installed: %(rows)dProperties:Pu&llPublic Branch:PullPull a different branchPull most recent changes from:PushPython InterpreterR&evert to this revisionRe&nameReadyRefresh the directory treeRemember these locations as defaultsRemember this as the new parent branchRemember this location as a defaultRemoveRemove BookmarkReport Bazaar ErrorRepositoryRepository Format:RevRev %(rev)s for %(branch)sRev %sRevertRevert %s to revision %s revid:%s.Revert FileRevert to this revisionRevid: %(revid)s for %(branch)sRevid: %sRevisionRevision %sRevision IDsRevision NumbersRevision:Revisions:Root directory name:Run bzr commandSave file in this revision as...Save file on this revision as...Select / deselect allSelect Source DirectorySelect Target DirectorySelect base directory for checkoutsSelect branch locationSelect changes to revertSelect default directory for branch sourcesSelect editor executableSelect files to insertSelect path to insertSelect working directorySendSet the IDs of bugs fixed by this commitSet the author of this change, if it's different from the committerSet up external_merge app in qconfig under the Merge tabSettings:ShowShow &annotateShow &differencesShow &differences...Show &logShow &tree...Show Log...Show all &differencesShow all &differences...Show file &differencesShow file &differences...Show ignored filesShow inter-group inserts and deletes in green and redShow non-versioned filesSignature:Simulate to apply changes in shelf[%(id)d] without changing working treeSizeSkip the creation of working trees in this repositorySpell check &language:Starting...StatusStatus:Submit Branch:SummarySwitchSwitch checkoutSwitch to branch:System InformationTab &Width:Tab WidthTab widthTab width in characters option is used in qdiff, qannotate and qcat windowsTagTag "%s" already exists. Do you want to move existing tag?Tag "%s" does not existsTag "%s" does not exists yet. Do you want to create new tag?Tag &revision...TagsTags:Take "&OTHER" versionTake "&THIS" versionThe extmerge definition: '%(tool)s' is invalid. Missing the flag: %(flags)s. This must be fixed in qconfig under the Merge tab.This directory is a branch. Please select what you would like to updateThis directory is a checkout of: %sThis directory will be automatically filled in your branch source input fieldThis directory will be automatically filled in your checkout destination input fieldThunderbirdTurn this branch into a mirror of another branchURLUnbindUnbind branchUnchangedUncommitUncommited Working Tree ChangesUnidiffUnknown FilesUnversionedUnversioned FilesUpdateUpdate %s to revision %s revid:%s.Update BranchUpdate CheckoutUpdate a mirror of this branchUpdate sourceUpdate the working tree from the bound branchUpdate to revision %s revid:%s.Update tree %sUpdate working treeUpdate working tree to the latest changes in the branchUse existing directoryVersionVersion:ViewView OptionsView binary fileView changes in files selected to commitView changes in files selected to revertView directoryView fileView image fileView symlinkView text fileWord WrapWorking TreeWorking Tree OptionsWorking Tree for %sWorking tree has uncommitted changes.Working tree is out of date, please run 'bzr update'.Working tree is out of date. To commit, update the working tree.Wrong encodingXDG e-mail clientYou should provide a commit message.You should specify tag name[binary file (%d bytes)]\ No newline at end of fileaddedadded filesadded, missingbug #%scontents conflictdeleted filesdeleting parentdirectoryduplicateduplicate idfilefixedignoredmissingmissing parentmodifiedmodified filesmovednon-directory parentnon-versionedold_cmdlineparent looppath conflictremovedrenamedrenamed and modifiedrenamed filessymlinktext conflictunversioned parentx-bitProject-Id-Version: qbzr Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2012-06-09 17:58+0000 Last-Translator: Alfredo Hernández Language-Team: English (United Kingdom) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) %d conflict auto-resolved.%d conflicts auto-resolved.%d file%d files&About...&Action:&Add&Add Bookmark...&Annotate this revision&Author:&Bookmarks&Branch&Browse...&Cancel&Change the values&Close&Command:&Commit&Complete&Configure...&Diff&Edit&Edit Bookmark...&Editor:&External Diff&File&Filter&Find&Fixed bugs:&Help&Help...&Ignore and proceed&Ignore whitespace changes&Launch...&Local commit&Location:&Mark as moved&Mark as moved and renamed&Mark as renamed&Merge&Merge conflict&Name:&OK&Open&Options and arguments for command:&Push&Quit&Refresh&Remove Bookmark...&Retry&Revert&Revision:&Search:&Select...&Show hidden commands&Tag name:&To:&Update to this revision&User Interface&View&View Options&View file&Working directory:(bzr-config-dir)(bzr-lib-path)(bzr-log-file)(bzr-version)(no description)(no message)(python-file)(python-lib-dir)(python-version)...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/QBzrA commit will be made directly to the master branch, keeping the local and master branches in sync.A local commit to the branch will be performed. The master branch will not be updated until a non-local commit is made.AbbreviationAborted!Aborting...About QBzrActionAddAdd BookmarkAddress:AliasAliasesAll conflicts resolved.AnnotateArchive type:Are you sure you want to revert this file to the state it was at the selected revision?AuthorAuthor:AuthorsAuto-resolveBase directory for &checkouts:Bazaar ConfigurationBazaar LibraryBindBind branchBind to:BookmarksBound to:BranchBranch location:Branch source (enter a URL or select a local directory with an existing branch)Branch:Branch: %sBrowseBrowse...Bug TrackersBug:Bugs:BugsBuiltin DiffC&ategory:ChangedChangesCheckout of branch:Children:Click a link for more information about checkouts and branches.Close %s WindowClose ApplicationClose Error DialogueClose WindowClose findCommandCommand LineCommitCommit changes into a new revisionCommitter:CompleteComputerConfigurationConflictConflictsCould not locate "bzr" script.Could not locate "bzr.exe".Create Branch before switchingCreate a checkoutCreate a new Bazaar Working TreeCreate a new shared repositoryCreate a new standalone treeCreate a stacked branch referring to the source branchCreate new tagCreate the path up to the branch if it does not existCurrently bound to:DateDate:DefaultDelete existing tagDescriptionDescription of formatDescription:DiffDirectoryDo not save backups of reverted filesDo you really want to remove the selected bookmark?Do you really want to revert the selected file(s)?Do you really want to uncommit these revisions?Do you want to continue anyway?E-&mail:E-mail &client:Edit BookmarkEdit tagEditorEncodingEncoding "%s" is invalid or not supported.Encoding:Ensure all revisions are appended to the logEnter PasswordEnter UsernameEnter the author's name, e.g. John Doe <jdoe@example.com>Enter the commit messageEnter the list of bug IDs in format tag:id separated by a space, e.g. project:123 project:765ErrorError while running bzr. (error code: %d)Error while running merge tool (code %d)EvolutionExportExtensionExternal Diff Applications:External MergeFailed to start bzr.Failed!FileFile %s is not versioned. Operation aborted.File NameFilename:FindFind on active panelFinished!Forget pending mergesGeneralGoHeavyweight checkout:HelpHelp for commandIgnore ErrorIgnore all files with this extensionIgnoredImport old external merge toolInclude a bundle in the merge directiveInclude a preview patch in the merge directiveInfoInitialiseInsert &directory...Insert &filenames...It is not possible to specify different file paths and different branches at the same time.KMailKind:Last modified:Launch an external diff applicationLayoutLayout %dLibrary:Lightweight checkoutLightweight checkout:Loading...Local DirectoryLocal commits are not pushed to the master branch until a normal commit is performedLocal directory where the working tree will be createdLocation:LocationsLogLog File:M&erge tool:MAPI e-mail clientMake a local copy of the branchMark as &resolvedMark conflict &resolvedMaster branch location not specified.MergeMerge Directive OptionsMerge PreviewMerge even if the working tree has uncommitted changesMerge uncommitted changes instead of committed onesMessageMessage:MessagesMessages and File text (indexed)Missing the flag: %s. Configure in qconfig under the merge tab.Most recent (tip) revisionMove existing tagMove tip toMuttNameNo action selectedNo changes found.No changes selected to commitNo changes selected to commit. Do you want to commit anyway?No changes selected to revertNo help can be found for %sNo other revision specified.No working tree exists for "%s"Not a branch "%s"Not a branch: %sNot a fileOperation is supported for a single file only, not for a %s.OptionsOther revision:Overwrite differences between branchesParent of current tip revisionParents:Path:Pending MergesPlug-insPlug-ins installed: %(rows)dProperties:Pu&llPublic Branch:PullPull a different branchPull most recent changes from:PushPython InterpreterR&evert to this revisionRe&nameReadyRefresh the directory treeRemember these locations as defaultsRemember this as the new parent branchRemember this location as a defaultRemoveRemove BookmarkReport Bazaar ErrorRepositoryRepository Format:RevRev %(rev)s for %(branch)sRev %sRevertRevert %s to revision %s revid:%s.Revert FileRevert to this revisionRevid: %(revid)s for %(branch)sRevid: %sRevisionRevision %sRevision IDsRevision NumbersRevision:Revisions:Root directory name:Run bzr commandSave file in this revision as...Save file on this revision as...Select / deselect allSelect Source DirectorySelect Target DirectorySelect base directory for checkoutsSelect branch locationSelect changes to revertSelect default directory for branch sourcesSelect editor executableSelect files to insertSelect path to insertSelect working directorySendSet the IDs of bugs fixed by this commitSet the author of this change, if it's different from the committerSet up external_merge application in qconfig under the Merge tabSettings:ShowShow &annotateShow &differencesShow &differences...Show &logShow &tree...Show Log...Show all &differencesShow all &differences...Show file &differencesShow file &differences...Show ignored filesShow inter-group inserts and deletes in green and redShow non-versioned filesSignature:Simulate to apply changes in shelf[%(id)d] without changing working treeSizeSkip the creation of working trees in this repositorySpell check &language:Starting...StatusStatus:Submit Branch:SummarySwitchSwitch checkoutSwitch to branch:System InformationTab &Width:Tab WidthTab widthTab width in characters option is used in qdiff, qannotate and qcat windowsTagTag "%s" already exists. Do you want to move existing tag?Tag "%s" does not existsTag "%s" does not exists yet. Do you want to create new tag?Tag &revision...TagsTags:Take "&OTHER" versionTake "&THIS" versionThe extmerge definition: '%(tool)s' is invalid. Missing the flag: %(flags)s. This must be fixed in qconfig under the Merge tab.This directory is a branch. Please select what you would like to updateThis directory is a checkout of: %sThis directory will be automatically filled in your branch source input fieldThis directory will be automatically filled in your checkout destination input fieldThunderbirdTurn this branch into a mirror of another branchURLUnbindUnbind branchUnchangedUncommitUncommited Working Tree ChangesUnidiffUnknown FilesUnversionedUnversioned FilesUpdateUpdate %s to revision %s revid:%s.Update BranchUpdate CheckoutUpdate a mirror of this branchUpdate sourceUpdate the working tree from the bound branchUpdate to revision %s revid:%s.Update tree %sUpdate working treeUpdate working tree to the latest changes in the branchUse existing directoryVersionVersion:ViewView OptionsView binary fileView changes in files selected to commitView changes in files selected to revertView directoryView fileView image fileView symlinkView text fileWord WrapWorking TreeWorking Tree OptionsWorking Tree for %sWorking tree has uncommitted changes.Working tree is out of date, please run 'bzr update'.Working tree is out of date. To commit, update the working tree.Wrong encodingXDG e-mail clientYou should provide a commit message.You should specify tag name[binary file (%d bytes)]\ No newline at end of fileaddedadded filesadded, missingbug #%scontents conflictdeleted filesdeleting parentdirectoryduplicateduplicate idfilefixedignoredmissingmissing parentmodifiedmodified filesmovednon-directory parentnon-versionedold_cmdlineparent looppath conflictremovedrenamedrenamed and modifiedrenamed filessymlinktext conflictunversioned parentx-bit././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/es/LC_MESSAGES/0000755000000000000000000000000014556556456014275 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/es/LC_MESSAGES/qbrz.mo0000644000000000000000000007161314556556456015620 0ustar00<_\%6%& !&+&4&9&J&b&k& r&}& &&&& && & &&&&&' ' ''$'-' A' L' Z'e't'''''''#''''((( $(/( 8(C( Y(d(i((( ( ((((( () ) ).)?)P)T)k)) *c*w* r++ + +++ ++++++ ++, , ,8!,Z,o,~, ,, , ,,,O,- -'- .- 8- E-P- U- b-m-u-}- -?--- . . ."."). L.W.`. i.w.. ..... ./>/6[//5//////0 0%0 ;0H0P0 U0%_03020/01<1E1 U1c1l1s1*|1 1,111F1C2k\22)2(2 !3+3 23<3P3_3-t3333,3 3 34 44*424 54 ?4K4a4f4w4 ~4$4 44'4.45 5)5>5S5Y5_5n5w55 55T566 J6 T6^6 b6 l6y6666%667 76(73_7777 7?78)8 ;8G8L8Q8 V8`8s88<888"969S9s99 99:999& :3:R:[:a:p:x:: ::::::::;+;3;9;$T;&y;#;;;; ;; <<<<:<A< H<T<l< << < << < <<<==1= I=T=k======(=C>8U> >>>>> > >> ??$?=?T?n?5?? ??5?@ -@9@@@H@W@_@f@v@@@:@@<@0AAAFALAHA#B 9B0EBvBzB B BBBB B B BBC CC(C GC-UCCC7C CCDDD#D (D5D(FD(oDD DD DDD D D DEE1E%ME5sEEE)E'EF:FVFoFFF FFFF F FF F G GGG%G-G5GDGMG \G jG xGGG G G GGGGG GH HH*H0H9I&J =J KJUJ^JsJJJ JJ J JJJ JJJ K KKK/K8KAKIK]K dKnK K K KK KK KKLL$L'+LSL\L cLoL L L LLLLLLLM'M ,M :MGM_M~MM MM M MMM N N,N HNSOseOpO JP VP bPoP~PPP P P PPPPPQ Q Q=Q]QvQQ Q Q Q QQQgQFRLRUR ^RjRRRR RRRRRSR6SLSeSwSSS%S S SSS S S S( T"2TUTrT*T%T#T9U?U%XU~UUUUUU UU U VV V-"V4PV;V3V"VW -WNW^WnW uW4WW@WXXP?XXX;Y-AYCoY YY Y0YZ Z53ZiZ ZZ5ZZZZ Z[[$['[6[G[V[\[r[ z[.[ [[*[0[ )\ 6\B\Z\z\\\ \\\ \\_\8J] ] ]]]]] ] ^!^.A^p^x^^=^3^#_+_4_+=_Si___ _`` ``%&`L`&j`O`&`a$%a%Ja%paaaaaIa4b=b$Mb(rb bbb bbb bc cc!c%=ccckcc ccc&c(c1dCdLd^d zddd dd!ddddd e 8e Be LeYeie e eeeeef#f!4f"Vfyf"ff!ff5fA,gMnggggggh%h8hWhih!h h#hhG iRiriyi=ii iii ij jj!j1jJjFSjjjj j jkGk+k l*lEl IlTl elql'llll ll mm#m!rGr `rkrrrrrr r rr r s ss6sKs_sqsspo~*<4C,V')^j3*~A!5+^EmmS\9aPCxdYv #;M Od0<|kun9RLs(Y>-Fbfs$g%} BNer {8/]+`Eg:t&RG:IDJ4!wh`X&.H53D?H{ZTnezw21]c/ xX  oZ f6Q7#,c[L2.UyQ'jr_IFP_Bay(iJ@U=K >W |bl "Ai[-tT}lhk?G68WKpM")$%0 vqu\@V=N;zO17qS%d conflict auto-resolved.%d conflicts auto-resolved.%d file%d files&About...&Action:&Add&Add Bookmark...&Annotate this revision&Author:&Basic&Bookmarks&Branch&Browse...&Cancel&Change the values&Close&Command:&Commit&Configure...&Detailed&Diff&Edit&Edit Bookmark...&Editor:&File&Filter&Fixed bugs:&Help&Help...&Ignore and proceed&Launch...&Local commit&Location:&Mark as moved&Mark as moved and renamed&Mark as renamed&Merge&Merge conflict&Name:&OK&Open&Options and arguments for command:&Push&Quit&Refresh&Remove Bookmark...&Retry&Revert&Revision:&Search:&Select...&Show hidden commands&Tag name:&To:&Update to this revision&User Interface&View&View Options&View file&Working directory:(bzr-config-dir)(bzr-lib-path)(bzr-log-file)(bzr-version)(no description)(no message)(python-file)(python-lib-dir)(python-version)...<<< Hide Error DetailsQBzr — 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/QBzrA commit will be made directly to the master branch, keeping the local and master branches in sync.A local commit to the branch will be performed. The master branch will not be updated until a non-local commit is made.AbbreviationAborted!Aborting...About QBzrActionAddAdd BookmarkAddress:AliasAliasesAll conflicts resolved.AnnotateArchive type:AuthorAuthor:AuthorsAuto-resolveBazaar 2.4 or newer is required to configure mergetools.Bazaar ConfigurationBazaar LibraryBindBind branchBind to:BookmarksBound to:BranchBranch location:Branch source (enter a URL or select a local directory with an existing branch)Branch:Branch: %sBrowseBrowse...Bug TrackersBug:Bugs:BugsBuiltin DiffC&ategory:ChangedChangesCheckout of branch:Children:Click a link for more information about checkouts and branches.Close ApplicationClose Error DialogClose WindowCommandCommand LineCommitCommit changes into a new revisionCommitter:CompleteComputerConfigurationConfirmConflictConflictsCould not locate "bzr" script.Could not locate "bzr.exe".Create Branch before switchingCreate a checkoutCreate a new Bazaar Working TreeCreate a new shared repositoryCreate a new standalone treeCreate a stacked branch referring to the source branchCreate new tagCreate the path up to the branch if it does not existCurrently bound to:DateDate:DefaultDeleteDelete existing tagDescriptionDescription of formatDescription:DestroyDiffDirectoryDo not save backups of reverted filesDo you really want to remove the selected bookmark?Do you really want to revert the selected file(s)?Do you really want to uncommit these revisions?Do you want to continue anyway?E-&mail:E-mail &client:Edit BookmarkEdit tagEditorEncodingEncoding "%s" is invalid or not supported.Encoding:Ensure all revisions are appended to the logEnter PasswordEnter UsernameEnter the author's name, e.g. John Doe <jdoe@example.com>Enter the commit messageEnter the list of bug IDs in format tag:id separated by a space, e.g. project:123 project:765ErrorError while running bzr. (error code: %d)Error while running merge tool (code %d)EvolutionExportExtensionExternal Diff Apps:External MergeExternal Merge ToolsExternal merge tool %(tool)s is not availableFailed to start bzr.Failed!FileFile %s is not versioned. Operation aborted.File NameFilename:FindFinished!Forget pending mergesGeneralGoGoto LineGoto Line: Heavyweight checkout:HelpHelp for commandIgnoreIgnore ErrorIgnore all files with this extensionIgnore asIgnoredInclude a bundle in the merge directiveInclude a preview patch in the merge directiveInfoInitializeInsert &directory...Insert &filenames...KMailKind:Last modified:Library:Light-weight checkoutLightweight checkout:Loading...Local DirectoryLocal commits are not pushed to the master branch until a normal commit is performedLocal directory where the working tree will be createdLocation:LocationsLogLog File:M&erge tool:MAPI e-mail clientMake a local copy of the branchMark as &resolvedMark conflict &resolvedMaster branch location not specified.MergeMerge Directive OptionsMerge PreviewMerge even if the working tree has uncommitted changesMerge uncommitted changes instead of committed onesMessageMessage:MessagesMessages and File text (indexed)Missing the flag: %s. Configure in qconfig under the merge tab.Most recent (tip) revisionMove existing tagMove tip toMuttNameNextNo actionNo action selectedNo changes found.No changes selected to commitNo changes selected to commit. Do you want to commit anyway?No changes selected to revertNo changes selected.No help can be found for %sNo other revision specified.No working tree exists for "%s"Not a branch "%s"Not a branch: %sNot a fileNothing selected to addOperation aborted because working tree has pending merges.OptionsOther revision:Overwrite differences between branchesParent of current tip revisionParents:Path:Pending MergesPluginsPlugins installed: %(rows)dPreviousProperties:Pu&llPublic Branch:PullPull a different branchPull most recent changes from:PushPython InterpreterR&evert to this revisionRe&nameReadyRefresh the directory treeRemember these locations as defaultsRemember this as the new parent branchRemember this location as a defaultRemoveRemove BookmarkReport Bazaar ErrorRepositoryRepository Format:ResolveRetryRevRev %(rev)s for %(branch)sRev %sRevertRevert FileRevert to this revisionRevid: %(revid)s for %(branch)sRevid: %sRevisionRevision %sRevision IDsRevision NumbersRevision:Revisions:Root directory name:Run bzr commandSelect / deselect allSelect Source DirectorySelect Target DirectorySelect allSelect branch locationSelect changes to revertSelect editor executableSelect files to insertSelect path to insertSelect working directorySendSet the IDs of bugs fixed by this commitSet the author of this change, if it's different from the committerSet up external_merge app in qconfig under the Merge tabSettings:ShowShow &annotateShow &differencesShow &differences...Show &logShow &tree...Show Error Details >>>Show Log...Show all &differencesShow all &differences...Show file &differencesShow file &differences...Show ignored filesShow inter-group inserts and deletes in green and redShow non-versioned filesSignature:SizeSkip the creation of working trees in this repositorySpell check &language:Starting...StatusStatus:Submit Branch:SummarySwitchSwitch checkoutSwitch to branch:System InformationTagTag "%s" already exists. Do you want to move existing tag?Tag "%s" does not existsTag "%s" does not exists yet. Do you want to create new tag?Tag &revision...TagsTags:The extmerge definition: '%(tool)s' is invalid. Missing the flag: %(flags)s. This must be fixed in qconfig under the Merge tab.This directory is a branch. Please select what you would like to updateThis directory is a checkout of: %sThunderbirdTurn this branch into a mirror of another branchURLUnbindUnbind branchUnchangedUncommitUncommited Working Tree ChangesUnidiffUnknown FilesUnselect allUnversionedUnversioned FilesUpdateUpdate BranchUpdate CheckoutUpdate a mirror of this branchUpdate sourceUpdate the working tree from the bound branchUpdate tree %sUpdate working treeUpdate working tree to the latest changes in the branchUse editorUse existing directoryVerify SignaturesVersionVersion:ViewView OptionsView binary fileView changes in files selected to commitView changes in files selected to revertView directoryView fileView image fileView symlinkView text fileWarningWhole wordsWord WrapWorking TreeWorking Tree OptionsWorking Tree for %sWorking tree has conflicts.Working tree has uncommitted changes.Working tree is out of date, please run 'bzr update'.Wrong encodingXDG e-mail clientYou have not selected anything to revert.You should select destination directoryYou should specify a locationYou should specify tag name[binary file (%d bytes)]\ No newline at end of fileadd fileaddedadded filesadded, missingbug #%scontents conflictdelete filedeleted filesdeleting parentdirectoryduplicateduplicate idfilefixedignoredmissingmissing parentmodifiedmodified filesmodify binarymodify targetmodify textmovednon-directory parentnon-versionedparent looppath conflictremovedrenamerenamedrenamed and modifiedrenamed filessymlinktext conflictunversioned parentx-bitProject-Id-Version: qbzr Report-Msgid-Bugs-To: POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2012-08-26 03:52+0000 Last-Translator: Adolfo Jayme Barrientos Language-Team: Spanish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) %d conflicto auto-resuelto.%d conflictos auto-resueltos.archivo %darchivos %d&Acerca de...&Acción:&Agregar&Añadir Marcador...&Anotar esta revisión&Autor:&Básico&Marcadores&Rama&Examinar...&Cancelar&Cambiar los valores&Cerrar&Comando:&Enviar&Configurar...&Detallado&Diff&Editar&Editar Marcador...&Editor:&Fichero&FiltroErrores &arreglados&Ayuda&Ayuda...&Ignorar y proceder&Lanzar...Envío &local&Ubicación:&Marcar como movido&Marcar como movido o renombrado&Marcar como renombrado&CombinarRa&ma en conflicto&Nombre:&Aceptar&Abrir&Opciones y argumentos para el comando:&Empujar&SalirActualiza&r&Eliminar Marcador...&Reintentar&Revertir&Revisión:&Buscar:&Seleccionar...Mo&strar comandos ocultosNombre de e&tiqueta&Para:Act&ualizar a esta revisiónInterfaz de &usuario&Ver&Ver opciones&Ver archivoDirectorio de &trabajo:(directorio-configuracion-bzr)(ruta-bzr-lib)(archivo-bzr-minuta)(version-bzr)(sin descripción)(sin mensaje)(python-file)(directorio-python-lib)(versión-python)...<<< Ocultar detalles del errorQBzr — Interfaz gráfica de usuario para Bazaar
Versión %(qbzr_version)s (bzrlib %(bzrlib_version)s)

Marca Registrada © 2006-2008 Lukáš Lalinský y otros

http://bazaar-vcs.org/QBzrUna confirmación se hará directamente a la rama principal, manteniendo las ramas local y principal sincronizadas.Un envío local será realizado. La rama maestra no será actualizada hasta que un envío no-local sea generado.Abreviatura¡Abortado!Abortando...Acerca de QBzrAcciónAñadirAñadir MarcadorDirección:SobrenombreSobrenombresTodos los conflictos resueltos.AnotarTipo de archivo:AutorAutor:AutoresAuto-resolverSe necesita Bazaar 2.4 o superior para configurar mergetools.Configuración de BazaarBiblioteca de BazaarEnlazarEnlazar ramaEnlazar a:MarcadoresEnlazado a:RamaUbicación de la rama:Código de la rama (introducir un URL o seleccione un directorio local que contenga una rama existente)Rama:Rama: %sExaminarExplorar...Seguidores de erroresError:Errores:ErroresDiferencia incorporadaC&ategoriaCambiadoCambiosPedido de rama:Hijos:Clic sobre el enlace para mayor información acerca de las ramas y ramas enlazadas.Cerrar la aplicaciónCerrar diálogo de errorCerrar la ventanaComandoLínea de órdenesEnviarEnvíe cambios en una nueva revisiónRemitente:TerminadoEquipoConfiguraciónConfirmarConflictoConflictosNo se puede localizar el guión «bzr».No se puede localizar «bzr.exe».Crear rama antes de cambiar:Crear una nueva rama enlazadaCrear un nuevo árbol de trabajo de BazaarCrear un nuevo repositorio compartidoCrear un nuevo árbol independienteCrear una rama apilada refiriéndose al origen de la ramaCrear una nueva etiquetaCrear la ruta de la rama si no existeActualmente enlazada a:FechaFecha:PredeterminadoEliminarBorrar etiqueta existenteDescripciónDescripción del formatoDescripción:DestruirDiffDirectorioNo almacenar respaldos de archivos recargados¿Realmente desea eliminar el marcador seleccionado?Realmente desea revertir el/los archivo(s) seleccionado(s)?Realmente desea eliminar estas revisiones enviadas?¿Desea continuar de todas formas?&Correo electrónico&Cliente de correo electrónico:Editar MarcadorEditar etiquetaEditorCodificaciónLa codificación «%s» es inválida o no soportada.Codificación:Asegurarse que todas las revisiones estén agregadas a la minutaIntroduzca contraseñaIntroduzca el nombre de usuarioIntroduzca el nombre del autor, ejemplo John Doe <:jdoe@ejemplo.com>Introduzca el mensaje de envíoIntroduzca la lista de IDs de los errores en formato etiqueta:id separado por un espacio, ejemplo proyecto:123 proyecto:765ErrorError al ejecutar bzr. (código de error: %d)Error durante la ejecución de la herramienta de mezclado (code %d)EvolutionExportarExtensiónAplicaciones externas de gestión de diferenciasMezcla externaHerramientas de fusión externasHerramienta de fusión externa %(tool)s no disponibleFallo al iniciar bzr.¡Fallido!ArchivoArchivo %s no se encuentra bajo control de versiones.Nombre de archivoNombre de archivo:Buscar¡Terminado!Olvidar mezclas pendientesGeneralIrIr a la líneaIr a la línea: Pedido pesado:AyudaAyuda para el comandoIgnorarIgnorar errorIgnorar todos los archivos con esta extensiónIgnorar comoIgnoradoIncluir un paquete en la norma de mezcladoIncluir un parche previo en la norma de mezcladoInformaciónInicializarInsertar &directorio...Insertar nombres de archivos...KMailTipo:Última modificación:Biblioteca:Rama enlazada ligeraPedido ligero:Cargando…Directorio localLos envíos locales no pueden actualizar la rama principal hasta que se genere un envío normalDirectorio local donde el árbol de trabajo será creadoUbicación:UbicacionesMinutaArchivo de registro:Herramienta de m&ezclado:Cliente de correo-e MAPICrear una copia local de la ramaMarcar como &resueltoMarcar conflicto como &resueltoLocalización de rama maestra no especificada.MezclarNorma de Opciones de MezcladoVista previa de la fusiónMezclar aún si el árbol de trabajo tiene cambios sin enviarMezclar cambios sin enviar en lugar de los enviadosMensajeMensaje:MensajesMensajes y texto del Archivo (bajo índice)No se encontró la bandera: %s. Configúrela en qconfig bajo la pestaña de mezcla.La revisión mas recienteMover a etiqueta existenteMover punta aMuttNombreSiguienteNinguna acciónNo se ha seleccionado ninguna acciónNo se han encontrado cambios.No se seleccionaron cambios a realizarNo hay cambios seleccionados para confirmar. ¿Desea confirmar de todas formas?No se seleccionaron cambios a revertirNingún cambio seleccionado.No se encuentra ayuda para %sNo se ha especificado otra revisión.No existe árbol de trabajo para "%s"No una rama "%s"No es una rama: %sNo es un archivoNada seleccionado para añadirOperació abortada porque el árbol de trabajo tiene fusiones pendientes.OpcionesOtra revisión:Sobrescribir diferencias entre ramasPadre de la punta de la revisión actualFamiliares:Ruta:Fusiones pendientesComplementosComplemento instalado %(rows)dAnteriorPropiedades:&EmpujarRama pública:JalarJalar de una rama diferenteObtener los cambios mas recientes de:EmpujarIntérprete de PythonR&evertir a esta revisiónRe&nombrarListoActualiza las ramasRecordar esta posición como estándarRecordar ésta como la nueva rama origenRecordar esta ubicación de manera predeterminadaEliminarEliminar MarcadorInformar de error en BazaarRepositorioFormato del repositorio:ResolverReintentarRevRevisión %(rev)s para %(branch)sRev %sRevertirRevertir el archivoRevertir a esta revisiónRevid: %(revid)s para %(branch)sRevid: %sRevisiónRevisión %sIDs de revisionNúmeros de revisiónRevisión:Revisiones:Nombre del directorio raízEjecutar comando: bzrSeleccionar/deseleccionar todoSeleccione Directorio OrigenSeleccione Directorio ObjetivoSeleccionar todoSeleccionar ubicación de la ramaSeleccione los cambios a revertir.Seleccionar editorSeleccione los archivos a insertarSeleccione la ruta a insertarSeleccionar directorio de trabajoEnviarEstablezca el ID del error arreglado para este envíoEstablezca el autor del cambio, si es diferente del que lo envíaAsigne la aplicación de external_merge en qconfig bajo la pestaña de MezclaConfiguraciones:MostrarMostrar &anotaciónMostrar &diferenciasMostrar &diferencias...Mostrar minutaMos&trar árbol...Mostrar detalles del error >>>Mostrar Minuta...Mostrar todas las &diferenciasMostrar todas las &diferencias...Mostrar &diferencias del archivoMostrar &diferencias del archivo...Mostrar archivos ignoradosMostrar inserciones y elementos eliminados entre-grupos en verde y rojoMostrar archivos no versionadosFirma:TamañoEvitar la creación de arboles de trabajo en este repositorioRevisar ortográficamenteIniciando...EstadoEstado:Enviar rama:ResumenCambiarCambiar pedidoCambiar a rama:Información del sistemaEtiquetaEtiqueta '%s' existe actualmente. ¿Desea mover la etiqueta existente?La etiqueta «%s» no existeEtiqueta "%s" no existe aún.Etiqueta &revision...EtiquetasEtiquetas:La definición extmerge: '%(tool)s' no es válida. Falta la bandera: %(flags)s. Esto debe ser corregido en qconfig en la ficha Combinar correspondencia.Este directorio es una rama. Por favor seleccione cual desea actualizarEste directorio es una rama enlazada de: %sThunderbirdVolver esta rama en un espejo de otra ramaURLDesenlazarRama desenlazadaSin cambiosDeshacer envíoCambios al Árbol de trabajo sin enviarEstilo clásicoArchivos desconocidosDeseleccionar todoSin versionarArchivos no versionadosActualizarActualizar ramaActualizar Rama EnlazadaActualizar un espejo de esta ramaActualizar fuenteActualizar el árbol de trabajo a partir de la rama enlazadaActualizar árbol %sActualizar árbol de trabajoActualizar árbol de trabajo con los últimos cambios de la ramaUsar editorUsar directorio existenteVerificar firmasVersiónVersión:VerVer opcionesVer archivo binarioVer cambios en archivos seleccionados para ejecutarVer cambios en archivos seleccionados para revertirVer directorioVer archivoVer archivo de imagenVer vínculo simbólicoVer archivo de textoAvisoPalabras completasAjuste de líneaÁrbol de trabajoOpciones del árbol de trabajoÁrbol de trabajo para %sEl árbol de trabajo tiene conflictos.Árbol de trabajo tiene cambios sin enviar.El árbol de trabajo está desactualizado, ejecute «bzr update».Codificación equivocadaCliente de correo-e XDGNo seleccionó nada para revertir.Debe seleccionar la carpeta de destinoDebe especificar una localizaciónDebe especificar un nombre de etiqueta[aarchivo binario (%d bytes)]\No hay nueva linea al final del archivoañadir archivoañadidoarchivos añadidosagregados, faltanteserror #%sconflicto de contenidoseliminar archivoarchivos borradosborrando padredirectorioduplicadoid duplicadoarchivocorregidoignoradofaltanteno se encuentra el padremodificadoarchivos modificadosmodificar binariomodificar objetivomodificar textoMovidopadre no-directoriono versionadociclo padreconflicto en la rutaeliminadorenombrarrenombradorenombrado y modificadoarchivos renombradosvínculo simbólicotexto conflictivopadre sin versionarx-bit././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/et/LC_MESSAGES/0000755000000000000000000000000014556556456014276 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/et/LC_MESSAGES/qbrz.mo0000644000000000000000000005677014556556456015630 0ustar00| 6  # , 1 B Z c n v            ! ! !%!4!O!`!g!w!~!!#!!!!!!! !! !" "$")"9" ?"J"^"o"~" "" " """""#c $wo$ $$ $ %%% %,%5%;%C%[% d%r%y%% %%%% %% % %%%O&P& X&c& j& t& && & &&&& &?&''"&' I'T']' f't' }''' '''6(L(5[(((((( (( (( )% )30)2d)))) )))*) *,#*P*_*Fn**k*:+)@+(j+ +++++++,+ , , *,4,J,R,h,m,~,',.,, ,,---#-2-;-Q- g-r-T-6- . .". &. 0.=.P.p..%... .6.3#/W/_/h/ q/?////0 00<90v0"0000111&/1V1_1e1t1|1 11111111 222$62&[2#222 2222233 (323 ;3 G3T3 e3 o3z33333334.4E4[4t4(y4C484 5)5.5=5O5 d5 n5 |5555555516J65O66 666666666 7:7I7<b77777H;8#8 80888 8 89(9 09<9 N9\9l9 999799 :::!:(2:([:: :: :: :::%:5%;[;j;|;;; ;;;; ;; < < !<.<3<9<A<I<X<a<p<v< < < <<<< << <<==P>$? 5? ??I?O?e?}??? ? ??? ? ? ? ?? @@ @)@<@A@ I@V@ j@t@'@@@@@@@#@AA $A0AIA XA bAmAvAA A AAA AAAABB.BAB QB_BuBBBBVCfCfD nDxD DDDDDDDD D DEEEE.E CEPE WE cE nE |EE EHEEEE EF F!F&F =FJF SF^F pFC|FF FF FFG GG #G.GHGXGqGG+G G(GHH H (H2H JHTH gHrH{H-H6H5H)IIIRIbI {II,I I.IIJJJgJqJJ-J8&K _KiKrKKK KK8K L LL$L;LCL`L dL pL)}L1LLLLMMM%M7M=MQM oM|MSM(M NNN !N+NANUNoNN#NNNN;N30OdOkOsO'|O<OOOPP!P,6PEcP*PP!P"Q7QHQZQbQ'rQQQQQQ QQ QR R" RCRJRaRpRwR$R R"RRSSS,S0SMS TS!bS SS SSS S SSSTT-T?TQTqTTTTT5T.U;=U yUUUUU UUUUV+VCV^VBsVVV.VW W.W3W 9W EWPWXWpWWWEWW<W:XLXSX[X:XY 8Y(DYmY qY {YY!YY YY YYYZ+Z:Z*KZvZZ ZZZ,Z0Z![ 5[A[V[j[[[[&[1[\\)\ I\j\r\\\ \\\\ \ \\ \ \] ]]%] 5]@] R] ^]j] z]]]]]]]]:  kr"JZU;!1 7x Ecq"'=N%mPX<9;)IJas9/O`pj6'\4iM#S_W>$^+ISmBE}{cGe!\hYR2RQTV6 |*?Vifght#F^ker:/uA|uQ &8 5bXHvTWw0fb,O 2jlU 7Bz@&N<= -Ky3(-z $Yn,.HCyL%D0d>s?pC1D)K+(*xaF]vPtL[Zdo q].nw3~4MGgol{A_8`5@[%d conflict auto-resolved.%d conflicts auto-resolved.%d file%d files&About...&Action:&Add&Add Bookmark...&Annotate this revision&Author:&Bookmarks&Branch&Browse...&Cancel&Close&Command:&Commit&Configure...&Diff&Edit&Edit Bookmark...&Editor:&File&Filter&Fixed bugs:&Help&Help...&Launch...&Local commit&Location:&Mark as moved&Mark as moved and renamed&Mark as renamed&Merge&Merge conflict&Name:&OK&Open&Options and arguments for command:&Push&Quit&Refresh&Remove Bookmark...&Retry&Revert&Revision:&Search:&Select...&Show hidden commands&Tag name:&To:&User Interface&View&View file&Working directory:(bzr-config-dir)(bzr-lib-path)(bzr-log-file)(bzr-version)(no description)(no message)(python-file)(python-lib-dir)(python-version)...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/QBzrA commit will be made directly to the master branch, keeping the local and master branches in sync.A local commit to the branch will be performed. The master branch will not be updated until a non-local commit is made.AbbreviationAborted!Aborting...About QBzrActionAddAdd BookmarkAddress:AliasAliasesAll conflicts resolved.AnnotateArchive type:AuthorAuthor:AuthorsAuto-resolveBazaar ConfigurationBazaar LibraryBindBind branchBind to:BookmarksBound to:BranchBranch location:Branch source (enter a URL or select a local directory with an existing branch)Branch:Branch: %sBrowseBrowse...Bug TrackersBug:Bugs:BugsBuiltin DiffC&ategory:ChangedChangesCheckout of branch:Children:Click a link for more information about checkouts and branches.CommandCommitCommit changes into a new revisionCommitter:CompleteComputerConfigurationConflictConflictsCreate Branch before switchingCreate a checkoutCreate a new Bazaar Working TreeCreate a new shared repositoryCreate a new standalone treeCreate a stacked branch referring to the source branchCreate new tagCreate the path up to the branch if it does not existCurrently bound to:DateDate:DefaultDelete existing tagDescriptionDescription of formatDescription:DiffDirectoryDo not save backups of reverted filesDo you really want to remove the selected bookmark?Do you really want to revert the selected file(s)?Do you want to continue anyway?E-&mail:E-mail &client:Edit BookmarkEdit tagEditorEncoding "%s" is invalid or not supported.Encoding:Ensure all revisions are appended to the logEnter PasswordEnter UsernameEnter the author's name, e.g. John Doe <jdoe@example.com>Enter the commit messageEnter the list of bug IDs in format tag:id separated by a space, e.g. project:123 project:765ErrorError while running bzr. (error code: %d)Error while running merge tool (code %d)EvolutionExportExternal Diff Apps:External MergeFailed to start bzr.Failed!FileFile %s is not versioned. Operation aborted.File NameFilename:Finished!Forget pending mergesGeneralHeavyweight checkout:HelpHelp for commandIgnoredInclude a bundle in the merge directiveInclude a preview patch in the merge directiveInfoInitializeInsert &directory...Insert &filenames...KMailKind:Last modified:Library:Light-weight checkoutLightweight checkout:Loading...Local DirectoryLocal commits are not pushed to the master branch until a normal commit is performedLocal directory where the working tree will be createdLocation:LocationsLogLog File:M&erge tool:MAPI e-mail clientMake a local copy of the branchMark as &resolvedMark conflict &resolvedMaster branch location not specified.MergeMerge Directive OptionsMerge PreviewMerge even if the working tree has uncommitted changesMerge uncommitted changes instead of committed onesMessageMessage:MessagesMessages and File text (indexed)Missing the flag: %s. Configure in qconfig under the merge tab.Most recent (tip) revisionMove existing tagMuttNameNo changes found.No changes selected to commitNo changes selected to commit. Do you want to commit anyway?No changes selected to revertNo help can be found for %sNo other revision specified.No working tree exists for "%s"Not a branch "%s"Not a branch: %sOptionsOther revision:Overwrite differences between branchesParents:Path:Pending MergesPluginsPlugins installed: %(rows)dProperties:Pu&llPublic Branch:PullPull a different branchPull most recent changes from:PushPython InterpreterRe&nameReadyRefresh the directory treeRemember these locations as defaultsRemember this as the new parent branchRemember this location as a defaultRemoveRemove BookmarkRepositoryRepository Format:RevRev %(rev)s for %(branch)sRev %sRevertRevid: %(revid)s for %(branch)sRevid: %sRevisionRevision %sRevision IDsRevision NumbersRevision:Revisions:Root directory name:Run bzr commandSelect / deselect allSelect Source DirectorySelect Target DirectorySelect branch locationSelect changes to revertSelect editor executableSelect files to insertSelect path to insertSelect working directorySendSet the IDs of bugs fixed by this commitSet the author of this change, if it's different from the committerSet up external_merge app in qconfig under the Merge tabSettings:ShowShow &annotateShow &differencesShow &differences...Show &logShow &tree...Show Log...Show all &differencesShow all &differences...Show file &differencesShow file &differences...Show ignored filesShow inter-group inserts and deletes in green and redShow non-versioned filesSizeSkip the creation of working trees in this repositorySpell check &language:Starting...StatusStatus:Submit Branch:SummarySwitchSwitch checkoutSwitch to branch:System InformationTagTag "%s" already exists. Do you want to move existing tag?Tag "%s" does not existsTag "%s" does not exists yet. Do you want to create new tag?Tag &revision...TagsTags:The extmerge definition: '%(tool)s' is invalid. Missing the flag: %(flags)s. This must be fixed in qconfig under the Merge tab.This directory is a branch. Please select what you would like to updateThis directory is a checkout of: %sThunderbirdTurn this branch into a mirror of another branchURLUnbindUnbind branchUnchangedUncommited Working Tree ChangesUnidiffUnversionedUnversioned FilesUpdate BranchUpdate CheckoutUpdate a mirror of this branchUpdate sourceUpdate tree %sUpdate working treeUpdate working tree to the latest changes in the branchUse existing directoryVersionVersion:ViewView binary fileView changes in files selected to commitView changes in files selected to revertView directoryView fileView image fileView symlinkView text fileWorking TreeWorking Tree OptionsWorking Tree for %sWorking tree has uncommitted changes.Working tree is out of date, please run 'bzr update'.Wrong encodingXDG e-mail clientYou should specify tag name\ No newline at end of fileaddedadded filesadded, missingbug #%scontents conflictdeleted filesdeleting parentdirectoryduplicateduplicate idfilefixedignoredmissingmissing parentmodifiedmodified filesmovednon-directory parentnon-versionedparent looppath conflictremovedrenamedrenamed and modifiedrenamed filessymlinktext conflictunversioned parentx-bitProject-Id-Version: qbzr Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2010-03-26 09:54+0000 Last-Translator: René Pärts Language-Team: Estonian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) %d konflikt on automaatselt lahendatud.%d konflikti on automaatselt lahendatud.%d fail%d failiTe&ave...&Tegevus:&Lisa&Lisa järjehoidja...&Annoteeri see versioon&Autor:&Järjehoidjad&Haru&Lehitse...&Katkesta&Sulge&Käsk:&Kanna sisse&Seadista...&Võrdlemine&Redigeeri&Redigeeri järjehoidjat...&Redaktor:&Fail&Filtreeri&Fikseeritud vead:&Abi&Abi...&Käivita...&Kohalik sissekanne&Asukoht:&Märgi liigutatuks&Märgi liigutatuks ja ümbernimetatuks&Märgi ümbernimetatuks&Liida&Liida konflikt&Nimi:&OK&Ava&Valikud ja argumendid käsu jaoks:&Lükka&Välju&Värskenda&Eemalda järjehoidja...&Proovi uuesti&Tühista&Versioon:&Otsing:&Vali...&Näita peidetud käske&Sildi nimi:&Kellele:&Kasutajaliides&Vaade&Vaata faili&Töökataloog:(bzr-seadistamine-kataloog)(bzr-lib-asukoht)(bzr-logifail)(bzr-versioon)(kirjeldus puudub)(sõnum puudub)(python-fail)(python-lib-kataloog)(python-versioon)...<Ülemharu näidatud siin>QBzr — Graafiline Bazaari kasutajaliides
Versioon %(qbzr_version)s (bzrlib %(bzrlib_version)s)

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

http://bazaar-vcs.org/QBzrSissekanne tehakse otse ülemharule, hoides sünkroonis kohalikku haru ning ülemharu.Teostatakse kohalik sissekanne harusse. Ülemharu ei uuendata kuniks tehakse mitte-kohalik sissekanne.LühendKatkenud!Katkestamine...QBzr'i infoToimingLisaLisa järjehoidjaAadress:AliasAliasedKõik konfliktid on lahendatud.AnnoteeriArhiivi liik:AutorAutor:AutoridAutomaatne lahendamineBazaari seadistamineBazaari teekKöidaKöida haruKöidetud:JärjehoidjadSeo siia:HaruHaru asukoht:Haru allikas (Sisesta URL või vali kohalik kataloog olemasoleva haruga)Haru:Haru: %sLehitseLehitse...Vigade jälgijadViga:Vead:VeadSisseehitatud võrdlus&Kategooria:MuudetudMuudatusedHaru väljavõte:Järglased:Väljavõtetest ja harudest rohkema info saamiseks klõpsa lingile.KäskKanna sisseKanna muudatused uude versiooniSissekandja:ValmisArvutiSeadistamineKonfliktKonfliktidLoo enne lülitamist haruLoo väljavõteLoo uus Bazaari tööpuuLoo uus jagatud hoidlaLoo uus eraldiseisev puuLoo rühmitatud haru viidates allika haruleLoo uus siltLoo haruni asukoht, kui seda pole olemasHetkel köidetud:KuupäevKuupäev:VaikimisiKustuta olemasolev siltKirjeldusVormingu kirjeldusKirjeldus:ErinevusKataloogÄra salvesta tagasivõetud failide varundusiKas sa tõesti soovid valitud järjehoidjat eemaldada?Kas sa tõesti soovid valitud faili(d) tagasi võtta?Kas sa soovid sellest hoolimata jätkata?E-&post:E-post &klient:Redigeeri järjehoidjaidMuuda siltiRedaktor"%s" kodeerimine on vigane või tugi puudub.Kodeering:Veendu, et kõik versioonid on logisse lisatudSisesta paroolSisesta kasutajanimi:Sisesta autori nimi nagu näiteks John Doe <jdoe@example.com>Sisesta sissekande sõnumSisesta vigade ID-loend formaadis silt:id eraldatud tühikuga nagu näiteks projekt:123 projekt:765VigaBzr käivitamisel tekkis viga. (vea kood: %d)Liitmise tööriista (code %d) käivitamisel tekkis vigaEvolutionEkspordiVälised erinevusrakendused:Väline liitmineBzr'i käivitamine nurjusEbaõnnestus!FailFail %s ei ole versioonitud. Operatsioon on katkestatud.Faili nimiFailinimi:Valmis!Unusta ootel liitmisedÜldineVäga põhjalik väljavõte:AbiAbi käsuleIgnoreeritudSisalda komplekti liidetud direktiividestSisalda liidetud direktiividest eelvaate asukohtaInfoInitsialiseeriSisesta &kataloog...Sisesta &failinimed...KMailLaad:Viimati muudetud:Teek:Lihtsam väljavõteVähem põhjalik väljavõte:Laadimine...Kohalik kataloogKohalikud sissekanded pole ülemharusse pandud kuniks tavaline sissekanne on tehtudKohalik kataloog, kuhu loodakse tööpuuAsukoht:AsukohadLogiLogifail:L&iitmise tööriist:MAPI e-posti klientTee harust kohalik koopiaMärgi &lahendatuksMärgi konflikt &lahendatuksÜlemharu asukohta pole määratud.LiidaLiida direktiivsed valikudLiida eelvaadeLiida isegi siis, kui tööpuul on sissekandmata muudatusedLiida sissekandmata muudatused sissekantute asemeleSõnumSõnum:SõnumidSõnumid ja faili tekst (indekseeritud)Kadunud märgistus: %s. Seadista qconfig'i liitmise kaardis.Kõige viimane (tip) versioonLiiguta olemasolev siltMuttNimiMuudatusi ei leitud.Sissekande jaoks valitud muudatusi ei leitudSissekandeks valitud muudatused puuduvad. Kas siiski teha sissekanne?Valitud muudatusi tühistamiseks ei leitudAbi %s jaoks ei leitudTeist versiooni pole kirjeldatud.Tööpuud "%s" jaoks ei ole olemasEi ole haru "%s"See pole haru: %sValikudTeine versioon:Kirjuta üle harudevahelised erinevusedÜlemad:Asukoht:Ootel ühendusedPluginadPaigaldatud pluginad: %(rows)dAtribuudid:&TõmbaAvalik haru:TõmbaTõmba erinev haruTõmba hiljutised muudatused siit:LükkaPythoni interpretaator&Nimeta ümberValmisVärskenda kataloogipuuJäta need asukohad vaikimisi meeldeJäta see uue ülemharuna meeldeJäta see asukoht vaikimisi meeldeEemaldaEemalda järjehoidjaHoidlaHoidla vorming:RevRev %(rev)s %(branch)s jaoksRev %s&Võta tagasiRevid: %(revid)s %(branch)s jaoksRevid: %sVersioonVersioon %sVersiooni ID'dVersiooni numbridVersioon:Versioonid:Juurkataloogi nimi:Käivita bzr käskVali / ära vali kõikVali allika kataloogVali sihtkataloogVali haru asukohtVali tagasivõetavad muudatusedVali käivitatav redaktorVali sisestatavad failidVali sisestamiseks asukohtVali töökataloogSaadaMäära selle sissekande poolt parandatud vigade ID-dMäära muudatusele sissekandjast erinev autorMäära external_merge rakendus qconfig'is liitmise kaardilSeadistused:NäitaNäita &annoteerimistNäita &erinevusiNäita &erinevusi...Näita &logiNäita &puud...Näita logi...Näita kõiki &erinevusiNäita kõiki &erinevusi...Näita faili &erinevusiNäita faili &erinevusi...Näita eiratud faileNäita grupisiseseid sisestusi ja kustutamisi rohelise ja punasegaNäita versioonita faileSuurusJäta tööpuude loomine selles hoidlas vaheleÕigekirja kontroll &keel:Alustamine...OlekOlek:Saada haru:KokkuvõteLülitaLülita väljavõttesseLülita harusse:Süsteemi informatsioonSiltSilt "%s" on juba olemas. Kas sa soovid liigutada olemasolevat silti?Silti "%s" ei ole olemasSilti "%s" ei ole veel olemas. Kas sa soovid luua uue sildi?Silt &versioon...SildidSildid:extmerge definitsioon: '%(tool)s' on vigane. Kadunud märgistus: %(flags)s. See peab olema fikseeritud qconfig'i liitmise kaardis.See kataloog on haru. Palun vali see, mida soovid uuendadaSee kataloog on %s väljavõteThunderbirdPööra see haru teise haru peegelduseksURLSeo lahtiSidumata haruMuutmataSissekandmata tööpuu muudatusedUnidiffVersioonitaVersioonita failidUuenda haruUuendamise väljavõteUuenda selle haru peegeldusUuenduse allikasUuenda puud %sUuenda tööpuudUuenda haru viimased muudatused tööpuuleKasuta olemasolevat kataloogiVersioonVersioon:VaadeBinaarfaili vaatamineVaata sissekandeks valitud failide muudatusiVaata valitud tagasivõetavate failide muudatusiKataloogi vaatamineVaata failiPildifaili vaatamineNimeviida vaatamineTekstifaili vaatamineTööpuuTööpuu valikudTööpuu %s jaoksTööpuul on sissekandmata muudatused.Tööpuu on aegunud, palun käivita 'bzr update'.Vale kodeerimineXDG e-posti klientSa peaksid määrama sildi nime\ Faili lõpus reavahetus puudublisatudlisatud failidlisatud, puuduviga #%ssisukonfliktkustutatud failidülema kustutaminekataloogduplikaatdubleeri idfailfikseeritudignoreeritudpuudukadunud ülemmuudetudmuudetud failidliigutatudkataloogita ülemversioonitaülemkordusasukohakonflikteemaldatudümbernimetatudümbernimetatud ja muudetudümbernimetatud failidnimeviittekstikonfliktversioonita ülemx-bit././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/fr/LC_MESSAGES/0000755000000000000000000000000014556556456014275 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/fr/LC_MESSAGES/qbrz.mo0000644000000000000000000003253014556556456015613 0ustar003 6  !9 BM U`h o}    1 9DMRb hucyw U b ny      (3 : DO Tai q{    $ 0=%B3h  F:kS)( ")=E,J w    T EO S`s% <P"n $#&- =H[_z  (Cafx5 &5=PU [g ku((  % 4A%U5{   ) 3 = J O W _ n w      I"""""# .#9#B# K#Y#b#j#y# ###### # ## #$$"$&$.$ 7$C$[$ d$r$$$ $$$$?% %%&&&"&4& =&$G&l&t& {&&&&& &&&& & ' ' '#'5'&<'c' l' z' ''' ' '''('&'(3(8( @( L(X(g(;l(:(#( ))#) ,)8)RO)))D*7K*@* **&**+G+W+f+ x+ +++ + ++++ + +[+S,b,j,~,,), ,,, ,- ---70-Qh-3-1- . (.3.E.U.#].*.*. ..../*/ E/O/^/ w///&//</B+0n0w000$0090"21 U1c1i1q111 11 11 1111K2L]2222223#3F<3P3303 4 4 24<4S4g4}4 4 44444444 45 5 535C5=v@5U#Ii VA?"2^9{we+yQO hqMcYP.8rjsoKgb>Gm\|[3&uTXE%S7)a~] 1 -*Hx$N4:f/BRJdZ;CLk'!pDn}(Wz,6ltF_0`<%d conflict auto-resolved.%d conflicts auto-resolved.%d file%d files&About...&Add&Add Bookmark...&Annotate this revision&Author:&Bookmarks&Branch&Browse...&Cancel&Close&Configure...&Edit Bookmark...&Editor:&File&Filter&Fixed bugs:&Help&Help...&Launch...&Local commit&Location:&Merge&Merge conflict&Name:&OK&Open&Quit&Refresh&Remove Bookmark...&Revert&Revision:&Search:&To:&User Interface&View(no message)...A commit will be made directly to the master branch, keeping the local and master branches in sync.A local commit to the branch will be performed. The master branch will not be updated until a non-local commit is made.AbbreviationAborting...About QBzrActionAddAdd BookmarkAliasAliasesAll conflicts resolved.AnnotateAuthorAuthor:AuthorsAuto-resolveBindBind branchBind to:BookmarksBranchBranch location:Branch:Branch: %sBrowseBrowse...Bug:Bugs:BugsBuiltin DiffChangedChangesChildren:CommandCommitCompleteComputerConfigurationConflictConflictsCreate a new Bazaar Working TreeCreate a new shared repositoryCurrently bound to:DateDate:DefaultDescriptionDescription:DiffDo not save backups of reverted filesDo you really want to remove the selected bookmark?Do you want to continue anyway?E-&mail:Edit BookmarkEditorEncoding:Enter PasswordEnter the author's name, e.g. John Doe <jdoe@example.com>Enter the commit messageEnter the list of bug IDs in format tag:id separated by a space, e.g. project:123 project:765ErrorError while running bzr. (error code: %d)Error while running merge tool (code %d)EvolutionExportExternal Diff Apps:Failed!FileFile %s is not versioned. Operation aborted.File NameFilename:Finished!GeneralHelpIgnoredInfoInitializeKMailKind:Last modified:Loading...Local DirectoryLocal commits are not pushed to the master branch until a normal commit is performedLocation:LogM&erge tool:MAPI e-mail clientMark as &resolvedMaster branch location not specified.MergeMerge PreviewMessageMessage:MessagesMuttNameNo changes found.No changes selected to commitNo changes selected to commit. Do you want to commit anyway?No changes selected to revertNo help can be found for %sOptionsParents:Pending MergesProperties:PushRefresh the directory treeRemember these locations as defaultsRemember this location as a defaultRemoveRemove BookmarkRepositoryRepository Format:RevRev %(rev)s for %(branch)sRevertRevision %sRevision NumbersRevision:Select Source DirectorySelect Target DirectorySelect branch locationSendSet the IDs of bugs fixed by this commitSet the author of this change, if it's different from the committerShowShow &differencesShow &differences...Show ignored filesShow non-versioned filesSizeSkip the creation of working trees in this repositorySpell check &language:Starting...StatusStatus:Submit Branch:SummarySystem InformationTagsTags:ThunderbirdURLUnchangedUnversioned FilesViewView binary fileView changes in files selected to commitView changes in files selected to revertView directoryView fileView image fileView symlinkView text fileWorking TreeWorking Tree for %sWorking tree has uncommitted changes.Working tree is out of date, please run 'bzr update'.XDG e-mail client\ No newline at end of fileaddedadded filesbug #%scontents conflictdeleted filesdeleting parentdirectoryduplicateduplicate idfileignoredmissingmissing parentmodifiedmodified filespath conflictremovedrenamedrenamed and modifiedrenamed filessymlinktext conflictProject-Id-Version: qbzr Report-Msgid-Bugs-To: POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2010-05-17 17:17+0000 Last-Translator: François Blondel Language-Team: French MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n > 1; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) %d conflit résolu automatiquement.%d conflits résolus automatiquement.%d fichier%d fichiers&À propos de...&Ajouter&Ajouter un signet...&Annoter cette révision&Auteur :&Signets&Branche&Parcourir...&Annuler&Fermer&Configurer...&Éditer le signet...&Éditeur&Fichier&Filtrer&Bogues corrigé s:&Aide&Aide...&Démarrer...Commit &local&Emplacement  :&FusionnerConflit de &fusion&Nom :&OK&Ouvrir&Quitter&Actualiser&Supprimer le signet...&Revenir&Révision :&Rechercher :&À :Interface utilisateur&Afficher(aucun message)...Un enregistrement va être fait directement sur la branche principale, gardant la branche locale et cette dernière synchronisés.Un enregistrement local vers la branche va être fait. La branche principale ne sera pas mise à jour jusqu'à ce qu'un enregistrement non-local soit fait.AbréviationInterruption en cours...À propos de QBzrActionAjouterAjouter un signetSynonymeSynonymesTous les conflits on été résolus.AnnoterAuteurAuteur :AuteursRésoudre automatiquementLierLier une brancheLiée à :SignetsBrancheEmplacement de la branche :Branche :Branche: %sParcourirParcourir…Bogues :Bugs :BoguesApplication de comparaison par défautModifiéModificationsEnfants :CommandesCommiterCompletOrdinateurConfigurationConflitConflitsCréer un nouvel arbre de travail BazaarCréer un nouveau répertoire partagéActuellement liée à :DateDate :Par défautDescriptionDescription :DiffNe pas enregistrer les sauvegarde des fichiers récupérésVoulez-vous réellement supprimer le signet sélectionné?Voulez vous quand même continuer ?E-mail :Éditer le signetÉditeurEncodage :Saisir le mot de passeSaisissez le nom de l'auteur, par exemple John Doe <jdoe@example.com>Entrez le message de commitEntrez la liste des identifiants de bug au format tag:id séparés par des espaces, par exemple project:123 project:765ErreurErreur lors de l'exécution de bzr. Code d'erreur : %dErreur lors de l'exécution de l'application de fusion (code %d)EvolutionExporterApplications de comparaison externes :Échec !FichierLe fichier %s n'est pas sous contrôle de version. Opération annulée.Nom de fichierNom de fichier :Terminé !GénéralAideIgnoréInformationInitialiserKMailType :Dernière modification :Chargement...Dossier localLes commits locaux ne seront poussés sur la branche principale que lors d'un commit normalEmplacement :JournalOutil d&e fusion :Client mail MAPIMarquer comme &résoluEmplacement de la branche liée manquant.FusionnerAperçu de la fusionMessageMessage :MessagesMuttNomAucun changement détecté.Aucuns changements sélectionnés pour l'enregistrementPas de changement sélectionnés pour l'enregistrement. Enregistrer quand même ?Aucuns changements sélectionnés pour l'annulationAucune aide ne peut être trouvée pour %sOptionsParents :Merges en attentePropriétés :PublierActualiser l'arbre des répertoiresSe souvenir de cet emplacement par défautSe souvenir de cet emplacement par défautSupprimerSupprimer le signetDépôtFOrmat de dépôt :VersionVersion %(rev)s pour la branche %(branch)sRétablirVersion n° %sNuméro d'enregistrementRévision :Choisir le répertoire sourceChoisir le répertoire cibleChoisissez l'emplacement de la brancheEnvoyerDéfinit les identifiants des bogues corrigés par ce commitDéfinit l'auteur des changements s'il est différent du commiteurAfficherMontrer les &différencesMontrer les &différences…Montrer les fichiers ignorésMontrer les fichiers non-versionnésTailleSauter la création de l'arbre de travail pour de dépôtCorrection d'orthographe $languageDémarrage...ÉtatÉtat :Soumettre la branche :RésuméInformation SystèmeÉtiquettesÉtiquettes :ThunderbirdURLInchangéFichiers non-versionnésVoirVoir le fichier binaireVoir les changements dans les fichiers sélectionnés pour l'enregistrementVoir les changements dans les fichiers sélectionnés pour la récupérationVoir le répertoireVoir le fichierVoir le fichier imageVoir le lien symboliqueVoir le fichier texteArbre de TravailArbre de travail pour %sL'arborescence du travail contient des modifications non-enregistréesL'arbre de travail n'est pas à jour, merci d'exécuter la commande 'bzr update'Client mail XDG\ Pas de retour à la ligne à la fin du fichierajouté(e)fichiers ajoutésbogue #%sconflit sur le contenufichiers suppriméssuppression du parentdossierdupliquerid en doublonfichierignorémanquantparent manquantmodifiéfichiers modifiésconflit sur le cheminsupprimérenommérenommé et modifiéfichiers renomméslien symboliqueconflit sur le texte././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/gl/LC_MESSAGES/0000755000000000000000000000000014556556456014270 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/gl/LC_MESSAGES/qbrz.mo0000644000000000000000000001453014556556456015606 0ustar00~         . @ I O U ^ i p t z              $ 0 : K R Z d l s |    3    F )T ~           & /;AF#a     '.6> DPTf}     !+06?NV^ s / ;Id{       #/ GSZa fr  !)05 >IXns. K89 r!|   $-27@ GSZ"b*   #*APl t   1J`#x   /D ]v7&w*"Nu;kj(a#-8q<@|y.=r^E,J?_TUSGYD V`HpI!/42B0[Q dhXg 5n}KMWFm> LcO~P+st'z1x f:oiA39R{Z6lCe$)\b%%d file%d files&About...&Add Bookmark...&Annotate this revision&Author:&Bookmarks&Cancel&Close&Commit&Configure...&Edit Bookmark...&Editor:&File&Help&Help...&Location:&Name:&OK&Push&Quit&Refresh&Remove Bookmark...&Revision:&Search:&To:&ViewAbbreviationAborting...About QBzrAddAdd BookmarkAliasAliasesAnnotateAuthorAuthor:AuthorsBindBind branchBookmarksBranch location:BrowseChangesChildren:CommandCommitComputerConfigurationCurrently bound to:DateDefaultDo you really want to remove the selected bookmark?E-&mail:E-mail &client:Edit BookmarkEditorEnter the author's name, e.g. John Doe <jdoe@example.com>Error while running bzr. (error code: %d)EvolutionFailed to start bzr.Failed!FileFinished!GeneralKMailKind:Last modified:Loading...Location:LogMAPI e-mail clientMessageMessagesMuttNameOptionsParents:Properties:Pu&llPushRefresh the directory treeRemember this location as a defaultRemoveRemove BookmarkRevRevertRevision %sRevision IDsRevision NumbersRevision:ShowShow &differences...Show &tree...Show ignored filesSizeStarting...StatusStatus:SummaryTags:ThunderbirdURLUnversioned FilesUse existing directoryView binary fileView directoryView fileView image fileView symlinkView text fileXDG e-mail client\ No newline at end of fileaddedadded filesdeleted filesdirectoryfilefixedmodifiedmodified filesremovedrenamedrenamed and modifiedrenamed filessymlinkProject-Id-Version: qbzr Report-Msgid-Bugs-To: POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2009-10-08 15:32+0000 Last-Translator: Fran Diéguez Language-Team: Galician MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) ficheiro %d&Acerca de...Eng&adir marca páxinas...&Anotar esta revisión&Autor:&Marca páxinas&Cancelar&Pechar&EntregarConfigurar...&Editar marcapáxinas...&Editor:&FicheiroA&xudaA&xuda&Ubicación&Nome:&Aceptar&Empuxar&SaírActualiza&rElimina&r marcapáxinas&Revisión:&Busca&Para:&VerAbreviaturaInterrumpindo...Acerca de QBzrEngadirEngadir marca páxinasAlcumeAlcumesAnnotateAutorAutor:Autores/asLigarLigar ramaMarca páxinasLocalización da rama:ExaminarCambiosHijos:OrdeEntregarComputadorConfiguraciónLigada actualmente a:DataPredeterminadoDesexa eliminar o marca páxinas seleccionado?C&orreo-e&Cliente de correo-eEditar marca páxinasEditorIntroduza o nome do autor, p.ex. Pepe Perez <:pepe@exemplo.com>:Produciuse un erro ao executar bzr (código de erro: %d)EvolutionAtopouse un fallo ao iniciar bzr.Fallou!FicheiroRematado!XeralKMailTipo:Última modificación:A cargar...Ubicación:RexistroCliente de correo-e MAPIMensaxeMensaxesMuttNomeOpciónsPdres:Propiedades&TirarEmpuxarAcrualizar a árbore do directorioLembre esta ubicación como predeterminadaEliminarEliminar marca páxinasRevisiónReverterRevisión %sIDs de revisiónNúmeros de revisiónRevisión:AmosarAmosar &diferencias...Amosar ar&boreMostrar ficheiros ignoradosTamañoA iniciar...EstadoEstadoResumoEtiquetas:ThunderbirdURLFicheiros non versionadosUsar un directorio existenteVer ficheiro binarioVer directorioVer o ficheiroVer ficheiro de imaxeVer ligazón sinmbólicaVer ficheiro de textoCliente de correo-e XDG\ Sin liña nova no fin do ficheiroengadidoficheiros engadidosficheiros borradosdirectorioficheirofixomodificadoficheiros modificadosborradorenomeadorenomeado e modificadoficheiros renomeadosligazón simbólica././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/he/LC_MESSAGES/0000755000000000000000000000000014556556456014262 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/he/LC_MESSAGES/qbrz.mo0000644000000000000000000001356614556556456015610 0ustar00X     %0 K Wa h"r5    ) J _ g ,l    "   & / 4 S X &s #       3 ? F J <c H  7 E \ m |           ' / 7 L T  . ; H T ^h  ! " )65 lyC  9+e ~D )40ey2? !(3.\( ! * DRY#baM6P`Jv$ >]z!  )2Bb QXEP$5=W&@>GK D91/() +F;JT-0HL7RC2V3.IB 8!? N,*O: 4A%'MS<U"#6%d file%d files&Action:&Browse...&Cancel&Close&Commit&Edit Bookmark...&Location:&Refresh&Remove Bookmark...&Revision:&Select...&Tag name:Aborting...BookmarksBranchBrowse...Commit changes into a new revisionCompleteComputerCreate new tagCreate the path up to the branch if it does not existDelete existing tagDescriptionDiffEdit tagErrorError while running bzr. (error code: %d)Failed to start bzr.Failed!FileFile %s is not versioned. Operation aborted.Finished!HelpInfoInitializeMergeMerge PreviewNo help can be found for %sNot a branch: %sOptionsOverwrite differences between branchesPullPull most recent changes from:PushRefresh the directory treeRemember this as the new parent branchRemember this location as a defaultRev %(rev)s for %(branch)sRev %sRevertRevid: %sSelect / deselect allSelect branch locationShow &differences...Starting...StatusTagTag "%s" does not existsTag "%s" does not exists yet. Do you want to create new tag?This directory is a branch. Please select what you would like to updateUnidiffUpdate BranchUpdate sourceUpdate working tree to the latest changes in the branchUse existing directoryView binary fileView directoryView image fileView symlinkView text fileWorking TreeWorking Tree for %sYou should specify tag nameaddeddirectoryfilefixedignoredmissingmodifiednon-versionedremovedrenamedrenamed and modifiedsymlinkProject-Id-Version: qbzr Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2008-11-21 23:51+0000 Last-Translator: Yaron Language-Team: Hebrew MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) קובץ %d%d קבצים&פעולה:&עיון...&ביטולס&גורמ&סור&ערוך סימנייה...מ&יקום:רע&נןה&סר סימנייה...&מהדורה:&בחירה...&שם התגית:<ענף האב מופיע כאן>מבטל...סימניותענףעיון...מסור את השינויים למהדורה חדשההסתייםמחשבצור תגית חדשהצור את הנתיב עד לענף במידה ואינו קייםמחק תגית קיימתתיאורשוניערוך תגיתשגיאהשגיאה בעת הרצת bzr. (קוד השגיאה: %d)כשל בהפעלת bzr.נכשל!קובץהקובץ %s אינו מכיל גירסה. הפעולה בוטלה.הסתיים!עזרהמידעהפעלמזגתצוגה מקדימה של המיזוגלא ניתן למצוא עזרה עבור %sאינו ענף: %sאפשרויותשכתב על השינויים בין הענפיםמשוךמשוך את השינויים האחרונים מהמיקום:דחיפהרענן את עץ התיקיותזכור זאת כענף האב החדשזכור מיקום זה כברירת מחדלמהדורה %(rev)s עבור %(branch)sמהדורה %sה&חזרמזהה מהדורה: %sבחר / בטל בחירת הכלבחר את מיקום הענףהצג &שינויים...מתחיל...מצבתגיתהתגית "%s" אינה קיימתהתגית "%s" אינה קיימת עדיין. האם ברצונך ליצור תגית חדשה?תיקייה זו הינה ענף. אנא בחר מה ברצונך לעדכןשינויי אחידותעדכן ענףמקור העדכוןעדכן את עץ העבודה לשינויים האחרונים בענףהשתמש בתיקייה קיימתצפיה בקובץ בינאריצפיה בתיקייהצפיה בקובץ תמונהצפיה בקישור סמליצפיה בקובץ טקסטעץ העבודהעץ העבודה עבור %sעליך לציין שם תגיתנוסףתיקייהקובץקבועבהתעלמותחסרעודכןללא גירסההוסרשונה שמושונה שמו או ששונהקישור סמלי././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/hu/LC_MESSAGES/0000755000000000000000000000000014556556456014302 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/hu/LC_MESSAGES/qbrz.mo0000644000000000000000000002201614556556456015616 0ustar00t `a r|      & /:AHLR[ov     $ -;B JW \h q{      $,@ Vchq  F) >HOdlqy~   % .38JR[j   /FKat   #(9 HR bo ~      *3B W cqy    * #27 FQd     " )"4Wpx   0CKTj r         (5Mfm~    !3EO*     -=CK ao  # -#Nr  ! 2 P m !|  $  "  ! !!;! D! Q!]!a!{! !!!!!""7"R"Z" l"w""""" " "!"# ### /#;#P#g#v# # ######O/C! ~]{4H% VmybjXRU9^0f.BnGeZ2\x'NTK7`t"QWr v<@[;5)#=,qpo-E$ 81Muidw_slPDhzaAF :cIg6L|&+SJ3>Y}(*k?%d file%d files&About...&Action:&Add Bookmark...&Annotate this revision&Author:&Bookmarks&Branch&Browse...&Close&Configure...&Edit Bookmark...&Editor:&File&Filter&Fixed bugs:&Help&Help...&Launch...&Merge&Name:&OK&Quit&Refresh&Remove Bookmark...&Retry&Search:&Show hidden commands&User Interface&View&Working directory:(no message)AbbreviationAborted!About QBzrAddAdd BookmarkAliasAliasesAll conflicts resolved.AnnotateArchive type:AuthorAuthorsAuto-resolveBindBind branchBind to:BookmarksBranchBranch location:Branch: %sBrowseBug TrackersBugsC&ategory:ChangesCommandComputerConfigurationConflictConflictsCreate new tagCurrently bound to:DateDefaultDelete existing tagDescription of formatDescription:DiffE-&mail:E-mail &client:Edit BookmarkEdit tagEditorEncoding:Enter PasswordEnter UsernameEnter the author's name, e.g. John Doe <jdoe@example.com>ErrorError while running bzr. (error code: %d)EvolutionExportFailed to start bzr.Failed!FileGeneralHelpInfoInitializeKMailKind:Last modified:Loading...Local DirectoryLocation:LogMAPI e-mail clientMaster branch location not specified.MessageMessagesMove existing tagMuttNameNo changes found.OptionsParents:Pending MergesPlugins installed: %(rows)dProperties:Refresh the directory treeRemoveRemove BookmarkRevision %sRevision:Root directory name:Run bzr commandSelect Source DirectorySelect Target DirectorySelect branch locationShowShow all &differencesShow ignored filesShow non-versioned filesSizeSpell check &language:StatusStatus:Tag "%s" does not existsTagsTags:ThunderbirdURLUnversioned FilesUpdate sourceUse existing directoryViewView binary fileView directoryView fileView image fileView symlinkView text fileWorking TreeXDG e-mail clientaddedadded filesbug #%scontents conflictdeleted filesdeleting parentdirectoryduplicateduplicate idfilefixedignoredmissing parentmodifiedmodified filesnon-directory parentparent looppath conflictremovedrenamedrenamed and modifiedrenamed filessymlinktext conflictunversioned parentProject-Id-Version: qbzr Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2010-02-28 13:26+0000 Last-Translator: Krasznecz Zoltán Language-Team: Hungarian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) %d fájl%d fájlok&Névjegy...&Művelet:&Könyvjelző Hozzáadása...&Ezt a változatot megjegyzésekkel ellátSz&erző:Könyv&jelzőkÁ&g&Tallózás…&BezárásB&eállítások...Könyvjelző &szerkesztése&Szerkesztő:&FájlS&zűrő&Javított hibák:&Súgó&Súgó...&Indítás...&Összefűzés&Név:&OKKi&lépés&FrissítésKönyvjelző #eltávolítása&ÚjraKe&resés:&Rejtett parancsok megjelenítése&Felhasználói felületNé&zet&Munkakönyvtár:(nincs üzenet)RövidítésMegszakítva!A QBzr NévjegyeHozzáadásKönyvjelző hozzáadásaÁlnévÁlnevekMinden ütközés feloldvaMegjegyzésekkel ellátArchívum típusa:SzerzőSzerzőkAutomatikus feloldásKötésÁg kötéseKötés ide:KönyvjelzőkÁgÁg helye:Ág: %sBöngészésHibakövetőkProgramhibákK&ategória:VáltoztatásokParancsSzámítógépBeállításokÜtközésÜtközésekÚj cimke létrehozásaJelenleg ide van kötve:DátumAlapértelmezésMeglévő cimke törléseA formátum leírásaLeírás:EltérésE-&mail:E-mail &kliens:Könyvjelző SzerkesztéseCimke szerkesztéseSzerkesztőKódolás:Jelszó MegadásaFelhasználónév MegadásaÍrja be a szerző nevét, pl. John Doe <jdoe@pelda.com>HibaHiba a bzr futása közben. (Hibakód: %d)EvolutionExportálásA bzr elindítása sikertelen.Sikertelen!FájlÁltalánosSúgóInformációInicializálásKMailTípus:Utolsó módosítás:Betöltés...Helyi KönyvtárHely:NaplóMAPI e-mail kliensMester ág helye nincs megadvaÜzenetÜzenetekMeglévő cimke mozgatásaMuttNévNem találtam változtatást.BeállításokSzülők:Függőben levő összefűzésekBővítmények telepítve: %(rows)dTulajdonságok:Könyvtárfa frissítéseEltávolításKönyvjelző EltávolításaVáltozat %sVáltozat:Gyökérkönyvtár neve:bzr parancs futtatásaForrás Könyvtár KiválasztásaCélkönyvtár KiválasztásaÁg helyének kiválasztásaMegjelenítésÖsszes mutatása &különbségekNem mutatott fájlok mutatásaMutasd a verzió nélküli fájlokatMéret&Nyelv helyesírás-ellenőrzése:ÁllapotÁllapot:Az "%s" cimke nem létezik.CímkékKulcsszavak:ThunderbirdURLVerzió nélküli fájlokForrás frissítéseMeglévő könyvtár használataNézetBináris fájl megtekintéseKönyvtár megtekintéseFájl megnézéseKépfájl megtekintéseSzimbolikus link megtekintéseSzövegfájl megtekintéseMunkafaXDG e-mail klienshozzáadvahozzáadott fájlokhiba #%startalmi ütközéstörölt fájlokszülő törlésekönyvtárduplikátumkétszer előforduló azonosítófájlállandókihagyvahiényzó szülőmódosítvamódosított fájlokszülő nem könyvtárszülő ciklusútvonalütközéseltávolítvaátnevezveátnevezve és módosítvaátnevezett fájlokszimbolikus linkszövegütközésverzió nélküli szülő././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/it/LC_MESSAGES/0000755000000000000000000000000014556556456014302 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/it/LC_MESSAGES/qbrz.mo0000644000000000000000000006042514556556456015624 0ustar00  0 61 h y          !!!!.!7!=! E!R!X! a! l! z!!!!!!!!!#! """!"5"<" D"O" X"c" y"""" """"" "" # #'#8#I#M#h#ck$w$ G%T% ]% i%t%{% %%%%%% %%%% %% && &+& 4& >&H&O&O`&& && & & && & & ''' -'?7'w''"' ''' '' ''( (9(X(6u((5(() ))) ,)8) N)[) `)%j)3)2)/)'*G*P* `*n*w**~* *,***F*E+k^++)+(+ #,-,4,H,W,l,t,,y, , , ,,,,,,-.-E- J-U-j------- --T-6?. v. .. . .....%/(/./ F/6T/3//// /?/:0U0 g0s0x0}00<00"1+1H1h1z111&1111122 +272=2L2Q2i222222$2&2#393@3 P3[3n3r3333 33 3 33 3 4 4"424H4`4x4444445( 5C558y5 55555 5 6 6616J6a6{65666567 /7;7B7J7Y7a7h7x777:77<728C8H8HN8#8 80888 9 99$9D9 L9X9 j9x99 9-9997:>:U:]:f:k:(|:(:: :: :; ; ;5;%I;5o;;;;;; <<<'< 9<G< W< a< k<x<}<<<<<<<< < < <<= = "=0= 8=F=Y=_=K?d?t?? ???? ?? ? ?? @ @ @#@)@2@J@S@Y@a@p@ w@@@ @@!@@@@ AAA$A?AEA MAWAnA wA AA AA AAA AAAB(B;BJBYBoB BBBBBBzCSD D DDEE E)E =EHENETEoEvEEEEEEEEE E E FFF[/FF FF F F FFF F F FFGHGaGiG$pGGGGG G GGG(H")H!LH@nHH(HHII II 0I7YvYYYY Y YYYYYZ3Z:Z8QZZZZIZ%Z [6![X[ \[g[y[['[[['[\\#(\L\+^\\\:\\ ] ] ]*]7>];v]]]]]^^&^?^3W^<^^^#^-_<_ E_S_f_n____ _ ______ _`` `"6`Y`h`~` `````+`a|{44g.<HPX /%Gg,+<@7Dstb^'MBpco9Pt5v)J'z-uTe$fNF =~ w_$`}(i;#U|=\j C;8z9&nXHGm r7JA?ELF%OohRS/_61Rr^Qp,KM Na?~ #V2)T5d" ua{lK"qCE le2j>x+W>w*0qcIyv(DkBZU1`f*[}!!OYxhkb6Q:A83[d]i\SV]I0W.n sL3Ymy@ Z-:&%d conflict auto-resolved.%d conflicts auto-resolved.%d file%d files&About...&Action:&Add&Add Bookmark...&Annotate this revision&Author:&Bookmarks&Branch&Browse...&Cancel&Close&Command:&Commit&Configure...&Diff&Edit&Edit Bookmark...&Editor:&File&Filter&Fixed bugs:&Help&Help...&Launch...&Local commit&Location:&Mark as moved&Mark as moved and renamed&Mark as renamed&Merge&Merge conflict&Name:&OK&Open&Options and arguments for command:&Push&Quit&Refresh&Remove Bookmark...&Retry&Revert&Revision:&Search:&Select...&Show hidden commands&Tag name:&To:&User Interface&View&View file&Working directory:(bzr-config-dir)(bzr-lib-path)(bzr-log-file)(bzr-version)(no description)(no message)(python-file)(python-lib-dir)(python-version)...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/QBzrA commit will be made directly to the master branch, keeping the local and master branches in sync.A local commit to the branch will be performed. The master branch will not be updated until a non-local commit is made.AbbreviationAborted!Aborting...About QBzrActionAddAdd BookmarkAddress:AliasAliasesAll conflicts resolved.AnnotateArchive type:AuthorAuthor:AuthorsAuto-resolveBazaar ConfigurationBazaar LibraryBindBind branchBind to:BookmarksBound to:BranchBranch location:Branch source (enter a URL or select a local directory with an existing branch)Branch:Branch: %sBrowseBrowse...Bug TrackersBug:Bugs:BugsBuiltin DiffC&ategory:ChangedChangesCheckout of branch:Children:Click a link for more information about checkouts and branches.CommandCommitCommit changes into a new revisionCommitter:CompleteComputerConfigurationConflictConflictsCreate Branch before switchingCreate a checkoutCreate a new Bazaar Working TreeCreate a new shared repositoryCreate a new standalone treeCreate a stacked branch referring to the source branchCreate new tagCreate the path up to the branch if it does not existCurrently bound to:DateDate:DefaultDelete existing tagDescriptionDescription of formatDescription:DiffDirectoryDo not save backups of reverted filesDo you really want to remove the selected bookmark?Do you really want to revert the selected file(s)?Do you really want to uncommit these revisions?Do you want to continue anyway?E-&mail:E-mail &client:Edit BookmarkEdit tagEditorEncoding "%s" is invalid or not supported.Encoding:Ensure all revisions are appended to the logEnter PasswordEnter UsernameEnter the author's name, e.g. John Doe <jdoe@example.com>Enter the commit messageEnter the list of bug IDs in format tag:id separated by a space, e.g. project:123 project:765ErrorError while running bzr. (error code: %d)Error while running merge tool (code %d)EvolutionExportExternal Diff Apps:External MergeFailed to start bzr.Failed!FileFile %s is not versioned. Operation aborted.File NameFilename:Finished!Forget pending mergesGeneralHeavyweight checkout:HelpHelp for commandIgnoredInclude a preview patch in the merge directiveInfoInitializeInsert &directory...Insert &filenames...KMailKind:Last modified:Library:Light-weight checkoutLightweight checkout:Loading...Local DirectoryLocal commits are not pushed to the master branch until a normal commit is performedLocal directory where the working tree will be createdLocation:LocationsLogLog File:M&erge tool:MAPI e-mail clientMake a local copy of the branchMark as &resolvedMark conflict &resolvedMaster branch location not specified.MergeMerge Directive OptionsMerge PreviewMerge even if the working tree has uncommitted changesMerge uncommitted changes instead of committed onesMessageMessage:MessagesMessages and File text (indexed)Missing the flag: %s. Configure in qconfig under the merge tab.Most recent (tip) revisionMove existing tagMove tip toMuttNameNo changes found.No changes selected to commitNo changes selected to commit. Do you want to commit anyway?No changes selected to revertNo help can be found for %sNo other revision specified.No working tree exists for "%s"Not a branch "%s"Not a branch: %sOptionsOther revision:Overwrite differences between branchesParent of current tip revisionParents:Path:Pending MergesPluginsPlugins installed: %(rows)dProperties:Pu&llPublic Branch:PullPull a different branchPull most recent changes from:PushPython InterpreterRe&nameReadyRefresh the directory treeRemember these locations as defaultsRemember this as the new parent branchRemember this location as a defaultRemoveRemove BookmarkRepositoryRepository Format:RevRev %(rev)s for %(branch)sRev %sRevertRevid: %(revid)s for %(branch)sRevid: %sRevisionRevision %sRevision IDsRevision NumbersRevision:Revisions:Root directory name:Run bzr commandSelect / deselect allSelect Source DirectorySelect Target DirectorySelect branch locationSelect changes to revertSelect editor executableSelect files to insertSelect path to insertSelect working directorySendSet the IDs of bugs fixed by this commitSet the author of this change, if it's different from the committerSet up external_merge app in qconfig under the Merge tabSettings:ShowShow &annotateShow &differencesShow &differences...Show &logShow &tree...Show Log...Show all &differencesShow all &differences...Show file &differencesShow file &differences...Show ignored filesShow inter-group inserts and deletes in green and redShow non-versioned filesSizeSkip the creation of working trees in this repositorySpell check &language:Starting...StatusStatus:Submit Branch:SummarySwitchSwitch checkoutSwitch to branch:System InformationTagTag "%s" already exists. Do you want to move existing tag?Tag "%s" does not existsTag "%s" does not exists yet. Do you want to create new tag?Tag &revision...TagsTags:This directory is a branch. Please select what you would like to updateThis directory is a checkout of: %sThunderbirdTurn this branch into a mirror of another branchURLUnbindUnbind branchUnchangedUncommitUncommited Working Tree ChangesUnidiffUnversionedUnversioned FilesUpdate BranchUpdate CheckoutUpdate a mirror of this branchUpdate sourceUpdate the working tree from the bound branchUpdate tree %sUpdate working treeUpdate working tree to the latest changes in the branchUse existing directoryVersionVersion:ViewView binary fileView changes in files selected to commitView changes in files selected to revertView directoryView fileView image fileView symlinkView text fileWorking TreeWorking Tree OptionsWorking Tree for %sWorking tree has uncommitted changes.Working tree is out of date, please run 'bzr update'.Wrong encodingXDG e-mail clientYou should specify tag name\ No newline at end of fileaddedadded filesadded, missingbug #%scontents conflictdeleted filesdeleting parentdirectoryduplicateduplicate idfilefixedignoredmissingmissing parentmodifiedmodified filesmovednon-directory parentnon-versionedparent looppath conflictremovedrenamedrenamed and modifiedrenamed filessymlinktext conflictunversioned parentx-bitProject-Id-Version: qbzr Report-Msgid-Bugs-To: POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2010-01-17 12:48+0000 Last-Translator: Stefano Karapetsas Language-Team: Italian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) %d conflitto risolto automaticamente.%d conflitti risolti automaticamente.%d file%d fileInform&azioni su...&Azione:&Aggiungi&Aggiungi Segnalibro&Annota questa revisione&Autore:&Segnalibri&BranchEsplora...&Cancella&Chiudi&Comando:&Commit&Configura...&DiffModificaModifica S&egnalibro...&Editor:&File&Filtro&Bug corretti:&Aiuto&Guida...Avvia...Commit &localePosizione:&Marca come spostato&Marca come spostato e rinominato&Marca come rinominato&MergeConflitto &merge&Nome:&OKApri&Opzioni e argomenti per il comando:&PushC&hiudiAggio&rna&Rimuovi Segnalibro...&Riprova&Ripristina&Revisione:&Cerca:&Seleziona...Mo&stra comandi nascostiNome &tag:&A:Interfaccia &utente&Visualizza&Visualizza fileCartella di lavoro:(cartella-config-bzr)(percorso-lib-bzr)(file-log-bzr)(versione-bzr)(nessuna descrizione)(nessun messaggio)(file-python)(cartella-lib-python)(versione-python)...QBzr — Un'interfaccia grafica per Bazaar
Versione %(qbzr_version)s (bzrlib %(bzrlib_version)s)

Copyright © 2006-2008 Lukáš Lalinský e altri

http://bazaar-vcs.org/QBzrIl commit viene eseguito direttamente al branch principale, mantenendo il branch locale e quello principale sincronizzati.Verrà eseguito un commit al branch locale. Il branch principale non verrà aggiornato finché non verrà eseguito un commit non locale.AbbreviazioneAbortito!Interruzione...Informazioni su QBzrAzioneAggiungiAggiungi SegnalibroIndirizzo:AliasAliasTutti i conflitti risolti.AnnotaTipo di archivio:AutoreAutore:AutoriRisolvi-automaticamenteConfigurazione BazaarLibreria BazaarAssociaAssocia branchAssocia a:SegnalibriAssociato a:BranchPosizione branch:Sorgente branch (inserire un URL o selezionare una cartella locale con un branch esistente)Branch:Branch: %sEsploraEsplora...Bug trackerBug:Bug:BugDiff IntegratoC&ategoria:ModificatoModificheCheckout del branch:Figlio:Premi su un collegamento per maggiori informazioni su checkout e branch.ComandoCommitEsegui commit in una nuova revisioneAutore:CompletoComputerConfigurazioneConflittoConflittiCrea Branch prima del cambioCrea un checkoutCrea un nuovo albero di lavoro di BazaarCrea un nuovo repository condivisoCrea un nuovo albero indipendenteCrea un branch accatastato che fa riferimento al branch sorgenteCrea un nuovo tagCrea il percorso al branch se non esisteAttualmente associato a:DataData:PredefinitoElimina tag esistenteDescrizioneDescrizione del formatoDescrizione:DiffCartellaNon salvare copie di backup dei file ripristinatiSi è sicuri di rimuovere il segnalibro selezionato?Effettuare il ripristino del/i file selezionato/i?Effettuare veramente l'uncommit per queste revisioni?Continuare lo stesso?E-&mail:&Client e-mail:Modifica SegnalibroModifica tagEditorLa codifica "%s" non è valida o non è supportata.Codifica:Assicura che tutte le revisioni siano aggiunte al logInserire PasswordInserire Nome UtenteInserisci il nome dell'autore, ad esempio John Doe <jdoe@example.com>Inserisci il messaggioInserisci la lista degli ID dei bug corretti nel formato tag:id separati da uno spazio, per esempio progetto:123 progetto:765ErroreErrore durante l'esecuzione di bzr. (codice di errore: %d)Errore durante l'esecuzione dello strumento merge (codice %d)EvolutionEsportaApplicazioni Esterne per il Diff:Merge EsternoImpossibile avviare bzr.Non riuscito!FileIl file %s non è sotto il controllo di versione. Operazione abortita.Nome FileNome file:Finito!Dimentica merge in sospesoGeneraleCheckout pesante:GuidaGuida per il comandoIgnoratoIncludi un'anteprima di patch nella direttiva mergeInformazioniInizializzaInserisci cartella...Inserisci nomi &file...KMailTipo:Ultima modifica:Libreria:Checkout leggeroCheckout leggero:Caricamento...Cartella LocaleI commit locali non vengono inviati al branch principale finché non viene eseguito un commit normale.Cartella locale dove verranno creati gli alberi di lavoroPosizione:PosizioniLogFile Log:Strumento m&erge:Client e-mail MAPICrea una copia locale del branchMarca come &risoltoMarca conflitto come &risoltoPosizione del branch principale non specificata.MergeOpzioni Direttiva MergeAnteprima MergeEffettua il merge anche se le modifiche all'albero di lavoro non sono state salvateMerge delle modifiche senza commit al posto di quelle dei commitMessaggioMessaggio:MessaggiTesto Messaggi e File (indicizzato)Flag mancante: %s. Configurarlo in qconfig nel tab merge.Revisione più recenteSposta tag esistenteSposta vertice aMuttNomeNessuna modifica trovata.Nessuna modifica selezionata per il commitNessuna modifica selezionata per il commit. Eseguire il commit lo stesso?Nessuna modifica selezionata per il revertNessuna guida può essere trovata per %sNessun'altra revisione specificata.Non esiste un albero di lavoro per "%s"Non un branch "%s"Non un branch: %sOpzioniAltra revisione:Sovrascrivi differenze tra i branchGenitore della revisione vertice attualeGenitori:Percorso:Merge in sospesoPluginPlugin installati: %(rows)dProprietà:Pu&llBranch Pubblico:PullPull da un branch differentePull delle modifiche più recenti da:PushInterprete PythonRi&nominaProntoAggiorna l'albero della directoryRicorda queste posizioni come predefiniteRicorda come nuovo branch genitoreRicorda questa posizione come predefinitaRimuoviRimuovi SegnalibroRepositoryFormato Repository:RevRev %(rev)s per %(branch)sRev %sRipristinaRevid: %(revid)s per %(branch)sRevid: %sRevisioneRevisione %sID RevisioneNumeri RevisioneRevisione:Revisioni:Nome cartella radice:Esegui comando bzrSeleziona / deseleziona tuttoSeleziona Cartella SorgenteSeleziona Cartella DestinazioneSeleziona posizione branchSeleziona modifiche per il ripristinoSeleziona eseguibile editorSeleziona i file da inserireSeleziona il percorso da inserireSeleziona la cartella di lavoroInviaInserisci gli ID dei bug corretti in questo commitImposta l'autore di questa modifica, se diverso da chi la inviaImposta applicazione external_merge in qconfig nel tab MergeImpostazioni:MostraMostra &annotazioniMostra &differenzeMostra le &differenzeMostra &logMos&tra albero...Mostra Log...Mostra tutte le &differenzeMostra tutte le &differenze...Mostra &differenze fileMostra &differenze file...Mostra file ignoratiMostra inserimenti e eliminazioni nei gruppi interni in verde e rossoMostra i file non sotto il controllo di versioneDimensioneSalta la creazione degli alberi di lavoro in questo repository&Lingua correzione ortografica:Avvio...StatoStato:Invia Branch:RiepilogoCambiaCambia checkoutCambia al branch:Informazioni SistemaTagIl tag "%s" già esiste. Spostare il tag esistente?Il tag "%s" non esisteIl tag "%s" non esiste. Si desidera creare un nuovo tag?Tag &revisione...TagTag:Questa cartella è un branch. Selezionare ciò che si desidera aggiornareQuesta cartella è un checkout di: %sThunderbirdTrasforma queto branch in una copia di un altro branchURLDisassociaDisassocia branchNon modificatoUncommitModifiche Albero di Lavoro senza CommitDifferenze unificateNon controllatoFile non sotto il controllo di versioneAggiorna BranchAggiorna CheckoutAggiorna una copia di questo branchAggiorna sorgenteAggiorna albero di lavoro dal branch legatoAggiorna albero %sAggiorna albero di lavoroAggiorna albero di lavoro alle ultime modifiche nel branchUsa la cartella esistenteVersioneVersione:VisualizzaMostra file binarioVisualizza modifiche nei file selezionati per il commitVisualizza modifiche nei file selezionati per il ripristinoMostra directoryMostra il fileMostra immagineMostra collegamento simbolicoMostra file di testoAlbero di LavoroOpzioni Albero di LavoroAlbero di lavoro per %sL'albero di lavoro ha delle modifiche senza commit.L'albero di lavoro non è aggiornato, eseguire 'bzr update'.Codifica errataClient e-mail XDGOccorre specificare il nome del tag\ Non c'è una linea vuota alla fine del fileaggiuntofile aggiuntiaggiunto, mancantebug #%sconflitto di contenutofile eliminatieliminazione genitorecartelladuplicatoid duplicatofilecorrettoignoratomancantegenitore mancantemodificatofile modificatispostatogenitore non-cartellanon sotto il controllo di versioneciclo genitoreconflitto di percorsorimossorinominatorinominato e modificatofile rinominaticollegamento simbolicoconflitto di testogenitore non sotto il controllo di versionex-bit././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/ja/LC_MESSAGES/0000755000000000000000000000000014556556456014260 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/ja/LC_MESSAGES/qbrz.mo0000644000000000000000000011335214556556456015600 0ustar00*6** **** +"+++ 2+=+ E+P+X+ k+x+ ++ + + +++++++++ + ,,,-, H,S, [, i,t,,,,,,,,#,,---$-+- 3->- G-R- h-s-x--- - ----- .. ". /.=.N._.c.z.. /c/w 0 00 0 000 00000090381 l1Wz1111 1?1862o222 2"22 2 222O2L3 T3_3 f3 p3 }33 3 333333 3,4 /4?94y4444 4 44 44"4 5 5)5 25@5 I5S5r555 55566S65b666666V67 17=7 S7`7h7 m7%w73727/848T8\8e8 u88888*8 8,89'9F69}9k9::)!:(K: t:~: ::::-:: ;;,; D; N;X;];r; y;;;; ; ;;;;;; ; ;<< <'?<.g<< <<<[<,=2=7===#L=p= w====== ===T>6> 4? >?H? L? V?c?v???%??? @6@3I@}@@@ @?@@A %A1A6A;A @AJA\A<zAAA"A B*BJB\B mB8xB<BBB&C-CLCUC[CjCrCC C CCCCCCDDD3D;DPDVD$qD&D#DDD%DE 2E=EPETEoEvE%E,EE"E FF3FKF kFuF ~F FF F FFFFF G ,GMGcG{G GGGGGGH-H 2H(>HCgH8HAH &I0I7I4FI{IIII I II IIJ J7J QJ_J5rJJ JHJK5KgPKK KKKKKLLL*L =L IL SLK]LL:LL<M>MOMTMZMHM##N GN2SN0NNN N NNNO O O&O /O;OMO"TO wOOO O-OOPP73P kPvPPPPP PP(P(P%Q 4Q>QNQ cQpQ Q Q QQQ%Q5Q@'RshRRR$R"S>SWSsS|S SSSS S SS S S STT TTT,T5T DT RT `TlTrT T T TTTTT TT TTUU/VV VW W")W(LW uW WWWWWWW XX-X>X OX ZX eX pX"{XXXXX XX YY"/Y"RY uYYY Y"Y+Y"Z 2Z@Z ]ZiZ pZ){ZZ Z Z"Z ZZ[ #[ /["=[`[ q["}["[ [[[\ \1\@\ O\]\l\ \\\\\&\#\ "^r/^^W_^_ t_~____ ___*_`P`ej``r`]adala saLaLab*b @b!Mb<obbbb bbYc _cmc~c ccccccc0c+d 2d(wUw:xSxlx|xxxx!x1xhx1\y*y3y-y3z&Oz'vz!zQza{t{{${!{{{{{1|A|H|X| i|t||!|%| ||"| }%:} `}$j}-}0}-}~#~D?~!~~$~~#~'"cJh '$-L"z' /EVg5́69$M!r-Â0*8!c>KW0I҄ڄDELfz'""=`!w!<6/7 6ȇ Ո ܈$+>U hduډY!;O]1ߊc9 9CEEόӌ! 6.e'| Ӎ'ݍ@ M`'?;6LKe0Ǐ$5<!R0tR*!:$\!Ƒ֑Q Q]{t+ 6ړ!$3&X Ɣ͔  )07SZv-• )0 7DXt3ږB,H%?]] '<V@0wUDeNz"~7R `=.My4jBE|>Jb#}Cc.";o!1<KS;As6-zxk:jS Gh\v{!f: [Og$ m()L(pN'9 utpWd[wGFqQ2#37IEX/F@gtQW|^3&KD8 Cb{ov9linqH>i^\ys  1Z4R* Y%,*/P`6TO=5ZJUu0nL5dx2 XM?_eI-$k)c+YVr&}aAPfl~a_8 +Trhm%d conflict auto-resolved.%d conflicts auto-resolved.%d file%d files&About...&Action:&Add&Add Bookmark...&Annotate this revision&Author:&Basic&Bookmarks&Branch&Browse...&Cancel&Change the values&Cherry pick&Close&Command:&Commit&Complete&Configure...&Detailed&Diff&Edit&Edit Bookmark...&Editor:&External Diff&File&Filter&Find&Fixed bugs:&Help&Help...&Ignore and proceed&Ignore whitespace changes&Launch...&Layout&Local commit&Location:&Mark as moved&Mark as moved and renamed&Mark as renamed&Merge&Merge conflict&Name:&OK&Open&Options and arguments for command:&Push&Quit&Refresh&Remove Bookmark...&Retry&Revert&Revision:&Search:&Select...&Show hidden commands&Tag name:&To:&Update to this revision&User Interface&View&View Options&View file&Working directory:(bzr-config-dir)(bzr-lib-path)(bzr-log-file)(bzr-version)(no description)(no message)(python-file)(python-lib-dir)(python-version)...<<< Hide Error DetailsQBzr — 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/QBzrA commit will be made directly to the master branch, keeping the local and master branches in sync.A local commit to the branch will be performed. The master branch will not be updated until a non-local commit is made.AbbreviationAborted!Aborting...About QBzrActionAddAdd BookmarkAddress:AliasAliasesAll conflicts resolved.AnnotateApply changes in shelf[%(id)d], and remove from the shelfApply changes in shelf[%(id)d], but keep it shelvedArchive type:Are you sure you want to revert this file to the state it was at the selected revision?AuthorAuthor:AuthorsAuto-resolveBazaar 2.4 or later is required for external mergetools supportBazaar 2.4 or newer is required to configure mergetools.Bazaar ConfigurationBazaar LibraryBindBind branchBind new branch to parent locationBind to:BookmarksBound to:BranchBranch location:Branch source (enter a URL or select a local directory with an existing branch)Branch:Branch: %sBrowseBrowse...Bug TrackersBug:Bugs:BugsBuiltin DiffC&ategory:Case sensitiveChange editor is not defined.ChangedChangesCheckout of branch:Cherry-pickCherry-pick revisions %s - %s from %s to %s.Children:Click a link for more information about checkouts and branches.Close %s WindowClose ApplicationClose Error DialogClose Goto LineClose WindowClose findCommandCommand LineCommitCommit changes into a new revisionCommitter:CompleteComputerConfigurationConflictConflictsCould not locate "bzr" script.Could not locate "bzr.exe".Create Branch before switchingCreate a checkoutCreate a new Bazaar Working TreeCreate a new shared repositoryCreate a new standalone treeCreate a stacked branch referring to the source branchCreate new tagCreate the path up to the branch if it does not existCurrently bound to:DateDate:DefaultDeleteDelete changes of %d file without shelvingDelete changes of %d files without shelvingDelete existing tagDescriptionDescription of formatDescription:DestroyDiffDirectoryDo not save backups of reverted filesDo you really want to remove the selected bookmark?Do you really want to revert the selected file(s)?Do you really want to uncommit these revisions?Do you want to continue anyway?Dry runE-&mail:E-mail &client:Edit BookmarkEdit tagEdited by change editor. EditorEncodingEncoding "%s" is invalid or not supported.Encoding:Ensure all revisions are appended to the logEnter PasswordEnter UsernameEnter the author's name, e.g. John Doe <jdoe@example.com>Enter the commit messageEnter the list of bug IDs in format tag:id separated by a space, e.g. project:123 project:765Enter the shelve messageErrorError while running bzr. (error code: %d)Error while running merge tool (code %d)EvolutionExportExtensionExternal Diff Apps:External MergeExternal Merge ToolsExternal merge tool %(tool)s is not availableFailed to start bzr.Failed!FileFile %s is not versioned. Operation aborted.File NameFilename:FindFind on active panelFind: Finished!Forget pending mergesGeneralGoGoto LineGoto Line: Heavyweight checkout:HelpHelp for commandHunksIdIgnore ErrorIgnore asIgnore whitespaceIgnoredImport old external merge toolInclude a bundle in the merge directiveInclude a preview patch in the merge directiveInfoInitializeInsert &directory...Insert &filenames...It is not possible to specify different file paths and different branches at the same time.KMailKeepKind:Last modified:Launch an external diff applicationLayoutLayout %dLeft side encodingLeft side tab widthLibrary:Light-weight checkoutLightweight checkout:Loading...Local DirectoryLocal branch is out of date with master branch. To commit to master branch, update the local branch. You can also pass select local to commit to continue working disconnected.Local commits are not pushed to the master branch until a normal commit is performedLocal directory where the working tree will be createdLocation:LocationsLogLog File:M&erge tool:MAPI e-mail clientMake a local copy of the branchMark as &resolvedMark conflict &resolvedMaster branch location not specified.MergeMerge Directive OptionsMerge PreviewMerge even if the working tree has uncommitted changesMerge uncommitted changes instead of committed onesMessageMessage:MessagesMessages and File text (indexed)Missing the flag: %s. Configure in qconfig under the merge tab.Most recent (tip) revisionMove existing tagMove tip toMuttNameNextNext hunkNo changes found.No changes selected to commitNo changes selected to commit. Do you want to commit anyway?No changes selected to revertNo changes selected.No help can be found for %sNo other revision specified.No working tree exists for "%s"Not a branch "%s"Not a branch: %sNot a fileOperation aborted because target files has been changed.Operation is supported for a single file only, not for a %s.OptionsOther revision:Overwrite differences between branchesParent of current tip revisionParents:Path:Pending MergesPluginsPlugins installed: %(rows)dPreviousPrevious hunkProperties:Pu&llPublic Branch:PullPull a different branchPull most recent changes from:PushPython InterpreterR&evert to this revisionRe&nameRe&verse Cherry pickReadyRefresh the directory treeRemember these locations as defaultsRemember this as the new parent branchRemember this location as a defaultRemoveRemove BookmarkRemove shelf[%(id)d] without applyingReport Bazaar ErrorRepositoryRepository Format:RevRev %(rev)s for %(branch)sRev %sReverse cherry-pickReverse cherry-pick revisions %s - %sReverse cherry-pick revisions %s - %s in %s.RevertRevert %s to revision %s revid:%s.Revert FileRevert to revision %s revid:%s.Revert to this revisionRevid: %(revid)s for %(branch)sRevid: %sRevisionRevision %sRevision IDsRevision NumbersRevision:Revisions:Right side encodingRight side tab widthRoot directory name:Run bzr commandSave file in this revision as...Save file on this revision as...Select / deselect allSelect Source DirectorySelect Target DirectorySelect allSelect branch locationSelect changes to revertSelect editor executableSelect files to insertSelect path to insertSelect working directorySendSet DefaultSet the IDs of bugs fixed by this commitSet the author of this change, if it's different from the committerSet up external_merge app in qconfig under the Merge tabSets the selected merge tool as the default to use in qconflicts.Settings:ShelveShelve ManagerShelve changes of %d fileShelve changes of %d filesShowShow &annotateShow &differencesShow &differences...Show &logShow &tree...Show Error Details >>>Show Log...Show all &differencesShow all &differences...Show file &differencesShow file &differences...Show filelistShow ignored filesShow inter-group inserts and deletes in green and redShow non-versioned filesSignature:Simulate to apply changes in shelf[%(id)d] without changing working treeSizeSkip the creation of working trees in this repositorySome of the files selected cannot be recovered if removed. Are you sure you want to remove these files?Spell check &language:Starting...StatusStatus:Submit Branch:SummarySwitchSwitch checkoutSwitch to branch:System InformationTab &Width:Tab WidthTab widthTab width in characters option is used in qdiff, qannotate and qcat windowsTagTag "%s" already exists. Do you want to move existing tag?Tag "%s" does not existsTag "%s" does not exists yet. Do you want to create new tag?Tag &revision...TagsTags:The extmerge definition: '%(tool)s' is invalid. Missing the flag: %(flags)s. This must be fixed in qconfig under the Merge tab.This directory is a branch. Please select what you would like to updateThis directory is a checkout of: %sThunderbirdToggle between Side by side and Unidiff view modesTurn this branch into a mirror of another branchURLUnbindUnbind branchUnchangedUncommitUncommited Working Tree ChangesUnidiffUnknown FilesUnselect allUnshelveUnversionedUnversioned FilesUpdateUpdate %s to revision %s revid:%s.Update BranchUpdate CheckoutUpdate a mirror of this branchUpdate sourceUpdate the working tree from the bound branchUpdate to revision %s revid:%s.Update tree %sUpdate working treeUpdate working tree to the latest changes in the branchUse editorUse existing directoryVerify SignaturesVersionVersion:ViewView OptionsView binary fileView changes in files selected to commitView changes in files selected to revertView directoryView fileView image fileView shelved changesView symlinkView text fileWhole wordsWord WrapWorking TreeWorking Tree OptionsWorking Tree for %sWorking tree has uncommitted changes.Working tree is out of date, please run 'bzr update'.Working tree is out of date. To commit, update the working tree.Would you like to import your previously configured external merge tool: %(old_cmdline)s as: %(new_cmdline)sWrong encodingXDG e-mail clientYou should provide a commit message.You should specify tag name[binary file (%d bytes)]\ No newline at end of fileadd fileaddedadded filesadded, missingbug #%scontents conflictdelete filedeleted filesdeleting parentdirectoryduplicateduplicate idfilefixedignoredmissingmissing parentmodifiedmodified filesmodify binarymodify targetmodify textmovednon-directory parentnon-versionedparent looppath conflictremovedrenamerenamedrenamed and modifiedrenamed filessymlinktext conflictunversioned parentx-bitProject-Id-Version: qbzr Report-Msgid-Bugs-To: POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2012-02-23 12:58+0000 Last-Translator: IWATA Hidetaka Language-Team: Japanese MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) %d個の競合が解決済みになりました%dファイル詳細(&A)...アクション(&A):追加(&A)ブックマークを追加(&A)...このリビジョンを注釈する(&A)著者(&A):基本(&B)ブックマーク(&B)ブランチ(&B)ブラウズ(&B)...キャンセル(&C)値を変更する(&C)チェリーピック(&C)閉じる(&C)コマンド(&C):コミット(&C)全体表示(&C)設定(&C)詳細(&D)差分(&D)編集(&E)ブックマークを編集(&E)...エディタ(&E):外部Diffツール(&E)ファイル(&F)フィルタ(&F)検索(&F)修正されたバグ(&F):ヘルプ(&H)ヘルプ(&H)...そのまま処理を進める(&I)空白の変更を無視する(&I)起動(&L)...レイアウト(&L)ローカルコミット(&L)場所(&L):移動済みとしてマーク(&M)移動、変名済みとしてマーク(&M)変名済みとしてマーク(&M)マージ(&M)競合をマージする(&M)名前(&N):OK(&O)開く(&O)コマンドオプションや引数(&O):プッシュ(&P)終了(&Q)更新(&R)ブックマークを削除(&R)...再試行(&R)元に戻す(&R)リビジョン(&R):検索(&S):選択(&S)...隠れたコマンドも表示(&S)タグ名(&T):宛先(&T):このリビジョンに更新(&U)ユーザインタフェース(&U)表示(&V)表示オプション(&V)ファイルを表示(&V)作業ディレクトリ(&W):(bzr-config-dir)(bzr-lib-path)(bzr-log-file)(bzr-version)(説明なし)(メッセージなし)(python-file)(python-lib-dir)(python-version)...<<<エラーの詳細を隠す<親のブランチをここに表示>QBzr — Bazaarのグラフィカルインターフェース
バージョン %(qbzr_version)s (bzrlib %(bzrlib_version)s)

Copyright © 2006-2008 Lukáš Lalinský とその他の方々

http://bazaar-vcs.org/QBzrコミットはマスターブランチに送られ、ローカルとマスターブランチ間で同期しますブランチへのローカルコミットが行われます。ローカルコミットでないコミットをしない限り、マスターブランチは更新されません。略記中断しました!中止...QBzrについて操作追加ブックマークの追加アドレス:エイリアスエイリアス全ての競合は解決されました。注釈シェルフ[%(id)d]の変更を適用し、シェルフからは削除しますシェルフ[%(id)d]の変更を適用しますが、シェルフにも残したままにします。アーカイブの種類:本当にこのファイルを選択したバージョンの時点の状態に戻してもよろしいですか?著者著者:著者自動解決外部マージツールのサポートにはBazaar 2.4以降が必要ですマージツールを設定するためにはBazaar 2.4以降が必要ですBazaarの設定Bazaarライブラリバインドブランチをバインドする新しいブランチを親ブランチにバインドするバインド先:ブックマーク割り当て先:ブランチブランチの場所:ブランチ元(URLや既存ブランチのあるローカルディレクトリを選択)ブランチ:ブランチ: %s参照参照...バグトラッカーバグ:バグ組み込みのdiffカテゴリ(&A)大文字/小文字を区別変更エディタは設定されていません変更変更点チェックアウト元のブランチ:チェリーピッキングリビジョン%s~%s を、%sから%sに取り込みます。子供:チェックアウトとブランチに関するより多くの情報を得るにはリックをクリックしてください。%sウインドウを閉じるアプリケーションを終了するエラーダイアログを閉じる行指定パネルを閉じるウインドウを閉じる検索を閉じるコマンドコマンドラインコミット新規リビジョンとして修正をコミットコミッタ:すべてコンピュータ設定競合競合”bzr”スクリプトが見つかりません”bzr.exe”が見つかりません切り替え前にブランチを作成するチェックアウトを作成新たなBazaar作業ツリーを作成新規共有リポジトリを作成新たな単体ツリーを作成ソースブランチを参照する新たなスタックブランチを作成新規タグを作成存在しなければブランチへのパスを生成する現在のバインド先:日付日付:デフォルト削除する%d個のファイルの変更を、シェルフに登録せずに破棄します。既存のタグを削除説明フォーマットの説明説明:破棄差分ディレクトリrevert されるファイルのバックアップを作らない選択したブックマークを本当に削除しますか?本当に選択したファイルの変更を破棄してもよろしいですか?本当にこれらのリビジョンのコミットを取り消してもよろしいですか?それでも続行しますか?シミュレーションメール(&M):メールクライアント(&C):ブックマークの編集タグを編集変更エディタで編集済み エディタエンコードエンコード"%s"は無効か、サポート外ですエンコード:履歴中の全てのリビジョンNoを保持するパスワードを入力して下さいユーザ名を入力してください著者の名前を入力してください。(例: John Doe <jdoe@example.com>)コミットメッセージを入力してください。バグIDのリストを入力する フォーマットは tag:idでスペースで区切る。例 project:123 project:765シェルフに登録する際のメッセージを入力してくださいエラーbzr実行中にエラーが発生しました。(エラーコード: %d)merge ツールの実行中にエラーが発生しました (コード %d)Evolutionエクスポート拡張子外部の diff プログラム外部マージ外部マージツール外部マージツール %(tool)s は使用できませんbzrの実行に失敗しました。失敗!ファイル%s はバージョン管理外です。 処理は中断しました。ファイル名ファイル名:検索アクティブなパネル上で検索します検索: 完了!マージ待ち状態を解除する一般移動指定行へジャンプ指定行へジャンプ: チェックアウト(履歴あり):ヘルプコマンドのヘルプハンクIDエラーを無視する無視設定空白を無視する無視古いマージツール設定の取り込みマージディレクティブにバンドル情報を含めるマージディレクティブにパッチのプレビューを含める情報初期化ディレクトリを挿入(&D)ファイル名を挿入(&F)違うファイルパスと違うブランチを同時に指定することはできません。KMail保持する種類:最終更新:外部Diffツールを起動しますレイアウトレイアウト %d左側のエンコード左側のタブ幅ライブラリ:軽量チェックアウト軽量チェックアウト:読み込み中...ローカルディレクトリローカルブランチはマスターブランチよりも古くなっています。 マスターブランチにコミットするには、まずローカルブランチを更新してください。 ローカルコミットを選択してスタンドアロンで作業を続けることもできます。通常のコミットが行われるまで、ローカルコミットはマスターブランチへと送られることはありません作業ツリーを作成するローカルディレクトリ場所:場所ログログファイル:マージツール(&M):MAPI Eメールクライアントこのブランチのローカルコピーを作成解決済みにする(&R)競合を解決済みにする(&R)マスタであるブランチの場所が指定されていません。マージマージディレクティブオプションマージプレビュー作業ツリーにコミットしていない変更があってもマージするコミット済みの変更ではなくコミットしていない変更をマージするメッセージメッセージ:メッセージメッセージとファイル内のテキスト(索引あり)%s フラグがありません。 qconfig の merge タブで設定してください最新の (tip) revision既存のタグを移動Tipの移動先Mutt名前次へ次のハンク変更が見つかりません。commit する変更が選択されていませんコミットする変更が選択されていません。 どうしてもコミットしたいですか?revert する変更が選択されていません変更箇所が選択されていません%sに該当するヘルプはありませんリビジョンが指定されていません%s に対する作業ツリーは存在しません%sはブランチではありませんブランチではありません: %sファイルではありません処理対象のファイルが変更されたため、処理を中止しましたこの操作は単体ファイルに対してだけ実行できます。 %s は対象外です。オプション他のリビジョン:ブランチ間の差分を上書き現在のTipの親リビジョン親:パス:マージ保留プラグインインストール済みプラグイン: %(rows)d前へ前のハンクプロパティ:プル(&U)公開ブランチ:プル異なるブランチからプル最新の変更をここから取得:プッシュPythonインタプリタこのバージョンに戻す(&e)名前を変更する(&R)リバースチェリーピック(&v)待機中ディレクトリツリーを更新この場所をデフォルトとして記憶新たな親ブランチとして記憶しますこの場所をデフォルトとして保存削除ブックマークの削除シェルフ[%(id)d]の変更を、適用せずに破棄します。Bazaarのエラーを報告するリポジトリリポジトリフォーマット:リビジョン%(branch)sのリビジョン%(rev)sリビジョン %sリバースチェリーピッキングリビジョン%s~%sの変更を取り消し(リバースチェリーピッキング)します。リビジョン%s~%sの変更を%sで取り消し(リバースチェリーピッキング)します。元に戻す%sをリビジョン%s (ID:%s)に戻すファイルをこのバージョンに戻すリビジョン%s (ID:%s)に戻すこのリビジョンに戻す%(branch)sのリビジョンID%(revid)sリビジョンID: %sリビジョンリビジョン %sリビジョンIDリビジョン番号リビジョン:リビジョン:右側のエンコード右側のタブ幅ルートディレクトリ名:bzrコマンドを実行このリビジョンのファイルを保存する..このリビジョンのファイルを保存する...全選択/非選択ソースディレクトリを選択対象ディレクトリを選択すべて選択ブランチの場所を選択元に戻す変更を選択してくださいエディタを選択挿入するファイルを選択して下さい挿入するパスを選択して下さい作業ディレクトリを選択送信デフォルトに設定このコミットにより修正されるバグのIDを設定この変更の著者がコミッターと異なるなら、著者を設定qconfig の merge タブで外部のマージプログラムを設定してください選択されたマージツールをqconflictsのデフォルトにする設定:棚に上げるシェルフの管理%d個のファイルの変更をシェルフに棚上げします。表示注釈を表示する(&A)差異を表示(&D)差分を表示(&D)...ログを表示(&l)ツリーを表示(&T)...エラーの詳細を表示する)>>>ログを表示...すべての差分を表示(&d)すべての差分を表示(&d)...ファイルの差分を表示(&d)差分を表示(&d)...ファイル一覧を表示する無視したファイルを表示グループ内の追加、削除を緑と赤で表示するバージョン管理下にないファイルを表示署名:実際には作業ツリーは変更せずに、シェルフ[%(id)d]の変更を適用するシミュレーションを行います。サイズリポジトリ内に作業ツリーを作成しない削除すると元に戻せなくなるファイルが選択されています。本当に削除してもよろしいですか?スペルチェック言語(&L):開始...状態状態:送信するブランチ:要約切り替えチェックアウトの切り替え切り替え先ブランチ:システム情報タブ文字の幅(&W)タブ文字の幅タブの幅タブ文字の幅 qdiff、qannotate、qcatウインドウで使用されるオプションです。タグタグ"%s"は既にに登録されています。 既存のタグを移動しますか?タグ "%s" は存在しませんタグ "%s"はまだ存在しません。 新しいタグを作成しますか?このリビジョンにタグを付加する(&R)Tagsタグ:外部マージツールの定義が無効です。: '%(tool)s' フラグ '%(flags)s' が指定されていません。qconfigのマージタブで修正してください。このディレクトリはブランチです。何を更新したいか選択してください。このディレクトリのチェックアウト元: %sThunderbirdサイドバイサイド表示とUnidiff表示を切り替えますこのブランチを他のブランチのミラーに切り替えるURL割り当て解除ブランチの割り当て解除変更なしコミット取り消しコミットされていない作業ツリーの変更Unified形式で表示バージョン管理外のファイルすべて選択解除シェルフから戻す管理外バージョン管理外のファイル更新%sをリビジョン%s(リビジョンID:%s)に更新しますブランチ更新チェックアウトを更新このブランチのミラーを更新ソースを更新割り当てたブランチから作業ツリーを更新するリビジョン%s(リビジョンID:%s)に更新しますツリー %sを更新作業ツリーを更新作業ツリー(working tree)を branch の最新の状態に update するエディタを使用すでにあるディレクトリを使用する署名をチェックするバージョンバージョン:表示表示オプションバイナリファイルを表示選択されたファイルの変更点を見るrevert するように選択されているファイルの変更点を確認するディレクトリを表示ファイルを表示画像を表示棚上げされた変更の表示シンボリックリンクを表示テキストファイルを表示単語で検索行の折り返し作業ツリー作業ツリーオプション%s の作業ツリー作業ツリーにはコミットしていない変更が含まれています。作業ツリーが古いままです。'bzr update'を実行してください。作業ツリーは古くなっています。コミットするには、まず作業ツリーを更新してください。古い外部マージツール設定を取り込みますか? %(old_cmdline)s 新しい設定: %(new_cmdline)s不正なエンコードXDG Eメールクライアントコミットメッセージを入力してくださいタグ名の指定が必要です[バイナリファイル (%d byte)]\ ファイル終端に改行がない追加追加追加追加、紛失バグ #%s内容の競合削除削除親が削除されていますディレクトリ複製重複IDファイル修正済み無視紛失親が見つかりません変更変更されたファイルバイナリの変更ターゲットの変更テキストの変更移動親がディレクトリではありません管理外フォルダ構成のループパスの競合削除変名名称変更名称変更/修正変名されたファイルシンボリックリンクテキストの競合親のバージョンが定義されていません実行ビット././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/nl/LC_MESSAGES/0000755000000000000000000000000014556556456014277 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/nl/LC_MESSAGES/qbrz.mo0000644000000000000000000004374314556556456015625 0ustar00 |gx6y    %, 4BHQ`fn t     #1c4w   )4 8EKSk tW #"?A8     '@ HRb jw"~   %3-a * F4kM(  -E,Jw|   $  2 7 [B    #  T Q![! _!l!!%! !!! !?!7"<" A"K"^"p"<"""" #<#T#\#e# t########## ##$ .$8$ A$ M$Z$ k$u$$ $ $#$%+%(H%Cq%%%% %%&&5&O&5b&&&& &&&& & & 'K'\'a'g'}'M'T' 5(2A(0t((( (((( ()()(<)e) t)~) )) ) ))%)5)@1*sr**$*+6+R+ X+d+l+~+ + + +++++++ + , ,,$,,, A,O, W,e,x,M.k.... .. . .... //!/ */8/ A/K/S/c/i/r/ // ////// / ////00 '0u211 92 C2 O2 Y2c2x2~22 2 2i2'3.363>3S3n3V3H3(4 /4 =4I4P4`4q4 z4 4444 4 444 4 5(5F5O5 X5e5 n5y55 5 55;5:5+6A6J6\6p6w686 6L67*7747 7 78 87&8^8;f888 888 8888(9,9A9-[99 9`99: :#:?:W:aj::::: ;# ; D;R; Z;(d;O;;; ;; <-%<MS<2<'< <N =X=_=g===== ====== >> :> [>e> m> x>>>>>&>&>"?6?*Q?@|?H?@ @@ 1@>@T@m@@@@@@A"A@AUA\A dA qA ~A AOAAAA BMBUlB B;B8 CCCGCOCcC&{C CCCBC>D SD aDoDDDD DD1D6 ES@EvE F' FHFdF FFFFFF F FFFG GG3G FG RG ^G jGuG~GGGGG0DHMas6c >.V9"vA/oESP`j{l <hF,'fI^4#pGT\t?Kin7|_YW~e)R*gk :w1 Zy! $mdx}+[-2U@  q%X;bN QrC]&LBzO5u8J=(3%d conflict auto-resolved.%d conflicts auto-resolved.%d file%d files&About...&Annotate this revision&Author:&Bookmarks&Branch&Browse...&Cancel&Change the values&Close&Commit&Configure...&Diff&Editor:&External Diff&File&Filter&Find&Fixed bugs:&Help&Help...&Ignore and proceed&Launch...&Local commit&Location:&Merge&Merge conflict&Name:&OK&Push&Quit&Refresh&Search:&To:&User Interface&View&View OptionsQBzr — 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/QBzrA commit will be made directly to the master branch, keeping the local and master branches in sync.A local commit to the branch will be performed. The master branch will not be updated until a non-local commit is made.AbbreviationAborting...About QBzrAddAdd BookmarkAliasAliasesAll conflicts resolved.AnnotateArchive type:Are you sure you want to revert this file to the state it was at the selected revision?AuthorAuthor:AuthorsAuto-resolveBase directory for &branch sources:Base directory for &checkouts:Bazaar 2.4 or later is required for external mergetools supportBazaar 2.4 or newer is required to configure mergetools.BindBind branchBind to:BranchBranch location:Branch: %sBrowseBrowse...Bug TrackersBugsBuiltin DiffCase-insensitive patternChangesChildren:Close Goto LineCommandCommand LineCommitCommit changes into a new revisionCompleteComputerConfigurationConflictConflictsCurrently bound to:DateDefaultDescription:DiffDo not save backups of reverted filesDo you really want to remove the selected bookmark?Do you want to continue anyway?E-&mail:E-mail &client:Edit BookmarkEditorEncodingEncoding "%s" is invalid or not supported.Encoding:Enter the author's name, e.g. John Doe <jdoe@example.com>Enter the commit messageEnter the list of bug IDs in format tag:id separated by a space, e.g. project:123 project:765ErrorError while running merge tool (code %d)EvolutionExportExtensionExternal Diff Apps:External merge tool %(tool)s is not availableFileFile %s is not versioned. Operation aborted.FindFind on active panelFinished!GeneralGoGoto LineGoto Line: HelpIgnoreIgnore all files with this extensionIgnore by basenameIgnore by fullnameImport old external merge toolInfoInitializeIt is not possible to specify different file paths and different branches at the same time.KMailKind:Last modified:Launch an external diff applicationLeft side tab widthLoading...Local commits are not pushed to the master branch until a normal commit is performedLocation:LogM&erge tool:MAPI e-mail clientMark as &resolvedMaster branch location not specified.Merge PreviewMessageMessagesMessages and File text (indexed)Missing the flag: %s. Configure in qconfig under the merge tab.MuttNameNo actionNo action selectedNo changes found.No changes selected to commitNo changes selected to commit. Do you want to commit anyway?No changes selected to revertNo help can be found for %sNot a fileOperation is supported for a single file only, not for a %s.OptionsParents:Pending MergesProperties:Pu&llPushRefresh the directory treeRemoveRemove BookmarkRevRev %(rev)s for %(branch)sRev %sRevertRevert FileRevert to this revisionRevid: %(revid)s for %(branch)sRevid: %sRevisionRevision %sRevision IDsRevision NumbersRevision:Right side tab widthRoot directory name:Save file in this revision as...Save file on this revision as...Select base directory for checkoutsSelect branch locationSelect default directory for branch sourcesSet the IDs of bugs fixed by this commitSet the author of this change, if it's different from the committerShowShow &differencesShow &differences...Show &tree...Show all &differencesShow all &differences...Show file &differencesShow file &differences...Show ignored filesShow inter-group inserts and deletes in green and redShow non-versioned filesSizeSpell check &language:Starting...StatusStatus:SummaryTab &Width:Tab WidthTab widthTab width in characters option is used in qdiff, qannotate and qcat windowsTagsTags:Take "&OTHER" versionTake "&THIS" versionThis directory will be automatically filled in your branch source input fieldThis directory will be automatically filled in your checkout destination input fieldThunderbirdToggle between Side by side and Unidiff view modesTurn this branch into a mirror of another branchURLUnidiffUnknown FilesUnversioned FilesUpdate a mirror of this branchViewView OptionsView binary fileView changes in files selected to commitView changes in files selected to revertView directoryView fileView image fileView symlinkView text fileWord WrapWorking TreeWorking Tree for %sWorking tree has uncommitted changes.Working tree is out of date, please run 'bzr update'.Working tree is out of date. To commit, update the working tree.Would you like to import your previously configured external merge tool: %(old_cmdline)s as: %(new_cmdline)sXDG e-mail clientYou should provide a commit message.[binary file (%d bytes)]\ No newline at end of fileaddedadded filesbug #%scontents conflictdeleting parentdirectoryduplicateduplicate idfilefixedmissing parentmodifiedmodified filesnon-directory parentold_cmdlineparent looppath conflictremovedrenamedrenamed and modifiedrenamed filessymlinktext conflictunversioned parentProject-Id-Version: qbzr Report-Msgid-Bugs-To: POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2012-06-04 19:26+0000 Last-Translator: Hannie Dumoleyn Language-Team: Dutch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) %d conflict is automatisch opgelost.%d conflicten zijn automatisch opgelost.%d bestand%d bestanden&Over...Deze revisie &annoteren&Auteur:&Bladwijzers&Branch&Bladeren...&AnnulerenDe waarden &wijzigen&SluitenVastleggen (&commit)&Instellen...&Diff&Editor:&Externe Diff&Bestand&Filteren&ZoekenOpgeloste bugs:&Help&Help...&Negeren en doorgaan&Start...&Lokale commit&Locatie:&MergeS&amenvoegconflict&Naam:&OK&Push&Afsluiten&Verversen&Zoeken:&Naar:&GebruikersinterfaceBekijk&WeergaveoptiesQBzr — Een grafische gebruikersinterface voor Bazaar
Versie %(qbzr_version)s (bzrlib %(bzrlib_version)s)

Copyright © 2006-2008 Lukáš Lalinský en anderen

http://bazaar-vcs.org/QBzrEr zal rechtstreeks op de master branch gecommit worden, zodat de lokale en master branches gesynchroniseerd blijven.Er zal een lokale commit op de branch worden uitgevoerd. De master branch zal niet worden bijgewerkt totdat een niet-lokale commit wordt gedaan.AfkortingAfbreken...Over QBzrToevoegenBladwijzer toevoegenAliasAliassenAlle conflicten zijn opgelost.AnnoterenArchieftype:Weet u zeker dat u dit bestand terug wilt brengen in de staat waarin het was in de geselecteerde revisie?AuteurAuteur:AuteursAutomatisch oplossenBasismap voor &branchbron:Basismap voor &checkouts:Voor de ondersteuning van externe samenvoeghulpmiddelen is Bazaar 2.4 of later vereistBazaar 2.4 of later is vereist om samenvoeghulpmiddelen te configureren.BindenBrinch bindenBinden aan:BranchBranch-locatie:Branch: ‘%s’BladerenBladeren...Bug TrackersBugsIngebouwde diffHoofdlettergevoelig patroonWijzigingenKinderen:"Ga naar regel" sluitenOpdrachtOpdrachtregelVastleggen (commit)Commit wijzigingen in een nieuwe revisieVoltooidComputerInstellingenConflictConflictenMomenteel gebonden aan:DatumStandaardBeschrijving:DiffBewaar geen reservekopie van de ongedaan gemaakte bestandenWil je werkelijke de geselecteerde bladwijzer verwijderen?Wilt u toch doorgaan?E-&mail:E-_mailprogramma:Bladwijzer bewerkenEditorCoderenCodering ‘%s’ is ongeldig of wordt niet ondersteund.Codering:Voer de naam van de auteur in, b.v. John Doe <jdoe@example.com>Voer het commit-bericht inVoer de lijst van bug IDs in volgens het patroon tag:id, gescheiden door een spatie, bijvoorbeeld: project:123 project:765FoutFout tijdens het gebruik van de merge tool (code %d)EvolutionExporterenExtensieExterne Diff-toepassingen:Extern samenvoeghulpmiddel %(tool)s is niet beschikbaarBestandBestand %s is niet onder versiebeheer. Operatie afgebroken.ZoekenZoeken op actieve paneelVoltooid!AlgemeenGaGa naar regelGa naar regel: HelpNegerenAlle bestanden met deze extensie negerenOp basisnaam negerenOp volledige naam negerenOude externe samenvoeghulpmiddelen importerenInfoInitialiseerHet is niet mogelijk verschillende bestandspaden en verschillende branches tegelijk op te geven.KMailSoort:Laatst gewijzigd:Een externe diff-toepassing startenBreedte tabsprong linksBezig met laden...Lokale commits worden niet naar de master branch gepushed totdat een normale commit is uitgevoerdLocatie:Logboek&Samenvoeghulpmiddel:MAPI e-mail programmaMarkeren als &opgelostHoofdbranch-locatie niet opgegeven.Merge PreviewBerichtBerichtenBerichten en bestandstekst (geindexeerd)De vlag %s ontbreekt. Configureer dit in qconfig onder het tabblad Samenvoegen.MuttNaamGeen actieGeen actie geselecteerdGeen wijzigingen gevonden.Geen wijzigingen geselecteerd om te committenEr zijn geen wijzigingen geselecteerd om te committen. Wilt u toch committen?Geen wijzigengen geselecteerd om ongedaan te makenEr is geen hulp gevonden voor %sGeen bestandBewerking kan alleen gebruikt worden voor een enkel bestand, niet voor een %s.OptiesOuders:Nog uit te voeren mergesEigenschappen:Pu&llPushVervers de folderboomVerwijderenBladwijzer verwijderenRevRev %(rev)s voor %(branch)sRev %sOngedaan makenBestand herstellenNaar deze revisie terugzettenRevid: %(revid)s voor %(branch)sRevid: %sRevisieRevisie %sRevisie ID'sRevisienummersRevisie:Breedte tabsprong rechtsNaam hoofdmap:Bestand in deze revisie opslaan als…Bestand met deze revisie oplaan als...Basismap voor checkouts selecterenBranch-locatie selecterenStandaardmap voor branchbronnen selecterenStel de IDs van de bugs vast die met deze commit worden opgelostStel de auteur van deze wijziging in, als die anders is dan de committerTonenToon verschillenToon verschillen...Toon boom...Toon alle verschillenToon alle verschillen...Toon bestandsverschillenToon bestandsverschillen...Toon genegeerde bestandenToon inter-groep toevoegingen en verwijderingen in groen en roodToon niet-beheerde bestandenGrootte&Taal voor Spellingscontrole:Bezig met starten...StatusStatus:SamenvattingTab&breedte:TabbreedteTab-breedteTabbreedte in tekens optie wordt gebruikt in qdiff-, qannotate- en qcatvenstersTagsLabels:"&ANDERE" versie nemen"&DEZE" versie nemenDeze map zal automatisch ingevuld worden in het invoerveld voor uw branchbronDeze map zal automatisch ingevuld worden in het invoerveld voor uw checkoutbestemmingThunderbirdWisselen tussen de weergavemodi "Naast elkaar" en "Unidiff"Verander deze branch in een mirror van een andere branchURLUnidiffOnbekende bestandenNiet-beheerde bestandenActualiseer een mirror van deze branchWeergevenWeergaveoptiesBekijk binair bestandBekijk de wijzigingen in de bestanden geselecteerd om te committenBekijk wijzigingen in de bestanden die ongedaan worden gemaaktBekijk folderBestand tonenBekijk beeldbestandBekijk symlinkBekijk tekstbestandRegelafbrekingWorking TreeWorking tree voor %sDe working tree heeft niet gecommitte wijzigingenDe working tree is niet actueel, run aub 'bzr update'.Werkboomstructuur is verouderd. Om te committen, eerst werkboomstructuur bijwerken.Wilt u uw eerder geconfigureerde externe samenvoeghulpmiddelen importeren: %(old_cmdline)s als: %(new_cmdline)sXDG e-mail programmaU dient een commit-bericht op te geven.[binair bestand (%d bytes)]Geen newline aan einde bestandtoegevoegdtoegevoegde bestandenbug #%sconflicterende inhoudparent verwijderenfolderduplicaatdubbel idbestandhersteldontbrekende parentgewijzigdaangepaste bestandenniet-folder parentold_cmdlineparent looppadconflictverwijderdhernoemdhernoemd en gewijzigdhernoemde bestandensymlinkconflicterende textparent niet onder versiebeheer././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/pl/LC_MESSAGES/0000755000000000000000000000000014556556456014301 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/pl/LC_MESSAGES/qbrz.mo0000644000000000000000000005544014556556456015624 0ustar00t \(6)` q{       & / 5 = J P Y d r }             !! !&! <<<<<<<< = ==&= .= 8=D=M=\=b=j====== = == ==/>2>9>I>Q>U> ^> h> r>}>> > >> >> >>> ?$? +? 8?D?U?f?u? ? ? ??????y@bAA A A B BB#B4B;BABHB hB uBBBBBBBB B BBC C "C ,C 9CEC TCaC{CC CC CCCACD0D EDOD"WD zDDD DD DDD(DEC1EuEGEEEE EEF F#F )F3F6;F1rFFFFF FF F7G :G:EGGGMGGnHH1H-H HHHI5I=I6BI yI II I IIIIIIII J J $J 0J>JDJIJ aJmJ JJcJ/K >K KKWK`KpKK KK!K0K L%L 7L CL PL,\LLLLL L L"LFL"?M#bM MMMM%MN NN /N k ;rA"eXqFf8$/U3.+cF]x9nU21?#5qbE!G>a6^&y\S! 7RPD g*<B%cz[_k(=VZNs\) -h/ :&;dowYaT<ptL0(LO#BhO^ WsKQ1.]Qf?$*'[D7S_= mIY%RM J 0ruV` g"GjIPKo'+j` bH6~9N:ZWtllipv8@|{M44})T5AXCmnd ,J23,@%d conflict auto-resolved.%d conflicts auto-resolved.%d file%d files&About...&Action:&Add&Add Bookmark...&Annotate this revision&Author:&Bookmarks&Branch&Browse...&Cancel&Close&Command:&Commit&Configure...&Diff&Edit&Edit Bookmark...&Editor:&File&Filter&Fixed bugs:&Help&Help...&Launch...&Local commit&Location:&Mark as moved&Mark as moved and renamed&Merge&Merge conflict&Name:&OK&Open&Push&Quit&Refresh&Remove Bookmark...&Retry&Revert&Revision:&Search:&Select...&Show hidden commands&Tag name:&To:&Update to this revision&User Interface&View&View Options&View file&Working directory:(bzr-config-dir)(bzr-lib-path)(bzr-log-file)(bzr-version)(no description)(python-file)(python-lib-dir)(python-version)...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/QBzrA commit will be made directly to the master branch, keeping the local and master branches in sync.A local commit to the branch will be performed. The master branch will not be updated until a non-local commit is made.AbbreviationAborted!Aborting...About QBzrActionAddAdd BookmarkAddress:AliasAliasesAll conflicts resolved.AnnotateArchive type:AuthorAuthor:AuthorsAuto-resolveBazaar ConfigurationBindBind branchBind to:BookmarksBound to:BranchBranch location:Branch:Branch: %sBrowseBrowse...Bug TrackersBug:Bugs:BugsBuiltin DiffC&ategory:Case sensitiveChangedChangesChildren:Click a link for more information about checkouts and branches.Close ApplicationClose Error DialogCommandCommitCommit changes into a new revisionCommitter:CompleteComputerConfigurationConflictConflictsCreate a checkoutCreate a new Bazaar Working TreeCreate a new shared repositoryCreate a new standalone treeCreate a stacked branch referring to the source branchCreate new tagCreate the path up to the branch if it does not existCurrently bound to:DateDate:DefaultDelete existing tagDescriptionDescription of formatDescription:DiffDirectoryDo not save backups of reverted filesDo you really want to remove the selected bookmark?Do you want to continue anyway?E-&mail:E-mail &client:Edit BookmarkEdit tagEditorEncodingEncoding "%s" is invalid or not supported.Encoding:Ensure all revisions are appended to the logEnter PasswordEnter UsernameEnter the author's name, e.g. John Doe <jdoe@example.com>Enter the commit messageEnter the list of bug IDs in format tag:id separated by a space, e.g. project:123 project:765ErrorError while running bzr. (error code: %d)Error while running merge tool (code %d)EvolutionExportExternal Diff Apps:Failed to start bzr.Failed!FileFile %s is not versioned. Operation aborted.File NameFilename:FindFind: Finished!GeneralGoGoto LineGoto Line: HelpHelp for commandIgnore ErrorIgnoredInfoInitializeInsert &directory...KMailKind:Last modified:Library:Light-weight checkoutLoading...Local DirectoryLocal commits are not pushed to the master branch until a normal commit is performedLocal directory where the working tree will be createdLocation:LocationsLogLog File:M&erge tool:MAPI e-mail clientMake a local copy of the branchMark as &resolvedMark conflict &resolvedMaster branch location not specified.MergeMerge PreviewMessageMessage:MessagesMessages and File text (indexed)Most recent (tip) revisionMove existing tagMuttNameNextNo changes found.No changes selected to commitNo changes selected to commit. Do you want to commit anyway?No changes selected to revertNo help can be found for %sNo working tree exists for "%s"Not a branch "%s"Not a branch: %sOptionsOverwrite differences between branchesParents:Path:Pending MergesPluginsPreviousProperties:Pu&llPublic Branch:PullPull a different branchPull most recent changes from:PushPython InterpreterR&evert to this revisionRe&nameReadyRefresh the directory treeRemember these locations as defaultsRemember this as the new parent branchRemember this location as a defaultRemoveRemove BookmarkRepositoryRepository Format:RevRev %(rev)s for %(branch)sRev %sRevertRevert %s to revision %s revid:%s.Revert FileRevert to revision %s revid:%s.Revert to this revisionRevid: %(revid)s for %(branch)sRevid: %sRevisionRevision %sRevision IDsRevision NumbersRevision:Revisions:Root directory name:Run bzr commandSelect / deselect allSelect Source DirectorySelect Target DirectorySelect branch locationSelect editor executableSelect files to insertSelect working directorySendSet the IDs of bugs fixed by this commitSet the author of this change, if it's different from the committerSettings:ShowShow &differencesShow &differences...Show &logShow &tree...Show Log...Show all &differencesShow all &differences...Show file &differencesShow file &differences...Show ignored filesShow inter-group inserts and deletes in green and redShow non-versioned filesSizeSkip the creation of working trees in this repositorySpell check &language:Starting...StatusStatus:Submit Branch:SummarySwitchSystem InformationTagTag "%s" already exists. Do you want to move existing tag?Tag "%s" does not existsTag "%s" does not exists yet. Do you want to create new tag?Tag &revision...TagsTags:This directory is a branch. Please select what you would like to updateThis directory is a checkout of: %sThunderbirdTurn this branch into a mirror of another branchURLUnbindUnbind branchUnchangedUnidiffUnversionedUnversioned FilesUpdateUpdate %s to revision %s revid:%s.Update BranchUpdate CheckoutUpdate a mirror of this branchUpdate sourceUpdate the working tree from the bound branchUpdate to revision %s revid:%s.Update working tree to the latest changes in the branchUse existing directoryVersionVersion:ViewView binary fileView changes in files selected to commitView changes in files selected to revertView directoryView fileView image fileView symlinkView text fileWhole wordsWord WrapWorking TreeWorking Tree OptionsWorking Tree for %sWorking tree has uncommitted changes.Working tree is out of date, please run 'bzr update'.Working tree is out of date. To commit, update the working tree.Wrong encodingXDG e-mail clientYou should provide a commit message.You should specify tag name\ No newline at end of fileaddedadded filesadded, missingbug #%scontents conflictdeleted filesdeleting parentdirectoryduplicateduplicate idfilefixedignoredmissingmissing parentmodifiedmodified filesmovednon-directory parentnon-versionedpath conflictremovedrenamedrenamed and modifiedrenamed filessymlinktext conflictProject-Id-Version: qbzr Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2010-10-02 10:55+0000 Last-Translator: Radosław Piliszek Language-Team: Polish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) %d konflikt automatycznie rozwiązany.%d konfliktów automatycznie rozwiązanych.%d plików%d plik%d plików&O programie...&Akcja:Dod&aj&Dodaj zakładkę...&Zaznacz tę rewizję&Autor:&Zakładki&Gałąź&Przeglądaj...&Anuluj&Zakończ&Polecenie:&Wyślij&Konfiguruj...&Diff&Edycja&Edytuj zakładkę...&Edytor:&Plik&Filtr&Naprawione błędy:&Pomoc&Pomoc...&Launch...&Lokalne wysłanie&Lokalizacja:&Oznacz jako przesunięte&Oznacz jako przesunięte i o zmienionej nazwie&MergeKonflikt &Merge&Nazwa:&OK&Otwórz&Popchnij&Zakończ&Odśwież&Usuń zakładkę...&Ponów&Przywróć&Rewizja:&Szukaj:&Wybierz...&Pokazuj ukryte polecenia&Nazwa tagu:&Do:Zaktualizuj do tej rewizji&Interfejs użytkownika&WidokPokaż opcjePokaż plik&Katalog roboczy(bzr-config-dir)(bzr-lib-path)(bzr-log-file)(bzr-version)(brak opisu)(python-file)(python-lib-dir)(python-version)...Qbzr - Graficzny interfejs dla Bazaar
Wersja %(qbzr_version)s (bzrlib %(bzrlib_version)s)

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

http://bazaar-vcs.org/QBzrZmiana zostanie wysłana bezpośrednio do głównej gałęzi, zachowując lokalną i główną gałąź zsynchronizowane.Lokalna zmiana w gałęzi zostanie dokonana. Główna gałąź nie zostanie zaktualizowana dopóki zwykła zmiana nie zostanie dokonana.SkrótPrzerwane!Porzucanie...O QBzrCzynnośćDodajDodaj zakładkęAdres:AliasAliasyWszystkie konflikty rozwiązaneObjaśnienieTyp archiwum:AutorAutor:AutorzyAuto-rozwiązywanieKonfiguracja BazaarPołączPołącz gałęzięPrzypisz do:ZakładkiPrzypisany do:GałąźPołożenie gałęzi:Gałąź:Gałąź: %sPrzeglądajPrzeglądaj...Bug trackersBłędy:Błąd:Błędy:BłędyWbudowany program diffKategoriaRozróżniaj wielkość literZmienioneZmianyDzieci:Kliknij na łącze po więcej informacji o kopiach i gałęziach.Zamknij aplikacjęZamknij okno błęduPolecenieWyślijWyślij zmiany jako nową rewizjęWysyłający:PełneKomputerKonfiguracjaKonfliktKonfliktyUtwórz kopię gałęziStwórz nowe drzewo BazaarStwórz nowe wspóldzielone repozytoriumStwórz nowe odrębne drzewoUtwórz stosową gałąź odnoszącą się do gałęzi źródłowejUtwórz nowy tagUtwórz wszystkie podkatalogi ścieżki gałęzi, jeśli nie istnieją.Obecnie przypisane do:DataData:DomyślnieUsuń istniejący tagOpisOpis formatuOpis:RóżniceKatalogNie zachowuj kopii zapasowych i przywróconych plikówCzy na pewno chcesz usunąć wybraną zakładkę?Kontynuować mimo tego?&E-mailKlient &poczty:Edytuj zakładkęEdytuj tagEdytorKodowanieKodowanie "%s" jest nieprawidłowe lub nieobsługiwane.Kodowanie:Sprawdź, czy wszystkie rewizje są umieszczone w historiiWprowadź hasłoWprowadż Nazwę UżytkownikaWprowadź imię autora, np. Jan Kowalski <jkowalski@example.com>Wprowadź opis zmianyWprowadź listę ID błędów w formacie tag:id oddzielnych spację, np. project:123 project:765BłądBłąd w trakcie działania bzr. (error code: %d)Błąd podczas działania merge tool (kod %d)EvolutionEksportZewnętrzny program diff:Nie udało się uruchomić bzr.Błąd!PlikPlik %s nie podlega wersjonowaniu. Operacja przerwana.Nazwa plikuNazwa pliku:SzukajZnajdź: Zakończono!OgólnePrzejdźPrzejdź do liniiPrzejdź do linii: PomocPomoc poleceniaZignoruj błądIgnorowanyInformacjeInicjalizujWstaw katalogKMailTyp:Ostatnio zmodyfikowany:Biblioteka:Utwórz lekką kopię gałęziŁadowanie...Lokalny katalogLokalne zmiany nie są wysyłane do głównej gałęzi dopóki zwykłe wysłanie nie jest dokonane.Lokalny katalog gdzie drzewo zostanie utworzoneLokalizacja:PołożeniaHistoriaPlik dziennika:Narzędzie M&erge:MAPI e-mail clientStwórz lokalną kopię gałęziOznacz jako &resolvedOznacz konflikt jako &rozwiązanyPołożenie głównej gałęzi nie sprezycowane.ScalPodgląd scalaniaWiadomośćWiadomość:WiadomościTekst wiadomości i plików (zindeksowanych)Ostatnia rewizjaPrzenieś istniejący tagMuttNazwaNastępnyBrak zmian.Nie wybrano zmian do zatwierdzeniaNie wybrano żadnych zmian do wysłania. Czy na pewno chcesz wysłać?Nie wybrano zmian do przywróceniaNie znaleziono pomocy dla %sNie istnieje drzewo robocze "%s""%s" nie jest gałęziąTo nie jest gałąź: %sOpcjeNadpisz różnice między gałęziamiRodzice:Ścieżka:Oczekujące scalenia:RozszerzeniaPoprzedniWłaściwości:WyciągnijOpublikuj gałąźWyciągnijWyciągnij inną gałąźWyciągnij ostatnie zmiany z:PopchnijInterpreter PythonaPrzywróć stan z tej rewizjiZ&mień nazwęGotowyOdśwież drzewoUstaw te lokalizacje jako domyślneZapamiętaj to jako gałąź-rodzic.Zapamiętaj tę lokalizację jako domyślnąUsuńUsuń zakładkęRepozytoriumFormat repozytorium:RewizjaRewizja %(rev)s for %(branch)sRewizja %sWycofajPrzywróć %s do rewizji %s revid:%s.Przywróć plikPrzywróć do rewizji %s revid:%s.Przywróć do tej rewizjiID rewizji: %(revid)s dla %(branch)sID rewizji: %sRewizjaWersja %sID rewizjiNumery rewizjiRewizja:RewizjeNazwa katalogu głównego:Uruchom bzrZaznacz / odznacz wszystkieWybierz katalog źródłowyWybierz katalog docelowyWybierz lokalizację gałęzi.Wybierz edytorWybierz pliki do wstawieniaWybierz katalog roboczyWyślijUstal ID błędów naprawionych w tej zmianieUstal autora zmiany, jeśli jest inny niż wysyłającyUstawienia:PokażPokaż &differencesPokaż &różnice...Pokaż &dziennikPokaż drzewo...Pokaż historię...Pokaż wszystkie różnicePokaż wszystkie różnicePokaż różnice plikuPokaż różnice plikuPokaż pliki ignorowanePokazuj wewnętrzne dodania i usunięcia w kolorze zielonym i czerwonymPokaż niewersjonowane plikiRozmiarOpuść tworzenie drzew w tym repozytoriumSprawdź poprawność pisownii:Uruchamianie...StatusStatus:Zgłoś gałąźPodsumowaniePrzełączInformacje o systemieTagTag "%s" już istnieje. Czy chcesz przenieść istniejący tag?Tag "%s" nie istnieje.Tag "%s" nie istnieje jeszcze. Chcesz utworzyć nowy tag?Otaguj rewizję...ZnacznikiTagi:Ten katalog jest gałęzią. Sprecyzuj co chciałbyś zaktualizować.Ten katalog jest kopią: %sThunderbirdUczyń tę gałąź wersją lustrzaną innej gałęziURLOdłączOdłącz gałąźNiezmienionyUnidiffNie wersjonowanePliki niewersjonowaneAktualizujZaktualizuj %s do rewizji %s revid:%s.Aktualizuj gałąźZaktualizuj kopięZaktualizuj wersję lustrzaną tej gałęziŹródło aktualizacjiZaktualizuj drzewo z powiązanej gałęziZaktualizuj do rewizji %s revid:%s.Zaktualizuj drzewo do ostatnich zmian w gałęziUżyj istniejącego kataloguWersjaWersja:WidokZobacz plik binarnyPrzejrzyj zmiany w plikach wybranych do zgłoszeniaPokaż zmiany w plikach do przywróceniaPrzeglądaj katalogPodgląd plikuZobacz obrazekZobacz łącze symboliczneZobacz plik tekstowyCałe wyrazyZawijanie wierszyDrzewoOpcje drzewaDrzewo dla %sDrzewo robocze posiada niezatwierdzone zmiany.Drzewo robocze jest przedatowane, uruchom 'bzr update'.Drzewo robocze jest przedatowane. Aby wykonać commit, zaktualizuj drzewo robocze.Złe kodowanieXDG e-mail clientMusisz wpisać wiadomość commitu.Powinieneś podać nazwę tagu.\ Brak pustej linii na końcu plikudodanododane plikidodany, brakującybłąd #%skonflikt zawartościusunięte plikiusuwanie przodkakatalogduplikatpodwójne idplikustalonyzignorowanobrakującebrakujący przodekzmodyfikowanozmodyfikowane plikiprzeniesionyprzodek poza katalogiemniewersjonowanykonflikt ścieżkiusuniętoprzesuniętoprzesunięto i zmodyfikowanoprzesunięte plikiłącze symbolicznekonflikt tekstu././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/pt_BR/LC_MESSAGES/0000755000000000000000000000000014556556456014674 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/pt_BR/LC_MESSAGES/qbrz.mo0000644000000000000000000006533314556556456016221 0ustar00 A $6!$X$ i$s$|$$$$$ $$ $$$$ $% % % $%.%4%:%L%U%d%j%r% x%%%%%% %% % %%& &1&8&?&C&#I&m&s&y&&&& && && &&&'' ' ''2'F'W'f' u'' ' ''''' 'c'w]( (( ( () ) ))#)))'1)Y)q) z)W)))) )?*D*Y*h* m*y* **** ** * * ** * ** +%+C+K+ S+]+m+++ ++ ++ +++ ++ + ,(, D,e,,,5,,,,- -- (-4- J-W-_- d-%n-3-2--.$. 4.B.K.e.l.*u. ...F./k(//)/(/ // /00-10_0t0|0,0 0 0000 0000 0 111)1/121 91$F1 k1u11111 111[1K2Q2V2\2#k2222 222T363 4 4*4 .4 84E4X4j4%44 4444 44 555 5 "5,5?5<Q55"55566 &6816<j666&66667 7(7 17 ?7K7Z7_7d7w7777$7#78 8 8$878;8V8]8"d8 8888 88 8 99 (9 29=9Q9f9{9 9 9999 ::5:N:g:~::: :(:C: +;5;:;I;[; p; z;; ;;;;; <<,< E<P<5U<< <<<<<<< < < =K=Z=^=w=|=H= =2=0 >;> ?>I> Q> _> l>x>>"> >>>?? $?/?F?X?`?i? n?{?(?(?? ??@ @ "@ ,@9@N@%b@5@@@@A$ AEAaAzAAA AAA A AA A A BBB!B)B1B:B IBUB[B pB ~BBBBB BB BBBODD DE EE+EGEOE XEdE lE xEEE EE EE EEEEE E FF F(F:F>F EFOF"dF FF FFFFFG GGG&G EGOG UG`GtG G G GGG GGGHHH:HNHgHxHH HHH HHHHHIk&II J "J ,J 9JFJ MJWJ jJuJ}JAJJJJbJbKhKoKwKUKKKL L (L 6LALFL]LcLlL uLL LL L LL7L*M1M :MGMOMbMvMM MMMMM M MMN N,N'@N)hN(N#NNEN4ONOSOYOaOiO OO OOO O*O.O?#PcPPPP P"PP P:P *Q8QGQEbQQmQ2R.7RAfR RR RR!RASBS[ScS8kSSSSS S S S TTT#T4T:TOTVTYT aT,nT TTTTT T UU.U_IUUUUU#UU'V >V JVXViV]8W8WWWWWWX)X@X/[XXXX X X)XXYY YY%Y4YOYSoY Y1Y$Z,;ZhZ}ZZ:ZLZ,[5[-E[s[y[[[[[[ [ [[[[ \ )\3\":\"]\\\\ \\\ \ ]])]C]&T]{])]]] ]]^ ^ %^0^&N^u^^%^%^^_"(_K_[_#w_!_"_ _"`$`+`0@`Mq`````a a#a6aSaba aaaaa b 6bBb>Jbb bbb bbbbbc+c^BcccccPc dA$d)fdddddddd e*e=eOe'oeee eee ff f&fAf<_f5ffffg.g@gPgdgg4gIgWhwhh.h$hh!i6i HiSihipiii i i i ii iii ijj,j3jGjWjkj tj ~jjjjjjR  IFL[5 @zje1( ,i\,u8at >E<qo -JD7;!pOm_>?0I&{-38y Vc+i$#'shQY 1^*f@)dSYgn%'bB6Pqxc GNn4pr3" 7Nel\9/;Z Pr^KTX#w~?`4yDh.5Ww=CbjT&_"~C{+of6QBdL2] A0AS:Z=vlREKuvUk%<]sa/2*|WO}[XmJ$GH`:.|Ht)F(xV9}!MkUzMg%d conflict auto-resolved.%d conflicts auto-resolved.%d file%d files&About...&Action:&Add&Add Bookmark...&Annotate this revision&Author:&Basic&Bookmarks&Branch&Browse...&Cancel&Change the values&Close&Command:&Commit&Complete&Configure...&Detailed&Diff&Edit&Edit Bookmark...&Editor:&External Diff&File&Filter&Find&Fixed bugs:&From:&Help&Help...&Ignore and proceed&Ignore whitespace changes&Launch...&Layout&Local commit&Location:&Mark as moved&Mark as moved and renamed&Mark as renamed&Merge&Name:&OK&Open&Options and arguments for command:&Push&Quit&Refresh&Remove Bookmark...&Retry&Revert&Revision:&Search:&Select...&Show hidden commands&Tag name:&To:&Update to this revision&User Interface&View&View Options&View file&Working directory:(bzr-config-dir)(bzr-lib-path)(bzr-log-file)(bzr-version)(no description)(no message)(python-file)(python-lib-dir)(python-version)...<<< Hide Error DetailsA commit will be made directly to the master branch, keeping the local and master branches in sync.A local commit to the branch will be performed. The master branch will not be updated until a non-local commit is made.AbbreviationAborted!Aborting...About QBzrActionAddAdd BookmarkAddress:AliasAliasesAll commits signed with verifiable keysAll conflicts resolved.AnnotateArchive type:Are you sure you want to revert this file to the state it was at the selected revision?AuthorAuthor:AuthorsAuto-resolveBazaar 2.4 or later is required for external mergetools supportBazaar ConfigurationBazaar LibraryBindBind branchBind to:BookmarksBranchBranch location:Branch:Branch: %sBrowseBrowse...Bug TrackersBug:Bugs:BugsBuiltin DiffC&ategory:Case sensitiveCase-insensitive patternChange editor is not defined.ChangedChangesChildren:Close %s WindowClose ApplicationClose Error DialogClose Goto LineClose WindowCommandCommand LineCommitCommitter:CompleteComputerConfigurationConflictConflictsCould not locate "bzr" script.Could not locate "bzr.exe".Create a new Bazaar Working TreeCreate a new shared repositoryCreate a new standalone treeCreate new tagCreate the path up to the branch if it does not existCurrently bound to:DateDate:DefaultDeleteDelete existing tagDescriptionDescription of formatDescription:DestroyDiffDirectoryDo not save backups of reverted filesDo you really want to remove the selected bookmark?Do you really want to revert the selected file(s)?Do you want to continue anyway?E-&mail:E-mail &client:Edit BookmarkEdit tagEdited by change editor. EditorEncodingEncoding "%s" is invalid or not supported.Encoding:Enter PasswordEnter UsernameEnter the author's name, e.g. John Doe <jdoe@example.com>Enter the commit messageEnter the list of bug IDs in format tag:id separated by a space, e.g. project:123 project:765ErrorError while running bzr. (error code: %d)Error while running merge tool (code %d)EvolutionExportExtensionExternal Diff Apps:External Merge ToolsExternal merge tool %(tool)s is not availableFailed to start bzr.Failed!FileFile %s is not versioned. Operation aborted.File NameFilename:FindFind on active panelFind: Finished!FormGeneralGoGoto LineGoto Line: HelpHelp for commandHunksIdIgnoreIgnore ErrorIgnore all files with this extensionIgnore asIgnore by basenameIgnore by fullnameIgnore whitespaceIgnoredInfoInitializeInsert &directory...Insert &filenames...It is not possible to specify different file paths and different branches at the same time.KMailKeepKind:Last modified:Launch an external diff applicationLeft side encodingLeft side tab widthLibrary:Loading...Local DirectoryLocal branch is out of date with master branch. To commit to master branch, update the local branch. You can also pass select local to commit to continue working disconnected.Local commits are not pushed to the master branch until a normal commit is performedLocal directory where the working tree will be createdLocation:LocationsLogLog File:M&erge tool:MAPI e-mail clientMark as &resolvedMark conflict &resolvedMaster branch location not specified.MergeMerge PreviewMessageMessage:MessagesMessages and File text (indexed)Move existing tagMuttNameNextNext hunkNo actionNo action selectedNo changes found.No changes selected to commit. Do you want to commit anyway?No changes selected.No help can be found for %sNo other revision specified.No working tree exists for "%s"Not a branch "%s"Not a branch: %sNot a fileOperation aborted because target files has been changed.Operation is supported for a single file only, not for a %s.OptionsOther revision:Overwrite differences between branchesParents:Path:Pending MergesPluginsPlugins installed: %(rows)dPreviousPrevious hunkProperties:Public Branch:PullPushPython InterpreterR&evert to this revisionRe&nameReadyRefresh the directory treeRemember these locations as defaultsRemember this location as a defaultRemoveRemove BookmarkRepositoryRepository Format:RevRev %(rev)s for %(branch)sRev %sRevertRevert %s to revision %s revid:%s.Revert FileRevert to revision %s revid:%s.Revert to this revisionRevid: %(revid)s for %(branch)sRevid: %sRevisionRevision %sRevision IDsRevision NumbersRevision:Revisions:Right side encodingRight side tab widthRoot directory name:Run bzr commandSave file in this revision as...Save file on this revision as...Select / deselect allSelect Source DirectorySelect Target DirectorySelect allSelect branch locationSelect changes to revertSelect editor executableSelect files to insertSelect path to insertSelect working directorySendSet DefaultSet the IDs of bugs fixed by this commitSet the author of this change, if it's different from the committerSettings:ShowShow &annotateShow &differencesShow &differences...Show &logShow &tree...Show Error Details >>>Show Log...Show all &differencesShow all &differences...Show file &differencesShow file &differences...Show filelistShow ignored filesShow non-versioned filesSignature:SizeSkip the creation of working trees in this repositorySpell check &language:Starting...StatusStatus:Submit Branch:SummarySwitchSystem InformationTab &Width:Tab WidthTab widthTab width in characters option is used in qdiff, qannotate and qcat windowsTagTag "%s" does not existsTagsTags:This directory is a branch. Please select what you would like to updateThunderbirdToggle between Side by side and Unidiff view modesTurn this branch into a mirror of another branchURLUnchangedUnidiffUnknown FilesUnselect allUnversionedUnversioned FilesUpdateUpdate %s to revision %s revid:%s.Update BranchUpdate a mirror of this branchUpdate to revision %s revid:%s.Update tree %sUpdate working treeUse editorUse existing directoryVerify SignaturesVersionVersion:ViewView OptionsView binary fileView changes in files selected to commitView changes in files selected to revertView directoryView fileView image fileView text fileWhole wordsWord WrapWorking TreeWorking Tree OptionsWorking Tree for %sWorking tree has uncommitted changes.Working tree is out of date, please run 'bzr update'.Working tree is out of date. To commit, update the working tree.Wrong encodingXDG e-mail clientYou should provide a commit message.You should specify tag name[binary file (%d bytes)]\ No newline at end of fileadd fileaddedadded filesbug #%scontents conflictdelete filedeleted filesdeleting parentdirectoryduplicateduplicate idfilefixedignoredmissingmodifiedmodified filesmodify textmovednon-directory parentnon-versionedpath conflictremovedrenamerenamedrenamed and modifiedrenamed filessymlinktext conflictx-bitProject-Id-Version: qbzr Report-Msgid-Bugs-To: POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2012-04-11 20:16+0000 Last-Translator: Dedeco Language-Team: Brazilian Portuguese MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n > 1; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) %d conflito resolvido automaticamente.%d conflitos resolvidos automaticamente.%d arquivo%d arquivos&Sobre...&Ação:&Adicionar&Adicionar marcador...Fazer not&as desta revisão&Autor:&Básico&Marcadores&Branch&Navegar...&Cancelar&Mudar os valores&Fechar&Comando:&Commit&CompletarCon&figurar...&Detalhado&Diff&Editar&Editar marcador...&Editor:Diff &externo&Arquivo&Filtrar&ProcurarBugs &corrigidos:De:A&judaA&juda...&Ignorar e continuar&Ignorar mudanças de espaçamento&Lançar...&LayoutGravar &local&Localização:&Marcar como movido&Marcar como movido e renomeado&Marcar como renomeado&Mesclar&Nome:&OKAbrir&Opções e argumentos para o comando:Em&purrar&Sair&Atualizar&Remover marcador..Tenta&r novamente&ReverterRevisão:&Pesquisar:&Selecionar...&Mostrar comandos ocultosNome da &tag:&Para:At&ualizar para esta revisãoInterface do &usuário&VerOpções de &visualização&Visualizar arquivoDiretório de &trabalho:(bzr-config-dir)(bzr-lib-path)(bzr-log-file)(bzr-version)(sem descrição)(sem mensagens)(python-file)(python-lib-dir)(python-version)...<<< Ocultar detalhes do erroUma gravação será efetuada diretamente com o ramo mestre, mantendo os ramos local e mestre em sincronia.Uma gravação local com o ramo será efetuada. O ramo mestre não será atualizado até que uma gravação não-local seja feita.AbreviaçãoAbortado!Abortando...Sobre o QBzrAçãoAdicionarAdicionar MarcadorEndereço:ApelidoApelidosTodo o conteúdo enviado foi assinado com chaves de verificaçãoTodos os conflitos resolvidos.AnotarTipo do arquivo:Tem certeza que você quer reverter esse arquivo ao estado em que ele era na revisão selecionada?AutorAutor:AutoresResolver automaticamenteBazaar 2.4 ou superior é necessário para suportar ferramentas de mesclagem externasConfiguração do BazaarBiblioteca BazaarVincularVincular ramoVincular com:MarcadoresRamoLocalização do ramo:Ramo:Ramo: %sProcurarNavegar...Gerenciadores de ErroBug:Bugs:BugsDiff internoC&ategoria:Case sensitivePadrão indiferente a letras maiúsculas ou minúsculasEditor para mudanças não está definido.AlteradoAlteraçõesFilhos:Fechar a janela %sFechar o aplicativoFechar o diálogo de erroFechar ir para a linhaFecha JanelaComandoLinha de comandoCommitAutor:ConcluídoComputadorConfiguraçãoConflitoConflitosNão foi possível localizar o script "bzr".Não foi possível localizar "bzr.exe".Criar uma nova árvore de trabalho BazaarCriar um novo repositório compartilhadoCriar uma nova árvore independenteCriar nova tagCriar todos os diretórios do caminho para o branch caso não existamAtualmente vinculado com:DataData:PadrãoExcluirRemover tag existenteDescriçãoDescrição do formatoDescrição :DestruirDiffDiretórioNão salvar cópias de arquivos revertidosRealmente quer remover o marcador selecionado?Você deseja realmente reverter o(s) arquivo(s) selecionado(s)?Deseja continuar assim mesmo?E-&mail:&Cliente de-mail:Editar MarcadorEditar tagEditado pelo editor de mudanças. EditorCodificaçãoA codificação "%s" não é válida ou não é suportada.CodificaçãoDigite a senhaInforme o nome do usuárioO nome do autor, ex: João da Silva <jsilva@exemplo.com>Digite a mensagem de commitA lista de IDs dos bugs é no formato tag:id separados por espaço, ex: projeto:123 projeto:765ErroError ao executar o bzr. (código de erro: %d)Erro durante a execução da ferramenta de mesclagem (código %d)EvolutionExportarExtensãoProgramas Diff externos:Ferramentas de mesclagem externasA ferramenta de mesclagem externa %(tool)s não está disponívelFalhou ao iniciar o bzr.Falhou!ArquivoO arquivo %s não está versionado. Operação abortada.Nome do arquivoNome do arquivo:ProcurarProcurar no painel ativoEncontrar: Terminado!FormulárioGeralIrIr para a linhaIr para a linha AjudaAjuda para o comandoBlocosIdIgnorarIgnorar erroIgnorar todos os arquivos com esta extensãoIgnorar comoIgnorar pelo nome-baseIgnorar pelo nome-completoIgnorar espaços em brancoIgnoradoInformaçõesInicializarInserir diretório...Inserir nomes de &arquivosNão é possível especificar caminhos de arquivo diferentes e ramos diferentes ao mesmo tempo.KMailManterTipo:Última modificação:Executar um aplicativo diff externoCodificação do lado esquerdoLargura da tabulação do lado esquerdoBiblioteca:Carregando...Diretório LocalO ramo local está desatualizado em relação ao ramo mestre. Para enviar para o ramo mestre, atualize o ramo local. Você também pode deixar de enviar o ramo local para continuar trabalhando desconectado.Commis locais não serão submetidos ao branch superior até que um commit normal seja feito.Diretório local onde a árvore de trabalho será criadaLocalização:LocaisLogArquivo de log:F&erramenta de mesclagemCliente de e-mail MAPIMarcar como &resolvidoMarcar conflito &resolvidoLocalização do ramo mestre não especificada.MesclarVisualizar mesclagemMensagemMensagem:MensagensMensagens e arquivos de texto (indexados)Mover tag existenteMuttNomePróximoBloco seguinteNenhuma açãoNenhuma ação selecionadaNenhuma alteração encontrada.Nenhuma alteração selecionada para gravação. Deseja gravar de qualquer maneira?Nenhuma alteração selecionada.Nenhuma ajuda pôde ser encontrada para %sNenhuma outra revisão especificada.Nenhuma árvore de trabalho existe para "%s"Não é um ramo "%s"Não é um ramo: %sNão é um arquivoOperação abortada porque os arquivos alvo foram mudados.A operação é suportada somente para um único arquivo, e não para um %s.OpçõesOutra revisão:Sobrescrever as diferenças entre os branchesPais:Caminho:Merges PendentesPlug-insPlug-ins instalados: %(rows)dAnteriorBloco anteriorPropriedades:Ramo públicoPullPushInterpretador PythonR&verter para esta revisãoRe&nomearProntoAtualizar a árvore de diretóriosLembrar destes locais como padrãoUsar este endereço por padrãoRemoverRemover MarcadorRepositórioFormato do repositório:RevRevisão %(rev)s para %(branch)sRevisão %sReverterReverter %s para a revisão %s revid: %s.Reverter arquivoReverter para a revisão %s revid: %s.Reverter para esta revisãoID da revisão: %(revid)s para %(branch)sIdentificador da revisão: %sRevisãoRevisão %sIDs das RevisõesNúmeros de RevisãoRevisão:Revisões:Codificação do lado direitoLargura da tabulação do lado direitoNome do diretório raiz:Executar um comando bzrSalvar arquivo nesta revisão como...Salvar arquivo nesta revisão como...Marcar/Desmarcar tudoSelecionar diretório de origemSelecionar o diretório de destinoSelecionar tudoEscolha o local para o ramoSelecionar mudanças para reversãoSelecione o executável do editorSelecione os arquivos para inserirSelecione o caminho para inserirSelecione o diretório de trabalhoEnviarDefinir como PadrãoA lista de bugs que são corrigidos neste commitDetermina o autor desta alteração, caso seja diferente de quem faz o commitConfigurações:ExibirMostrar &anotaçõesMostrar &diferençasMostrar &diferençasMostrar &logMos&trar a árvoreMostrar detalhes do erro >>>Mostrar log...Mostrar todas as &diferençasMostrar todas as &diferenças...Mostrar &diferenças do arquivoMostrar &diferenças do arquivoMostrar lista de arquivosExibir arquivos ignoradosExibir arquivos não-versionadosAssinatura:TamanhoIgnorar a criação de árvores de trabalho neste repositórioCorretor ortogáfico e &idiomaIniciando...EstadoEstado:Enviar ramo:SumárioAlternarInformação do sistemaLargura da &tabulação:Largura da tabulaçãoLargura da tabulaçãoLargura da tabulação em caracteres esta opção é usada nas janelas qdiff, qannotate e qcatTagA tag "%s" não existeTagsTags:Este diretório é um ramo. Por favor, escolha o que você gostaria de atualizarThunderbirdAlternar modo de visualização entre lado a lado e visão únicaFazer deste ramo um espelho de outro ramoURLSem alteraçõesDiff unificadoArquivos desconhecidosDesmarcar tudoNão VersionadoArquivos não versionadosAtualizaçãoAtualizar %s para a revisão %s revid: %s.Atualizar ramo...Atualizar um espelho desse ramoAtualizar para a revisão %s revid: %s.Atualizar árvore %sAtualizar árvore de trabalhoUsar editorUsar diretório já existenteVerificar assinaturasVersãoVersão:VisualizarOpções de visualizaçãoVisualizar arquivos bináriosVer alterações nos arquivos selecionados a serem enviados.Ver mudanças em arquivos selecionados para reversãoVisualizar diretórioVisualizar ArquivoVisualizar imagem arquivoVisualizar arquivo textoPalavras inteirasQuebra de linhaÁrvore de trabalhoOpções da Árvore de TrabalhoÁrvore de trabalho para %sA árvore de trabalho tem alterações não enviadasA árvore de trabalho está desatualizada, por favor execute 'bzr update'Árvore de trabalho está desatualizada. Para envia-la, atualize a árvore de trabalho.Codificação erradaCliente de e-mail XDGVocê deve fornecer uma mensagem de gravaçãoVocê deve especificar o nome da tag[arquivo binário (%d bytes)]\ Nenhuma linha no fim do arquivoAdicionar arquivoadicionadoarquivos adicionadosbug #%sconflito de conteúdosexcluir arquivoarquivos apagadosapagando paidiretórioduplicadoID duplicadaarquivocorrigidoignoradofaltandomodificadoarquivos modificadosmodificar textomovidopai não diretórionão-versionadoConflito no caminhoremovidoRenomear:renomeadorenomeado e modificadoarquivos renomeadoslink simbólicoconflito de textox-bit././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/ru/LC_MESSAGES/0000755000000000000000000000000014556556456014314 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/ru/LC_MESSAGES/qbrz.mo0000644000000000000000000007755314556556456015650 0ustar00T  6  ! !!"!:! C!N! V!a!i! p!z! !!!!!!! !!! ! ! !""/"@"G"W"^"b"#h""""""" "" "" "# ## # -#8#L#]#l# {## # ######c$w]% %% % %& & &&#&)&1&I& R&`&g&o& w&&&& && & &&&O&>' F'Q' X' b' o'z' ' '''' '?'((("$( G(R([( d(r( {((( ((()5")X)l)q)w)) )) )) )%)3)2+*/^**** ****** +,#+P+_+Fn++k+:,)@,(j, ,,,,,,,,, - -*- /-9-O-W- Z- d-p----'-.-- . . .5.;.A.P.Y.o. ..T.6. ,/ 6/@/ D/ N/[/n///%/// /6 03A0u0}00 0?00 11"1'191<W11"1112$252=2&M2t2}2222 22222233+33393$T3&y3#333 333344&4 F4P4 Y4 e4r4 4 4444445535L5c5y55(5C5 666"646 I6 S6 a6m66666567/7547j7 777777777 77:788<Q8888H8#8 90#9T9X9 _9 m9w999 999 999 :-:F:U:7i::::: ::(:(;>; M;W; g;t; ; ;;;%;5;@<`<o<$<<<< <<<= ='= 7= A= K=X=]=c=k=s===== = = ==== >> >&>@)@AA-A$?A2dA AA A A AAAAB#2BVB.hBB B B'BBB C$#CHC0cCRC6CD(5D^DgDmD8}DD DD"DD$E6E EERE5eEE EEE&EEF7FHFWF fFtFF FFFFFTFRH >ILJeJ.wJJJJ!J JJKB&KiK|K K K KKKK LL7LNL_L rL$}LL 6MBM QM \MjM)MM+MMNN,'N TNuN-OBOQOQlOO.OPP3PDP?WP(P<P;P89Q rQ{Q#R3R SSk!T=TTT+T%U#GnAn3n6n43owho2o pc p&p$pppp qq06q'gq&qqqmq%Kr\qrrr rrr/os sEssst"t!6tTXttt1tuu*4u/_uuIu-u*vdCv@v v vw%w.;w_jww!]xx4x2x0y4yLy(fy'yayzz#6{Z{\r{0{N|O|!`|(||%||!|}(}9}S}\}q}}>}}}~:"~]~t~~ ~~*~)~!%#G94h.5Y3)Mq0+i=A<Eu~lg'NCrdqoQ v:x- K+ 1 Uo$pOL By`(a~,s<'V>]t H@9|:&x_IHw t8PFDFRG%PyiSZ/h;>6Y|_Xz5,LSTk@# W2)[6n& wb}mN"sDK fAf7kC/^?.0QmJ{(IlGbW\1jg*\!%Uazr" uc7R?`B=8ce^jdT#]eO4VX2{p$}M3vZnJ!E[-;*%d conflict auto-resolved.%d conflicts auto-resolved.%d file%d files&About...&Action:&Add&Add Bookmark...&Annotate this revision&Author:&Bookmarks&Branch&Browse...&Cancel&Close&Command:&Commit&Configure...&Diff&Edit&Edit Bookmark...&Editor:&File&Filter&Fixed bugs:&Help&Help...&Launch...&Local commit&Location:&Mark as moved&Mark as moved and renamed&Mark as renamed&Merge&Merge conflict&Name:&OK&Open&Options and arguments for command:&Push&Quit&Refresh&Remove Bookmark...&Retry&Revert&Revision:&Search:&Select...&Show hidden commands&Tag name:&To:&User Interface&View&View Options&View file&Working directory:(bzr-config-dir)(bzr-lib-path)(bzr-log-file)(bzr-version)(no description)(no message)(python-file)(python-lib-dir)(python-version)...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/QBzrA commit will be made directly to the master branch, keeping the local and master branches in sync.A local commit to the branch will be performed. The master branch will not be updated until a non-local commit is made.AbbreviationAborted!Aborting...About QBzrActionAddAdd BookmarkAddress:AliasAliasesAll conflicts resolved.AnnotateArchive type:AuthorAuthor:AuthorsAuto-resolveBazaar ConfigurationBazaar LibraryBindBind branchBind to:BookmarksBound to:BranchBranch location:Branch source (enter a URL or select a local directory with an existing branch)Branch:Branch: %sBrowseBrowse...Bug TrackersBug:Bugs:BugsBuiltin DiffC&ategory:ChangedChangesCheckout of branch:Children:Click a link for more information about checkouts and branches.Close Goto LineCommandCommitCommit changes into a new revisionCommitter:CompleteComputerConfigurationConflictConflictsCreate Branch before switchingCreate a checkoutCreate a new Bazaar Working TreeCreate a new shared repositoryCreate a new standalone treeCreate new tagCreate the path up to the branch if it does not existCurrently bound to:DateDate:DefaultDelete existing tagDescriptionDescription of formatDescription:DiffDirectoryDo not save backups of reverted filesDo you really want to remove the selected bookmark?Do you really want to revert the selected file(s)?Do you really want to uncommit these revisions?Do you want to continue anyway?E-&mail:E-mail &client:Edit BookmarkEdit tagEditorEncodingEncoding "%s" is invalid or not supported.Encoding:Ensure all revisions are appended to the logEnter PasswordEnter UsernameEnter the author's name, e.g. John Doe <jdoe@example.com>Enter the commit messageEnter the list of bug IDs in format tag:id separated by a space, e.g. project:123 project:765ErrorError while running bzr. (error code: %d)Error while running merge tool (code %d)EvolutionExportExternal Diff Apps:External MergeFailed to start bzr.Failed!FileFile %s is not versioned. Operation aborted.File NameFilename:FindFinished!Forget pending mergesGeneralGoGoto LineGoto Line: Heavyweight checkout:HelpHelp for commandIgnoredInclude a bundle in the merge directiveInclude a preview patch in the merge directiveInfoInitializeInsert &directory...Insert &filenames...KMailKind:Last modified:Library:Light-weight checkoutLightweight checkout:Loading...Local DirectoryLocal commits are not pushed to the master branch until a normal commit is performedLocal directory where the working tree will be createdLocation:LocationsLogLog File:M&erge tool:MAPI e-mail clientMake a local copy of the branchMark as &resolvedMark conflict &resolvedMaster branch location not specified.MergeMerge Directive OptionsMerge PreviewMerge even if the working tree has uncommitted changesMerge uncommitted changes instead of committed onesMessageMessage:MessagesMessages and File text (indexed)Missing the flag: %s. Configure in qconfig under the merge tab.Most recent (tip) revisionMove existing tagMuttNameNo changes found.No changes selected to commitNo changes selected to commit. Do you want to commit anyway?No changes selected to revertNo help can be found for %sNo other revision specified.No working tree exists for "%s"Not a branch "%s"Not a branch: %sOptionsOther revision:Overwrite differences between branchesParents:Path:Pending MergesPluginsPlugins installed: %(rows)dProperties:Pu&llPublic Branch:PullPull a different branchPull most recent changes from:PushPython InterpreterRe&nameReadyRefresh the directory treeRemember these locations as defaultsRemember this as the new parent branchRemember this location as a defaultRemoveRemove BookmarkRepositoryRepository Format:RevRev %(rev)s for %(branch)sRev %sRevertRevid: %(revid)s for %(branch)sRevid: %sRevisionRevision %sRevision IDsRevision NumbersRevision:Revisions:Root directory name:Run bzr commandSelect / deselect allSelect Source DirectorySelect Target DirectorySelect branch locationSelect changes to revertSelect editor executableSelect files to insertSelect path to insertSelect working directorySendSet the IDs of bugs fixed by this commitSet the author of this change, if it's different from the committerSettings:ShowShow &annotateShow &differencesShow &differences...Show &logShow &tree...Show Log...Show all &differencesShow all &differences...Show file &differencesShow file &differences...Show ignored filesShow inter-group inserts and deletes in green and redShow non-versioned filesSizeSkip the creation of working trees in this repositorySpell check &language:Starting...StatusStatus:Submit Branch:SummarySwitchSwitch checkoutSwitch to branch:System InformationTab WidthTagTag "%s" already exists. Do you want to move existing tag?Tag "%s" does not existsTag "%s" does not exists yet. Do you want to create new tag?Tag &revision...TagsTags:This directory is a branch. Please select what you would like to updateThis directory is a checkout of: %sThunderbirdTurn this branch into a mirror of another branchURLUnbindUnbind branchUnchangedUncommitUncommited Working Tree ChangesUnidiffUnversionedUnversioned FilesUpdateUpdate BranchUpdate CheckoutUpdate a mirror of this branchUpdate sourceUpdate the working tree from the bound branchUpdate tree %sUpdate working treeUpdate working tree to the latest changes in the branchUse existing directoryVersionVersion:ViewView OptionsView binary fileView changes in files selected to commitView changes in files selected to revertView directoryView fileView image fileView symlinkView text fileWord WrapWorking TreeWorking Tree OptionsWorking Tree for %sWorking tree has uncommitted changes.Working tree is out of date, please run 'bzr update'.Working tree is out of date. To commit, update the working tree.Wrong encodingXDG e-mail clientYou should provide a commit message.You should specify tag name\ No newline at end of fileaddedadded filesadded, missingbug #%scontents conflictdeleted filesdeleting parentdirectoryduplicateduplicate idfilefixedignoredmissingmissing parentmodifiedmodified filesmovednon-directory parentnon-versionedparent looppath conflictremovedrenamedrenamed and modifiedrenamed filessymlinktext conflictProject-Id-Version: QBzr 0.7.0 Report-Msgid-Bugs-To: POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2012-03-28 08:53+0000 Last-Translator: Alexander Belchenko Language-Team: Russian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) Автоматически решён %d конфликт.Автоматически решены %d конфликта.Автоматически решены %d конфликтов.%d файл%d файла%d файлов&О программе...Действие:&ДобавитьДобавить закладку...&Аннотация для этой ревизии&Автор:&Закладки&ВеткаОбзор...&Отмена&Закрыть&Команда:&Зафиксировать&Настроить...Просмотр изменений&ИзменитьРедактировать закладку...&Редактор:&Файл&Фильтр&Исправленные ошибки:&Справка&Справка...Запустить...&Локальная фиксация&Расположение:Пометить как перемещенныйПометить как перемещенный и переименованныйПометить как переименованныйОбъединение&Объединить конфликты&Имя:&ОК&Открыть&Опции и аргументы для команды:&Push&Выход&ОбновитьУдалить закладку...&Повторить&Отменить изменения&Версия:&Поиск:&Выбрать...&Отображать скрытые коммандыИмя тега:&Куда:&Интерфейс&Вид&Параметры просмотра&Просмотр файла&Рабочий каталог:(bzr-config-dir)(bzr-lib-path)(bzr-log-file)(bzr-version)(нет описания)(нет комментария)(python-file)(python-lib-dir)(python-version)...QBzr — Графический пользовательский интерфейс для программы Bazaar
Версия %(qbzr_version)s (bzrlib %(bzrlib_version)s)

Copyright © 2006-2008 Lukáš Lalinský и другие

http://bazaar-vcs.org/QBzrВ результате фиксации новая ревизия будет помещена в главную и локальную ветки, таким образом обе ветки будут синхронизированы.Фиксация будет выполнена только в локальной ветке. Главная ветка не будет обновлена до тех пор, пока вы не сделаете обычную (не локальную) фиксацию.АббревиатураПрервано!Останавливаем операцию...О QBzrДействиеДобавитьДобавить закладкуАдрес:ПсевдонимПсевдонимыВсе конфликты автоматически решены.АннотацияТип архива:АвторАвтор:АвторыАвтоматическиКонфигурация BazaarБиблиотека BazaarПривязкаСвязать ветвиПривязать к:ЗакладкиСвязать с:ВеткаРасположение ветки:Источник ветви (введите URL или выберите локальный каталог с существующей ветвью)Ветка:Ветка: %sОбзорОбзор...Баг трекерыОшибка:Ошибки:Ошибки:Номера ошибокВстроенный просмотрщикК&атегория:ИзмененИзмененияРабочая копия для ветки:Следующие версии:Щелкните по ссылке для получения дополнительной информации о рабочих копиях и ветках.Закрыть Перейти к строкеКомандаЗафиксироватьЗафиксировать изменения в виде новой версииЗафиксировал:Показывать файлы целикомКомпьютерКонфигурацияКонфликтКонфликтыСоздать ветку перед переключениемСоздать рабочую копиюСоздать новое рабочее дерево BazaarСоздать новый общий репозиторийСоздать самостоятельную веткуСоздать новый тегСоздать все недостающие каталоги вплоть до каталога с новой веткойСейчас привязана к:ДатаДата:По умолчаниюУдалить тегОписаниеОписание форматаОписание:РазличияКаталогНе сохранять резервные копии для обрабатываемых файловВы действительно хотите удалить выбранную закладку?Вы действительно хотите вернуть выбранные файлы в исходное состояние?Вы действительно хотите отменить фиксацию этих изменений?Хотите продолжить в любом случае?E-&mail:E-mail &клиент:Редактировать закладкуРедактирование тегаТекстовый редакторКодировкаКодировка "%s" не распознана или не поддерживается.Кодировка:Убедиться, что все версии добавлены в журналВведите парольВведите имя пользователяВведите имя автора, например: John Doe <jdoe@example.com>Введите комментарий к этой ревизииВведите список номеров ошибок в формате tag:id, несколько ошибок разделяются пробелами, например: project:123 project:765ОшибкаОшибка во время работы bzr. (код ошибки: %d)Ошибка при попытке запуска программы (код %d)EvolutionЭкспортПрограммы просмотра изменений:Внешние слиянияНе могу запустить bzr.Неудачно!ФайлИзменения в файле "%s" не отслеживаются. Операция прервана.Имя файлаФайл:НайтиЗавершено!Забыть объединениеОбщиеПерейтиПерейти к строкеПерейти к строке: Тяжеловесная рабочая копия:СправкаСправка для выбранной командыИгнорируетсяВключить упакованные ревизии в директиву объединенияВключить текст изменений в директиву объединенияСведенияИнициализироватьВставить &каталог...Вставить &файл...KMailТип:Последние изменения:Библиотека:Легковесная рабочая копияЛегковесная рабочая копия:Загрузка...Локальный каталогЛокальные фиксации не передаются в главную ветку до тех пор, пока не будет сделана обычная фиксация.Локальный каталог, где рабочие дерево будет созданоРасположение:РасположениеЖурналФайл журнала:Программа для объединения изменений:MAPI e-mail клиентСоздать локальную копию веткиСнять пометку о конфликтеСнять пометку о конфликтеНе указано расположение основной ветвиОбъединитьОпции директивы объединенияРезультат объединенияВыполнить объединение даже если рабочие файлы имеют незафиксированные измененияПрименить незафиксированные изменения вместо объединения историиСообщениеСообщение:КомментарийСообщения и текстовые файлы (проиндексированные)Отсутствие флага: %s. Настроить в qconfig на вкладке слияния.Самая последняя версия (верхушка)Переместить существующий тегMuttИмяИзменения не найдены.Нет файлов для фиксацииВы не отметили ни одного файла для фиксации. Вы хотите зафикисировать в таком виде?Нет файлов для операции возврата к предыдущей версииНет справки для %sДругая ревизия не указана.Отсутствует рабочая копия для ветки "%s"Это не ветка: "%s"Это не ветка: %sПараметрыДругая ревизия:Переписать различия между веткамиПредыдущие версии:Путь:Незавершённое слияниеПлагиныУстановленные плагины: %(rows)dСвойства:Pu&llПубличная ветка:Загрузить новые данныеПолучить новые ревизии из другой веткиПолучить последние изменения из:Отправить новые данныеPython-интерпретаторПереименоватьГотовОбновить дерево каталоговЗапомнить эти ветки в качестве значений по умолчаниюЗапомнить этот путь в качестве новой родительской веткиЗапомнить этот URL в качестве значения по умолчанию.УдалитьУдалить закладкуРепозиторийФормат репозитория:ВерсияВерсия %(rev)s в ветке %(branch)sВерсия %sВозврат к предыдущей версииRevid: %(revid)s для %(branch)sRevid: %sВерсияРевизия %sRevision IDsНомера версийРевизия:Ревизии:Имя корневого каталога:Запустить команду bzrВыбрать все файлыВыберите каталог-источникВыберите целевой каталогВыбрать расположение веткиВыбрать файлы для отмены измененийВыберите программу-редакторВыберите файлы для вставкиВыберите путь для вставкиВыберите рабочий каталогОтправить патчУказать номера ошибок, исправленных в этой ревизииУказать автора этих изменений, если он отличается от того, кто делает фиксацию ревизииНастройки:ПоказатьПоказать &аннотациюПоказать различияПоказать &различия...Показать &журналДерево файловПосмотреть журналПоказать различия для всех файловПоказать различия для всех файлов...Показать различия для файлаПоказать различия для файла...Показать игнорируемые файлыПоказывать вставку/удаления внутри строк зеленым/красным цветомПоказать неизвестные файлыРазмерНовые ветки в репозитории создаются без рабочей копииПроверка орфографии:Начинаем операцию...СостояниеСостояние:Целевая ветка:КраткоПереключитьПереключить рабочую копиюПереключить на ветку:Информация о системеШирина табуляцииТегТаг "%s" уже существует. Хотите переместить существующий таг?Тег "%s" не существуетТег "%s" еще не существует. Хотите создать новый тег?Добавить тег...ТегиТеги:Этот каталог является веткой. Укажите, что вы желаете обновитьЭто рабочая копия ветки: %sThunderbirdСделать эту ветку копией другой веткиURLОтвязатьОтвязать ветвьНе измененОтменить фиксациюНезафиксированные изменения в рабочих файлахUnidiffНе версионированНеверсифицированные файлыОбновитьОбновить веткуОбновить рабочую копиюОбновить копию этой веткиОбновитьОбновить рабочую копию из главной веткиОбновить рабочую копию %sОбновить рабочую копиюОбновить рабочие файлы последними изменениями в веткеИспользовать существующий каталогВерсияВерсия:ПросмотрПараметры просмотраПросмотр бинарного файлаПросмотр изменений в файлах, выбранных для фиксацииПросмотр изменений в файлах, которые необходимо возвратить к предыдущей версииПросмотр каталогаПросмотр файлаПросмотр графического файлаПросмотр символьной ссылкиПросмотр текстового файлаПеренос словРабочая копияОпции рабочего дереваРабочая копия ветки %sРабочие файлы содержат незафиксированные изменения.Рабочая копия не синхронизирована с главной веткой, запустите команду bzr update.Рабочее дерево устарело. Для закрепления необходимо обновить рабочее дерево.Неверная кодировкаXDG e-mail клиентВы должны предоставить комментарий к закреплению.Вы должны указать имя тега\ Нет символа перевода строки в конце файладобавлендобавленные файлыдобавлен, отсутствуетbug #%sконфликт содержанияудаленные файлыудаление родителякаталогдубликатсовпадающий idфайлисправленаигнорируемыйотсутствуетотсутствует родительский каталогизменёнизмененные файлыперемещенне каталогизированный родительнеизвестныйцикл родителяконфликт путейудаленпереименованпереименован и измененпереименованные файлысимвольная ссылкатекстовый конфликт././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/sk/LC_MESSAGES/0000755000000000000000000000000014556556456014303 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/sk/LC_MESSAGES/qbrz.mo0000644000000000000000000000737314556556456015630 0ustar00C4YL  #+2:B I Tbgot}Fk Ychpv|  (CX]v}        / 6 = A R Z ` g q w ~        N B ~R      $ ; C K P W m y } = Q !@EKT ] iv   ! >40-9 ()":6$#%B+*3,  .1?<@'&C2/ 85=;A7%d file%d files&Author:&Cancel&Close&Fixed bugs:&Help&Name:&OK&Search:AddAliasAliasesAnnotateAuthorAuthor:BrowseChangesCommandCommitCommitter:ConfigurationDateDefaultDiffE-&mail:E-mail &client:Enter the author's name, e.g. John Doe <jdoe@example.com>Enter the commit messageEnter the list of bug IDs in format tag:id separated by a space, e.g. project:123 project:765EvolutionFileGeneralKMailKind:Last modified:Location:LogMAPI e-mail clientMessageMessagesMuttNamePending MergesRemoveRevRevision:Set the IDs of bugs fixed by this commitSet the author of this change, if it's different from the committerShowShow non-versioned filesStatusStatus:SummaryTags:ThunderbirdUnidiffXDG e-mail clientaddeddirectoryfilemodifiednon-versionedremovedrenamedrenamed and modifiedsymlinkProject-Id-Version: sk Report-Msgid-Bugs-To: POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2008-11-22 15:14+0000 Last-Translator: Lukáš Lalinský Language-Team: Slovak MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) %d súborov%d súbor%d súbory&Autor:&Zrušiť&Zavrieť&Opravené chyby:&PomocMe&no:&OK&Vyhľadávanie:PridaťAliasAliasyAnotovaťAutorAutor:PrehliadaťZmenyPríkazOdovzdaťOdovzdávateľ:NastavenieDátumŠtandardnýRozdielyE-&mail:E-mail &klient:Vložte meno autora, napr. Ján Mrkvička <jmrkvicka@example.com>Vložte správuVložte zoznam identifikátorov chýb vo formáte značka:id oddelených medzerou, napr. projekt:123 projekt:765EvolutionSúborVšeobecnéKMailTyp:Naposledy zmenené:Umiestnenie:HistóriaMAPI e-mailový klientSprávaSprávyMuttNázovČakajúce zlúčeniaOdstrániťRevRevízia:Nastaví identifikátory chýb opravených týmto odovzdanímNastaví meno autora tejto zmeny, v prípade že je odlišné od odovzdávateľa.ZobraziťZobraziť neverzované súboryStavStav:ZhrnutieZnačky:ThunderbirdUnifikovanéXDG e-mailový klientpridanéadresársúborzmenenéneverzovanévymazanépremenovanépremenované a zmeneésymbolický odkaz././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/sl/LC_MESSAGES/0000755000000000000000000000000014556556456014304 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/sl/LC_MESSAGES/qbrz.mo0000644000000000000000000000106114556556456015615 0ustar00$,89Project-Id-Version: qbzr Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2008-11-22 14:11+0000 Last-Translator: FULL NAME Language-Team: Slovenian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0); X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/sr/LC_MESSAGES/0000755000000000000000000000000014556556456014312 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/sr/LC_MESSAGES/qbrz.mo0000644000000000000000000000116214556556456015625 0ustar00,<PQU gAddProject-Id-Version: qbzr Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2009-12-11 18:52+0000 Last-Translator: Данило Шеган Language-Team: Serbian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) Додај././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/sv/LC_MESSAGES/0000755000000000000000000000000014556556456014316 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/sv/LC_MESSAGES/qbrz.mo0000644000000000000000000000777514556556456015651 0ustar00\   %.4 <IO Xcjnt}        ' . 9 B P U ] j o x             & + 0 7 G K R \ a f r y                        $ + / 8 C J Q W d p x        $ *8> GTYbr       $+19KO Xbg oz   ",.I&6L\RU@;3FV[PE#+:! /4KONHX(8*0GJ?Q-'5A=<29MWB)S 7 Y% 1DZC $T>%d file%d files&About...&Author:&Bookmarks&Cancel&Close&Configure...&Editor:&File&Filter&Fixed bugs:&Help&Help...&Location:&Name:&OK&Quit&Refresh&Search:&To:&ViewAbbreviationAborting...About QBzrAddAdd BookmarkAliasAliasesAnnotateAuthorAuthor:AuthorsBookmarksBranchBrowseBug:Bugs:ChangesCommandCommitCommitter:ComputerConfigurationDateDefaultDescription:DiffE-&mail:E-mail &client:Edit BookmarkEditorEncoding:EvolutionFileFinished!GeneralKMailKind:Last modified:Loading...Location:LogMessageMessagesNameOptionsProperties:PullPushRemoveRemove BookmarkRevRevertRevision:ShowSizeStarting...StatusStatus:SummaryTags:ThunderbirdURLViewaddeddirectoryfilefixedmodifiedremovedrenamedrenamed and modifiedProject-Id-Version: qbzr Report-Msgid-Bugs-To: POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2011-07-25 22:47+0000 Last-Translator: Johan Helin Language-Team: Swedish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) %d fil%d filer&Om...&Upphovsman:&Bokmärken&Avbryt&Stäng&Konfigurera...&Redigerare&Fil&Filter%Fixade buggar:&Hjälp&Hjälp...&Plats:&Namn:&OK&Avsluta&Uppdatera&Sök:&Till:&VisaFörkortningAvbryter...Om QBzrLägg tillLägg till bokmärkeAliasAliasAnteckningUpphovsmanUpphovsman:UpphovsmänBokmärkenGrenBläddraBugg:Buggar:ÄndringarKommandoVerkställIncheckare:DatorKonfigurationDatumStandardBeskrivning:DiffE-&post:E-post &klient:Redigera bokmärkeRedigerareTeckenkodning:EvolutionFilFärdig!AllmäntKMailSort:Senast ändrad:Laddar...Plats:LoggMeddelandeMeddelandenNamnAlternativEgenskaper:Dra inSändTa bortTa bort bokmärkeRevÅtergåRevision:VisaStorlekStartar...StatusStatus:SammanfattningTaggar:ThunderbirdURLVisatillagdkatalogfilfixadändradborttagenomdöptomdöpt och ändrad././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/th/LC_MESSAGES/0000755000000000000000000000000014556556456014301 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/th/LC_MESSAGES/qbrz.mo0000644000000000000000000000147614556556456015624 0ustar00\    $ 1&Name:AddCommandDescription:Loading...NameShowProject-Id-Version: qbzr Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2010-03-12 20:23+0000 Last-Translator: Jeroen T. Vermeulen Language-Team: Thai MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) ชื่อ:เพิ่มคำสั่งคำบรรยาย:กำลังโหลด...ชื่อแสดง././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/tr/LC_MESSAGES/0000755000000000000000000000000014556556456014313 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/tr/LC_MESSAGES/qbrz.mo0000644000000000000000000002156614556556456015640 0ustar00  H I S d m x             '7= A N Ze iv|      /N6k 3  $2F9)     #63 jtx" &9B Q]&x#     1;QV k y5 &H, u0  7 CZk z    %*2; JX`h } 9GY ans{   ,2 IW [ex      '- 5@(O x&4  +50 fp WH FPfy   0'"> al s}# 1  )&A&h   "9AWkL( 5 H N U [ @f (    ! *!K!5_!!!!! !"*"="]"#s""" """""""##$# 8#Y#Z~(/nlX0C%UWr Q|27vDwig.$498e< HFb^AI,ok6-*z>+cfys`xp_ "auYEMh BdVP= ?S3]LJ;&1TtK\:NjR'm 5O#!q){G@[}&About...&Add Bookmark...&Author:&Bookmarks&Branch&Cancel&Close&Configure...&Edit Bookmark...&Editor:&File&Fixed bugs:&Help&Help...&Location:&Name:&OK&Quit&Refresh&Remove Bookmark...&Revision:&Search:&User Interface&View...AbbreviationAborting...About QBzrAddAdd BookmarkAliasAliasesAnnotateAuthorAuthor:AuthorsBookmarksBranch:BrowseBrowse...Bug TrackersChangesChildren:CommandCompleteComputerConfigurationCreate a new Bazaar Working TreeCreate a new shared repositoryCreate a new standalone treeCreate a stacked branch referring to the source branchDateDefaultDescription of formatDescription:DiffDo you really want to remove the selected bookmark?E-&mail:E-mail &client:Edit BookmarkEditorEnter the author's name, e.g. John Doe <jdoe@example.com>Error while running bzr. (error code: %d)EvolutionFailed to start bzr.Failed!FileFinished!GeneralHelpInfoInitializeKMailKind:Last modified:Loading...Local DirectoryLocal directory where the working tree will be createdLocation:LogMAPI e-mail clientMake a local copy of the branchMergeMessageMessagesMost recent (tip) revisionMuttNameNo help can be found for %sOptionsOverwrite differences between branchesParents:Pending MergesProperties:Refresh the directory treeRemember this as the new parent branchRemember this location as a defaultRemoveRemove BookmarkRepositoryRepository Format:RevRev %sRevertRevisionRevision IDsRevision NumbersRevision:Select / deselect allShowShow &differences...Show &tree...Show Log...Show ignored filesShow non-versioned filesSizeSkip the creation of working trees in this repositorySpell check &language:Starting...StatusStatus:SummaryTags:This directory is a branch. Please select what you would like to updateThunderbirdTurn this branch into a mirror of another branchURLUnidiffUnversioned FilesUpdate BranchUpdate a mirror of this branchUpdate sourceUpdate working tree to the latest changes in the branchUse existing directoryView binary fileView directoryView fileView image fileView text fileWorking TreeWorking Tree OptionsXDG e-mail client\ No newline at end of fileaddedadded filesbug #%sdeleted filesdirectoryfilemissingmodifiedmodified filesnon-versionedremovedrenamedrenamed and modifiedrenamed filesProject-Id-Version: qbzr Report-Msgid-Bugs-To: POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2012-04-16 09:31+0000 Last-Translator: Mert Dirik Language-Team: Turkish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) &Hakkında...Yer İmi &Ekle...Y&azar:&Yer İmleri&Dal&İptal&Kapat&Yapılandır...Yer İmini &Düzenle...&Düzenleyici:&Dosya&Giderilen hatalar:&Yardım&Yardım...&Konum:&Ad:&Tamam&Çık&TazeleYer İmini &Sil...&Düzeltme:&Ara:K&ullanıcı Arayüzü&Görüntüle...Kısaltmaİptal ediliyor...QBzr HakkındaEkleYer İmi EkleTakma AdTakma AdlarAçımla (Annotate)YazarYazar:YazarlarYer İmleriDal:GözatGözat...Hata TakipçileriDeğişikliklerAltları:KomutTamamıBilgisayarYapılandırmaYeni bir Bazaar Çalışma Ağacı YaratYeni bir paylaşılan depo yaratYeni bir kendibaşına ağaç oluşturKaynak dala başvuran bir yığılmış dal oluşturTarihÖntanımlıBiçimin açıklamasıAçıklama:FarkSeçilen yer imini silmek istediğinize emin misiniz?E-&posta:E-posta &istemcisi:Yer İmini DüzenleDüzenleyiciYazarın adını girin, ör. Sarı Çizmeli Mehmet Ağa <cizmeh@ornek.com>bzr çalıştırılırken bir sorunla karşılaşıldı. (hata kodu: %d)Evolutionbzr başlatılamadı.Başarısız Oldu!DosyaTamamlandı!GenelYardımBilgiİlklendirKMailTür:Son değiştirilme:Yükleniyor...Yerel DizinÇalışma dizininin yaratılacağı yerel dizinKonum:GünlükMAPI e-posta istemcisiDalın yerel bir kopyasını yaratBirleştirİletiİletilerEn yeni düzeltmeMuttAd%s için yardım bulunamadıSeçeneklerDallar arasındaki farklılıkların üzerine yazÜstleri:Bekleyen BirleştirmelerÖzellikler:Dizin ağacını tazeleBu dalı yeni üst dal olarak hatırlaBu konumu öntanımlı olarak hatırlaSilYer İmini SilDepoDepo Biçimi:DüzDüz %sEski Durumuna GetirDüzeltmeDüzeltme KimlikleriDüzeltme NumaralarıDüzeltme:Tümünü seç / Hiçbirini seçmeGöster&Farkları göster...&Ağacı göster...Günlüğü Göster...Yok sayılan dosyaları gösterSürüm denetimi altında olmayan (sürümlendirilmemiş) dosyaları gösterBoyutDepoda çalışma ağacı yaratılmasınYazım denetimi &dili:Başlatılıyor...DurumDurum:ÖzetEtiketler:Bu dizin bir dal. Lütfen neyi güncellemek istediğinizi seçinThunderbirdBu dalı başka bir dalın yansısı yapURLBirleşmiş Fark (Unidiff)Sürümlendirilmemiş DosyalarDalı GüncelleBu dalın yansısını güncelleKaynağı güncelleÇalışma ağacını dalın en yeni haline güncelleMevcut dizini kullanİkili dosya görüntüleDizin görüntüleDosyayı görüntüleGörüntü dosyası görüntüleMetin dosyası görüntüleÇalışma AğacıÇalışma Ağacı SeçenekleriXDG e-posta istemcisi\ Dosyanın sonunda yeni satır yokeklendieklenen dosyalarhata no. %ssilinen dosyalardizindosyaeksikdeğiştirildideğiştirilen dosyalarsürümlendirilmemişsilindiadı değiştirildiadı ve içeriği değiştirildiadı değiştirilen dosyalar././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/uk/LC_MESSAGES/0000755000000000000000000000000014556556456014305 5ustar00././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/locale/uk/LC_MESSAGES/qbrz.mo0000644000000000000000000002153414556556456015625 0ustar00l         & 8 A G T Z c q |              % , 4 < F M T \ d "k      3 ! 1?FFk !).39? NX\ o}"    #0 A(KCt   (4;CK Q0]   (:V \h p ~  ) 8 Yf w% %BT!g  $  )!Kb ~     # . 9DS:f    ;/kt%a:#^ _ir! &>O` e5o! (?Q d n{ i 0 ,< i7v    LG K 6S .   0 :$!0_!!!!!!! "%"-"I"R"["p"""""2"%#$7#\!+DoOK8`[Vu2Zc15H|g%YT@Bm, 9~E<&#"7hsPN-:fy } tq*w4AQk)aU$ Xvr=^l/0.FxJL3ICS_(epj'>b?zR;6GM{ i ]nWd%d file%d files&About...&Add Bookmark...&Author:&Bookmarks&Branch&Cancel&Close&Commit&Configure...&Edit Bookmark...&Editor:&File&Fixed bugs:&Help&Help...&Local commit&Location:&Name:&OK&Push&Quit&Refresh&Remove Bookmark...&Revision:&Search:&To:&User InterfaceAbbreviationAborting...About QBzrAddAdd BookmarkAliasAliasesAnnotateAuthorAuthor:AuthorsBookmarksBranchBrowseChangesCommandCommitCommit changes into a new revisionCommitter:CompleteComputerConfigurationDateDefaultDescriptionDescription:DiffDo you really want to remove the selected bookmark?E-&mail:E-mail &client:Edit BookmarkEditorEnter the author's name, e.g. John Doe <jdoe@example.com>Enter the commit messageEnter the list of bug IDs in format tag:id separated by a space, e.g. project:123 project:765EvolutionFileGeneralHelpInfoKMailKind:Last modified:Location:LogMAPI e-mail clientMerge PreviewMessageMessagesMuttNameNo help can be found for %sOptionsProperties:Pu&llRemoveRemove BookmarkRevRev %(rev)s for %(branch)sRev %sRevertRevid: %sRevision IDsRevision NumbersRevision:Set the IDs of bugs fixed by this commitSet the author of this change, if it's different from the committerShowShow &differences...Show &tree...Show ignored filesShow non-versioned filesSizeSpell check &language:Starting...StatusStatus:SummaryTags:ThunderbirdTurn this branch into a mirror of another branchURLUnidiffUse existing directoryView binary fileView directoryView fileView image fileView symlinkView text fileWorking TreeWorking Tree for %sXDG e-mail client\ No newline at end of fileaddedadded filesbug #%sdeleted filesdirectoryfilefixedmodifiedmodified filesnon-versionedremovedrenamedrenamed and modifiedrenamed filessymlinkProject-Id-Version: qbzr Report-Msgid-Bugs-To: POT-Creation-Date: 2012-07-12 16:38+0300 PO-Revision-Date: 2008-11-22 15:38+0000 Last-Translator: Alexander Belchenko Language-Team: Ukrainian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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; X-Launchpad-Export-Date: 2013-07-28 21:04+0000 X-Generator: Launchpad (build 16700) %d файл%d файли%d файлів&Про програму...Додати закладку...&Автор:ЗакладкиГілка&Скасувати&Закрити&Зафіксувати&Налаштувати...Редагувати закладки&Редактор:&Файл&Виправлені дефекти:&Допомога&Довідка...Локальна фіксація&Розташування:Ім’я:&OK&Push&Вихід&ОновитиВидалити закладку...&Версія:&Пошук:&Куди:Інтерфейс користувачаАбревіатураПрипиняється...Про QBzrДодатиДодати закладкуПсевдонімПсевдонімиАнотаціяАвторАвтор:АвториЗакладкиГілкаОглядЗміниКомандаФіксуватиФіксувати зміни як нову ревізіюЗафіксовано:ЗавершеноКомп'ютерНалаштуванняДатаТиповоОписОпис:РізницяВи бажаєте видалити цю закладку?E-&mail:E-mail &клієнт:Редагувати закладкуРедакторВкажіть ім'я автора, наприклад: John Doe <jdoe@example.com>Надайте коментар до цієї версіїНадайте список номерів дефектів у форматі tag:id, кілька дефектів мають бути розподілені за допомогою пробела, наприклад: project:123 project:765EvolutionФайлЗагальніДовідкаІнформаціяKMailТип:Останні зміниМісцезнаходження:ЖурналMAPI e-mail клієнтРезультат об'єднанняКоментарКоментарMuttІм’яДовідка для %s не знайденаПараметриВластивості:Pu&llВидалитиВидалити закладкуВерсіяРевізія %(rev)s для %(branch)sРевізія %sПовернутиRevid: %sRevision IDsНомери версійВерсія:Вкажіть номери дефектів, що були виправлені у цієї версіїВи можете вказати автора ціх змін, якщо він відрізняється від персони, що робить фіксацію версіїПоказатиПоказати різницюПоказати файлиПоказати ігноровані файлиПоказати невідомі файлиРозмірМова для перевірки орфографіїЗапуск...СтатусСтан:КороткоТеги:ThunderbirdПеретворити цю гілку на копію іншої гілкиURLUnidiffВикористати існуючий каталогПерегляд бінарного файлаПерегляд текиПереглянути файлПерегляд файла-зображенняПерегляд сімвольного посиланняПерегляд текстового файлаРабоча копіяРабоча копія для %sXDG e-mail клієнт\ No newline at end of fileдоданийдодані файлиbug #%sвидалені файлитекафайлполагоджензміненийзмінені файлиневідомийвидаленийперейменованийперейменований та зміненийперейменовані файлисимволичний зв'язок././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-ar.po0000644000000000000000000012136514556556456013206 0ustar00# Arabic translation for qbzr # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the qbzr package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-12 16:38+0300\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" "Content-Type: text/plain; charset=UTF-8\n" "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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "أضف" #: lib\add.py:57 msgid "Unversioned Files" msgstr "" #: lib\add.py:106 msgid "Show ignored files" msgstr "" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "تحميل ..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "" #: lib\annotate.py:762 msgid "Go" msgstr "" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 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:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "تصفح" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "" #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "الموقع:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "" #: lib\browse.py:84 msgid "Show" msgstr "اظهر" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "ترميز:" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "" #: lib\commit.py:259 msgid "&Local commit" msgstr "" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" #: lib\commit.py:265 msgid "Description:" msgstr "" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "" #: lib\commit.py:364 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:374 msgid "&Author:" msgstr "" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" #: lib\commit.py:393 msgid "Changes" msgstr "" #: lib\commit.py:410 msgid "Pending Merges" msgstr "" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" #: lib\commit.py:745 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:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "" #: lib\config.py:49 msgid "Default" msgstr "" #: lib\config.py:50 msgid "Thunderbird" msgstr "" #: lib\config.py:51 msgid "Evolution" msgstr "" #: lib\config.py:52 msgid "KMail" msgstr "" #: lib\config.py:53 msgid "Mutt" msgstr "" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "" #: lib\config.py:56 msgid "Editor" msgstr "" #: lib\config.py:79 msgid "Configuration" msgstr "" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "" #: lib\config.py:95 msgid "E-&mail:" msgstr "" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "" #: lib\config.py:108 msgid "&Editor:" msgstr "" #: lib\config.py:116 msgid "E-mail &client:" msgstr "" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "" #: lib\config.py:158 msgid "Abbreviation" msgstr "" #: lib\config.py:158 msgid "URL" msgstr "" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "" #: lib\config.py:242 msgid "Aliases" msgstr "" #: lib\config.py:243 msgid "Bug Trackers" msgstr "" #: lib\config.py:244 msgid "&User Interface" msgstr "" #: lib\config.py:245 msgid "&Diff" msgstr "" #: lib\config.py:246 msgid "&Merge" msgstr "" #: lib\config.py:271 msgid "Spell check &language:" msgstr "" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "" #: lib\conflicts.py:62 msgid "Conflict" msgstr "" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "" #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "" msgstr[1] "" #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "" #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" #: lib\conflicts.py:310 msgid "path conflict" msgstr "" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "" #: lib\conflicts.py:312 msgid "text conflict" msgstr "" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "" #: lib\conflicts.py:314 msgid "duplicate" msgstr "" #: lib\conflicts.py:315 msgid "parent loop" msgstr "" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "" #: lib\conflicts.py:317 msgid "missing parent" msgstr "" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "" #: lib\diff.py:266 msgid "renamed and modified" msgstr "" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "" #: lib\diffview.py:461 msgid "Last modified:" msgstr "" #: lib\diffview.py:462 msgid "Status:" msgstr "" #: lib\diffview.py:463 msgid "Kind:" msgstr "" #: lib\diffview.py:464 msgid "Properties:" msgstr "" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "" msgstr[1] "" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "" #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "" #: lib\encoding_selector.py:77 #, 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:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" 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:95 msgid "file" msgstr "" #: lib\i18n.py:96 msgid "directory" msgstr "" #: lib\i18n.py:97 msgid "symlink" msgstr "" #: lib\i18n.py:99 msgid "fixed" msgstr "" #: lib\i18n.py:101 msgid "View text file" msgstr "" #: lib\i18n.py:102 msgid "View image file" msgstr "" #: lib\i18n.py:103 msgid "View binary file" msgstr "" #: lib\i18n.py:104 msgid "View symlink" msgstr "" #: lib\i18n.py:105 msgid "View directory" msgstr "" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "" #: lib\log.py:142 msgid "&Search:" msgstr "" #: lib\log.py:158 msgid "Messages" msgstr "" #: lib\log.py:160 msgid "Authors" msgstr "" #: lib\log.py:162 msgid "Revision IDs" msgstr "" #: lib\log.py:164 msgid "Revision Numbers" msgstr "" #: lib\log.py:166 msgid "Tags" msgstr "" #: lib\log.py:168 msgid "Bugs" msgstr "" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "" #: lib\log.py:575 msgid "View file" msgstr "" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "المؤلف" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "" #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "" #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "" #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "" #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" 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: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:72 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:480 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 lib\ui_branch.py:100 msgid "Locations" msgstr "" #: lib\plugins.py:111 msgid "(no description)" msgstr "" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "" #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "" msgstr[1] "" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "" #: lib\run.py:98 msgid "Select working directory" msgstr "" #: lib\run.py:119 msgid "&Edit" msgstr "" #: lib\run.py:167 msgid "Help for command" msgstr "" #: lib\run.py:287 msgid "Select path to insert" msgstr "" #: lib\run.py:297 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\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "" #: lib\subprocess.py:518 msgid "Ready" msgstr "" #: lib\subprocess.py:591 msgid "Starting..." msgstr "" #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "" #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "" #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "" #: lib\switch.py:46 msgid "Switch" msgstr "" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "" #: lib\treewidget.py:327 msgid "added, missing" msgstr "" #: lib\treewidget.py:333 msgid "missing" msgstr "" #: lib\treewidget.py:340 msgid "moved" msgstr "" #: lib\treewidget.py:346 msgid "x-bit" msgstr "" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "" #: lib\treewidget.py:1303 msgid "Changed" msgstr "" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "" #: lib\treewidget.py:1682 msgid "&Open" msgstr "" #: lib\treewidget.py:1685 msgid "&View file" msgstr "" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "" #: lib\treewidget.py:1714 msgid "&Add" msgstr "" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "" #: lib\ui_info.py:87 msgid "..." msgstr "" #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" 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:62 msgid "Push" 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:107 msgid "Run bzr command" msgstr "" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "" #: lib\ui_run.py:112 msgid "&Command:" msgstr "" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "" #: lib\ui_run.py:116 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:47 msgid "Unbind" msgstr "" #: lib\unbind.py:55 msgid "Bound to:" msgstr "" #: lib\uncommit.py:40 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:70 msgid "&Cancel" msgstr "" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "" #: lib\util.py:585 msgid "Select Target Directory" msgstr "" #: lib\util.py:726 msgid "deleted files" msgstr "" #: lib\util.py:728 msgid "added files" msgstr "" #: lib\util.py:730 msgid "renamed files" msgstr "" #: lib\util.py:732 msgid "modified files" msgstr "" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-cs.po0000644000000000000000000012155214556556456013207 0ustar00# Czech translation for qbzr # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the qbzr package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-12 16:38+0300\n" "PO-Revision-Date: 2012-10-08 21:14+0000\n" "Last-Translator: Zbyněk Schwarz \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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Přidat" #: lib\add.py:57 msgid "Unversioned Files" msgstr "Soubory bez verze" #: lib\add.py:106 msgid "Show ignored files" msgstr "Zobrazit ignorované soubory" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "NIc není vybráno k řpidání" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "Komentovat" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "Načítání..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "Kódování" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "Najít" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "Jít na řádek" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "&Možnosti zobrazení" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "Možnosti zobrazení" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "Zalamování slov" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "Revize %s" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "" #: lib\annotate.py:762 msgid "Go" msgstr "" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 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 "Umístění větve:" #: lib\bind.py:60 msgid "Currently bound to:" msgstr "" #: lib\bind.py:64 msgid "Bind to:" msgstr "" #: lib\bind.py:68 lib\browse.py:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Procházet" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "" #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Umístění:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "" #: lib\browse.py:84 msgid "Show" msgstr "Ukázat" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "Zobrazit" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "" #: lib\commit.py:259 msgid "&Local commit" msgstr "" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" #: lib\commit.py:265 msgid "Description:" msgstr "" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "" #: lib\commit.py:364 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:374 msgid "&Author:" msgstr "" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" #: lib\commit.py:393 msgid "Changes" msgstr "" #: lib\commit.py:410 msgid "Pending Merges" msgstr "" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "Stav" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" #: lib\commit.py:745 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:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "" #: lib\config.py:49 msgid "Default" msgstr "" #: lib\config.py:50 msgid "Thunderbird" msgstr "" #: lib\config.py:51 msgid "Evolution" msgstr "" #: lib\config.py:52 msgid "KMail" msgstr "" #: lib\config.py:53 msgid "Mutt" msgstr "" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "" #: lib\config.py:56 msgid "Editor" msgstr "" #: lib\config.py:79 msgid "Configuration" msgstr "" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "" #: lib\config.py:95 msgid "E-&mail:" msgstr "" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "" #: lib\config.py:108 msgid "&Editor:" msgstr "" #: lib\config.py:116 msgid "E-mail &client:" msgstr "" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "" #: lib\config.py:158 msgid "Abbreviation" msgstr "" #: lib\config.py:158 msgid "URL" msgstr "" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "" #: lib\config.py:242 msgid "Aliases" msgstr "" #: lib\config.py:243 msgid "Bug Trackers" msgstr "" #: lib\config.py:244 msgid "&User Interface" msgstr "" #: lib\config.py:245 msgid "&Diff" msgstr "" #: lib\config.py:246 msgid "&Merge" msgstr "" #: lib\config.py:271 msgid "Spell check &language:" msgstr "" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "" #: lib\conflicts.py:62 msgid "Conflict" msgstr "" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "" #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "" msgstr[1] "" #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "" #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" #: lib\conflicts.py:310 msgid "path conflict" msgstr "" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "" #: lib\conflicts.py:312 msgid "text conflict" msgstr "" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "" #: lib\conflicts.py:314 msgid "duplicate" msgstr "" #: lib\conflicts.py:315 msgid "parent loop" msgstr "" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "" #: lib\conflicts.py:317 msgid "missing parent" msgstr "" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "" #: lib\diff.py:266 msgid "renamed and modified" msgstr "" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "" #: lib\diffview.py:461 msgid "Last modified:" msgstr "" #: lib\diffview.py:462 msgid "Status:" msgstr "" #: lib\diffview.py:463 msgid "Kind:" msgstr "" #: lib\diffview.py:464 msgid "Properties:" msgstr "" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "" msgstr[1] "" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "" #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "" #: lib\encoding_selector.py:77 #, 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:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" 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:95 msgid "file" msgstr "" #: lib\i18n.py:96 msgid "directory" msgstr "" #: lib\i18n.py:97 msgid "symlink" msgstr "" #: lib\i18n.py:99 msgid "fixed" msgstr "" #: lib\i18n.py:101 msgid "View text file" msgstr "" #: lib\i18n.py:102 msgid "View image file" msgstr "" #: lib\i18n.py:103 msgid "View binary file" msgstr "" #: lib\i18n.py:104 msgid "View symlink" msgstr "" #: lib\i18n.py:105 msgid "View directory" msgstr "" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "" #: lib\log.py:142 msgid "&Search:" msgstr "" #: lib\log.py:158 msgid "Messages" msgstr "" #: lib\log.py:160 msgid "Authors" msgstr "" #: lib\log.py:162 msgid "Revision IDs" msgstr "" #: lib\log.py:164 msgid "Revision Numbers" msgstr "" #: lib\log.py:166 msgid "Tags" msgstr "" #: lib\log.py:168 msgid "Bugs" msgstr "" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "" #: lib\log.py:575 msgid "View file" msgstr "" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Autor" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "" #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "" #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "" #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "" #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" 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: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:72 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:480 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 lib\ui_branch.py:100 msgid "Locations" msgstr "" #: lib\plugins.py:111 msgid "(no description)" msgstr "" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "" #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "" msgstr[1] "" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "" #: lib\run.py:98 msgid "Select working directory" msgstr "" #: lib\run.py:119 msgid "&Edit" msgstr "" #: lib\run.py:167 msgid "Help for command" msgstr "" #: lib\run.py:287 msgid "Select path to insert" msgstr "" #: lib\run.py:297 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\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "" #: lib\subprocess.py:518 msgid "Ready" msgstr "" #: lib\subprocess.py:591 msgid "Starting..." msgstr "" #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "" #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "" #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "" #: lib\switch.py:46 msgid "Switch" msgstr "" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "" #: lib\treewidget.py:327 msgid "added, missing" msgstr "" #: lib\treewidget.py:333 msgid "missing" msgstr "" #: lib\treewidget.py:340 msgid "moved" msgstr "" #: lib\treewidget.py:346 msgid "x-bit" msgstr "" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "" #: lib\treewidget.py:1303 msgid "Changed" msgstr "" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "" #: lib\treewidget.py:1682 msgid "&Open" msgstr "" #: lib\treewidget.py:1685 msgid "&View file" msgstr "" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "" #: lib\treewidget.py:1714 msgid "&Add" msgstr "" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "" #: lib\ui_info.py:87 msgid "..." msgstr "" #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" 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:62 msgid "Push" 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:107 msgid "Run bzr command" msgstr "" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "" #: lib\ui_run.py:112 msgid "&Command:" msgstr "" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "" #: lib\ui_run.py:116 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:47 msgid "Unbind" msgstr "" #: lib\unbind.py:55 msgid "Bound to:" msgstr "" #: lib\uncommit.py:40 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:70 msgid "&Cancel" msgstr "" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "" #: lib\util.py:585 msgid "Select Target Directory" msgstr "" #: lib\util.py:726 msgid "deleted files" msgstr "" #: lib\util.py:728 msgid "added files" msgstr "" #: lib\util.py:730 msgid "renamed files" msgstr "" #: lib\util.py:732 msgid "modified files" msgstr "" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-da.po0000644000000000000000000012703414556556456013167 0ustar00# Danish translation for qbzr # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the qbzr package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-12 16:38+0300\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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Tilføj" #: lib\add.py:57 msgid "Unversioned Files" msgstr "" #: lib\add.py:106 msgid "Show ignored files" msgstr "Vis afviste filer" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "Indlæser..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "Revision %s" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "" #: lib\annotate.py:762 msgid "Go" msgstr "" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 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:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Gennemse" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "" #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Placering:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "Revision:" #: lib\browse.py:84 msgid "Show" msgstr "Vis" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "&Filtrér" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "Vis" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "" #: lib\commit.py:259 msgid "&Local commit" msgstr "" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" #: lib\commit.py:265 msgid "Description:" msgstr "Beskrivelse:" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "Meddelelse" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "" #: lib\commit.py:364 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:374 msgid "&Author:" msgstr "&Forfatter:" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" #: lib\commit.py:393 msgid "Changes" msgstr "Ændringer" #: lib\commit.py:410 msgid "Pending Merges" msgstr "" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "Status" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" #: lib\commit.py:745 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:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "" #: lib\config.py:49 msgid "Default" msgstr "Standard" #: lib\config.py:50 msgid "Thunderbird" msgstr "" #: lib\config.py:51 msgid "Evolution" msgstr "" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "" #: lib\config.py:56 msgid "Editor" msgstr "Editor" #: lib\config.py:79 msgid "Configuration" msgstr "Opsætning" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "&Navn:" #: lib\config.py:95 msgid "E-&mail:" msgstr "E-&mail:" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "&Gennemse..." #: lib\config.py:108 msgid "&Editor:" msgstr "&Editor:" #: lib\config.py:116 msgid "E-mail &client:" msgstr "E-mail &klient:" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "Alias" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "Kommando" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "Fjern" #: lib\config.py:158 msgid "Abbreviation" msgstr "Forkortelse" #: lib\config.py:158 msgid "URL" msgstr "URL" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "Navn" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "Generelt" #: lib\config.py:242 msgid "Aliases" msgstr "Aliasser" #: lib\config.py:243 msgid "Bug Trackers" msgstr "Bug finder" #: lib\config.py:244 msgid "&User Interface" msgstr "B&ruger interface" #: lib\config.py:245 msgid "&Diff" msgstr "&Diff" #: lib\config.py:246 msgid "&Merge" msgstr "&Flet" #: lib\config.py:271 msgid "Spell check &language:" msgstr "Stavekontro&l sprog:" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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 "Gennemse..." #: lib\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "Konflikter" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "Fil" #: lib\conflicts.py:62 msgid "Conflict" msgstr "Konflikt" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "" #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "" msgstr[1] "" #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "Alle konflikter løst." #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "Fejl" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" #: lib\conflicts.py:310 msgid "path conflict" msgstr "sti konflikt" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "indholds konflikt" #: lib\conflicts.py:312 msgid "text conflict" msgstr "tekst konflikt" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "" #: lib\conflicts.py:314 msgid "duplicate" msgstr "" #: lib\conflicts.py:315 msgid "parent loop" msgstr "" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "" #: lib\conflicts.py:317 msgid "missing parent" msgstr "" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "fjernet" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "tilføjet" #: lib\diff.py:266 msgid "renamed and modified" msgstr "omdøbt og ændret" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "omdøbt" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "ændret" #: lib\diffview.py:461 msgid "Last modified:" msgstr "Sidst ændret:" #: lib\diffview.py:462 msgid "Status:" msgstr "Status:" #: lib\diffview.py:463 msgid "Kind:" msgstr "Art:" #: lib\diffview.py:464 msgid "Properties:" msgstr "Egenskaber:" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "&Opdater" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "%d fil" msgstr[1] "%d filer" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "&Luk" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "Ingen ændringer fundet." #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "Forkert kodning" #: lib\encoding_selector.py:77 #, python-format msgid "Encoding \"%s\" is invalid or not supported." msgstr "Kodning \"%s\" er fejlbehæftet eller ikke understøttet." #: lib\export.py:61 lib\export.py:80 msgid "Export" msgstr "Eksportér" #: lib\export.py:75 lib\uncommit.py:51 #, python-format msgid "Branch: %s" msgstr "" #: lib\export.py:146 msgid "Archive type:" msgstr "Arkiv type:" #: lib\export.py:168 msgid "Root directory name:" msgstr "" #: lib\export.py:236 lib\ui_branch.py:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "Valgmuligheder" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" msgstr "" #: lib\help.py:59 #, python-format msgid "No help can be found for %s" msgstr "Ingen hjælp fundet for %s" #: lib\help.py:103 msgid "Help" msgstr "Hjælp" #: lib\i18n.py:95 msgid "file" msgstr "fil" #: lib\i18n.py:96 msgid "directory" msgstr "mappe" #: lib\i18n.py:97 msgid "symlink" msgstr "" #: lib\i18n.py:99 msgid "fixed" msgstr "" #: lib\i18n.py:101 msgid "View text file" msgstr "Vis tekstfil" #: lib\i18n.py:102 msgid "View image file" msgstr "Vis billedfil" #: lib\i18n.py:103 msgid "View binary file" msgstr "Vis binær fil" #: lib\i18n.py:104 msgid "View symlink" msgstr "Vis symlink" #: lib\i18n.py:105 msgid "View directory" msgstr "Vis mappe" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "Information" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "Initialiser" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "Log" #: lib\log.py:142 msgid "&Search:" msgstr "&Søg:" #: lib\log.py:158 msgid "Messages" msgstr "Meddelelser" #: lib\log.py:160 msgid "Authors" msgstr "Forfattere" #: lib\log.py:162 msgid "Revision IDs" msgstr "Revisions IDs" #: lib\log.py:164 msgid "Revision Numbers" msgstr "Revisions numre" #: lib\log.py:166 msgid "Tags" msgstr "Mærker" #: lib\log.py:168 msgid "Bugs" msgstr "Fejl" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "" #: lib\log.py:575 msgid "View file" msgstr "Vis fil" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "Dato" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Forfatter" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "fejl #%s" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "" #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "" #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "" #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "" #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "Tilbagefør" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" msgstr "" #: lib\main.py:120 msgid "Computer" msgstr "Computer" #: lib\main.py:149 msgid "&Edit Bookmark..." msgstr "R&ediger bogmærker..." #: lib\main.py:150 msgid "&Remove Bookmark..." msgstr "Fje&rn bogmærker..." #: lib\main.py:165 msgid "Bookmarks" msgstr "Bogmærker" #: 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 "&Skub" #: 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 "&Tilføj bogmærke..." #: lib\main.py:301 msgid "&File" msgstr "&Fil" #: lib\main.py:302 msgid "&Configure..." msgstr "&Indstil..." #: lib\main.py:304 msgid "&Quit" msgstr "&Afslut" #: lib\main.py:305 msgid "&View" msgstr "&Vis" #: lib\main.py:307 msgid "&Branch" msgstr "" #: lib\main.py:311 msgid "&Bookmarks" msgstr "&Bogmærker" #: lib\main.py:313 lib\util.py:72 msgid "&Help" msgstr "&Hjælp" #: lib\main.py:314 msgid "&Help..." msgstr "&Hjælp..." #: lib\main.py:316 msgid "&About..." msgstr "&Om..." #: lib\main.py:354 msgid "Size" msgstr "Størrelse" #: lib\main.py:406 msgid "About QBzr" msgstr "Om QBzr" #: 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 "Tilføj bogmærke" #: lib\main.py:483 msgid "Edit Bookmark" msgstr "Rediger bogmærke" #: lib\main.py:493 msgid "Remove Bookmark" msgstr "Fjern bogmærke" #: lib\main.py:494 msgid "Do you really want to remove the selected bookmark?" msgstr "Vil du virkelig fjerne det valgte bogmærke?" #: lib\plugins.py:44 msgid "Plugins" msgstr "Udvidelser" #: lib\plugins.py:57 msgid "Version" msgstr "Version" #: lib\plugins.py:58 lib\subprocess.py:480 msgid "Description" msgstr "Beskrivelse" #: lib\plugins.py:62 msgid "Directory" msgstr "Mappe" #: lib\plugins.py:64 #, python-format msgid "Plugins installed: %(rows)d" msgstr "" #: lib\plugins.py:71 msgid "Summary" msgstr "Oversigt" #: lib\plugins.py:72 lib\ui_branch.py:100 msgid "Locations" msgstr "Lokaliteter" #: lib\plugins.py:111 msgid "(no description)" msgstr "(ingen beskrivelse)" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "" #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "Vil du fortsætte alligevel?" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "Vælg ændringer at tilbageføre" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "Gem ikke kopier af tilbageførte filer" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "Vis ændringer i filer der er valgt tilbageført" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "Dato:" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "Bidragsyder:" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "Forfatter:" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "Mærker:" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "Fejl" msgstr[1] "Fejl" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "Revision" #: lib\run.py:98 msgid "Select working directory" msgstr "Vælg arbejdsmappe" #: lib\run.py:119 msgid "&Edit" msgstr "" #: lib\run.py:167 msgid "Help for command" msgstr "" #: lib\run.py:287 msgid "Select path to insert" msgstr "Vælg sti at indsætte" #: lib\run.py:297 msgid "Select files to insert" msgstr "Vælg fil at indsætte" #: lib\send.py:34 msgid "Send" msgstr "Send" #: 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 "Handling" #: lib\send.py:122 msgid "Address:" msgstr "Adresse:" #: lib\send.py:132 msgid "Message:" msgstr "Meddelelse:" #: lib\send.py:149 msgid "Filename:" msgstr "Filnavn:" #: lib\send.py:163 msgid "Revisions:" msgstr "Revision:" #: lib\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "" #: lib\subprocess.py:518 msgid "Ready" msgstr "Klar" #: lib\subprocess.py:591 msgid "Starting..." msgstr "Starter..." #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "Afbryder..." #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "Færdig!" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "Angiv adgangskode" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "Angiv brugernavn" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "Fejlede!" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "Kunne ikke starte bzr." #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "Fejl ved kørsel af bzr. (fejl kode: %d)" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "Afbrudt!" #: lib\switch.py:46 msgid "Switch" msgstr "Skift" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "System information" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "Mærke \"%s\" eksisterer ikke" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "ignoreret" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "" #: lib\treewidget.py:327 msgid "added, missing" msgstr "tilføjet, mangler" #: lib\treewidget.py:333 msgid "missing" msgstr "mangler" #: lib\treewidget.py:340 msgid "moved" msgstr "flyttet" #: lib\treewidget.py:346 msgid "x-bit" msgstr "x-bit" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "Filnavn" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "Uændret" #: lib\treewidget.py:1303 msgid "Changed" msgstr "Ændret" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "Ignoreret" #: lib\treewidget.py:1682 msgid "&Open" msgstr "&Åben" #: lib\treewidget.py:1685 msgid "&View file" msgstr "&Vis fil" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "Vis &log" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "" #: lib\treewidget.py:1714 msgid "&Add" msgstr "&Tilføj" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "&Tilbageført" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "&Omdøb" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "&Markér som flyttet og omdøbt" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "&Markér som flyttet" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "&Markér som omdøbt" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "Vælg / fravælg alle" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "P&lacering:" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "&Til:" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "&Revision:" #: lib\ui_info.py:87 msgid "..." msgstr "..." #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" msgstr "" #: lib\ui_init.py:119 msgid "Local Directory" msgstr "Lokal mappe" #: lib\ui_init.py:121 msgid "Repository" msgstr "Arkiv" #: 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 "Skab et nyt delt arkiv" #: 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 "Arkiv format:" #: lib\ui_init.py:132 msgid "Description of format" msgstr "Beskrivelse af format" #: lib\ui_merge.py:62 msgid "Merge" msgstr "Sammenflet" #: lib\ui_merge.py:67 lib\ui_pull.py:65 lib\ui_push.py:66 msgid "Remember this location as a default" msgstr "Husk denne placering som en standard" #: 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" 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 "Vis log..." #: lib\ui_pull.py:60 msgid "Pull" msgstr "Træk" #: 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:62 msgid "Push" msgstr "Skub" #: lib\ui_push.py:68 msgid "Use existing directory" msgstr "Brug eksisterende mappe" #: lib\ui_push.py:69 msgid "Create the path up to the branch if it does not exist" msgstr "" #: lib\ui_run.py:107 msgid "Run bzr command" msgstr "Kør bzr kommando" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "&Arbejdsmappe:" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "" #: lib\ui_run.py:112 msgid "&Command:" msgstr "&Kommando:" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "&Vis skjulte kommandoer" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "Indsæt &mappe..." #: lib\ui_run.py:116 msgid "Insert &filenames..." msgstr "Indsæt &filnavne..." #: lib\ui_sysinfo.py:113 msgid "Bazaar Library" msgstr "Bazaar Bibliotek" #: lib\ui_sysinfo.py:114 lib\ui_sysinfo.py:124 msgid "Version:" msgstr "Version:" #: lib\ui_sysinfo.py:115 msgid "(bzr-version)" msgstr "(bzr-version)" #: lib\ui_sysinfo.py:116 lib\ui_sysinfo.py:126 msgid "Path:" msgstr "Sti:" #: lib\ui_sysinfo.py:117 msgid "(bzr-lib-path)" msgstr "(bzr-lib-sti)" #: lib\ui_sysinfo.py:118 msgid "Bazaar Configuration" msgstr "Bazaar opsætning" #: lib\ui_sysinfo.py:119 msgid "Settings:" msgstr "Indstillinger:" #: lib\ui_sysinfo.py:120 msgid "(bzr-config-dir)" msgstr "(bzr-opsæt-map)" #: lib\ui_sysinfo.py:121 msgid "Log File:" msgstr "Logfil:" #: lib\ui_sysinfo.py:122 msgid "(bzr-log-file)" msgstr "(bzr-log-fil)" #: lib\ui_sysinfo.py:123 msgid "Python Interpreter" msgstr "" #: lib\ui_sysinfo.py:125 msgid "(python-version)" msgstr "(python-version)" #: lib\ui_sysinfo.py:127 msgid "(python-file)" msgstr "(python-fil)" #: lib\ui_sysinfo.py:128 msgid "Library:" msgstr "Bibliotek:" #: lib\ui_sysinfo.py:129 msgid "(python-lib-dir)" msgstr "(python-bibl-map)" #: lib\ui_tag.py:88 msgid "Edit tag" msgstr "Redigér mærke" #: lib\ui_tag.py:91 msgid "Tag" msgstr "Mærke" #: lib\ui_tag.py:92 msgid "&Action:" msgstr "H&andling:" #: lib\ui_tag.py:93 msgid "Create new tag" msgstr "Opret nyt mærke" #: lib\ui_tag.py:94 msgid "Move existing tag" msgstr "Flyt eksisterende mærke" #: lib\ui_tag.py:95 msgid "Delete existing tag" msgstr "Slet eksisterede mærke" #: lib\ui_tag.py:96 msgid "&Tag name:" msgstr "&Mærke navn:" #: lib\ui_tag.py:98 msgid "&Select..." msgstr "&Vælg..." #: 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 "Opdatér kilde" #: 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:47 msgid "Unbind" msgstr "" #: lib\unbind.py:55 msgid "Bound to:" msgstr "" #: lib\uncommit.py:40 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:70 msgid "&Cancel" msgstr "&Afbryd" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "Vælg kilde mappe" #: lib\util.py:585 msgid "Select Target Directory" msgstr "" #: lib\util.py:726 msgid "deleted files" msgstr "slettede filer" #: lib\util.py:728 msgid "added files" msgstr "tilføjede filer" #: lib\util.py:730 msgid "renamed files" msgstr "omdøbte filer" #: lib\util.py:732 msgid "modified files" msgstr "ændrede filer" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "(ingen meddelelser)" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "Færdig" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" #~ msgid "Definition" #~ msgstr "Definition" #~ msgid "Use Configured Default" #~ msgstr "Brug standard opsætning" #~ msgid "Side by side" #~ msgstr "Side ved side" #~ msgid "Using" #~ msgstr "Bruger" #~ msgid "&No" #~ msgstr "&Nej" #~ msgid "&Yes" #~ msgstr "&Ja" #~ msgid "&Move" #~ msgstr "&Flyt" #~ msgid "Cre&ate" #~ msgstr "&Opret" #~ msgid "&Format" #~ msgstr "&Formatér" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-de.po0000644000000000000000000015577614556556456013211 0ustar00# German translation for qbzr # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the qbzr package. # FIRST AUTHOR , 2007. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-12 16:38+0300\n" "PO-Revision-Date: 2013-03-16 16:55+0000\n" "Last-Translator: André Bachmann \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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Hinzufügen" #: lib\add.py:57 msgid "Unversioned Files" msgstr "Nicht versionierte Dateien" #: lib\add.py:106 msgid "Show ignored files" msgstr "Ignorierte Dateien zeigen" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "Beschreibe" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "Lade..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "Zeichenkodierung" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "Suchen" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "Gehe zu Zeile" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "&Optionen anzeigen" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "Ansichtsoptionen" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "Zeilenumbruch" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "Revision %s" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "Gehe zu Zeile: " #: lib\annotate.py:762 msgid "Go" msgstr "Weiter" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 msgid "&Annotate this revision" msgstr "&Anmerkung zu dieser Revision" #: lib\bind.py:44 msgid "Bind branch" msgstr "Zweig binden" #: lib\bind.py:54 msgid "Bind" msgstr "Binden" #: lib\bind.py:56 msgid "Branch location:" msgstr "Speicherort des Zweigs:" #: lib\bind.py:60 msgid "Currently bound to:" msgstr "Momentan gebunden an:" #: lib\bind.py:64 msgid "Bind to:" msgstr "Binden an:" #: lib\bind.py:68 lib\browse.py:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Durchsuchen" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "Speicherort des Zweiges wählen" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "Ort des Hauptzweiges nicht angegeben" #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Speicherort:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "Revision:" #: lib\browse.py:84 msgid "Show" msgstr "Anzeigen" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "&Filtern" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "Ansicht" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "Zeichenkodierung:" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "Committen" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "Zweig" #: lib\commit.py:259 msgid "&Local commit" msgstr "&Lokaler Commit" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" "Lokale Commits werden nicht zum Hauptzweig hochgereicht, bis ein normaler " "Commit durchgeführt wird" #: lib\commit.py:265 msgid "Description:" msgstr "Beschreibung:" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" "Arbeitsbaum ist nicht mehr aktuell. Aktualisieren Sie ihn, um committen zu " "können." #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "Aktualisieren" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "Nachricht" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "Nicht versionierte Dateien zeigen" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "Commit-Nachricht eingeben" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "Behobene Fehler:" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "Setze die IDs der Bugs, die mit diesem Commit behoben wurden" #: lib\commit.py:364 msgid "" "Enter the list of bug IDs in format tag:id separated by a space, e.g. " "project:123 project:765" msgstr "" "Eingeben der Liste der Bugs IDs im Format tag:id abgetrennt durch " "einen Abstand, z.B. project:123 project:765" #: lib\commit.py:374 msgid "&Author:" msgstr "&Autor:" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "" "Autor dieser Änderung setzen, falls er sich vom Committer unterscheidet" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" "Gib den Namen des Autoren an, z.B. Hans Müller " "<hmueller@beispiel.de>" #: lib\commit.py:393 msgid "Changes" msgstr "Änderungen" #: lib\commit.py:410 msgid "Pending Merges" msgstr "Ausstehende Zusammenführungen" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "Status" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "Zeige Änderungen in den für den Commit ausgewählten Dateien" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "Sie sollten einen Commit-Kommentar eingeben." #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" "Keine Änderungen zum Übertragen ausgewählt.\n" "Soll sie dennoch durchgeführt werden?" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" "Ein Commit wird direkt in den Hauptzweig gemacht, lokaler und Hauptzweig " "werden synchron gehalten." #: lib\commit.py:745 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 "" "Ein lokaler Commit wird durchgeführt. Der Hauptzweig wird solange nicht " "aktualisiert, wie ein nicht-lokaler Commit ausgeführt wird." #: lib\commit.py:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "Diff" #: lib\config.py:49 msgid "Default" msgstr "Standard" #: lib\config.py:50 msgid "Thunderbird" msgstr "Thunderbird" #: lib\config.py:51 msgid "Evolution" msgstr "Evolution" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "Mutt" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "XDG-E-Mail-Client" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "MAPI-E-Mail-Client" #: lib\config.py:56 msgid "Editor" msgstr "Editor" #: lib\config.py:79 msgid "Configuration" msgstr "Konfiguration" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "&Name:" #: lib\config.py:95 msgid "E-&mail:" msgstr "E-&Mail:" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "Durchsuchen..." #: lib\config.py:108 msgid "&Editor:" msgstr "&Editor:" #: lib\config.py:116 msgid "E-mail &client:" msgstr "E-Mail-&Client:" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" "Tabulatorbreite in Zeichen\n" "Option wird in den qdiff-, qannotate- und qcat-Fenstern benutzt" #: lib\config.py:125 msgid "Tab &Width:" msgstr "Tabulator&breite" #: lib\config.py:137 msgid "Alias" msgstr "Alias" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "Befehl" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "Entfernen" #: lib\config.py:158 msgid "Abbreviation" msgstr "Abkürzung" #: lib\config.py:158 msgid "URL" msgstr "URL" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" "Einfügungen und Entfernungen innerhalb von Gruppen in Grün und Rot anzeigen" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "Externe Applikationen für Dateiunterschiede:" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "Name" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" "Bazaar 2.4 oder neuer wird benötigt, um Merge-Tools zu konfigurieren." #: lib\config.py:241 msgid "General" msgstr "Allgemein" #: lib\config.py:242 msgid "Aliases" msgstr "Aliase" #: lib\config.py:243 msgid "Bug Trackers" msgstr "Bug-Tracker" #: lib\config.py:244 msgid "&User Interface" msgstr "Benutzeroberfläche" #: lib\config.py:245 msgid "&Diff" msgstr "&Diff" #: lib\config.py:246 msgid "&Merge" msgstr "&Zusammenführen" #: lib\config.py:271 msgid "Spell check &language:" msgstr "&Sprache für Rechtschreibung:" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" "Dieser Ordner wird automatisch in das Ursprungsfeld des Zweiges eingetragen" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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 "Durchsuchen..." #: lib\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" "Basisverzeichnis\n" "für neue &Zweige:" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "Eingebaute Differenzanzeige" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "Altes externes Merge-Tool importieren" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" "Möchten Sie ihr vorher konfiguriertes externes Merge-Tool importieren:\n" "\n" " %(old_cmdline)s\n" "\n" "als:\n" "\n" " %(new_cmdline)s" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "&Ignorieren und Fortfahren" #: lib\config.py:609 msgid "&Change the values" msgstr "&Werte ändern" #: lib\config.py:719 msgid "Select editor executable" msgstr "Wählen Sie eine Editor Ausführungsdatei" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "Kommandozeile" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "Konflikte" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "Datei" #: lib\conflicts.py:62 msgid "Conflict" msgstr "Konflikt" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "&Starten..." #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "V&erschmelzungs-Werkzeug:" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "Automatisch auflösen" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "&Verschmelzungskonflikt" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "Markiere als &gelöst" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "%d Konflikt automatisch aufgelöst." msgstr[1] "%d Konflikte automatisch aufgelöst." #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "&OK" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "Alle Konflikte gelöst" #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "Fehler während der Ausführung vom Verschmelzungswerkzeug (code %d)" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "Fehler" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" "Bazaar 2.4 oder neuer wird für die Unterstützung von externen Merge-Tools " "benötigt." #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" "Richten Sie die external_merge-Anwendung in qconfig im Merge-Reiter ein" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "Externes Merge-Tool %(tool)s ist nicht verfügbar" #: lib\conflicts.py:299 #, 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 "" "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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "Fehlender Schalter: %s. Einstellen in qconfig im Zusammenführen-Tab." #: lib\conflicts.py:310 msgid "path conflict" msgstr "Pfadkonflikt" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "Inhaltskonflikt" #: lib\conflicts.py:312 msgid "text conflict" msgstr "Textkonflikt" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "Doppelte ID" #: lib\conflicts.py:314 msgid "duplicate" msgstr "Duplikat" #: lib\conflicts.py:315 msgid "parent loop" msgstr "Eltern-Schleife" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "" #: lib\conflicts.py:317 msgid "missing parent" msgstr "fehlender Parent" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "lösche Parent" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "kein-Ordner parent" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "Unterschie&de zeigen" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "entfernt" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "hinzugefügt" #: lib\diff.py:266 msgid "renamed and modified" msgstr "umbenannt und verändert" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "umbenannt" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "verändert" #: lib\diffview.py:461 msgid "Last modified:" msgstr "Letzte Änderung:" #: lib\diffview.py:462 msgid "Status:" msgstr "Status:" #: lib\diffview.py:463 msgid "Kind:" msgstr "Art:" #: lib\diffview.py:464 msgid "Properties:" msgstr "Eigenschaften:" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "[Binärdatei (%d bytes)]" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "\\ Kein Zeilenumbruch am Ende der Datei" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "Arbeitsbaum für %s" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "Arbeitsbaum" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "Rev %(rev)s für %(branch)s" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "Rev %s" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "Revid: %(revid)s für %(branch)s" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "Revid: %s" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "Zusammenführungsvorschau" #: lib\diffwindow.py:218 msgid "&Find" msgstr "&Suchen" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "In der aktiven Ansicht suchen" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "Unidiff" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "Zwischen Nebeneinander- und Unidiff-Ansicht umschalten" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "Aktualisieren" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "&Externes Diff-Tool" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "Externes Diff-Tool starten" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "&Vollständig" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "Tabulatorbreite" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "Tabulatorbreite linke Seite" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "Tabulatorbreite rechte Seite" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "Zeichensatzkodierung linke Seite" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "Zeichensatzkodierung rechte Seite" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "Leerzeichenänderungen &ignorieren" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "%d Datei" msgstr[1] "%d Dateien" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" "Datei %s ist nicht versioniert.\n" "Operation abgebrochen." #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "&Schließen" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "Keine Änderungen gefunden." #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "Falsche Zeichenkodierung" #: lib\encoding_selector.py:77 #, python-format msgid "Encoding \"%s\" is invalid or not supported." msgstr "Zeichenkodierung »%s« ist ungültig oder wird nicht unterstützt." #: lib\export.py:61 lib\export.py:80 msgid "Export" msgstr "Exportieren" #: lib\export.py:75 lib\uncommit.py:51 #, python-format msgid "Branch: %s" msgstr "Zweig: %s" #: lib\export.py:146 msgid "Archive type:" msgstr "Archivtyp:" #: lib\export.py:168 msgid "Root directory name:" msgstr "Name des Wurzelverzeichnises:" #: lib\export.py:236 lib\ui_branch.py:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "Optionen" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" msgstr "" #: lib\help.py:59 #, python-format msgid "No help can be found for %s" msgstr "Es kann keine Hilfe für %s gefunden werden" #: lib\help.py:103 msgid "Help" msgstr "Hilfe" #: lib\i18n.py:95 msgid "file" msgstr "Datei" #: lib\i18n.py:96 msgid "directory" msgstr "Verzeichnis" #: lib\i18n.py:97 msgid "symlink" msgstr "Symlink" #: lib\i18n.py:99 msgid "fixed" msgstr "behoben" #: lib\i18n.py:101 msgid "View text file" msgstr "Zeige Textdatei" #: lib\i18n.py:102 msgid "View image file" msgstr "Zeige Bilddatei" #: lib\i18n.py:103 msgid "View binary file" msgstr "Zeige Binärdatei" #: lib\i18n.py:104 msgid "View symlink" msgstr "Zeige Symlink" #: lib\i18n.py:105 msgid "View directory" msgstr "Zeige Verzeichnis" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "Keine Änderungen für einen Commit" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "Keine Änderungen zum Zurücksetzen ausgewählt." #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "Ignorieren" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "Unbekannte Dateien" #: lib\ignore.py:58 msgid "Extension" msgstr "Endung" #: lib\ignore.py:59 msgid "Ignore as" msgstr "Ignorieren als" #: lib\ignore.py:67 msgid "No action" msgstr "Keine Aktion" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "Alle Dateien mit dieser Erweiterung ignorieren" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "Anhand des Basisnamens ignorieren" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "Anhand des vollen Namens ignorieren" #: lib\ignore.py:226 msgid "No action selected" msgstr "Keine Aktion gewählt" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "Info" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "Initialisieren" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "Protokoll" #: lib\log.py:142 msgid "&Search:" msgstr "&Suchen:" #: lib\log.py:158 msgid "Messages" msgstr "Nachrichten" #: lib\log.py:160 msgid "Authors" msgstr "Autoren" #: lib\log.py:162 msgid "Revision IDs" msgstr "Revisions-IDs" #: lib\log.py:164 msgid "Revision Numbers" msgstr "Revisionsnummern" #: lib\log.py:166 msgid "Tags" msgstr "Stichworte" #: lib\log.py:168 msgid "Bugs" msgstr "Fehler" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" "Es ist nicht möglich, gleichzeitig verschiedene Dateipfade und verschiedene " "Zweige anzugeben." #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "Nachrichten und Datei-Text (indexiert)" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "Zeige &Unterschiede …" #: lib\log.py:575 msgid "View file" msgstr "Zeige Datei" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "Datei in dieser Revision speichern unter..." #: lib\log.py:583 msgid "Revert to this revision" msgstr "Bis zu dieser Revision zurücksetzen" #: lib\log.py:862 msgid "Not a file" msgstr "Keine Datei" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "Datei in dieser Revision speichern unter..." #: lib\log.py:878 msgid "Revert File" msgstr "Datei zurücksetzen" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" "Sind Sie sicher, dass Sie diese Datei auf den Stand der gewählten Revision " "zurücksetzen wollen?" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "Rev" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "Datum" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Autor" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "Fehler #%s" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "Zeige Unterschie&de in Datei" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "Zeige alle &Unterschiede" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "Zeige Unterschie&de in Datei" #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "Zeige alle &Unterschiede …" #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "Zeige Baum..." #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "Tag &Revision..." #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "Zu dieser Revision &zurücksetzen" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "Zu dieser Revision &aktualisieren" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "Zu Revision %s revid:%s zurücksetzen." #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "%s zu Revision %s revid:%s zurücksetzen." #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "Zurücksetzen" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "Aktualisieren auf Revision %s revid:%s." #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "Aktualisieren von %s auf Revision %s revid:%s." #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" msgstr "" #: lib\main.py:120 msgid "Computer" msgstr "Computer" #: lib\main.py:149 msgid "&Edit Bookmark..." msgstr "Bearbeite Lesezeichen" #: lib\main.py:150 msgid "&Remove Bookmark..." msgstr "Entferne Lesezeichen" #: lib\main.py:165 msgid "Bookmarks" msgstr "Lesezeichen" #: lib\main.py:276 msgid "Refresh the directory tree" msgstr "Aktualisiere den Verzeichnisbaum" #: lib\main.py:280 msgid "&Commit" msgstr "Übertrage" #: lib\main.py:281 msgid "Commit changes into a new revision" msgstr "Übertrage die Änderungen in eine neue Revision" #: lib\main.py:285 msgid "&Push" msgstr "&Drücken" #: lib\main.py:286 msgid "Turn this branch into a mirror of another branch" msgstr "Diesen Zweig in einen Spiegel eines anderen Zweigs umwandeln" #: lib\main.py:290 msgid "Pu&ll" msgstr "&Holen" #: lib\main.py:291 msgid "Update a mirror of this branch" msgstr "Aktualisiere ein Spiegelbild dieses Astes" #: lib\main.py:294 msgid "&Add Bookmark..." msgstr "&Füge ein Lesezeichen hinzu..." #: lib\main.py:301 msgid "&File" msgstr "&Datei" #: lib\main.py:302 msgid "&Configure..." msgstr "Konfigurieren..." #: lib\main.py:304 msgid "&Quit" msgstr "Beenden" #: lib\main.py:305 msgid "&View" msgstr "&Anzeigen" #: lib\main.py:307 msgid "&Branch" msgstr "&Zweig" #: lib\main.py:311 msgid "&Bookmarks" msgstr "&Lesezeichen" #: lib\main.py:313 lib\util.py:72 msgid "&Help" msgstr "&Hilfe" #: lib\main.py:314 msgid "&Help..." msgstr "&Hilfe..." #: lib\main.py:316 msgid "&About..." msgstr "&Über..." #: lib\main.py:354 msgid "Size" msgstr "Größe" #: lib\main.py:406 msgid "About QBzr" msgstr "Über QBzr" #: 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 "" "QBzr — Eine grafische Benutzeroberfläche für Bazaar
Version " "%(qbzr_version)s (bzrlib %(bzrlib_version)s)

Copyright © 2006-" "2008 Lukáš Lalinský und andere

http://bazaar-vcs.org/QBzr" #: lib\main.py:472 msgid "Add Bookmark" msgstr "Füge Lesezeichen hinzu" #: lib\main.py:483 msgid "Edit Bookmark" msgstr "Bearbeite Lesezeichen" #: lib\main.py:493 msgid "Remove Bookmark" msgstr "Entferne Lesezeichen" #: lib\main.py:494 msgid "Do you really want to remove the selected bookmark?" msgstr "Wollen Sie wirklich das ausgewählte Lesezeichen entfernen?" #: lib\plugins.py:44 msgid "Plugins" msgstr "Erweiterungen" #: lib\plugins.py:57 msgid "Version" msgstr "Version" #: lib\plugins.py:58 lib\subprocess.py:480 msgid "Description" msgstr "Beschreibung" #: lib\plugins.py:62 msgid "Directory" msgstr "Verzeichnis" #: lib\plugins.py:64 #, python-format msgid "Plugins installed: %(rows)d" msgstr "Installierte Erweiterungen: %(rows)d" #: lib\plugins.py:71 msgid "Summary" msgstr "Zusammenfassung" #: lib\plugins.py:72 lib\ui_branch.py:100 msgid "Locations" msgstr "Orte" #: lib\plugins.py:111 msgid "(no description)" msgstr "(keine Beschreibung)" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "Arbeitsbaum hat nicht übertragene Änderungen" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "Arbeitsbaum ist nicht aktuell, bitte 'bzr update' ausführen." #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "Möchten Sie trotzdem fortfahren?" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "Wählen Sie die Änderungen, die zurückgesetzt werden sollen." #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "Keine Sicherungskopien von zurückgesetzten Dateien anlegen." #: lib\revert.py:93 msgid "Forget pending merges" msgstr "Ausstehende Merge-Vorgänge verwerfen" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "Änderungen in den zum Zurücksetzen gewählten Dateien anzeigen" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "Eltern:" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "Kinder:" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "Signatur:" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "Ungesicherte Änderungen am Arbeitsbaum" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "Datum:" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "Beitragender:" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "Autor:" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "Zweig:" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "Markierungen:" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "Bug:" msgstr[1] "Bugs:" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "Revision" #: lib\run.py:98 msgid "Select working directory" msgstr "Arbeitsverzeichnis wählen" #: lib\run.py:119 msgid "&Edit" msgstr "&Bearbeiten" #: lib\run.py:167 msgid "Help for command" msgstr "Hilfe für Befehl" #: lib\run.py:287 msgid "Select path to insert" msgstr "Wähle Pfad zum Einfügen" #: lib\run.py:297 msgid "Select files to insert" msgstr "Wähle Dateien zum Einfügen" #: lib\send.py:34 msgid "Send" msgstr "Senden" #: lib\send.py:47 msgid "Merge Directive Options" msgstr "" #: lib\send.py:53 msgid "Submit Branch:" msgstr "Zu versendenden Zweig:" #: lib\send.py:77 msgid "Public Branch:" msgstr "Öffentlicher Zweig:" #: lib\send.py:99 msgid "Remember these locations as defaults" msgstr "Diese Orte als Standard merken" #: 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 "Aktion" #: lib\send.py:122 msgid "Address:" msgstr "Adresse:" #: lib\send.py:132 msgid "Message:" msgstr "Nachricht:" #: lib\send.py:149 msgid "Filename:" msgstr "Dateiname:" #: lib\send.py:163 msgid "Revisions:" msgstr "Revisionen:" #: lib\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "Zurückstellungsmanager" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "Zurückstellen" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "Zurückgestellte Änderungen ansehen" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "&Nochmals versuchen" #: lib\subprocess.py:518 msgid "Ready" msgstr "Bereit" #: lib\subprocess.py:591 msgid "Starting..." msgstr "Startet..." #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "\"bzr.exe\" konnte nicht gefunden werden." #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "Das Skript \"bzr\" konnte nicht gefunden werden." #: lib\subprocess.py:694 msgid "Aborting..." msgstr "Bricht ab..." #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "Fertig!" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "Trage Passwort ein" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "Benutzernamen eingeben" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "Misserfolg!" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "Bzr konnte nicht gestartet werden" #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "Fehler bei der Ausführung von bzr. (Fehler-Code: %d)" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "Abgebrochen!" #: lib\switch.py:46 msgid "Switch" msgstr "Umschalten" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "Schwergewichtiger Checkout:" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "Leichtgewichtiger Checkout" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "Checkout des Zweiges:" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "Wechseln zum Zweig:" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "Einen Zweig erstellen vor dem Umschalten" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "Systeminformation" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "Sie sollten einen Tag-Namen angeben" #: lib\tag.py:140 #, python-format msgid "" "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:150 #, python-format msgid "" "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 #, python-format msgid "Tag \"%s\" does not exists" msgstr "Der Tag \"%s\" extistiert nicht" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" "Kein Zweig:\n" "%s" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "Fenster %s schließen" #: lib\trace.py:248 msgid "Close Window" msgstr "Fenster schließen" #: lib\trace.py:250 msgid "Close Application" msgstr "Anwendung beenden" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "Fehlerdialog schließen" #: lib\trace.py:265 msgid "Ignore Error" msgstr "Fehler ignorieren" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "Bazaar-Fehler melden" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "Fehlerdetails anzeigen >>>" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "<<< Fehlerdetails verbergen" #: lib\treewidget.py:322 msgid "ignored" msgstr "ignoriert" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "nicht versioniert" #: lib\treewidget.py:327 msgid "added, missing" msgstr "hinzugefügt, fehlend" #: lib\treewidget.py:333 msgid "missing" msgstr "fehlend" #: lib\treewidget.py:340 msgid "moved" msgstr "verschoben" #: lib\treewidget.py:346 msgid "x-bit" msgstr "x-Bit" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "Dateiname" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "Unverändert" #: lib\treewidget.py:1303 msgid "Changed" msgstr "Geändert" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "Nicht versioniert" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "Ignoriert" #: lib\treewidget.py:1682 msgid "&Open" msgstr "&Öffnen" #: lib\treewidget.py:1685 msgid "&View file" msgstr "Datei &anzeigen" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "&Anmerkungen zeigen" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "&Protokoll anzeigen" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "Konflikt als ge&löst markieren" #: lib\treewidget.py:1714 msgid "&Add" msgstr "&Hinzufügen" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "&Zurücksetzen" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "&Umbenennen" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "Als verschoben und umbenannt &markieren" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "Als verschoben &markieren" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "Als umbenannt &markieren" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "Möchten Sie wirklich die ausgewählte(n) Datei(en) zurücksetzen?" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "Externes Merge-Tool" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" "Einige der ausgewählten Dateien können nicht wiederhergestellt werden, " "nachdem sie gelöscht wurden. Sind Sie sicher, dass diese Dateien gelöscht " "werden sollen?" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "Alle an-/abwählen" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "Kein Zweig \"%s\"" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "Es existiert kein Arbeitsbaum für \"%s\"" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "&Ort" #: lib\ui_branch.py:101 msgid "&From:" msgstr "&Von:" #: lib\ui_branch.py:103 msgid "&To:" msgstr "&An:" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "Neuen Zweig an den Ursprungsort binden" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "&Revision:" #: lib\ui_info.py:87 msgid "..." msgstr "..." #: lib\ui_info.py:89 msgid "&Basic" msgstr "&Grundlegendes" #: lib\ui_info.py:91 msgid "&Detailed" msgstr "&Detailliert" #: lib\ui_init.py:119 msgid "Local Directory" msgstr "Lokaler Ordner" #: lib\ui_init.py:121 msgid "Repository" msgstr "Projektarchiv" #: lib\ui_init.py:122 msgid "Create a new standalone tree" msgstr "Erstelle einen neuen eigenständigen Baum" #: lib\ui_init.py:123 msgid "Ensure all revisions are appended to the log" msgstr "Sicherstellen, dass alle Revisionen zum Protokoll hinzugefügt werden" #: lib\ui_init.py:124 msgid "Create a new shared repository" msgstr "Erstelle ein neues gemeinsames Projektarchiv" #: lib\ui_init.py:125 msgid "Skip the creation of working trees in this repository" msgstr "Überspringe die Erstellung von Arbeitsbäumen in diesem Projektarchiv" #: lib\ui_init.py:131 msgid "Repository Format:" msgstr "Projektarchiv-Format:" #: lib\ui_init.py:132 msgid "Description of format" msgstr "Beschreibung des Formats" #: lib\ui_merge.py:62 msgid "Merge" msgstr "Zusammenführen" #: lib\ui_merge.py:67 lib\ui_pull.py:65 lib\ui_push.py:66 msgid "Remember this location as a default" msgstr "Diesen Ort als Standard merken" #: lib\ui_merge.py:68 msgid "Merge even if the working tree has uncommitted changes" msgstr "Zusammenführen auch wenn Arbeitsbaum ungesicherte Änderungen hat" #: lib\ui_merge.py:69 msgid "Merge uncommitted changes instead of committed ones" msgstr "Zusammenführen von ungesicherten Änderungen anstatt der gesicherten" #: lib\ui_merge_config.py:58 msgid "Form" msgstr "Formular" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "Externe Merge-Tools" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" "Setzt das ausgewählte Merge-Tool als Standardeinstellung in qconflicts." #: lib\ui_merge_config.py:63 msgid "Set Default" msgstr "Standard setzen" #: lib\ui_new_tree.py:129 msgid "Create a new Bazaar Working Tree" msgstr "Erstelle einen neuen Bazaar-Arbeitsbaum" #: lib\ui_new_tree.py:131 msgid "" "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" msgstr "Lokaler Ordner, in dem der Arbeitsbaum erstellt wird" #: lib\ui_new_tree.py:135 msgid "Working Tree Options" msgstr "Arbeitsbaum-Optionen" #: lib\ui_new_tree.py:136 msgid "Create a checkout" msgstr "Erstelle einen Checkout" #: lib\ui_new_tree.py:144 msgid "Light-weight checkout" msgstr "Leichtgewichtiger Checkout" #: lib\ui_new_tree.py:145 msgid "Make a local copy of the branch" msgstr "Erstelle eine lokale Kopie des Zweigs" #: lib\ui_new_tree.py:151 msgid "Create a stacked branch referring to the source branch" 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." msgstr "" "Klicke einen Link an um mehr Informationen über Checkouts und Äste zu " "erhalten." #: lib\ui_new_tree.py:159 msgid "Most recent (tip) revision" msgstr "Letzte Revision (Spitze)" #: lib\ui_new_tree.py:161 msgid "Show Log..." msgstr "Protokoll anzeigen …" #: lib\ui_pull.py:60 msgid "Pull" msgstr "Herunterladen (pull)" #: 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 "Unterschiede zwischen Zweigen überschreiben" #: lib\ui_push.py:62 msgid "Push" msgstr "Hochladen" #: lib\ui_push.py:68 msgid "Use existing directory" msgstr "Vorhandenen Ordner benutzen" #: lib\ui_push.py:69 msgid "Create the path up to the branch if it does not exist" msgstr "Pfad zum Zweig anlegen, wenn er nicht existiert" #: lib\ui_run.py:107 msgid "Run bzr command" msgstr "bzr Kommando ausführen" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "&Arbeitsordner:" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "&Kategorie:" #: lib\ui_run.py:112 msgid "&Command:" msgstr "&Befehl:" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "Ver&steckte Befehle zeigen" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "&Optionen und Argumente für Befehl:" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "Or&dner einfügen..." #: lib\ui_run.py:116 msgid "Insert &filenames..." msgstr "Dateinamen ein&fügen..." #: lib\ui_sysinfo.py:113 msgid "Bazaar Library" msgstr "Bazaar Bibliothek" #: lib\ui_sysinfo.py:114 lib\ui_sysinfo.py:124 msgid "Version:" msgstr "Version:" #: lib\ui_sysinfo.py:115 msgid "(bzr-version)" msgstr "(bzr-version)" #: lib\ui_sysinfo.py:116 lib\ui_sysinfo.py:126 msgid "Path:" msgstr "Pfad:" #: lib\ui_sysinfo.py:117 msgid "(bzr-lib-path)" msgstr "(bzr-lib-path)" #: lib\ui_sysinfo.py:118 msgid "Bazaar Configuration" msgstr "Bazaar Einstellungen" #: lib\ui_sysinfo.py:119 msgid "Settings:" msgstr "Einstellungen:" #: lib\ui_sysinfo.py:120 msgid "(bzr-config-dir)" msgstr "(bzr-config-dir)" #: lib\ui_sysinfo.py:121 msgid "Log File:" msgstr "Protokolldatei:" #: lib\ui_sysinfo.py:122 msgid "(bzr-log-file)" msgstr "(bzr-log-file)" #: lib\ui_sysinfo.py:123 msgid "Python Interpreter" msgstr "Python Interpreter" #: lib\ui_sysinfo.py:125 msgid "(python-version)" msgstr "(Python-Version)" #: lib\ui_sysinfo.py:127 msgid "(python-file)" msgstr "(Python-file)" #: lib\ui_sysinfo.py:128 msgid "Library:" msgstr "Bibliothek:" #: lib\ui_sysinfo.py:129 msgid "(python-lib-dir)" msgstr "(Python-Lib-Verzeichnis)" #: lib\ui_tag.py:88 msgid "Edit tag" msgstr "Tag bearbeiten" #: lib\ui_tag.py:91 msgid "Tag" msgstr "Tag" #: lib\ui_tag.py:92 msgid "&Action:" msgstr "&Aktion" #: lib\ui_tag.py:93 msgid "Create new tag" msgstr "Neuen Tag erstellen" #: lib\ui_tag.py:94 msgid "Move existing tag" msgstr "Existierenden Tag verschieben" #: lib\ui_tag.py:95 msgid "Delete existing tag" msgstr "Existierenden Tag löschen" #: lib\ui_tag.py:96 msgid "&Tag name:" msgstr "Markierungsname:" #: lib\ui_tag.py:98 msgid "&Select..." msgstr "&Auswählen" #: lib\ui_update_branch.py:82 msgid "Update Branch" msgstr "Zweig aktualisieren" #: lib\ui_update_branch.py:83 msgid "" "This directory is a branch. Please select what you would like to update" msgstr "" "Dieser Ordner ist ein Zweig. Bitte wählen Sie, was Sie aktualisieren möchten." #: lib\ui_update_branch.py:84 lib\ui_update_checkout.py:76 msgid "Update source" msgstr "Aktualisiere Quelle" #: lib\ui_update_branch.py:86 msgid "Pull most recent changes from:" msgstr "Hohle neueste Änderungen von:" #: lib\ui_update_branch.py:87 msgid "Remember this as the new parent branch" msgstr "Diesen als neuen Elternzweig speichern" #: 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 "Arbeitsbaum auf die neusten Änderungen im Zweig aufdatieren" #: lib\ui_update_checkout.py:74 msgid "Update Checkout" msgstr "Aktualisiere Checkout" #: lib\ui_update_checkout.py:75 #, python-format msgid "This directory is a checkout of: %s" msgstr "Dieser Ordner ist ein Checkout von: %s" #: lib\ui_update_checkout.py:77 msgid "Update the working tree from the bound branch" msgstr "Arebeitsbaum vom gebundenen Zweig aufdatieren" #: lib\ui_update_checkout.py:78 msgid "Pull a different branch" msgstr "Hole einen anderen Zweig" #: lib\unbind.py:36 msgid "Unbind branch" msgstr "Löse Zweig" #: lib\unbind.py:47 msgid "Unbind" msgstr "Lösen" #: lib\unbind.py:55 msgid "Bound to:" msgstr "Gebunden an:" #: lib\uncommit.py:40 msgid "Uncommit" msgstr "Commit zurückziehen" #: 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 "Andere Revision:" #: lib\uncommit.py:104 msgid "No other revision specified." msgstr "Keine andere Revision festgelegt." #: lib\uncommit.py:122 msgid "Do you really want to uncommit these revisions?" msgstr "Wollen Sie diese Revisionen wirklich zurückziehen?" #: lib\update.py:33 msgid "Update working tree" msgstr "Arbeitsbaum aufdatieren" #: lib\update.py:34 #, python-format msgid "Update tree %s" msgstr "Arbeitsbaum %s aktualisieren" #: lib\util.py:70 msgid "&Cancel" msgstr "&Abbrechen" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "Wähle Quellverzeichnis" #: lib\util.py:585 msgid "Select Target Directory" msgstr "Wähle Zielverzeichnis" #: lib\util.py:726 msgid "deleted files" msgstr "gelöschte Dateien" #: lib\util.py:728 msgid "added files" msgstr "hinzugefügte Dateien" #: lib\util.py:730 msgid "renamed files" msgstr "umbenannte Dateien" #: lib\util.py:732 msgid "modified files" msgstr "geänderte Dateien" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "(keine Meldung)" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "Signaturen überprüfen" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "Datei löschen" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "umbenennen" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "Datei hinzufügen" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "Text ändern" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "Ziel ändern" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "Binärdatei ändern" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "Vollständig" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "Editor benutzen" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "Zerstören" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "Alle auswählen" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "Alle abwählen" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "&Anordnung" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "Kein Editor zum Ändern ausgewählt." #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "Keine Änderungen ausgewählt." #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" "Vorgang abgebrochen, weil der Arbeitsbaum ausstehende Merges besitzt." #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "Vorgang abgebrochen, weil sich die Zieldateien geändert haben." #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "Id" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "Leerzeichen ignorieren" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "Testdurchlauf" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "Beibehalten" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "Löschen" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "Dateiliste anzeigen" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "Suchen: " #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "Zurück" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "Weiter" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "Groß-/Kleinschreibung beachten" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "Ganze Wörter" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "Layout" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "Layout %d" #~ msgid "Side by side" #~ msgstr "Seite an Seite" #~ msgid "No changes to commit." #~ msgstr "Keine Änderungen zu übertragen." #~ msgid "[binary file]" #~ msgstr "[Binärdatei]" #~ msgid "Working tree format:" #~ msgstr "Arbeitsbaum-Format" #~ msgid "Repository format:" #~ msgstr "Projektarchiv-Format" #~ msgid "Control directory format:" #~ msgstr "Kontrollverzeichnis-Format:" #~ msgid "&Format" #~ msgstr "&Format" #~ msgid "You must specify a location" #~ msgstr "Es muss ein Ort angegeben werden" #~ msgid "Cre&ate" #~ msgstr "Erstellen" #~ msgid "Definition" #~ msgstr "Definition" #~ msgid "Using" #~ msgstr "Verwende" #~ msgid "&No" #~ msgstr "&Nein" #~ msgid "&Yes" #~ msgstr "&Ja" #~ msgid "&Move" #~ msgstr "&Verschieben" #~ msgid "You should provide commit message." #~ msgstr "Eine Commit-Nachricht sollte angegeben werden." #~ msgid "External Merge Apps:" #~ msgstr "Externe Applikationen für das Datei-Zusammenführen:" #~ msgid "Use Configured Default" #~ msgstr "Benutze eingestellte Vorgabe" #~ msgid "Push branch:" #~ msgstr "Zweig hochladen:" #~ msgid "Public branch:" #~ msgstr "Öffentlicher Zweig:" #~ msgid "Location has no branch" #~ msgstr "Ort hat keinen Zweig" #~ msgid "Location has no working tree" #~ msgstr "Ort hat keinen Arbeitsbaum" #, python-format #~ msgid "%s (Configured external merge definition in qconfig)" #~ msgstr "" #~ "%s (Eingestellt als externe Definition zum Zusammenführen in qconfig)" #~ 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 "" #~ "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." #~ msgid "&Related Branches" #~ msgstr "&Verwandte Zweige" #~ msgid "Left side encoding:" #~ msgstr "Zeichenkodierung links:" #~ msgid "Right side encoding:" #~ msgstr "Zeichenkodierung rechts:" #~ msgid "Branch format:" #~ msgstr "Zweigformat:" #~ msgid "Parent branch:" #~ msgstr "Eltern-Zweig:" #~ msgid "" #~ "You are reverting all changed paths without also reverting pending merges. " #~ "Do you want to continue?" #~ msgstr "" #~ "Sie wollen alle geänderten Pfade zurücksetzen, ohne auch die ausstehenden " #~ "Merge-Vorgänge zurückzusetzen. Möchten Sie fortfahren?" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-en.po0000644000000000000000000015002314556556456013177 0ustar00msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-12 16:38+0300\n" "PO-Revision-Date: 2012-07-12 16:38+0300\n" "Last-Translator: Automatically generated\n" "Language-Team: none\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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Add" #: lib\add.py:57 msgid "Unversioned Files" msgstr "Unversioned Files" #: lib\add.py:106 msgid "Show ignored files" msgstr "Show ignored files" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "Nothing selected to add" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "Annotate" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "Loading..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "Encoding" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "Find" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "Goto Line" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "&View Options" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "View Options" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "Word Wrap" #: lib\annotate.py:383 msgid "Tab Width" msgstr "Tab Width" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "Revision %s" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "Goto Line: " #: lib\annotate.py:762 msgid "Go" msgstr "Go" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "Close Goto Line" #: lib\annotate.py:804 msgid "&Annotate this revision" msgstr "&Annotate this revision" #: lib\bind.py:44 msgid "Bind branch" msgstr "Bind branch" #: lib\bind.py:54 msgid "Bind" msgstr "Bind" #: lib\bind.py:56 msgid "Branch location:" msgstr "Branch location:" #: lib\bind.py:60 msgid "Currently bound to:" msgstr "Currently bound to:" #: lib\bind.py:64 msgid "Bind to:" msgstr "Bind to:" #: lib\bind.py:68 lib\browse.py:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Browse" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "Select branch location" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "Master branch location not specified." #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Location:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "Revision:" #: lib\browse.py:84 msgid "Show" msgstr "Show" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "&Filter" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "View" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "Encoding:" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "Commit" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "Branch" #: lib\commit.py:259 msgid "&Local commit" msgstr "&Local commit" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" "Local commits are not pushed to the master branch until a normal commit is " "performed" #: lib\commit.py:265 msgid "Description:" msgstr "Description:" #: lib\commit.py:280 msgid "" "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." msgstr "" "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." #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "Working tree is out of date. To commit, update the working tree." #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "Update" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "Message" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "Show non-versioned files" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "Enter the commit message" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "&Fixed bugs:" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "Set the IDs of bugs fixed by this commit" #: lib\commit.py:364 msgid "" "Enter the list of bug IDs in format tag:id separated by a space, e.g. " "project:123 project:765" msgstr "" "Enter the list of bug IDs in format tag:id separated by a space, e.g. " "project:123 project:765" #: lib\commit.py:374 msgid "&Author:" msgstr "&Author:" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "Set the author of this change, if it's different from the committer" #: lib\commit.py:378 msgid "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "Enter the author's name, e.g. John Doe <jdoe@example.com>" #: lib\commit.py:393 msgid "Changes" msgstr "Changes" #: lib\commit.py:410 msgid "Pending Merges" msgstr "Pending Merges" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "Status" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "View changes in files selected to commit" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "You should provide a commit message." #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" "No changes selected to commit.\n" "Do you want to commit anyway?" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." #: lib\commit.py:745 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 "" "A local commit to the branch will be performed. The master branch will not " "be updated until a non-local commit is made." #: lib\commit.py:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "Diff" #: lib\config.py:49 msgid "Default" msgstr "Default" #: lib\config.py:50 msgid "Thunderbird" msgstr "Thunderbird" #: lib\config.py:51 msgid "Evolution" msgstr "Evolution" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "Mutt" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "XDG e-mail client" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "MAPI e-mail client" #: lib\config.py:56 msgid "Editor" msgstr "Editor" #: lib\config.py:79 msgid "Configuration" msgstr "Configuration" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "&Name:" #: lib\config.py:95 msgid "E-&mail:" msgstr "E-&mail:" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "&Browse..." #: lib\config.py:108 msgid "&Editor:" msgstr "&Editor:" #: lib\config.py:116 msgid "E-mail &client:" msgstr "E-mail &client:" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" #: lib\config.py:125 msgid "Tab &Width:" msgstr "Tab &Width:" #: lib\config.py:137 msgid "Alias" msgstr "Alias" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "Command" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "Remove" #: lib\config.py:158 msgid "Abbreviation" msgstr "Abbreviation" #: lib\config.py:158 msgid "URL" msgstr "URL" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "Show inter-group inserts and deletes in green and red" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "External Diff Apps:" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "Name" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "Bazaar 2.4 or newer is required to configure mergetools." #: lib\config.py:241 msgid "General" msgstr "General" #: lib\config.py:242 msgid "Aliases" msgstr "Aliases" #: lib\config.py:243 msgid "Bug Trackers" msgstr "Bug Trackers" #: lib\config.py:244 msgid "&User Interface" msgstr "&User Interface" #: lib\config.py:245 msgid "&Diff" msgstr "&Diff" #: lib\config.py:246 msgid "&Merge" msgstr "&Merge" #: lib\config.py:271 msgid "Spell check &language:" msgstr "Spell check &language:" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" "This directory will be automatically filled in your branch source input field" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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 "Browse..." #: lib\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" "Base directory\n" "for &branch sources:" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" "This directory will be automatically filled in your checkout destination " "input field" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" "Base directory\n" "for &checkouts:" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "Builtin Diff" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "Import old external merge tool" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" #: lib\config.py:446 msgid "old_cmdline" msgstr "old_cmdline" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "&Ignore and proceed" #: lib\config.py:609 msgid "&Change the values" msgstr "&Change the values" #: lib\config.py:719 msgid "Select editor executable" msgstr "Select editor executable" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "Select base directory for checkouts" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "Select default directory for branch sources" #: lib\config.py:974 msgid "Command Line" msgstr "Command Line" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "Conflicts" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "File" #: lib\conflicts.py:62 msgid "Conflict" msgstr "Conflict" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "&Launch..." #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "M&erge tool:" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "Auto-resolve" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "&Merge conflict" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "Take \"&THIS\" version" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "Take \"&OTHER\" version" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "Mark as &resolved" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "%d conflict auto-resolved." msgstr[1] "%d conflicts auto-resolved." #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "&OK" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "All conflicts resolved." #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "Error while running merge tool (code %d)" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "Error" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "Bazaar 2.4 or later is required for external mergetools support" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "Set up external_merge app in qconfig under the Merge tab" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "External merge tool %(tool)s is not available" #: lib\conflicts.py:299 #, 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 "" "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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "Missing the flag: %s. Configure in qconfig under the merge tab." #: lib\conflicts.py:310 msgid "path conflict" msgstr "path conflict" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "contents conflict" #: lib\conflicts.py:312 msgid "text conflict" msgstr "text conflict" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "duplicate id" #: lib\conflicts.py:314 msgid "duplicate" msgstr "duplicate" #: lib\conflicts.py:315 msgid "parent loop" msgstr "parent loop" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "unversioned parent" #: lib\conflicts.py:317 msgid "missing parent" msgstr "missing parent" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "deleting parent" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "non-directory parent" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "Show &differences" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "removed" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "added" #: lib\diff.py:266 msgid "renamed and modified" msgstr "renamed and modified" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "renamed" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "modified" #: lib\diffview.py:461 msgid "Last modified:" msgstr "Last modified:" #: lib\diffview.py:462 msgid "Status:" msgstr "Status:" #: lib\diffview.py:463 msgid "Kind:" msgstr "Kind:" #: lib\diffview.py:464 msgid "Properties:" msgstr "Properties:" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "[binary file (%d bytes)]" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "\\ No newline at end of file" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "Working Tree for %s" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "Working Tree" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "Rev %(rev)s for %(branch)s" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "Rev %s" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "Revid: %(revid)s for %(branch)s" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "Revid: %s" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "Merge Preview" #: lib\diffwindow.py:218 msgid "&Find" msgstr "&Find" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "Find on active panel" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "Unidiff" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "Toggle between Side by side and Unidiff view modes" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "&Refresh" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "&External Diff" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "Launch an external diff application" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "&Complete" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "Tab width" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "Left side tab width" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "Right side tab width" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "Left side encoding" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "Right side encoding" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "&Ignore whitespace changes" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "%d file" msgstr[1] "%d files" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" "File %s is not versioned.\n" "Operation aborted." #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "&Close" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "No changes found." #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "Wrong encoding" #: lib\encoding_selector.py:77 #, python-format msgid "Encoding \"%s\" is invalid or not supported." msgstr "Encoding \"%s\" is invalid or not supported." #: lib\export.py:61 lib\export.py:80 msgid "Export" msgstr "Export" #: lib\export.py:75 lib\uncommit.py:51 #, python-format msgid "Branch: %s" msgstr "Branch: %s" #: lib\export.py:146 msgid "Archive type:" msgstr "Archive type:" #: lib\export.py:168 msgid "Root directory name:" msgstr "Root directory name:" #: lib\export.py:236 lib\ui_branch.py:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "Options" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "Export location is invalid" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "Export revision is invalid" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "You should specify branch source" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "You should select destination directory" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "Do you really want to checkout into a non-empty folder?" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "Do you really want to branch into a non-empty folder?" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" msgstr "You should specify source branch location" #: lib\help.py:59 #, python-format msgid "No help can be found for %s" msgstr "No help can be found for %s" #: lib\help.py:103 msgid "Help" msgstr "Help" #: lib\i18n.py:95 msgid "file" msgstr "file" #: lib\i18n.py:96 msgid "directory" msgstr "directory" #: lib\i18n.py:97 msgid "symlink" msgstr "symlink" #: lib\i18n.py:99 msgid "fixed" msgstr "fixed" #: lib\i18n.py:101 msgid "View text file" msgstr "View text file" #: lib\i18n.py:102 msgid "View image file" msgstr "View image file" #: lib\i18n.py:103 msgid "View binary file" msgstr "View binary file" #: lib\i18n.py:104 msgid "View symlink" msgstr "View symlink" #: lib\i18n.py:105 msgid "View directory" msgstr "View directory" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "No changes selected to commit" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "No changes selected to revert" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "Ignore" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "Unknown Files" #: lib\ignore.py:58 msgid "Extension" msgstr "Extension" #: lib\ignore.py:59 msgid "Ignore as" msgstr "Ignore as" #: lib\ignore.py:67 msgid "No action" msgstr "No action" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "Ignore all files with this extension" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "Case-insensitive pattern" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "Ignore by basename" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "Ignore by fullname" #: lib\ignore.py:226 msgid "No action selected" msgstr "No action selected" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "Info" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "Initialize" #: lib\init.py:74 msgid "You should specify a location" msgstr "You should specify a location" #: lib\log.py:112 msgid "Log" msgstr "Log" #: lib\log.py:142 msgid "&Search:" msgstr "&Search:" #: lib\log.py:158 msgid "Messages" msgstr "Messages" #: lib\log.py:160 msgid "Authors" msgstr "Authors" #: lib\log.py:162 msgid "Revision IDs" msgstr "Revision IDs" #: lib\log.py:164 msgid "Revision Numbers" msgstr "Revision Numbers" #: lib\log.py:166 msgid "Tags" msgstr "Tags" #: lib\log.py:168 msgid "Bugs" msgstr "Bugs" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" "It is not possible to specify different file paths and different branches at " "the same time." #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "Messages and File text (indexed)" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "Show &differences..." #: lib\log.py:575 msgid "View file" msgstr "View file" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "Save file on this revision as..." #: lib\log.py:583 msgid "Revert to this revision" msgstr "Revert to this revision" #: lib\log.py:862 msgid "Not a file" msgstr "Not a file" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" "Operation is supported for a single file only,\n" "not for a %s." #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "Save file in this revision as..." #: lib\log.py:878 msgid "Revert File" msgstr "Revert File" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "Rev" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "Date" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Author" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "bug #%s" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "Show file &differences" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "Show all &differences" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "Show file &differences..." #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "Show all &differences..." #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "Show &tree..." #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "Tag &revision..." #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "R&evert to this revision" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "&Update to this revision" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "&Cherry pick" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "Re&verse Cherry pick" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "Revert to revision %s revid:%s." #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "Revert %s to revision %s revid:%s." #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "Revert" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "Update to revision %s revid:%s." #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "Update %s to revision %s revid:%s." #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "Cherry-pick revisions %s - %s from %s to %s." #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "Cherry-pick" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "Reverse cherry-pick revisions %s - %s" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "Reverse cherry-pick revisions %s - %s in %s." #: lib\logwidget.py:520 msgid "Reverse cherry-pick" msgstr "Reverse cherry-pick" #: lib\main.py:120 msgid "Computer" msgstr "Computer" #: lib\main.py:149 msgid "&Edit Bookmark..." msgstr "&Edit Bookmark..." #: lib\main.py:150 msgid "&Remove Bookmark..." msgstr "&Remove Bookmark..." #: lib\main.py:165 msgid "Bookmarks" msgstr "Bookmarks" #: lib\main.py:276 msgid "Refresh the directory tree" msgstr "Refresh the directory tree" #: lib\main.py:280 msgid "&Commit" msgstr "&Commit" #: lib\main.py:281 msgid "Commit changes into a new revision" msgstr "Commit changes into a new revision" #: lib\main.py:285 msgid "&Push" msgstr "&Push" #: lib\main.py:286 msgid "Turn this branch into a mirror of another branch" msgstr "Turn this branch into a mirror of another branch" #: lib\main.py:290 msgid "Pu&ll" msgstr "Pu&ll" #: lib\main.py:291 msgid "Update a mirror of this branch" msgstr "Update a mirror of this branch" #: lib\main.py:294 msgid "&Add Bookmark..." msgstr "&Add Bookmark..." #: lib\main.py:301 msgid "&File" msgstr "&File" #: lib\main.py:302 msgid "&Configure..." msgstr "&Configure..." #: lib\main.py:304 msgid "&Quit" msgstr "&Quit" #: lib\main.py:305 msgid "&View" msgstr "&View" #: lib\main.py:307 msgid "&Branch" msgstr "&Branch" #: lib\main.py:311 msgid "&Bookmarks" msgstr "&Bookmarks" #: lib\main.py:313 lib\util.py:72 msgid "&Help" msgstr "&Help" #: lib\main.py:314 msgid "&Help..." msgstr "&Help..." #: lib\main.py:316 msgid "&About..." msgstr "&About..." #: lib\main.py:354 msgid "Size" msgstr "Size" #: lib\main.py:406 msgid "About QBzr" msgstr "About QBzr" #: 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 "" "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" #: lib\main.py:472 msgid "Add Bookmark" msgstr "Add Bookmark" #: lib\main.py:483 msgid "Edit Bookmark" msgstr "Edit Bookmark" #: lib\main.py:493 msgid "Remove Bookmark" msgstr "Remove Bookmark" #: lib\main.py:494 msgid "Do you really want to remove the selected bookmark?" msgstr "Do you really want to remove the selected bookmark?" #: lib\plugins.py:44 msgid "Plugins" msgstr "Plugins" #: lib\plugins.py:57 msgid "Version" msgstr "Version" #: lib\plugins.py:58 lib\subprocess.py:480 msgid "Description" msgstr "Description" #: lib\plugins.py:62 msgid "Directory" msgstr "Directory" #: lib\plugins.py:64 #, python-format msgid "Plugins installed: %(rows)d" msgstr "Plugins installed: %(rows)d" #: lib\plugins.py:71 msgid "Summary" msgstr "Summary" #: lib\plugins.py:72 lib\ui_branch.py:100 msgid "Locations" msgstr "Locations" #: lib\plugins.py:111 msgid "(no description)" msgstr "(no description)" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "Working tree has uncommitted changes." #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "Working tree is out of date, please run 'bzr update'." #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "Do you want to continue anyway?" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "Select changes to revert" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "Do not save backups of reverted files" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "Forget pending merges" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "View changes in files selected to revert" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "You have not selected anything to revert." #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "Parents:" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "Children:" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "Signature:" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "Uncommited Working Tree Changes" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "Date:" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "Committer:" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "Author:" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "Branch:" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "Tags:" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "Bug:" msgstr[1] "Bugs:" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "Revision" #: lib\run.py:98 msgid "Select working directory" msgstr "Select working directory" #: lib\run.py:119 msgid "&Edit" msgstr "&Edit" #: lib\run.py:167 msgid "Help for command" msgstr "Help for command" #: lib\run.py:287 msgid "Select path to insert" msgstr "Select path to insert" #: lib\run.py:297 msgid "Select files to insert" msgstr "Select files to insert" #: lib\send.py:34 msgid "Send" msgstr "Send" #: lib\send.py:47 msgid "Merge Directive Options" msgstr "Merge Directive Options" #: lib\send.py:53 msgid "Submit Branch:" msgstr "Submit Branch:" #: lib\send.py:77 msgid "Public Branch:" msgstr "Public Branch:" #: lib\send.py:99 msgid "Remember these locations as defaults" msgstr "Remember these locations as defaults" #: lib\send.py:103 msgid "Include a bundle in the merge directive" msgstr "Include a bundle in the merge directive" #: lib\send.py:107 msgid "Include a preview patch in the merge directive" msgstr "Include a preview patch in the merge directive" #: lib\send.py:112 msgid "Action" msgstr "Action" #: lib\send.py:122 msgid "Address:" msgstr "Address:" #: lib\send.py:132 msgid "Message:" msgstr "Message:" #: lib\send.py:149 msgid "Filename:" msgstr "Filename:" #: lib\send.py:163 msgid "Revisions:" msgstr "Revisions:" #: lib\send.py:208 msgid "Email address not entered." msgstr "Email address not entered." #: lib\send.py:212 msgid "Email address is not valid." msgstr "Email address is not valid." #: lib\send.py:218 msgid "Filename not entered." msgstr "Filename not entered." #: lib\send.py:224 msgid "No submit branch entered." msgstr "No submit branch entered." #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "Shelve Manager" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "Shelve" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "View shelved changes" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "Working tree has conflicts." #: lib\subprocess.py:130 msgid "Resolve" msgstr "Resolve" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "Could not acquire lock. Please retry later." #: lib\subprocess.py:137 msgid "Retry" msgstr "Retry" #: lib\subprocess.py:217 msgid "&Retry" msgstr "&Retry" #: lib\subprocess.py:518 msgid "Ready" msgstr "Ready" #: lib\subprocess.py:591 msgid "Starting..." msgstr "Starting..." #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "Could not locate \"bzr.exe\"." #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "Could not locate \"bzr\" script." #: lib\subprocess.py:694 msgid "Aborting..." msgstr "Aborting..." #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "Finished!" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "Enter Password" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "Enter Username" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "Failed!" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "Failed to start bzr." #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "Error while running bzr. (error code: %d)" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "Aborted!" #: lib\switch.py:46 msgid "Switch" msgstr "Switch" #: lib\switch.py:57 msgid "Switch checkout" msgstr "Switch checkout" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "Heavyweight checkout:" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "Lightweight checkout:" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "Checkout of branch:" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "Switch to branch:" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "Create Branch before switching" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "Branch location not specified." #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "System Information" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "You should specify tag name" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "Tag \"%s\" does not exists" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" "Not a branch:\n" "%s" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "Close %s Window" #: lib\trace.py:248 msgid "Close Window" msgstr "Close Window" #: lib\trace.py:250 msgid "Close Application" msgstr "Close Application" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "Close Error Dialog" #: lib\trace.py:265 msgid "Ignore Error" msgstr "Ignore Error" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "Report Bazaar Error" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "Show Error Details >>>" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "<<< Hide Error Details" #: lib\treewidget.py:322 msgid "ignored" msgstr "ignored" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "non-versioned" #: lib\treewidget.py:327 msgid "added, missing" msgstr "added, missing" #: lib\treewidget.py:333 msgid "missing" msgstr "missing" #: lib\treewidget.py:340 msgid "moved" msgstr "moved" #: lib\treewidget.py:346 msgid "x-bit" msgstr "x-bit" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "File Name" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "Unchanged" #: lib\treewidget.py:1303 msgid "Changed" msgstr "Changed" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "Unversioned" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "Ignored" #: lib\treewidget.py:1682 msgid "&Open" msgstr "&Open" #: lib\treewidget.py:1685 msgid "&View file" msgstr "&View file" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "Show &annotate" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "Show &log" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "Mark conflict &resolved" #: lib\treewidget.py:1714 msgid "&Add" msgstr "&Add" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "&Revert" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "Re&name" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "&Mark as moved and renamed" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "&Mark as moved" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "&Mark as renamed" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "Do you really want to revert the selected file(s)?" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "External Merge" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "Select / deselect all" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "Not a branch \"%s\"" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "No working tree exists for \"%s\"" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "&Location:" #: lib\ui_branch.py:101 msgid "&From:" msgstr "&From:" #: lib\ui_branch.py:103 msgid "&To:" msgstr "&To:" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "Bind new branch to parent location" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "&Revision:" #: lib\ui_info.py:87 msgid "..." msgstr "..." #: lib\ui_info.py:89 msgid "&Basic" msgstr "&Basic" #: lib\ui_info.py:91 msgid "&Detailed" msgstr "&Detailed" #: lib\ui_init.py:119 msgid "Local Directory" msgstr "Local Directory" #: lib\ui_init.py:121 msgid "Repository" msgstr "Repository" #: lib\ui_init.py:122 msgid "Create a new standalone tree" msgstr "Create a new standalone tree" #: lib\ui_init.py:123 msgid "Ensure all revisions are appended to the log" msgstr "Ensure all revisions are appended to the log" #: lib\ui_init.py:124 msgid "Create a new shared repository" msgstr "Create a new shared repository" #: lib\ui_init.py:125 msgid "Skip the creation of working trees in this repository" msgstr "Skip the creation of working trees in this repository" #: lib\ui_init.py:131 msgid "Repository Format:" msgstr "Repository Format:" #: lib\ui_init.py:132 msgid "Description of format" msgstr "Description of format" #: lib\ui_merge.py:62 msgid "Merge" msgstr "Merge" #: lib\ui_merge.py:67 lib\ui_pull.py:65 lib\ui_push.py:66 msgid "Remember this location as a default" msgstr "Remember this location as a default" #: lib\ui_merge.py:68 msgid "Merge even if the working tree has uncommitted changes" msgstr "Merge even if the working tree has uncommitted changes" #: lib\ui_merge.py:69 msgid "Merge uncommitted changes instead of committed ones" msgstr "Merge uncommitted changes instead of committed ones" #: lib\ui_merge_config.py:58 msgid "Form" msgstr "Form" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "External Merge Tools" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "Sets the selected merge tool as the default to use in qconflicts." #: lib\ui_merge_config.py:63 msgid "Set Default" msgstr "Set Default" #: lib\ui_new_tree.py:129 msgid "Create a new Bazaar Working Tree" msgstr "Create a new Bazaar Working Tree" #: lib\ui_new_tree.py:131 msgid "" "Branch source (enter a URL or select a local directory with an existing " "branch)" msgstr "" "Branch source (enter a URL or select a local directory with an existing " "branch)" #: lib\ui_new_tree.py:133 msgid "Local directory where the working tree will be created" msgstr "Local directory where the working tree will be created" #: lib\ui_new_tree.py:135 msgid "Working Tree Options" msgstr "Working Tree Options" #: lib\ui_new_tree.py:136 msgid "Create a checkout" msgstr "Create a checkout" #: lib\ui_new_tree.py:144 msgid "Light-weight checkout" msgstr "Light-weight checkout" #: lib\ui_new_tree.py:145 msgid "Make a local copy of the branch" msgstr "Make a local copy of the branch" #: lib\ui_new_tree.py:151 msgid "Create a stacked branch referring to the source branch" msgstr "Create a stacked branch referring to the source branch" #: lib\ui_new_tree.py:152 msgid "Click a link for more information about checkouts and branches." msgstr "Click a link for more information about checkouts and branches." #: lib\ui_new_tree.py:159 msgid "Most recent (tip) revision" msgstr "Most recent (tip) revision" #: lib\ui_new_tree.py:161 msgid "Show Log..." msgstr "Show Log..." #: lib\ui_pull.py:60 msgid "Pull" msgstr "Pull" #: 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 "Overwrite differences between branches" #: lib\ui_push.py:62 msgid "Push" msgstr "Push" #: lib\ui_push.py:68 msgid "Use existing directory" msgstr "Use existing directory" #: lib\ui_push.py:69 msgid "Create the path up to the branch if it does not exist" msgstr "Create the path up to the branch if it does not exist" #: lib\ui_run.py:107 msgid "Run bzr command" msgstr "Run bzr command" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "&Working directory:" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "C&ategory:" #: lib\ui_run.py:112 msgid "&Command:" msgstr "&Command:" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "&Show hidden commands" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "&Options and arguments for command:" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "Insert &directory..." #: lib\ui_run.py:116 msgid "Insert &filenames..." msgstr "Insert &filenames..." #: lib\ui_sysinfo.py:113 msgid "Bazaar Library" msgstr "Bazaar Library" #: lib\ui_sysinfo.py:114 lib\ui_sysinfo.py:124 msgid "Version:" msgstr "Version:" #: lib\ui_sysinfo.py:115 msgid "(bzr-version)" msgstr "(bzr-version)" #: lib\ui_sysinfo.py:116 lib\ui_sysinfo.py:126 msgid "Path:" msgstr "Path:" #: lib\ui_sysinfo.py:117 msgid "(bzr-lib-path)" msgstr "(bzr-lib-path)" #: lib\ui_sysinfo.py:118 msgid "Bazaar Configuration" msgstr "Bazaar Configuration" #: lib\ui_sysinfo.py:119 msgid "Settings:" msgstr "Settings:" #: lib\ui_sysinfo.py:120 msgid "(bzr-config-dir)" msgstr "(bzr-config-dir)" #: lib\ui_sysinfo.py:121 msgid "Log File:" msgstr "Log File:" #: lib\ui_sysinfo.py:122 msgid "(bzr-log-file)" msgstr "(bzr-log-file)" #: lib\ui_sysinfo.py:123 msgid "Python Interpreter" msgstr "Python Interpreter" #: lib\ui_sysinfo.py:125 msgid "(python-version)" msgstr "(python-version)" #: lib\ui_sysinfo.py:127 msgid "(python-file)" msgstr "(python-file)" #: lib\ui_sysinfo.py:128 msgid "Library:" msgstr "Library:" #: lib\ui_sysinfo.py:129 msgid "(python-lib-dir)" msgstr "(python-lib-dir)" #: lib\ui_tag.py:88 msgid "Edit tag" msgstr "Edit tag" #: lib\ui_tag.py:91 msgid "Tag" msgstr "Tag" #: lib\ui_tag.py:92 msgid "&Action:" msgstr "&Action:" #: lib\ui_tag.py:93 msgid "Create new tag" msgstr "Create new tag" #: lib\ui_tag.py:94 msgid "Move existing tag" msgstr "Move existing tag" #: lib\ui_tag.py:95 msgid "Delete existing tag" msgstr "Delete existing tag" #: lib\ui_tag.py:96 msgid "&Tag name:" msgstr "&Tag name:" #: lib\ui_tag.py:98 msgid "&Select..." msgstr "&Select..." #: lib\ui_update_branch.py:82 msgid "Update Branch" msgstr "Update Branch" #: lib\ui_update_branch.py:83 msgid "" "This directory is a branch. Please select what you would like to update" msgstr "" "This directory is a branch. Please select what you would like to update" #: lib\ui_update_branch.py:84 lib\ui_update_checkout.py:76 msgid "Update source" msgstr "Update source" #: lib\ui_update_branch.py:86 msgid "Pull most recent changes from:" msgstr "Pull most recent changes from:" #: lib\ui_update_branch.py:87 msgid "Remember this as the new parent branch" msgstr "Remember this as the new parent branch" #: 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 "Update working tree to the latest changes in the branch" #: lib\ui_update_checkout.py:74 msgid "Update Checkout" msgstr "Update Checkout" #: lib\ui_update_checkout.py:75 #, python-format msgid "This directory is a checkout of: %s" msgstr "This directory is a checkout of: %s" #: lib\ui_update_checkout.py:77 msgid "Update the working tree from the bound branch" msgstr "Update the working tree from the bound branch" #: lib\ui_update_checkout.py:78 msgid "Pull a different branch" msgstr "Pull a different branch" #: lib\unbind.py:36 msgid "Unbind branch" msgstr "Unbind branch" #: lib\unbind.py:47 msgid "Unbind" msgstr "Unbind" #: lib\unbind.py:55 msgid "Bound to:" msgstr "Bound to:" #: lib\uncommit.py:40 msgid "Uncommit" msgstr "Uncommit" #: lib\uncommit.py:57 msgid "Move tip to" msgstr "Move tip to" #: lib\uncommit.py:59 msgid "Parent of current tip revision" msgstr "Parent of current tip revision" #: lib\uncommit.py:61 msgid "Other revision:" msgstr "Other revision:" #: lib\uncommit.py:104 msgid "No other revision specified." msgstr "No other revision specified." #: lib\uncommit.py:122 msgid "Do you really want to uncommit these revisions?" msgstr "Do you really want to uncommit these revisions?" #: lib\update.py:33 msgid "Update working tree" msgstr "Update working tree" #: lib\update.py:34 #, python-format msgid "Update tree %s" msgstr "Update tree %s" #: lib\util.py:70 msgid "&Cancel" msgstr "&Cancel" #: lib\util.py:425 msgid "Warning" msgstr "Warning" #: lib\util.py:436 msgid "Confirm" msgstr "Confirm" #: lib\util.py:583 msgid "Select Source Directory" msgstr "Select Source Directory" #: lib\util.py:585 msgid "Select Target Directory" msgstr "Select Target Directory" #: lib\util.py:726 msgid "deleted files" msgstr "deleted files" #: lib\util.py:728 msgid "added files" msgstr "added files" #: lib\util.py:730 msgid "renamed files" msgstr "renamed files" #: lib\util.py:732 msgid "modified files" msgstr "modified files" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "(no message)" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "Verify Signatures" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "All commits signed with verifiable keys" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "delete file" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "rename" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "add file" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "modify text" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "modify target" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "modify binary" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "Enter the shelve message" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "Hunks" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "Complete" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "Previous hunk" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "Next hunk" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "Use editor" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "Destroy" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "Select all" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "Unselect all" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "&Layout" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "Change editor is not defined." #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "Delete changes of %d file without shelving" msgstr[1] "Delete changes of %d files without shelving" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "Shelve changes of %d file" msgstr[1] "Shelve changes of %d files" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "No changes selected." #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "Operation aborted because working tree has pending merges." #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "Operation aborted because target files has been changed." #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "Edited by change editor.\n" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "Id" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "Ignore whitespace" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "Unshelve" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "Dry run" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "Keep" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "Delete" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "Show filelist" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "Apply changes in shelf[%(id)d], and remove from the shelf" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "Apply changes in shelf[%(id)d], but keep it shelved" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "Remove shelf[%(id)d] without applying" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "Find: " #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "Previous" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "Next" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "Case sensitive" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "Whole words" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "Close find" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "Layout" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "Layout %d" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-en_GB.po0000644000000000000000000015016114556556456013552 0ustar00# English (United Kingdom) translation for qbzr # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the qbzr package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-12 16:38+0300\n" "PO-Revision-Date: 2012-06-09 17:58+0000\n" "Last-Translator: Alfredo Hernández \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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Add" #: lib\add.py:57 msgid "Unversioned Files" msgstr "Unversioned Files" #: lib\add.py:106 msgid "Show ignored files" msgstr "Show ignored files" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "Annotate" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "Loading..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "Encoding" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "Find" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "&View Options" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "View Options" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "Word Wrap" #: lib\annotate.py:383 msgid "Tab Width" msgstr "Tab Width" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "Revision %s" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "" #: lib\annotate.py:762 msgid "Go" msgstr "Go" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 msgid "&Annotate this revision" msgstr "&Annotate this revision" #: lib\bind.py:44 msgid "Bind branch" msgstr "Bind branch" #: lib\bind.py:54 msgid "Bind" msgstr "Bind" #: lib\bind.py:56 msgid "Branch location:" msgstr "Branch location:" #: lib\bind.py:60 msgid "Currently bound to:" msgstr "Currently bound to:" #: lib\bind.py:64 msgid "Bind to:" msgstr "Bind to:" #: lib\bind.py:68 lib\browse.py:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Browse" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "Select branch location" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "Master branch location not specified." #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Location:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "Revision:" #: lib\browse.py:84 msgid "Show" msgstr "Show" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "&Filter" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "View" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "Encoding:" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "Commit" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "Branch" #: lib\commit.py:259 msgid "&Local commit" msgstr "&Local commit" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" "Local commits are not pushed to the master branch until a normal commit is " "performed" #: lib\commit.py:265 msgid "Description:" msgstr "Description:" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "Working tree is out of date. To commit, update the working tree." #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "Update" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "Message" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "Show non-versioned files" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "Enter the commit message" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "&Fixed bugs:" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "Set the IDs of bugs fixed by this commit" #: lib\commit.py:364 msgid "" "Enter the list of bug IDs in format tag:id separated by a space, e.g. " "project:123 project:765" msgstr "" "Enter the list of bug IDs in format tag:id separated by a space, e.g. " "project:123 project:765" #: lib\commit.py:374 msgid "&Author:" msgstr "&Author:" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "Set the author of this change, if it's different from the committer" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" #: lib\commit.py:393 msgid "Changes" msgstr "Changes" #: lib\commit.py:410 msgid "Pending Merges" msgstr "Pending Merges" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "Status" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "View changes in files selected to commit" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "You should provide a commit message." #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" "No changes selected to commit.\n" "Do you want to commit anyway?" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." #: lib\commit.py:745 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 "" "A local commit to the branch will be performed. The master branch will not " "be updated until a non-local commit is made." #: lib\commit.py:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "Diff" #: lib\config.py:49 msgid "Default" msgstr "Default" #: lib\config.py:50 msgid "Thunderbird" msgstr "Thunderbird" #: lib\config.py:51 msgid "Evolution" msgstr "Evolution" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "Mutt" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "XDG e-mail client" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "MAPI e-mail client" #: lib\config.py:56 msgid "Editor" msgstr "Editor" #: lib\config.py:79 msgid "Configuration" msgstr "Configuration" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "&Name:" #: lib\config.py:95 msgid "E-&mail:" msgstr "E-&mail:" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "&Browse..." #: lib\config.py:108 msgid "&Editor:" msgstr "&Editor:" #: lib\config.py:116 msgid "E-mail &client:" msgstr "E-mail &client:" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" #: lib\config.py:125 msgid "Tab &Width:" msgstr "Tab &Width:" #: lib\config.py:137 msgid "Alias" msgstr "Alias" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "Command" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "Remove" #: lib\config.py:158 msgid "Abbreviation" msgstr "Abbreviation" #: lib\config.py:158 msgid "URL" msgstr "URL" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "Show inter-group inserts and deletes in green and red" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "External Diff Applications:" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "Name" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "General" #: lib\config.py:242 msgid "Aliases" msgstr "Aliases" #: lib\config.py:243 msgid "Bug Trackers" msgstr "Bug Trackers" #: lib\config.py:244 msgid "&User Interface" msgstr "&User Interface" #: lib\config.py:245 msgid "&Diff" msgstr "&Diff" #: lib\config.py:246 msgid "&Merge" msgstr "&Merge" #: lib\config.py:271 msgid "Spell check &language:" msgstr "Spell check &language:" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" "This directory will be automatically filled in your branch source input field" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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 "Browse..." #: lib\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" "This directory will be automatically filled in your checkout destination " "input field" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" "Base directory\n" "for &checkouts:" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "Builtin Diff" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "Import old external merge tool" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "old_cmdline" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "&Ignore and proceed" #: lib\config.py:609 msgid "&Change the values" msgstr "&Change the values" #: lib\config.py:719 msgid "Select editor executable" msgstr "Select editor executable" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "Select base directory for checkouts" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "Select default directory for branch sources" #: lib\config.py:974 msgid "Command Line" msgstr "Command Line" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "Conflicts" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "File" #: lib\conflicts.py:62 msgid "Conflict" msgstr "Conflict" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "&Launch..." #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "M&erge tool:" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "Auto-resolve" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "&Merge conflict" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "Take \"&THIS\" version" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "Take \"&OTHER\" version" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "Mark as &resolved" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "%d conflict auto-resolved." msgstr[1] "%d conflicts auto-resolved." #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "&OK" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "All conflicts resolved." #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "Error while running merge tool (code %d)" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "Error" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "Set up external_merge application in qconfig under the Merge tab" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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 "" "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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "Missing the flag: %s. Configure in qconfig under the merge tab." #: lib\conflicts.py:310 msgid "path conflict" msgstr "path conflict" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "contents conflict" #: lib\conflicts.py:312 msgid "text conflict" msgstr "text conflict" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "duplicate id" #: lib\conflicts.py:314 msgid "duplicate" msgstr "duplicate" #: lib\conflicts.py:315 msgid "parent loop" msgstr "parent loop" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "unversioned parent" #: lib\conflicts.py:317 msgid "missing parent" msgstr "missing parent" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "deleting parent" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "non-directory parent" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "Show &differences" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "removed" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "added" #: lib\diff.py:266 msgid "renamed and modified" msgstr "renamed and modified" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "renamed" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "modified" #: lib\diffview.py:461 msgid "Last modified:" msgstr "Last modified:" #: lib\diffview.py:462 msgid "Status:" msgstr "Status:" #: lib\diffview.py:463 msgid "Kind:" msgstr "Kind:" #: lib\diffview.py:464 msgid "Properties:" msgstr "Properties:" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "[binary file (%d bytes)]" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "\\ No newline at end of file" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "Working Tree for %s" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "Working Tree" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "Rev %(rev)s for %(branch)s" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "Rev %s" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "Revid: %(revid)s for %(branch)s" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "Revid: %s" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "Merge Preview" #: lib\diffwindow.py:218 msgid "&Find" msgstr "&Find" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "Find on active panel" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "Unidiff" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "&Refresh" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "&External Diff" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "Launch an external diff application" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "&Complete" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "Tab width" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "&Ignore whitespace changes" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "%d file" msgstr[1] "%d files" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" "File %s is not versioned.\n" "Operation aborted." #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "&Close" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "No changes found." #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "Wrong encoding" #: lib\encoding_selector.py:77 #, python-format msgid "Encoding \"%s\" is invalid or not supported." msgstr "Encoding \"%s\" is invalid or not supported." #: lib\export.py:61 lib\export.py:80 msgid "Export" msgstr "Export" #: lib\export.py:75 lib\uncommit.py:51 #, python-format msgid "Branch: %s" msgstr "Branch: %s" #: lib\export.py:146 msgid "Archive type:" msgstr "Archive type:" #: lib\export.py:168 msgid "Root directory name:" msgstr "Root directory name:" #: lib\export.py:236 lib\ui_branch.py:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "Options" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" msgstr "" #: lib\help.py:59 #, python-format msgid "No help can be found for %s" msgstr "No help can be found for %s" #: lib\help.py:103 msgid "Help" msgstr "Help" #: lib\i18n.py:95 msgid "file" msgstr "file" #: lib\i18n.py:96 msgid "directory" msgstr "directory" #: lib\i18n.py:97 msgid "symlink" msgstr "symlink" #: lib\i18n.py:99 msgid "fixed" msgstr "fixed" #: lib\i18n.py:101 msgid "View text file" msgstr "View text file" #: lib\i18n.py:102 msgid "View image file" msgstr "View image file" #: lib\i18n.py:103 msgid "View binary file" msgstr "View binary file" #: lib\i18n.py:104 msgid "View symlink" msgstr "View symlink" #: lib\i18n.py:105 msgid "View directory" msgstr "View directory" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "No changes selected to commit" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "No changes selected to revert" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "Unknown Files" #: lib\ignore.py:58 msgid "Extension" msgstr "Extension" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "Ignore all files with this extension" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "No action selected" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "Info" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "Initialise" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "Log" #: lib\log.py:142 msgid "&Search:" msgstr "&Search:" #: lib\log.py:158 msgid "Messages" msgstr "Messages" #: lib\log.py:160 msgid "Authors" msgstr "Authors" #: lib\log.py:162 msgid "Revision IDs" msgstr "Revision IDs" #: lib\log.py:164 msgid "Revision Numbers" msgstr "Revision Numbers" #: lib\log.py:166 msgid "Tags" msgstr "Tags" #: lib\log.py:168 msgid "Bugs" msgstr "Bugs" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" "It is not possible to specify different file paths and different branches at " "the same time." #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "Messages and File text (indexed)" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "Show &differences..." #: lib\log.py:575 msgid "View file" msgstr "View file" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "Save file on this revision as..." #: lib\log.py:583 msgid "Revert to this revision" msgstr "Revert to this revision" #: lib\log.py:862 msgid "Not a file" msgstr "Not a file" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" "Operation is supported for a single file only,\n" "not for a %s." #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "Save file in this revision as..." #: lib\log.py:878 msgid "Revert File" msgstr "Revert File" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "Rev" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "Date" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Author" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "bug #%s" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "Show file &differences" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "Show all &differences" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "Show file &differences..." #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "Show all &differences..." #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "Show &tree..." #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "Tag &revision..." #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "R&evert to this revision" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "&Update to this revision" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "Revert %s to revision %s revid:%s." #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "Revert" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "Update to revision %s revid:%s." #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "Update %s to revision %s revid:%s." #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" msgstr "" #: lib\main.py:120 msgid "Computer" msgstr "Computer" #: lib\main.py:149 msgid "&Edit Bookmark..." msgstr "&Edit Bookmark..." #: lib\main.py:150 msgid "&Remove Bookmark..." msgstr "&Remove Bookmark..." #: lib\main.py:165 msgid "Bookmarks" msgstr "Bookmarks" #: lib\main.py:276 msgid "Refresh the directory tree" msgstr "Refresh the directory tree" #: lib\main.py:280 msgid "&Commit" msgstr "&Commit" #: lib\main.py:281 msgid "Commit changes into a new revision" msgstr "Commit changes into a new revision" #: lib\main.py:285 msgid "&Push" msgstr "&Push" #: lib\main.py:286 msgid "Turn this branch into a mirror of another branch" msgstr "Turn this branch into a mirror of another branch" #: lib\main.py:290 msgid "Pu&ll" msgstr "Pu&ll" #: lib\main.py:291 msgid "Update a mirror of this branch" msgstr "Update a mirror of this branch" #: lib\main.py:294 msgid "&Add Bookmark..." msgstr "&Add Bookmark..." #: lib\main.py:301 msgid "&File" msgstr "&File" #: lib\main.py:302 msgid "&Configure..." msgstr "&Configure..." #: lib\main.py:304 msgid "&Quit" msgstr "&Quit" #: lib\main.py:305 msgid "&View" msgstr "&View" #: lib\main.py:307 msgid "&Branch" msgstr "&Branch" #: lib\main.py:311 msgid "&Bookmarks" msgstr "&Bookmarks" #: lib\main.py:313 lib\util.py:72 msgid "&Help" msgstr "&Help" #: lib\main.py:314 msgid "&Help..." msgstr "&Help..." #: lib\main.py:316 msgid "&About..." msgstr "&About..." #: lib\main.py:354 msgid "Size" msgstr "Size" #: lib\main.py:406 msgid "About QBzr" msgstr "About QBzr" #: 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 "" "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" #: lib\main.py:472 msgid "Add Bookmark" msgstr "Add Bookmark" #: lib\main.py:483 msgid "Edit Bookmark" msgstr "Edit Bookmark" #: lib\main.py:493 msgid "Remove Bookmark" msgstr "Remove Bookmark" #: lib\main.py:494 msgid "Do you really want to remove the selected bookmark?" msgstr "Do you really want to remove the selected bookmark?" #: lib\plugins.py:44 msgid "Plugins" msgstr "Plug-ins" #: lib\plugins.py:57 msgid "Version" msgstr "Version" #: lib\plugins.py:58 lib\subprocess.py:480 msgid "Description" msgstr "Description" #: lib\plugins.py:62 msgid "Directory" msgstr "Directory" #: lib\plugins.py:64 #, python-format msgid "Plugins installed: %(rows)d" msgstr "Plug-ins installed: %(rows)d" #: lib\plugins.py:71 msgid "Summary" msgstr "Summary" #: lib\plugins.py:72 lib\ui_branch.py:100 msgid "Locations" msgstr "Locations" #: lib\plugins.py:111 msgid "(no description)" msgstr "(no description)" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "Working tree has uncommitted changes." #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "Working tree is out of date, please run 'bzr update'." #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "Do you want to continue anyway?" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "Select changes to revert" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "Do not save backups of reverted files" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "Forget pending merges" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "View changes in files selected to revert" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "Parents:" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "Children:" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "Signature:" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "Uncommited Working Tree Changes" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "Date:" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "Committer:" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "Author:" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "Branch:" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "Tags:" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "Bug:" msgstr[1] "Bugs:" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "Revision" #: lib\run.py:98 msgid "Select working directory" msgstr "Select working directory" #: lib\run.py:119 msgid "&Edit" msgstr "&Edit" #: lib\run.py:167 msgid "Help for command" msgstr "Help for command" #: lib\run.py:287 msgid "Select path to insert" msgstr "Select path to insert" #: lib\run.py:297 msgid "Select files to insert" msgstr "Select files to insert" #: lib\send.py:34 msgid "Send" msgstr "Send" #: lib\send.py:47 msgid "Merge Directive Options" msgstr "Merge Directive Options" #: lib\send.py:53 msgid "Submit Branch:" msgstr "Submit Branch:" #: lib\send.py:77 msgid "Public Branch:" msgstr "Public Branch:" #: lib\send.py:99 msgid "Remember these locations as defaults" msgstr "Remember these locations as defaults" #: lib\send.py:103 msgid "Include a bundle in the merge directive" msgstr "Include a bundle in the merge directive" #: lib\send.py:107 msgid "Include a preview patch in the merge directive" msgstr "Include a preview patch in the merge directive" #: lib\send.py:112 msgid "Action" msgstr "Action" #: lib\send.py:122 msgid "Address:" msgstr "Address:" #: lib\send.py:132 msgid "Message:" msgstr "Message:" #: lib\send.py:149 msgid "Filename:" msgstr "Filename:" #: lib\send.py:163 msgid "Revisions:" msgstr "Revisions:" #: lib\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "&Retry" #: lib\subprocess.py:518 msgid "Ready" msgstr "Ready" #: lib\subprocess.py:591 msgid "Starting..." msgstr "Starting..." #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "Could not locate \"bzr.exe\"." #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "Could not locate \"bzr\" script." #: lib\subprocess.py:694 msgid "Aborting..." msgstr "Aborting..." #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "Finished!" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "Enter Password" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "Enter Username" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "Failed!" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "Failed to start bzr." #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "Error while running bzr. (error code: %d)" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "Aborted!" #: lib\switch.py:46 msgid "Switch" msgstr "Switch" #: lib\switch.py:57 msgid "Switch checkout" msgstr "Switch checkout" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "Heavyweight checkout:" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "Lightweight checkout:" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "Checkout of branch:" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "Switch to branch:" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "Create Branch before switching" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "System Information" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "You should specify tag name" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "Tag \"%s\" does not exists" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" "Not a branch:\n" "%s" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "Close %s Window" #: lib\trace.py:248 msgid "Close Window" msgstr "Close Window" #: lib\trace.py:250 msgid "Close Application" msgstr "Close Application" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "Close Error Dialogue" #: lib\trace.py:265 msgid "Ignore Error" msgstr "Ignore Error" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "Report Bazaar Error" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "ignored" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "non-versioned" #: lib\treewidget.py:327 msgid "added, missing" msgstr "added, missing" #: lib\treewidget.py:333 msgid "missing" msgstr "missing" #: lib\treewidget.py:340 msgid "moved" msgstr "moved" #: lib\treewidget.py:346 msgid "x-bit" msgstr "x-bit" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "File Name" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "Unchanged" #: lib\treewidget.py:1303 msgid "Changed" msgstr "Changed" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "Unversioned" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "Ignored" #: lib\treewidget.py:1682 msgid "&Open" msgstr "&Open" #: lib\treewidget.py:1685 msgid "&View file" msgstr "&View file" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "Show &annotate" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "Show &log" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "Mark conflict &resolved" #: lib\treewidget.py:1714 msgid "&Add" msgstr "&Add" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "&Revert" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "Re&name" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "&Mark as moved and renamed" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "&Mark as moved" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "&Mark as renamed" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "Do you really want to revert the selected file(s)?" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "External Merge" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "Select / deselect all" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "Not a branch \"%s\"" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "No working tree exists for \"%s\"" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "&Location:" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "&To:" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "&Revision:" #: lib\ui_info.py:87 msgid "..." msgstr "..." #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" msgstr "" #: lib\ui_init.py:119 msgid "Local Directory" msgstr "Local Directory" #: lib\ui_init.py:121 msgid "Repository" msgstr "Repository" #: lib\ui_init.py:122 msgid "Create a new standalone tree" msgstr "Create a new standalone tree" #: lib\ui_init.py:123 msgid "Ensure all revisions are appended to the log" msgstr "Ensure all revisions are appended to the log" #: lib\ui_init.py:124 msgid "Create a new shared repository" msgstr "Create a new shared repository" #: lib\ui_init.py:125 msgid "Skip the creation of working trees in this repository" msgstr "Skip the creation of working trees in this repository" #: lib\ui_init.py:131 msgid "Repository Format:" msgstr "Repository Format:" #: lib\ui_init.py:132 msgid "Description of format" msgstr "Description of format" #: lib\ui_merge.py:62 msgid "Merge" msgstr "Merge" #: lib\ui_merge.py:67 lib\ui_pull.py:65 lib\ui_push.py:66 msgid "Remember this location as a default" msgstr "Remember this location as a default" #: lib\ui_merge.py:68 msgid "Merge even if the working tree has uncommitted changes" msgstr "Merge even if the working tree has uncommitted changes" #: lib\ui_merge.py:69 msgid "Merge uncommitted changes instead of committed ones" msgstr "Merge uncommitted changes instead of committed ones" #: lib\ui_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" msgstr "" #: lib\ui_new_tree.py:129 msgid "Create a new Bazaar Working Tree" msgstr "Create a new Bazaar Working Tree" #: lib\ui_new_tree.py:131 msgid "" "Branch source (enter a URL or select a local directory with an existing " "branch)" msgstr "" "Branch source (enter a URL or select a local directory with an existing " "branch)" #: lib\ui_new_tree.py:133 msgid "Local directory where the working tree will be created" msgstr "Local directory where the working tree will be created" #: lib\ui_new_tree.py:135 msgid "Working Tree Options" msgstr "Working Tree Options" #: lib\ui_new_tree.py:136 msgid "Create a checkout" msgstr "Create a checkout" #: lib\ui_new_tree.py:144 msgid "Light-weight checkout" msgstr "Lightweight checkout" #: lib\ui_new_tree.py:145 msgid "Make a local copy of the branch" msgstr "Make a local copy of the branch" #: lib\ui_new_tree.py:151 msgid "Create a stacked branch referring to the source branch" msgstr "Create a stacked branch referring to the source branch" #: lib\ui_new_tree.py:152 msgid "Click a link for more information about checkouts and branches." msgstr "Click a link for more information about checkouts and branches." #: lib\ui_new_tree.py:159 msgid "Most recent (tip) revision" msgstr "Most recent (tip) revision" #: lib\ui_new_tree.py:161 msgid "Show Log..." msgstr "Show Log..." #: lib\ui_pull.py:60 msgid "Pull" msgstr "Pull" #: 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 "Overwrite differences between branches" #: lib\ui_push.py:62 msgid "Push" msgstr "Push" #: lib\ui_push.py:68 msgid "Use existing directory" msgstr "Use existing directory" #: lib\ui_push.py:69 msgid "Create the path up to the branch if it does not exist" msgstr "Create the path up to the branch if it does not exist" #: lib\ui_run.py:107 msgid "Run bzr command" msgstr "Run bzr command" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "&Working directory:" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "C&ategory:" #: lib\ui_run.py:112 msgid "&Command:" msgstr "&Command:" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "&Show hidden commands" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "&Options and arguments for command:" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "Insert &directory..." #: lib\ui_run.py:116 msgid "Insert &filenames..." msgstr "Insert &filenames..." #: lib\ui_sysinfo.py:113 msgid "Bazaar Library" msgstr "Bazaar Library" #: lib\ui_sysinfo.py:114 lib\ui_sysinfo.py:124 msgid "Version:" msgstr "Version:" #: lib\ui_sysinfo.py:115 msgid "(bzr-version)" msgstr "(bzr-version)" #: lib\ui_sysinfo.py:116 lib\ui_sysinfo.py:126 msgid "Path:" msgstr "Path:" #: lib\ui_sysinfo.py:117 msgid "(bzr-lib-path)" msgstr "(bzr-lib-path)" #: lib\ui_sysinfo.py:118 msgid "Bazaar Configuration" msgstr "Bazaar Configuration" #: lib\ui_sysinfo.py:119 msgid "Settings:" msgstr "Settings:" #: lib\ui_sysinfo.py:120 msgid "(bzr-config-dir)" msgstr "(bzr-config-dir)" #: lib\ui_sysinfo.py:121 msgid "Log File:" msgstr "Log File:" #: lib\ui_sysinfo.py:122 msgid "(bzr-log-file)" msgstr "(bzr-log-file)" #: lib\ui_sysinfo.py:123 msgid "Python Interpreter" msgstr "Python Interpreter" #: lib\ui_sysinfo.py:125 msgid "(python-version)" msgstr "(python-version)" #: lib\ui_sysinfo.py:127 msgid "(python-file)" msgstr "(python-file)" #: lib\ui_sysinfo.py:128 msgid "Library:" msgstr "Library:" #: lib\ui_sysinfo.py:129 msgid "(python-lib-dir)" msgstr "(python-lib-dir)" #: lib\ui_tag.py:88 msgid "Edit tag" msgstr "Edit tag" #: lib\ui_tag.py:91 msgid "Tag" msgstr "Tag" #: lib\ui_tag.py:92 msgid "&Action:" msgstr "&Action:" #: lib\ui_tag.py:93 msgid "Create new tag" msgstr "Create new tag" #: lib\ui_tag.py:94 msgid "Move existing tag" msgstr "Move existing tag" #: lib\ui_tag.py:95 msgid "Delete existing tag" msgstr "Delete existing tag" #: lib\ui_tag.py:96 msgid "&Tag name:" msgstr "&Tag name:" #: lib\ui_tag.py:98 msgid "&Select..." msgstr "&Select..." #: lib\ui_update_branch.py:82 msgid "Update Branch" msgstr "Update Branch" #: lib\ui_update_branch.py:83 msgid "" "This directory is a branch. Please select what you would like to update" msgstr "" "This directory is a branch. Please select what you would like to update" #: lib\ui_update_branch.py:84 lib\ui_update_checkout.py:76 msgid "Update source" msgstr "Update source" #: lib\ui_update_branch.py:86 msgid "Pull most recent changes from:" msgstr "Pull most recent changes from:" #: lib\ui_update_branch.py:87 msgid "Remember this as the new parent branch" msgstr "Remember this as the new parent branch" #: 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 "Update working tree to the latest changes in the branch" #: lib\ui_update_checkout.py:74 msgid "Update Checkout" msgstr "Update Checkout" #: lib\ui_update_checkout.py:75 #, python-format msgid "This directory is a checkout of: %s" msgstr "This directory is a checkout of: %s" #: lib\ui_update_checkout.py:77 msgid "Update the working tree from the bound branch" msgstr "Update the working tree from the bound branch" #: lib\ui_update_checkout.py:78 msgid "Pull a different branch" msgstr "Pull a different branch" #: lib\unbind.py:36 msgid "Unbind branch" msgstr "Unbind branch" #: lib\unbind.py:47 msgid "Unbind" msgstr "Unbind" #: lib\unbind.py:55 msgid "Bound to:" msgstr "Bound to:" #: lib\uncommit.py:40 msgid "Uncommit" msgstr "Uncommit" #: lib\uncommit.py:57 msgid "Move tip to" msgstr "Move tip to" #: lib\uncommit.py:59 msgid "Parent of current tip revision" msgstr "Parent of current tip revision" #: lib\uncommit.py:61 msgid "Other revision:" msgstr "Other revision:" #: lib\uncommit.py:104 msgid "No other revision specified." msgstr "No other revision specified." #: lib\uncommit.py:122 msgid "Do you really want to uncommit these revisions?" msgstr "Do you really want to uncommit these revisions?" #: lib\update.py:33 msgid "Update working tree" msgstr "Update working tree" #: lib\update.py:34 #, python-format msgid "Update tree %s" msgstr "Update tree %s" #: lib\util.py:70 msgid "&Cancel" msgstr "&Cancel" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "Select Source Directory" #: lib\util.py:585 msgid "Select Target Directory" msgstr "Select Target Directory" #: lib\util.py:726 msgid "deleted files" msgstr "deleted files" #: lib\util.py:728 msgid "added files" msgstr "added files" #: lib\util.py:730 msgid "renamed files" msgstr "renamed files" #: lib\util.py:732 msgid "modified files" msgstr "modified files" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "(no message)" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "Complete" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "Close find" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "Layout" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "Layout %d" #~ msgid "You should provide commit message." #~ msgstr "You should provide commit message." #~ msgid "No changes to commit." #~ msgstr "No changes to commit." #~ msgid "Definition" #~ msgstr "Definition" #~ msgid "External Merge Apps:" #~ msgstr "External Merge Applications:" #~ msgid "Use Configured Default" #~ msgstr "Use Configured Default" #~ 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 "" #~ "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." #, python-format #~ msgid "%s (Configured external merge definition in qconfig)" #~ msgstr "%s (Configured external merge definition in qconfig)" #~ msgid "[binary file]" #~ msgstr "[binary file]" #~ msgid "Side by side" #~ msgstr "Side by side" #~ msgid "Left side encoding:" #~ msgstr "Left side encoding:" #~ msgid "Right side encoding:" #~ msgstr "Right side encoding:" #~ msgid "Using" #~ msgstr "Using" #~ msgid "You must specify a location" #~ msgstr "You must specify a location" #~ msgid "Location has no branch" #~ msgstr "Location has no branch" #~ msgid "Location has no working tree" #~ msgstr "Location has no working tree" #~ msgid "" #~ "You are reverting all changed paths without also reverting pending merges. " #~ "Do you want to continue?" #~ msgstr "" #~ "You are reverting all changed paths without also reverting pending merges. " #~ "Do you want to continue?" #~ msgid "&No" #~ msgstr "&No" #~ msgid "&Yes" #~ msgstr "&Yes" #~ msgid "&Move" #~ msgstr "&Move" #~ msgid "Cre&ate" #~ msgstr "Cre&ate" #~ msgid "" #~ "Some of the files selected cannot be recoverd if removed. Are you sure you " #~ "want to remove these files?" #~ msgstr "" #~ "Some of the files selected cannot be recovered if removed. Are you sure you " #~ "want to remove these files?" #~ msgid "Submit branch:" #~ msgstr "Submit branch:" #~ msgid "Push branch:" #~ msgstr "Push branch:" #~ msgid "Parent branch:" #~ msgstr "Parent branch:" #~ msgid "Branch format:" #~ msgstr "Branch format:" #~ msgid "Working tree format:" #~ msgstr "Working tree format:" #~ msgid "&Related Branches" #~ msgstr "&Related Branches" #~ msgid "&Format" #~ msgstr "&Format" #~ msgid "Control directory format:" #~ msgstr "Control directory format:" #~ msgid "Repository format:" #~ msgstr "Repository format:" #~ msgid "Public branch:" #~ msgstr "Public branch:" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-es.po0000644000000000000000000015274614556556456013222 0ustar00# Spanish translation for qbzr # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the qbzr package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-12 16:38+0300\n" "PO-Revision-Date: 2012-08-26 03:52+0000\n" "Last-Translator: Adolfo Jayme Barrientos \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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Añadir" #: lib\add.py:57 msgid "Unversioned Files" msgstr "Archivos no versionados" #: lib\add.py:106 msgid "Show ignored files" msgstr "Mostrar archivos ignorados" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "Nada seleccionado para añadir" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "Anotar" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "Cargando…" #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "Codificación" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "Buscar" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "Ir a la línea" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "&Ver opciones" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "Ver opciones" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "Ajuste de línea" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "Revisión %s" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "Ir a la línea: " #: lib\annotate.py:762 msgid "Go" msgstr "Ir" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 msgid "&Annotate this revision" msgstr "&Anotar esta revisión" #: lib\bind.py:44 msgid "Bind branch" msgstr "Enlazar rama" #: lib\bind.py:54 msgid "Bind" msgstr "Enlazar" #: lib\bind.py:56 msgid "Branch location:" msgstr "Ubicación de la rama:" #: lib\bind.py:60 msgid "Currently bound to:" msgstr "Actualmente enlazada a:" #: lib\bind.py:64 msgid "Bind to:" msgstr "Enlazar a:" #: lib\bind.py:68 lib\browse.py:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Examinar" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "Seleccionar ubicación de la rama" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "Localización de rama maestra no especificada." #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Ubicación:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "Revisión:" #: lib\browse.py:84 msgid "Show" msgstr "Mostrar" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "&Filtro" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "Ver" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "Codificación:" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "Enviar" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "Rama" #: lib\commit.py:259 msgid "&Local commit" msgstr "Envío &local" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" "Los envíos locales no pueden actualizar la rama principal hasta que se " "genere un envío normal" #: lib\commit.py:265 msgid "Description:" msgstr "Descripción:" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "Actualizar" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "Mensaje" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "Mostrar archivos no versionados" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "Introduzca el mensaje de envío" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "Errores &arreglados" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "Establezca el ID del error arreglado para este envío" #: lib\commit.py:364 msgid "" "Enter the list of bug IDs in format tag:id separated by a space, e.g. " "project:123 project:765" msgstr "" "Introduzca la lista de IDs de los errores en formato etiqueta:id " "separado por un espacio, ejemplo proyecto:123 proyecto:765" #: lib\commit.py:374 msgid "&Author:" msgstr "&Autor:" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "Establezca el autor del cambio, si es diferente del que lo envía" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" "Introduzca el nombre del autor, ejemplo John Doe " "<:jdoe@ejemplo.com>" #: lib\commit.py:393 msgid "Changes" msgstr "Cambios" #: lib\commit.py:410 msgid "Pending Merges" msgstr "Fusiones pendientes" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "Estado" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "Ver cambios en archivos seleccionados para ejecutar" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" "No hay cambios seleccionados para confirmar.\n" "¿Desea confirmar de todas formas?" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" "Una confirmación se hará directamente a la rama principal, manteniendo las " "ramas local y principal sincronizadas." #: lib\commit.py:745 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 "" "Un envío local será realizado. La rama maestra no será actualizada hasta que " "un envío no-local sea generado." #: lib\commit.py:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "Diff" #: lib\config.py:49 msgid "Default" msgstr "Predeterminado" #: lib\config.py:50 msgid "Thunderbird" msgstr "Thunderbird" #: lib\config.py:51 msgid "Evolution" msgstr "Evolution" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "Mutt" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "Cliente de correo-e XDG" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "Cliente de correo-e MAPI" #: lib\config.py:56 msgid "Editor" msgstr "Editor" #: lib\config.py:79 msgid "Configuration" msgstr "Configuración" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "&Nombre:" #: lib\config.py:95 msgid "E-&mail:" msgstr "&Correo electrónico" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "&Examinar..." #: lib\config.py:108 msgid "&Editor:" msgstr "&Editor:" #: lib\config.py:116 msgid "E-mail &client:" msgstr "&Cliente de correo electrónico:" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "Sobrenombre" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "Comando" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "Eliminar" #: lib\config.py:158 msgid "Abbreviation" msgstr "Abreviatura" #: lib\config.py:158 msgid "URL" msgstr "URL" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" "Mostrar inserciones y elementos eliminados entre-grupos en verde y rojo" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "Aplicaciones externas de gestión de diferencias" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "Nombre" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "Se necesita Bazaar 2.4 o superior para configurar mergetools." #: lib\config.py:241 msgid "General" msgstr "General" #: lib\config.py:242 msgid "Aliases" msgstr "Sobrenombres" #: lib\config.py:243 msgid "Bug Trackers" msgstr "Seguidores de errores" #: lib\config.py:244 msgid "&User Interface" msgstr "Interfaz de &usuario" #: lib\config.py:245 msgid "&Diff" msgstr "&Diff" #: lib\config.py:246 msgid "&Merge" msgstr "&Combinar" #: lib\config.py:271 msgid "Spell check &language:" msgstr "Revisar ortográficamente" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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 "Explorar..." #: lib\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "Diferencia incorporada" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "&Ignorar y proceder" #: lib\config.py:609 msgid "&Change the values" msgstr "&Cambiar los valores" #: lib\config.py:719 msgid "Select editor executable" msgstr "Seleccionar editor" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "Línea de órdenes" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "Conflictos" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "Archivo" #: lib\conflicts.py:62 msgid "Conflict" msgstr "Conflicto" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "&Lanzar..." #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "Herramienta de m&ezclado:" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "Auto-resolver" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "Ra&ma en conflicto" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "Marcar como &resuelto" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "%d conflicto auto-resuelto." msgstr[1] "%d conflictos auto-resueltos." #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "&Aceptar" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "Todos los conflictos resueltos." #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "Error durante la ejecución de la herramienta de mezclado (code %d)" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "Error" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" "Asigne la aplicación de external_merge en qconfig bajo la pestaña de Mezcla" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "Herramienta de fusión externa %(tool)s no disponible" #: lib\conflicts.py:299 #, 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 "" "La definición extmerge: '%(tool)s' no es válida.\n" "Falta la bandera: %(flags)s. Esto debe ser corregido en qconfig en la ficha " "Combinar correspondencia." #: lib\conflicts.py:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" "No se encontró la bandera: %s. Configúrela en qconfig bajo la pestaña de " "mezcla." #: lib\conflicts.py:310 msgid "path conflict" msgstr "conflicto en la ruta" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "conflicto de contenidos" #: lib\conflicts.py:312 msgid "text conflict" msgstr "texto conflictivo" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "id duplicado" #: lib\conflicts.py:314 msgid "duplicate" msgstr "duplicado" #: lib\conflicts.py:315 msgid "parent loop" msgstr "ciclo padre" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "padre sin versionar" #: lib\conflicts.py:317 msgid "missing parent" msgstr "no se encuentra el padre" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "borrando padre" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "padre no-directorio" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "Mostrar &diferencias" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "eliminado" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "añadido" #: lib\diff.py:266 msgid "renamed and modified" msgstr "renombrado y modificado" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "renombrado" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "modificado" #: lib\diffview.py:461 msgid "Last modified:" msgstr "Última modificación:" #: lib\diffview.py:462 msgid "Status:" msgstr "Estado:" #: lib\diffview.py:463 msgid "Kind:" msgstr "Tipo:" #: lib\diffview.py:464 msgid "Properties:" msgstr "Propiedades:" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "[aarchivo binario (%d bytes)]" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "\\No hay nueva linea al final del archivo" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "Árbol de trabajo para %s" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "Árbol de trabajo" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "Revisión %(rev)s para %(branch)s" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "Rev %s" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "Revid: %(revid)s para %(branch)s" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "Revid: %s" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "Vista previa de la fusión" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "Estilo clásico" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "Actualiza&r" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "archivo %d" msgstr[1] "archivos %d" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "Archivo %s no se encuentra bajo control de versiones." #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "&Cerrar" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "No se han encontrado cambios." #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "Codificación equivocada" #: lib\encoding_selector.py:77 #, python-format msgid "Encoding \"%s\" is invalid or not supported." msgstr "La codificación «%s» es inválida o no soportada." #: lib\export.py:61 lib\export.py:80 msgid "Export" msgstr "Exportar" #: lib\export.py:75 lib\uncommit.py:51 #, python-format msgid "Branch: %s" msgstr "Rama: %s" #: lib\export.py:146 msgid "Archive type:" msgstr "Tipo de archivo:" #: lib\export.py:168 msgid "Root directory name:" msgstr "Nombre del directorio raíz" #: lib\export.py:236 lib\ui_branch.py:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "Opciones" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "Debe seleccionar la carpeta de destino" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" msgstr "" #: lib\help.py:59 #, python-format msgid "No help can be found for %s" msgstr "No se encuentra ayuda para %s" #: lib\help.py:103 msgid "Help" msgstr "Ayuda" #: lib\i18n.py:95 msgid "file" msgstr "archivo" #: lib\i18n.py:96 msgid "directory" msgstr "directorio" #: lib\i18n.py:97 msgid "symlink" msgstr "vínculo simbólico" #: lib\i18n.py:99 msgid "fixed" msgstr "corregido" #: lib\i18n.py:101 msgid "View text file" msgstr "Ver archivo de texto" #: lib\i18n.py:102 msgid "View image file" msgstr "Ver archivo de imagen" #: lib\i18n.py:103 msgid "View binary file" msgstr "Ver archivo binario" #: lib\i18n.py:104 msgid "View symlink" msgstr "Ver vínculo simbólico" #: lib\i18n.py:105 msgid "View directory" msgstr "Ver directorio" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "No se seleccionaron cambios a realizar" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "No se seleccionaron cambios a revertir" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "Ignorar" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "Archivos desconocidos" #: lib\ignore.py:58 msgid "Extension" msgstr "Extensión" #: lib\ignore.py:59 msgid "Ignore as" msgstr "Ignorar como" #: lib\ignore.py:67 msgid "No action" msgstr "Ninguna acción" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "Ignorar todos los archivos con esta extensión" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "No se ha seleccionado ninguna acción" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "Información" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "Inicializar" #: lib\init.py:74 msgid "You should specify a location" msgstr "Debe especificar una localización" #: lib\log.py:112 msgid "Log" msgstr "Minuta" #: lib\log.py:142 msgid "&Search:" msgstr "&Buscar:" #: lib\log.py:158 msgid "Messages" msgstr "Mensajes" #: lib\log.py:160 msgid "Authors" msgstr "Autores" #: lib\log.py:162 msgid "Revision IDs" msgstr "IDs de revision" #: lib\log.py:164 msgid "Revision Numbers" msgstr "Números de revisión" #: lib\log.py:166 msgid "Tags" msgstr "Etiquetas" #: lib\log.py:168 msgid "Bugs" msgstr "Errores" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "Mensajes y texto del Archivo (bajo índice)" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "Mostrar &diferencias..." #: lib\log.py:575 msgid "View file" msgstr "Ver archivo" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "Revertir a esta revisión" #: lib\log.py:862 msgid "Not a file" msgstr "No es un archivo" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "Revertir el archivo" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "Rev" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "Fecha" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Autor" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "error #%s" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "Mostrar &diferencias del archivo" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "Mostrar todas las &diferencias" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "Mostrar &diferencias del archivo..." #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "Mostrar todas las &diferencias..." #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "Mos&trar árbol..." #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "Etiqueta &revision..." #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "R&evertir a esta revisión" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "Act&ualizar a esta revisión" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "Revertir" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" msgstr "" #: lib\main.py:120 msgid "Computer" msgstr "Equipo" #: lib\main.py:149 msgid "&Edit Bookmark..." msgstr "&Editar Marcador..." #: lib\main.py:150 msgid "&Remove Bookmark..." msgstr "&Eliminar Marcador..." #: lib\main.py:165 msgid "Bookmarks" msgstr "Marcadores" #: lib\main.py:276 msgid "Refresh the directory tree" msgstr "Actualiza las ramas" #: lib\main.py:280 msgid "&Commit" msgstr "&Enviar" #: lib\main.py:281 msgid "Commit changes into a new revision" msgstr "Envíe cambios en una nueva revisión" #: lib\main.py:285 msgid "&Push" msgstr "&Empujar" #: lib\main.py:286 msgid "Turn this branch into a mirror of another branch" msgstr "Volver esta rama en un espejo de otra rama" #: lib\main.py:290 msgid "Pu&ll" msgstr "&Empujar" #: lib\main.py:291 msgid "Update a mirror of this branch" msgstr "Actualizar un espejo de esta rama" #: lib\main.py:294 msgid "&Add Bookmark..." msgstr "&Añadir Marcador..." #: lib\main.py:301 msgid "&File" msgstr "&Fichero" #: lib\main.py:302 msgid "&Configure..." msgstr "&Configurar..." #: lib\main.py:304 msgid "&Quit" msgstr "&Salir" #: lib\main.py:305 msgid "&View" msgstr "&Ver" #: lib\main.py:307 msgid "&Branch" msgstr "&Rama" #: lib\main.py:311 msgid "&Bookmarks" msgstr "&Marcadores" #: lib\main.py:313 lib\util.py:72 msgid "&Help" msgstr "&Ayuda" #: lib\main.py:314 msgid "&Help..." msgstr "&Ayuda..." #: lib\main.py:316 msgid "&About..." msgstr "&Acerca de..." #: lib\main.py:354 msgid "Size" msgstr "Tamaño" #: lib\main.py:406 msgid "About QBzr" msgstr "Acerca de QBzr" #: 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 "" "QBzr — Interfaz gráfica de usuario para Bazaar
Versión " "%(qbzr_version)s (bzrlib %(bzrlib_version)s)

Marca Registrada " "© 2006-2008 Lukáš Lalinský y otros

http://bazaar-vcs.org/QBzr" #: lib\main.py:472 msgid "Add Bookmark" msgstr "Añadir Marcador" #: lib\main.py:483 msgid "Edit Bookmark" msgstr "Editar Marcador" #: lib\main.py:493 msgid "Remove Bookmark" msgstr "Eliminar Marcador" #: lib\main.py:494 msgid "Do you really want to remove the selected bookmark?" msgstr "¿Realmente desea eliminar el marcador seleccionado?" #: lib\plugins.py:44 msgid "Plugins" msgstr "Complementos" #: lib\plugins.py:57 msgid "Version" msgstr "Versión" #: lib\plugins.py:58 lib\subprocess.py:480 msgid "Description" msgstr "Descripción" #: lib\plugins.py:62 msgid "Directory" msgstr "Directorio" #: lib\plugins.py:64 #, python-format msgid "Plugins installed: %(rows)d" msgstr "Complemento instalado %(rows)d" #: lib\plugins.py:71 msgid "Summary" msgstr "Resumen" #: lib\plugins.py:72 lib\ui_branch.py:100 msgid "Locations" msgstr "Ubicaciones" #: lib\plugins.py:111 msgid "(no description)" msgstr "(sin descripción)" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "Árbol de trabajo tiene cambios sin enviar." #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "El árbol de trabajo está desactualizado, ejecute «bzr update»." #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "¿Desea continuar de todas formas?" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "Seleccione los cambios a revertir." #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "No almacenar respaldos de archivos recargados" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "Olvidar mezclas pendientes" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "Ver cambios en archivos seleccionados para revertir" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "No seleccionó nada para revertir." #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "Familiares:" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "Hijos:" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "Firma:" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "Cambios al Árbol de trabajo sin enviar" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "Fecha:" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "Remitente:" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "Autor:" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "Rama:" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "Etiquetas:" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "Error:" msgstr[1] "Errores:" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "Revisión" #: lib\run.py:98 msgid "Select working directory" msgstr "Seleccionar directorio de trabajo" #: lib\run.py:119 msgid "&Edit" msgstr "&Editar" #: lib\run.py:167 msgid "Help for command" msgstr "Ayuda para el comando" #: lib\run.py:287 msgid "Select path to insert" msgstr "Seleccione la ruta a insertar" #: lib\run.py:297 msgid "Select files to insert" msgstr "Seleccione los archivos a insertar" #: lib\send.py:34 msgid "Send" msgstr "Enviar" #: lib\send.py:47 msgid "Merge Directive Options" msgstr "Norma de Opciones de Mezclado" #: lib\send.py:53 msgid "Submit Branch:" msgstr "Enviar rama:" #: lib\send.py:77 msgid "Public Branch:" msgstr "Rama pública:" #: lib\send.py:99 msgid "Remember these locations as defaults" msgstr "Recordar esta posición como estándar" #: lib\send.py:103 msgid "Include a bundle in the merge directive" msgstr "Incluir un paquete en la norma de mezclado" #: lib\send.py:107 msgid "Include a preview patch in the merge directive" msgstr "Incluir un parche previo en la norma de mezclado" #: lib\send.py:112 msgid "Action" msgstr "Acción" #: lib\send.py:122 msgid "Address:" msgstr "Dirección:" #: lib\send.py:132 msgid "Message:" msgstr "Mensaje:" #: lib\send.py:149 msgid "Filename:" msgstr "Nombre de archivo:" #: lib\send.py:163 msgid "Revisions:" msgstr "Revisiones:" #: lib\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "El árbol de trabajo tiene conflictos." #: lib\subprocess.py:130 msgid "Resolve" msgstr "Resolver" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "Reintentar" #: lib\subprocess.py:217 msgid "&Retry" msgstr "&Reintentar" #: lib\subprocess.py:518 msgid "Ready" msgstr "Listo" #: lib\subprocess.py:591 msgid "Starting..." msgstr "Iniciando..." #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "No se puede localizar «bzr.exe»." #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "No se puede localizar el guión «bzr»." #: lib\subprocess.py:694 msgid "Aborting..." msgstr "Abortando..." #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "¡Terminado!" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "Introduzca contraseña" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "Introduzca el nombre de usuario" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "¡Fallido!" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "Fallo al iniciar bzr." #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "Error al ejecutar bzr. (código de error: %d)" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "¡Abortado!" #: lib\switch.py:46 msgid "Switch" msgstr "Cambiar" #: lib\switch.py:57 msgid "Switch checkout" msgstr "Cambiar pedido" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "Pedido pesado:" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "Pedido ligero:" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "Pedido de rama:" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "Cambiar a rama:" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "Crear rama antes de cambiar:" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "Información del sistema" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "Debe especificar un nombre de etiqueta" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" "Etiqueta '%s' existe actualmente.\n" "¿Desea mover la etiqueta existente?" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "Etiqueta \"%s\" no existe aún." #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "La etiqueta «%s» no existe" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" "No es una rama:\n" "%s" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "Cerrar la ventana" #: lib\trace.py:250 msgid "Close Application" msgstr "Cerrar la aplicación" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "Cerrar diálogo de error" #: lib\trace.py:265 msgid "Ignore Error" msgstr "Ignorar error" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "Informar de error en Bazaar" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "Mostrar detalles del error >>>" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "<<< Ocultar detalles del error" #: lib\treewidget.py:322 msgid "ignored" msgstr "ignorado" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "no versionado" #: lib\treewidget.py:327 msgid "added, missing" msgstr "agregados, faltantes" #: lib\treewidget.py:333 msgid "missing" msgstr "faltante" #: lib\treewidget.py:340 msgid "moved" msgstr "Movido" #: lib\treewidget.py:346 msgid "x-bit" msgstr "x-bit" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "Nombre de archivo" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "Sin cambios" #: lib\treewidget.py:1303 msgid "Changed" msgstr "Cambiado" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "Sin versionar" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "Ignorado" #: lib\treewidget.py:1682 msgid "&Open" msgstr "&Abrir" #: lib\treewidget.py:1685 msgid "&View file" msgstr "&Ver archivo" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "Mostrar &anotación" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "Mostrar minuta" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "Marcar conflicto como &resuelto" #: lib\treewidget.py:1714 msgid "&Add" msgstr "&Agregar" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "&Revertir" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "Re&nombrar" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "&Marcar como movido o renombrado" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "&Marcar como movido" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "&Marcar como renombrado" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "Realmente desea revertir el/los archivo(s) seleccionado(s)?" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "Mezcla externa" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "Seleccionar/deseleccionar todo" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "No una rama \"%s\"" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "No existe árbol de trabajo para \"%s\"" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "&Ubicación:" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "&Para:" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "&Revisión:" #: lib\ui_info.py:87 msgid "..." msgstr "..." #: lib\ui_info.py:89 msgid "&Basic" msgstr "&Básico" #: lib\ui_info.py:91 msgid "&Detailed" msgstr "&Detallado" #: lib\ui_init.py:119 msgid "Local Directory" msgstr "Directorio local" #: lib\ui_init.py:121 msgid "Repository" msgstr "Repositorio" #: lib\ui_init.py:122 msgid "Create a new standalone tree" msgstr "Crear un nuevo árbol independiente" #: lib\ui_init.py:123 msgid "Ensure all revisions are appended to the log" msgstr "Asegurarse que todas las revisiones estén agregadas a la minuta" #: lib\ui_init.py:124 msgid "Create a new shared repository" msgstr "Crear un nuevo repositorio compartido" #: lib\ui_init.py:125 msgid "Skip the creation of working trees in this repository" msgstr "Evitar la creación de arboles de trabajo en este repositorio" #: lib\ui_init.py:131 msgid "Repository Format:" msgstr "Formato del repositorio:" #: lib\ui_init.py:132 msgid "Description of format" msgstr "Descripción del formato" #: lib\ui_merge.py:62 msgid "Merge" msgstr "Mezclar" #: lib\ui_merge.py:67 lib\ui_pull.py:65 lib\ui_push.py:66 msgid "Remember this location as a default" msgstr "Recordar esta ubicación de manera predeterminada" #: lib\ui_merge.py:68 msgid "Merge even if the working tree has uncommitted changes" msgstr "Mezclar aún si el árbol de trabajo tiene cambios sin enviar" #: lib\ui_merge.py:69 msgid "Merge uncommitted changes instead of committed ones" msgstr "Mezclar cambios sin enviar en lugar de los enviados" #: lib\ui_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "Herramientas de fusión externas" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" msgstr "" #: lib\ui_new_tree.py:129 msgid "Create a new Bazaar Working Tree" msgstr "Crear un nuevo árbol de trabajo de Bazaar" #: lib\ui_new_tree.py:131 msgid "" "Branch source (enter a URL or select a local directory with an existing " "branch)" msgstr "" "Código de la rama (introducir un URL o seleccione un directorio local que " "contenga una rama existente)" #: lib\ui_new_tree.py:133 msgid "Local directory where the working tree will be created" msgstr "Directorio local donde el árbol de trabajo será creado" #: lib\ui_new_tree.py:135 msgid "Working Tree Options" msgstr "Opciones del árbol de trabajo" #: lib\ui_new_tree.py:136 msgid "Create a checkout" msgstr "Crear una nueva rama enlazada" #: lib\ui_new_tree.py:144 msgid "Light-weight checkout" msgstr "Rama enlazada ligera" #: lib\ui_new_tree.py:145 msgid "Make a local copy of the branch" msgstr "Crear una copia local de la rama" #: lib\ui_new_tree.py:151 msgid "Create a stacked branch referring to the source branch" msgstr "Crear una rama apilada refiriéndose al origen de la rama" #: lib\ui_new_tree.py:152 msgid "Click a link for more information about checkouts and branches." msgstr "" "Clic sobre el enlace para mayor información acerca de las ramas y ramas " "enlazadas." #: lib\ui_new_tree.py:159 msgid "Most recent (tip) revision" msgstr "La revisión mas reciente" #: lib\ui_new_tree.py:161 msgid "Show Log..." msgstr "Mostrar Minuta..." #: lib\ui_pull.py:60 msgid "Pull" msgstr "Jalar" #: 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 "Sobrescribir diferencias entre ramas" #: lib\ui_push.py:62 msgid "Push" msgstr "Empujar" #: lib\ui_push.py:68 msgid "Use existing directory" msgstr "Usar directorio existente" #: lib\ui_push.py:69 msgid "Create the path up to the branch if it does not exist" msgstr "Crear la ruta de la rama si no existe" #: lib\ui_run.py:107 msgid "Run bzr command" msgstr "Ejecutar comando: bzr" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "Directorio de &trabajo:" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "C&ategoria" #: lib\ui_run.py:112 msgid "&Command:" msgstr "&Comando:" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "Mo&strar comandos ocultos" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "&Opciones y argumentos para el comando:" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "Insertar &directorio..." #: lib\ui_run.py:116 msgid "Insert &filenames..." msgstr "Insertar nombres de archivos..." #: lib\ui_sysinfo.py:113 msgid "Bazaar Library" msgstr "Biblioteca de Bazaar" #: lib\ui_sysinfo.py:114 lib\ui_sysinfo.py:124 msgid "Version:" msgstr "Versión:" #: lib\ui_sysinfo.py:115 msgid "(bzr-version)" msgstr "(version-bzr)" #: lib\ui_sysinfo.py:116 lib\ui_sysinfo.py:126 msgid "Path:" msgstr "Ruta:" #: lib\ui_sysinfo.py:117 msgid "(bzr-lib-path)" msgstr "(ruta-bzr-lib)" #: lib\ui_sysinfo.py:118 msgid "Bazaar Configuration" msgstr "Configuración de Bazaar" #: lib\ui_sysinfo.py:119 msgid "Settings:" msgstr "Configuraciones:" #: lib\ui_sysinfo.py:120 msgid "(bzr-config-dir)" msgstr "(directorio-configuracion-bzr)" #: lib\ui_sysinfo.py:121 msgid "Log File:" msgstr "Archivo de registro:" #: lib\ui_sysinfo.py:122 msgid "(bzr-log-file)" msgstr "(archivo-bzr-minuta)" #: lib\ui_sysinfo.py:123 msgid "Python Interpreter" msgstr "Intérprete de Python" #: lib\ui_sysinfo.py:125 msgid "(python-version)" msgstr "(versión-python)" #: lib\ui_sysinfo.py:127 msgid "(python-file)" msgstr "(python-file)" #: lib\ui_sysinfo.py:128 msgid "Library:" msgstr "Biblioteca:" #: lib\ui_sysinfo.py:129 msgid "(python-lib-dir)" msgstr "(directorio-python-lib)" #: lib\ui_tag.py:88 msgid "Edit tag" msgstr "Editar etiqueta" #: lib\ui_tag.py:91 msgid "Tag" msgstr "Etiqueta" #: lib\ui_tag.py:92 msgid "&Action:" msgstr "&Acción:" #: lib\ui_tag.py:93 msgid "Create new tag" msgstr "Crear una nueva etiqueta" #: lib\ui_tag.py:94 msgid "Move existing tag" msgstr "Mover a etiqueta existente" #: lib\ui_tag.py:95 msgid "Delete existing tag" msgstr "Borrar etiqueta existente" #: lib\ui_tag.py:96 msgid "&Tag name:" msgstr "Nombre de e&tiqueta" #: lib\ui_tag.py:98 msgid "&Select..." msgstr "&Seleccionar..." #: lib\ui_update_branch.py:82 msgid "Update Branch" msgstr "Actualizar rama" #: lib\ui_update_branch.py:83 msgid "" "This directory is a branch. Please select what you would like to update" msgstr "" "Este directorio es una rama. Por favor seleccione cual desea actualizar" #: lib\ui_update_branch.py:84 lib\ui_update_checkout.py:76 msgid "Update source" msgstr "Actualizar fuente" #: lib\ui_update_branch.py:86 msgid "Pull most recent changes from:" msgstr "Obtener los cambios mas recientes de:" #: lib\ui_update_branch.py:87 msgid "Remember this as the new parent branch" msgstr "Recordar ésta como la nueva rama origen" #: 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 "Actualizar árbol de trabajo con los últimos cambios de la rama" #: lib\ui_update_checkout.py:74 msgid "Update Checkout" msgstr "Actualizar Rama Enlazada" #: lib\ui_update_checkout.py:75 #, python-format msgid "This directory is a checkout of: %s" msgstr "Este directorio es una rama enlazada de: %s" #: lib\ui_update_checkout.py:77 msgid "Update the working tree from the bound branch" msgstr "Actualizar el árbol de trabajo a partir de la rama enlazada" #: lib\ui_update_checkout.py:78 msgid "Pull a different branch" msgstr "Jalar de una rama diferente" #: lib\unbind.py:36 msgid "Unbind branch" msgstr "Rama desenlazada" #: lib\unbind.py:47 msgid "Unbind" msgstr "Desenlazar" #: lib\unbind.py:55 msgid "Bound to:" msgstr "Enlazado a:" #: lib\uncommit.py:40 msgid "Uncommit" msgstr "Deshacer envío" #: lib\uncommit.py:57 msgid "Move tip to" msgstr "Mover punta a" #: lib\uncommit.py:59 msgid "Parent of current tip revision" msgstr "Padre de la punta de la revisión actual" #: lib\uncommit.py:61 msgid "Other revision:" msgstr "Otra revisión:" #: lib\uncommit.py:104 msgid "No other revision specified." msgstr "No se ha especificado otra revisión." #: lib\uncommit.py:122 msgid "Do you really want to uncommit these revisions?" msgstr "Realmente desea eliminar estas revisiones enviadas?" #: lib\update.py:33 msgid "Update working tree" msgstr "Actualizar árbol de trabajo" #: lib\update.py:34 #, python-format msgid "Update tree %s" msgstr "Actualizar árbol %s" #: lib\util.py:70 msgid "&Cancel" msgstr "&Cancelar" #: lib\util.py:425 msgid "Warning" msgstr "Aviso" #: lib\util.py:436 msgid "Confirm" msgstr "Confirmar" #: lib\util.py:583 msgid "Select Source Directory" msgstr "Seleccione Directorio Origen" #: lib\util.py:585 msgid "Select Target Directory" msgstr "Seleccione Directorio Objetivo" #: lib\util.py:726 msgid "deleted files" msgstr "archivos borrados" #: lib\util.py:728 msgid "added files" msgstr "archivos añadidos" #: lib\util.py:730 msgid "renamed files" msgstr "archivos renombrados" #: lib\util.py:732 msgid "modified files" msgstr "archivos modificados" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "(sin mensaje)" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "Verificar firmas" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "eliminar archivo" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "renombrar" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "añadir archivo" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "modificar texto" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "modificar objetivo" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "modificar binario" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "Terminado" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "Usar editor" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "Destruir" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "Seleccionar todo" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "Deseleccionar todo" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "Ningún cambio seleccionado." #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" "Operació abortada porque el árbol de trabajo tiene fusiones pendientes." #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "Eliminar" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "Anterior" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "Siguiente" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "Palabras completas" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" #~ msgid "You must specify a location" #~ msgstr "Debe especificar una ubicación" #~ msgid "Cre&ate" #~ msgstr "Cre&ar" #~ msgid "&Format" #~ msgstr "&Formato" #~ msgid "[binary file]" #~ msgstr "[archivo binario]" #~ msgid "Using" #~ msgstr "Usando" #~ msgid "Side by side" #~ msgstr "Cara a cara" #~ msgid "Branch format:" #~ msgstr "Formato de la Rama:" #~ msgid "&Related Branches" #~ msgstr "Ramas &relacionadas:" #~ msgid "Submit branch:" #~ msgstr "Enviar rama:" #~ msgid "Control directory format:" #~ msgstr "Formato del directorio de control:" #~ msgid "Repository format:" #~ msgstr "Formato del repositorio:" #~ msgid "Push branch:" #~ msgstr "Empujar rama:" #~ msgid "Parent branch:" #~ msgstr "Rama origen:" #~ msgid "Working tree format:" #~ msgstr "Formato del árbol de trabajo:" #~ msgid "Definition" #~ msgstr "Definición" #~ msgid "External Merge Apps:" #~ msgstr "Aplicaciones externas de mezcla:" #~ msgid "Use Configured Default" #~ msgstr "Usar configurado por defecto" #~ msgid "You should provide commit message." #~ msgstr "Debería proporcionar un mensaje de envío" #, python-format #~ msgid "%s (Configured external merge definition in qconfig)" #~ msgstr "%s (definición externa de mezclado configurada en qconfig)" #~ msgid "Location has no branch" #~ msgstr "La localización no tiene rama" #~ msgid "Location has no working tree" #~ msgstr "La localización no tiene árbol de trabajo" #~ 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 "" #~ "La herramienta de mezclado configurada en qconfig bajo el archivo mezclado.\n" #~ "Sigue la convención usada en el plugin: extmerge\n" #~ "external_merge = kdiff3 --output %r %b %t %o\n" #~ "%r es la salida, %b es .BASE, %t es .THIS y %o es el archivo .OTHER" #~ msgid "Left side encoding:" #~ msgstr "Lado izquierdo de la codificación:" #~ msgid "Right side encoding:" #~ msgstr "Lado derecho de la codificación:" #~ msgid "&Yes" #~ msgstr "&Si" #~ msgid "" #~ "You are reverting all changed paths without also reverting pending merges. " #~ "Do you want to continue?" #~ msgstr "" #~ "Se están revirtiendo todos las rutas cambiadas sin revertir a su vez las " #~ "mezclas pendientes. ¿Desea continuar?" #~ msgid "&No" #~ msgstr "&No" #~ msgid "&Move" #~ msgstr "&Mover" #~ msgid "" #~ "Some of the files selected cannot be recoverd if removed. Are you sure you " #~ "want to remove these files?" #~ msgstr "" #~ "Algunos de los archivos seleccionados no pueden ser recuperados si se " #~ "eliminan. ¿Está seguro que desea eliminar esos archivos?" #~ msgid "Public branch:" #~ msgstr "Rama pública:" #~ msgid "No changes to commit." #~ msgstr "No hay cambios que enviar." ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-et.po0000644000000000000000000014542614556556456013220 0ustar00# Estonian translation for qbzr # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the qbzr package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-12 16:38+0300\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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Lisa" #: lib\add.py:57 msgid "Unversioned Files" msgstr "Versioonita failid" #: lib\add.py:106 msgid "Show ignored files" msgstr "Näita eiratud faile" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "Annoteeri" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "Laadimine..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "Versioon %s" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "" #: lib\annotate.py:762 msgid "Go" msgstr "" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 msgid "&Annotate this revision" msgstr "&Annoteeri see versioon" #: lib\bind.py:44 msgid "Bind branch" msgstr "Köida haru" #: lib\bind.py:54 msgid "Bind" msgstr "Köida" #: lib\bind.py:56 msgid "Branch location:" msgstr "Haru asukoht:" #: lib\bind.py:60 msgid "Currently bound to:" msgstr "Hetkel köidetud:" #: lib\bind.py:64 msgid "Bind to:" msgstr "Köidetud:" #: lib\bind.py:68 lib\browse.py:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Lehitse" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "Vali haru asukoht" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "Ülemharu asukohta pole määratud." #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Asukoht:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "Versioon:" #: lib\browse.py:84 msgid "Show" msgstr "Näita" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "&Filtreeri" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "Vaade" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "Kodeering:" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "Kanna sisse" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "Haru" #: lib\commit.py:259 msgid "&Local commit" msgstr "&Kohalik sissekanne" #: lib\commit.py:261 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:265 msgid "Description:" msgstr "Kirjeldus:" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "Sõnum" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "Näita versioonita faile" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "Sisesta sissekande sõnum" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "&Fikseeritud vead:" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "Määra selle sissekande poolt parandatud vigade ID-d" #: lib\commit.py:364 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:374 msgid "&Author:" msgstr "&Autor:" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "Määra muudatusele sissekandjast erinev autor" #: lib\commit.py:378 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:393 msgid "Changes" msgstr "Muudatused" #: lib\commit.py:410 msgid "Pending Merges" msgstr "Ootel ühendused" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "Olek" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "Vaata sissekandeks valitud failide muudatusi" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "" #: lib\commit.py:658 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:739 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:745 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:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "Erinevus" #: lib\config.py:49 msgid "Default" msgstr "Vaikimisi" #: lib\config.py:50 msgid "Thunderbird" msgstr "Thunderbird" #: lib\config.py:51 msgid "Evolution" msgstr "Evolution" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "Mutt" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "XDG e-posti klient" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "MAPI e-posti klient" #: lib\config.py:56 msgid "Editor" msgstr "Redaktor" #: lib\config.py:79 msgid "Configuration" msgstr "Seadistamine" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "&Nimi:" #: lib\config.py:95 msgid "E-&mail:" msgstr "E-&post:" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "&Lehitse..." #: lib\config.py:108 msgid "&Editor:" msgstr "&Redaktor:" #: lib\config.py:116 msgid "E-mail &client:" msgstr "E-post &klient:" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "Alias" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "Käsk" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "Eemalda" #: lib\config.py:158 msgid "Abbreviation" msgstr "Lühend" #: lib\config.py:158 msgid "URL" msgstr "URL" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "Näita grupisiseseid sisestusi ja kustutamisi rohelise ja punasega" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "Välised erinevusrakendused:" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "Nimi" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "Üldine" #: lib\config.py:242 msgid "Aliases" msgstr "Aliased" #: lib\config.py:243 msgid "Bug Trackers" msgstr "Vigade jälgijad" #: lib\config.py:244 msgid "&User Interface" msgstr "&Kasutajaliides" #: lib\config.py:245 msgid "&Diff" msgstr "&Võrdlemine" #: lib\config.py:246 msgid "&Merge" msgstr "&Liida" #: lib\config.py:271 msgid "Spell check &language:" msgstr "Õigekirja kontroll &keel:" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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 "Lehitse..." #: lib\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "Sisseehitatud võrdlus" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "Vali käivitatav redaktor" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "Konfliktid" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "Fail" #: lib\conflicts.py:62 msgid "Conflict" msgstr "Konflikt" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "&Käivita..." #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "L&iitmise tööriist:" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "Automaatne lahendamine" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "&Liida konflikt" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "Märgi &lahendatuks" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "%d konflikt on automaatselt lahendatud." msgstr[1] "%d konflikti on automaatselt lahendatud." #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "&OK" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "Kõik konfliktid on lahendatud." #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "Liitmise tööriista (code %d) käivitamisel tekkis viga" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "Viga" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "Määra external_merge rakendus qconfig'is liitmise kaardil" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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 "" "extmerge definitsioon: '%(tool)s' on vigane.\n" "Kadunud märgistus: %(flags)s. See peab olema fikseeritud qconfig'i liitmise " "kaardis." #: lib\conflicts.py:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "Kadunud märgistus: %s. Seadista qconfig'i liitmise kaardis." #: lib\conflicts.py:310 msgid "path conflict" msgstr "asukohakonflikt" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "sisukonflikt" #: lib\conflicts.py:312 msgid "text conflict" msgstr "tekstikonflikt" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "dubleeri id" #: lib\conflicts.py:314 msgid "duplicate" msgstr "duplikaat" #: lib\conflicts.py:315 msgid "parent loop" msgstr "ülemkordus" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "versioonita ülem" #: lib\conflicts.py:317 msgid "missing parent" msgstr "kadunud ülem" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "ülema kustutamine" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "kataloogita ülem" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "Näita &erinevusi" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "eemaldatud" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "lisatud" #: lib\diff.py:266 msgid "renamed and modified" msgstr "ümbernimetatud ja muudetud" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "ümbernimetatud" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "muudetud" #: lib\diffview.py:461 msgid "Last modified:" msgstr "Viimati muudetud:" #: lib\diffview.py:462 msgid "Status:" msgstr "Olek:" #: lib\diffview.py:463 msgid "Kind:" msgstr "Laad:" #: lib\diffview.py:464 msgid "Properties:" msgstr "Atribuudid:" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "\\ Faili lõpus reavahetus puudub" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "Tööpuu %s jaoks" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "Tööpuu" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "Rev %(rev)s %(branch)s jaoks" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "Rev %s" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "Revid: %(revid)s %(branch)s jaoks" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "Revid: %s" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "Liida eelvaade" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "Unidiff" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "&Värskenda" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "%d fail" msgstr[1] "%d faili" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" "Fail %s ei ole versioonitud.\n" "Operatsioon on katkestatud." #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "&Sulge" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "Muudatusi ei leitud." #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "Vale kodeerimine" #: lib\encoding_selector.py:77 #, python-format msgid "Encoding \"%s\" is invalid or not supported." msgstr "\"%s\" kodeerimine on vigane või tugi puudub." #: lib\export.py:61 lib\export.py:80 msgid "Export" msgstr "Ekspordi" #: lib\export.py:75 lib\uncommit.py:51 #, python-format msgid "Branch: %s" msgstr "Haru: %s" #: lib\export.py:146 msgid "Archive type:" msgstr "Arhiivi liik:" #: lib\export.py:168 msgid "Root directory name:" msgstr "Juurkataloogi nimi:" #: lib\export.py:236 lib\ui_branch.py:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "Valikud" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" msgstr "" #: lib\help.py:59 #, python-format msgid "No help can be found for %s" msgstr "Abi %s jaoks ei leitud" #: lib\help.py:103 msgid "Help" msgstr "Abi" #: lib\i18n.py:95 msgid "file" msgstr "fail" #: lib\i18n.py:96 msgid "directory" msgstr "kataloog" #: lib\i18n.py:97 msgid "symlink" msgstr "nimeviit" #: lib\i18n.py:99 msgid "fixed" msgstr "fikseeritud" #: lib\i18n.py:101 msgid "View text file" msgstr "Tekstifaili vaatamine" #: lib\i18n.py:102 msgid "View image file" msgstr "Pildifaili vaatamine" #: lib\i18n.py:103 msgid "View binary file" msgstr "Binaarfaili vaatamine" #: lib\i18n.py:104 msgid "View symlink" msgstr "Nimeviida vaatamine" #: lib\i18n.py:105 msgid "View directory" msgstr "Kataloogi vaatamine" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "Sissekande jaoks valitud muudatusi ei leitud" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "Valitud muudatusi tühistamiseks ei leitud" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "Info" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "Initsialiseeri" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "Logi" #: lib\log.py:142 msgid "&Search:" msgstr "&Otsing:" #: lib\log.py:158 msgid "Messages" msgstr "Sõnumid" #: lib\log.py:160 msgid "Authors" msgstr "Autorid" #: lib\log.py:162 msgid "Revision IDs" msgstr "Versiooni ID'd" #: lib\log.py:164 msgid "Revision Numbers" msgstr "Versiooni numbrid" #: lib\log.py:166 msgid "Tags" msgstr "Sildid" #: lib\log.py:168 msgid "Bugs" msgstr "Vead" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "Sõnumid ja faili tekst (indekseeritud)" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "Näita &erinevusi..." #: lib\log.py:575 msgid "View file" msgstr "Vaata faili" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "Rev" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "Kuupäev" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Autor" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "viga #%s" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "Näita faili &erinevusi" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "Näita kõiki &erinevusi" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "Näita faili &erinevusi..." #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "Näita kõiki &erinevusi..." #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "Näita &puud..." #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "Silt &versioon..." #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "&Võta tagasi" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" msgstr "" #: lib\main.py:120 msgid "Computer" msgstr "Arvuti" #: lib\main.py:149 msgid "&Edit Bookmark..." msgstr "&Redigeeri järjehoidjat..." #: lib\main.py:150 msgid "&Remove Bookmark..." msgstr "&Eemalda järjehoidja..." #: lib\main.py:165 msgid "Bookmarks" msgstr "Järjehoidjad" #: lib\main.py:276 msgid "Refresh the directory tree" msgstr "Värskenda kataloogipuu" #: lib\main.py:280 msgid "&Commit" msgstr "&Kanna sisse" #: lib\main.py:281 msgid "Commit changes into a new revision" msgstr "Kanna muudatused uude versiooni" #: lib\main.py:285 msgid "&Push" msgstr "&Lükka" #: lib\main.py:286 msgid "Turn this branch into a mirror of another branch" msgstr "Pööra see haru teise haru peegelduseks" #: lib\main.py:290 msgid "Pu&ll" msgstr "&Tõmba" #: lib\main.py:291 msgid "Update a mirror of this branch" msgstr "Uuenda selle haru peegeldus" #: lib\main.py:294 msgid "&Add Bookmark..." msgstr "&Lisa järjehoidja..." #: lib\main.py:301 msgid "&File" msgstr "&Fail" #: lib\main.py:302 msgid "&Configure..." msgstr "&Seadista..." #: lib\main.py:304 msgid "&Quit" msgstr "&Välju" #: lib\main.py:305 msgid "&View" msgstr "&Vaade" #: lib\main.py:307 msgid "&Branch" msgstr "&Haru" #: lib\main.py:311 msgid "&Bookmarks" msgstr "&Järjehoidjad" #: lib\main.py:313 lib\util.py:72 msgid "&Help" msgstr "&Abi" #: lib\main.py:314 msgid "&Help..." msgstr "&Abi..." #: lib\main.py:316 msgid "&About..." msgstr "Te&ave..." #: lib\main.py:354 msgid "Size" msgstr "Suurus" #: lib\main.py:406 msgid "About QBzr" msgstr "QBzr'i info" #: 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 "" "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" msgstr "Lisa järjehoidja" #: lib\main.py:483 msgid "Edit Bookmark" msgstr "Redigeeri järjehoidjaid" #: lib\main.py:493 msgid "Remove Bookmark" msgstr "Eemalda järjehoidja" #: lib\main.py:494 msgid "Do you really want to remove the selected bookmark?" msgstr "Kas sa tõesti soovid valitud järjehoidjat eemaldada?" #: lib\plugins.py:44 msgid "Plugins" msgstr "Pluginad" #: lib\plugins.py:57 msgid "Version" msgstr "Versioon" #: lib\plugins.py:58 lib\subprocess.py:480 msgid "Description" msgstr "Kirjeldus" #: lib\plugins.py:62 msgid "Directory" msgstr "Kataloog" #: lib\plugins.py:64 #, python-format msgid "Plugins installed: %(rows)d" msgstr "Paigaldatud pluginad: %(rows)d" #: lib\plugins.py:71 msgid "Summary" msgstr "Kokkuvõte" #: lib\plugins.py:72 lib\ui_branch.py:100 msgid "Locations" msgstr "Asukohad" #: lib\plugins.py:111 msgid "(no description)" msgstr "(kirjeldus puudub)" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "Tööpuul on sissekandmata muudatused." #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "Tööpuu on aegunud, palun käivita 'bzr update'." #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "Kas sa soovid sellest hoolimata jätkata?" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "Vali tagasivõetavad muudatused" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "Ära salvesta tagasivõetud failide varundusi" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "Unusta ootel liitmised" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "Vaata valitud tagasivõetavate failide muudatusi" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "Ülemad:" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "Järglased:" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "Sissekandmata tööpuu muudatused" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "Kuupäev:" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "Sissekandja:" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "Autor:" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "Haru:" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "Sildid:" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "Viga:" msgstr[1] "Vead:" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "Versioon" #: lib\run.py:98 msgid "Select working directory" msgstr "Vali töökataloog" #: lib\run.py:119 msgid "&Edit" msgstr "&Redigeeri" #: lib\run.py:167 msgid "Help for command" msgstr "Abi käsule" #: lib\run.py:287 msgid "Select path to insert" msgstr "Vali sisestamiseks asukoht" #: lib\run.py:297 msgid "Select files to insert" msgstr "Vali sisestatavad failid" #: lib\send.py:34 msgid "Send" msgstr "Saada" #: lib\send.py:47 msgid "Merge Directive Options" msgstr "Liida direktiivsed valikud" #: lib\send.py:53 msgid "Submit Branch:" msgstr "Saada haru:" #: lib\send.py:77 msgid "Public Branch:" msgstr "Avalik haru:" #: lib\send.py:99 msgid "Remember these locations as defaults" msgstr "Jäta need asukohad vaikimisi meelde" #: lib\send.py:103 msgid "Include a bundle in the merge directive" msgstr "Sisalda komplekti liidetud direktiividest" #: lib\send.py:107 msgid "Include a preview patch in the merge directive" msgstr "Sisalda liidetud direktiividest eelvaate asukohta" #: lib\send.py:112 msgid "Action" msgstr "Toiming" #: lib\send.py:122 msgid "Address:" msgstr "Aadress:" #: lib\send.py:132 msgid "Message:" msgstr "Sõnum:" #: lib\send.py:149 msgid "Filename:" msgstr "Failinimi:" #: lib\send.py:163 msgid "Revisions:" msgstr "Versioonid:" #: lib\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "&Proovi uuesti" #: lib\subprocess.py:518 msgid "Ready" msgstr "Valmis" #: lib\subprocess.py:591 msgid "Starting..." msgstr "Alustamine..." #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "Katkestamine..." #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "Valmis!" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "Sisesta parool" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "Sisesta kasutajanimi:" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "Ebaõnnestus!" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "Bzr'i käivitamine nurjus" #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "Bzr käivitamisel tekkis viga. (vea kood: %d)" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "Katkenud!" #: lib\switch.py:46 msgid "Switch" msgstr "Lülita" #: lib\switch.py:57 msgid "Switch checkout" msgstr "Lülita väljavõttesse" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "Väga põhjalik väljavõte:" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "Vähem põhjalik väljavõte:" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "Haru väljavõte:" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "Lülita harusse:" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "Loo enne lülitamist haru" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "Süsteemi informatsioon" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "Sa peaksid määrama sildi nime" #: lib\tag.py:140 #, python-format msgid "" "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:150 #, python-format msgid "" "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 #, python-format msgid "Tag \"%s\" does not exists" msgstr "Silti \"%s\" ei ole olemas" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" "See pole haru:\n" "%s" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "ignoreeritud" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "versioonita" #: lib\treewidget.py:327 msgid "added, missing" msgstr "lisatud, puudu" #: lib\treewidget.py:333 msgid "missing" msgstr "puudu" #: lib\treewidget.py:340 msgid "moved" msgstr "liigutatud" #: lib\treewidget.py:346 msgid "x-bit" msgstr "x-bit" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "Faili nimi" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "Muutmata" #: lib\treewidget.py:1303 msgid "Changed" msgstr "Muudetud" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "Versioonita" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "Ignoreeritud" #: lib\treewidget.py:1682 msgid "&Open" msgstr "&Ava" #: lib\treewidget.py:1685 msgid "&View file" msgstr "&Vaata faili" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "Näita &annoteerimist" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "Näita &logi" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "Märgi konflikt &lahendatuks" #: lib\treewidget.py:1714 msgid "&Add" msgstr "&Lisa" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "&Tühista" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "&Nimeta ümber" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "&Märgi liigutatuks ja ümbernimetatuks" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "&Märgi liigutatuks" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "&Märgi ümbernimetatuks" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "Kas sa tõesti soovid valitud faili(d) tagasi võtta?" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "Väline liitmine" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "Vali / ära vali kõik" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "Ei ole haru \"%s\"" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "Tööpuud \"%s\" jaoks ei ole olemas" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "&Asukoht:" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "&Kellele:" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "&Versioon:" #: lib\ui_info.py:87 msgid "..." msgstr "..." #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" msgstr "" #: lib\ui_init.py:119 msgid "Local Directory" msgstr "Kohalik kataloog" #: lib\ui_init.py:121 msgid "Repository" msgstr "Hoidla" #: lib\ui_init.py:122 msgid "Create a new standalone tree" msgstr "Loo uus eraldiseisev puu" #: lib\ui_init.py:123 msgid "Ensure all revisions are appended to the log" msgstr "Veendu, et kõik versioonid on logisse lisatud" #: lib\ui_init.py:124 msgid "Create a new shared repository" msgstr "Loo uus jagatud hoidla" #: lib\ui_init.py:125 msgid "Skip the creation of working trees in this repository" msgstr "Jäta tööpuude loomine selles hoidlas vahele" #: lib\ui_init.py:131 msgid "Repository Format:" msgstr "Hoidla vorming:" #: lib\ui_init.py:132 msgid "Description of format" msgstr "Vormingu kirjeldus" #: lib\ui_merge.py:62 msgid "Merge" 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 "Jäta see asukoht vaikimisi meelde" #: lib\ui_merge.py:68 msgid "Merge even if the working tree has uncommitted changes" msgstr "Liida isegi siis, kui tööpuul on sissekandmata muudatused" #: lib\ui_merge.py:69 msgid "Merge uncommitted changes instead of committed ones" msgstr "Liida sissekandmata muudatused sissekantute asemele" #: lib\ui_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" msgstr "" #: lib\ui_new_tree.py:129 msgid "Create a new Bazaar Working Tree" 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 "Kohalik kataloog, kuhu loodakse tööpuu" #: lib\ui_new_tree.py:135 msgid "Working Tree Options" msgstr "Tööpuu valikud" #: lib\ui_new_tree.py:136 msgid "Create a checkout" msgstr "Loo väljavõte" #: lib\ui_new_tree.py:144 msgid "Light-weight checkout" msgstr "Lihtsam väljavõte" #: lib\ui_new_tree.py:145 msgid "Make a local copy of the branch" msgstr "Tee harust kohalik koopia" #: lib\ui_new_tree.py:151 msgid "Create a stacked branch referring to the source branch" 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 "Väljavõtetest ja harudest rohkema info saamiseks klõpsa lingile." #: lib\ui_new_tree.py:159 msgid "Most recent (tip) revision" msgstr "Kõige viimane (tip) versioon" #: lib\ui_new_tree.py:161 msgid "Show Log..." msgstr "Näita logi..." #: lib\ui_pull.py:60 msgid "Pull" 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 "Kirjuta üle harudevahelised erinevused" #: lib\ui_push.py:62 msgid "Push" msgstr "Lükka" #: lib\ui_push.py:68 msgid "Use existing directory" msgstr "Kasuta olemasolevat kataloogi" #: lib\ui_push.py:69 msgid "Create the path up to the branch if it does not exist" msgstr "Loo haruni asukoht, kui seda pole olemas" #: lib\ui_run.py:107 msgid "Run bzr command" msgstr "Käivita bzr käsk" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "&Töökataloog:" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "&Kategooria:" #: lib\ui_run.py:112 msgid "&Command:" msgstr "&Käsk:" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "&Näita peidetud käske" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "&Valikud ja argumendid käsu jaoks:" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "Sisesta &kataloog..." #: lib\ui_run.py:116 msgid "Insert &filenames..." msgstr "Sisesta &failinimed..." #: lib\ui_sysinfo.py:113 msgid "Bazaar Library" msgstr "Bazaari teek" #: lib\ui_sysinfo.py:114 lib\ui_sysinfo.py:124 msgid "Version:" msgstr "Versioon:" #: lib\ui_sysinfo.py:115 msgid "(bzr-version)" msgstr "(bzr-versioon)" #: lib\ui_sysinfo.py:116 lib\ui_sysinfo.py:126 msgid "Path:" msgstr "Asukoht:" #: lib\ui_sysinfo.py:117 msgid "(bzr-lib-path)" msgstr "(bzr-lib-asukoht)" #: lib\ui_sysinfo.py:118 msgid "Bazaar Configuration" msgstr "Bazaari seadistamine" #: lib\ui_sysinfo.py:119 msgid "Settings:" msgstr "Seadistused:" #: lib\ui_sysinfo.py:120 msgid "(bzr-config-dir)" msgstr "(bzr-seadistamine-kataloog)" #: lib\ui_sysinfo.py:121 msgid "Log File:" msgstr "Logifail:" #: lib\ui_sysinfo.py:122 msgid "(bzr-log-file)" msgstr "(bzr-logifail)" #: lib\ui_sysinfo.py:123 msgid "Python Interpreter" msgstr "Pythoni interpretaator" #: lib\ui_sysinfo.py:125 msgid "(python-version)" msgstr "(python-versioon)" #: lib\ui_sysinfo.py:127 msgid "(python-file)" msgstr "(python-fail)" #: lib\ui_sysinfo.py:128 msgid "Library:" msgstr "Teek:" #: lib\ui_sysinfo.py:129 msgid "(python-lib-dir)" msgstr "(python-lib-kataloog)" #: lib\ui_tag.py:88 msgid "Edit tag" msgstr "Muuda silti" #: lib\ui_tag.py:91 msgid "Tag" msgstr "Silt" #: lib\ui_tag.py:92 msgid "&Action:" msgstr "&Tegevus:" #: lib\ui_tag.py:93 msgid "Create new tag" msgstr "Loo uus silt" #: lib\ui_tag.py:94 msgid "Move existing tag" msgstr "Liiguta olemasolev silt" #: lib\ui_tag.py:95 msgid "Delete existing tag" msgstr "Kustuta olemasolev silt" #: lib\ui_tag.py:96 msgid "&Tag name:" msgstr "&Sildi nimi:" #: lib\ui_tag.py:98 msgid "&Select..." msgstr "&Vali..." #: lib\ui_update_branch.py:82 msgid "Update Branch" msgstr "Uuenda haru" #: lib\ui_update_branch.py:83 msgid "" "This directory is a branch. Please select what you would like to update" 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 "Uuenduse allikas" #: lib\ui_update_branch.py:86 msgid "Pull most recent changes from:" msgstr "Tõmba hiljutised muudatused siit:" #: lib\ui_update_branch.py:87 msgid "Remember this as the new parent branch" msgstr "Jäta see uue ülemharuna meelde" #: lib\ui_update_branch.py:89 msgid "" msgstr "<Ülemharu näidatud siin>" #: lib\ui_update_branch.py:90 msgid "Update working tree to the latest changes in the branch" msgstr "Uuenda haru viimased muudatused tööpuule" #: lib\ui_update_checkout.py:74 msgid "Update Checkout" msgstr "Uuendamise väljavõte" #: lib\ui_update_checkout.py:75 #, python-format msgid "This directory is a checkout of: %s" msgstr "See kataloog on %s väljavõte" #: 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 "Tõmba erinev haru" #: lib\unbind.py:36 msgid "Unbind branch" msgstr "Sidumata haru" #: lib\unbind.py:47 msgid "Unbind" msgstr "Seo lahti" #: lib\unbind.py:55 msgid "Bound to:" msgstr "Seo siia:" #: lib\uncommit.py:40 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 "Teine versioon:" #: lib\uncommit.py:104 msgid "No other revision specified." msgstr "Teist versiooni pole kirjeldatud." #: lib\uncommit.py:122 msgid "Do you really want to uncommit these revisions?" msgstr "" #: lib\update.py:33 msgid "Update working tree" msgstr "Uuenda tööpuud" #: lib\update.py:34 #, python-format msgid "Update tree %s" msgstr "Uuenda puud %s" #: lib\util.py:70 msgid "&Cancel" msgstr "&Katkesta" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "Vali allika kataloog" #: lib\util.py:585 msgid "Select Target Directory" msgstr "Vali sihtkataloog" #: lib\util.py:726 msgid "deleted files" msgstr "kustutatud failid" #: lib\util.py:728 msgid "added files" msgstr "lisatud failid" #: lib\util.py:730 msgid "renamed files" msgstr "ümbernimetatud failid" #: lib\util.py:732 msgid "modified files" msgstr "muudetud failid" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "(sõnum puudub)" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "Valmis" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" #~ msgid "Definition" #~ msgstr "Definitsioon" #~ msgid "&No" #~ msgstr "&Ei" #~ msgid "&Yes" #~ msgstr "&Jah" #~ msgid "Use Configured Default" #~ msgstr "Kasuta vaikimisi seadistusi" #~ 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 "" #~ "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." #~ msgid "[binary file]" #~ msgstr "[binaarfail]" #~ msgid "Side by side" #~ msgstr "Kõrvuti" #~ msgid "Left side encoding:" #~ msgstr "Vasakpoolne kodeering:" #~ msgid "Right side encoding:" #~ msgstr "Parempoolne kodeering:" #~ msgid "Location has no branch" #~ msgstr "Asukohal puudub haru" #~ msgid "Location has no working tree" #~ msgstr "Asukohal puudub tööpuu" #~ msgid "You must specify a location" #~ msgstr "Sa pead määrama asukoha" #~ msgid "&Move" #~ msgstr "&Liiguta" #~ msgid "Cre&ate" #~ msgstr "&Loo" #~ 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?" #~ msgid "Parent branch:" #~ msgstr "Ülemharu:" #~ msgid "Branch format:" #~ msgstr "Haru vorming:" #~ msgid "Working tree format:" #~ msgstr "Tööpuu vorming:" #~ msgid "&Related Branches" #~ msgstr "&Seotud harud" #~ msgid "Repository format:" #~ msgstr "Hoidla vorming:" #~ msgid "&Format" #~ msgstr "&Vorming" #~ msgid "You should provide commit message." #~ msgstr "Peaksid sisestama sissekandesõnumi." #~ msgid "No changes to commit." #~ msgstr "Sissekandeks puuduvad muudatused." #~ msgid "External Merge Apps:" #~ msgstr "Välised liitmisrakendused:" #, python-format #~ msgid "%s (Configured external merge definition in qconfig)" #~ msgstr "%s (Seadistatud välise liitmise definitsioon qconfig'is)" #~ msgid "Using" #~ msgstr "Kasutusel" #~ 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?" #~ msgid "Submit branch:" #~ msgstr "Saada haru:" #~ msgid "Control directory format:" #~ msgstr "Kontrollkataloogi vorming:" #~ msgid "Public branch:" #~ msgstr "Avalik haru:" #~ msgid "Push branch:" #~ msgstr "Lükka haru:" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-fr.po0000644000000000000000000013352114556556456013210 0ustar00# French translation for qbzr # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the qbzr package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-12 16:38+0300\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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Ajouter" #: lib\add.py:57 msgid "Unversioned Files" msgstr "Fichiers non-versionnés" #: lib\add.py:106 msgid "Show ignored files" msgstr "Montrer les fichiers ignorés" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "Annoter" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "Chargement..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "Version n° %s" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "" #: lib\annotate.py:762 msgid "Go" msgstr "" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 msgid "&Annotate this revision" msgstr "&Annoter cette révision" #: lib\bind.py:44 msgid "Bind branch" msgstr "Lier une branche" #: lib\bind.py:54 msgid "Bind" msgstr "Lier" #: lib\bind.py:56 msgid "Branch location:" msgstr "Emplacement de la branche :" #: lib\bind.py:60 msgid "Currently bound to:" msgstr "Actuellement liée à :" #: lib\bind.py:64 msgid "Bind to:" msgstr "Liée à :" #: lib\bind.py:68 lib\browse.py:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Parcourir" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "Choisissez l'emplacement de la branche" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "Emplacement de la branche liée manquant." #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Emplacement :" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "Révision :" #: lib\browse.py:84 msgid "Show" msgstr "Afficher" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "&Filtrer" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "Voir" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "Encodage :" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "Commiter" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "Branche" #: lib\commit.py:259 msgid "&Local commit" msgstr "Commit &local" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" "Les commits locaux ne seront poussés sur la branche principale que lors d'un " "commit normal" #: lib\commit.py:265 msgid "Description:" msgstr "Description :" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "Message" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "Montrer les fichiers non-versionnés" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "Entrez le message de commit" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "&Bogues corrigé s:" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "Définit les identifiants des bogues corrigés par ce commit" #: lib\commit.py:364 msgid "" "Enter the list of bug IDs in format tag:id separated by a space, e.g. " "project:123 project:765" msgstr "" "Entrez la liste des identifiants de bug au format tag:id séparés par " "des espaces, par exemple project:123 project:765" #: lib\commit.py:374 msgid "&Author:" msgstr "&Auteur :" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "Définit l'auteur des changements s'il est différent du commiteur" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" "Saisissez le nom de l'auteur, par exemple John Doe " "<jdoe@example.com>" #: lib\commit.py:393 msgid "Changes" msgstr "Modifications" #: lib\commit.py:410 msgid "Pending Merges" msgstr "Merges en attente" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "État" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "" "Voir les changements dans les fichiers sélectionnés pour l'enregistrement" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" "Pas de changement sélectionnés pour l'enregistrement.\n" "Enregistrer quand même ?" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" "Un enregistrement va être fait directement sur la branche principale, " "gardant la branche locale et cette dernière synchronisés." #: lib\commit.py:745 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 "" "Un enregistrement local vers la branche va être fait. La branche principale " "ne sera pas mise à jour jusqu'à ce qu'un enregistrement non-local soit fait." #: lib\commit.py:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "Diff" #: lib\config.py:49 msgid "Default" msgstr "Par défaut" #: lib\config.py:50 msgid "Thunderbird" msgstr "Thunderbird" #: lib\config.py:51 msgid "Evolution" msgstr "Evolution" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "Mutt" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "Client mail XDG" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "Client mail MAPI" #: lib\config.py:56 msgid "Editor" msgstr "Éditeur" #: lib\config.py:79 msgid "Configuration" msgstr "Configuration" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "&Nom :" #: lib\config.py:95 msgid "E-&mail:" msgstr "E-mail :" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "&Parcourir..." #: lib\config.py:108 msgid "&Editor:" msgstr "&Éditeur" #: lib\config.py:116 msgid "E-mail &client:" msgstr "" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "Synonyme" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "Commandes" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "Supprimer" #: lib\config.py:158 msgid "Abbreviation" msgstr "Abréviation" #: lib\config.py:158 msgid "URL" msgstr "URL" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "Applications de comparaison externes :" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "Nom" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "Général" #: lib\config.py:242 msgid "Aliases" msgstr "Synonymes" #: lib\config.py:243 msgid "Bug Trackers" msgstr "" #: lib\config.py:244 msgid "&User Interface" msgstr "Interface utilisateur" #: lib\config.py:245 msgid "&Diff" msgstr "" #: lib\config.py:246 msgid "&Merge" msgstr "&Fusionner" #: lib\config.py:271 msgid "Spell check &language:" msgstr "Correction d'orthographe $language" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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 "Parcourir…" #: lib\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "Application de comparaison par défaut" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "Conflits" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "Fichier" #: lib\conflicts.py:62 msgid "Conflict" msgstr "Conflit" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "&Démarrer..." #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "Outil d&e fusion :" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "Résoudre automatiquement" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "Conflit de &fusion" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "Marquer comme &résolu" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "%d conflit résolu automatiquement." msgstr[1] "%d conflits résolus automatiquement." #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "&OK" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "Tous les conflits on été résolus." #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "Erreur lors de l'exécution de l'application de fusion (code %d)" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "Erreur" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" #: lib\conflicts.py:310 msgid "path conflict" msgstr "conflit sur le chemin" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "conflit sur le contenu" #: lib\conflicts.py:312 msgid "text conflict" msgstr "conflit sur le texte" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "id en doublon" #: lib\conflicts.py:314 msgid "duplicate" msgstr "dupliquer" #: lib\conflicts.py:315 msgid "parent loop" msgstr "" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "" #: lib\conflicts.py:317 msgid "missing parent" msgstr "parent manquant" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "suppression du parent" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "Montrer les &différences" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "supprimé" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "ajouté(e)" #: lib\diff.py:266 msgid "renamed and modified" msgstr "renommé et modifié" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "renommé" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "modifié" #: lib\diffview.py:461 msgid "Last modified:" msgstr "Dernière modification :" #: lib\diffview.py:462 msgid "Status:" msgstr "État :" #: lib\diffview.py:463 msgid "Kind:" msgstr "Type :" #: lib\diffview.py:464 msgid "Properties:" msgstr "Propriétés :" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "\\ Pas de retour à la ligne à la fin du fichier" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "Arbre de travail pour %s" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "Arbre de Travail" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "Version %(rev)s pour la branche %(branch)s" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "Aperçu de la fusion" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "&Actualiser" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "%d fichier" msgstr[1] "%d fichiers" #: lib\diffwindow.py:453 #, python-format msgid "" "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:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "&Fermer" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "Aucun changement détecté." #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "" #: lib\encoding_selector.py:77 #, python-format msgid "Encoding \"%s\" is invalid or not supported." msgstr "" #: lib\export.py:61 lib\export.py:80 msgid "Export" msgstr "Exporter" #: lib\export.py:75 lib\uncommit.py:51 #, python-format msgid "Branch: %s" msgstr "Branche: %s" #: 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:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "Options" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" msgstr "" #: lib\help.py:59 #, python-format msgid "No help can be found for %s" msgstr "Aucune aide ne peut être trouvée pour %s" #: lib\help.py:103 msgid "Help" msgstr "Aide" #: lib\i18n.py:95 msgid "file" msgstr "fichier" #: lib\i18n.py:96 msgid "directory" msgstr "dossier" #: lib\i18n.py:97 msgid "symlink" msgstr "lien symbolique" #: lib\i18n.py:99 msgid "fixed" msgstr "" #: lib\i18n.py:101 msgid "View text file" msgstr "Voir le fichier texte" #: lib\i18n.py:102 msgid "View image file" msgstr "Voir le fichier image" #: lib\i18n.py:103 msgid "View binary file" msgstr "Voir le fichier binaire" #: lib\i18n.py:104 msgid "View symlink" msgstr "Voir le lien symbolique" #: lib\i18n.py:105 msgid "View directory" msgstr "Voir le répertoire" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "Aucuns changements sélectionnés pour l'enregistrement" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "Aucuns changements sélectionnés pour l'annulation" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "Information" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "Initialiser" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "Journal" #: lib\log.py:142 msgid "&Search:" msgstr "&Rechercher :" #: lib\log.py:158 msgid "Messages" msgstr "Messages" #: lib\log.py:160 msgid "Authors" msgstr "Auteurs" #: lib\log.py:162 msgid "Revision IDs" msgstr "" #: lib\log.py:164 msgid "Revision Numbers" msgstr "Numéro d'enregistrement" #: lib\log.py:166 msgid "Tags" msgstr "Étiquettes" #: lib\log.py:168 msgid "Bugs" msgstr "Bogues" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "Montrer les &différences…" #: lib\log.py:575 msgid "View file" msgstr "Voir le fichier" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "Version" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "Date" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Auteur" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "bogue #%s" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "" #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "" #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "" #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "" #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "Rétablir" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" msgstr "" #: lib\main.py:120 msgid "Computer" msgstr "Ordinateur" #: lib\main.py:149 msgid "&Edit Bookmark..." msgstr "&Éditer le signet..." #: lib\main.py:150 msgid "&Remove Bookmark..." msgstr "&Supprimer le signet..." #: lib\main.py:165 msgid "Bookmarks" msgstr "Signets" #: lib\main.py:276 msgid "Refresh the directory tree" msgstr "Actualiser l'arbre des répertoires" #: 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 "&Ajouter un signet..." #: lib\main.py:301 msgid "&File" msgstr "&Fichier" #: lib\main.py:302 msgid "&Configure..." msgstr "&Configurer..." #: lib\main.py:304 msgid "&Quit" msgstr "&Quitter" #: lib\main.py:305 msgid "&View" msgstr "&Afficher" #: lib\main.py:307 msgid "&Branch" msgstr "&Branche" #: lib\main.py:311 msgid "&Bookmarks" msgstr "&Signets" #: lib\main.py:313 lib\util.py:72 msgid "&Help" msgstr "&Aide" #: lib\main.py:314 msgid "&Help..." msgstr "&Aide..." #: lib\main.py:316 msgid "&About..." msgstr "&À propos de..." #: lib\main.py:354 msgid "Size" msgstr "Taille" #: lib\main.py:406 msgid "About QBzr" msgstr "À propos de QBzr" #: 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 "Ajouter un signet" #: lib\main.py:483 msgid "Edit Bookmark" msgstr "Éditer le signet" #: lib\main.py:493 msgid "Remove Bookmark" msgstr "Supprimer le signet" #: lib\main.py:494 msgid "Do you really want to remove the selected bookmark?" msgstr "Voulez-vous réellement supprimer le signet sélectionné?" #: lib\plugins.py:44 msgid "Plugins" msgstr "" #: lib\plugins.py:57 msgid "Version" msgstr "" #: lib\plugins.py:58 lib\subprocess.py:480 msgid "Description" msgstr "Description" #: 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 "Résumé" #: lib\plugins.py:72 lib\ui_branch.py:100 msgid "Locations" msgstr "" #: lib\plugins.py:111 msgid "(no description)" msgstr "" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "" "L'arborescence du travail contient des modifications non-enregistrées" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "" "L'arbre de travail n'est pas à jour, merci d'exécuter la commande 'bzr " "update'" #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "Voulez vous quand même continuer ?" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "Ne pas enregistrer les sauvegarde des fichiers récupérés" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "" "Voir les changements dans les fichiers sélectionnés pour la récupération" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "Parents :" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "Enfants :" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "Date :" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "Auteur :" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "Branche :" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "Étiquettes :" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "Bogues :" msgstr[1] "Bugs :" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "" #: lib\run.py:98 msgid "Select working directory" msgstr "" #: lib\run.py:119 msgid "&Edit" msgstr "" #: lib\run.py:167 msgid "Help for command" msgstr "" #: lib\run.py:287 msgid "Select path to insert" msgstr "" #: lib\run.py:297 msgid "Select files to insert" msgstr "" #: lib\send.py:34 msgid "Send" msgstr "Envoyer" #: lib\send.py:47 msgid "Merge Directive Options" msgstr "" #: lib\send.py:53 msgid "Submit Branch:" msgstr "Soumettre la branche :" #: lib\send.py:77 msgid "Public Branch:" msgstr "" #: lib\send.py:99 msgid "Remember these locations as defaults" msgstr "Se souvenir de cet emplacement par défaut" #: 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 "Action" #: lib\send.py:122 msgid "Address:" msgstr "" #: lib\send.py:132 msgid "Message:" msgstr "Message :" #: lib\send.py:149 msgid "Filename:" msgstr "Nom de fichier :" #: lib\send.py:163 msgid "Revisions:" msgstr "" #: lib\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "" #: lib\subprocess.py:518 msgid "Ready" msgstr "" #: lib\subprocess.py:591 msgid "Starting..." msgstr "Démarrage..." #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "Interruption en cours..." #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "Terminé !" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "Saisir le mot de passe" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "Échec !" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "" #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "Erreur lors de l'exécution de bzr. Code d'erreur : %d" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "" #: lib\switch.py:46 msgid "Switch" msgstr "" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "Information Système" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "ignoré" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "" #: lib\treewidget.py:327 msgid "added, missing" msgstr "" #: lib\treewidget.py:333 msgid "missing" msgstr "manquant" #: lib\treewidget.py:340 msgid "moved" msgstr "" #: lib\treewidget.py:346 msgid "x-bit" msgstr "" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "Nom de fichier" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "Inchangé" #: lib\treewidget.py:1303 msgid "Changed" msgstr "Modifié" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "Ignoré" #: lib\treewidget.py:1682 msgid "&Open" msgstr "&Ouvrir" #: lib\treewidget.py:1685 msgid "&View file" msgstr "" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "" #: lib\treewidget.py:1714 msgid "&Add" msgstr "&Ajouter" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "&Revenir" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "&Emplacement  :" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "&À :" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "&Révision :" #: lib\ui_info.py:87 msgid "..." msgstr "..." #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" msgstr "" #: lib\ui_init.py:119 msgid "Local Directory" msgstr "Dossier local" #: lib\ui_init.py:121 msgid "Repository" msgstr "Dépôt" #: 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 "Créer un nouveau répertoire partagé" #: lib\ui_init.py:125 msgid "Skip the creation of working trees in this repository" msgstr "Sauter la création de l'arbre de travail pour de dépôt" #: lib\ui_init.py:131 msgid "Repository Format:" msgstr "FOrmat de dépôt :" #: lib\ui_init.py:132 msgid "Description of format" msgstr "" #: lib\ui_merge.py:62 msgid "Merge" msgstr "Fusionner" #: lib\ui_merge.py:67 lib\ui_pull.py:65 lib\ui_push.py:66 msgid "Remember this location as a default" msgstr "Se souvenir de cet emplacement par défaut" #: 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" msgstr "" #: lib\ui_new_tree.py:129 msgid "Create a new Bazaar Working Tree" msgstr "Créer un nouvel arbre de travail Bazaar" #: 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:62 msgid "Push" msgstr "Publier" #: 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:107 msgid "Run bzr command" msgstr "" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "" #: lib\ui_run.py:112 msgid "&Command:" msgstr "" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "" #: lib\ui_run.py:116 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:47 msgid "Unbind" msgstr "" #: lib\unbind.py:55 msgid "Bound to:" msgstr "" #: lib\uncommit.py:40 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:70 msgid "&Cancel" msgstr "&Annuler" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "Choisir le répertoire source" #: lib\util.py:585 msgid "Select Target Directory" msgstr "Choisir le répertoire cible" #: lib\util.py:726 msgid "deleted files" msgstr "fichiers supprimés" #: lib\util.py:728 msgid "added files" msgstr "fichiers ajoutés" #: lib\util.py:730 msgid "renamed files" msgstr "fichiers renommés" #: lib\util.py:732 msgid "modified files" msgstr "fichiers modifiés" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "(aucun message)" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "Complet" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" #~ msgid "[binary file]" #~ msgstr "[fichier binaire]" #~ msgid "No changes to commit." #~ msgstr "Pas de modifications à commiter." #~ msgid "You should provide commit message." #~ msgstr "Vous devriez fournir un message pour l'enregistrement." #~ msgid "External Merge Apps:" #~ msgstr "Applications de fusion externes :" #~ msgid "Use Configured Default" #~ msgstr "Utiliser les paramètres par défaut" #~ msgid "Side by side" #~ msgstr "Côte à côte" #~ msgid "You must specify a location" #~ msgstr "Vous devez entrer un emplacement" #~ msgid "&No" #~ msgstr "&Non" #~ msgid "&Yes" #~ msgstr "&Oui" #~ msgid "Cre&ate" #~ msgstr "Cré&er" #~ msgid "Repository format:" #~ msgstr "Format de dépôt :" #~ msgid "&Format" #~ msgstr "&Format" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-gl.po0000644000000000000000000012446514556556456013212 0ustar00# Galician translation for qbzr # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the qbzr package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-12 16:38+0300\n" "PO-Revision-Date: 2009-10-08 15:32+0000\n" "Last-Translator: Fran 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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Engadir" #: lib\add.py:57 msgid "Unversioned Files" msgstr "Ficheiros non versionados" #: lib\add.py:106 msgid "Show ignored files" msgstr "Mostrar ficheiros ignorados" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "Annotate" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "A cargar..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "Revisión %s" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "" #: lib\annotate.py:762 msgid "Go" msgstr "" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 msgid "&Annotate this revision" msgstr "&Anotar esta revisión" #: lib\bind.py:44 msgid "Bind branch" msgstr "Ligar rama" #: lib\bind.py:54 msgid "Bind" msgstr "Ligar" #: lib\bind.py:56 msgid "Branch location:" msgstr "Localización da rama:" #: lib\bind.py:60 msgid "Currently bound to:" msgstr "Ligada actualmente a:" #: lib\bind.py:64 msgid "Bind to:" msgstr "" #: lib\bind.py:68 lib\browse.py:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Examinar" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "" #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Ubicación:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "Revisión:" #: lib\browse.py:84 msgid "Show" msgstr "Amosar" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "Entregar" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "" #: lib\commit.py:259 msgid "&Local commit" msgstr "" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" #: lib\commit.py:265 msgid "Description:" msgstr "" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "Mensaxe" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "" #: lib\commit.py:364 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:374 msgid "&Author:" msgstr "&Autor:" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" "Introduza o nome do autor, p.ex. Pepe Perez <:pepe@exemplo.com>:" #: lib\commit.py:393 msgid "Changes" msgstr "Cambios" #: lib\commit.py:410 msgid "Pending Merges" msgstr "" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "Estado" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" #: lib\commit.py:745 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:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "" #: lib\config.py:49 msgid "Default" msgstr "Predeterminado" #: lib\config.py:50 msgid "Thunderbird" msgstr "Thunderbird" #: lib\config.py:51 msgid "Evolution" msgstr "Evolution" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "Mutt" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "Cliente de correo-e XDG" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "Cliente de correo-e MAPI" #: lib\config.py:56 msgid "Editor" msgstr "Editor" #: lib\config.py:79 msgid "Configuration" msgstr "Configuración" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "&Nome:" #: lib\config.py:95 msgid "E-&mail:" msgstr "C&orreo-e" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "" #: lib\config.py:108 msgid "&Editor:" msgstr "&Editor:" #: lib\config.py:116 msgid "E-mail &client:" msgstr "&Cliente de correo-e" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "Alcume" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "Orde" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "Eliminar" #: lib\config.py:158 msgid "Abbreviation" msgstr "Abreviatura" #: lib\config.py:158 msgid "URL" msgstr "URL" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "Nome" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "Xeral" #: lib\config.py:242 msgid "Aliases" msgstr "Alcumes" #: lib\config.py:243 msgid "Bug Trackers" msgstr "" #: lib\config.py:244 msgid "&User Interface" msgstr "" #: lib\config.py:245 msgid "&Diff" msgstr "" #: lib\config.py:246 msgid "&Merge" msgstr "" #: lib\config.py:271 msgid "Spell check &language:" msgstr "" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "Ficheiro" #: lib\conflicts.py:62 msgid "Conflict" msgstr "" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "" #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "" msgstr[1] "" #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "&Aceptar" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "" #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" #: lib\conflicts.py:310 msgid "path conflict" msgstr "" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "" #: lib\conflicts.py:312 msgid "text conflict" msgstr "" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "" #: lib\conflicts.py:314 msgid "duplicate" msgstr "" #: lib\conflicts.py:315 msgid "parent loop" msgstr "" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "" #: lib\conflicts.py:317 msgid "missing parent" msgstr "" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "borrado" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "engadido" #: lib\diff.py:266 msgid "renamed and modified" msgstr "renomeado e modificado" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "renomeado" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "modificado" #: lib\diffview.py:461 msgid "Last modified:" msgstr "Última modificación:" #: lib\diffview.py:462 msgid "Status:" msgstr "Estado" #: lib\diffview.py:463 msgid "Kind:" msgstr "Tipo:" #: lib\diffview.py:464 msgid "Properties:" msgstr "Propiedades" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "\\ Sin liña nova no fin do ficheiro" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "Actualiza&r" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "ficheiro %d" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "&Pechar" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "" #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "" #: lib\encoding_selector.py:77 #, 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:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "Opcións" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" 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:95 msgid "file" msgstr "ficheiro" #: lib\i18n.py:96 msgid "directory" msgstr "directorio" #: lib\i18n.py:97 msgid "symlink" msgstr "ligazón simbólica" #: lib\i18n.py:99 msgid "fixed" msgstr "fixo" #: lib\i18n.py:101 msgid "View text file" msgstr "Ver ficheiro de texto" #: lib\i18n.py:102 msgid "View image file" msgstr "Ver ficheiro de imaxe" #: lib\i18n.py:103 msgid "View binary file" msgstr "Ver ficheiro binario" #: lib\i18n.py:104 msgid "View symlink" msgstr "Ver ligazón sinmbólica" #: lib\i18n.py:105 msgid "View directory" msgstr "Ver directorio" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "Rexistro" #: lib\log.py:142 msgid "&Search:" msgstr "&Busca" #: lib\log.py:158 msgid "Messages" msgstr "Mensaxes" #: lib\log.py:160 msgid "Authors" msgstr "Autores/as" #: lib\log.py:162 msgid "Revision IDs" msgstr "IDs de revisión" #: lib\log.py:164 msgid "Revision Numbers" msgstr "Números de revisión" #: lib\log.py:166 msgid "Tags" msgstr "" #: lib\log.py:168 msgid "Bugs" msgstr "" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "Amosar &diferencias..." #: lib\log.py:575 msgid "View file" msgstr "Ver o ficheiro" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "Revisión" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "Data" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Autor" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "" #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "" #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "Amosar ar&bore" #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "" #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "Reverter" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" msgstr "" #: lib\main.py:120 msgid "Computer" msgstr "Computador" #: lib\main.py:149 msgid "&Edit Bookmark..." msgstr "&Editar marcapáxinas..." #: lib\main.py:150 msgid "&Remove Bookmark..." msgstr "Elimina&r marcapáxinas" #: lib\main.py:165 msgid "Bookmarks" msgstr "Marca páxinas" #: lib\main.py:276 msgid "Refresh the directory tree" msgstr "Acrualizar a árbore do directorio" #: lib\main.py:280 msgid "&Commit" msgstr "&Entregar" #: lib\main.py:281 msgid "Commit changes into a new revision" msgstr "" #: lib\main.py:285 msgid "&Push" msgstr "&Empuxar" #: lib\main.py:286 msgid "Turn this branch into a mirror of another branch" msgstr "" #: lib\main.py:290 msgid "Pu&ll" msgstr "&Tirar" #: lib\main.py:291 msgid "Update a mirror of this branch" msgstr "" #: lib\main.py:294 msgid "&Add Bookmark..." msgstr "Eng&adir marca páxinas..." #: lib\main.py:301 msgid "&File" msgstr "&Ficheiro" #: lib\main.py:302 msgid "&Configure..." msgstr "Configurar..." #: lib\main.py:304 msgid "&Quit" msgstr "&Saír" #: lib\main.py:305 msgid "&View" msgstr "&Ver" #: lib\main.py:307 msgid "&Branch" msgstr "" #: lib\main.py:311 msgid "&Bookmarks" msgstr "&Marca páxinas" #: lib\main.py:313 lib\util.py:72 msgid "&Help" msgstr "A&xuda" #: lib\main.py:314 msgid "&Help..." msgstr "A&xuda" #: lib\main.py:316 msgid "&About..." msgstr "&Acerca de..." #: lib\main.py:354 msgid "Size" msgstr "Tamaño" #: lib\main.py:406 msgid "About QBzr" msgstr "Acerca de QBzr" #: 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 "Engadir marca páxinas" #: lib\main.py:483 msgid "Edit Bookmark" msgstr "Editar marca páxinas" #: lib\main.py:493 msgid "Remove Bookmark" msgstr "Eliminar marca páxinas" #: lib\main.py:494 msgid "Do you really want to remove the selected bookmark?" msgstr "Desexa eliminar o marca páxinas seleccionado?" #: lib\plugins.py:44 msgid "Plugins" msgstr "" #: lib\plugins.py:57 msgid "Version" msgstr "" #: lib\plugins.py:58 lib\subprocess.py:480 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 "Resumo" #: lib\plugins.py:72 lib\ui_branch.py:100 msgid "Locations" msgstr "" #: lib\plugins.py:111 msgid "(no description)" msgstr "" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "" #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "Pdres:" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "Hijos:" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "Autor:" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "Etiquetas:" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "" msgstr[1] "" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "" #: lib\run.py:98 msgid "Select working directory" msgstr "" #: lib\run.py:119 msgid "&Edit" msgstr "" #: lib\run.py:167 msgid "Help for command" msgstr "" #: lib\run.py:287 msgid "Select path to insert" msgstr "" #: lib\run.py:297 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\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "" #: lib\subprocess.py:518 msgid "Ready" msgstr "" #: lib\subprocess.py:591 msgid "Starting..." msgstr "A iniciar..." #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "Interrumpindo..." #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "Rematado!" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "Fallou!" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "Atopouse un fallo ao iniciar bzr." #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "Produciuse un erro ao executar bzr (código de erro: %d)" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "" #: lib\switch.py:46 msgid "Switch" msgstr "" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "" #: lib\treewidget.py:327 msgid "added, missing" msgstr "" #: lib\treewidget.py:333 msgid "missing" msgstr "" #: lib\treewidget.py:340 msgid "moved" msgstr "" #: lib\treewidget.py:346 msgid "x-bit" msgstr "" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "" #: lib\treewidget.py:1303 msgid "Changed" msgstr "" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "" #: lib\treewidget.py:1682 msgid "&Open" msgstr "" #: lib\treewidget.py:1685 msgid "&View file" msgstr "" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "" #: lib\treewidget.py:1714 msgid "&Add" msgstr "" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "&Ubicación" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "&Para:" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "&Revisión:" #: lib\ui_info.py:87 msgid "..." msgstr "" #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" 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 "Lembre esta ubicación como predeterminada" #: 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" 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:62 msgid "Push" msgstr "Empuxar" #: lib\ui_push.py:68 msgid "Use existing directory" msgstr "Usar un directorio existente" #: lib\ui_push.py:69 msgid "Create the path up to the branch if it does not exist" msgstr "" #: lib\ui_run.py:107 msgid "Run bzr command" msgstr "" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "" #: lib\ui_run.py:112 msgid "&Command:" msgstr "" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "" #: lib\ui_run.py:116 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:47 msgid "Unbind" msgstr "" #: lib\unbind.py:55 msgid "Bound to:" msgstr "" #: lib\uncommit.py:40 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:70 msgid "&Cancel" msgstr "&Cancelar" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "" #: lib\util.py:585 msgid "Select Target Directory" msgstr "" #: lib\util.py:726 msgid "deleted files" msgstr "ficheiros borrados" #: lib\util.py:728 msgid "added files" msgstr "ficheiros engadidos" #: lib\util.py:730 msgid "renamed files" msgstr "ficheiros renomeados" #: lib\util.py:732 msgid "modified files" msgstr "ficheiros modificados" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" #~ msgid "[binary file]" #~ msgstr "[ficheiro binario]" #~ msgid "Side by side" #~ msgstr "lado a lado" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-he.po0000644000000000000000000012542414556556456013200 0ustar00# Hebrew translation for qbzr # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the qbzr package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-12 16:38+0300\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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "" #: lib\add.py:57 msgid "Unversioned Files" msgstr "" #: lib\add.py:106 msgid "Show ignored files" msgstr "" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "" #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "" #: lib\annotate.py:762 msgid "Go" msgstr "" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 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:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "בחר את מיקום הענף" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "" #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "" #: lib\browse.py:84 msgid "Show" msgstr "" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "ענף" #: lib\commit.py:259 msgid "&Local commit" msgstr "" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" #: lib\commit.py:265 msgid "Description:" msgstr "" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "" #: lib\commit.py:364 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:374 msgid "&Author:" msgstr "" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" #: lib\commit.py:393 msgid "Changes" msgstr "" #: lib\commit.py:410 msgid "Pending Merges" msgstr "" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "מצב" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" #: lib\commit.py:745 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:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "שוני" #: lib\config.py:49 msgid "Default" msgstr "" #: lib\config.py:50 msgid "Thunderbird" msgstr "" #: lib\config.py:51 msgid "Evolution" msgstr "" #: lib\config.py:52 msgid "KMail" msgstr "" #: lib\config.py:53 msgid "Mutt" msgstr "" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "" #: lib\config.py:56 msgid "Editor" msgstr "" #: lib\config.py:79 msgid "Configuration" msgstr "" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "" #: lib\config.py:95 msgid "E-&mail:" msgstr "" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "&עיון..." #: lib\config.py:108 msgid "&Editor:" msgstr "" #: lib\config.py:116 msgid "E-mail &client:" msgstr "" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "" #: lib\config.py:158 msgid "Abbreviation" msgstr "" #: lib\config.py:158 msgid "URL" msgstr "" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "" #: lib\config.py:242 msgid "Aliases" msgstr "" #: lib\config.py:243 msgid "Bug Trackers" msgstr "" #: lib\config.py:244 msgid "&User Interface" msgstr "" #: lib\config.py:245 msgid "&Diff" msgstr "" #: lib\config.py:246 msgid "&Merge" msgstr "" #: lib\config.py:271 msgid "Spell check &language:" msgstr "" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "קובץ" #: lib\conflicts.py:62 msgid "Conflict" msgstr "" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "" #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "" msgstr[1] "" #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "" #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "שגיאה" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" #: lib\conflicts.py:310 msgid "path conflict" msgstr "" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "" #: lib\conflicts.py:312 msgid "text conflict" msgstr "" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "" #: lib\conflicts.py:314 msgid "duplicate" msgstr "" #: lib\conflicts.py:315 msgid "parent loop" msgstr "" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "" #: lib\conflicts.py:317 msgid "missing parent" msgstr "" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "הוסר" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "נוסף" #: lib\diff.py:266 msgid "renamed and modified" msgstr "שונה שמו או ששונה" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "שונה שמו" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "עודכן" #: lib\diffview.py:461 msgid "Last modified:" msgstr "" #: lib\diffview.py:462 msgid "Status:" msgstr "" #: lib\diffview.py:463 msgid "Kind:" msgstr "" #: lib\diffview.py:464 msgid "Properties:" msgstr "" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "עץ העבודה עבור %s" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "עץ העבודה" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "מהדורה %(rev)s עבור %(branch)s" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "מהדורה %s" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "מזהה מהדורה: %s" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "תצוגה מקדימה של המיזוג" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "שינויי אחידות" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "רע&נן" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "קובץ %d" msgstr[1] "%d קבצים" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" "הקובץ %s אינו מכיל גירסה.\n" "הפעולה בוטלה." #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "ס&גור" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "" #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "" #: lib\encoding_selector.py:77 #, 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:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "אפשרויות" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" msgstr "" #: lib\help.py:59 #, python-format msgid "No help can be found for %s" msgstr "לא ניתן למצוא עזרה עבור %s" #: lib\help.py:103 msgid "Help" msgstr "עזרה" #: lib\i18n.py:95 msgid "file" msgstr "קובץ" #: lib\i18n.py:96 msgid "directory" msgstr "תיקייה" #: lib\i18n.py:97 msgid "symlink" msgstr "קישור סמלי" #: lib\i18n.py:99 msgid "fixed" msgstr "קבוע" #: lib\i18n.py:101 msgid "View text file" msgstr "צפיה בקובץ טקסט" #: lib\i18n.py:102 msgid "View image file" msgstr "צפיה בקובץ תמונה" #: lib\i18n.py:103 msgid "View binary file" msgstr "צפיה בקובץ בינארי" #: lib\i18n.py:104 msgid "View symlink" msgstr "צפיה בקישור סמלי" #: lib\i18n.py:105 msgid "View directory" msgstr "צפיה בתיקייה" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "מידע" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "הפעל" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "" #: lib\log.py:142 msgid "&Search:" msgstr "" #: lib\log.py:158 msgid "Messages" msgstr "" #: lib\log.py:160 msgid "Authors" msgstr "" #: lib\log.py:162 msgid "Revision IDs" msgstr "" #: lib\log.py:164 msgid "Revision Numbers" msgstr "" #: lib\log.py:166 msgid "Tags" msgstr "" #: lib\log.py:168 msgid "Bugs" msgstr "" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "הצג &שינויים..." #: lib\log.py:575 msgid "View file" msgstr "" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "" #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "" #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "" #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "" #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "ה&חזר" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" 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: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:72 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:480 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 lib\ui_branch.py:100 msgid "Locations" msgstr "" #: lib\plugins.py:111 msgid "(no description)" msgstr "" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "" #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "" msgstr[1] "" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "" #: lib\run.py:98 msgid "Select working directory" msgstr "" #: lib\run.py:119 msgid "&Edit" msgstr "" #: lib\run.py:167 msgid "Help for command" msgstr "" #: lib\run.py:287 msgid "Select path to insert" msgstr "" #: lib\run.py:297 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\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "" #: lib\subprocess.py:518 msgid "Ready" msgstr "" #: lib\subprocess.py:591 msgid "Starting..." msgstr "מתחיל..." #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "מבטל..." #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "הסתיים!" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "נכשל!" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "כשל בהפעלת bzr." #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "שגיאה בעת הרצת bzr. (קוד השגיאה: %d)" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "" #: lib\switch.py:46 msgid "Switch" msgstr "" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "עליך לציין שם תגית" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" "התגית \"%s\" אינה קיימת עדיין.\n" "האם ברצונך ליצור תגית חדשה?" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "התגית \"%s\" אינה קיימת" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" "אינו ענף:\n" "%s" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "בהתעלמות" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "ללא גירסה" #: lib\treewidget.py:327 msgid "added, missing" msgstr "" #: lib\treewidget.py:333 msgid "missing" msgstr "חסר" #: lib\treewidget.py:340 msgid "moved" msgstr "" #: lib\treewidget.py:346 msgid "x-bit" msgstr "" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "" #: lib\treewidget.py:1303 msgid "Changed" msgstr "" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "" #: lib\treewidget.py:1682 msgid "&Open" msgstr "" #: lib\treewidget.py:1685 msgid "&View file" msgstr "" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "" #: lib\treewidget.py:1714 msgid "&Add" msgstr "" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "בחר / בטל בחירת הכל" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "מ&יקום:" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "&מהדורה:" #: lib\ui_info.py:87 msgid "..." msgstr "" #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" 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:62 msgid "Push" 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:107 msgid "Run bzr command" msgstr "" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "" #: lib\ui_run.py:112 msgid "&Command:" msgstr "" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "" #: lib\ui_run.py:116 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:47 msgid "Unbind" msgstr "" #: lib\unbind.py:55 msgid "Bound to:" msgstr "" #: lib\uncommit.py:40 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:70 msgid "&Cancel" msgstr "&ביטול" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "" #: lib\util.py:585 msgid "Select Target Directory" msgstr "" #: lib\util.py:726 msgid "deleted files" msgstr "" #: lib\util.py:728 msgid "added files" msgstr "" #: lib\util.py:730 msgid "renamed files" msgstr "" #: lib\util.py:732 msgid "modified files" msgstr "" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "הסתיים" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" #~ msgid "Side by side" #~ msgstr "זה לצד זה" #~ msgid "You must specify a location" #~ msgstr "עליך לציין מיקום" #~ msgid "Cre&ate" #~ msgstr "&צור" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-hu.po0000644000000000000000000012700314556556456013213 0ustar00# Hungarian 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: 2012-07-12 16:38+0300\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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Hozzáadás" #: lib\add.py:57 msgid "Unversioned Files" msgstr "Verzió nélküli fájlok" #: lib\add.py:106 msgid "Show ignored files" msgstr "Nem mutatott fájlok mutatása" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "Megjegyzésekkel ellát" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "Betöltés..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "Változat %s" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "" #: lib\annotate.py:762 msgid "Go" msgstr "" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 msgid "&Annotate this revision" msgstr "&Ezt a változatot megjegyzésekkel ellát" #: lib\bind.py:44 msgid "Bind branch" msgstr "Ág kötése" #: lib\bind.py:54 msgid "Bind" msgstr "Kötés" #: lib\bind.py:56 msgid "Branch location:" msgstr "Ág helye:" #: lib\bind.py:60 msgid "Currently bound to:" msgstr "Jelenleg ide van kötve:" #: lib\bind.py:64 msgid "Bind to:" msgstr "Kötés ide:" #: lib\bind.py:68 lib\browse.py:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Böngészés" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "Ág helyének kiválasztása" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "Mester ág helye nincs megadva" #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Hely:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "Változat:" #: lib\browse.py:84 msgid "Show" msgstr "Megjelenítés" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "S&zűrő" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "Nézet" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "Kódolás:" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "Ág" #: lib\commit.py:259 msgid "&Local commit" msgstr "" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" #: lib\commit.py:265 msgid "Description:" msgstr "Leírás:" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "Üzenet" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "Mutasd a verzió nélküli fájlokat" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "&Javított hibák:" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "" #: lib\commit.py:364 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:374 msgid "&Author:" msgstr "Sz&erző:" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "Írja be a szerző nevét, pl. John Doe <jdoe@pelda.com>" #: lib\commit.py:393 msgid "Changes" msgstr "Változtatások" #: lib\commit.py:410 msgid "Pending Merges" msgstr "Függőben levő összefűzések" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "Állapot" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" #: lib\commit.py:745 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:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "Eltérés" #: lib\config.py:49 msgid "Default" msgstr "Alapértelmezés" #: lib\config.py:50 msgid "Thunderbird" msgstr "Thunderbird" #: lib\config.py:51 msgid "Evolution" msgstr "Evolution" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "Mutt" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "XDG e-mail kliens" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "MAPI e-mail kliens" #: lib\config.py:56 msgid "Editor" msgstr "Szerkesztő" #: lib\config.py:79 msgid "Configuration" msgstr "Beállítások" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "&Név:" #: lib\config.py:95 msgid "E-&mail:" msgstr "E-&mail:" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "&Tallózás…" #: lib\config.py:108 msgid "&Editor:" msgstr "&Szerkesztő:" #: lib\config.py:116 msgid "E-mail &client:" msgstr "E-mail &kliens:" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "Álnév" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "Parancs" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "Eltávolítás" #: lib\config.py:158 msgid "Abbreviation" msgstr "Rövidítés" #: lib\config.py:158 msgid "URL" msgstr "URL" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "Név" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "Általános" #: lib\config.py:242 msgid "Aliases" msgstr "Álnevek" #: lib\config.py:243 msgid "Bug Trackers" msgstr "Hibakövetők" #: lib\config.py:244 msgid "&User Interface" msgstr "&Felhasználói felület" #: lib\config.py:245 msgid "&Diff" msgstr "" #: lib\config.py:246 msgid "&Merge" msgstr "&Összefűzés" #: lib\config.py:271 msgid "Spell check &language:" msgstr "&Nyelv helyesírás-ellenőrzése:" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "Ütközések" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "Fájl" #: lib\conflicts.py:62 msgid "Conflict" msgstr "Ütközés" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "&Indítás..." #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "Automatikus feloldás" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "" msgstr[1] "" #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "&OK" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "Minden ütközés feloldva" #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "Hiba" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" #: lib\conflicts.py:310 msgid "path conflict" msgstr "útvonalütközés" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "tartalmi ütközés" #: lib\conflicts.py:312 msgid "text conflict" msgstr "szövegütközés" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "kétszer előforduló azonosító" #: lib\conflicts.py:314 msgid "duplicate" msgstr "duplikátum" #: lib\conflicts.py:315 msgid "parent loop" msgstr "szülő ciklus" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "verzió nélküli szülő" #: lib\conflicts.py:317 msgid "missing parent" msgstr "hiényzó szülő" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "szülő törlése" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "szülő nem könyvtár" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "eltávolítva" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "hozzáadva" #: lib\diff.py:266 msgid "renamed and modified" msgstr "átnevezve és módosítva" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "átnevezve" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "módosítva" #: lib\diffview.py:461 msgid "Last modified:" msgstr "Utolsó módosítás:" #: lib\diffview.py:462 msgid "Status:" msgstr "Állapot:" #: lib\diffview.py:463 msgid "Kind:" msgstr "Típus:" #: lib\diffview.py:464 msgid "Properties:" msgstr "Tulajdonságok:" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "Munkafa" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "&Frissítés" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "%d fájl" msgstr[1] "%d fájlok" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "&Bezárás" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "Nem találtam változtatást." #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "" #: lib\encoding_selector.py:77 #, python-format msgid "Encoding \"%s\" is invalid or not supported." msgstr "" #: lib\export.py:61 lib\export.py:80 msgid "Export" msgstr "Exportálás" #: lib\export.py:75 lib\uncommit.py:51 #, python-format msgid "Branch: %s" msgstr "Ág: %s" #: lib\export.py:146 msgid "Archive type:" msgstr "Archívum típusa:" #: lib\export.py:168 msgid "Root directory name:" msgstr "Gyökérkönyvtár neve:" #: lib\export.py:236 lib\ui_branch.py:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "Beállítások" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" msgstr "" #: lib\help.py:59 #, python-format msgid "No help can be found for %s" msgstr "" #: lib\help.py:103 msgid "Help" msgstr "Súgó" #: lib\i18n.py:95 msgid "file" msgstr "fájl" #: lib\i18n.py:96 msgid "directory" msgstr "könyvtár" #: lib\i18n.py:97 msgid "symlink" msgstr "szimbolikus link" #: lib\i18n.py:99 msgid "fixed" msgstr "állandó" #: lib\i18n.py:101 msgid "View text file" msgstr "Szövegfájl megtekintése" #: lib\i18n.py:102 msgid "View image file" msgstr "Képfájl megtekintése" #: lib\i18n.py:103 msgid "View binary file" msgstr "Bináris fájl megtekintése" #: lib\i18n.py:104 msgid "View symlink" msgstr "Szimbolikus link megtekintése" #: lib\i18n.py:105 msgid "View directory" msgstr "Könyvtár megtekintése" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "Információ" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "Inicializálás" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "Napló" #: lib\log.py:142 msgid "&Search:" msgstr "Ke&resés:" #: lib\log.py:158 msgid "Messages" msgstr "Üzenetek" #: lib\log.py:160 msgid "Authors" msgstr "Szerzők" #: lib\log.py:162 msgid "Revision IDs" msgstr "" #: lib\log.py:164 msgid "Revision Numbers" msgstr "" #: lib\log.py:166 msgid "Tags" msgstr "Címkék" #: lib\log.py:168 msgid "Bugs" msgstr "Programhibák" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "" #: lib\log.py:575 msgid "View file" msgstr "Fájl megnézése" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "Dátum" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Szerző" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "hiba #%s" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "Összes mutatása &különbségek" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "" #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "" #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "" #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "" #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" msgstr "" #: lib\main.py:120 msgid "Computer" msgstr "Számítógép" #: lib\main.py:149 msgid "&Edit Bookmark..." msgstr "Könyvjelző &szerkesztése" #: lib\main.py:150 msgid "&Remove Bookmark..." msgstr "Könyvjelző #eltávolítása" #: lib\main.py:165 msgid "Bookmarks" msgstr "Könyvjelzők" #: lib\main.py:276 msgid "Refresh the directory tree" msgstr "Könyvtárfa frissítése" #: 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 "&Könyvjelző Hozzáadása..." #: lib\main.py:301 msgid "&File" msgstr "&Fájl" #: lib\main.py:302 msgid "&Configure..." msgstr "B&eállítások..." #: lib\main.py:304 msgid "&Quit" msgstr "Ki&lépés" #: lib\main.py:305 msgid "&View" msgstr "Né&zet" #: lib\main.py:307 msgid "&Branch" msgstr "Á&g" #: lib\main.py:311 msgid "&Bookmarks" msgstr "Könyv&jelzők" #: lib\main.py:313 lib\util.py:72 msgid "&Help" msgstr "&Súgó" #: lib\main.py:314 msgid "&Help..." msgstr "&Súgó..." #: lib\main.py:316 msgid "&About..." msgstr "&Névjegy..." #: lib\main.py:354 msgid "Size" msgstr "Méret" #: lib\main.py:406 msgid "About QBzr" msgstr "A QBzr Névjegye" #: 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 "Könyvjelző hozzáadása" #: lib\main.py:483 msgid "Edit Bookmark" msgstr "Könyvjelző Szerkesztése" #: lib\main.py:493 msgid "Remove Bookmark" msgstr "Könyvjelző Eltávolítása" #: 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:480 msgid "Description" msgstr "" #: lib\plugins.py:62 msgid "Directory" msgstr "" #: lib\plugins.py:64 #, python-format msgid "Plugins installed: %(rows)d" msgstr "Bővítmények telepítve: %(rows)d" #: lib\plugins.py:71 msgid "Summary" msgstr "" #: lib\plugins.py:72 lib\ui_branch.py:100 msgid "Locations" msgstr "" #: lib\plugins.py:111 msgid "(no description)" msgstr "" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "" #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "Szülők:" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "Kulcsszavak:" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "" msgstr[1] "" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "" #: lib\run.py:98 msgid "Select working directory" msgstr "" #: lib\run.py:119 msgid "&Edit" msgstr "" #: lib\run.py:167 msgid "Help for command" msgstr "" #: lib\run.py:287 msgid "Select path to insert" msgstr "" #: lib\run.py:297 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\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "&Újra" #: lib\subprocess.py:518 msgid "Ready" msgstr "" #: lib\subprocess.py:591 msgid "Starting..." msgstr "" #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "" #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "Jelszó Megadása" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "Felhasználónév Megadása" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "Sikertelen!" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "A bzr elindítása sikertelen." #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "Hiba a bzr futása közben. (Hibakód: %d)" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "Megszakítva!" #: lib\switch.py:46 msgid "Switch" msgstr "" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "Az \"%s\" cimke nem létezik." #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "kihagyva" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "" #: lib\treewidget.py:327 msgid "added, missing" msgstr "" #: lib\treewidget.py:333 msgid "missing" msgstr "" #: lib\treewidget.py:340 msgid "moved" msgstr "" #: lib\treewidget.py:346 msgid "x-bit" msgstr "" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "" #: lib\treewidget.py:1303 msgid "Changed" msgstr "" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "" #: lib\treewidget.py:1682 msgid "&Open" msgstr "" #: lib\treewidget.py:1685 msgid "&View file" msgstr "" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "" #: lib\treewidget.py:1714 msgid "&Add" msgstr "" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "" #: lib\ui_info.py:87 msgid "..." msgstr "" #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" msgstr "" #: lib\ui_init.py:119 msgid "Local Directory" msgstr "Helyi Könyvtár" #: 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 "A formátum leírása" #: 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" 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:62 msgid "Push" msgstr "" #: lib\ui_push.py:68 msgid "Use existing directory" 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" msgstr "" #: lib\ui_run.py:107 msgid "Run bzr command" msgstr "bzr parancs futtatása" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "&Munkakönyvtár:" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "K&ategória:" #: lib\ui_run.py:112 msgid "&Command:" msgstr "" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "&Rejtett parancsok megjelenítése" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "" #: lib\ui_run.py:116 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 "Cimke szerkesztése" #: lib\ui_tag.py:91 msgid "Tag" msgstr "" #: lib\ui_tag.py:92 msgid "&Action:" msgstr "&Művelet:" #: lib\ui_tag.py:93 msgid "Create new tag" msgstr "Új cimke létrehozása" #: lib\ui_tag.py:94 msgid "Move existing tag" msgstr "Meglévő cimke mozgatása" #: lib\ui_tag.py:95 msgid "Delete existing tag" msgstr "Meglévő cimke törlése" #: 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 "Forrás frissítése" #: 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:47 msgid "Unbind" msgstr "" #: lib\unbind.py:55 msgid "Bound to:" msgstr "" #: lib\uncommit.py:40 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:70 msgid "&Cancel" msgstr "" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "Forrás Könyvtár Kiválasztása" #: lib\util.py:585 msgid "Select Target Directory" msgstr "Célkönyvtár Kiválasztása" #: lib\util.py:726 msgid "deleted files" msgstr "törölt fájlok" #: lib\util.py:728 msgid "added files" msgstr "hozzáadott fájlok" #: lib\util.py:730 msgid "renamed files" msgstr "átnevezett fájlok" #: lib\util.py:732 msgid "modified files" msgstr "módosított fájlok" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "(nincs üzenet)" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" #~ msgid "Definition" #~ msgstr "Definíció" #~ msgid "[binary file]" #~ msgstr "[bináris fájl]" #~ msgid "Side by side" #~ msgstr "Egymás mellett" #~ msgid "You must specify a location" #~ msgstr "Meg kell adni egy helyet" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-it.po0000644000000000000000000014653514556556456013226 0ustar00# Italian translation for qbzr # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the qbzr package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-12 16:38+0300\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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Aggiungi" #: lib\add.py:57 msgid "Unversioned Files" msgstr "File non sotto il controllo di versione" #: lib\add.py:106 msgid "Show ignored files" msgstr "Mostra file ignorati" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "Annota" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "Caricamento..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "Revisione %s" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "" #: lib\annotate.py:762 msgid "Go" msgstr "" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 msgid "&Annotate this revision" msgstr "&Annota questa revisione" #: lib\bind.py:44 msgid "Bind branch" msgstr "Associa branch" #: lib\bind.py:54 msgid "Bind" msgstr "Associa" #: lib\bind.py:56 msgid "Branch location:" msgstr "Posizione branch:" #: lib\bind.py:60 msgid "Currently bound to:" msgstr "Attualmente associato a:" #: lib\bind.py:64 msgid "Bind to:" msgstr "Associa a:" #: lib\bind.py:68 lib\browse.py:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Esplora" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "Seleziona posizione branch" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "Posizione del branch principale non specificata." #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Posizione:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "Revisione:" #: lib\browse.py:84 msgid "Show" msgstr "Mostra" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "&Filtro" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "Visualizza" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "Codifica:" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "Commit" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "Branch" #: lib\commit.py:259 msgid "&Local commit" msgstr "Commit &locale" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" "I commit locali non vengono inviati al branch principale finché non viene " "eseguito un commit normale." #: lib\commit.py:265 msgid "Description:" msgstr "Descrizione:" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "Messaggio" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "Mostra i file non sotto il controllo di versione" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "Inserisci il messaggio" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "&Bug corretti:" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "Inserisci gli ID dei bug corretti in questo commit" #: lib\commit.py:364 msgid "" "Enter the list of bug IDs in format tag:id separated by a space, e.g. " "project:123 project:765" msgstr "" "Inserisci la lista degli ID dei bug corretti nel formato tag:id " "separati da uno spazio, per esempio progetto:123 progetto:765" #: lib\commit.py:374 msgid "&Author:" msgstr "&Autore:" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "Imposta l'autore di questa modifica, se diverso da chi la invia" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" "Inserisci il nome dell'autore, ad esempio John Doe " "<jdoe@example.com>" #: lib\commit.py:393 msgid "Changes" msgstr "Modifiche" #: lib\commit.py:410 msgid "Pending Merges" msgstr "Merge in sospeso" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "Stato" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "Visualizza modifiche nei file selezionati per il commit" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" "Nessuna modifica selezionata per il commit.\n" "Eseguire il commit lo stesso?" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" "Il commit viene eseguito direttamente al branch principale, mantenendo il " "branch locale e quello principale sincronizzati." #: lib\commit.py:745 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 "" "Verrà eseguito un commit al branch locale. Il branch principale non verrà " "aggiornato finché non verrà eseguito un commit non locale." #: lib\commit.py:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "Diff" #: lib\config.py:49 msgid "Default" msgstr "Predefinito" #: lib\config.py:50 msgid "Thunderbird" msgstr "Thunderbird" #: lib\config.py:51 msgid "Evolution" msgstr "Evolution" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "Mutt" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "Client e-mail XDG" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "Client e-mail MAPI" #: lib\config.py:56 msgid "Editor" msgstr "Editor" #: lib\config.py:79 msgid "Configuration" msgstr "Configurazione" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "&Nome:" #: lib\config.py:95 msgid "E-&mail:" msgstr "E-&mail:" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "Esplora..." #: lib\config.py:108 msgid "&Editor:" msgstr "&Editor:" #: lib\config.py:116 msgid "E-mail &client:" msgstr "&Client e-mail:" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "Alias" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "Comando" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "Rimuovi" #: lib\config.py:158 msgid "Abbreviation" msgstr "Abbreviazione" #: lib\config.py:158 msgid "URL" msgstr "URL" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" "Mostra inserimenti e eliminazioni nei gruppi interni in verde e rosso" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "Applicazioni Esterne per il Diff:" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "Nome" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "Generale" #: lib\config.py:242 msgid "Aliases" msgstr "Alias" #: lib\config.py:243 msgid "Bug Trackers" msgstr "Bug tracker" #: lib\config.py:244 msgid "&User Interface" msgstr "Interfaccia &utente" #: lib\config.py:245 msgid "&Diff" msgstr "&Diff" #: lib\config.py:246 msgid "&Merge" msgstr "&Merge" #: lib\config.py:271 msgid "Spell check &language:" msgstr "&Lingua correzione ortografica:" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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 "Esplora..." #: lib\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "Diff Integrato" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "Seleziona eseguibile editor" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "Conflitti" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "File" #: lib\conflicts.py:62 msgid "Conflict" msgstr "Conflitto" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "Avvia..." #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "Strumento m&erge:" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "Risolvi-automaticamente" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "Conflitto &merge" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "Marca come &risolto" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "%d conflitto risolto automaticamente." msgstr[1] "%d conflitti risolti automaticamente." #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "&OK" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "Tutti i conflitti risolti." #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "Errore durante l'esecuzione dello strumento merge (codice %d)" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "Errore" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "Imposta applicazione external_merge in qconfig nel tab Merge" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "Flag mancante: %s. Configurarlo in qconfig nel tab merge." #: lib\conflicts.py:310 msgid "path conflict" msgstr "conflitto di percorso" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "conflitto di contenuto" #: lib\conflicts.py:312 msgid "text conflict" msgstr "conflitto di testo" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "id duplicato" #: lib\conflicts.py:314 msgid "duplicate" msgstr "duplicato" #: lib\conflicts.py:315 msgid "parent loop" msgstr "ciclo genitore" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "genitore non sotto il controllo di versione" #: lib\conflicts.py:317 msgid "missing parent" msgstr "genitore mancante" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "eliminazione genitore" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "genitore non-cartella" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "Mostra &differenze" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "rimosso" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "aggiunto" #: lib\diff.py:266 msgid "renamed and modified" msgstr "rinominato e modificato" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "rinominato" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "modificato" #: lib\diffview.py:461 msgid "Last modified:" msgstr "Ultima modifica:" #: lib\diffview.py:462 msgid "Status:" msgstr "Stato:" #: lib\diffview.py:463 msgid "Kind:" msgstr "Tipo:" #: lib\diffview.py:464 msgid "Properties:" msgstr "Proprietà:" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "\\ Non c'è una linea vuota alla fine del file" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "Albero di lavoro per %s" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "Albero di Lavoro" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "Rev %(rev)s per %(branch)s" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "Rev %s" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "Revid: %(revid)s per %(branch)s" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "Revid: %s" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "Anteprima Merge" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "Differenze unificate" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "Aggio&rna" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "%d file" msgstr[1] "%d file" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" "Il file %s non è sotto il controllo di versione.\n" "Operazione abortita." #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "&Chiudi" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "Nessuna modifica trovata." #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "Codifica errata" #: lib\encoding_selector.py:77 #, python-format msgid "Encoding \"%s\" is invalid or not supported." msgstr "La codifica \"%s\" non è valida o non è supportata." #: lib\export.py:61 lib\export.py:80 msgid "Export" msgstr "Esporta" #: lib\export.py:75 lib\uncommit.py:51 #, python-format msgid "Branch: %s" msgstr "Branch: %s" #: lib\export.py:146 msgid "Archive type:" msgstr "Tipo di archivio:" #: lib\export.py:168 msgid "Root directory name:" msgstr "Nome cartella radice:" #: lib\export.py:236 lib\ui_branch.py:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "Opzioni" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" msgstr "" #: lib\help.py:59 #, python-format msgid "No help can be found for %s" msgstr "Nessuna guida può essere trovata per %s" #: lib\help.py:103 msgid "Help" msgstr "Guida" #: lib\i18n.py:95 msgid "file" msgstr "file" #: lib\i18n.py:96 msgid "directory" msgstr "cartella" #: lib\i18n.py:97 msgid "symlink" msgstr "collegamento simbolico" #: lib\i18n.py:99 msgid "fixed" msgstr "corretto" #: lib\i18n.py:101 msgid "View text file" msgstr "Mostra file di testo" #: lib\i18n.py:102 msgid "View image file" msgstr "Mostra immagine" #: lib\i18n.py:103 msgid "View binary file" msgstr "Mostra file binario" #: lib\i18n.py:104 msgid "View symlink" msgstr "Mostra collegamento simbolico" #: lib\i18n.py:105 msgid "View directory" msgstr "Mostra directory" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "Nessuna modifica selezionata per il commit" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "Nessuna modifica selezionata per il revert" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "Informazioni" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "Inizializza" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "Log" #: lib\log.py:142 msgid "&Search:" msgstr "&Cerca:" #: lib\log.py:158 msgid "Messages" msgstr "Messaggi" #: lib\log.py:160 msgid "Authors" msgstr "Autori" #: lib\log.py:162 msgid "Revision IDs" msgstr "ID Revisione" #: lib\log.py:164 msgid "Revision Numbers" msgstr "Numeri Revisione" #: lib\log.py:166 msgid "Tags" msgstr "Tag" #: lib\log.py:168 msgid "Bugs" msgstr "Bug" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "Testo Messaggi e File (indicizzato)" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "Mostra le &differenze" #: lib\log.py:575 msgid "View file" msgstr "Mostra il file" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "Rev" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "Data" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Autore" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "bug #%s" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "Mostra &differenze file" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "Mostra tutte le &differenze" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "Mostra &differenze file..." #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "Mostra tutte le &differenze..." #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "Mos&tra albero..." #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "Tag &revisione..." #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "Ripristina" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" msgstr "" #: lib\main.py:120 msgid "Computer" msgstr "Computer" #: lib\main.py:149 msgid "&Edit Bookmark..." msgstr "Modifica S&egnalibro..." #: lib\main.py:150 msgid "&Remove Bookmark..." msgstr "&Rimuovi Segnalibro..." #: lib\main.py:165 msgid "Bookmarks" msgstr "Segnalibri" #: lib\main.py:276 msgid "Refresh the directory tree" msgstr "Aggiorna l'albero della directory" #: lib\main.py:280 msgid "&Commit" msgstr "&Commit" #: lib\main.py:281 msgid "Commit changes into a new revision" msgstr "Esegui commit in una nuova revisione" #: lib\main.py:285 msgid "&Push" msgstr "&Push" #: lib\main.py:286 msgid "Turn this branch into a mirror of another branch" msgstr "Trasforma queto branch in una copia di un altro branch" #: lib\main.py:290 msgid "Pu&ll" msgstr "Pu&ll" #: lib\main.py:291 msgid "Update a mirror of this branch" msgstr "Aggiorna una copia di questo branch" #: lib\main.py:294 msgid "&Add Bookmark..." msgstr "&Aggiungi Segnalibro" #: lib\main.py:301 msgid "&File" msgstr "&File" #: lib\main.py:302 msgid "&Configure..." msgstr "&Configura..." #: lib\main.py:304 msgid "&Quit" msgstr "C&hiudi" #: lib\main.py:305 msgid "&View" msgstr "&Visualizza" #: lib\main.py:307 msgid "&Branch" msgstr "&Branch" #: lib\main.py:311 msgid "&Bookmarks" msgstr "&Segnalibri" #: lib\main.py:313 lib\util.py:72 msgid "&Help" msgstr "&Aiuto" #: lib\main.py:314 msgid "&Help..." msgstr "&Guida..." #: lib\main.py:316 msgid "&About..." msgstr "Inform&azioni su..." #: lib\main.py:354 msgid "Size" msgstr "Dimensione" #: lib\main.py:406 msgid "About QBzr" msgstr "Informazioni su QBzr" #: 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 "" "QBzr — Un'interfaccia grafica per Bazaar
Versione " "%(qbzr_version)s (bzrlib %(bzrlib_version)s)

Copyright © 2006-" "2008 Lukáš Lalinský e altri

http://bazaar-vcs.org/QBzr" #: lib\main.py:472 msgid "Add Bookmark" msgstr "Aggiungi Segnalibro" #: lib\main.py:483 msgid "Edit Bookmark" msgstr "Modifica Segnalibro" #: lib\main.py:493 msgid "Remove Bookmark" msgstr "Rimuovi Segnalibro" #: lib\main.py:494 msgid "Do you really want to remove the selected bookmark?" msgstr "Si è sicuri di rimuovere il segnalibro selezionato?" #: lib\plugins.py:44 msgid "Plugins" msgstr "Plugin" #: lib\plugins.py:57 msgid "Version" msgstr "Versione" #: lib\plugins.py:58 lib\subprocess.py:480 msgid "Description" msgstr "Descrizione" #: lib\plugins.py:62 msgid "Directory" msgstr "Cartella" #: lib\plugins.py:64 #, python-format msgid "Plugins installed: %(rows)d" msgstr "Plugin installati: %(rows)d" #: lib\plugins.py:71 msgid "Summary" msgstr "Riepilogo" #: lib\plugins.py:72 lib\ui_branch.py:100 msgid "Locations" msgstr "Posizioni" #: lib\plugins.py:111 msgid "(no description)" msgstr "(nessuna descrizione)" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "L'albero di lavoro ha delle modifiche senza commit." #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "L'albero di lavoro non è aggiornato, eseguire 'bzr update'." #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "Continuare lo stesso?" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "Seleziona modifiche per il ripristino" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "Non salvare copie di backup dei file ripristinati" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "Dimentica merge in sospeso" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "Visualizza modifiche nei file selezionati per il ripristino" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "Genitori:" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "Figlio:" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "Modifiche Albero di Lavoro senza Commit" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "Data:" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "Autore:" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "Autore:" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "Branch:" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "Tag:" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "Bug:" msgstr[1] "Bug:" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "Revisione" #: lib\run.py:98 msgid "Select working directory" msgstr "Seleziona la cartella di lavoro" #: lib\run.py:119 msgid "&Edit" msgstr "Modifica" #: lib\run.py:167 msgid "Help for command" msgstr "Guida per il comando" #: lib\run.py:287 msgid "Select path to insert" msgstr "Seleziona il percorso da inserire" #: lib\run.py:297 msgid "Select files to insert" msgstr "Seleziona i file da inserire" #: lib\send.py:34 msgid "Send" msgstr "Invia" #: lib\send.py:47 msgid "Merge Directive Options" msgstr "Opzioni Direttiva Merge" #: lib\send.py:53 msgid "Submit Branch:" msgstr "Invia Branch:" #: lib\send.py:77 msgid "Public Branch:" msgstr "Branch Pubblico:" #: lib\send.py:99 msgid "Remember these locations as defaults" msgstr "Ricorda queste posizioni come predefinite" #: 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 "Includi un'anteprima di patch nella direttiva merge" #: lib\send.py:112 msgid "Action" msgstr "Azione" #: lib\send.py:122 msgid "Address:" msgstr "Indirizzo:" #: lib\send.py:132 msgid "Message:" msgstr "Messaggio:" #: lib\send.py:149 msgid "Filename:" msgstr "Nome file:" #: lib\send.py:163 msgid "Revisions:" msgstr "Revisioni:" #: lib\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "&Riprova" #: lib\subprocess.py:518 msgid "Ready" msgstr "Pronto" #: lib\subprocess.py:591 msgid "Starting..." msgstr "Avvio..." #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "Interruzione..." #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "Finito!" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "Inserire Password" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "Inserire Nome Utente" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "Non riuscito!" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "Impossibile avviare bzr." #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "Errore durante l'esecuzione di bzr. (codice di errore: %d)" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "Abortito!" #: lib\switch.py:46 msgid "Switch" msgstr "Cambia" #: lib\switch.py:57 msgid "Switch checkout" msgstr "Cambia checkout" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "Checkout pesante:" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "Checkout leggero:" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "Checkout del branch:" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "Cambia al branch:" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "Crea Branch prima del cambio" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "Informazioni Sistema" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "Occorre specificare il nome del tag" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" "Il tag \"%s\" già esiste.\n" "Spostare il tag esistente?" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" "Il tag \"%s\" non esiste.\n" "Si desidera creare un nuovo tag?" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "Il tag \"%s\" non esiste" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" "Non un branch:\n" "%s" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "ignorato" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "non sotto il controllo di versione" #: lib\treewidget.py:327 msgid "added, missing" msgstr "aggiunto, mancante" #: lib\treewidget.py:333 msgid "missing" msgstr "mancante" #: lib\treewidget.py:340 msgid "moved" msgstr "spostato" #: lib\treewidget.py:346 msgid "x-bit" msgstr "x-bit" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "Nome File" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "Non modificato" #: lib\treewidget.py:1303 msgid "Changed" msgstr "Modificato" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "Non controllato" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "Ignorato" #: lib\treewidget.py:1682 msgid "&Open" msgstr "Apri" #: lib\treewidget.py:1685 msgid "&View file" msgstr "&Visualizza file" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "Mostra &annotazioni" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "Mostra &log" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "Marca conflitto come &risolto" #: lib\treewidget.py:1714 msgid "&Add" msgstr "&Aggiungi" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "&Ripristina" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "Ri&nomina" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "&Marca come spostato e rinominato" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "&Marca come spostato" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "&Marca come rinominato" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "Effettuare il ripristino del/i file selezionato/i?" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "Merge Esterno" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "Seleziona / deseleziona tutto" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "Non un branch \"%s\"" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "Non esiste un albero di lavoro per \"%s\"" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "Posizione:" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "&A:" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "&Revisione:" #: lib\ui_info.py:87 msgid "..." msgstr "..." #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" msgstr "" #: lib\ui_init.py:119 msgid "Local Directory" msgstr "Cartella Locale" #: lib\ui_init.py:121 msgid "Repository" msgstr "Repository" #: lib\ui_init.py:122 msgid "Create a new standalone tree" msgstr "Crea un nuovo albero indipendente" #: lib\ui_init.py:123 msgid "Ensure all revisions are appended to the log" msgstr "Assicura che tutte le revisioni siano aggiunte al log" #: lib\ui_init.py:124 msgid "Create a new shared repository" msgstr "Crea un nuovo repository condiviso" #: lib\ui_init.py:125 msgid "Skip the creation of working trees in this repository" msgstr "Salta la creazione degli alberi di lavoro in questo repository" #: lib\ui_init.py:131 msgid "Repository Format:" msgstr "Formato Repository:" #: lib\ui_init.py:132 msgid "Description of format" msgstr "Descrizione del formato" #: lib\ui_merge.py:62 msgid "Merge" msgstr "Merge" #: lib\ui_merge.py:67 lib\ui_pull.py:65 lib\ui_push.py:66 msgid "Remember this location as a default" msgstr "Ricorda questa posizione come predefinita" #: lib\ui_merge.py:68 msgid "Merge even if the working tree has uncommitted changes" msgstr "" "Effettua il merge anche se le modifiche all'albero di lavoro non sono state " "salvate" #: lib\ui_merge.py:69 msgid "Merge uncommitted changes instead of committed ones" msgstr "Merge delle modifiche senza commit al posto di quelle dei commit" #: lib\ui_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" msgstr "" #: lib\ui_new_tree.py:129 msgid "Create a new Bazaar Working Tree" msgstr "Crea un nuovo albero di lavoro di Bazaar" #: lib\ui_new_tree.py:131 msgid "" "Branch source (enter a URL or select a local directory with an existing " "branch)" msgstr "" "Sorgente branch (inserire un URL o selezionare una cartella locale con un " "branch esistente)" #: lib\ui_new_tree.py:133 msgid "Local directory where the working tree will be created" msgstr "Cartella locale dove verranno creati gli alberi di lavoro" #: lib\ui_new_tree.py:135 msgid "Working Tree Options" msgstr "Opzioni Albero di Lavoro" #: lib\ui_new_tree.py:136 msgid "Create a checkout" msgstr "Crea un checkout" #: lib\ui_new_tree.py:144 msgid "Light-weight checkout" msgstr "Checkout leggero" #: lib\ui_new_tree.py:145 msgid "Make a local copy of the branch" msgstr "Crea una copia locale del branch" #: lib\ui_new_tree.py:151 msgid "Create a stacked branch referring to the source branch" msgstr "Crea un branch accatastato che fa riferimento al branch sorgente" #: lib\ui_new_tree.py:152 msgid "Click a link for more information about checkouts and branches." msgstr "" "Premi su un collegamento per maggiori informazioni su checkout e branch." #: lib\ui_new_tree.py:159 msgid "Most recent (tip) revision" msgstr "Revisione più recente" #: lib\ui_new_tree.py:161 msgid "Show Log..." msgstr "Mostra Log..." #: lib\ui_pull.py:60 msgid "Pull" msgstr "Pull" #: 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 "Sovrascrivi differenze tra i branch" #: lib\ui_push.py:62 msgid "Push" msgstr "Push" #: lib\ui_push.py:68 msgid "Use existing directory" msgstr "Usa la cartella esistente" #: lib\ui_push.py:69 msgid "Create the path up to the branch if it does not exist" msgstr "Crea il percorso al branch se non esiste" #: lib\ui_run.py:107 msgid "Run bzr command" msgstr "Esegui comando bzr" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "Cartella di lavoro:" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "C&ategoria:" #: lib\ui_run.py:112 msgid "&Command:" msgstr "&Comando:" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "Mo&stra comandi nascosti" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "&Opzioni e argomenti per il comando:" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "Inserisci cartella..." #: lib\ui_run.py:116 msgid "Insert &filenames..." msgstr "Inserisci nomi &file..." #: lib\ui_sysinfo.py:113 msgid "Bazaar Library" msgstr "Libreria Bazaar" #: lib\ui_sysinfo.py:114 lib\ui_sysinfo.py:124 msgid "Version:" msgstr "Versione:" #: lib\ui_sysinfo.py:115 msgid "(bzr-version)" msgstr "(versione-bzr)" #: lib\ui_sysinfo.py:116 lib\ui_sysinfo.py:126 msgid "Path:" msgstr "Percorso:" #: lib\ui_sysinfo.py:117 msgid "(bzr-lib-path)" msgstr "(percorso-lib-bzr)" #: lib\ui_sysinfo.py:118 msgid "Bazaar Configuration" msgstr "Configurazione Bazaar" #: lib\ui_sysinfo.py:119 msgid "Settings:" msgstr "Impostazioni:" #: lib\ui_sysinfo.py:120 msgid "(bzr-config-dir)" msgstr "(cartella-config-bzr)" #: lib\ui_sysinfo.py:121 msgid "Log File:" msgstr "File Log:" #: lib\ui_sysinfo.py:122 msgid "(bzr-log-file)" msgstr "(file-log-bzr)" #: lib\ui_sysinfo.py:123 msgid "Python Interpreter" msgstr "Interprete Python" #: lib\ui_sysinfo.py:125 msgid "(python-version)" msgstr "(versione-python)" #: lib\ui_sysinfo.py:127 msgid "(python-file)" msgstr "(file-python)" #: lib\ui_sysinfo.py:128 msgid "Library:" msgstr "Libreria:" #: lib\ui_sysinfo.py:129 msgid "(python-lib-dir)" msgstr "(cartella-lib-python)" #: lib\ui_tag.py:88 msgid "Edit tag" msgstr "Modifica tag" #: lib\ui_tag.py:91 msgid "Tag" msgstr "Tag" #: lib\ui_tag.py:92 msgid "&Action:" msgstr "&Azione:" #: lib\ui_tag.py:93 msgid "Create new tag" msgstr "Crea un nuovo tag" #: lib\ui_tag.py:94 msgid "Move existing tag" msgstr "Sposta tag esistente" #: lib\ui_tag.py:95 msgid "Delete existing tag" msgstr "Elimina tag esistente" #: lib\ui_tag.py:96 msgid "&Tag name:" msgstr "Nome &tag:" #: lib\ui_tag.py:98 msgid "&Select..." msgstr "&Seleziona..." #: lib\ui_update_branch.py:82 msgid "Update Branch" msgstr "Aggiorna Branch" #: lib\ui_update_branch.py:83 msgid "" "This directory is a branch. Please select what you would like to update" msgstr "" "Questa cartella è un branch. Selezionare ciò che si desidera aggiornare" #: lib\ui_update_branch.py:84 lib\ui_update_checkout.py:76 msgid "Update source" msgstr "Aggiorna sorgente" #: lib\ui_update_branch.py:86 msgid "Pull most recent changes from:" msgstr "Pull delle modifiche più recenti da:" #: lib\ui_update_branch.py:87 msgid "Remember this as the new parent branch" msgstr "Ricorda come nuovo branch genitore" #: 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 "Aggiorna albero di lavoro alle ultime modifiche nel branch" #: lib\ui_update_checkout.py:74 msgid "Update Checkout" msgstr "Aggiorna Checkout" #: lib\ui_update_checkout.py:75 #, python-format msgid "This directory is a checkout of: %s" msgstr "Questa cartella è un checkout di: %s" #: lib\ui_update_checkout.py:77 msgid "Update the working tree from the bound branch" msgstr "Aggiorna albero di lavoro dal branch legato" #: lib\ui_update_checkout.py:78 msgid "Pull a different branch" msgstr "Pull da un branch differente" #: lib\unbind.py:36 msgid "Unbind branch" msgstr "Disassocia branch" #: lib\unbind.py:47 msgid "Unbind" msgstr "Disassocia" #: lib\unbind.py:55 msgid "Bound to:" msgstr "Associato a:" #: lib\uncommit.py:40 msgid "Uncommit" msgstr "Uncommit" #: lib\uncommit.py:57 msgid "Move tip to" msgstr "Sposta vertice a" #: lib\uncommit.py:59 msgid "Parent of current tip revision" msgstr "Genitore della revisione vertice attuale" #: lib\uncommit.py:61 msgid "Other revision:" msgstr "Altra revisione:" #: lib\uncommit.py:104 msgid "No other revision specified." msgstr "Nessun'altra revisione specificata." #: lib\uncommit.py:122 msgid "Do you really want to uncommit these revisions?" msgstr "Effettuare veramente l'uncommit per queste revisioni?" #: lib\update.py:33 msgid "Update working tree" msgstr "Aggiorna albero di lavoro" #: lib\update.py:34 #, python-format msgid "Update tree %s" msgstr "Aggiorna albero %s" #: lib\util.py:70 msgid "&Cancel" msgstr "&Cancella" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "Seleziona Cartella Sorgente" #: lib\util.py:585 msgid "Select Target Directory" msgstr "Seleziona Cartella Destinazione" #: lib\util.py:726 msgid "deleted files" msgstr "file eliminati" #: lib\util.py:728 msgid "added files" msgstr "file aggiunti" #: lib\util.py:730 msgid "renamed files" msgstr "file rinominati" #: lib\util.py:732 msgid "modified files" msgstr "file modificati" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "(nessun messaggio)" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "Completo" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" #~ msgid "[binary file]" #~ msgstr "[file binario]" #~ msgid "You must specify a location" #~ msgstr "Occorre specificare una posizione" #~ msgid "Cre&ate" #~ msgstr "Cre&a" #~ msgid "Submit branch:" #~ msgstr "Invia branch:" #~ msgid "Branch format:" #~ msgstr "Formato branch:" #~ msgid "Repository format:" #~ msgstr "Formato repository:" #~ msgid "&Related Branches" #~ msgstr "B&ranch collegati:" #~ msgid "Push branch:" #~ msgstr "Push branch:" #~ msgid "Parent branch:" #~ msgstr "Branch genitore:" #~ msgid "Working tree format:" #~ msgstr "Formato dell'albero di lavoro:" #~ msgid "Side by side" #~ msgstr "Fianco a fianco" #~ msgid "You should provide commit message." #~ msgstr "Si dovrebbe inserire un messaggio per il commit." #~ msgid "Using" #~ msgstr "Usando" #~ msgid "Definition" #~ msgstr "Definizione" #~ msgid "External Merge Apps:" #~ msgstr "Applicazioni Esterne per il Merge:" #~ msgid "&No" #~ msgstr "&No" #~ msgid "Public branch:" #~ msgstr "Branch pubblico:" #~ msgid "Location has no branch" #~ msgstr "La posizione non ha un branch" #~ msgid "Location has no working tree" #~ msgstr "La posizione non ha un albero di lavoro" #~ msgid "&Move" #~ msgstr "Sposta" #~ msgid "" #~ "Some of the files selected cannot be recoverd if removed. Are you sure you " #~ "want to remove these files?" #~ msgstr "" #~ "Alcuni dei file selezionati non possono essere recuperati se eliminati. Si è " #~ "sicuri di eliminare questi file?" #~ msgid "Left side encoding:" #~ msgstr "Codifica lato sinistro:" #~ msgid "Right side encoding:" #~ msgstr "Codifica lato destro:" #~ msgid "No changes to commit." #~ msgstr "Nessuna modifica per il commit." #~ msgid "Use Configured Default" #~ msgstr "Usa Predefinito Configurato" #~ msgid "&Yes" #~ msgstr "Sì" #~ msgid "Control directory format:" #~ msgstr "Formato cartella di controllo:" #~ msgid "&Format" #~ msgstr "&Formato" #, python-format #~ msgid "%s (Configured external merge definition in qconfig)" #~ msgstr "%s (Definizione merge esterno configurato in qconfig)" #~ 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 "" #~ "Lo strumento merge configurato in qconfig nella pagina Merge.\n" #~ "Segue la convenzione usata nel plugin bzr: extmerge\n" #~ "external_merge = kdiff3 --output %r %b %t %o\n" #~ "%r è il risultato, %b è il file .BASE, %t è il file .THIS e %o è il file " #~ ".OTHER." ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-ja.po0000644000000000000000000016624414556556456013203 0ustar00# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-12 16:38+0300\n" "PO-Revision-Date: 2012-02-23 12:58+0000\n" "Last-Translator: IWATA Hidetaka \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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "追加" #: lib\add.py:57 msgid "Unversioned Files" msgstr "バージョン管理外のファイル" #: lib\add.py:106 msgid "Show ignored files" msgstr "無視したファイルを表示" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "注釈" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "読み込み中..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "エンコード" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "検索" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "指定行へジャンプ" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "表示オプション(&V)" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "表示オプション" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "行の折り返し" #: lib\annotate.py:383 msgid "Tab Width" msgstr "タブ文字の幅" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "リビジョン %s" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "指定行へジャンプ: " #: lib\annotate.py:762 msgid "Go" msgstr "移動" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "行指定パネルを閉じる" #: lib\annotate.py:804 msgid "&Annotate this revision" msgstr "このリビジョンを注釈する(&A)" #: 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:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "参照" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "ブランチの場所を選択" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "マスタであるブランチの場所が指定されていません。" #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "場所:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "リビジョン:" #: lib\browse.py:84 msgid "Show" msgstr "表示" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "フィルタ(&F)" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "表示" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "エンコード:" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "コミット" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "ブランチ" #: lib\commit.py:259 msgid "&Local commit" msgstr "ローカルコミット(&L)" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "通常のコミットが行われるまで、ローカルコミットはマスターブランチへと送られることはありません" #: lib\commit.py:265 msgid "Description:" msgstr "説明:" #: lib\commit.py:280 msgid "" "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." msgstr "" "ローカルブランチはマスターブランチよりも古くなっています。\n" "マスターブランチにコミットするには、まずローカルブランチを更新してください。\n" "ローカルコミットを選択してスタンドアロンで作業を続けることもできます。" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "作業ツリーは古くなっています。コミットするには、まず作業ツリーを更新してください。" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "更新" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "メッセージ" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "バージョン管理下にないファイルを表示" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "コミットメッセージを入力してください。" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "修正されたバグ(&F):" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "このコミットにより修正されるバグのIDを設定" #: lib\commit.py:364 msgid "" "Enter the list of bug IDs in format tag:id separated by a space, e.g. " "project:123 project:765" msgstr "" "バグIDのリストを入力する フォーマットは tag:idでスペースで区切る。例 project:123 project:765" #: lib\commit.py:374 msgid "&Author:" msgstr "著者(&A):" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "この変更の著者がコミッターと異なるなら、著者を設定" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "著者の名前を入力してください。(例: John Doe <jdoe@example.com>)" #: lib\commit.py:393 msgid "Changes" msgstr "変更点" #: lib\commit.py:410 msgid "Pending Merges" msgstr "マージ保留" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "状態" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "選択されたファイルの変更点を見る" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "コミットメッセージを入力してください" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" "コミットする変更が選択されていません。\n" "どうしてもコミットしたいですか?" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "コミットはマスターブランチに送られ、ローカルとマスターブランチ間で同期します" #: lib\commit.py:745 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:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "差分" #: lib\config.py:49 msgid "Default" msgstr "デフォルト" #: lib\config.py:50 msgid "Thunderbird" msgstr "Thunderbird" #: lib\config.py:51 msgid "Evolution" msgstr "Evolution" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "Mutt" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "XDG Eメールクライアント" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "MAPI Eメールクライアント" #: lib\config.py:56 msgid "Editor" msgstr "エディタ" #: lib\config.py:79 msgid "Configuration" msgstr "設定" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "名前(&N):" #: lib\config.py:95 msgid "E-&mail:" msgstr "メール(&M):" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "ブラウズ(&B)..." #: lib\config.py:108 msgid "&Editor:" msgstr "エディタ(&E):" #: lib\config.py:116 msgid "E-mail &client:" msgstr "メールクライアント(&C):" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" "タブ文字の幅\n" "qdiff、qannotate、qcatウインドウで使用されるオプションです。" #: lib\config.py:125 msgid "Tab &Width:" msgstr "タブ文字の幅(&W)" #: lib\config.py:137 msgid "Alias" msgstr "エイリアス" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "コマンド" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "削除" #: lib\config.py:158 msgid "Abbreviation" msgstr "略記" #: lib\config.py:158 msgid "URL" msgstr "URL" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "グループ内の追加、削除を緑と赤で表示する" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "外部の diff プログラム" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "名前" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "マージツールを設定するためにはBazaar 2.4以降が必要です" #: lib\config.py:241 msgid "General" msgstr "一般" #: lib\config.py:242 msgid "Aliases" msgstr "エイリアス" #: lib\config.py:243 msgid "Bug Trackers" msgstr "バグトラッカー" #: lib\config.py:244 msgid "&User Interface" msgstr "ユーザインタフェース(&U)" #: lib\config.py:245 msgid "&Diff" msgstr "差分(&D)" #: lib\config.py:246 msgid "&Merge" msgstr "マージ(&M)" #: lib\config.py:271 msgid "Spell check &language:" msgstr "スペルチェック言語(&L):" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "組み込みのdiff" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "古いマージツール設定の取り込み" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" "古い外部マージツール設定を取り込みますか?\n" " %(old_cmdline)s\n" "新しい設定:\n" " %(new_cmdline)s" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "そのまま処理を進める(&I)" #: lib\config.py:609 msgid "&Change the values" msgstr "値を変更する(&C)" #: lib\config.py:719 msgid "Select editor executable" msgstr "エディタを選択" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "コマンドライン" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "競合" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "ファイル" #: lib\conflicts.py:62 msgid "Conflict" msgstr "競合" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "起動(&L)..." #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "マージツール(&M):" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "自動解決" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "競合をマージする(&M)" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "解決済みにする(&R)" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "%d個の競合が解決済みになりました" #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "OK(&O)" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "全ての競合は解決されました。" #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "merge ツールの実行中にエラーが発生しました (コード %d)" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "エラー" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "外部マージツールのサポートにはBazaar 2.4以降が必要です" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "qconfig の merge タブで外部のマージプログラムを設定してください" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "外部マージツール %(tool)s は使用できません" #: lib\conflicts.py:299 #, 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 "" "外部マージツールの定義が無効です。: '%(tool)s'\n" "フラグ '%(flags)s' が指定されていません。qconfigのマージタブで修正してください。" #: lib\conflicts.py:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "%s フラグがありません。 qconfig の merge タブで設定してください" #: lib\conflicts.py:310 msgid "path conflict" msgstr "パスの競合" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "内容の競合" #: lib\conflicts.py:312 msgid "text conflict" msgstr "テキストの競合" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "重複ID" #: lib\conflicts.py:314 msgid "duplicate" msgstr "複製" #: lib\conflicts.py:315 msgid "parent loop" msgstr "フォルダ構成のループ" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "親のバージョンが定義されていません" #: lib\conflicts.py:317 msgid "missing parent" msgstr "親が見つかりません" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "親が削除されています" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "親がディレクトリではありません" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "差異を表示(&D)" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "削除" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "追加" #: lib\diff.py:266 msgid "renamed and modified" msgstr "名称変更/修正" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "名称変更" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "変更" #: lib\diffview.py:461 msgid "Last modified:" msgstr "最終更新:" #: lib\diffview.py:462 msgid "Status:" msgstr "状態:" #: lib\diffview.py:463 msgid "Kind:" msgstr "種類:" #: lib\diffview.py:464 msgid "Properties:" msgstr "プロパティ:" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "[バイナリファイル (%d byte)]" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "\\ ファイル終端に改行がない" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "%s の作業ツリー" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "作業ツリー" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "%(branch)sのリビジョン%(rev)s" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "リビジョン %s" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "%(branch)sのリビジョンID%(revid)s" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "リビジョンID: %s" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "マージプレビュー" #: lib\diffwindow.py:218 msgid "&Find" msgstr "検索(&F)" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "アクティブなパネル上で検索します" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "Unified形式で表示" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "サイドバイサイド表示とUnidiff表示を切り替えます" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "更新(&R)" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "外部Diffツール(&E)" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "外部Diffツールを起動します" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "全体表示(&C)" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "タブの幅" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "左側のタブ幅" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "右側のタブ幅" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "左側のエンコード" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "右側のエンコード" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "空白の変更を無視する(&I)" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "%dファイル" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" "%s はバージョン管理外です。\n" "処理は中断しました。" #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "閉じる(&C)" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "変更が見つかりません。" #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "不正なエンコード" #: lib\encoding_selector.py:77 #, python-format msgid "Encoding \"%s\" is invalid or not supported." msgstr "エンコード\"%s\"は無効か、サポート外です" #: 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 "ブランチ: %s" #: 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:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "オプション" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" msgstr "" #: lib\help.py:59 #, python-format msgid "No help can be found for %s" msgstr "%sに該当するヘルプはありません" #: lib\help.py:103 msgid "Help" msgstr "ヘルプ" #: lib\i18n.py:95 msgid "file" msgstr "ファイル" #: lib\i18n.py:96 msgid "directory" msgstr "ディレクトリ" #: lib\i18n.py:97 msgid "symlink" msgstr "シンボリックリンク" #: lib\i18n.py:99 msgid "fixed" msgstr "修正済み" #: lib\i18n.py:101 msgid "View text file" msgstr "テキストファイルを表示" #: lib\i18n.py:102 msgid "View image file" msgstr "画像を表示" #: lib\i18n.py:103 msgid "View binary file" msgstr "バイナリファイルを表示" #: lib\i18n.py:104 msgid "View symlink" msgstr "シンボリックリンクを表示" #: lib\i18n.py:105 msgid "View directory" msgstr "ディレクトリを表示" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "commit する変更が選択されていません" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "revert する変更が選択されていません" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "バージョン管理外のファイル" #: lib\ignore.py:58 msgid "Extension" msgstr "拡張子" #: lib\ignore.py:59 msgid "Ignore as" msgstr "無視設定" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "情報" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "初期化" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "ログ" #: lib\log.py:142 msgid "&Search:" msgstr "検索(&S):" #: lib\log.py:158 msgid "Messages" msgstr "メッセージ" #: lib\log.py:160 msgid "Authors" msgstr "著者" #: lib\log.py:162 msgid "Revision IDs" msgstr "リビジョンID" #: lib\log.py:164 msgid "Revision Numbers" msgstr "リビジョン番号" #: lib\log.py:166 msgid "Tags" msgstr "Tags" #: lib\log.py:168 msgid "Bugs" msgstr "バグ" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "違うファイルパスと違うブランチを同時に指定することはできません。" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "メッセージとファイル内のテキスト(索引あり)" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "差分を表示(&D)..." #: lib\log.py:575 msgid "View file" msgstr "ファイルを表示" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "このリビジョンのファイルを保存する..." #: lib\log.py:583 msgid "Revert to this revision" msgstr "このリビジョンに戻す" #: lib\log.py:862 msgid "Not a file" msgstr "ファイルではありません" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" "この操作は単体ファイルに対してだけ実行できます。\n" "%s は対象外です。" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "このリビジョンのファイルを保存する.." #: lib\log.py:878 msgid "Revert File" msgstr "ファイルをこのバージョンに戻す" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "本当にこのファイルを選択したバージョンの時点の状態に戻してもよろしいですか?" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "リビジョン" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "日付" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "著者" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "バグ #%s" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "ファイルの差分を表示(&d)" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "すべての差分を表示(&d)" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "差分を表示(&d)..." #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "すべての差分を表示(&d)..." #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "ツリーを表示(&T)..." #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "このリビジョンにタグを付加する(&R)" #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "このバージョンに戻す(&e)" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "このリビジョンに更新(&U)" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "チェリーピック(&C)" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "リバースチェリーピック(&v)" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "リビジョン%s (ID:%s)に戻す" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "%sをリビジョン%s (ID:%s)に戻す" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "元に戻す" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "リビジョン%s(リビジョンID:%s)に更新します" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "%sをリビジョン%s(リビジョンID:%s)に更新します" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "リビジョン%s~%s を、%sから%sに取り込みます。" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "チェリーピッキング" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "リビジョン%s~%sの変更を取り消し(リバースチェリーピッキング)します。" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "リビジョン%s~%sの変更を%sで取り消し(リバースチェリーピッキング)します。" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" msgstr "リバースチェリーピッキング" #: lib\main.py:120 msgid "Computer" msgstr "コンピュータ" #: lib\main.py:149 msgid "&Edit Bookmark..." msgstr "ブックマークを編集(&E)..." #: lib\main.py:150 msgid "&Remove Bookmark..." msgstr "ブックマークを削除(&R)..." #: lib\main.py:165 msgid "Bookmarks" msgstr "ブックマーク" #: lib\main.py:276 msgid "Refresh the directory tree" msgstr "ディレクトリツリーを更新" #: lib\main.py:280 msgid "&Commit" msgstr "コミット(&C)" #: lib\main.py:281 msgid "Commit changes into a new revision" msgstr "新規リビジョンとして修正をコミット" #: lib\main.py:285 msgid "&Push" msgstr "プッシュ(&P)" #: lib\main.py:286 msgid "Turn this branch into a mirror of another branch" msgstr "このブランチを他のブランチのミラーに切り替える" #: lib\main.py:290 msgid "Pu&ll" msgstr "プル(&U)" #: lib\main.py:291 msgid "Update a mirror of this branch" msgstr "このブランチのミラーを更新" #: lib\main.py:294 msgid "&Add Bookmark..." msgstr "ブックマークを追加(&A)..." #: lib\main.py:301 msgid "&File" msgstr "ファイル(&F)" #: lib\main.py:302 msgid "&Configure..." msgstr "設定(&C)" #: lib\main.py:304 msgid "&Quit" msgstr "終了(&Q)" #: lib\main.py:305 msgid "&View" msgstr "表示(&V)" #: lib\main.py:307 msgid "&Branch" msgstr "ブランチ(&B)" #: lib\main.py:311 msgid "&Bookmarks" msgstr "ブックマーク(&B)" #: lib\main.py:313 lib\util.py:72 msgid "&Help" msgstr "ヘルプ(&H)" #: lib\main.py:314 msgid "&Help..." msgstr "ヘルプ(&H)..." #: lib\main.py:316 msgid "&About..." msgstr "詳細(&A)..." #: lib\main.py:354 msgid "Size" msgstr "サイズ" #: lib\main.py:406 msgid "About QBzr" msgstr "QBzrについて" #: 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 "" "QBzr — Bazaarのグラフィカルインターフェース
バージョン %(qbzr_version)s (bzrlib " "%(bzrlib_version)s)

Copyright © 2006-2008 Lukáš Lalinský " "とその他の方々

http://bazaar-" "vcs.org/QBzr" #: 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:480 msgid "Description" msgstr "説明" #: lib\plugins.py:62 msgid "Directory" msgstr "ディレクトリ" #: lib\plugins.py:64 #, python-format msgid "Plugins installed: %(rows)d" msgstr "インストール済みプラグイン: %(rows)d" #: lib\plugins.py:71 msgid "Summary" msgstr "要約" #: lib\plugins.py:72 lib\ui_branch.py:100 msgid "Locations" msgstr "場所" #: lib\plugins.py:111 msgid "(no description)" msgstr "(説明なし)" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "作業ツリーにはコミットしていない変更が含まれています。" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "作業ツリーが古いままです。'bzr update'を実行してください。" #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "それでも続行しますか?" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "元に戻す変更を選択してください" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "revert されるファイルのバックアップを作らない" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "マージ待ち状態を解除する" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "revert するように選択されているファイルの変更点を確認する" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "親:" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "子供:" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "署名:" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "コミットされていない作業ツリーの変更" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "日付:" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "コミッタ:" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "著者:" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "ブランチ:" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "タグ:" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "バグ:" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "リビジョン" #: lib\run.py:98 msgid "Select working directory" msgstr "作業ディレクトリを選択" #: lib\run.py:119 msgid "&Edit" msgstr "編集(&E)" #: lib\run.py:167 msgid "Help for command" msgstr "コマンドのヘルプ" #: lib\run.py:287 msgid "Select path to insert" msgstr "挿入するパスを選択して下さい" #: lib\run.py:297 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\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "シェルフの管理" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "棚に上げる" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "棚上げされた変更の表示" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "再試行(&R)" #: lib\subprocess.py:518 msgid "Ready" msgstr "待機中" #: lib\subprocess.py:591 msgid "Starting..." msgstr "開始..." #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "”bzr.exe”が見つかりません" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "”bzr”スクリプトが見つかりません" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "中止..." #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "完了!" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "パスワードを入力して下さい" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "ユーザ名を入力してください" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "失敗!" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "bzrの実行に失敗しました。" #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "bzr実行中にエラーが発生しました。(エラーコード: %d)" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "中断しました!" #: lib\switch.py:46 msgid "Switch" msgstr "切り替え" #: lib\switch.py:57 msgid "Switch checkout" msgstr "チェックアウトの切り替え" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "チェックアウト(履歴あり):" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "軽量チェックアウト:" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "チェックアウト元のブランチ:" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "切り替え先ブランチ:" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "切り替え前にブランチを作成する" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "システム情報" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "タグ名の指定が必要です" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" "タグ\"%s\"は既にに登録されています。\n" "既存のタグを移動しますか?" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" "タグ \"%s\"はまだ存在しません。\n" "新しいタグを作成しますか?" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "タグ \"%s\" は存在しません" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" "ブランチではありません:\n" "%s" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "%sウインドウを閉じる" #: lib\trace.py:248 msgid "Close Window" msgstr "ウインドウを閉じる" #: lib\trace.py:250 msgid "Close Application" msgstr "アプリケーションを終了する" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "エラーダイアログを閉じる" #: lib\trace.py:265 msgid "Ignore Error" msgstr "エラーを無視する" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "Bazaarのエラーを報告する" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "エラーの詳細を表示する)>>>" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "<<<エラーの詳細を隠す" #: lib\treewidget.py:322 msgid "ignored" msgstr "無視" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "管理外" #: lib\treewidget.py:327 msgid "added, missing" msgstr "追加、紛失" #: lib\treewidget.py:333 msgid "missing" msgstr "紛失" #: lib\treewidget.py:340 msgid "moved" msgstr "移動" #: lib\treewidget.py:346 msgid "x-bit" msgstr "実行ビット" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "ファイル名" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "変更なし" #: lib\treewidget.py:1303 msgid "Changed" msgstr "変更" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "管理外" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "無視" #: lib\treewidget.py:1682 msgid "&Open" msgstr "開く(&O)" #: lib\treewidget.py:1685 msgid "&View file" msgstr "ファイルを表示(&V)" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "注釈を表示する(&A)" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "ログを表示(&l)" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "競合を解決済みにする(&R)" #: lib\treewidget.py:1714 msgid "&Add" msgstr "追加(&A)" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "元に戻す(&R)" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "名前を変更する(&R)" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "移動、変名済みとしてマーク(&M)" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "移動済みとしてマーク(&M)" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "変名済みとしてマーク(&M)" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "本当に選択したファイルの変更を破棄してもよろしいですか?" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "外部マージ" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "削除すると元に戻せなくなるファイルが選択されています。本当に削除してもよろしいですか?" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "全選択/非選択" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "%sはブランチではありません" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "%s に対する作業ツリーは存在しません" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "場所(&L):" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "宛先(&T):" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "新しいブランチを親ブランチにバインドする" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "リビジョン(&R):" #: lib\ui_info.py:87 msgid "..." msgstr "..." #: lib\ui_info.py:89 msgid "&Basic" msgstr "基本(&B)" #: lib\ui_info.py:91 msgid "&Detailed" msgstr "詳細(&D)" #: 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 "履歴中の全てのリビジョンNoを保持する" #: 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "外部マージツール" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "選択されたマージツールをqconflictsのデフォルトにする" #: lib\ui_merge_config.py:63 msgid "Set Default" msgstr "デフォルトに設定" #: lib\ui_new_tree.py:129 msgid "Create a new Bazaar Working Tree" 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 "作業ツリーを作成するローカルディレクトリ" #: 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 "最新の (tip) revision" #: 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:62 msgid "Push" 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:107 msgid "Run bzr command" msgstr "bzrコマンドを実行" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "作業ディレクトリ(&W):" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "カテゴリ(&A)" #: lib\ui_run.py:112 msgid "&Command:" msgstr "コマンド(&C):" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "隠れたコマンドも表示(&S)" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "コマンドオプションや引数(&O):" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "ディレクトリを挿入(&D)" #: lib\ui_run.py:116 msgid "Insert &filenames..." msgstr "ファイル名を挿入(&F)" #: lib\ui_sysinfo.py:113 msgid "Bazaar Library" msgstr "Bazaarライブラリ" #: lib\ui_sysinfo.py:114 lib\ui_sysinfo.py:124 msgid "Version:" msgstr "バージョン:" #: lib\ui_sysinfo.py:115 msgid "(bzr-version)" msgstr "(bzr-version)" #: lib\ui_sysinfo.py:116 lib\ui_sysinfo.py:126 msgid "Path:" msgstr "パス:" #: lib\ui_sysinfo.py:117 msgid "(bzr-lib-path)" msgstr "(bzr-lib-path)" #: lib\ui_sysinfo.py:118 msgid "Bazaar Configuration" msgstr "Bazaarの設定" #: lib\ui_sysinfo.py:119 msgid "Settings:" msgstr "設定:" #: lib\ui_sysinfo.py:120 msgid "(bzr-config-dir)" msgstr "(bzr-config-dir)" #: lib\ui_sysinfo.py:121 msgid "Log File:" msgstr "ログファイル:" #: lib\ui_sysinfo.py:122 msgid "(bzr-log-file)" msgstr "(bzr-log-file)" #: lib\ui_sysinfo.py:123 msgid "Python Interpreter" msgstr "Pythonインタプリタ" #: lib\ui_sysinfo.py:125 msgid "(python-version)" msgstr "(python-version)" #: lib\ui_sysinfo.py:127 msgid "(python-file)" msgstr "(python-file)" #: lib\ui_sysinfo.py:128 msgid "Library:" msgstr "ライブラリ:" #: lib\ui_sysinfo.py:129 msgid "(python-lib-dir)" msgstr "(python-lib-dir)" #: 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 "アクション(&A):" #: 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 "タグ名(&T):" #: lib\ui_tag.py:98 msgid "&Select..." msgstr "選択(&S)..." #: 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 "作業ツリー(working tree)を branch の最新の状態に update する" #: 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 "このディレクトリのチェックアウト元: %s" #: 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:47 msgid "Unbind" msgstr "割り当て解除" #: lib\unbind.py:55 msgid "Bound to:" msgstr "割り当て先:" #: lib\uncommit.py:40 msgid "Uncommit" msgstr "コミット取り消し" #: lib\uncommit.py:57 msgid "Move tip to" msgstr "Tipの移動先" #: lib\uncommit.py:59 msgid "Parent of current tip revision" msgstr "現在のTipの親リビジョン" #: 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 "ツリー %sを更新" #: lib\util.py:70 msgid "&Cancel" msgstr "キャンセル(&C)" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "ソースディレクトリを選択" #: lib\util.py:585 msgid "Select Target Directory" msgstr "対象ディレクトリを選択" #: lib\util.py:726 msgid "deleted files" msgstr "削除" #: lib\util.py:728 msgid "added files" msgstr "追加" #: lib\util.py:730 msgid "renamed files" msgstr "変名されたファイル" #: lib\util.py:732 msgid "modified files" msgstr "変更されたファイル" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "(メッセージなし)" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "署名をチェックする" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "削除" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "変名" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "追加" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "テキストの変更" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "ターゲットの変更" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "バイナリの変更" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "シェルフに登録する際のメッセージを入力してください" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "ハンク" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "すべて" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "前のハンク" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "次のハンク" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "エディタを使用" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "破棄" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "すべて選択" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "すべて選択解除" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "レイアウト(&L)" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "変更エディタは設定されていません" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "%d個のファイルの変更を、シェルフに登録せずに破棄します。" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "%d個のファイルの変更をシェルフに棚上げします。" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "変更箇所が選択されていません" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "処理対象のファイルが変更されたため、処理を中止しました" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "変更エディタで編集済み\n" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "ID" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "空白を無視する" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "シェルフから戻す" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "シミュレーション" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "保持する" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "削除する" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "ファイル一覧を表示する" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "シェルフ[%(id)d]の変更を適用し、シェルフからは削除します" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "実際には作業ツリーは変更せずに、シェルフ[%(id)d]の変更を適用するシミュレーションを行います。" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "シェルフ[%(id)d]の変更を適用しますが、シェルフにも残したままにします。" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "シェルフ[%(id)d]の変更を、適用せずに破棄します。" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "検索: " #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "前へ" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "次へ" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "大文字/小文字を区別" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "単語で検索" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "検索を閉じる" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "レイアウト" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "レイアウト %d" #~ msgid "Side by side" #~ msgstr "並べて表示" #~ msgid "[binary file]" #~ msgstr "[バイナリファイル]" #~ msgid "You must specify a location" #~ msgstr "場所を指定する必要があります" #~ msgid "Cre&ate" #~ msgstr "作成(&A)" #~ msgid "Parent branch:" #~ msgstr "親ブランチ:" #~ msgid "Submit branch:" #~ msgstr "ブランチ送信先:" #~ msgid "&Related Branches" #~ msgstr "関連ブランチ(&R)" #~ msgid "Working tree format:" #~ msgstr "作業ツリーフォーマット:" #~ msgid "Branch format:" #~ msgstr "ブランチフォーマット:" #~ msgid "Repository format:" #~ msgstr "リポジトリフォーマット:" #~ msgid "Control directory format:" #~ msgstr "管理ディレクトリフォーマット:" #~ msgid "&Format" #~ msgstr "フォーマット(&F):" #~ msgid "No changes to commit." #~ msgstr "コミットする変更がありません。" #~ msgid "You should provide commit message." #~ msgstr "コミットメッセージを入力すべきです。" #~ msgid "External Merge Apps:" #~ msgstr "外部の merge プログラム" #~ msgid "&No" #~ msgstr "いいえ(&N)" #~ msgid "&Yes" #~ msgstr "はい(&Y)" #~ msgid "Public branch:" #~ msgstr "公開ブランチ:" #~ msgid "Definition" #~ msgstr "定義" #~ msgid "&Move" #~ msgstr "移動(&M)" #~ msgid "Using" #~ msgstr "使用するツール" #~ msgid "Location has no branch" #~ msgstr "ブランチはありません" #~ msgid "Location has no working tree" #~ msgstr "作業ツリーはありません" #~ msgid "Right side encoding:" #~ msgstr "右側のエンコード" #~ msgid "Left side encoding:" #~ msgstr "左側のエンコード" #, python-format #~ msgid "%s (Configured external merge definition in qconfig)" #~ msgstr "%s(qconfigで設定された外部マージツール)" #~ msgid "" #~ "You are reverting all changed paths without also reverting pending merges. " #~ "Do you want to continue?" #~ msgstr "マージ待ち状態は解除せずに、すべての変更を元に戻します。続行しますか?" #~ msgid "Use Configured Default" #~ msgstr "設定されたデフォルトのツールを利用する" #~ 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 "" #~ "qconfigで設定されたマージツール。\n" #~ "extmergeというプラグインの external_merge = kdiff3 --output %r %b %t %o " #~ "という設定方法と同じルールに従います。\n" #~ "%rは出力,%bは .BASE, %t は .THIS, %o は .OTHER ファイルに置き換えられます。" #~ msgid "Push branch:" #~ msgstr "プッシュ先ブランチ:" #~ msgid "" #~ "Some of the files selected cannot be recoverd if removed. Are you sure you " #~ "want to remove these files?" #~ msgstr "削除すると元に戻せなくなるファイルがあります。本当にこれらのファイルを削除してもよろしいですか?" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-nl.po0000644000000000000000000014071214556556456013212 0ustar00# Dutch translation for qbzr # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the qbzr package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-12 16:38+0300\n" "PO-Revision-Date: 2012-06-04 19:26+0000\n" "Last-Translator: Hannie Dumoleyn \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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Toevoegen" #: lib\add.py:57 msgid "Unversioned Files" msgstr "Niet-beheerde bestanden" #: lib\add.py:106 msgid "Show ignored files" msgstr "Toon genegeerde bestanden" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "Annoteren" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "Bezig met laden..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "Coderen" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "Zoeken" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "Ga naar regel" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "&Weergaveopties" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "Weergaveopties" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "Regelafbreking" #: lib\annotate.py:383 msgid "Tab Width" msgstr "Tabbreedte" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "Revisie %s" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "Ga naar regel: " #: lib\annotate.py:762 msgid "Go" msgstr "Ga" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "\"Ga naar regel\" sluiten" #: lib\annotate.py:804 msgid "&Annotate this revision" msgstr "Deze revisie &annoteren" #: lib\bind.py:44 msgid "Bind branch" msgstr "Brinch binden" #: lib\bind.py:54 msgid "Bind" msgstr "Binden" #: lib\bind.py:56 msgid "Branch location:" msgstr "Branch-locatie:" #: lib\bind.py:60 msgid "Currently bound to:" msgstr "Momenteel gebonden aan:" #: lib\bind.py:64 msgid "Bind to:" msgstr "Binden aan:" #: lib\bind.py:68 lib\browse.py:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Bladeren" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "Branch-locatie selecteren" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "Hoofdbranch-locatie niet opgegeven." #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Locatie:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "Revisie:" #: lib\browse.py:84 msgid "Show" msgstr "Tonen" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "&Filteren" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "Weergeven" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "Codering:" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "Vastleggen (commit)" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "Branch" #: lib\commit.py:259 msgid "&Local commit" msgstr "&Lokale commit" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" "Lokale commits worden niet naar de master branch gepushed totdat een normale " "commit is uitgevoerd" #: lib\commit.py:265 msgid "Description:" msgstr "Beschrijving:" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" "Werkboomstructuur is verouderd. Om te committen, eerst werkboomstructuur " "bijwerken." #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "Bericht" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "Toon niet-beheerde bestanden" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "Voer het commit-bericht in" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "Opgeloste bugs:" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "Stel de IDs van de bugs vast die met deze commit worden opgelost" #: lib\commit.py:364 msgid "" "Enter the list of bug IDs in format tag:id separated by a space, e.g. " "project:123 project:765" msgstr "" "Voer de lijst van bug IDs in volgens het patroon tag:id, gescheiden " "door een spatie, bijvoorbeeld: project:123 project:765" #: lib\commit.py:374 msgid "&Author:" msgstr "&Auteur:" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "" "Stel de auteur van deze wijziging in, als die anders is dan de committer" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" "Voer de naam van de auteur in, b.v. John Doe <jdoe@example.com>" #: lib\commit.py:393 msgid "Changes" msgstr "Wijzigingen" #: lib\commit.py:410 msgid "Pending Merges" msgstr "Nog uit te voeren merges" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "Status" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "Bekijk de wijzigingen in de bestanden geselecteerd om te committen" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "U dient een commit-bericht op te geven." #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" "Er zijn geen wijzigingen geselecteerd om te committen.\n" "Wilt u toch committen?" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" "Er zal rechtstreeks op de master branch gecommit worden, zodat de lokale en " "master branches gesynchroniseerd blijven." #: lib\commit.py:745 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 "" "Er zal een lokale commit op de branch worden uitgevoerd. De master branch " "zal niet worden bijgewerkt totdat een niet-lokale commit wordt gedaan." #: lib\commit.py:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "Diff" #: lib\config.py:49 msgid "Default" msgstr "Standaard" #: lib\config.py:50 msgid "Thunderbird" msgstr "Thunderbird" #: lib\config.py:51 msgid "Evolution" msgstr "Evolution" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "Mutt" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "XDG e-mail programma" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "MAPI e-mail programma" #: lib\config.py:56 msgid "Editor" msgstr "Editor" #: lib\config.py:79 msgid "Configuration" msgstr "Instellingen" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "&Naam:" #: lib\config.py:95 msgid "E-&mail:" msgstr "E-&mail:" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "&Bladeren..." #: lib\config.py:108 msgid "&Editor:" msgstr "&Editor:" #: lib\config.py:116 msgid "E-mail &client:" msgstr "E-_mailprogramma:" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" "Tabbreedte in tekens\n" "optie wordt gebruikt in qdiff-, qannotate- en qcatvensters" #: lib\config.py:125 msgid "Tab &Width:" msgstr "Tab&breedte:" #: lib\config.py:137 msgid "Alias" msgstr "Alias" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "Opdracht" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "Verwijderen" #: lib\config.py:158 msgid "Abbreviation" msgstr "Afkorting" #: lib\config.py:158 msgid "URL" msgstr "URL" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "Toon inter-groep toevoegingen en verwijderingen in groen en rood" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "Externe Diff-toepassingen:" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "Naam" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" "Bazaar 2.4 of later is vereist om samenvoeghulpmiddelen te configureren." #: lib\config.py:241 msgid "General" msgstr "Algemeen" #: lib\config.py:242 msgid "Aliases" msgstr "Aliassen" #: lib\config.py:243 msgid "Bug Trackers" msgstr "Bug Trackers" #: lib\config.py:244 msgid "&User Interface" msgstr "&Gebruikersinterface" #: lib\config.py:245 msgid "&Diff" msgstr "&Diff" #: lib\config.py:246 msgid "&Merge" msgstr "&Merge" #: lib\config.py:271 msgid "Spell check &language:" msgstr "&Taal voor Spellingscontrole:" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" "Deze map zal automatisch ingevuld worden in het invoerveld voor uw branchbron" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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 "Bladeren..." #: lib\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" "Basismap\n" "voor &branchbron:" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" "Deze map zal automatisch ingevuld worden in het invoerveld voor uw " "checkoutbestemming" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" "Basismap\n" "voor &checkouts:" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "Ingebouwde diff" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "Oude externe samenvoeghulpmiddelen importeren" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" "Wilt u uw eerder geconfigureerde externe samenvoeghulpmiddelen importeren:\n" "\n" " %(old_cmdline)s\n" "\n" "als:\n" "\n" " %(new_cmdline)s" #: lib\config.py:446 msgid "old_cmdline" msgstr "old_cmdline" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "&Negeren en doorgaan" #: lib\config.py:609 msgid "&Change the values" msgstr "De waarden &wijzigen" #: lib\config.py:719 msgid "Select editor executable" msgstr "" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "Basismap voor checkouts selecteren" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "Standaardmap voor branchbronnen selecteren" #: lib\config.py:974 msgid "Command Line" msgstr "Opdrachtregel" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "Conflicten" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "Bestand" #: lib\conflicts.py:62 msgid "Conflict" msgstr "Conflict" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "&Start..." #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "&Samenvoeghulpmiddel:" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "Automatisch oplossen" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "S&amenvoegconflict" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "\"&DEZE\" versie nemen" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "\"&ANDERE\" versie nemen" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "Markeren als &opgelost" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "%d conflict is automatisch opgelost." msgstr[1] "%d conflicten zijn automatisch opgelost." #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "&OK" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "Alle conflicten zijn opgelost." #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "Fout tijdens het gebruik van de merge tool (code %d)" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "Fout" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" "Voor de ondersteuning van externe samenvoeghulpmiddelen is Bazaar 2.4 of " "later vereist" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "Extern samenvoeghulpmiddel %(tool)s is niet beschikbaar" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" "De vlag %s ontbreekt. Configureer dit in qconfig onder het tabblad " "Samenvoegen." #: lib\conflicts.py:310 msgid "path conflict" msgstr "padconflict" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "conflicterende inhoud" #: lib\conflicts.py:312 msgid "text conflict" msgstr "conflicterende text" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "dubbel id" #: lib\conflicts.py:314 msgid "duplicate" msgstr "duplicaat" #: lib\conflicts.py:315 msgid "parent loop" msgstr "parent loop" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "parent niet onder versiebeheer" #: lib\conflicts.py:317 msgid "missing parent" msgstr "ontbrekende parent" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "parent verwijderen" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "niet-folder parent" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "Toon verschillen" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "verwijderd" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "toegevoegd" #: lib\diff.py:266 msgid "renamed and modified" msgstr "hernoemd en gewijzigd" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "hernoemd" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "gewijzigd" #: lib\diffview.py:461 msgid "Last modified:" msgstr "Laatst gewijzigd:" #: lib\diffview.py:462 msgid "Status:" msgstr "Status:" #: lib\diffview.py:463 msgid "Kind:" msgstr "Soort:" #: lib\diffview.py:464 msgid "Properties:" msgstr "Eigenschappen:" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "[binair bestand (%d bytes)]" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "Geen newline aan einde bestand" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "Working tree voor %s" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "Working Tree" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "Rev %(rev)s voor %(branch)s" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "Rev %s" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "Revid: %(revid)s voor %(branch)s" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "Revid: %s" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "Merge Preview" #: lib\diffwindow.py:218 msgid "&Find" msgstr "&Zoeken" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "Zoeken op actieve paneel" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "Unidiff" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "Wisselen tussen de weergavemodi \"Naast elkaar\" en \"Unidiff\"" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "&Verversen" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "&Externe Diff" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "Een externe diff-toepassing starten" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "Tab-breedte" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "Breedte tabsprong links" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "Breedte tabsprong rechts" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "%d bestand" msgstr[1] "%d bestanden" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" "Bestand %s is niet onder versiebeheer.\n" "Operatie afgebroken." #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "&Sluiten" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "Geen wijzigingen gevonden." #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "" #: lib\encoding_selector.py:77 #, python-format msgid "Encoding \"%s\" is invalid or not supported." msgstr "Codering ‘%s’ is ongeldig of wordt niet ondersteund." #: lib\export.py:61 lib\export.py:80 msgid "Export" msgstr "Exporteren" #: lib\export.py:75 lib\uncommit.py:51 #, python-format msgid "Branch: %s" msgstr "Branch: ‘%s’" #: lib\export.py:146 msgid "Archive type:" msgstr "Archieftype:" #: lib\export.py:168 msgid "Root directory name:" msgstr "Naam hoofdmap:" #: lib\export.py:236 lib\ui_branch.py:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "Opties" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" msgstr "" #: lib\help.py:59 #, python-format msgid "No help can be found for %s" msgstr "Er is geen hulp gevonden voor %s" #: lib\help.py:103 msgid "Help" msgstr "Help" #: lib\i18n.py:95 msgid "file" msgstr "bestand" #: lib\i18n.py:96 msgid "directory" msgstr "folder" #: lib\i18n.py:97 msgid "symlink" msgstr "symlink" #: lib\i18n.py:99 msgid "fixed" msgstr "hersteld" #: lib\i18n.py:101 msgid "View text file" msgstr "Bekijk tekstbestand" #: lib\i18n.py:102 msgid "View image file" msgstr "Bekijk beeldbestand" #: lib\i18n.py:103 msgid "View binary file" msgstr "Bekijk binair bestand" #: lib\i18n.py:104 msgid "View symlink" msgstr "Bekijk symlink" #: lib\i18n.py:105 msgid "View directory" msgstr "Bekijk folder" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "Geen wijzigingen geselecteerd om te committen" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "Geen wijzigengen geselecteerd om ongedaan te maken" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "Negeren" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "Onbekende bestanden" #: lib\ignore.py:58 msgid "Extension" msgstr "Extensie" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "Geen actie" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "Alle bestanden met deze extensie negeren" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "Hoofdlettergevoelig patroon" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "Op basisnaam negeren" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "Op volledige naam negeren" #: lib\ignore.py:226 msgid "No action selected" msgstr "Geen actie geselecteerd" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "Info" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "Initialiseer" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "Logboek" #: lib\log.py:142 msgid "&Search:" msgstr "&Zoeken:" #: lib\log.py:158 msgid "Messages" msgstr "Berichten" #: lib\log.py:160 msgid "Authors" msgstr "Auteurs" #: lib\log.py:162 msgid "Revision IDs" msgstr "Revisie ID's" #: lib\log.py:164 msgid "Revision Numbers" msgstr "Revisienummers" #: lib\log.py:166 msgid "Tags" msgstr "Tags" #: lib\log.py:168 msgid "Bugs" msgstr "Bugs" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" "Het is niet mogelijk verschillende bestandspaden en verschillende branches " "tegelijk op te geven." #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "Berichten en bestandstekst (geindexeerd)" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "Toon verschillen..." #: lib\log.py:575 msgid "View file" msgstr "Bestand tonen" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "Bestand met deze revisie oplaan als..." #: lib\log.py:583 msgid "Revert to this revision" msgstr "Naar deze revisie terugzetten" #: lib\log.py:862 msgid "Not a file" msgstr "Geen bestand" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" "Bewerking kan alleen gebruikt worden voor een enkel bestand,\n" "niet voor een %s." #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "Bestand in deze revisie opslaan als…" #: lib\log.py:878 msgid "Revert File" msgstr "Bestand herstellen" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" "Weet u zeker dat u dit bestand terug wilt brengen in de staat waarin het was " "in de geselecteerde revisie?" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "Rev" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "Datum" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Auteur" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "bug #%s" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "Toon bestandsverschillen" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "Toon alle verschillen" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "Toon bestandsverschillen..." #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "Toon alle verschillen..." #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "Toon boom..." #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "" #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "Ongedaan maken" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" msgstr "" #: lib\main.py:120 msgid "Computer" msgstr "Computer" #: 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:276 msgid "Refresh the directory tree" msgstr "Ververs de folderboom" #: lib\main.py:280 msgid "&Commit" msgstr "Vastleggen (&commit)" #: lib\main.py:281 msgid "Commit changes into a new revision" msgstr "Commit wijzigingen in een nieuwe revisie" #: lib\main.py:285 msgid "&Push" msgstr "&Push" #: lib\main.py:286 msgid "Turn this branch into a mirror of another branch" msgstr "Verander deze branch in een mirror van een andere branch" #: lib\main.py:290 msgid "Pu&ll" msgstr "Pu&ll" #: lib\main.py:291 msgid "Update a mirror of this branch" msgstr "Actualiseer een mirror van deze branch" #: lib\main.py:294 msgid "&Add Bookmark..." msgstr "" #: lib\main.py:301 msgid "&File" msgstr "&Bestand" #: lib\main.py:302 msgid "&Configure..." msgstr "&Instellen..." #: lib\main.py:304 msgid "&Quit" msgstr "&Afsluiten" #: lib\main.py:305 msgid "&View" msgstr "Bekijk" #: lib\main.py:307 msgid "&Branch" msgstr "&Branch" #: lib\main.py:311 msgid "&Bookmarks" msgstr "&Bladwijzers" #: lib\main.py:313 lib\util.py:72 msgid "&Help" msgstr "&Help" #: lib\main.py:314 msgid "&Help..." msgstr "&Help..." #: lib\main.py:316 msgid "&About..." msgstr "&Over..." #: lib\main.py:354 msgid "Size" msgstr "Grootte" #: lib\main.py:406 msgid "About QBzr" msgstr "Over QBzr" #: 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 "" "QBzr — Een grafische gebruikersinterface voor Bazaar
Versie " "%(qbzr_version)s (bzrlib %(bzrlib_version)s)

Copyright © 2006-" "2008 Lukáš Lalinský en anderen

http://bazaar-vcs.org/QBzr" #: lib\main.py:472 msgid "Add Bookmark" msgstr "Bladwijzer toevoegen" #: lib\main.py:483 msgid "Edit Bookmark" msgstr "Bladwijzer bewerken" #: lib\main.py:493 msgid "Remove Bookmark" msgstr "Bladwijzer verwijderen" #: lib\main.py:494 msgid "Do you really want to remove the selected bookmark?" msgstr "Wil je werkelijke de geselecteerde bladwijzer verwijderen?" #: lib\plugins.py:44 msgid "Plugins" msgstr "" #: lib\plugins.py:57 msgid "Version" msgstr "" #: lib\plugins.py:58 lib\subprocess.py:480 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 "Samenvatting" #: lib\plugins.py:72 lib\ui_branch.py:100 msgid "Locations" msgstr "" #: lib\plugins.py:111 msgid "(no description)" msgstr "" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "De working tree heeft niet gecommitte wijzigingen" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "De working tree is niet actueel, run aub 'bzr update'." #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "Wilt u toch doorgaan?" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "Bewaar geen reservekopie van de ongedaan gemaakte bestanden" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "Bekijk wijzigingen in de bestanden die ongedaan worden gemaakt" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "Ouders:" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "Kinderen:" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "Auteur:" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "Labels:" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "" msgstr[1] "" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "Revisie" #: lib\run.py:98 msgid "Select working directory" msgstr "" #: lib\run.py:119 msgid "&Edit" msgstr "" #: lib\run.py:167 msgid "Help for command" msgstr "" #: lib\run.py:287 msgid "Select path to insert" msgstr "" #: lib\run.py:297 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\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "" #: lib\subprocess.py:518 msgid "Ready" msgstr "" #: lib\subprocess.py:591 msgid "Starting..." msgstr "Bezig met starten..." #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "Afbreken..." #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "Voltooid!" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "" #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "" #: lib\switch.py:46 msgid "Switch" msgstr "" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "" #: lib\treewidget.py:327 msgid "added, missing" msgstr "" #: lib\treewidget.py:333 msgid "missing" msgstr "" #: lib\treewidget.py:340 msgid "moved" msgstr "" #: lib\treewidget.py:346 msgid "x-bit" msgstr "" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "" #: lib\treewidget.py:1303 msgid "Changed" msgstr "" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "" #: lib\treewidget.py:1682 msgid "&Open" msgstr "" #: lib\treewidget.py:1685 msgid "&View file" msgstr "" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "" #: lib\treewidget.py:1714 msgid "&Add" msgstr "" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "&Locatie:" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "&Naar:" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "" #: lib\ui_info.py:87 msgid "..." msgstr "" #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" 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:62 msgid "Push" msgstr "Push" #: 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:107 msgid "Run bzr command" msgstr "" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "" #: lib\ui_run.py:112 msgid "&Command:" msgstr "" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "" #: lib\ui_run.py:116 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:47 msgid "Unbind" msgstr "" #: lib\unbind.py:55 msgid "Bound to:" msgstr "" #: lib\uncommit.py:40 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:70 msgid "&Cancel" msgstr "&Annuleren" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "" #: lib\util.py:585 msgid "Select Target Directory" msgstr "" #: lib\util.py:726 msgid "deleted files" msgstr "" #: lib\util.py:728 msgid "added files" msgstr "toegevoegde bestanden" #: lib\util.py:730 msgid "renamed files" msgstr "hernoemde bestanden" #: lib\util.py:732 msgid "modified files" msgstr "aangepaste bestanden" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "Voltooid" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" #~ msgid "[binary file]" #~ msgstr "[binair bestand]" #~ msgid "No changes to commit." #~ msgstr "Geen wijzigingen te committen." #~ msgid "You should provide commit message." #~ msgstr "U dient een commit bericht in te voeren" #~ msgid "Definition" #~ msgstr "Definitie" #~ msgid "External Merge Apps:" #~ msgstr "Externe Merge Applicaties:" #~ msgid "Use Configured Default" #~ msgstr "Gebruik ingestelde standaardwaarde" #~ 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 "" #~ "De merge tool ingesteld in qconfig onder Merge bestand\n" #~ "Het volgt de conventie gebruik in de bzr plugin: extmerge\n" #~ "external_merge = kdiff3 --output %r %b %t %o\n" #~ "%r is de uitvoer, %b is .BASE, %t is .THIS and %o is het .OTHER bestand." #, python-format #~ msgid "%s (Configured external merge definition in qconfig)" #~ msgstr "%s (Ingestelde externe merge definitie in qconfig)" #~ msgid "Side by side" #~ msgstr "Naast elkaar" #~ msgid "Using" #~ msgstr "Gebruikt" #~ msgid "You must specify a location" #~ msgstr "U moet een locatie aangeven" #~ msgid "" #~ "You are reverting all changed paths without also reverting pending merges. " #~ "Do you want to continue?" #~ msgstr "" #~ "U maakt alle gewijzigde paden ongedaan, zonder ook de nog te voltooien " #~ "merges ongedaan te maken. Wilt u toch doorgaan?" #~ msgid "&No" #~ msgstr "&Nee" #~ msgid "&Yes" #~ msgstr "&Ja" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-pl.po0000644000000000000000000014370514556556456013221 0ustar00# Polish translation for qbzr # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the qbzr package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-12 16:38+0300\n" "PO-Revision-Date: 2010-10-02 10:55+0000\n" "Last-Translator: Radosław Piliszek \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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Dodaj" #: lib\add.py:57 msgid "Unversioned Files" msgstr "Pliki niewersjonowane" #: lib\add.py:106 msgid "Show ignored files" msgstr "Pokaż pliki ignorowane" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "Objaśnienie" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "Ładowanie..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "Kodowanie" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "Szukaj" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "Przejdź do linii" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "Pokaż opcje" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "Zawijanie wierszy" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "Wersja %s" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "Przejdź do linii: " #: lib\annotate.py:762 msgid "Go" msgstr "Przejdź" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 msgid "&Annotate this revision" msgstr "&Zaznacz tę rewizję" #: lib\bind.py:44 msgid "Bind branch" msgstr "Połącz gałęzię" #: lib\bind.py:54 msgid "Bind" msgstr "Połącz" #: lib\bind.py:56 msgid "Branch location:" msgstr "Położenie gałęzi:" #: lib\bind.py:60 msgid "Currently bound to:" msgstr "Obecnie przypisane do:" #: lib\bind.py:64 msgid "Bind to:" msgstr "Przypisz do:" #: lib\bind.py:68 lib\browse.py:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Przeglądaj" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "Wybierz lokalizację gałęzi." #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "Położenie głównej gałęzi nie sprezycowane." #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Lokalizacja:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "Rewizja:" #: lib\browse.py:84 msgid "Show" msgstr "Pokaż" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "&Filtr" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "Widok" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "Kodowanie:" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "Wyślij" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "Gałąź" #: lib\commit.py:259 msgid "&Local commit" msgstr "&Lokalne wysłanie" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" "Lokalne zmiany nie są wysyłane do głównej gałęzi dopóki zwykłe wysłanie nie " "jest dokonane." #: lib\commit.py:265 msgid "Description:" msgstr "Opis:" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" "Drzewo robocze jest przedatowane. Aby wykonać commit, zaktualizuj drzewo " "robocze." #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "Aktualizuj" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "Wiadomość" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "Pokaż niewersjonowane pliki" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "Wprowadź opis zmiany" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "&Naprawione błędy:" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "Ustal ID błędów naprawionych w tej zmianie" #: lib\commit.py:364 msgid "" "Enter the list of bug IDs in format tag:id separated by a space, e.g. " "project:123 project:765" msgstr "" "Wprowadź listę ID błędów w formacie tag:id oddzielnych spację, np. " "project:123 project:765" #: lib\commit.py:374 msgid "&Author:" msgstr "&Autor:" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "Ustal autora zmiany, jeśli jest inny niż wysyłający" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" "Wprowadź imię autora, np. Jan Kowalski <jkowalski@example.com>" #: lib\commit.py:393 msgid "Changes" msgstr "Zmiany" #: lib\commit.py:410 msgid "Pending Merges" msgstr "Oczekujące scalenia:" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "Status" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "Przejrzyj zmiany w plikach wybranych do zgłoszenia" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "Musisz wpisać wiadomość commitu." #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" "Nie wybrano żadnych zmian do wysłania.\n" "Czy na pewno chcesz wysłać?" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" "Zmiana zostanie wysłana bezpośrednio do głównej gałęzi, zachowując lokalną i " "główną gałąź zsynchronizowane." #: lib\commit.py:745 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 "" "Lokalna zmiana w gałęzi zostanie dokonana. Główna gałąź nie zostanie " "zaktualizowana dopóki zwykła zmiana nie zostanie dokonana." #: lib\commit.py:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "Różnice" #: lib\config.py:49 msgid "Default" msgstr "Domyślnie" #: lib\config.py:50 msgid "Thunderbird" msgstr "Thunderbird" #: lib\config.py:51 msgid "Evolution" msgstr "Evolution" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "Mutt" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "XDG e-mail client" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "MAPI e-mail client" #: lib\config.py:56 msgid "Editor" msgstr "Edytor" #: lib\config.py:79 msgid "Configuration" msgstr "Konfiguracja" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "&Nazwa:" #: lib\config.py:95 msgid "E-&mail:" msgstr "&E-mail" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "&Przeglądaj..." #: lib\config.py:108 msgid "&Editor:" msgstr "&Edytor:" #: lib\config.py:116 msgid "E-mail &client:" msgstr "Klient &poczty:" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "Alias" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "Polecenie" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "Usuń" #: lib\config.py:158 msgid "Abbreviation" msgstr "Skrót" #: lib\config.py:158 msgid "URL" msgstr "URL" #: lib\config.py:179 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:181 msgid "External Diff Apps:" msgstr "Zewnętrzny program diff:" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "Nazwa" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "Ogólne" #: lib\config.py:242 msgid "Aliases" msgstr "Aliasy" #: lib\config.py:243 msgid "Bug Trackers" msgstr "Bug trackers" #: lib\config.py:244 msgid "&User Interface" msgstr "&Interfejs użytkownika" #: lib\config.py:245 msgid "&Diff" msgstr "&Diff" #: lib\config.py:246 msgid "&Merge" msgstr "&Merge" #: lib\config.py:271 msgid "Spell check &language:" msgstr "Sprawdź poprawność pisownii:" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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 "Przeglądaj..." #: lib\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "Wbudowany program diff" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "Wybierz edytor" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "Konflikty" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "Plik" #: lib\conflicts.py:62 msgid "Conflict" msgstr "Konflikt" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "&Launch..." #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "Narzędzie M&erge:" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "Auto-rozwiązywanie" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "Konflikt &Merge" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "Oznacz jako &resolved" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "%d konflikt automatycznie rozwiązany." msgstr[1] "%d konfliktów automatycznie rozwiązanych." #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "&OK" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "Wszystkie konflikty rozwiązane" #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "Błąd podczas działania merge tool (kod %d)" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "Błąd" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" #: lib\conflicts.py:310 msgid "path conflict" msgstr "konflikt ścieżki" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "konflikt zawartości" #: lib\conflicts.py:312 msgid "text conflict" msgstr "konflikt tekstu" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "podwójne id" #: lib\conflicts.py:314 msgid "duplicate" msgstr "duplikat" #: lib\conflicts.py:315 msgid "parent loop" msgstr "" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "" #: lib\conflicts.py:317 msgid "missing parent" msgstr "brakujący przodek" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "usuwanie przodka" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "przodek poza katalogiem" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "Pokaż &differences" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "usunięto" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "dodano" #: lib\diff.py:266 msgid "renamed and modified" msgstr "przesunięto i zmodyfikowano" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "przesunięto" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "zmodyfikowano" #: lib\diffview.py:461 msgid "Last modified:" msgstr "Ostatnio zmodyfikowany:" #: lib\diffview.py:462 msgid "Status:" msgstr "Status:" #: lib\diffview.py:463 msgid "Kind:" msgstr "Typ:" #: lib\diffview.py:464 msgid "Properties:" msgstr "Właściwości:" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "\\ Brak pustej linii na końcu pliku" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "Drzewo dla %s" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "Drzewo" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "Rewizja %(rev)s for %(branch)s" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "Rewizja %s" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "ID rewizji: %(revid)s dla %(branch)s" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "ID rewizji: %s" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "Podgląd scalania" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "Unidiff" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "&Odśwież" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "%d plików" msgstr[1] "%d plik" msgstr[2] "%d plików" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" "Plik %s nie podlega wersjonowaniu.\n" "Operacja przerwana." #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "&Zakończ" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "Brak zmian." #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "Złe kodowanie" #: lib\encoding_selector.py:77 #, python-format msgid "Encoding \"%s\" is invalid or not supported." msgstr "Kodowanie \"%s\" jest nieprawidłowe lub nieobsługiwane." #: lib\export.py:61 lib\export.py:80 msgid "Export" msgstr "Eksport" #: lib\export.py:75 lib\uncommit.py:51 #, python-format msgid "Branch: %s" msgstr "Gałąź: %s" #: lib\export.py:146 msgid "Archive type:" msgstr "Typ archiwum:" #: lib\export.py:168 msgid "Root directory name:" msgstr "Nazwa katalogu głównego:" #: lib\export.py:236 lib\ui_branch.py:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "Opcje" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" msgstr "" #: lib\help.py:59 #, python-format msgid "No help can be found for %s" msgstr "Nie znaleziono pomocy dla %s" #: lib\help.py:103 msgid "Help" msgstr "Pomoc" #: lib\i18n.py:95 msgid "file" msgstr "plik" #: lib\i18n.py:96 msgid "directory" msgstr "katalog" #: lib\i18n.py:97 msgid "symlink" msgstr "łącze symboliczne" #: lib\i18n.py:99 msgid "fixed" msgstr "ustalony" #: lib\i18n.py:101 msgid "View text file" msgstr "Zobacz plik tekstowy" #: lib\i18n.py:102 msgid "View image file" msgstr "Zobacz obrazek" #: lib\i18n.py:103 msgid "View binary file" msgstr "Zobacz plik binarny" #: lib\i18n.py:104 msgid "View symlink" msgstr "Zobacz łącze symboliczne" #: lib\i18n.py:105 msgid "View directory" msgstr "Przeglądaj katalog" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "Nie wybrano zmian do zatwierdzenia" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "Nie wybrano zmian do przywrócenia" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "Informacje" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "Inicjalizuj" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "Historia" #: lib\log.py:142 msgid "&Search:" msgstr "&Szukaj:" #: lib\log.py:158 msgid "Messages" msgstr "Wiadomości" #: lib\log.py:160 msgid "Authors" msgstr "Autorzy" #: lib\log.py:162 msgid "Revision IDs" msgstr "ID rewizji" #: lib\log.py:164 msgid "Revision Numbers" msgstr "Numery rewizji" #: lib\log.py:166 msgid "Tags" msgstr "Znaczniki" #: lib\log.py:168 msgid "Bugs" msgstr "Błędy" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "Tekst wiadomości i plików (zindeksowanych)" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "Pokaż &różnice..." #: lib\log.py:575 msgid "View file" msgstr "Podgląd pliku" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "Przywróć do tej rewizji" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "Przywróć plik" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "Rewizja" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "Data" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Autor" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "błąd #%s" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "Pokaż różnice pliku" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "Pokaż wszystkie różnice" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "Pokaż różnice pliku" #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "Pokaż wszystkie różnice" #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "Pokaż drzewo..." #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "Otaguj rewizję..." #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "Przywróć stan z tej rewizji" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "Zaktualizuj do tej rewizji" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "Przywróć do rewizji %s revid:%s." #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "Przywróć %s do rewizji %s revid:%s." #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "Wycofaj" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "Zaktualizuj do rewizji %s revid:%s." #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "Zaktualizuj %s do rewizji %s revid:%s." #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" msgstr "" #: lib\main.py:120 msgid "Computer" msgstr "Komputer" #: lib\main.py:149 msgid "&Edit Bookmark..." msgstr "&Edytuj zakładkę..." #: lib\main.py:150 msgid "&Remove Bookmark..." msgstr "&Usuń zakładkę..." #: lib\main.py:165 msgid "Bookmarks" msgstr "Zakładki" #: lib\main.py:276 msgid "Refresh the directory tree" msgstr "Odśwież drzewo" #: lib\main.py:280 msgid "&Commit" msgstr "&Wyślij" #: lib\main.py:281 msgid "Commit changes into a new revision" msgstr "Wyślij zmiany jako nową rewizję" #: lib\main.py:285 msgid "&Push" msgstr "&Popchnij" #: lib\main.py:286 msgid "Turn this branch into a mirror of another branch" msgstr "Uczyń tę gałąź wersją lustrzaną innej gałęzi" #: lib\main.py:290 msgid "Pu&ll" msgstr "Wyciągnij" #: lib\main.py:291 msgid "Update a mirror of this branch" msgstr "Zaktualizuj wersję lustrzaną tej gałęzi" #: lib\main.py:294 msgid "&Add Bookmark..." msgstr "&Dodaj zakładkę..." #: lib\main.py:301 msgid "&File" msgstr "&Plik" #: lib\main.py:302 msgid "&Configure..." msgstr "&Konfiguruj..." #: lib\main.py:304 msgid "&Quit" msgstr "&Zakończ" #: lib\main.py:305 msgid "&View" msgstr "&Widok" #: lib\main.py:307 msgid "&Branch" msgstr "&Gałąź" #: lib\main.py:311 msgid "&Bookmarks" msgstr "&Zakładki" #: lib\main.py:313 lib\util.py:72 msgid "&Help" msgstr "&Pomoc" #: lib\main.py:314 msgid "&Help..." msgstr "&Pomoc..." #: lib\main.py:316 msgid "&About..." msgstr "&O programie..." #: lib\main.py:354 msgid "Size" msgstr "Rozmiar" #: lib\main.py:406 msgid "About QBzr" msgstr "O QBzr" #: 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 "" "Qbzr - Graficzny interfejs dla Bazaar
Wersja " "%(qbzr_version)s (bzrlib %(bzrlib_version)s)

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

http://bazaar-vcs.org/QBzr" #: lib\main.py:472 msgid "Add Bookmark" msgstr "Dodaj zakładkę" #: lib\main.py:483 msgid "Edit Bookmark" msgstr "Edytuj zakładkę" #: lib\main.py:493 msgid "Remove Bookmark" msgstr "Usuń zakładkę" #: lib\main.py:494 msgid "Do you really want to remove the selected bookmark?" msgstr "Czy na pewno chcesz usunąć wybraną zakładkę?" #: lib\plugins.py:44 msgid "Plugins" msgstr "Rozszerzenia" #: lib\plugins.py:57 msgid "Version" msgstr "Wersja" #: lib\plugins.py:58 lib\subprocess.py:480 msgid "Description" msgstr "Opis" #: lib\plugins.py:62 msgid "Directory" msgstr "Katalog" #: lib\plugins.py:64 #, python-format msgid "Plugins installed: %(rows)d" msgstr "" #: lib\plugins.py:71 msgid "Summary" msgstr "Podsumowanie" #: lib\plugins.py:72 lib\ui_branch.py:100 msgid "Locations" msgstr "Położenia" #: lib\plugins.py:111 msgid "(no description)" msgstr "(brak opisu)" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "Drzewo robocze posiada niezatwierdzone zmiany." #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "Drzewo robocze jest przedatowane, uruchom 'bzr update'." #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "Kontynuować mimo tego?" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "Nie zachowuj kopii zapasowych i przywróconych plików" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "Pokaż zmiany w plikach do przywrócenia" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "Rodzice:" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "Dzieci:" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "Data:" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "Wysyłający:" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "Autor:" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "Gałąź:" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "Tagi:" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "Błędy:" msgstr[1] "Błąd:" msgstr[2] "Błędy:" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "Rewizja" #: lib\run.py:98 msgid "Select working directory" msgstr "Wybierz katalog roboczy" #: lib\run.py:119 msgid "&Edit" msgstr "&Edycja" #: lib\run.py:167 msgid "Help for command" msgstr "Pomoc polecenia" #: lib\run.py:287 msgid "Select path to insert" msgstr "" #: lib\run.py:297 msgid "Select files to insert" msgstr "Wybierz pliki do wstawienia" #: lib\send.py:34 msgid "Send" msgstr "Wyślij" #: lib\send.py:47 msgid "Merge Directive Options" msgstr "" #: lib\send.py:53 msgid "Submit Branch:" msgstr "Zgłoś gałąź" #: lib\send.py:77 msgid "Public Branch:" msgstr "Opublikuj gałąź" #: lib\send.py:99 msgid "Remember these locations as defaults" msgstr "Ustaw te lokalizacje jako domyślne" #: 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 "Czynność" #: lib\send.py:122 msgid "Address:" msgstr "Adres:" #: lib\send.py:132 msgid "Message:" msgstr "Wiadomość:" #: lib\send.py:149 msgid "Filename:" msgstr "Nazwa pliku:" #: lib\send.py:163 msgid "Revisions:" msgstr "Rewizje" #: lib\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "&Ponów" #: lib\subprocess.py:518 msgid "Ready" msgstr "Gotowy" #: lib\subprocess.py:591 msgid "Starting..." msgstr "Uruchamianie..." #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "Porzucanie..." #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "Zakończono!" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "Wprowadź hasło" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "Wprowadż Nazwę Użytkownika" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "Błąd!" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "Nie udało się uruchomić bzr." #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "Błąd w trakcie działania bzr. (error code: %d)" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "Przerwane!" #: lib\switch.py:46 msgid "Switch" msgstr "Przełącz" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "Informacje o systemie" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "Powinieneś podać nazwę tagu." #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" "Tag \"%s\" już istnieje.\n" "Czy chcesz przenieść istniejący tag?" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" "Tag \"%s\" nie istnieje jeszcze.\n" "Chcesz utworzyć nowy tag?" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "Tag \"%s\" nie istnieje." #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" "To nie jest gałąź:\n" "%s" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "Zamknij aplikację" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "Zamknij okno błędu" #: lib\trace.py:265 msgid "Ignore Error" msgstr "Zignoruj błąd" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "zignorowano" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "niewersjonowany" #: lib\treewidget.py:327 msgid "added, missing" msgstr "dodany, brakujący" #: lib\treewidget.py:333 msgid "missing" msgstr "brakujące" #: lib\treewidget.py:340 msgid "moved" msgstr "przeniesiony" #: lib\treewidget.py:346 msgid "x-bit" msgstr "" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "Nazwa pliku" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "Niezmieniony" #: lib\treewidget.py:1303 msgid "Changed" msgstr "Zmienione" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "Nie wersjonowane" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "Ignorowany" #: lib\treewidget.py:1682 msgid "&Open" msgstr "&Otwórz" #: lib\treewidget.py:1685 msgid "&View file" msgstr "Pokaż plik" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "Pokaż &dziennik" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "Oznacz konflikt jako &rozwiązany" #: lib\treewidget.py:1714 msgid "&Add" msgstr "Dod&aj" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "&Przywróć" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "Z&mień nazwę" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "&Oznacz jako przesunięte i o zmienionej nazwie" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "&Oznacz jako przesunięte" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "Zaznacz / odznacz wszystkie" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "\"%s\" nie jest gałęzią" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "Nie istnieje drzewo robocze \"%s\"" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "&Lokalizacja:" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "&Do:" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "&Rewizja:" #: lib\ui_info.py:87 msgid "..." msgstr "..." #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" msgstr "" #: lib\ui_init.py:119 msgid "Local Directory" msgstr "Lokalny katalog" #: lib\ui_init.py:121 msgid "Repository" msgstr "Repozytorium" #: lib\ui_init.py:122 msgid "Create a new standalone tree" msgstr "Stwórz nowe odrębne drzewo" #: lib\ui_init.py:123 msgid "Ensure all revisions are appended to the log" msgstr "Sprawdź, czy wszystkie rewizje są umieszczone w historii" #: lib\ui_init.py:124 msgid "Create a new shared repository" msgstr "Stwórz nowe wspóldzielone repozytorium" #: lib\ui_init.py:125 msgid "Skip the creation of working trees in this repository" msgstr "Opuść tworzenie drzew w tym repozytorium" #: lib\ui_init.py:131 msgid "Repository Format:" msgstr "Format repozytorium:" #: lib\ui_init.py:132 msgid "Description of format" msgstr "Opis formatu" #: lib\ui_merge.py:62 msgid "Merge" msgstr "Scal" #: lib\ui_merge.py:67 lib\ui_pull.py:65 lib\ui_push.py:66 msgid "Remember this location as a default" msgstr "Zapamiętaj tę lokalizację jako domyślną" #: 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" msgstr "" #: lib\ui_new_tree.py:129 msgid "Create a new Bazaar Working Tree" msgstr "Stwórz nowe drzewo Bazaar" #: 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 "Lokalny katalog gdzie drzewo zostanie utworzone" #: lib\ui_new_tree.py:135 msgid "Working Tree Options" msgstr "Opcje drzewa" #: lib\ui_new_tree.py:136 msgid "Create a checkout" msgstr "Utwórz kopię gałęzi" #: lib\ui_new_tree.py:144 msgid "Light-weight checkout" msgstr "Utwórz lekką kopię gałęzi" #: lib\ui_new_tree.py:145 msgid "Make a local copy of the branch" msgstr "Stwórz lokalną kopię gałęzi" #: lib\ui_new_tree.py:151 msgid "Create a stacked branch referring to the source branch" msgstr "Utwórz stosową gałąź odnoszącą się do gałęzi źródłowej" #: lib\ui_new_tree.py:152 msgid "Click a link for more information about checkouts and branches." msgstr "Kliknij na łącze po więcej informacji o kopiach i gałęziach." #: lib\ui_new_tree.py:159 msgid "Most recent (tip) revision" msgstr "Ostatnia rewizja" #: lib\ui_new_tree.py:161 msgid "Show Log..." msgstr "Pokaż historię..." #: lib\ui_pull.py:60 msgid "Pull" msgstr "Wyciągnij" #: 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 "Nadpisz różnice między gałęziami" #: lib\ui_push.py:62 msgid "Push" msgstr "Popchnij" #: lib\ui_push.py:68 msgid "Use existing directory" msgstr "Użyj istniejącego katalogu" #: lib\ui_push.py:69 msgid "Create the path up to the branch if it does not exist" msgstr "Utwórz wszystkie podkatalogi ścieżki gałęzi, jeśli nie istnieją." #: lib\ui_run.py:107 msgid "Run bzr command" msgstr "Uruchom bzr" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "&Katalog roboczy" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "Kategoria" #: lib\ui_run.py:112 msgid "&Command:" msgstr "&Polecenie:" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "&Pokazuj ukryte polecenia" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "Wstaw katalog" #: lib\ui_run.py:116 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 "Wersja:" #: lib\ui_sysinfo.py:115 msgid "(bzr-version)" msgstr "(bzr-version)" #: lib\ui_sysinfo.py:116 lib\ui_sysinfo.py:126 msgid "Path:" msgstr "Ścieżka:" #: lib\ui_sysinfo.py:117 msgid "(bzr-lib-path)" msgstr "(bzr-lib-path)" #: lib\ui_sysinfo.py:118 msgid "Bazaar Configuration" msgstr "Konfiguracja Bazaar" #: lib\ui_sysinfo.py:119 msgid "Settings:" msgstr "Ustawienia:" #: lib\ui_sysinfo.py:120 msgid "(bzr-config-dir)" msgstr "(bzr-config-dir)" #: lib\ui_sysinfo.py:121 msgid "Log File:" msgstr "Plik dziennika:" #: lib\ui_sysinfo.py:122 msgid "(bzr-log-file)" msgstr "(bzr-log-file)" #: lib\ui_sysinfo.py:123 msgid "Python Interpreter" msgstr "Interpreter Pythona" #: lib\ui_sysinfo.py:125 msgid "(python-version)" msgstr "(python-version)" #: lib\ui_sysinfo.py:127 msgid "(python-file)" msgstr "(python-file)" #: lib\ui_sysinfo.py:128 msgid "Library:" msgstr "Biblioteka:" #: lib\ui_sysinfo.py:129 msgid "(python-lib-dir)" msgstr "(python-lib-dir)" #: lib\ui_tag.py:88 msgid "Edit tag" msgstr "Edytuj tag" #: lib\ui_tag.py:91 msgid "Tag" msgstr "Tag" #: lib\ui_tag.py:92 msgid "&Action:" msgstr "&Akcja:" #: lib\ui_tag.py:93 msgid "Create new tag" msgstr "Utwórz nowy tag" #: lib\ui_tag.py:94 msgid "Move existing tag" msgstr "Przenieś istniejący tag" #: lib\ui_tag.py:95 msgid "Delete existing tag" msgstr "Usuń istniejący tag" #: lib\ui_tag.py:96 msgid "&Tag name:" msgstr "&Nazwa tagu:" #: lib\ui_tag.py:98 msgid "&Select..." msgstr "&Wybierz..." #: lib\ui_update_branch.py:82 msgid "Update Branch" msgstr "Aktualizuj gałąź" #: lib\ui_update_branch.py:83 msgid "" "This directory is a branch. Please select what you would like to update" msgstr "Ten katalog jest gałęzią. Sprecyzuj co chciałbyś zaktualizować." #: lib\ui_update_branch.py:84 lib\ui_update_checkout.py:76 msgid "Update source" msgstr "Źródło aktualizacji" #: lib\ui_update_branch.py:86 msgid "Pull most recent changes from:" msgstr "Wyciągnij ostatnie zmiany z:" #: lib\ui_update_branch.py:87 msgid "Remember this as the new parent branch" msgstr "Zapamiętaj to jako gałąź-rodzic." #: 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 "Zaktualizuj drzewo do ostatnich zmian w gałęzi" #: lib\ui_update_checkout.py:74 msgid "Update Checkout" msgstr "Zaktualizuj kopię" #: lib\ui_update_checkout.py:75 #, python-format msgid "This directory is a checkout of: %s" msgstr "Ten katalog jest kopią: %s" #: lib\ui_update_checkout.py:77 msgid "Update the working tree from the bound branch" msgstr "Zaktualizuj drzewo z powiązanej gałęzi" #: lib\ui_update_checkout.py:78 msgid "Pull a different branch" msgstr "Wyciągnij inną gałąź" #: lib\unbind.py:36 msgid "Unbind branch" msgstr "Odłącz gałąź" #: lib\unbind.py:47 msgid "Unbind" msgstr "Odłącz" #: lib\unbind.py:55 msgid "Bound to:" msgstr "Przypisany do:" #: lib\uncommit.py:40 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:70 msgid "&Cancel" msgstr "&Anuluj" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "Wybierz katalog źródłowy" #: lib\util.py:585 msgid "Select Target Directory" msgstr "Wybierz katalog docelowy" #: lib\util.py:726 msgid "deleted files" msgstr "usunięte pliki" #: lib\util.py:728 msgid "added files" msgstr "dodane pliki" #: lib\util.py:730 msgid "renamed files" msgstr "przesunięte pliki" #: lib\util.py:732 msgid "modified files" msgstr "zmodyfikowane pliki" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "Pełne" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "Znajdź: " #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "Poprzedni" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "Następny" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "Rozróżniaj wielkość liter" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "Całe wyrazy" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" #~ msgid "Side by side" #~ msgstr "Obok siebie" #~ msgid "Cre&ate" #~ msgstr "Utwórz" #~ msgid "You must specify a location" #~ msgstr "Musisz podać lokalizację." #~ msgid "Submit branch:" #~ msgstr "Wyślij gałąź:" #~ msgid "Push branch:" #~ msgstr "Popchnij gałąź:" #~ msgid "Parent branch:" #~ msgstr "Gałąź-rodzic" #~ msgid "Branch format:" #~ msgstr "Format gałęzi:" #~ msgid "Working tree format:" #~ msgstr "Format drzewa:" #~ msgid "&Related Branches" #~ msgstr "&Powiązane gałęzie" #~ msgid "&Format" #~ msgstr "&Formatuj" #~ msgid "Repository format:" #~ msgstr "Format repozytorium:" #~ msgid "[binary file]" #~ msgstr "[plik binarny]" #~ msgid "Control directory format:" #~ msgstr "Format katalogu kontrolnego:" #~ msgid "No changes to commit." #~ msgstr "Brak zmian do wysłania." #~ msgid "You should provide commit message." #~ msgstr "Powinieneś podać opis zmiany." #~ msgid "Definition" #~ msgstr "Definicja" #~ msgid "External Merge Apps:" #~ msgstr "Zewnętrzny program merge:" #~ msgid "Use Configured Default" #~ msgstr "Użyj domyślnej konfiguracji" #~ msgid "Left side encoding:" #~ msgstr "Kodowanie lewostronne" #~ msgid "Right side encoding:" #~ msgstr "Kodowanie prawostronne" #~ msgid "Using" #~ msgstr "Użycie" #~ msgid "&No" #~ msgstr "&Nie" #~ msgid "&Yes" #~ msgstr "&Yes" #~ msgid "&Move" #~ msgstr "&Przenieś" #~ msgid "Public branch:" #~ msgstr "Publiczna gałąź:" #~ msgid "" #~ "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?" #~ msgid "Location has no branch" #~ msgstr "Lokacja nie zawiera gałęzi" #~ msgid "Location has no working tree" #~ msgstr "Ta lokacja nie posiada drzewa roboczego" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-pt_BR.po0000644000000000000000000014436314556556456013615 0ustar00# Brazilian Portuguese translation for qbzr # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the qbzr package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-12 16:38+0300\n" "PO-Revision-Date: 2012-04-11 20:16+0000\n" "Last-Translator: Dedeco \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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Adicionar" #: lib\add.py:57 msgid "Unversioned Files" msgstr "Arquivos não versionados" #: lib\add.py:106 msgid "Show ignored files" msgstr "Exibir arquivos ignorados" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "Anotar" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "Carregando..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "Codificação" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "Procurar" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "Ir para a linha" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "Opções de &visualização" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "Opções de visualização" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "Quebra de linha" #: lib\annotate.py:383 msgid "Tab Width" msgstr "Largura da tabulação" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "Revisão %s" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "Ir para a linha " #: lib\annotate.py:762 msgid "Go" msgstr "Ir" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "Fechar ir para a linha" #: lib\annotate.py:804 msgid "&Annotate this revision" msgstr "Fazer not&as desta revisão" #: lib\bind.py:44 msgid "Bind branch" msgstr "Vincular ramo" #: lib\bind.py:54 msgid "Bind" msgstr "Vincular" #: lib\bind.py:56 msgid "Branch location:" msgstr "Localização do ramo:" #: lib\bind.py:60 msgid "Currently bound to:" msgstr "Atualmente vinculado com:" #: lib\bind.py:64 msgid "Bind to:" msgstr "Vincular com:" #: lib\bind.py:68 lib\browse.py:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Procurar" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "Escolha o local para o ramo" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "Localização do ramo mestre não especificada." #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Localização:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "Revisão:" #: lib\browse.py:84 msgid "Show" msgstr "Exibir" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "&Filtrar" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "Visualizar" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "Codificação" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "Commit" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "Ramo" #: lib\commit.py:259 msgid "&Local commit" msgstr "Gravar &local" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" "Commis locais não serão submetidos ao branch superior até que um commit " "normal seja feito." #: lib\commit.py:265 msgid "Description:" msgstr "Descrição :" #: lib\commit.py:280 msgid "" "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." msgstr "" "O ramo local está desatualizado em relação ao ramo mestre.\n" "Para enviar para o ramo mestre, atualize o ramo local.\n" "Você também pode deixar de enviar o ramo local para continuar trabalhando " "desconectado." #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" "Árvore de trabalho está desatualizada. Para envia-la, atualize a árvore de " "trabalho." #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "Atualização" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "Mensagem" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "Exibir arquivos não-versionados" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "Digite a mensagem de commit" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "Bugs &corrigidos:" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "A lista de bugs que são corrigidos neste commit" #: lib\commit.py:364 msgid "" "Enter the list of bug IDs in format tag:id separated by a space, e.g. " "project:123 project:765" msgstr "" "A lista de IDs dos bugs é no formato tag:id separados por espaço, ex: " "projeto:123 projeto:765" #: lib\commit.py:374 msgid "&Author:" msgstr "&Autor:" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "" "Determina o autor desta alteração, caso seja diferente de quem faz o commit" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "O nome do autor, ex: João da Silva <jsilva@exemplo.com>" #: lib\commit.py:393 msgid "Changes" msgstr "Alterações" #: lib\commit.py:410 msgid "Pending Merges" msgstr "Merges Pendentes" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "Estado" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "Ver alterações nos arquivos selecionados a serem enviados." #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "Você deve fornecer uma mensagem de gravação" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" "Nenhuma alteração selecionada para gravação.\n" "Deseja gravar de qualquer maneira?" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" "Uma gravação será efetuada diretamente com o ramo mestre, mantendo os ramos " "local e mestre em sincronia." #: lib\commit.py:745 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 "" "Uma gravação local com o ramo será efetuada. O ramo mestre não será " "atualizado até que uma gravação não-local seja feita." #: lib\commit.py:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "Diff" #: lib\config.py:49 msgid "Default" msgstr "Padrão" #: lib\config.py:50 msgid "Thunderbird" msgstr "Thunderbird" #: lib\config.py:51 msgid "Evolution" msgstr "Evolution" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "Mutt" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "Cliente de e-mail XDG" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "Cliente de e-mail MAPI" #: lib\config.py:56 msgid "Editor" msgstr "Editor" #: lib\config.py:79 msgid "Configuration" msgstr "Configuração" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "&Nome:" #: lib\config.py:95 msgid "E-&mail:" msgstr "E-&mail:" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "&Navegar..." #: lib\config.py:108 msgid "&Editor:" msgstr "&Editor:" #: lib\config.py:116 msgid "E-mail &client:" msgstr "&Cliente de-mail:" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" "Largura da tabulação em caracteres\n" "esta opção é usada nas janelas qdiff, qannotate e qcat" #: lib\config.py:125 msgid "Tab &Width:" msgstr "Largura da &tabulação:" #: lib\config.py:137 msgid "Alias" msgstr "Apelido" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "Comando" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "Remover" #: lib\config.py:158 msgid "Abbreviation" msgstr "Abreviação" #: lib\config.py:158 msgid "URL" msgstr "URL" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "Programas Diff externos:" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "Nome" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "Geral" #: lib\config.py:242 msgid "Aliases" msgstr "Apelidos" #: lib\config.py:243 msgid "Bug Trackers" msgstr "Gerenciadores de Erro" #: lib\config.py:244 msgid "&User Interface" msgstr "Interface do &usuário" #: lib\config.py:245 msgid "&Diff" msgstr "&Diff" #: lib\config.py:246 msgid "&Merge" msgstr "&Mesclar" #: lib\config.py:271 msgid "Spell check &language:" msgstr "Corretor ortogáfico e &idioma" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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 "Navegar..." #: lib\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "Diff interno" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "&Ignorar e continuar" #: lib\config.py:609 msgid "&Change the values" msgstr "&Mudar os valores" #: lib\config.py:719 msgid "Select editor executable" msgstr "Selecione o executável do editor" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "Linha de comando" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "Conflitos" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "Arquivo" #: lib\conflicts.py:62 msgid "Conflict" msgstr "Conflito" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "&Lançar..." #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "F&erramenta de mesclagem" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "Resolver automaticamente" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "Marcar como &resolvido" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "%d conflito resolvido automaticamente." msgstr[1] "%d conflitos resolvidos automaticamente." #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "&OK" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "Todos os conflitos resolvidos." #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "Erro durante a execução da ferramenta de mesclagem (código %d)" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "Erro" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" "Bazaar 2.4 ou superior é necessário para suportar ferramentas de mesclagem " "externas" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "A ferramenta de mesclagem externa %(tool)s não está disponível" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" #: lib\conflicts.py:310 msgid "path conflict" msgstr "Conflito no caminho" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "conflito de conteúdos" #: lib\conflicts.py:312 msgid "text conflict" msgstr "conflito de texto" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "ID duplicada" #: lib\conflicts.py:314 msgid "duplicate" msgstr "duplicado" #: lib\conflicts.py:315 msgid "parent loop" msgstr "" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "" #: lib\conflicts.py:317 msgid "missing parent" msgstr "" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "apagando pai" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "pai não diretório" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "Mostrar &diferenças" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "removido" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "adicionado" #: lib\diff.py:266 msgid "renamed and modified" msgstr "renomeado e modificado" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "renomeado" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "modificado" #: lib\diffview.py:461 msgid "Last modified:" msgstr "Última modificação:" #: lib\diffview.py:462 msgid "Status:" msgstr "Estado:" #: lib\diffview.py:463 msgid "Kind:" msgstr "Tipo:" #: lib\diffview.py:464 msgid "Properties:" msgstr "Propriedades:" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "[arquivo binário (%d bytes)]" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "\\ Nenhuma linha no fim do arquivo" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "Árvore de trabalho para %s" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "Árvore de trabalho" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "Revisão %(rev)s para %(branch)s" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "Revisão %s" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "ID da revisão: %(revid)s para %(branch)s" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "Identificador da revisão: %s" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "Visualizar mesclagem" #: lib\diffwindow.py:218 msgid "&Find" msgstr "&Procurar" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "Procurar no painel ativo" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "Diff unificado" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "Alternar modo de visualização entre lado a lado e visão única" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "&Atualizar" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "Diff &externo" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "Executar um aplicativo diff externo" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "&Completar" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "Largura da tabulação" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "Largura da tabulação do lado esquerdo" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "Largura da tabulação do lado direito" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "Codificação do lado esquerdo" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "Codificação do lado direito" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "&Ignorar mudanças de espaçamento" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "%d arquivo" msgstr[1] "%d arquivos" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" "O arquivo %s não está versionado.\n" "Operação abortada." #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "&Fechar" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "Nenhuma alteração encontrada." #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "Codificação errada" #: lib\encoding_selector.py:77 #, python-format msgid "Encoding \"%s\" is invalid or not supported." msgstr "A codificação \"%s\" não é válida ou não é suportada." #: lib\export.py:61 lib\export.py:80 msgid "Export" msgstr "Exportar" #: lib\export.py:75 lib\uncommit.py:51 #, python-format msgid "Branch: %s" msgstr "Ramo: %s" #: lib\export.py:146 msgid "Archive type:" msgstr "Tipo do arquivo:" #: lib\export.py:168 msgid "Root directory name:" msgstr "Nome do diretório raiz:" #: lib\export.py:236 lib\ui_branch.py:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "Opções" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" msgstr "" #: lib\help.py:59 #, python-format msgid "No help can be found for %s" msgstr "Nenhuma ajuda pôde ser encontrada para %s" #: lib\help.py:103 msgid "Help" msgstr "Ajuda" #: lib\i18n.py:95 msgid "file" msgstr "arquivo" #: lib\i18n.py:96 msgid "directory" msgstr "diretório" #: lib\i18n.py:97 msgid "symlink" msgstr "link simbólico" #: lib\i18n.py:99 msgid "fixed" msgstr "corrigido" #: lib\i18n.py:101 msgid "View text file" msgstr "Visualizar arquivo texto" #: lib\i18n.py:102 msgid "View image file" msgstr "Visualizar imagem arquivo" #: lib\i18n.py:103 msgid "View binary file" msgstr "Visualizar arquivos binários" #: lib\i18n.py:104 msgid "View symlink" msgstr "" #: lib\i18n.py:105 msgid "View directory" msgstr "Visualizar diretório" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "Ignorar" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "Arquivos desconhecidos" #: lib\ignore.py:58 msgid "Extension" msgstr "Extensão" #: lib\ignore.py:59 msgid "Ignore as" msgstr "Ignorar como" #: lib\ignore.py:67 msgid "No action" msgstr "Nenhuma ação" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "Ignorar todos os arquivos com esta extensão" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "Padrão indiferente a letras maiúsculas ou minúsculas" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "Ignorar pelo nome-base" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "Ignorar pelo nome-completo" #: lib\ignore.py:226 msgid "No action selected" msgstr "Nenhuma ação selecionada" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "Informações" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "Inicializar" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "Log" #: lib\log.py:142 msgid "&Search:" msgstr "&Pesquisar:" #: lib\log.py:158 msgid "Messages" msgstr "Mensagens" #: lib\log.py:160 msgid "Authors" msgstr "Autores" #: lib\log.py:162 msgid "Revision IDs" msgstr "IDs das Revisões" #: lib\log.py:164 msgid "Revision Numbers" msgstr "Números de Revisão" #: lib\log.py:166 msgid "Tags" msgstr "Tags" #: lib\log.py:168 msgid "Bugs" msgstr "Bugs" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" "Não é possível especificar caminhos de arquivo diferentes e ramos diferentes " "ao mesmo tempo." #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "Mensagens e arquivos de texto (indexados)" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "Mostrar &diferenças" #: lib\log.py:575 msgid "View file" msgstr "Visualizar Arquivo" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "Salvar arquivo nesta revisão como..." #: lib\log.py:583 msgid "Revert to this revision" msgstr "Reverter para esta revisão" #: lib\log.py:862 msgid "Not a file" msgstr "Não é um arquivo" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" "A operação é suportada somente para um único arquivo,\n" "e não para um %s." #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "Salvar arquivo nesta revisão como..." #: lib\log.py:878 msgid "Revert File" msgstr "Reverter arquivo" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" "Tem certeza que você quer reverter esse arquivo ao estado em que ele era na " "revisão selecionada?" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "Rev" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "Data" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Autor" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "bug #%s" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "Mostrar &diferenças do arquivo" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "Mostrar todas as &diferenças" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "Mostrar &diferenças do arquivo" #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "Mostrar todas as &diferenças..." #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "Mos&trar a árvore" #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "" #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "R&verter para esta revisão" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "At&ualizar para esta revisão" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "Reverter para a revisão %s revid: %s." #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "Reverter %s para a revisão %s revid: %s." #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "Reverter" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "Atualizar para a revisão %s revid: %s." #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "Atualizar %s para a revisão %s revid: %s." #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" msgstr "" #: lib\main.py:120 msgid "Computer" msgstr "Computador" #: lib\main.py:149 msgid "&Edit Bookmark..." msgstr "&Editar marcador..." #: lib\main.py:150 msgid "&Remove Bookmark..." msgstr "&Remover marcador.." #: lib\main.py:165 msgid "Bookmarks" msgstr "Marcadores" #: lib\main.py:276 msgid "Refresh the directory tree" msgstr "Atualizar a árvore de diretórios" #: lib\main.py:280 msgid "&Commit" msgstr "&Commit" #: lib\main.py:281 msgid "Commit changes into a new revision" msgstr "" #: lib\main.py:285 msgid "&Push" msgstr "Em&purrar" #: lib\main.py:286 msgid "Turn this branch into a mirror of another branch" msgstr "Fazer deste ramo um espelho de outro ramo" #: lib\main.py:290 msgid "Pu&ll" msgstr "" #: lib\main.py:291 msgid "Update a mirror of this branch" msgstr "Atualizar um espelho desse ramo" #: lib\main.py:294 msgid "&Add Bookmark..." msgstr "&Adicionar marcador..." #: lib\main.py:301 msgid "&File" msgstr "&Arquivo" #: lib\main.py:302 msgid "&Configure..." msgstr "Con&figurar..." #: lib\main.py:304 msgid "&Quit" msgstr "&Sair" #: lib\main.py:305 msgid "&View" msgstr "&Ver" #: lib\main.py:307 msgid "&Branch" msgstr "&Branch" #: lib\main.py:311 msgid "&Bookmarks" msgstr "&Marcadores" #: lib\main.py:313 lib\util.py:72 msgid "&Help" msgstr "A&juda" #: lib\main.py:314 msgid "&Help..." msgstr "A&juda..." #: lib\main.py:316 msgid "&About..." msgstr "&Sobre..." #: lib\main.py:354 msgid "Size" msgstr "Tamanho" #: lib\main.py:406 msgid "About QBzr" msgstr "Sobre o QBzr" #: 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 "Adicionar Marcador" #: lib\main.py:483 msgid "Edit Bookmark" msgstr "Editar Marcador" #: lib\main.py:493 msgid "Remove Bookmark" msgstr "Remover Marcador" #: lib\main.py:494 msgid "Do you really want to remove the selected bookmark?" msgstr "Realmente quer remover o marcador selecionado?" #: lib\plugins.py:44 msgid "Plugins" msgstr "Plug-ins" #: lib\plugins.py:57 msgid "Version" msgstr "Versão" #: lib\plugins.py:58 lib\subprocess.py:480 msgid "Description" msgstr "Descrição" #: lib\plugins.py:62 msgid "Directory" msgstr "Diretório" #: lib\plugins.py:64 #, python-format msgid "Plugins installed: %(rows)d" msgstr "Plug-ins instalados: %(rows)d" #: lib\plugins.py:71 msgid "Summary" msgstr "Sumário" #: lib\plugins.py:72 lib\ui_branch.py:100 msgid "Locations" msgstr "Locais" #: lib\plugins.py:111 msgid "(no description)" msgstr "(sem descrição)" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "A árvore de trabalho tem alterações não enviadas" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "" "A árvore de trabalho está desatualizada, por favor execute 'bzr update'" #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "Deseja continuar assim mesmo?" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "Selecionar mudanças para reversão" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "Não salvar cópias de arquivos revertidos" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "Ver mudanças em arquivos selecionados para reversão" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "Pais:" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "Filhos:" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "Assinatura:" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "Data:" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "Autor:" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "Autor:" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "Ramo:" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "Tags:" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "Bug:" msgstr[1] "Bugs:" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "Revisão" #: lib\run.py:98 msgid "Select working directory" msgstr "Selecione o diretório de trabalho" #: lib\run.py:119 msgid "&Edit" msgstr "&Editar" #: lib\run.py:167 msgid "Help for command" msgstr "Ajuda para o comando" #: lib\run.py:287 msgid "Select path to insert" msgstr "Selecione o caminho para inserir" #: lib\run.py:297 msgid "Select files to insert" msgstr "Selecione os arquivos para inserir" #: lib\send.py:34 msgid "Send" msgstr "Enviar" #: lib\send.py:47 msgid "Merge Directive Options" msgstr "" #: lib\send.py:53 msgid "Submit Branch:" msgstr "Enviar ramo:" #: lib\send.py:77 msgid "Public Branch:" msgstr "Ramo público" #: lib\send.py:99 msgid "Remember these locations as defaults" msgstr "Lembrar destes locais como padrão" #: 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 "Ação" #: lib\send.py:122 msgid "Address:" msgstr "Endereço:" #: lib\send.py:132 msgid "Message:" msgstr "Mensagem:" #: lib\send.py:149 msgid "Filename:" msgstr "Nome do arquivo:" #: lib\send.py:163 msgid "Revisions:" msgstr "Revisões:" #: lib\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "Tenta&r novamente" #: lib\subprocess.py:518 msgid "Ready" msgstr "Pronto" #: lib\subprocess.py:591 msgid "Starting..." msgstr "Iniciando..." #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "Não foi possível localizar \"bzr.exe\"." #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "Não foi possível localizar o script \"bzr\"." #: lib\subprocess.py:694 msgid "Aborting..." msgstr "Abortando..." #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "Terminado!" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "Digite a senha" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "Informe o nome do usuário" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "Falhou!" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "Falhou ao iniciar o bzr." #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "Error ao executar o bzr. (código de erro: %d)" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "Abortado!" #: lib\switch.py:46 msgid "Switch" msgstr "Alternar" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "Informação do sistema" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "Você deve especificar o nome da tag" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "A tag \"%s\" não existe" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" "Não é um ramo:\n" "%s" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "Fechar a janela %s" #: lib\trace.py:248 msgid "Close Window" msgstr "Fecha Janela" #: lib\trace.py:250 msgid "Close Application" msgstr "Fechar o aplicativo" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "Fechar o diálogo de erro" #: lib\trace.py:265 msgid "Ignore Error" msgstr "Ignorar erro" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "Mostrar detalhes do erro >>>" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "<<< Ocultar detalhes do erro" #: lib\treewidget.py:322 msgid "ignored" msgstr "ignorado" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "não-versionado" #: lib\treewidget.py:327 msgid "added, missing" msgstr "" #: lib\treewidget.py:333 msgid "missing" msgstr "faltando" #: lib\treewidget.py:340 msgid "moved" msgstr "movido" #: lib\treewidget.py:346 msgid "x-bit" msgstr "x-bit" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "Nome do arquivo" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "Sem alterações" #: lib\treewidget.py:1303 msgid "Changed" msgstr "Alterado" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "Não Versionado" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "Ignorado" #: lib\treewidget.py:1682 msgid "&Open" msgstr "Abrir" #: lib\treewidget.py:1685 msgid "&View file" msgstr "&Visualizar arquivo" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "Mostrar &anotações" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "Mostrar &log" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "Marcar conflito &resolvido" #: lib\treewidget.py:1714 msgid "&Add" msgstr "&Adicionar" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "&Reverter" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "Re&nomear" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "&Marcar como movido e renomeado" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "&Marcar como movido" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "&Marcar como renomeado" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "Você deseja realmente reverter o(s) arquivo(s) selecionado(s)?" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "Marcar/Desmarcar tudo" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "Não é um ramo \"%s\"" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "Nenhuma árvore de trabalho existe para \"%s\"" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "&Localização:" #: lib\ui_branch.py:101 msgid "&From:" msgstr "De:" #: lib\ui_branch.py:103 msgid "&To:" msgstr "&Para:" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "Revisão:" #: lib\ui_info.py:87 msgid "..." msgstr "..." #: lib\ui_info.py:89 msgid "&Basic" msgstr "&Básico" #: lib\ui_info.py:91 msgid "&Detailed" msgstr "&Detalhado" #: lib\ui_init.py:119 msgid "Local Directory" msgstr "Diretório Local" #: lib\ui_init.py:121 msgid "Repository" msgstr "Repositório" #: lib\ui_init.py:122 msgid "Create a new standalone tree" msgstr "Criar uma nova árvore independente" #: 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 "Criar um novo repositório compartilhado" #: lib\ui_init.py:125 msgid "Skip the creation of working trees in this repository" msgstr "Ignorar a criação de árvores de trabalho neste repositório" #: lib\ui_init.py:131 msgid "Repository Format:" msgstr "Formato do repositório:" #: lib\ui_init.py:132 msgid "Description of format" msgstr "Descrição do formato" #: lib\ui_merge.py:62 msgid "Merge" msgstr "Mesclar" #: lib\ui_merge.py:67 lib\ui_pull.py:65 lib\ui_push.py:66 msgid "Remember this location as a default" msgstr "Usar este endereço por padrão" #: 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_merge_config.py:58 msgid "Form" msgstr "Formulário" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "Ferramentas de mesclagem externas" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" msgstr "Definir como Padrão" #: lib\ui_new_tree.py:129 msgid "Create a new Bazaar Working Tree" msgstr "Criar uma nova árvore de trabalho Bazaar" #: 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 "Diretório local onde a árvore de trabalho será criada" #: lib\ui_new_tree.py:135 msgid "Working Tree Options" msgstr "Opções da Árvore de Trabalho" #: 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 "Mostrar log..." #: lib\ui_pull.py:60 msgid "Pull" msgstr "Pull" #: 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 "Sobrescrever as diferenças entre os branches" #: lib\ui_push.py:62 msgid "Push" msgstr "Push" #: lib\ui_push.py:68 msgid "Use existing directory" msgstr "Usar diretório já existente" #: lib\ui_push.py:69 msgid "Create the path up to the branch if it does not exist" msgstr "Criar todos os diretórios do caminho para o branch caso não existam" #: lib\ui_run.py:107 msgid "Run bzr command" msgstr "Executar um comando bzr" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "Diretório de &trabalho:" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "C&ategoria:" #: lib\ui_run.py:112 msgid "&Command:" msgstr "&Comando:" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "&Mostrar comandos ocultos" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "&Opções e argumentos para o comando:" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "Inserir diretório..." #: lib\ui_run.py:116 msgid "Insert &filenames..." msgstr "Inserir nomes de &arquivos" #: lib\ui_sysinfo.py:113 msgid "Bazaar Library" msgstr "Biblioteca Bazaar" #: lib\ui_sysinfo.py:114 lib\ui_sysinfo.py:124 msgid "Version:" msgstr "Versão:" #: lib\ui_sysinfo.py:115 msgid "(bzr-version)" msgstr "(bzr-version)" #: lib\ui_sysinfo.py:116 lib\ui_sysinfo.py:126 msgid "Path:" msgstr "Caminho:" #: lib\ui_sysinfo.py:117 msgid "(bzr-lib-path)" msgstr "(bzr-lib-path)" #: lib\ui_sysinfo.py:118 msgid "Bazaar Configuration" msgstr "Configuração do Bazaar" #: lib\ui_sysinfo.py:119 msgid "Settings:" msgstr "Configurações:" #: lib\ui_sysinfo.py:120 msgid "(bzr-config-dir)" msgstr "(bzr-config-dir)" #: lib\ui_sysinfo.py:121 msgid "Log File:" msgstr "Arquivo de log:" #: lib\ui_sysinfo.py:122 msgid "(bzr-log-file)" msgstr "(bzr-log-file)" #: lib\ui_sysinfo.py:123 msgid "Python Interpreter" msgstr "Interpretador Python" #: lib\ui_sysinfo.py:125 msgid "(python-version)" msgstr "(python-version)" #: lib\ui_sysinfo.py:127 msgid "(python-file)" msgstr "(python-file)" #: lib\ui_sysinfo.py:128 msgid "Library:" msgstr "Biblioteca:" #: lib\ui_sysinfo.py:129 msgid "(python-lib-dir)" msgstr "(python-lib-dir)" #: lib\ui_tag.py:88 msgid "Edit tag" msgstr "Editar tag" #: lib\ui_tag.py:91 msgid "Tag" msgstr "Tag" #: lib\ui_tag.py:92 msgid "&Action:" msgstr "&Ação:" #: lib\ui_tag.py:93 msgid "Create new tag" msgstr "Criar nova tag" #: lib\ui_tag.py:94 msgid "Move existing tag" msgstr "Mover tag existente" #: lib\ui_tag.py:95 msgid "Delete existing tag" msgstr "Remover tag existente" #: lib\ui_tag.py:96 msgid "&Tag name:" msgstr "Nome da &tag:" #: lib\ui_tag.py:98 msgid "&Select..." msgstr "&Selecionar..." #: lib\ui_update_branch.py:82 msgid "Update Branch" msgstr "Atualizar ramo..." #: lib\ui_update_branch.py:83 msgid "" "This directory is a branch. Please select what you would like to update" msgstr "" "Este diretório é um ramo. Por favor, escolha o que você gostaria de atualizar" #: 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:47 msgid "Unbind" msgstr "" #: lib\unbind.py:55 msgid "Bound to:" msgstr "" #: lib\uncommit.py:40 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 "Outra revisão:" #: lib\uncommit.py:104 msgid "No other revision specified." msgstr "Nenhuma outra revisão especificada." #: lib\uncommit.py:122 msgid "Do you really want to uncommit these revisions?" msgstr "" #: lib\update.py:33 msgid "Update working tree" msgstr "Atualizar árvore de trabalho" #: lib\update.py:34 #, python-format msgid "Update tree %s" msgstr "Atualizar árvore %s" #: lib\util.py:70 msgid "&Cancel" msgstr "&Cancelar" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "Selecionar diretório de origem" #: lib\util.py:585 msgid "Select Target Directory" msgstr "Selecionar o diretório de destino" #: lib\util.py:726 msgid "deleted files" msgstr "arquivos apagados" #: lib\util.py:728 msgid "added files" msgstr "arquivos adicionados" #: lib\util.py:730 msgid "renamed files" msgstr "arquivos renomeados" #: lib\util.py:732 msgid "modified files" msgstr "arquivos modificados" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "(sem mensagens)" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "Verificar assinaturas" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "Todo o conteúdo enviado foi assinado com chaves de verificação" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "excluir arquivo" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "Renomear:" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "Adicionar arquivo" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "modificar texto" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "Blocos" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "Concluído" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "Bloco anterior" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "Bloco seguinte" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "Usar editor" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "Destruir" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "Selecionar tudo" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "Desmarcar tudo" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "&Layout" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "Editor para mudanças não está definido." #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "Nenhuma alteração selecionada." #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "Operação abortada porque os arquivos alvo foram mudados." #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "Editado pelo editor de mudanças.\n" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "Id" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "Ignorar espaços em branco" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "Manter" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "Excluir" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "Mostrar lista de arquivos" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "Encontrar: " #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "Anterior" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "Próximo" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "Case sensitive" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "Palavras inteiras" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" #~ msgid "Side by side" #~ msgstr "Lado a lado" #~ msgid "[binary file]" #~ msgstr "[arquivo binário]" #~ msgid "No changes to commit." #~ msgstr "Nenhuma mudança a ser submetida." #~ msgid "You must specify a location" #~ msgstr "Você deve especificar uma localização" #~ msgid "&No" #~ msgstr "&Não" #~ msgid "&Yes" #~ msgstr "Sim" #~ msgid "Cre&ate" #~ msgstr "Cri&ar" #~ msgid "&Move" #~ msgstr "&Mover" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-ru.po0000644000000000000000000016550414556556456013235 0ustar00# Russian translations for QBzr. # Alexander Belchenko , 2007. # msgid "" msgstr "" "Project-Id-Version: QBzr 0.7.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-12 16:38+0300\n" "PO-Revision-Date: 2012-03-28 08:53+0000\n" "Last-Translator: Alexander Belchenko \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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Добавить" #: lib\add.py:57 msgid "Unversioned Files" msgstr "Неверсифицированные файлы" #: lib\add.py:106 msgid "Show ignored files" msgstr "Показать игнорируемые файлы" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "Аннотация" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "Загрузка..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "Кодировка" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "Найти" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "Перейти к строке" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "&Параметры просмотра" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "Параметры просмотра" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "Перенос слов" #: lib\annotate.py:383 msgid "Tab Width" msgstr "Ширина табуляции" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "Ревизия %s" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "Перейти к строке: " #: lib\annotate.py:762 msgid "Go" msgstr "Перейти" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "Закрыть Перейти к строке" #: lib\annotate.py:804 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:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Обзор" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "Выбрать расположение ветки" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "Не указано расположение основной ветви" #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Расположение:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "Ревизия:" #: lib\browse.py:84 msgid "Show" msgstr "Показать" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "&Фильтр" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "Просмотр" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "Кодировка:" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "Зафиксировать" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "Ветка" #: lib\commit.py:259 msgid "&Local commit" msgstr "&Локальная фиксация" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" "Локальные фиксации не передаются в главную ветку до тех пор, пока не будет " "сделана обычная фиксация." #: lib\commit.py:265 msgid "Description:" msgstr "Описание:" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" "Рабочее дерево устарело. Для закрепления необходимо обновить рабочее дерево." #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "Обновить" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "Сообщение" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "Показать неизвестные файлы" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "Введите комментарий к этой ревизии" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "&Исправленные ошибки:" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "Указать номера ошибок, исправленных в этой ревизии" #: lib\commit.py:364 msgid "" "Enter the list of bug IDs in format tag:id separated by a space, e.g. " "project:123 project:765" msgstr "" "Введите список номеров ошибок в формате tag:id, несколько ошибок " "разделяются пробелами, например: project:123 project:765" #: lib\commit.py:374 msgid "&Author:" msgstr "&Автор:" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "" "Указать автора этих изменений, если он отличается от того, кто делает " "фиксацию ревизии" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" "Введите имя автора, например: John Doe <jdoe@example.com>" #: lib\commit.py:393 msgid "Changes" msgstr "Изменения" #: lib\commit.py:410 msgid "Pending Merges" msgstr "Незавершённое слияние" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "Состояние" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "Просмотр изменений в файлах, выбранных для фиксации" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "Вы должны предоставить комментарий к закреплению." #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" "Вы не отметили ни одного файла для фиксации.\n" "Вы хотите зафикисировать в таком виде?" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" "В результате фиксации новая ревизия будет помещена в главную и локальную " "ветки, таким образом обе ветки будут синхронизированы." #: lib\commit.py:745 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:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "Различия" #: lib\config.py:49 msgid "Default" msgstr "По умолчанию" #: lib\config.py:50 msgid "Thunderbird" msgstr "Thunderbird" #: lib\config.py:51 msgid "Evolution" msgstr "Evolution" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "Mutt" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "XDG e-mail клиент" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "MAPI e-mail клиент" #: lib\config.py:56 msgid "Editor" msgstr "Текстовый редактор" #: lib\config.py:79 msgid "Configuration" msgstr "Конфигурация" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "&Имя:" #: lib\config.py:95 msgid "E-&mail:" msgstr "E-&mail:" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "Обзор..." #: lib\config.py:108 msgid "&Editor:" msgstr "&Редактор:" #: lib\config.py:116 msgid "E-mail &client:" msgstr "E-mail &клиент:" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "Псевдоним" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "Команда" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "Удалить" #: lib\config.py:158 msgid "Abbreviation" msgstr "Аббревиатура" #: lib\config.py:158 msgid "URL" msgstr "URL" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "Показывать вставку/удаления внутри строк зеленым/красным цветом" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "Программы просмотра изменений:" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "Имя" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "Общие" #: lib\config.py:242 msgid "Aliases" msgstr "Псевдонимы" #: lib\config.py:243 msgid "Bug Trackers" msgstr "Баг трекеры" #: lib\config.py:244 msgid "&User Interface" msgstr "&Интерфейс" #: lib\config.py:245 msgid "&Diff" msgstr "Просмотр изменений" #: lib\config.py:246 msgid "&Merge" msgstr "Объединение" #: lib\config.py:271 msgid "Spell check &language:" msgstr "Проверка орфографии:" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "Встроенный просмотрщик" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "Выберите программу-редактор" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "Конфликты" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "Файл" #: lib\conflicts.py:62 msgid "Conflict" msgstr "Конфликт" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "Запустить..." #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "Программа для объединения изменений:" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "Автоматически" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "&Объединить конфликты" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "Снять пометку о конфликте" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "Автоматически решён %d конфликт." msgstr[1] "Автоматически решены %d конфликта." msgstr[2] "Автоматически решены %d конфликтов." #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "&ОК" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "Все конфликты автоматически решены." #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "Ошибка при попытке запуска программы (код %d)" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "Ошибка" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "Отсутствие флага: %s. Настроить в qconfig на вкладке слияния." #: lib\conflicts.py:310 msgid "path conflict" msgstr "конфликт путей" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "конфликт содержания" #: lib\conflicts.py:312 msgid "text conflict" msgstr "текстовый конфликт" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "совпадающий id" #: lib\conflicts.py:314 msgid "duplicate" msgstr "дубликат" #: lib\conflicts.py:315 msgid "parent loop" msgstr "цикл родителя" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "" #: lib\conflicts.py:317 msgid "missing parent" msgstr "отсутствует родительский каталог" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "удаление родителя" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "не каталогизированный родитель" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "Показать различия" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "удален" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "добавлен" #: lib\diff.py:266 msgid "renamed and modified" msgstr "переименован и изменен" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "переименован" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "изменён" #: lib\diffview.py:461 msgid "Last modified:" msgstr "Последние изменения:" #: lib\diffview.py:462 msgid "Status:" msgstr "Состояние:" #: lib\diffview.py:463 msgid "Kind:" msgstr "Тип:" #: lib\diffview.py:464 msgid "Properties:" msgstr "Свойства:" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "\\ Нет символа перевода строки в конце файла" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "Рабочая копия ветки %s" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "Рабочая копия" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "Версия %(rev)s в ветке %(branch)s" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "Версия %s" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "Revid: %(revid)s для %(branch)s" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "Revid: %s" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "Результат объединения" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "Unidiff" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "&Обновить" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "%d файл" msgstr[1] "%d файла" msgstr[2] "%d файлов" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" "Изменения в файле \"%s\" не отслеживаются.\n" "Операция прервана." #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "&Закрыть" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "Изменения не найдены." #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "Неверная кодировка" #: lib\encoding_selector.py:77 #, python-format msgid "Encoding \"%s\" is invalid or not supported." msgstr "Кодировка \"%s\" не распознана или не поддерживается." #: 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 "Ветка: %s" #: 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:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "Параметры" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" msgstr "" #: lib\help.py:59 #, python-format msgid "No help can be found for %s" msgstr "Нет справки для %s" #: lib\help.py:103 msgid "Help" msgstr "Справка" #: lib\i18n.py:95 msgid "file" msgstr "файл" #: lib\i18n.py:96 msgid "directory" msgstr "каталог" #: lib\i18n.py:97 msgid "symlink" msgstr "символьная ссылка" #: lib\i18n.py:99 msgid "fixed" msgstr "исправлена" #: lib\i18n.py:101 msgid "View text file" msgstr "Просмотр текстового файла" #: lib\i18n.py:102 msgid "View image file" msgstr "Просмотр графического файла" #: lib\i18n.py:103 msgid "View binary file" msgstr "Просмотр бинарного файла" #: lib\i18n.py:104 msgid "View symlink" msgstr "Просмотр символьной ссылки" #: lib\i18n.py:105 msgid "View directory" msgstr "Просмотр каталога" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "Нет файлов для фиксации" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "Нет файлов для операции возврата к предыдущей версии" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "Сведения" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "Инициализировать" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "Журнал" #: lib\log.py:142 msgid "&Search:" msgstr "&Поиск:" #: lib\log.py:158 msgid "Messages" msgstr "Комментарий" #: lib\log.py:160 msgid "Authors" msgstr "Авторы" #: lib\log.py:162 msgid "Revision IDs" msgstr "Revision IDs" #: lib\log.py:164 msgid "Revision Numbers" msgstr "Номера версий" #: lib\log.py:166 msgid "Tags" msgstr "Теги" #: lib\log.py:168 msgid "Bugs" msgstr "Номера ошибок" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "Сообщения и текстовые файлы (проиндексированные)" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "Показать &различия..." #: lib\log.py:575 msgid "View file" msgstr "Просмотр файла" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "Версия" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "Дата" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Автор" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "bug #%s" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "Показать различия для файла" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "Показать различия для всех файлов" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "Показать различия для файла..." #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "Показать различия для всех файлов..." #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "Дерево файлов" #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "Добавить тег..." #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "Возврат к предыдущей версии" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" 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: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 "&Push" #: lib\main.py:286 msgid "Turn this branch into a mirror of another branch" msgstr "Сделать эту ветку копией другой ветки" #: lib\main.py:290 msgid "Pu&ll" msgstr "Pu&ll" #: 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:72 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 "О QBzr" #: 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 "" "QBzr — Графический пользовательский интерфейс для программы " "Bazaar
Версия %(qbzr_version)s (bzrlib " "%(bzrlib_version)s)

Copyright © 2006-2008 Lukáš Lalinský и " "другие

http://bazaar-" "vcs.org/QBzr" #: 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:480 msgid "Description" msgstr "Описание" #: lib\plugins.py:62 msgid "Directory" msgstr "Каталог" #: lib\plugins.py:64 #, python-format msgid "Plugins installed: %(rows)d" msgstr "Установленные плагины: %(rows)d" #: lib\plugins.py:71 msgid "Summary" msgstr "Кратко" #: lib\plugins.py:72 lib\ui_branch.py:100 msgid "Locations" msgstr "Расположение" #: lib\plugins.py:111 msgid "(no description)" msgstr "(нет описания)" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "Рабочие файлы содержат незафиксированные изменения." #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "" "Рабочая копия не синхронизирована с главной веткой, запустите команду bzr " "update." #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "Хотите продолжить в любом случае?" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "Выбрать файлы для отмены изменений" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "Не сохранять резервные копии для обрабатываемых файлов" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "Забыть объединение" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "" "Просмотр изменений в файлах, которые необходимо возвратить к предыдущей " "версии" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "Предыдущие версии:" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "Следующие версии:" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "Незафиксированные изменения в рабочих файлах" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "Дата:" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "Зафиксировал:" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "Автор:" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "Ветка:" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "Теги:" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "Ошибка:" msgstr[1] "Ошибки:" msgstr[2] "Ошибки:" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "Версия" #: lib\run.py:98 msgid "Select working directory" msgstr "Выберите рабочий каталог" #: lib\run.py:119 msgid "&Edit" msgstr "&Изменить" #: lib\run.py:167 msgid "Help for command" msgstr "Справка для выбранной команды" #: lib\run.py:287 msgid "Select path to insert" msgstr "Выберите путь для вставки" #: lib\run.py:297 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\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "&Повторить" #: lib\subprocess.py:518 msgid "Ready" msgstr "Готов" #: lib\subprocess.py:591 msgid "Starting..." msgstr "Начинаем операцию..." #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "Останавливаем операцию..." #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "Завершено!" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "Введите пароль" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "Введите имя пользователя" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "Неудачно!" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "Не могу запустить bzr." #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "Ошибка во время работы bzr. (код ошибки: %d)" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "Прервано!" #: lib\switch.py:46 msgid "Switch" msgstr "Переключить" #: lib\switch.py:57 msgid "Switch checkout" msgstr "Переключить рабочую копию" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "Тяжеловесная рабочая копия:" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "Легковесная рабочая копия:" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "Рабочая копия для ветки:" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "Переключить на ветку:" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "Создать ветку перед переключением" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "Информация о системе" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "Вы должны указать имя тега" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" "Таг \"%s\" уже существует.\n" "Хотите переместить существующий таг?" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" "Тег \"%s\" еще не существует.\n" "Хотите создать новый тег?" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "Тег \"%s\" не существует" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" "Это не ветка:\n" "%s" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "игнорируемый" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "неизвестный" #: lib\treewidget.py:327 msgid "added, missing" msgstr "добавлен, отсутствует" #: lib\treewidget.py:333 msgid "missing" msgstr "отсутствует" #: lib\treewidget.py:340 msgid "moved" msgstr "перемещен" #: lib\treewidget.py:346 msgid "x-bit" msgstr "" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "Имя файла" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "Не изменен" #: lib\treewidget.py:1303 msgid "Changed" msgstr "Изменен" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "Не версионирован" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "Игнорируется" #: lib\treewidget.py:1682 msgid "&Open" msgstr "&Открыть" #: lib\treewidget.py:1685 msgid "&View file" msgstr "&Просмотр файла" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "Показать &аннотацию" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "Показать &журнал" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "Снять пометку о конфликте" #: lib\treewidget.py:1714 msgid "&Add" msgstr "&Добавить" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "&Отменить изменения" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "Переименовать" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "Пометить как перемещенный и переименованный" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "Пометить как перемещенный" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "Пометить как переименованный" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "" "Вы действительно хотите вернуть выбранные файлы в исходное состояние?" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "Внешние слияния" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "Выбрать все файлы" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "Это не ветка: \"%s\"" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "Отсутствует рабочая копия для ветки \"%s\"" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "&Расположение:" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "&Куда:" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "&Версия:" #: lib\ui_info.py:87 msgid "..." msgstr "..." #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" 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 "Запомнить этот URL в качестве значения по умолчанию." #: 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" msgstr "" #: lib\ui_new_tree.py:129 msgid "Create a new Bazaar Working Tree" 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 "Локальный каталог, где рабочие дерево будет создано" #: 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:62 msgid "Push" 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:107 msgid "Run bzr command" msgstr "Запустить команду bzr" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "&Рабочий каталог:" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "К&атегория:" #: lib\ui_run.py:112 msgid "&Command:" msgstr "&Команда:" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "&Отображать скрытые комманды" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "&Опции и аргументы для команды:" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "Вставить &каталог..." #: lib\ui_run.py:116 msgid "Insert &filenames..." msgstr "Вставить &файл..." #: lib\ui_sysinfo.py:113 msgid "Bazaar Library" msgstr "Библиотека Bazaar" #: lib\ui_sysinfo.py:114 lib\ui_sysinfo.py:124 msgid "Version:" msgstr "Версия:" #: lib\ui_sysinfo.py:115 msgid "(bzr-version)" msgstr "(bzr-version)" #: lib\ui_sysinfo.py:116 lib\ui_sysinfo.py:126 msgid "Path:" msgstr "Путь:" #: lib\ui_sysinfo.py:117 msgid "(bzr-lib-path)" msgstr "(bzr-lib-path)" #: lib\ui_sysinfo.py:118 msgid "Bazaar Configuration" msgstr "Конфигурация Bazaar" #: lib\ui_sysinfo.py:119 msgid "Settings:" msgstr "Настройки:" #: lib\ui_sysinfo.py:120 msgid "(bzr-config-dir)" msgstr "(bzr-config-dir)" #: lib\ui_sysinfo.py:121 msgid "Log File:" msgstr "Файл журнала:" #: lib\ui_sysinfo.py:122 msgid "(bzr-log-file)" msgstr "(bzr-log-file)" #: lib\ui_sysinfo.py:123 msgid "Python Interpreter" msgstr "Python-интерпретатор" #: lib\ui_sysinfo.py:125 msgid "(python-version)" msgstr "(python-version)" #: lib\ui_sysinfo.py:127 msgid "(python-file)" msgstr "(python-file)" #: lib\ui_sysinfo.py:128 msgid "Library:" msgstr "Библиотека:" #: lib\ui_sysinfo.py:129 msgid "(python-lib-dir)" msgstr "(python-lib-dir)" #: 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 "Это рабочая копия ветки: %s" #: 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:47 msgid "Unbind" msgstr "Отвязать" #: lib\unbind.py:55 msgid "Bound to:" msgstr "Связать с:" #: lib\uncommit.py:40 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 "Обновить рабочую копию %s" #: lib\util.py:70 msgid "&Cancel" msgstr "&Отмена" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "Выберите каталог-источник" #: lib\util.py:585 msgid "Select Target Directory" msgstr "Выберите целевой каталог" #: lib\util.py:726 msgid "deleted files" msgstr "удаленные файлы" #: lib\util.py:728 msgid "added files" msgstr "добавленные файлы" #: lib\util.py:730 msgid "renamed files" msgstr "переименованные файлы" #: lib\util.py:732 msgid "modified files" msgstr "измененные файлы" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "(нет комментария)" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "Показывать файлы целиком" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" #~ msgid "[binary file]" #~ msgstr "[бинарный файл]" #~ msgid "Side by side" #~ msgstr "Две панели рядом" #~ msgid "You must specify a location" #~ msgstr "Вы должны указать каталог" #~ msgid "&Format" #~ msgstr "&Формат" #~ msgid "Branch format:" #~ msgstr "Формат ветки:" #~ msgid "Control directory format:" #~ msgstr "Формат bzr-каталога:" #~ msgid "Repository format:" #~ msgstr "Формат репозитория:" #~ msgid "Working tree format:" #~ msgstr "Формат рабочей копии:" #~ msgid "&Related Branches" #~ msgstr "Родственные ветки" #~ msgid "Cre&ate" #~ msgstr "&Создать" #~ msgid "Parent branch:" #~ msgstr "Родительская ветка:" #~ msgid "No changes to commit." #~ msgstr "Нечего фиксировать." #~ msgid "You should provide commit message." #~ msgstr "Вы должны написать комментарий к фиксации" #~ msgid "Definition" #~ msgstr "Определение" #~ msgid "External Merge Apps:" #~ msgstr "Внешние программы объединения:" #~ msgid "&No" #~ msgstr "&Нет" #~ msgid "&Yes" #~ msgstr "&Да" #~ msgid "" #~ "You are reverting all changed paths without also reverting pending merges. " #~ "Do you want to continue?" #~ msgstr "" #~ "Вы собираетесь отменить изменения во всех файлах, но оставить незаконченное " #~ "объединение. Вы уверены, что хотите продолжить?" #~ msgid "Use Configured Default" #~ msgstr "Использовать установки по умолчанию" #~ msgid "Left side encoding:" #~ msgstr "Кодировка слева:" #~ msgid "Right side encoding:" #~ msgstr "Кодировка справа:" #~ msgid "&Move" #~ msgstr "Перемещение" #~ msgid "Location has no working tree" #~ msgstr "Место не имеет рабочего дерева" #~ msgid "Location has no branch" #~ msgstr "Место не имеет ветви" #~ msgid "Submit branch:" #~ msgstr "Отправить ветвь:" #~ msgid "Public branch:" #~ msgstr "Опубликовать ветвь:" #~ msgid "" #~ "Some of the files selected cannot be recoverd if removed. Are you sure you " #~ "want to remove these files?" #~ msgstr "" #~ "Некоторые из выбранных файлов не могут быть восстановлены, если будут " #~ "удалены. Вы уверены, что хотите удалить эти файлы?" #~ msgid "Push branch:" #~ msgstr "Поместить ветвь:" #~ msgid "Using" #~ msgstr "Используя" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-sk.po0000644000000000000000000012303014556556456013210 0ustar00# translation of sk.po to Slovak # Copyright (C) YEAR ORGANIZATION # # Lukáš Lalinský , 2007. msgid "" msgstr "" "Project-Id-Version: sk\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-12 16:38+0300\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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Pridať" #: lib\add.py:57 msgid "Unversioned Files" msgstr "" #: lib\add.py:106 msgid "Show ignored files" msgstr "" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "Anotovať" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "" #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "" #: lib\annotate.py:762 msgid "Go" msgstr "" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 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:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Prehliadať" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "" #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Umiestnenie:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "Revízia:" #: lib\browse.py:84 msgid "Show" msgstr "Zobraziť" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "Odovzdať" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "" #: lib\commit.py:259 msgid "&Local commit" msgstr "" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" #: lib\commit.py:265 msgid "Description:" msgstr "" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "Správa" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "Zobraziť neverzované súbory" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "Vložte správu" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "&Opravené chyby:" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "Nastaví identifikátory chýb opravených týmto odovzdaním" #: lib\commit.py:364 msgid "" "Enter the list of bug IDs in format tag:id separated by a space, e.g. " "project:123 project:765" msgstr "" "Vložte zoznam identifikátorov chýb vo formáte značka:id oddelených " "medzerou, napr. projekt:123 projekt:765" #: lib\commit.py:374 msgid "&Author:" msgstr "&Autor:" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "" "Nastaví meno autora tejto zmeny, v prípade že je odlišné od odovzdávateľa." #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" "Vložte meno autora, napr. Ján Mrkvička <jmrkvicka@example.com>" #: lib\commit.py:393 msgid "Changes" msgstr "Zmeny" #: lib\commit.py:410 msgid "Pending Merges" msgstr "Čakajúce zlúčenia" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "Stav" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" #: lib\commit.py:745 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:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "Rozdiely" #: lib\config.py:49 msgid "Default" msgstr "Štandardný" #: lib\config.py:50 msgid "Thunderbird" msgstr "Thunderbird" #: lib\config.py:51 msgid "Evolution" msgstr "Evolution" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "Mutt" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "XDG e-mailový klient" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "MAPI e-mailový klient" #: lib\config.py:56 msgid "Editor" msgstr "" #: lib\config.py:79 msgid "Configuration" msgstr "Nastavenie" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "Me&no:" #: lib\config.py:95 msgid "E-&mail:" msgstr "E-&mail:" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "" #: lib\config.py:108 msgid "&Editor:" msgstr "" #: lib\config.py:116 msgid "E-mail &client:" msgstr "E-mail &klient:" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "Alias" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "Príkaz" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "Odstrániť" #: lib\config.py:158 msgid "Abbreviation" msgstr "" #: lib\config.py:158 msgid "URL" msgstr "" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "Názov" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "Všeobecné" #: lib\config.py:242 msgid "Aliases" msgstr "Aliasy" #: lib\config.py:243 msgid "Bug Trackers" msgstr "" #: lib\config.py:244 msgid "&User Interface" msgstr "" #: lib\config.py:245 msgid "&Diff" msgstr "" #: lib\config.py:246 msgid "&Merge" msgstr "" #: lib\config.py:271 msgid "Spell check &language:" msgstr "" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "Súbor" #: lib\conflicts.py:62 msgid "Conflict" msgstr "" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "" #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "" msgstr[1] "" #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "&OK" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "" #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" #: lib\conflicts.py:310 msgid "path conflict" msgstr "" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "" #: lib\conflicts.py:312 msgid "text conflict" msgstr "" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "" #: lib\conflicts.py:314 msgid "duplicate" msgstr "" #: lib\conflicts.py:315 msgid "parent loop" msgstr "" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "" #: lib\conflicts.py:317 msgid "missing parent" msgstr "" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "vymazané" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "pridané" #: lib\diff.py:266 msgid "renamed and modified" msgstr "premenované a zmeneé" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "premenované" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "zmenené" #: lib\diffview.py:461 msgid "Last modified:" msgstr "Naposledy zmenené:" #: lib\diffview.py:462 msgid "Status:" msgstr "Stav:" #: lib\diffview.py:463 msgid "Kind:" msgstr "Typ:" #: lib\diffview.py:464 msgid "Properties:" msgstr "" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "Unifikované" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "%d súborov" msgstr[1] "%d súbor" msgstr[2] "%d súbory" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "&Zavrieť" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "" #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "" #: lib\encoding_selector.py:77 #, 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:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" 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:95 msgid "file" msgstr "súbor" #: lib\i18n.py:96 msgid "directory" msgstr "adresár" #: lib\i18n.py:97 msgid "symlink" msgstr "symbolický odkaz" #: lib\i18n.py:99 msgid "fixed" msgstr "" #: lib\i18n.py:101 msgid "View text file" msgstr "" #: lib\i18n.py:102 msgid "View image file" msgstr "" #: lib\i18n.py:103 msgid "View binary file" msgstr "" #: lib\i18n.py:104 msgid "View symlink" msgstr "" #: lib\i18n.py:105 msgid "View directory" msgstr "" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "História" #: lib\log.py:142 msgid "&Search:" msgstr "&Vyhľadávanie:" #: lib\log.py:158 msgid "Messages" msgstr "Správy" #: lib\log.py:160 msgid "Authors" msgstr "" #: lib\log.py:162 msgid "Revision IDs" msgstr "" #: lib\log.py:164 msgid "Revision Numbers" msgstr "" #: lib\log.py:166 msgid "Tags" msgstr "" #: lib\log.py:168 msgid "Bugs" msgstr "" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "" #: lib\log.py:575 msgid "View file" msgstr "" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "Rev" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "Dátum" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Autor" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "" #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "" #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "" #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "" #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" 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: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:72 msgid "&Help" msgstr "&Pomoc" #: 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:480 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 "Zhrnutie" #: lib\plugins.py:72 lib\ui_branch.py:100 msgid "Locations" msgstr "" #: lib\plugins.py:111 msgid "(no description)" msgstr "" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "" #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "Odovzdávateľ:" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "Autor:" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "Značky:" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "" msgstr[1] "" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "" #: lib\run.py:98 msgid "Select working directory" msgstr "" #: lib\run.py:119 msgid "&Edit" msgstr "" #: lib\run.py:167 msgid "Help for command" msgstr "" #: lib\run.py:287 msgid "Select path to insert" msgstr "" #: lib\run.py:297 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\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "" #: lib\subprocess.py:518 msgid "Ready" msgstr "" #: lib\subprocess.py:591 msgid "Starting..." msgstr "" #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "" #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "" #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "" #: lib\switch.py:46 msgid "Switch" msgstr "" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "neverzované" #: lib\treewidget.py:327 msgid "added, missing" msgstr "" #: lib\treewidget.py:333 msgid "missing" msgstr "" #: lib\treewidget.py:340 msgid "moved" msgstr "" #: lib\treewidget.py:346 msgid "x-bit" msgstr "" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "" #: lib\treewidget.py:1303 msgid "Changed" msgstr "" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "" #: lib\treewidget.py:1682 msgid "&Open" msgstr "" #: lib\treewidget.py:1685 msgid "&View file" msgstr "" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "" #: lib\treewidget.py:1714 msgid "&Add" msgstr "" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "" #: lib\ui_info.py:87 msgid "..." msgstr "" #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" 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:62 msgid "Push" 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:107 msgid "Run bzr command" msgstr "" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "" #: lib\ui_run.py:112 msgid "&Command:" msgstr "" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "" #: lib\ui_run.py:116 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:47 msgid "Unbind" msgstr "" #: lib\unbind.py:55 msgid "Bound to:" msgstr "" #: lib\uncommit.py:40 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:70 msgid "&Cancel" msgstr "&Zrušiť" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "" #: lib\util.py:585 msgid "Select Target Directory" msgstr "" #: lib\util.py:726 msgid "deleted files" msgstr "" #: lib\util.py:728 msgid "added files" msgstr "" #: lib\util.py:730 msgid "renamed files" msgstr "" #: lib\util.py:732 msgid "modified files" msgstr "" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" #~ msgid "Side by side" #~ msgstr "Po stránách" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-sl.po0000644000000000000000000012117614556556456013222 0ustar00# Slovenian translation for qbzr # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the qbzr package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-12 16:38+0300\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" "Content-Type: text/plain; charset=UTF-8\n" "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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "" #: lib\add.py:57 msgid "Unversioned Files" msgstr "" #: lib\add.py:106 msgid "Show ignored files" msgstr "" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "" #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "" #: lib\annotate.py:762 msgid "Go" msgstr "" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 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:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "" #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "" #: lib\browse.py:84 msgid "Show" msgstr "" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "" #: lib\commit.py:259 msgid "&Local commit" msgstr "" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" #: lib\commit.py:265 msgid "Description:" msgstr "" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "" #: lib\commit.py:364 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:374 msgid "&Author:" msgstr "" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" #: lib\commit.py:393 msgid "Changes" msgstr "" #: lib\commit.py:410 msgid "Pending Merges" msgstr "" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" #: lib\commit.py:745 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:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "" #: lib\config.py:49 msgid "Default" msgstr "" #: lib\config.py:50 msgid "Thunderbird" msgstr "" #: lib\config.py:51 msgid "Evolution" msgstr "" #: lib\config.py:52 msgid "KMail" msgstr "" #: lib\config.py:53 msgid "Mutt" msgstr "" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "" #: lib\config.py:56 msgid "Editor" msgstr "" #: lib\config.py:79 msgid "Configuration" msgstr "" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "" #: lib\config.py:95 msgid "E-&mail:" msgstr "" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "" #: lib\config.py:108 msgid "&Editor:" msgstr "" #: lib\config.py:116 msgid "E-mail &client:" msgstr "" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "" #: lib\config.py:158 msgid "Abbreviation" msgstr "" #: lib\config.py:158 msgid "URL" msgstr "" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "" #: lib\config.py:242 msgid "Aliases" msgstr "" #: lib\config.py:243 msgid "Bug Trackers" msgstr "" #: lib\config.py:244 msgid "&User Interface" msgstr "" #: lib\config.py:245 msgid "&Diff" msgstr "" #: lib\config.py:246 msgid "&Merge" msgstr "" #: lib\config.py:271 msgid "Spell check &language:" msgstr "" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "" #: lib\conflicts.py:62 msgid "Conflict" msgstr "" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "" #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "" msgstr[1] "" #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "" #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" #: lib\conflicts.py:310 msgid "path conflict" msgstr "" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "" #: lib\conflicts.py:312 msgid "text conflict" msgstr "" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "" #: lib\conflicts.py:314 msgid "duplicate" msgstr "" #: lib\conflicts.py:315 msgid "parent loop" msgstr "" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "" #: lib\conflicts.py:317 msgid "missing parent" msgstr "" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "" #: lib\diff.py:266 msgid "renamed and modified" msgstr "" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "" #: lib\diffview.py:461 msgid "Last modified:" msgstr "" #: lib\diffview.py:462 msgid "Status:" msgstr "" #: lib\diffview.py:463 msgid "Kind:" msgstr "" #: lib\diffview.py:464 msgid "Properties:" msgstr "" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "" msgstr[1] "" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "" #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "" #: lib\encoding_selector.py:77 #, 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:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" 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:95 msgid "file" msgstr "" #: lib\i18n.py:96 msgid "directory" msgstr "" #: lib\i18n.py:97 msgid "symlink" msgstr "" #: lib\i18n.py:99 msgid "fixed" msgstr "" #: lib\i18n.py:101 msgid "View text file" msgstr "" #: lib\i18n.py:102 msgid "View image file" msgstr "" #: lib\i18n.py:103 msgid "View binary file" msgstr "" #: lib\i18n.py:104 msgid "View symlink" msgstr "" #: lib\i18n.py:105 msgid "View directory" msgstr "" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "" #: lib\log.py:142 msgid "&Search:" msgstr "" #: lib\log.py:158 msgid "Messages" msgstr "" #: lib\log.py:160 msgid "Authors" msgstr "" #: lib\log.py:162 msgid "Revision IDs" msgstr "" #: lib\log.py:164 msgid "Revision Numbers" msgstr "" #: lib\log.py:166 msgid "Tags" msgstr "" #: lib\log.py:168 msgid "Bugs" msgstr "" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "" #: lib\log.py:575 msgid "View file" msgstr "" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "" #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "" #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "" #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "" #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" 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: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:72 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:480 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 lib\ui_branch.py:100 msgid "Locations" msgstr "" #: lib\plugins.py:111 msgid "(no description)" msgstr "" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "" #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "" msgstr[1] "" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "" #: lib\run.py:98 msgid "Select working directory" msgstr "" #: lib\run.py:119 msgid "&Edit" msgstr "" #: lib\run.py:167 msgid "Help for command" msgstr "" #: lib\run.py:287 msgid "Select path to insert" msgstr "" #: lib\run.py:297 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\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "" #: lib\subprocess.py:518 msgid "Ready" msgstr "" #: lib\subprocess.py:591 msgid "Starting..." msgstr "" #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "" #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "" #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "" #: lib\switch.py:46 msgid "Switch" msgstr "" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "" #: lib\treewidget.py:327 msgid "added, missing" msgstr "" #: lib\treewidget.py:333 msgid "missing" msgstr "" #: lib\treewidget.py:340 msgid "moved" msgstr "" #: lib\treewidget.py:346 msgid "x-bit" msgstr "" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "" #: lib\treewidget.py:1303 msgid "Changed" msgstr "" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "" #: lib\treewidget.py:1682 msgid "&Open" msgstr "" #: lib\treewidget.py:1685 msgid "&View file" msgstr "" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "" #: lib\treewidget.py:1714 msgid "&Add" msgstr "" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "" #: lib\ui_info.py:87 msgid "..." msgstr "" #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" 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:62 msgid "Push" 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:107 msgid "Run bzr command" msgstr "" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "" #: lib\ui_run.py:112 msgid "&Command:" msgstr "" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "" #: lib\ui_run.py:116 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:47 msgid "Unbind" msgstr "" #: lib\unbind.py:55 msgid "Bound to:" msgstr "" #: lib\uncommit.py:40 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:70 msgid "&Cancel" msgstr "" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "" #: lib\util.py:585 msgid "Select Target Directory" msgstr "" #: lib\util.py:726 msgid "deleted files" msgstr "" #: lib\util.py:728 msgid "added files" msgstr "" #: lib\util.py:730 msgid "renamed files" msgstr "" #: lib\util.py:732 msgid "modified files" msgstr "" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-sr.po0000644000000000000000000012124014556556456013220 0ustar00# Serbian translation for qbzr # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the qbzr package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-12 16:38+0300\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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Додај" #: lib\add.py:57 msgid "Unversioned Files" msgstr "" #: lib\add.py:106 msgid "Show ignored files" msgstr "" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "" #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "" #: lib\annotate.py:762 msgid "Go" msgstr "" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 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:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "" #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "" #: lib\browse.py:84 msgid "Show" msgstr "" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "" #: lib\commit.py:259 msgid "&Local commit" msgstr "" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" #: lib\commit.py:265 msgid "Description:" msgstr "" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "" #: lib\commit.py:364 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:374 msgid "&Author:" msgstr "" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" #: lib\commit.py:393 msgid "Changes" msgstr "" #: lib\commit.py:410 msgid "Pending Merges" msgstr "" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" #: lib\commit.py:745 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:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "" #: lib\config.py:49 msgid "Default" msgstr "" #: lib\config.py:50 msgid "Thunderbird" msgstr "" #: lib\config.py:51 msgid "Evolution" msgstr "" #: lib\config.py:52 msgid "KMail" msgstr "" #: lib\config.py:53 msgid "Mutt" msgstr "" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "" #: lib\config.py:56 msgid "Editor" msgstr "" #: lib\config.py:79 msgid "Configuration" msgstr "" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "" #: lib\config.py:95 msgid "E-&mail:" msgstr "" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "" #: lib\config.py:108 msgid "&Editor:" msgstr "" #: lib\config.py:116 msgid "E-mail &client:" msgstr "" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "" #: lib\config.py:158 msgid "Abbreviation" msgstr "" #: lib\config.py:158 msgid "URL" msgstr "" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "" #: lib\config.py:242 msgid "Aliases" msgstr "" #: lib\config.py:243 msgid "Bug Trackers" msgstr "" #: lib\config.py:244 msgid "&User Interface" msgstr "" #: lib\config.py:245 msgid "&Diff" msgstr "" #: lib\config.py:246 msgid "&Merge" msgstr "" #: lib\config.py:271 msgid "Spell check &language:" msgstr "" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "" #: lib\conflicts.py:62 msgid "Conflict" msgstr "" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "" #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "" msgstr[1] "" #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "" #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" #: lib\conflicts.py:310 msgid "path conflict" msgstr "" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "" #: lib\conflicts.py:312 msgid "text conflict" msgstr "" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "" #: lib\conflicts.py:314 msgid "duplicate" msgstr "" #: lib\conflicts.py:315 msgid "parent loop" msgstr "" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "" #: lib\conflicts.py:317 msgid "missing parent" msgstr "" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "" #: lib\diff.py:266 msgid "renamed and modified" msgstr "" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "" #: lib\diffview.py:461 msgid "Last modified:" msgstr "" #: lib\diffview.py:462 msgid "Status:" msgstr "" #: lib\diffview.py:463 msgid "Kind:" msgstr "" #: lib\diffview.py:464 msgid "Properties:" msgstr "" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "" msgstr[1] "" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "" #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "" #: lib\encoding_selector.py:77 #, 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:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" 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:95 msgid "file" msgstr "" #: lib\i18n.py:96 msgid "directory" msgstr "" #: lib\i18n.py:97 msgid "symlink" msgstr "" #: lib\i18n.py:99 msgid "fixed" msgstr "" #: lib\i18n.py:101 msgid "View text file" msgstr "" #: lib\i18n.py:102 msgid "View image file" msgstr "" #: lib\i18n.py:103 msgid "View binary file" msgstr "" #: lib\i18n.py:104 msgid "View symlink" msgstr "" #: lib\i18n.py:105 msgid "View directory" msgstr "" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "" #: lib\log.py:142 msgid "&Search:" msgstr "" #: lib\log.py:158 msgid "Messages" msgstr "" #: lib\log.py:160 msgid "Authors" msgstr "" #: lib\log.py:162 msgid "Revision IDs" msgstr "" #: lib\log.py:164 msgid "Revision Numbers" msgstr "" #: lib\log.py:166 msgid "Tags" msgstr "" #: lib\log.py:168 msgid "Bugs" msgstr "" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "" #: lib\log.py:575 msgid "View file" msgstr "" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "" #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "" #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "" #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "" #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" 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: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:72 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:480 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 lib\ui_branch.py:100 msgid "Locations" msgstr "" #: lib\plugins.py:111 msgid "(no description)" msgstr "" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "" #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "" msgstr[1] "" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "" #: lib\run.py:98 msgid "Select working directory" msgstr "" #: lib\run.py:119 msgid "&Edit" msgstr "" #: lib\run.py:167 msgid "Help for command" msgstr "" #: lib\run.py:287 msgid "Select path to insert" msgstr "" #: lib\run.py:297 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\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "" #: lib\subprocess.py:518 msgid "Ready" msgstr "" #: lib\subprocess.py:591 msgid "Starting..." msgstr "" #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "" #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "" #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "" #: lib\switch.py:46 msgid "Switch" msgstr "" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "" #: lib\treewidget.py:327 msgid "added, missing" msgstr "" #: lib\treewidget.py:333 msgid "missing" msgstr "" #: lib\treewidget.py:340 msgid "moved" msgstr "" #: lib\treewidget.py:346 msgid "x-bit" msgstr "" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "" #: lib\treewidget.py:1303 msgid "Changed" msgstr "" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "" #: lib\treewidget.py:1682 msgid "&Open" msgstr "" #: lib\treewidget.py:1685 msgid "&View file" msgstr "" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "" #: lib\treewidget.py:1714 msgid "&Add" msgstr "" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "" #: lib\ui_info.py:87 msgid "..." msgstr "" #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" 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:62 msgid "Push" 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:107 msgid "Run bzr command" msgstr "" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "" #: lib\ui_run.py:112 msgid "&Command:" msgstr "" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "" #: lib\ui_run.py:116 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:47 msgid "Unbind" msgstr "" #: lib\unbind.py:55 msgid "Bound to:" msgstr "" #: lib\uncommit.py:40 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:70 msgid "&Cancel" msgstr "" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "" #: lib\util.py:585 msgid "Select Target Directory" msgstr "" #: lib\util.py:726 msgid "deleted files" msgstr "" #: lib\util.py:728 msgid "added files" msgstr "" #: lib\util.py:730 msgid "renamed files" msgstr "" #: lib\util.py:732 msgid "modified files" msgstr "" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-sv.po0000644000000000000000000012254714556556456013237 0ustar00# Swedish translation for qbzr # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the qbzr package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-12 16:38+0300\n" "PO-Revision-Date: 2011-07-25 22:47+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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Lägg till" #: lib\add.py:57 msgid "Unversioned Files" msgstr "" #: lib\add.py:106 msgid "Show ignored files" msgstr "" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "Anteckning" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "Laddar..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "" #: lib\annotate.py:762 msgid "Go" msgstr "" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 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:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Bläddra" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "" #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Plats:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "Revision:" #: lib\browse.py:84 msgid "Show" msgstr "Visa" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "&Filter" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "Visa" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "Teckenkodning:" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "Verkställ" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "Gren" #: lib\commit.py:259 msgid "&Local commit" msgstr "" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" #: lib\commit.py:265 msgid "Description:" msgstr "Beskrivning:" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "Meddelande" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "%Fixade buggar:" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "" #: lib\commit.py:364 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:374 msgid "&Author:" msgstr "&Upphovsman:" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" #: lib\commit.py:393 msgid "Changes" msgstr "Ändringar" #: lib\commit.py:410 msgid "Pending Merges" msgstr "" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "Status" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" #: lib\commit.py:745 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:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "Diff" #: lib\config.py:49 msgid "Default" msgstr "Standard" #: lib\config.py:50 msgid "Thunderbird" msgstr "Thunderbird" #: lib\config.py:51 msgid "Evolution" msgstr "Evolution" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "" #: lib\config.py:56 msgid "Editor" msgstr "Redigerare" #: lib\config.py:79 msgid "Configuration" msgstr "Konfiguration" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "&Namn:" #: lib\config.py:95 msgid "E-&mail:" msgstr "E-&post:" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "" #: lib\config.py:108 msgid "&Editor:" msgstr "&Redigerare" #: lib\config.py:116 msgid "E-mail &client:" msgstr "E-post &klient:" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "Alias" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "Kommando" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "Ta bort" #: lib\config.py:158 msgid "Abbreviation" msgstr "Förkortning" #: lib\config.py:158 msgid "URL" msgstr "URL" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "Namn" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "Allmänt" #: lib\config.py:242 msgid "Aliases" msgstr "Alias" #: lib\config.py:243 msgid "Bug Trackers" msgstr "" #: lib\config.py:244 msgid "&User Interface" msgstr "" #: lib\config.py:245 msgid "&Diff" msgstr "" #: lib\config.py:246 msgid "&Merge" msgstr "" #: lib\config.py:271 msgid "Spell check &language:" msgstr "" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "Fil" #: lib\conflicts.py:62 msgid "Conflict" msgstr "" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "" #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "" msgstr[1] "" #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "&OK" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "" #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" #: lib\conflicts.py:310 msgid "path conflict" msgstr "" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "" #: lib\conflicts.py:312 msgid "text conflict" msgstr "" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "" #: lib\conflicts.py:314 msgid "duplicate" msgstr "" #: lib\conflicts.py:315 msgid "parent loop" msgstr "" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "" #: lib\conflicts.py:317 msgid "missing parent" msgstr "" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "borttagen" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "tillagd" #: lib\diff.py:266 msgid "renamed and modified" msgstr "omdöpt och ändrad" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "omdöpt" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "ändrad" #: lib\diffview.py:461 msgid "Last modified:" msgstr "Senast ändrad:" #: lib\diffview.py:462 msgid "Status:" msgstr "Status:" #: lib\diffview.py:463 msgid "Kind:" msgstr "Sort:" #: lib\diffview.py:464 msgid "Properties:" msgstr "Egenskaper:" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "&Uppdatera" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "%d fil" msgstr[1] "%d filer" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "&Stäng" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "" #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "" #: lib\encoding_selector.py:77 #, 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:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "Alternativ" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" 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:95 msgid "file" msgstr "fil" #: lib\i18n.py:96 msgid "directory" msgstr "katalog" #: lib\i18n.py:97 msgid "symlink" msgstr "" #: lib\i18n.py:99 msgid "fixed" msgstr "fixad" #: lib\i18n.py:101 msgid "View text file" msgstr "" #: lib\i18n.py:102 msgid "View image file" msgstr "" #: lib\i18n.py:103 msgid "View binary file" msgstr "" #: lib\i18n.py:104 msgid "View symlink" msgstr "" #: lib\i18n.py:105 msgid "View directory" msgstr "" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "Logg" #: lib\log.py:142 msgid "&Search:" msgstr "&Sök:" #: lib\log.py:158 msgid "Messages" msgstr "Meddelanden" #: lib\log.py:160 msgid "Authors" msgstr "Upphovsmän" #: lib\log.py:162 msgid "Revision IDs" msgstr "" #: lib\log.py:164 msgid "Revision Numbers" msgstr "" #: lib\log.py:166 msgid "Tags" msgstr "" #: lib\log.py:168 msgid "Bugs" msgstr "" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "" #: lib\log.py:575 msgid "View file" msgstr "" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "Rev" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "Datum" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Upphovsman" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "" #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "" #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "" #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "" #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "Återgå" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" msgstr "" #: lib\main.py:120 msgid "Computer" msgstr "Dator" #: lib\main.py:149 msgid "&Edit Bookmark..." msgstr "" #: lib\main.py:150 msgid "&Remove Bookmark..." msgstr "" #: lib\main.py:165 msgid "Bookmarks" msgstr "Bokmärken" #: 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 "&Fil" #: lib\main.py:302 msgid "&Configure..." msgstr "&Konfigurera..." #: lib\main.py:304 msgid "&Quit" msgstr "&Avsluta" #: lib\main.py:305 msgid "&View" msgstr "&Visa" #: lib\main.py:307 msgid "&Branch" msgstr "" #: lib\main.py:311 msgid "&Bookmarks" msgstr "&Bokmärken" #: lib\main.py:313 lib\util.py:72 msgid "&Help" msgstr "&Hjälp" #: lib\main.py:314 msgid "&Help..." msgstr "&Hjälp..." #: lib\main.py:316 msgid "&About..." msgstr "&Om..." #: lib\main.py:354 msgid "Size" msgstr "Storlek" #: lib\main.py:406 msgid "About QBzr" msgstr "Om QBzr" #: 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 "Lägg till bokmärke" #: lib\main.py:483 msgid "Edit Bookmark" msgstr "Redigera bokmärke" #: lib\main.py:493 msgid "Remove Bookmark" msgstr "Ta bort bokmärke" #: 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:480 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 "Sammanfattning" #: lib\plugins.py:72 lib\ui_branch.py:100 msgid "Locations" msgstr "" #: lib\plugins.py:111 msgid "(no description)" msgstr "" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "" #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "Incheckare:" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "Upphovsman:" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "Taggar:" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "Bugg:" msgstr[1] "Buggar:" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "" #: lib\run.py:98 msgid "Select working directory" msgstr "" #: lib\run.py:119 msgid "&Edit" msgstr "" #: lib\run.py:167 msgid "Help for command" msgstr "" #: lib\run.py:287 msgid "Select path to insert" msgstr "" #: lib\run.py:297 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\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "" #: lib\subprocess.py:518 msgid "Ready" msgstr "" #: lib\subprocess.py:591 msgid "Starting..." msgstr "Startar..." #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "Avbryter..." #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "Färdig!" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "" #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "" #: lib\switch.py:46 msgid "Switch" msgstr "" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "" #: lib\treewidget.py:327 msgid "added, missing" msgstr "" #: lib\treewidget.py:333 msgid "missing" msgstr "" #: lib\treewidget.py:340 msgid "moved" msgstr "" #: lib\treewidget.py:346 msgid "x-bit" msgstr "" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "" #: lib\treewidget.py:1303 msgid "Changed" msgstr "" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "" #: lib\treewidget.py:1682 msgid "&Open" msgstr "" #: lib\treewidget.py:1685 msgid "&View file" msgstr "" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "" #: lib\treewidget.py:1714 msgid "&Add" msgstr "" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "&Plats:" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "&Till:" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "" #: lib\ui_info.py:87 msgid "..." msgstr "" #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" 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 "Dra in" #: 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:62 msgid "Push" msgstr "Sänd" #: 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:107 msgid "Run bzr command" msgstr "" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "" #: lib\ui_run.py:112 msgid "&Command:" msgstr "" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "" #: lib\ui_run.py:116 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:47 msgid "Unbind" msgstr "" #: lib\unbind.py:55 msgid "Bound to:" msgstr "" #: lib\uncommit.py:40 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:70 msgid "&Cancel" msgstr "&Avbryt" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "" #: lib\util.py:585 msgid "Select Target Directory" msgstr "" #: lib\util.py:726 msgid "deleted files" msgstr "" #: lib\util.py:728 msgid "added files" msgstr "" #: lib\util.py:730 msgid "renamed files" msgstr "" #: lib\util.py:732 msgid "modified files" msgstr "" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" #~ msgid "Side by side" #~ msgstr "Sida vid sida" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-th.po0000644000000000000000000012126714556556456013220 0ustar00# 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: 2012-07-12 16:38+0300\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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "เพิ่ม" #: lib\add.py:57 msgid "Unversioned Files" msgstr "" #: lib\add.py:106 msgid "Show ignored files" msgstr "" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "กำลังโหลด..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "" #: lib\annotate.py:762 msgid "Go" msgstr "" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 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:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "" #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "" #: lib\browse.py:84 msgid "Show" msgstr "แสดง" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "" #: lib\commit.py:259 msgid "&Local commit" msgstr "" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" #: lib\commit.py:265 msgid "Description:" msgstr "คำบรรยาย:" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "" #: lib\commit.py:364 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:374 msgid "&Author:" msgstr "" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" #: lib\commit.py:393 msgid "Changes" msgstr "" #: lib\commit.py:410 msgid "Pending Merges" msgstr "" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" #: lib\commit.py:745 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:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "" #: lib\config.py:49 msgid "Default" msgstr "" #: lib\config.py:50 msgid "Thunderbird" msgstr "" #: lib\config.py:51 msgid "Evolution" msgstr "" #: lib\config.py:52 msgid "KMail" msgstr "" #: lib\config.py:53 msgid "Mutt" msgstr "" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "" #: lib\config.py:56 msgid "Editor" msgstr "" #: lib\config.py:79 msgid "Configuration" msgstr "" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "ชื่อ:" #: lib\config.py:95 msgid "E-&mail:" msgstr "" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "" #: lib\config.py:108 msgid "&Editor:" msgstr "" #: lib\config.py:116 msgid "E-mail &client:" msgstr "" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "คำสั่ง" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "" #: lib\config.py:158 msgid "Abbreviation" msgstr "" #: lib\config.py:158 msgid "URL" msgstr "" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "ชื่อ" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "" #: lib\config.py:242 msgid "Aliases" msgstr "" #: lib\config.py:243 msgid "Bug Trackers" msgstr "" #: lib\config.py:244 msgid "&User Interface" msgstr "" #: lib\config.py:245 msgid "&Diff" msgstr "" #: lib\config.py:246 msgid "&Merge" msgstr "" #: lib\config.py:271 msgid "Spell check &language:" msgstr "" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "" #: lib\conflicts.py:62 msgid "Conflict" msgstr "" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "" #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "" msgstr[1] "" #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "" #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" #: lib\conflicts.py:310 msgid "path conflict" msgstr "" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "" #: lib\conflicts.py:312 msgid "text conflict" msgstr "" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "" #: lib\conflicts.py:314 msgid "duplicate" msgstr "" #: lib\conflicts.py:315 msgid "parent loop" msgstr "" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "" #: lib\conflicts.py:317 msgid "missing parent" msgstr "" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "" #: lib\diff.py:266 msgid "renamed and modified" msgstr "" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "" #: lib\diffview.py:461 msgid "Last modified:" msgstr "" #: lib\diffview.py:462 msgid "Status:" msgstr "" #: lib\diffview.py:463 msgid "Kind:" msgstr "" #: lib\diffview.py:464 msgid "Properties:" msgstr "" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "" msgstr[1] "" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "" #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "" #: lib\encoding_selector.py:77 #, 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:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" 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:95 msgid "file" msgstr "" #: lib\i18n.py:96 msgid "directory" msgstr "" #: lib\i18n.py:97 msgid "symlink" msgstr "" #: lib\i18n.py:99 msgid "fixed" msgstr "" #: lib\i18n.py:101 msgid "View text file" msgstr "" #: lib\i18n.py:102 msgid "View image file" msgstr "" #: lib\i18n.py:103 msgid "View binary file" msgstr "" #: lib\i18n.py:104 msgid "View symlink" msgstr "" #: lib\i18n.py:105 msgid "View directory" msgstr "" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "" #: lib\log.py:142 msgid "&Search:" msgstr "" #: lib\log.py:158 msgid "Messages" msgstr "" #: lib\log.py:160 msgid "Authors" msgstr "" #: lib\log.py:162 msgid "Revision IDs" msgstr "" #: lib\log.py:164 msgid "Revision Numbers" msgstr "" #: lib\log.py:166 msgid "Tags" msgstr "" #: lib\log.py:168 msgid "Bugs" msgstr "" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "" #: lib\log.py:575 msgid "View file" msgstr "" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "" #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "" #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "" #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "" #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" 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: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:72 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:480 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 lib\ui_branch.py:100 msgid "Locations" msgstr "" #: lib\plugins.py:111 msgid "(no description)" msgstr "" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "" #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "" msgstr[1] "" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "" #: lib\run.py:98 msgid "Select working directory" msgstr "" #: lib\run.py:119 msgid "&Edit" msgstr "" #: lib\run.py:167 msgid "Help for command" msgstr "" #: lib\run.py:287 msgid "Select path to insert" msgstr "" #: lib\run.py:297 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\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "" #: lib\subprocess.py:518 msgid "Ready" msgstr "" #: lib\subprocess.py:591 msgid "Starting..." msgstr "" #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "" #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "" #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "" #: lib\switch.py:46 msgid "Switch" msgstr "" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "" #: lib\treewidget.py:327 msgid "added, missing" msgstr "" #: lib\treewidget.py:333 msgid "missing" msgstr "" #: lib\treewidget.py:340 msgid "moved" msgstr "" #: lib\treewidget.py:346 msgid "x-bit" msgstr "" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "" #: lib\treewidget.py:1303 msgid "Changed" msgstr "" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "" #: lib\treewidget.py:1682 msgid "&Open" msgstr "" #: lib\treewidget.py:1685 msgid "&View file" msgstr "" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "" #: lib\treewidget.py:1714 msgid "&Add" msgstr "" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "" #: lib\ui_info.py:87 msgid "..." msgstr "" #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" 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:62 msgid "Push" 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:107 msgid "Run bzr command" msgstr "" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "" #: lib\ui_run.py:112 msgid "&Command:" msgstr "" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "" #: lib\ui_run.py:116 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:47 msgid "Unbind" msgstr "" #: lib\unbind.py:55 msgid "Bound to:" msgstr "" #: lib\uncommit.py:40 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:70 msgid "&Cancel" msgstr "" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "" #: lib\util.py:585 msgid "Select Target Directory" msgstr "" #: lib\util.py:726 msgid "deleted files" msgstr "" #: lib\util.py:728 msgid "added files" msgstr "" #: lib\util.py:730 msgid "renamed files" msgstr "" #: lib\util.py:732 msgid "modified files" msgstr "" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-tr.po0000644000000000000000000012744114556556456013232 0ustar00# Turkish translation for qbzr # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the qbzr package. # Mert Dirik , 2008. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-12 16:38+0300\n" "PO-Revision-Date: 2012-04-16 09:31+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=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Ekle" #: lib\add.py:57 msgid "Unversioned Files" msgstr "Sürümlendirilmemiş Dosyalar" #: lib\add.py:106 msgid "Show ignored files" msgstr "Yok sayılan dosyaları göster" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "Açımla (Annotate)" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "Yükleniyor..." #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "" #: lib\annotate.py:762 msgid "Go" msgstr "" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 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:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Gözat" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "" #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Konum:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "Düzeltme:" #: lib\browse.py:84 msgid "Show" msgstr "Göster" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "" #: lib\commit.py:259 msgid "&Local commit" msgstr "" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" #: lib\commit.py:265 msgid "Description:" msgstr "Açıklama:" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "İleti" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "Sürüm denetimi altında olmayan (sürümlendirilmemiş) dosyaları göster" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "&Giderilen hatalar:" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "" #: lib\commit.py:364 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:374 msgid "&Author:" msgstr "Y&azar:" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" "Yazarın adını girin, ör. Sarı Çizmeli Mehmet Ağa " "<cizmeh@ornek.com>" #: lib\commit.py:393 msgid "Changes" msgstr "Değişiklikler" #: lib\commit.py:410 msgid "Pending Merges" msgstr "Bekleyen Birleştirmeler" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "Durum" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" #: lib\commit.py:745 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:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "Fark" #: lib\config.py:49 msgid "Default" msgstr "Öntanımlı" #: lib\config.py:50 msgid "Thunderbird" msgstr "Thunderbird" #: lib\config.py:51 msgid "Evolution" msgstr "Evolution" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "Mutt" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "XDG e-posta istemcisi" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "MAPI e-posta istemcisi" #: lib\config.py:56 msgid "Editor" msgstr "Düzenleyici" #: lib\config.py:79 msgid "Configuration" msgstr "Yapılandırma" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "&Ad:" #: lib\config.py:95 msgid "E-&mail:" msgstr "E-&posta:" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "" #: lib\config.py:108 msgid "&Editor:" msgstr "&Düzenleyici:" #: lib\config.py:116 msgid "E-mail &client:" msgstr "E-posta &istemcisi:" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "Takma Ad" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "Komut" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "Sil" #: lib\config.py:158 msgid "Abbreviation" msgstr "Kısaltma" #: lib\config.py:158 msgid "URL" msgstr "URL" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "Ad" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "Genel" #: lib\config.py:242 msgid "Aliases" msgstr "Takma Adlar" #: lib\config.py:243 msgid "Bug Trackers" msgstr "Hata Takipçileri" #: lib\config.py:244 msgid "&User Interface" msgstr "K&ullanıcı Arayüzü" #: lib\config.py:245 msgid "&Diff" msgstr "" #: lib\config.py:246 msgid "&Merge" msgstr "" #: lib\config.py:271 msgid "Spell check &language:" msgstr "Yazım denetimi &dili:" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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 "Gözat..." #: lib\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "Dosya" #: lib\conflicts.py:62 msgid "Conflict" msgstr "" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "" #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "" msgstr[1] "" #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "&Tamam" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "" #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" #: lib\conflicts.py:310 msgid "path conflict" msgstr "" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "" #: lib\conflicts.py:312 msgid "text conflict" msgstr "" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "" #: lib\conflicts.py:314 msgid "duplicate" msgstr "" #: lib\conflicts.py:315 msgid "parent loop" msgstr "" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "" #: lib\conflicts.py:317 msgid "missing parent" msgstr "" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "silindi" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "eklendi" #: lib\diff.py:266 msgid "renamed and modified" msgstr "adı ve içeriği değiştirildi" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "adı değiştirildi" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "değiştirildi" #: lib\diffview.py:461 msgid "Last modified:" msgstr "Son değiştirilme:" #: lib\diffview.py:462 msgid "Status:" msgstr "Durum:" #: lib\diffview.py:463 msgid "Kind:" msgstr "Tür:" #: lib\diffview.py:464 msgid "Properties:" msgstr "Özellikler:" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "\\ Dosyanın sonunda yeni satır yok" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "Çalışma Ağacı" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "Düz %s" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "Birleşmiş Fark (Unidiff)" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "&Tazele" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "" msgstr[1] "" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "&Kapat" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "" #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "" #: lib\encoding_selector.py:77 #, 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:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "Seçenekler" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" msgstr "" #: lib\help.py:59 #, python-format msgid "No help can be found for %s" msgstr "%s için yardım bulunamadı" #: lib\help.py:103 msgid "Help" msgstr "Yardım" #: lib\i18n.py:95 msgid "file" msgstr "dosya" #: lib\i18n.py:96 msgid "directory" msgstr "dizin" #: lib\i18n.py:97 msgid "symlink" msgstr "" #: lib\i18n.py:99 msgid "fixed" msgstr "" #: lib\i18n.py:101 msgid "View text file" msgstr "Metin dosyası görüntüle" #: lib\i18n.py:102 msgid "View image file" msgstr "Görüntü dosyası görüntüle" #: lib\i18n.py:103 msgid "View binary file" msgstr "İkili dosya görüntüle" #: lib\i18n.py:104 msgid "View symlink" msgstr "" #: lib\i18n.py:105 msgid "View directory" msgstr "Dizin görüntüle" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "Bilgi" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "İlklendir" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "Günlük" #: lib\log.py:142 msgid "&Search:" msgstr "&Ara:" #: lib\log.py:158 msgid "Messages" msgstr "İletiler" #: lib\log.py:160 msgid "Authors" msgstr "Yazarlar" #: lib\log.py:162 msgid "Revision IDs" msgstr "Düzeltme Kimlikleri" #: lib\log.py:164 msgid "Revision Numbers" msgstr "Düzeltme Numaraları" #: lib\log.py:166 msgid "Tags" msgstr "" #: lib\log.py:168 msgid "Bugs" msgstr "" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "&Farkları göster..." #: lib\log.py:575 msgid "View file" msgstr "Dosyayı görüntüle" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "Düz" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "Tarih" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Yazar" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "hata no. %s" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "" #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "" #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "&Ağacı göster..." #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "" #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "Eski Durumuna Getir" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" msgstr "" #: lib\main.py:120 msgid "Computer" msgstr "Bilgisayar" #: lib\main.py:149 msgid "&Edit Bookmark..." msgstr "Yer İmini &Düzenle..." #: lib\main.py:150 msgid "&Remove Bookmark..." msgstr "Yer İmini &Sil..." #: lib\main.py:165 msgid "Bookmarks" msgstr "Yer İmleri" #: lib\main.py:276 msgid "Refresh the directory tree" msgstr "Dizin ağacını tazele" #: 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 "Bu dalı başka bir dalın yansısı yap" #: lib\main.py:290 msgid "Pu&ll" msgstr "" #: lib\main.py:291 msgid "Update a mirror of this branch" msgstr "Bu dalın yansısını güncelle" #: lib\main.py:294 msgid "&Add Bookmark..." msgstr "Yer İmi &Ekle..." #: lib\main.py:301 msgid "&File" msgstr "&Dosya" #: lib\main.py:302 msgid "&Configure..." msgstr "&Yapılandır..." #: lib\main.py:304 msgid "&Quit" msgstr "&Çık" #: lib\main.py:305 msgid "&View" msgstr "&Görüntüle" #: lib\main.py:307 msgid "&Branch" msgstr "&Dal" #: lib\main.py:311 msgid "&Bookmarks" msgstr "&Yer İmleri" #: lib\main.py:313 lib\util.py:72 msgid "&Help" msgstr "&Yardım" #: lib\main.py:314 msgid "&Help..." msgstr "&Yardım..." #: lib\main.py:316 msgid "&About..." msgstr "&Hakkında..." #: lib\main.py:354 msgid "Size" msgstr "Boyut" #: lib\main.py:406 msgid "About QBzr" msgstr "QBzr Hakkında" #: 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 "Yer İmi Ekle" #: lib\main.py:483 msgid "Edit Bookmark" msgstr "Yer İmini Düzenle" #: lib\main.py:493 msgid "Remove Bookmark" msgstr "Yer İmini Sil" #: lib\main.py:494 msgid "Do you really want to remove the selected bookmark?" msgstr "Seçilen yer imini silmek istediğinize emin misiniz?" #: lib\plugins.py:44 msgid "Plugins" msgstr "" #: lib\plugins.py:57 msgid "Version" msgstr "" #: lib\plugins.py:58 lib\subprocess.py:480 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 "Özet" #: lib\plugins.py:72 lib\ui_branch.py:100 msgid "Locations" msgstr "" #: lib\plugins.py:111 msgid "(no description)" msgstr "" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "" #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "Üstleri:" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "Altları:" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "Yazar:" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "Dal:" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "Etiketler:" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "" msgstr[1] "" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "Düzeltme" #: lib\run.py:98 msgid "Select working directory" msgstr "" #: lib\run.py:119 msgid "&Edit" msgstr "" #: lib\run.py:167 msgid "Help for command" msgstr "" #: lib\run.py:287 msgid "Select path to insert" msgstr "" #: lib\run.py:297 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\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "" #: lib\subprocess.py:518 msgid "Ready" msgstr "" #: lib\subprocess.py:591 msgid "Starting..." msgstr "Başlatılıyor..." #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "İptal ediliyor..." #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "Tamamlandı!" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "Başarısız Oldu!" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "bzr başlatılamadı." #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "bzr çalıştırılırken bir sorunla karşılaşıldı. (hata kodu: %d)" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "" #: lib\switch.py:46 msgid "Switch" msgstr "" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "sürümlendirilmemiş" #: lib\treewidget.py:327 msgid "added, missing" msgstr "" #: lib\treewidget.py:333 msgid "missing" msgstr "eksik" #: lib\treewidget.py:340 msgid "moved" msgstr "" #: lib\treewidget.py:346 msgid "x-bit" msgstr "" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "" #: lib\treewidget.py:1303 msgid "Changed" msgstr "" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "" #: lib\treewidget.py:1682 msgid "&Open" msgstr "" #: lib\treewidget.py:1685 msgid "&View file" msgstr "" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "" #: lib\treewidget.py:1714 msgid "&Add" msgstr "" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "Tümünü seç / Hiçbirini seçme" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "&Konum:" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "&Düzeltme:" #: lib\ui_info.py:87 msgid "..." msgstr "..." #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" msgstr "" #: lib\ui_init.py:119 msgid "Local Directory" msgstr "Yerel Dizin" #: lib\ui_init.py:121 msgid "Repository" msgstr "Depo" #: lib\ui_init.py:122 msgid "Create a new standalone tree" msgstr "Yeni bir kendibaşına ağaç oluştur" #: 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 "Yeni bir paylaşılan depo yarat" #: lib\ui_init.py:125 msgid "Skip the creation of working trees in this repository" msgstr "Depoda çalışma ağacı yaratılmasın" #: lib\ui_init.py:131 msgid "Repository Format:" msgstr "Depo Biçimi:" #: lib\ui_init.py:132 msgid "Description of format" msgstr "Biçimin açıklaması" #: lib\ui_merge.py:62 msgid "Merge" msgstr "Birleştir" #: lib\ui_merge.py:67 lib\ui_pull.py:65 lib\ui_push.py:66 msgid "Remember this location as a default" msgstr "Bu konumu öntanımlı olarak hatırla" #: 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" msgstr "" #: lib\ui_new_tree.py:129 msgid "Create a new Bazaar Working Tree" msgstr "Yeni bir Bazaar Çalışma Ağacı Yarat" #: 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 "Çalışma dizininin yaratılacağı yerel dizin" #: lib\ui_new_tree.py:135 msgid "Working Tree Options" msgstr "Çalışma Ağacı Seçenekleri" #: 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 "Dalın yerel bir kopyasını yarat" #: lib\ui_new_tree.py:151 msgid "Create a stacked branch referring to the source branch" msgstr "Kaynak dala başvuran bir yığılmış dal oluştur" #: 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 "En yeni düzeltme" #: lib\ui_new_tree.py:161 msgid "Show Log..." msgstr "Günlüğü Göster..." #: 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 "Dallar arasındaki farklılıkların üzerine yaz" #: lib\ui_push.py:62 msgid "Push" msgstr "" #: lib\ui_push.py:68 msgid "Use existing directory" msgstr "Mevcut dizini kullan" #: lib\ui_push.py:69 msgid "Create the path up to the branch if it does not exist" msgstr "" #: lib\ui_run.py:107 msgid "Run bzr command" msgstr "" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "" #: lib\ui_run.py:112 msgid "&Command:" msgstr "" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "" #: lib\ui_run.py:116 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 "Dalı Güncelle" #: lib\ui_update_branch.py:83 msgid "" "This directory is a branch. Please select what you would like to update" msgstr "Bu dizin bir dal. Lütfen neyi güncellemek istediğinizi seçin" #: lib\ui_update_branch.py:84 lib\ui_update_checkout.py:76 msgid "Update source" msgstr "Kaynağı güncelle" #: 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 "Bu dalı yeni üst dal olarak hatırla" #: 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 "Çalışma ağacını dalın en yeni haline güncelle" #: 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:47 msgid "Unbind" msgstr "" #: lib\unbind.py:55 msgid "Bound to:" msgstr "" #: lib\uncommit.py:40 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:70 msgid "&Cancel" msgstr "&İptal" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "" #: lib\util.py:585 msgid "Select Target Directory" msgstr "" #: lib\util.py:726 msgid "deleted files" msgstr "silinen dosyalar" #: lib\util.py:728 msgid "added files" msgstr "eklenen dosyalar" #: lib\util.py:730 msgid "renamed files" msgstr "adı değiştirilen dosyalar" #: lib\util.py:732 msgid "modified files" msgstr "değiştirilen dosyalar" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "Tamamı" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" #~ msgid "Side by side" #~ msgstr "Taraf tarafa" #~ msgid "[binary file]" #~ msgstr "[ikili dosya]" #~ msgid "You must specify a location" #~ msgstr "Bir konum belirtmelisiniz" #~ msgid "Branch format:" #~ msgstr "Dal biçimi:" #~ msgid "Working tree format:" #~ msgstr "Çalışma ağacı biçimi:" #~ msgid "&Format" #~ msgstr "&Biçim" #~ msgid "Control directory format:" #~ msgstr "Denetim dizini biçimi:" #~ msgid "Parent branch:" #~ msgstr "Üst dal:" #~ msgid "&Related Branches" #~ msgstr "İ&lgili Dallar" #~ msgid "Repository format:" #~ msgstr "Depo biçimi:" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz-uk.po0000644000000000000000000013055714556556456013226 0ustar00# Ukrainian translation for qbzr # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the qbzr package. # FIRST AUTHOR , 2007. # msgid "" msgstr "" "Project-Id-Version: qbzr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-12 16:38+0300\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" "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: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "Додати" #: lib\add.py:57 msgid "Unversioned Files" msgstr "" #: lib\add.py:106 msgid "Show ignored files" msgstr "Показати ігноровані файли" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "Анотація" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "" #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "" #: lib\annotate.py:762 msgid "Go" msgstr "" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 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:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "Огляд" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "" #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "Місцезнаходження:" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "Версія:" #: lib\browse.py:84 msgid "Show" msgstr "Показати" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "Фіксувати" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "Гілка" #: lib\commit.py:259 msgid "&Local commit" msgstr "Локальна фіксація" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" #: lib\commit.py:265 msgid "Description:" msgstr "Опис:" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "Коментар" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "Показати невідомі файли" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "Надайте коментар до цієї версії" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "&Виправлені дефекти:" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "Вкажіть номери дефектів, що були виправлені у цієї версії" #: lib\commit.py:364 msgid "" "Enter the list of bug IDs in format tag:id separated by a space, e.g. " "project:123 project:765" msgstr "" "Надайте список номерів дефектів у форматі tag:id, кілька дефектів " "мають бути розподілені за допомогою пробела, наприклад: project:123 " "project:765" #: lib\commit.py:374 msgid "&Author:" msgstr "&Автор:" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "" "Ви можете вказати автора ціх змін, якщо він відрізняється від персони, що " "робить фіксацію версії" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" "Вкажіть ім'я автора, наприклад: John Doe <jdoe@example.com>" #: lib\commit.py:393 msgid "Changes" msgstr "Зміни" #: lib\commit.py:410 msgid "Pending Merges" msgstr "" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "Статус" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" #: lib\commit.py:745 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:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "Різниця" #: lib\config.py:49 msgid "Default" msgstr "Типово" #: lib\config.py:50 msgid "Thunderbird" msgstr "Thunderbird" #: lib\config.py:51 msgid "Evolution" msgstr "Evolution" #: lib\config.py:52 msgid "KMail" msgstr "KMail" #: lib\config.py:53 msgid "Mutt" msgstr "Mutt" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "XDG e-mail клієнт" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "MAPI e-mail клієнт" #: lib\config.py:56 msgid "Editor" msgstr "Редактор" #: lib\config.py:79 msgid "Configuration" msgstr "Налаштування" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "Ім’я:" #: lib\config.py:95 msgid "E-&mail:" msgstr "E-&mail:" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "" #: lib\config.py:108 msgid "&Editor:" msgstr "&Редактор:" #: lib\config.py:116 msgid "E-mail &client:" msgstr "E-mail &клієнт:" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "Псевдонім" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "Команда" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "Видалити" #: lib\config.py:158 msgid "Abbreviation" msgstr "Абревіатура" #: lib\config.py:158 msgid "URL" msgstr "URL" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "Ім’я" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "Загальні" #: lib\config.py:242 msgid "Aliases" msgstr "Псевдоніми" #: lib\config.py:243 msgid "Bug Trackers" msgstr "" #: lib\config.py:244 msgid "&User Interface" msgstr "Інтерфейс користувача" #: lib\config.py:245 msgid "&Diff" msgstr "" #: lib\config.py:246 msgid "&Merge" msgstr "" #: lib\config.py:271 msgid "Spell check &language:" msgstr "Мова для перевірки орфографії" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "Файл" #: lib\conflicts.py:62 msgid "Conflict" msgstr "" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "" #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "" msgstr[1] "" #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "&OK" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "" #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" #: lib\conflicts.py:310 msgid "path conflict" msgstr "" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "" #: lib\conflicts.py:312 msgid "text conflict" msgstr "" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "" #: lib\conflicts.py:314 msgid "duplicate" msgstr "" #: lib\conflicts.py:315 msgid "parent loop" msgstr "" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "" #: lib\conflicts.py:317 msgid "missing parent" msgstr "" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "видалений" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "доданий" #: lib\diff.py:266 msgid "renamed and modified" msgstr "перейменований та змінений" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "перейменований" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "змінений" #: lib\diffview.py:461 msgid "Last modified:" msgstr "Останні зміни" #: lib\diffview.py:462 msgid "Status:" msgstr "Стан:" #: lib\diffview.py:463 msgid "Kind:" msgstr "Тип:" #: lib\diffview.py:464 msgid "Properties:" msgstr "Властивості:" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "\\ No newline at end of file" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "Рабоча копія для %s" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "Рабоча копія" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "Ревізія %(rev)s для %(branch)s" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "Ревізія %s" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "Revid: %s" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "Результат об'єднання" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "Unidiff" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "&Оновити" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "%d файл" msgstr[1] "%d файли" msgstr[2] "%d файлів" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "&Закрити" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "" #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "" #: lib\encoding_selector.py:77 #, 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:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "Параметри" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" msgstr "" #: lib\help.py:59 #, python-format msgid "No help can be found for %s" msgstr "Довідка для %s не знайдена" #: lib\help.py:103 msgid "Help" msgstr "Довідка" #: lib\i18n.py:95 msgid "file" msgstr "файл" #: lib\i18n.py:96 msgid "directory" msgstr "тека" #: lib\i18n.py:97 msgid "symlink" msgstr "символичний зв'язок" #: lib\i18n.py:99 msgid "fixed" msgstr "полагоджен" #: lib\i18n.py:101 msgid "View text file" msgstr "Перегляд текстового файла" #: lib\i18n.py:102 msgid "View image file" msgstr "Перегляд файла-зображення" #: lib\i18n.py:103 msgid "View binary file" msgstr "Перегляд бінарного файла" #: lib\i18n.py:104 msgid "View symlink" msgstr "Перегляд сімвольного посилання" #: lib\i18n.py:105 msgid "View directory" msgstr "Перегляд теки" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "Інформація" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "Журнал" #: lib\log.py:142 msgid "&Search:" msgstr "&Пошук:" #: lib\log.py:158 msgid "Messages" msgstr "Коментар" #: lib\log.py:160 msgid "Authors" msgstr "Автори" #: lib\log.py:162 msgid "Revision IDs" msgstr "Revision IDs" #: lib\log.py:164 msgid "Revision Numbers" msgstr "Номери версій" #: lib\log.py:166 msgid "Tags" msgstr "" #: lib\log.py:168 msgid "Bugs" msgstr "" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "Показати різницю" #: lib\log.py:575 msgid "View file" msgstr "Переглянути файл" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "Версія" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "Дата" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "Автор" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "bug #%s" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "" #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "" #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "Показати файли" #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "" #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "Повернути" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" 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: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 "&Push" #: lib\main.py:286 msgid "Turn this branch into a mirror of another branch" msgstr "Перетворити цю гілку на копію іншої гілки" #: lib\main.py:290 msgid "Pu&ll" msgstr "Pu&ll" #: 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:72 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 "Про QBzr" #: 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:480 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 lib\ui_branch.py:100 msgid "Locations" msgstr "" #: lib\plugins.py:111 msgid "(no description)" msgstr "" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "" #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "Зафіксовано:" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "Автор:" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "Теги:" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "" msgstr[1] "" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "" #: lib\run.py:98 msgid "Select working directory" msgstr "" #: lib\run.py:119 msgid "&Edit" msgstr "" #: lib\run.py:167 msgid "Help for command" msgstr "" #: lib\run.py:287 msgid "Select path to insert" msgstr "" #: lib\run.py:297 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\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "" #: lib\subprocess.py:518 msgid "Ready" msgstr "" #: lib\subprocess.py:591 msgid "Starting..." msgstr "Запуск..." #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "Припиняється..." #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "" #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "" #: lib\switch.py:46 msgid "Switch" msgstr "" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "невідомий" #: lib\treewidget.py:327 msgid "added, missing" msgstr "" #: lib\treewidget.py:333 msgid "missing" msgstr "" #: lib\treewidget.py:340 msgid "moved" msgstr "" #: lib\treewidget.py:346 msgid "x-bit" msgstr "" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "" #: lib\treewidget.py:1303 msgid "Changed" msgstr "" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "" #: lib\treewidget.py:1682 msgid "&Open" msgstr "" #: lib\treewidget.py:1685 msgid "&View file" msgstr "" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "" #: lib\treewidget.py:1714 msgid "&Add" msgstr "" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "&Розташування:" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "&Куди:" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "&Версія:" #: lib\ui_info.py:87 msgid "..." msgstr "" #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" 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:62 msgid "Push" 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:107 msgid "Run bzr command" msgstr "" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "" #: lib\ui_run.py:112 msgid "&Command:" msgstr "" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "" #: lib\ui_run.py:116 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:47 msgid "Unbind" msgstr "" #: lib\unbind.py:55 msgid "Bound to:" msgstr "" #: lib\uncommit.py:40 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:70 msgid "&Cancel" msgstr "&Скасувати" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "" #: lib\util.py:585 msgid "Select Target Directory" msgstr "" #: lib\util.py:726 msgid "deleted files" msgstr "видалені файли" #: lib\util.py:728 msgid "added files" msgstr "додані файли" #: lib\util.py:730 msgid "renamed files" msgstr "перейменовані файли" #: lib\util.py:732 msgid "modified files" msgstr "змінені файли" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "Завершено" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" #~ msgid "Side by side" #~ msgstr "Дві панелі поруч" #~ msgid "[binary file]" #~ msgstr "[бінарний файл]" #~ msgid "You must specify a location" #~ msgstr "Ви повинні вказати локацію" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/po/qbrz.pot0000644000000000000000000012057014556556456012767 0ustar00#, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-12 16:38+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" "X-Launchpad-Export-Date: 2013-07-28 21:04+0000\n" "X-Generator: Launchpad (build 16700)\n" #: lib\add.py:45 lib\config.py:139 lib\config.py:160 lib\config.py:191 #: lib\ui_merge_config.py:60 msgid "Add" msgstr "" #: lib\add.py:57 msgid "Unversioned Files" msgstr "" #: lib\add.py:106 msgid "Show ignored files" msgstr "" #: lib\add.py:151 msgid "Nothing selected to add" msgstr "" #: lib\annotate.py:272 lib\annotate.py:390 lib\annotate.py:464 #: lib\annotate.py:468 lib\log.py:572 msgid "Annotate" msgstr "" #: lib\annotate.py:272 lib\diffwindow.py:124 lib\util.py:512 msgid "Loading..." msgstr "" #: lib\annotate.py:339 lib/widgets\shelve.py:317 lib/widgets\shelvelist.py:127 msgid "Encoding" msgstr "" #: lib\annotate.py:361 lib/widgets\shelve.py:301 lib/widgets\shelvelist.py:108 #: lib/widgets\toolbars.py:64 msgid "Find" msgstr "" #: lib\annotate.py:365 lib\annotate.py:746 msgid "Goto Line" msgstr "" #: lib\annotate.py:369 lib\diffwindow.py:264 lib/widgets\shelve.py:321 #: lib/widgets\shelvelist.py:131 msgid "&View Options" msgstr "" #: lib\annotate.py:370 lib\diffwindow.py:265 lib/widgets\shelve.py:305 #: lib/widgets\shelvelist.py:114 msgid "View Options" msgstr "" #: lib\annotate.py:373 msgid "Word Wrap" msgstr "" #: lib\annotate.py:383 msgid "Tab Width" msgstr "" #: lib\annotate.py:465 #, python-format msgid "Revision %s" msgstr "" #: lib\annotate.py:754 msgid "Goto Line: " msgstr "" #: lib\annotate.py:762 msgid "Go" msgstr "" #: lib\annotate.py:774 msgid "Close Goto Line" msgstr "" #: lib\annotate.py:804 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:65 lib\browse.py:236 lib\export.py:182 #: lib\export.py:200 lib\send.py:62 lib\send.py:86 lib\send.py:152 #: lib\switch.py:100 msgid "Browse" msgstr "" #: lib\bind.py:110 lib\switch.py:158 lib\tag.py:180 msgid "Select branch location" msgstr "" #: lib\bind.py:120 msgid "Master branch location not specified." msgstr "" #: lib\browse.py:74 lib\export.py:179 lib\ui_info.py:86 msgid "Location:" msgstr "" #: lib\browse.py:79 lib\export.py:216 lib\revisionmessagebrowser.py:160 #: lib\ui_new_tree.py:160 msgid "Revision:" msgstr "" #: lib\browse.py:84 msgid "Show" msgstr "" #: lib\browse.py:90 lib\treewidget.py:1300 msgid "&Filter" msgstr "" #: lib\cat.py:86 lib\cat.py:286 msgid "View" msgstr "" #: lib\cat.py:104 lib\encoding_selector.py:115 msgid "Encoding:" msgstr "" #: lib\commit.py:221 lib\subprocess.py:123 msgid "Commit" msgstr "" #: lib\commit.py:247 lib\ui_branch.py:99 lib\ui_new_tree.py:130 #: lib\ui_tag.py:89 msgid "Branch" msgstr "" #: lib\commit.py:259 msgid "&Local commit" msgstr "" #: lib\commit.py:261 msgid "" "Local commits are not pushed to the master branch until a normal commit is " "performed" msgstr "" #: lib\commit.py:265 msgid "Description:" msgstr "" #: lib\commit.py:280 msgid "" "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." msgstr "" #: lib\commit.py:284 msgid "Working tree is out of date. To commit, update the working tree." msgstr "" #: lib\commit.py:298 lib\logwidget.py:475 msgid "Update" msgstr "" #: lib\commit.py:309 lib\logmodel.py:44 lib\treewidget.py:355 #: lib/widgets\shelve.py:263 lib/widgets\shelvelist.py:86 msgid "Message" msgstr "" #: lib\commit.py:319 msgid "Show non-versioned files" msgstr "" #: lib\commit.py:346 msgid "Enter the commit message" msgstr "" #: lib\commit.py:360 msgid "&Fixed bugs:" msgstr "" #: lib\commit.py:361 msgid "Set the IDs of bugs fixed by this commit" msgstr "" #: lib\commit.py:364 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:374 msgid "&Author:" msgstr "" #: lib\commit.py:375 msgid "Set the author of this change, if it's different from the committer" msgstr "" #: lib\commit.py:378 msgid "" "Enter the author's name, e.g. John Doe <jdoe@example.com>" msgstr "" #: lib\commit.py:393 msgid "Changes" msgstr "" #: lib\commit.py:410 msgid "Pending Merges" msgstr "" #: lib\commit.py:422 lib\main.py:355 lib\subprocess.py:245 #: lib\treewidget.py:357 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "Status" msgstr "" #: lib\commit.py:434 msgid "View changes in files selected to commit" msgstr "" #: lib\commit.py:654 msgid "You should provide a commit message." msgstr "" #: lib\commit.py:658 msgid "" "No changes selected to commit.\n" "Do you want to commit anyway?" msgstr "" #: lib\commit.py:739 msgid "" "A commit will be made directly to the master branch, keeping the local and " "master branches in sync." msgstr "" #: lib\commit.py:745 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:779 lib\diff.py:140 lib\diffwindow.py:124 #: lib\diffwindow.py:181 lib\diffwindow.py:395 lib\diffwindow.py:452 #: lib\diffwindow.py:459 lib\revert.py:301 msgid "Diff" msgstr "" #: lib\config.py:49 msgid "Default" msgstr "" #: lib\config.py:50 msgid "Thunderbird" msgstr "" #: lib\config.py:51 msgid "Evolution" msgstr "" #: lib\config.py:52 msgid "KMail" msgstr "" #: lib\config.py:53 msgid "Mutt" msgstr "" #: lib\config.py:54 msgid "XDG e-mail client" msgstr "" #: lib\config.py:55 msgid "MAPI e-mail client" msgstr "" #: lib\config.py:56 msgid "Editor" msgstr "" #: lib\config.py:79 msgid "Configuration" msgstr "" #: lib\config.py:89 lib\ui_bookmark.py:50 msgid "&Name:" msgstr "" #: lib\config.py:95 msgid "E-&mail:" msgstr "" #: lib\config.py:101 lib\ui_run.py:110 lib\ui_tag.py:90 msgid "&Browse..." msgstr "" #: lib\config.py:108 msgid "&Editor:" msgstr "" #: lib\config.py:116 msgid "E-mail &client:" msgstr "" #: lib\config.py:123 msgid "" "Tab width in characters\n" "option is used in qdiff, qannotate and qcat windows" msgstr "" #: lib\config.py:125 msgid "Tab &Width:" msgstr "" #: lib\config.py:137 msgid "Alias" msgstr "" #: lib\config.py:137 lib\config.py:185 msgid "Command" msgstr "" #: lib\config.py:142 lib\config.py:163 lib\config.py:194 #: lib\treewidget.py:1723 lib\treewidget.py:2066 lib\ui_merge_config.py:61 msgid "Remove" msgstr "" #: lib\config.py:158 msgid "Abbreviation" msgstr "" #: lib\config.py:158 msgid "URL" msgstr "" #: lib\config.py:179 msgid "Show inter-group inserts and deletes in green and red" msgstr "" #: lib\config.py:181 msgid "External Diff Apps:" msgstr "" #: lib\config.py:184 lib\config.py:971 lib\main.py:353 lib\plugins.py:56 #: lib\plugins.py:61 msgid "Name" msgstr "" #: lib\config.py:238 msgid "Bazaar 2.4 or newer is required to configure mergetools." msgstr "" #: lib\config.py:241 msgid "General" msgstr "" #: lib\config.py:242 msgid "Aliases" msgstr "" #: lib\config.py:243 msgid "Bug Trackers" msgstr "" #: lib\config.py:244 msgid "&User Interface" msgstr "" #: lib\config.py:245 msgid "&Diff" msgstr "" #: lib\config.py:246 msgid "&Merge" msgstr "" #: lib\config.py:271 msgid "Spell check &language:" msgstr "" #: lib\config.py:278 msgid "" "This directory will be automatically filled in your branch source input field" msgstr "" #: lib\config.py:279 lib\config.py:293 lib\ui_branch.py:102 #: lib\ui_branch.py:104 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\config.py:286 msgid "" "Base directory\n" "for &branch sources:" msgstr "" #: lib\config.py:292 msgid "" "This directory will be automatically filled in your checkout destination " "input field" msgstr "" #: lib\config.py:300 msgid "" "Base directory\n" "for &checkouts:" msgstr "" #: lib\config.py:412 lib\diff.py:52 msgid "Builtin Diff" msgstr "" #: lib\config.py:442 msgid "Import old external merge tool" msgstr "" #: lib\config.py:443 #, python-format msgid "" "Would you like to import your previously configured external merge tool:\n" "\n" " %(old_cmdline)s\n" "\n" "as:\n" "\n" " %(new_cmdline)s" msgstr "" #: lib\config.py:446 msgid "old_cmdline" msgstr "" #: lib\config.py:608 msgid "&Ignore and proceed" msgstr "" #: lib\config.py:609 msgid "&Change the values" msgstr "" #: lib\config.py:719 msgid "Select editor executable" msgstr "" #: lib\config.py:726 msgid "Select base directory for checkouts" msgstr "" #: lib\config.py:733 msgid "Select default directory for branch sources" msgstr "" #: lib\config.py:974 msgid "Command Line" msgstr "" #: lib\conflicts.py:50 lib\conflicts.py:170 lib\conflicts.py:192 #: lib\conflicts.py:199 msgid "Conflicts" msgstr "" #: lib\conflicts.py:61 lib\ignore.py:57 msgid "File" msgstr "" #: lib\conflicts.py:62 msgid "Conflict" msgstr "" #: lib\conflicts.py:94 msgid "&Launch..." msgstr "" #: lib\conflicts.py:100 msgid "M&erge tool:" msgstr "" #: lib\conflicts.py:116 msgid "Auto-resolve" msgstr "" #: lib\conflicts.py:148 lib\treewidget.py:1706 msgid "&Merge conflict" msgstr "" #: lib\conflicts.py:154 msgid "Take \"&THIS\" version" msgstr "" #: lib\conflicts.py:156 msgid "Take \"&OTHER\" version" msgstr "" #: lib\conflicts.py:158 msgid "Mark as &resolved" msgstr "" #: lib\conflicts.py:193 #, python-format msgid "%d conflict auto-resolved." msgid_plural "%d conflicts auto-resolved." msgstr[0] "" msgstr[1] "" #: lib\conflicts.py:196 lib\conflicts.py:201 lib\diffwindow.py:461 #: lib\util.py:69 lib/widgets\shelve.py:630 lib/widgets\shelve.py:674 #: lib/widgets\shelve.py:721 lib/widgets\shelve.py:725 msgid "&OK" msgstr "" #: lib\conflicts.py:200 msgid "All conflicts resolved." msgstr "" #: lib\conflicts.py:235 #, python-format msgid "Error while running merge tool (code %d)" msgstr "" #: lib\conflicts.py:236 lib\conflicts.py:298 lib\tag.py:194 lib\trace.py:190 #: lib\trace.py:197 lib\tree_branch.py:95 lib\util.py:420 lib\util.py:1011 #: lib\util.py:1021 msgid "Error" msgstr "" #: lib\conflicts.py:265 msgid "Bazaar 2.4 or later is required for external mergetools support" msgstr "" #: lib\conflicts.py:275 msgid "Set up external_merge app in qconfig under the Merge tab" msgstr "" #: lib\conflicts.py:279 #, python-format msgid "External merge tool %(tool)s is not available" msgstr "" #: lib\conflicts.py:299 #, 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:305 #, python-format msgid "Missing the flag: %s. Configure in qconfig under the merge tab." msgstr "" #: lib\conflicts.py:310 msgid "path conflict" msgstr "" #: lib\conflicts.py:311 msgid "contents conflict" msgstr "" #: lib\conflicts.py:312 msgid "text conflict" msgstr "" #: lib\conflicts.py:313 msgid "duplicate id" msgstr "" #: lib\conflicts.py:314 msgid "duplicate" msgstr "" #: lib\conflicts.py:315 msgid "parent loop" msgstr "" #: lib\conflicts.py:316 msgid "unversioned parent" msgstr "" #: lib\conflicts.py:317 msgid "missing parent" msgstr "" #: lib\conflicts.py:318 msgid "deleting parent" msgstr "" #: lib\conflicts.py:319 msgid "non-directory parent" msgstr "" #: lib\diff.py:116 lib\treewidget.py:1701 msgid "Show &differences" msgstr "" #: lib\diff.py:262 lib\treewidget.py:331 msgid "removed" msgstr "" #: lib\diff.py:264 lib\treewidget.py:329 msgid "added" msgstr "" #: lib\diff.py:266 msgid "renamed and modified" msgstr "" #: lib\diff.py:268 lib\treewidget.py:342 msgid "renamed" msgstr "" #: lib\diff.py:270 lib\treewidget.py:344 msgid "modified" msgstr "" #: lib\diffview.py:461 msgid "Last modified:" msgstr "" #: lib\diffview.py:462 msgid "Status:" msgstr "" #: lib\diffview.py:463 msgid "Kind:" msgstr "" #: lib\diffview.py:464 msgid "Properties:" msgstr "" #: lib\diffview.py:726 #, python-format msgid "[binary file (%d bytes)]" msgstr "" #: lib\diffview.py:925 msgid "\\ No newline at end of file" msgstr "" #: lib\diffwindow.py:81 #, python-format msgid "Working Tree for %s" msgstr "" #: lib\diffwindow.py:83 msgid "Working Tree" msgstr "" #: lib\diffwindow.py:102 #, python-format msgid "Rev %(rev)s for %(branch)s" msgstr "" #: lib\diffwindow.py:104 #, python-format msgid "Rev %s" msgstr "" #: lib\diffwindow.py:107 #, python-format msgid "Revid: %(revid)s for %(branch)s" msgstr "" #: lib\diffwindow.py:109 #, python-format msgid "Revid: %s" msgstr "" #: lib\diffwindow.py:112 msgid "Merge Preview" msgstr "" #: lib\diffwindow.py:218 msgid "&Find" msgstr "" #: lib\diffwindow.py:220 msgid "Find on active panel" msgstr "" #: lib\diffwindow.py:227 lib/widgets\shelvelist.py:111 msgid "Unidiff" msgstr "" #: lib\diffwindow.py:229 msgid "Toggle between Side by side and Unidiff view modes" msgstr "" #: lib\diffwindow.py:241 lib\main.py:274 lib\util.py:73 #: lib/widgets\shelve.py:369 lib/widgets\shelvelist.py:203 msgid "&Refresh" msgstr "" #: lib\diffwindow.py:252 msgid "&External Diff" msgstr "" #: lib\diffwindow.py:254 msgid "Launch an external diff application" msgstr "" #: lib\diffwindow.py:268 lib/widgets\shelvelist.py:116 msgid "&Complete" msgstr "" #: lib\diffwindow.py:284 lib/widgets\shelve.py:312 #: lib/widgets\shelvelist.py:123 msgid "Tab width" msgstr "" #: lib\diffwindow.py:294 msgid "Left side tab width" msgstr "" #: lib\diffwindow.py:304 msgid "Right side tab width" msgstr "" #: lib\diffwindow.py:320 msgid "Left side encoding" msgstr "" #: lib\diffwindow.py:330 msgid "Right side encoding" msgstr "" #: lib\diffwindow.py:336 msgid "&Ignore whitespace changes" msgstr "" #: lib\diffwindow.py:401 lib/widgets\shelve.py:462 #, python-format msgid "%d file" msgid_plural "%d files" msgstr[0] "" msgstr[1] "" #: lib\diffwindow.py:453 #, python-format msgid "" "File %s is not versioned.\n" "Operation aborted." msgstr "" #: lib\diffwindow.py:455 lib\tag.py:196 lib\tree_branch.py:97 lib\util.py:71 #: lib\util.py:1014 lib\util.py:1024 msgid "&Close" msgstr "" #: lib\diffwindow.py:460 msgid "No changes found." msgstr "" #: lib\encoding_selector.py:76 msgid "Wrong encoding" msgstr "" #: lib\encoding_selector.py:77 #, 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:105 lib\ui_merge.py:63 lib\ui_pull.py:61 #: lib\ui_push.py:63 lib\ui_run.py:108 msgid "Options" msgstr "" #: lib\export.py:321 lib\export.py:326 msgid "Export location is invalid" msgstr "" #: lib\export.py:331 msgid "Export revision is invalid" msgstr "" #: lib\getnew.py:118 msgid "You should specify branch source" msgstr "" #: lib\getnew.py:122 msgid "You should select destination directory" msgstr "" #: lib\getnew.py:128 msgid "Do you really want to checkout into a non-empty folder?" msgstr "" #: lib\getnew.py:130 msgid "Do you really want to branch into a non-empty folder?" msgstr "" #: lib\getnew.py:131 msgid "" "The destination folder is not empty.\n" "Populating new working tree there may create conflicts." msgstr "" #: lib\getupdates.py:77 lib\getupdates.py:140 msgid "You should specify source branch location" 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:95 msgid "file" msgstr "" #: lib\i18n.py:96 msgid "directory" msgstr "" #: lib\i18n.py:97 msgid "symlink" msgstr "" #: lib\i18n.py:99 msgid "fixed" msgstr "" #: lib\i18n.py:101 msgid "View text file" msgstr "" #: lib\i18n.py:102 msgid "View image file" msgstr "" #: lib\i18n.py:103 msgid "View binary file" msgstr "" #: lib\i18n.py:104 msgid "View symlink" msgstr "" #: lib\i18n.py:105 msgid "View directory" msgstr "" #: lib\i18n.py:107 msgid "No changes selected to commit" msgstr "" #: lib\i18n.py:108 msgid "No changes selected to revert" msgstr "" #: lib\ignore.py:37 lib\ignore.py:113 msgid "Ignore" msgstr "" #: lib\ignore.py:49 msgid "Unknown Files" msgstr "" #: lib\ignore.py:58 msgid "Extension" msgstr "" #: lib\ignore.py:59 msgid "Ignore as" msgstr "" #: lib\ignore.py:67 msgid "No action" msgstr "" #: lib\ignore.py:70 msgid "Ignore all files with this extension" msgstr "" #: lib\ignore.py:74 msgid "Case-insensitive pattern" msgstr "" #: lib\ignore.py:77 msgid "Ignore by basename" msgstr "" #: lib\ignore.py:79 msgid "Ignore by fullname" msgstr "" #: lib\ignore.py:226 msgid "No action selected" msgstr "" #: lib\info.py:38 lib\ui_info.py:88 lib\ui_info.py:90 msgid "Info" msgstr "" #: lib\init.py:37 lib\ui_init.py:118 msgid "Initialize" msgstr "" #: lib\init.py:74 msgid "You should specify a location" msgstr "" #: lib\log.py:112 msgid "Log" msgstr "" #: lib\log.py:142 msgid "&Search:" msgstr "" #: lib\log.py:158 msgid "Messages" msgstr "" #: lib\log.py:160 msgid "Authors" msgstr "" #: lib\log.py:162 msgid "Revision IDs" msgstr "" #: lib\log.py:164 msgid "Revision Numbers" msgstr "" #: lib\log.py:166 msgid "Tags" msgstr "" #: lib\log.py:168 msgid "Bugs" msgstr "" #: lib\log.py:341 msgid "" "It is not possible to specify different file paths and different branches at " "the same time." msgstr "" #: lib\log.py:365 msgid "Messages and File text (indexed)" msgstr "" #: lib\log.py:567 lib\logwidget.py:162 msgid "Show &differences..." msgstr "" #: lib\log.py:575 msgid "View file" msgstr "" #: lib\log.py:579 msgid "Save file on this revision as..." msgstr "" #: lib\log.py:583 msgid "Revert to this revision" msgstr "" #: lib\log.py:862 msgid "Not a file" msgstr "" #: lib\log.py:863 #, python-format msgid "" "Operation is supported for a single file only,\n" "not for a %s." msgstr "" #: lib\log.py:867 msgid "Save file in this revision as..." msgstr "" #: lib\log.py:878 msgid "Revert File" msgstr "" #: lib\log.py:879 msgid "" "Are you sure you want to revert this file to the state it was at the " "selected revision?" msgstr "" #: lib\logmodel.py:43 lib\treewidget.py:354 msgid "Rev" msgstr "" #: lib\logmodel.py:45 lib\treewidget.py:353 msgid "Date" msgstr "" #: lib\logmodel.py:46 lib\treewidget.py:356 msgid "Author" msgstr "" #: lib\logmodel.py:165 #, python-format msgid "bug #%s" msgstr "" #: lib\logwidget.py:134 msgid "Show file &differences" msgstr "" #: lib\logwidget.py:140 msgid "Show all &differences" msgstr "" #: lib\logwidget.py:146 msgid "Show file &differences..." msgstr "" #: lib\logwidget.py:151 msgid "Show all &differences..." msgstr "" #: lib\logwidget.py:168 msgid "Show &tree..." msgstr "" #: lib\logwidget.py:188 msgid "Tag &revision..." msgstr "" #: lib\logwidget.py:191 msgid "R&evert to this revision" msgstr "" #: lib\logwidget.py:195 msgid "&Update to this revision" msgstr "" #: lib\logwidget.py:203 msgid "&Cherry pick" msgstr "" #: lib\logwidget.py:209 msgid "Re&verse Cherry pick" msgstr "" #: lib\logwidget.py:445 #, python-format msgid "Revert to revision %s revid:%s." msgstr "" #: lib\logwidget.py:448 #, python-format msgid "Revert %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:453 lib\revert.py:54 lib\subprocess.py:124 #: lib\subprocess.py:131 lib\treewidget.py:1953 msgid "Revert" msgstr "" #: lib\logwidget.py:467 #, python-format msgid "Update to revision %s revid:%s." msgstr "" #: lib\logwidget.py:470 #, python-format msgid "Update %s to revision %s revid:%s." msgstr "" #: lib\logwidget.py:491 #, python-format msgid "Cherry-pick revisions %s - %s from %s to %s." msgstr "" #: lib\logwidget.py:498 msgid "Cherry-pick" msgstr "" #: lib\logwidget.py:511 #, python-format msgid "Reverse cherry-pick revisions %s - %s" msgstr "" #: lib\logwidget.py:514 #, python-format msgid "Reverse cherry-pick revisions %s - %s in %s." msgstr "" #: lib\logwidget.py:520 msgid "Reverse cherry-pick" 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: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:72 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:480 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 lib\ui_branch.py:100 msgid "Locations" msgstr "" #: lib\plugins.py:111 msgid "(no description)" msgstr "" #: lib\pull.py:251 lib\subprocess.py:122 msgid "Working tree has uncommitted changes." msgstr "" #: lib\pull.py:256 msgid "Working tree is out of date, please run 'bzr update'." msgstr "" #: lib\pull.py:262 msgid "Do you want to continue anyway?" msgstr "" #: lib\revert.py:65 msgid "Select changes to revert" msgstr "" #: lib\revert.py:81 msgid "Do not save backups of reverted files" msgstr "" #: lib\revert.py:93 msgid "Forget pending merges" msgstr "" #: lib\revert.py:140 msgid "View changes in files selected to revert" msgstr "" #: lib\revert.py:247 msgid "" "You have selected revert for all changed paths\n" "but keep pending merges.\n" "\n" "Do you want to continue?" msgstr "" #: lib\revert.py:257 msgid "You have not selected anything to revert." msgstr "" #: lib\revisionmessagebrowser.py:195 msgid "Parents:" msgstr "" #: lib\revisionmessagebrowser.py:198 msgid "Children:" msgstr "" #: lib\revisionmessagebrowser.py:205 msgid "Signature:" msgstr "" #: lib\revisionmessagebrowser.py:221 msgid "Uncommited Working Tree Changes" msgstr "" #: lib\revisionmessagebrowser.py:256 msgid "Date:" msgstr "" #: lib\revisionmessagebrowser.py:258 msgid "Committer:" msgstr "" #: lib\revisionmessagebrowser.py:264 msgid "Author:" msgstr "" #: lib\revisionmessagebrowser.py:268 lib\unbind.py:50 msgid "Branch:" msgstr "" #: lib\revisionmessagebrowser.py:273 msgid "Tags:" msgstr "" #: lib\revisionmessagebrowser.py:285 msgid "Bug:" msgid_plural "Bugs:" msgstr[0] "" msgstr[1] "" #: lib\revisionview.py:65 lib\ui_new_tree.py:158 msgid "Revision" msgstr "" #: lib\run.py:98 msgid "Select working directory" msgstr "" #: lib\run.py:119 msgid "&Edit" msgstr "" #: lib\run.py:167 msgid "Help for command" msgstr "" #: lib\run.py:287 msgid "Select path to insert" msgstr "" #: lib\run.py:297 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\send.py:208 msgid "Email address not entered." msgstr "" #: lib\send.py:212 msgid "Email address is not valid." msgstr "" #: lib\send.py:218 msgid "Filename not entered." msgstr "" #: lib\send.py:224 msgid "No submit branch entered." msgstr "" #: lib\shelvewindow.py:64 lib\shelvewindow.py:112 lib\shelvewindow.py:121 #: lib\shelvewindow.py:123 lib/widgets\shelvelist.py:506 msgid "Shelve Manager" msgstr "" #: lib\shelvewindow.py:86 lib\subprocess.py:125 lib/widgets\shelve.py:346 #: lib/widgets\shelve.py:350 lib/widgets\shelve.py:629 #: lib/widgets\shelve.py:668 lib/widgets\shelve.py:673 #: lib/widgets\shelve.py:719 lib/widgets\shelve.py:724 #: lib/widgets\shelvelist.py:478 msgid "Shelve" msgstr "" #: lib\shelvewindow.py:87 msgid "View shelved changes" msgstr "" #: lib\subprocess.py:129 msgid "Working tree has conflicts." msgstr "" #: lib\subprocess.py:130 msgid "Resolve" msgstr "" #: lib\subprocess.py:136 lib\trace.py:80 msgid "Could not acquire lock. Please retry later." msgstr "" #: lib\subprocess.py:137 msgid "Retry" msgstr "" #: lib\subprocess.py:217 msgid "&Retry" msgstr "" #: lib\subprocess.py:518 msgid "Ready" msgstr "" #: lib\subprocess.py:591 msgid "Starting..." msgstr "" #: lib\subprocess.py:654 msgid "Could not locate \"bzr.exe\"." msgstr "" #: lib\subprocess.py:673 msgid "Could not locate \"bzr\" script." msgstr "" #: lib\subprocess.py:694 msgid "Aborting..." msgstr "" #: lib\subprocess.py:705 lib\subprocess.py:844 msgid "Finished!" msgstr "" #: lib\subprocess.py:732 lib\uifactory.py:108 msgid "Enter Password" msgstr "" #: lib\subprocess.py:742 lib\uifactory.py:119 msgid "Enter Username" msgstr "" #: lib\subprocess.py:824 lib\subprocess.py:850 msgid "Failed!" msgstr "" #: lib\subprocess.py:827 msgid "Failed to start bzr." msgstr "" #: lib\subprocess.py:829 #, python-format msgid "Error while running bzr. (error code: %d)" msgstr "" #: lib\subprocess.py:837 msgid "Aborted!" msgstr "" #: lib\switch.py:46 msgid "Switch" msgstr "" #: lib\switch.py:57 msgid "Switch checkout" msgstr "" #: lib\switch.py:65 msgid "Heavyweight checkout:" msgstr "" #: lib\switch.py:69 msgid "Lightweight checkout:" msgstr "" #: lib\switch.py:76 msgid "Checkout of branch:" msgstr "" #: lib\switch.py:89 msgid "Switch to branch:" msgstr "" #: lib\switch.py:113 msgid "Create Branch before switching" msgstr "" #: lib\switch.py:168 msgid "Branch location not specified." msgstr "" #: lib\sysinfo.py:35 lib\ui_sysinfo.py:112 msgid "System Information" msgstr "" #: lib\tag.py:136 msgid "You should specify tag name" msgstr "" #: lib\tag.py:140 #, python-format msgid "" "Tag \"%s\" already exists.\n" "Do you want to move existing tag?" msgstr "" #: lib\tag.py:150 #, python-format msgid "" "Tag \"%s\" does not exists yet.\n" "Do you want to create new tag?" msgstr "" #: lib\tag.py:159 #, python-format msgid "Tag \"%s\" does not exists" msgstr "" #: lib\tag.py:195 #, python-format msgid "" "Not a branch:\n" "%s" msgstr "" #: lib\trace.py:246 #, python-format msgid "Close %s Window" msgstr "" #: lib\trace.py:248 msgid "Close Window" msgstr "" #: lib\trace.py:250 msgid "Close Application" msgstr "" #: lib\trace.py:260 msgid "Close Error Dialog" msgstr "" #: lib\trace.py:265 msgid "Ignore Error" msgstr "" #: lib\trace.py:291 msgid "Report Bazaar Error" msgstr "" #: lib\trace.py:312 lib\trace.py:358 msgid "Show Error Details >>>" msgstr "" #: lib\trace.py:356 msgid "<<< Hide Error Details" msgstr "" #: lib\treewidget.py:322 msgid "ignored" msgstr "" #: lib\treewidget.py:324 msgid "non-versioned" msgstr "" #: lib\treewidget.py:327 msgid "added, missing" msgstr "" #: lib\treewidget.py:333 msgid "missing" msgstr "" #: lib\treewidget.py:340 msgid "moved" msgstr "" #: lib\treewidget.py:346 msgid "x-bit" msgstr "" #: lib\treewidget.py:352 lib/widgets\shelve.py:285 #: lib/widgets\shelvelist.py:91 msgid "File Name" msgstr "" #: lib\treewidget.py:1302 msgid "Unchanged" msgstr "" #: lib\treewidget.py:1303 msgid "Changed" msgstr "" #: lib\treewidget.py:1304 msgid "Unversioned" msgstr "" #: lib\treewidget.py:1305 msgid "Ignored" msgstr "" #: lib\treewidget.py:1682 msgid "&Open" msgstr "" #: lib\treewidget.py:1685 msgid "&View file" msgstr "" #: lib\treewidget.py:1688 msgid "Show &annotate" msgstr "" #: lib\treewidget.py:1691 msgid "Show &log" msgstr "" #: lib\treewidget.py:1709 msgid "Mark conflict &resolved" msgstr "" #: lib\treewidget.py:1714 msgid "&Add" msgstr "" #: lib\treewidget.py:1717 msgid "&Revert" msgstr "" #: lib\treewidget.py:1720 msgid "Re&name" msgstr "" #: lib\treewidget.py:1781 msgid "&Mark as moved and renamed" msgstr "" #: lib\treewidget.py:1783 msgid "&Mark as moved" msgstr "" #: lib\treewidget.py:1785 msgid "&Mark as renamed" msgstr "" #: lib\treewidget.py:1954 msgid "Do you really want to revert the selected file(s)?" msgstr "" #: lib\treewidget.py:1987 msgid "External Merge" msgstr "" #: lib\treewidget.py:2067 msgid "" "Some of the files selected cannot be recovered if removed. Are you sure you " "want to remove these files?" msgstr "" #: lib\treewidget.py:2082 msgid "Select / deselect all" msgstr "" #: lib\tree_branch.py:91 lib\util.py:1012 #, python-format msgid "Not a branch \"%s\"" msgstr "" #: lib\tree_branch.py:93 lib\util.py:1022 #, python-format msgid "No working tree exists for \"%s\"" msgstr "" #: lib\ui_bookmark.py:51 lib\ui_merge.py:64 lib\ui_pull.py:62 #: lib\ui_push.py:64 msgid "&Location:" msgstr "" #: lib\ui_branch.py:101 msgid "&From:" msgstr "" #: lib\ui_branch.py:103 msgid "&To:" msgstr "" #: lib\ui_branch.py:106 msgid "Bind new branch to parent location" msgstr "" #: lib\ui_branch.py:107 lib\ui_merge.py:66 lib\ui_pull.py:64 lib\ui_tag.py:97 msgid "&Revision:" msgstr "" #: lib\ui_info.py:87 msgid "..." msgstr "" #: lib\ui_info.py:89 msgid "&Basic" msgstr "" #: lib\ui_info.py:91 msgid "&Detailed" 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_merge_config.py:58 msgid "Form" msgstr "" #: lib\ui_merge_config.py:59 msgid "External Merge Tools" msgstr "" #: lib\ui_merge_config.py:62 msgid "Sets the selected merge tool as the default to use in qconflicts." msgstr "" #: lib\ui_merge_config.py:63 msgid "Set Default" 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:62 msgid "Push" 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:107 msgid "Run bzr command" msgstr "" #: lib\ui_run.py:109 msgid "&Working directory:" msgstr "" #: lib\ui_run.py:111 msgid "C&ategory:" msgstr "" #: lib\ui_run.py:112 msgid "&Command:" msgstr "" #: lib\ui_run.py:113 msgid "&Show hidden commands" msgstr "" #: lib\ui_run.py:114 msgid "&Options and arguments for command:" msgstr "" #: lib\ui_run.py:115 msgid "Insert &directory..." msgstr "" #: lib\ui_run.py:116 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:47 msgid "Unbind" msgstr "" #: lib\unbind.py:55 msgid "Bound to:" msgstr "" #: lib\uncommit.py:40 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:70 msgid "&Cancel" msgstr "" #: lib\util.py:425 msgid "Warning" msgstr "" #: lib\util.py:436 msgid "Confirm" msgstr "" #: lib\util.py:583 msgid "Select Source Directory" msgstr "" #: lib\util.py:585 msgid "Select Target Directory" msgstr "" #: lib\util.py:726 msgid "deleted files" msgstr "" #: lib\util.py:728 msgid "added files" msgstr "" #: lib\util.py:730 msgid "renamed files" msgstr "" #: lib\util.py:732 msgid "modified files" msgstr "" #: lib\util.py:974 lib\util.py:975 lib\util.py:978 msgid "(no message)" msgstr "" #: lib\verify_signatures.py:52 msgid "Verify Signatures" msgstr "" #: lib\verify_signatures.py:118 msgid "All commits signed with verifiable keys" msgstr "" #: lib/widgets\shelve.py:74 msgid "delete file" msgstr "" #: lib/widgets\shelve.py:74 msgid "rename" msgstr "" #: lib/widgets\shelve.py:74 msgid "add file" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify text" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify target" msgstr "" #: lib/widgets\shelve.py:75 msgid "modify binary" msgstr "" #: lib/widgets\shelve.py:271 msgid "Enter the shelve message" msgstr "" #: lib/widgets\shelve.py:285 msgid "Hunks" msgstr "" #: lib/widgets\shelve.py:307 msgid "Complete" msgstr "" #: lib/widgets\shelve.py:325 msgid "Previous hunk" msgstr "" #: lib/widgets\shelve.py:327 msgid "Next hunk" msgstr "" #: lib/widgets\shelve.py:330 msgid "Use editor" msgstr "" #: lib/widgets\shelve.py:347 msgid "Destroy" msgstr "" #: lib/widgets\shelve.py:356 msgid "Select all" msgstr "" #: lib/widgets\shelve.py:359 msgid "Unselect all" msgstr "" #: lib/widgets\shelve.py:366 lib/widgets\shelvelist.py:200 msgid "&Layout" msgstr "" #: lib/widgets\shelve.py:630 msgid "Change editor is not defined." msgstr "" #: lib/widgets\shelve.py:661 #, python-format msgid "Delete changes of %d file without shelving" msgid_plural "Delete changes of %d files without shelving" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:665 #, python-format msgid "Shelve changes of %d file" msgid_plural "Shelve changes of %d files" msgstr[0] "" msgstr[1] "" #: lib/widgets\shelve.py:674 msgid "No changes selected." msgstr "" #: lib/widgets\shelve.py:711 lib/widgets\shelvelist.py:285 msgid "" msgstr "" #: lib/widgets\shelve.py:720 msgid "Operation aborted because working tree has pending merges." msgstr "" #: lib/widgets\shelve.py:725 msgid "Operation aborted because target files has been changed." msgstr "" #: lib/widgets\shelve.py:965 msgid "Edited by change editor.\n" msgstr "" #: lib/widgets\shelvelist.py:86 msgid "Id" msgstr "" #: lib/widgets\shelvelist.py:120 msgid "Ignore whitespace" msgstr "" #: lib/widgets\shelvelist.py:175 lib/widgets\shelvelist.py:183 msgid "Unshelve" msgstr "" #: lib/widgets\shelvelist.py:176 msgid "Dry run" msgstr "" #: lib/widgets\shelvelist.py:178 msgid "Keep" msgstr "" #: lib/widgets\shelvelist.py:180 msgid "Delete" msgstr "" #: lib/widgets\shelvelist.py:194 msgid "Show filelist" msgstr "" #: lib/widgets\shelvelist.py:484 #, python-format msgid "Apply changes in shelf[%(id)d], and remove from the shelf" msgstr "" #: lib/widgets\shelvelist.py:486 #, python-format msgid "" "Simulate to apply changes in shelf[%(id)d] without changing working tree" msgstr "" #: lib/widgets\shelvelist.py:488 #, python-format msgid "Apply changes in shelf[%(id)d], but keep it shelved" msgstr "" #: lib/widgets\shelvelist.py:490 #, python-format msgid "Remove shelf[%(id)d] without applying" msgstr "" #: lib/widgets\toolbars.py:75 msgid "Find: " msgstr "" #: lib/widgets\toolbars.py:91 msgid "Previous" msgstr "" #: lib/widgets\toolbars.py:95 msgid "Next" msgstr "" #: lib/widgets\toolbars.py:99 msgid "Case sensitive" msgstr "" #: lib/widgets\toolbars.py:101 msgid "Whole words" msgstr "" #: lib/widgets\toolbars.py:110 msgid "Close find" msgstr "" #: lib/widgets\toolbars.py:303 msgid "Layout" msgstr "" #: lib/widgets\toolbars.py:317 #, python-format msgid "Layout %d" msgstr "" ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/ui/bookmark.ui0000644000000000000000000000433414556556456013427 0ustar00 BookmarkDialog 0 0 354 90 &Name: name &Location: location Qt::Vertical 336 16 Qt::Horizontal buttonBox accepted() BookmarkDialog accept() 248 254 157 274 buttonBox rejected() BookmarkDialog reject() 316 260 286 274 ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/ui/branch.ui0000644000000000000000000001136414556556456013060 0ustar00 BranchForm 0 0 349 245 Branch Locations QFormLayout::AllNonFixedFieldsGrow &From: from_location 0 0 true QComboBox::AdjustToContentsOnFirstShow Browse... &To: to_location 0 0 true QComboBox::AdjustToContentsOnFirstShow Browse... Options Bind new branch to parent location &Revision: revision Qt::Horizontal 78 37 BranchForm disableUi(bool) groupBox setDisabled(bool) 100 4 108 13 disableUi(bool) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/ui/info.ui0000644000000000000000000000760514556556456012561 0ustar00 InfoForm 0 0 579 266 Location: ... false Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse Qt::Horizontal 40 20 1 &Basic QFrame::NoFrame QFrame::Plain 1 Info Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop &Detailed QFrame::NoFrame QFrame::Plain 1 true 0 0 539 179 Info Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/ui/init.ui0000644000000000000000000002276414556556456012574 0ustar00 InitForm 0 0 417 351 Initialize 9 Local Directory 1 0 Browse... Repository Create a new standalone tree true Qt::Horizontal QSizePolicy::Fixed 20 20 Ensure all revisions are appended to the log Create a new shared repository Qt::Horizontal QSizePolicy::Fixed 20 20 false Skip the creation of working trees in this repository <!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=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tell me more about <a href="bzrtopic:standalone-trees"><span style=" text-decoration: underline; color:#0000ff;">standalone trees</span></a>, <a href="bzrtopic:repositories"><span style=" text-decoration: underline; color:#0000ff;">repositories</span></a> and <a href="bzrtopic:branches"><span style=" text-decoration: underline; color:#0000ff;">branches</span></a>.</p></body></html> Repository Format: 1 0 0 0 true 0 0 377 60 4 Description of format Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true <!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=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="bzrtopic:formats"><span style=" text-decoration: underline; color:#0000ff;">More information about repository formats.</span></a></p></body></html> link_help linkActivated(QString) InitForm linkActivated(QString) 46 212 3 264 link_help_formats linkActivated(QString) InitForm linkActivated(QString) 66 324 3 328 InitForm disableUi(bool) groupBox_3 setDisabled(bool) 9 7 17 15 InitForm disableUi(bool) groupBox setDisabled(bool) 2 181 15 182 but_init toggled(bool) but_append_only setEnabled(bool) 77 106 121 138 radioButton_2 toggled(bool) but_no_trees setEnabled(bool) 150 165 177 187 linkActivated(QString) disableUi(bool) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/ui/merge.ui0000644000000000000000000000661714556556456012727 0ustar00 MergeForm 0 0 448 248 Merge 9 Options &Location: revision true QComboBox::AdjustToMinimumContentsLength Browse... &Revision: revision Qt::Horizontal 107 20 Remember this location as a default Merge even if the working tree has uncommitted changes Merge uncommitted changes instead of committed ones MergeForm disableUi(bool) groupBox setDisabled(bool) 17 7 22 16 disableUi(bool) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/ui/merge_config.ui0000644000000000000000000000742514556556456014252 0ustar00 MergeConfig 0 0 544 330 Form External Merge Tools QAbstractItemView::SelectRows false false true false 15 15 false 15 true 15 false Qt::Horizontal 40 20 Add Remove Sets the selected merge tool as the default to use in qconflicts. Set Default Qt::Horizontal 40 20 ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/ui/new_tree.ui0000644000000000000000000003237314556556456013436 0ustar00 NewWorkingTreeForm 0 0 479 385 Create a new Breezy Working Tree 9 Branch Branch source (enter a URL or select a local directory with an existing branch) true QComboBox::AdjustToMinimumContentsLength Browse... false Local directory where the working tree will be created false Browse... Working Tree Options Create a checkout true Qt::Horizontal QSizePolicy::Fixed 18 20 1 0 <!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=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Lightweight checkouts </span>depend on access to the branch for every operation.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Normal checkouts can perform common operations like diff and status without such access, and also support local commits.</p> <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;"></p></body></html> Light-weight checkout Make a local copy of the branch Qt::Horizontal QSizePolicy::Fixed 18 20 false <!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=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A <span style=" font-style:italic;">stacked branch</span> only stores information not in the source branch, and as such, depends on the availability of the source branch</p></body></html> Create a stacked branch referring to the source branch true ArrowCursor Click a link for more information about checkouts and branches. <!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=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Tell me more about <a href="bzrtopic:checkouts"><span style=" text-decoration: underline; color:#0000ff;">checkouts</span></a> and <a href="bzrtopic:branches"><span style=" text-decoration: underline; color:#0000ff;">branches</span></a></p></body></html> Qt::RichText false Qt::TextBrowserInteraction Revision Most recent (tip) revision true Revision: false 1 0 false Show Log... <!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=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><a href="bzrtopic:revisionspec"><span style=" text-decoration: underline; color:#0000ff;">About revision identifiers</span></a></p></body></html> link_help linkActivated(QString) NewWorkingTreeForm linkActivated(QString) 101 270 8 296 link_help_revisions linkActivated(QString) NewWorkingTreeForm linkActivated(QString) 316 364 6 379 but_checkout toggled(bool) but_lightweight setEnabled(bool) 66 173 88 202 but_branch toggled(bool) but_stacked setEnabled(bool) 58 224 84 250 but_rev_specific toggled(bool) revision setEnabled(bool) 73 350 115 356 NewWorkingTreeForm disableUi(bool) groupBox setDisabled(bool) 52 2 71 21 NewWorkingTreeForm disableUi(bool) groupBox_3 setDisabled(bool) 5 145 24 155 NewWorkingTreeForm disableUi(bool) groupBox_2 setDisabled(bool) 4 270 61 297 linkActivated(QString) disableUi(bool) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/ui/pull.ui0000644000000000000000000000632014556556456012573 0ustar00 PullForm 0 0 404 194 Pull 9 Options &Location: location true QComboBox::AdjustToMinimumContentsLength Browse... &Revision: revision Qt::Horizontal 211 20 Remember this location as a default false Overwrite differences between branches PullForm disableUi(bool) groupBox setDisabled(bool) 15 7 24 18 disableUi(bool) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/ui/push.ui0000644000000000000000000000623614556556456012604 0ustar00 PushForm 0 0 349 175 Push 9 Options &Location: location 0 0 true QComboBox::AdjustToMinimumContentsLength Browse... Remember this location as a default false Overwrite differences between branches Use existing directory Create the path up to the branch if it does not exist PushForm disableUi(bool) groupBox setDisabled(bool) 5 8 12 18 disableUi(bool) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/ui/run.ui0000644000000000000000000001342614556556456012430 0ustar00 RunDialog 0 0 473 367 Run bzr command Qt::Vertical false false Options &Working directory: wd_edit &Browse... C&ategory: cmd_combobox 170 0 &Command: cmd_combobox 170 0 true &Show hidden commands 0 &Options and arguments for command: opt_arg_edit Insert &directory... Insert &filenames... Qt::Horizontal 40 20 0 wd_edit browse_button hidden_checkbox cmd_combobox opt_arg_edit directory_button filenames_button help_browser RunDialog disableUi(bool) run_container setDisabled(bool) 271 362 344 135 disableUi(bool) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/ui/sysinfo.ui0000644000000000000000000001127614556556456013317 0ustar00 MainWindow 0 0 404 288 System Information Breezy Library false Version: (bzr-version) Path: 300 0 (bzr-lib-path) Breezy Configuration Settings: (bzr-config-dir) Log File: 300 0 (bzr-log-file) 0 0 Python Interpreter Version: (python-version) Path: (python-file) Library: 300 0 (python-lib-dir) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/ui/tag.ui0000644000000000000000000001173014556556456012373 0ustar00 TagForm Qt::NonModal 0 0 340 220 0 0 0 0 Qt::DefaultContextMenu Edit tag Branch Qt::Horizontal 261 25 &Browse... 0 0 Tag &Action: cb_action Create new tag Replace existing tag Delete existing tag &Tag name: cb_tag true &Revision: rev_edit false &Select... branch_location branch_browse cb_action cb_tag rev_edit pick_rev TagForm disableUi(bool) tag_group setDisabled(bool) 12 217 23 204 TagForm disableUi(bool) branch_group setDisabled(bool) 5 71 19 71 disableUi(bool) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/ui/update_branch.ui0000644000000000000000000001570614556556456014426 0ustar00 UpdateBranchForm 0 0 407 198 Update Branch 9 This directory is a branch. Please select what you would like to update false false 0 1 Update source Browse... Pull most recent changes from: true true Remember this as the new parent branch false Overwrite differences between branches Qt::Horizontal QSizePolicy::Fixed 17 18 1 0 true QComboBox::AdjustToMinimumContentsLength <Parent Branch shown here> Qt::Horizontal 18 20 Qt::Horizontal 18 17 Update working tree to the latest changes in the branch location_picker but_pull but_pull_remember but_pull_overwrite horizontalSpacer location horizontalSpacer_2 horizontalSpacer_3 but_update but_pull toggled(bool) but_pull_remember setEnabled(bool) 55 65 93 120 but_pull toggled(bool) but_pull_overwrite setEnabled(bool) 65 64 76 140 but_pull toggled(bool) location setEnabled(bool) 143 62 167 93 but_pull toggled(bool) location_picker setEnabled(bool) 197 65 341 92 UpdateBranchForm disableUi(bool) label setDisabled(bool) 2 6 15 17 UpdateBranchForm disableUi(bool) groupBox setDisabled(bool) 5 43 11 57 disableUi(bool) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/ui/update_checkout.ui0000644000000000000000000001211514556556456014765 0ustar00 UpdateCheckoutForm 0 0 317 170 Update Checkout 9 0 0 This directory is a checkout of: %s Update source Update the working tree from the bound branch true true Pull a different branch Qt::Horizontal 18 20 false 1 0 true QComboBox::AdjustToMinimumContentsLength false Browse... Qt::Horizontal 18 20 false Overwrite differences between branches but_pull toggled(bool) location setEnabled(bool) 101 89 105 114 but_pull toggled(bool) location_picker setEnabled(bool) 173 87 255 108 but_pull toggled(bool) but_pull_overwrite setEnabled(bool) 62 86 73 141 UpdateCheckoutForm disableUi(bool) groupBox setDisabled(bool) 4 6 18 38 disableUi(bool) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1706745133.704 qbrz-0.23.2+bzr1665/ui/verify-signatures.ui0000644000000000000000000000110314556556456015277 0ustar00 VerifyForm 0 0 560 230 1