qbzr/AUTHORS.txt0000644000000000000000000000531412175306536013673 0ustar rootroot00000000000000Contributors: * 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 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 qbzr/COPYING.txt0000644000000000000000000004310512175306536013656 0ustar rootroot00000000000000 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. qbzr/MANIFEST.in0000644000000000000000000000007612175306536013543 0ustar rootroot00000000000000include ./*.txt prune docs/* include po/* include extras/*.py qbzr/Makefile0000644000000000000000000000171212175306536013443 0ustar rootroot00000000000000all: @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 @echo To build release run: @echo make release RELEASE=X.Y.Z .PHONY: test pot mo clean tags docs ui test: bzr selftest -s bp.qbzr pot: python setup.py build_pot -N -d. mo: python setup.py build_mo -f tarball: bzr export --root=qbzr qbzr-$(RELEASE).tar.gz gpg -ab qbzr-$(RELEASE).tar.gz inno: mo iscc installer/qbzr-setup.iss gpg -ab qbzr-setup-$(RELEASE).exe release: tarball inno clean: python 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: python setup.py build_ui qbzr/NEWS.txt0000644000000000000000000021302512175306536013322 0ustar rootroot000000000000000.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. qbzr/README.txt0000644000000000000000000001442412175306536013505 0ustar rootroot00000000000000====================================== QBzr - Qt-based front end for Bazaar ====================================== QBzr is a cross platform, Qt-based front-end for Bazaar, 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". Requirements ============ * Python 2.4-2.7 * Bazaar 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/ Compatibility between qbzr and bzr versions =========================================== * QBzr 0.23 is targeted to bzr 2.6 and compatible with bzr 2.5. It may not work with older versions of bzr. * QBzr 0.22 is targeted to bzr 2.5 and compatible with bzr 2.4 It may not work with older versions of bzr. * QBzr 0.21 is targeted to bzr 2.4 and compatible with bzr 2.3. It may not work with older versions of bzr. * QBzr 0.20 is targeted to bzr 2.3 and compatible with bzr 2.2. It may not work with older versions of bzr. * QBzr 0.19 required bzr 2.2 and compatible with bzr 2.1. It may not work with older versions of bzr. * QBzr 0.18.x required bzr 2.1.x. Some commands/dialogs are working with bzr 1.17, 1.18.x, 2.0.x. It may work with bzr 2.2 or later, but this is not guaranteed. * QBzr 0.14.x compatible with bzr 1.17, 1.18.x, 2.0.x. Other bzr plugins that improve QBzr =================================== * bzr-search (Makes searching in log faster) https://launchpad.net/bzr-search * bzr-difftools (Improves the usability of launching external diffs) https://launchpad.net/bzr-difftools * bzr-extmerge (Required to lauch external merge applications to resolve conficts.) https://launchpad.net/bzr-extmerge 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 Bazaar and QBzr. * 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. Interface localization ====================== QBzr uses gettext library for i18n support. Available translations resides in po/ subdirectory of the tree. QBzr 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 QBzr interface to other languages. You can use either Launchpad trnaslations interface (it's preferable way) see https://translations.launchpad.net/qbzr, or you can translate it offline, see instructions below. First at all you need to download from http://bazaar.launchpad.net/~qbzr-dev/qbzr/trunk/files either `po/qbzr-XX.po` (where XX is your language and country code) or `po/qbzr.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/qbzr/+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 http://www.gnu.org/software/gettext/manual/gettext.html#Country-Codes Configuration ============= The configuration is in .bazaar/qbzr.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/.bzr/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/qbzr * Bug Tracker, Source Code, Translations, Questions: https://launchpad.net/qbzr qbzr/TODO.txt0000644000000000000000000000165712175306536013321 0ustar rootroot00000000000000TODO 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) qbzr/__init__.py0000644000000000000000000001770012175306536014120 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar commands # Copyright (C) 2008 Lukáš Lalinský # Copyright (C) 2009, 2010, 2011, 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. """QBzr - Qt-based frontend for Bazaar QBzr is a cross platform, Qt-based front-end for Bazaar, 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". QBzr requires Qt/PyQt 4.4.x or later 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 Bazaar and QBzr. * 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. """ from __future__ import absolute_import version_info = (0,23,1,'final',0) __version__ = '.'.join(map(str, version_info)) import bzrlib from bzrlib import api def require_mimimum_api(object_with_api, wanted_mimimum_api): """Check if object_with_api supports the mimimum api version wanted_mimimum_api. :param object_with_api: An object which exports an API minimum and current version. See get_minimum_api_version and get_current_api_version for details. :param wanted_mimimum_api: The API version for which support is required. :return: None :raises IncompatibleAPI: When the wanted_api is not supported by object_with_api. """ current = api.get_current_api_version(object_with_api) minimum = api.get_minimum_api_version(object_with_api) if wanted_mimimum_api > minimum: from bzrlib.errors import IncompatibleAPI raise IncompatibleAPI(object_with_api, wanted_mimimum_api, minimum, current) require_mimimum_api(bzrlib, (2, 1, 0)) from bzrlib.commands import plugin_cmds # merge --qpreview disabled for 0.14 because it makes qbzr incompatible with bzr-pipeline plugin # see bug https://bugs.launchpad.net/bugs/395817 #register_lazy_command('bzrlib.plugins.qbzr.lib.commands', 'cmd_merge', [], decorate=True) # provides merge --qpreview lazy_commands = ( # module, command, [aliases] ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qadd', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qannotate', ['qann', 'qblame']), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qbind', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qbranch', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qbrowse', ['qbw']), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qmain', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qcat', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qcommit', ['qci']), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qconfig', ['qconfigure']), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qconflicts', ['qresolve']), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qdiff', ['qdi']), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qexport', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qgetnew', ['qgetn']), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qgetupdates', ['qgetu', 'qgetup']), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qhelp', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qignore', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qinfo', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qinit', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qlog', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qmerge', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qplugins', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qpull', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qpush', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qrevert', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qrun', ['qcmd']), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qshelve', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qunshelve', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qtag', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_quncommit', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qupdate', ['qup']), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qverify_signatures', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qversion', ['qsysinfo']), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qviewer', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qsend', ['qsend']), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qswitch', []), ('bzrlib.plugins.qbzr.lib.commands', 'cmd_qunbind', []), # extra commands ('bzrlib.plugins.qbzr.lib.extra.bugurl', 'cmd_bug_url', []), ('bzrlib.plugins.qbzr.lib.extra.isignored', 'cmd_is_ignored', []), ('bzrlib.plugins.qbzr.lib.extra.isversioned', 'cmd_is_versioned', []), # hidden power of qbzr ;-) ('bzrlib.plugins.qbzr.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 bzrlib.plugins.qbzr.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 bzrlib.hooks import install_lazy_named_hook except ImportError: from bzrlib.branch import Branch Branch.hooks.install_named_hook('post_uncommit', post_uncommit_hook, 'Remember uncomitted revision data for qcommit') else: install_lazy_named_hook("bzrlib.branch", "Branch.hooks", 'post_uncommit', post_uncommit_hook, 'Remember uncomitted revision data for qcommit') def load_tests(basic_tests, module, loader): from bzrlib.plugins.qbzr.lib.tests import load_tests return load_tests(basic_tests, module, loader) qbzr/data/0000755000000000000000000000000012175306536012713 5ustar rootroot00000000000000qbzr/docs/0000755000000000000000000000000012175306536012732 5ustar rootroot00000000000000qbzr/extras/0000755000000000000000000000000012175306536013310 5ustar rootroot00000000000000qbzr/installer/0000755000000000000000000000000012175306536013777 5ustar rootroot00000000000000qbzr/lib/0000755000000000000000000000000012175306536012550 5ustar rootroot00000000000000qbzr/po/0000755000000000000000000000000012175306536012420 5ustar rootroot00000000000000qbzr/run-tests.sh0000755000000000000000000000006112175306536014302 0ustar rootroot00000000000000#!/bin/sh bzr selftest -s bzrlib.plugins.qbzr $@ qbzr/setup.py0000755000000000000000000000172512175306536013524 0ustar rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- from distutils.core import setup try: from extras import cmdclass except ImportError: cmdclass = {} ext_modules = [] setup(name='qbzr', description='Qt4 frontend for Bazaar', keywords='plugin bzr qt qbzr', version='0.23.1', url='http://wiki.bazaar.canonical.com/QBzr', license='GPL', author='QBzr Developers', author_email='qbzr@googlegroups.com', package_dir={'bzrlib.plugins.qbzr': '.'}, package_data={'bzrlib.plugins.qbzr': ['locale/*/LC_MESSAGES/qbzr.mo', '*.txt', ]}, packages=['bzrlib.plugins.qbzr', 'bzrlib.plugins.qbzr.lib', 'bzrlib.plugins.qbzr.lib.extra', 'bzrlib.plugins.qbzr.lib.tests', 'bzrlib.plugins.qbzr.lib.widgets', ], ext_modules=ext_modules, cmdclass=cmdclass, ) qbzr/ui/0000755000000000000000000000000012175306536012417 5ustar rootroot00000000000000qbzr/data/16x16/0000755000000000000000000000000012175306536013500 5ustar rootroot00000000000000qbzr/data/22x22/0000755000000000000000000000000012175306536013472 5ustar rootroot00000000000000qbzr/data/bzr-16.png0000644000000000000000000000121412175306536014440 0ustar rootroot00000000000000PNG  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`qbzr/data/bzr-32.png0000644000000000000000000000325012175306536014440 0ustar rootroot00000000000000PNG  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`qbzr/data/compile.py0000755000000000000000000000040112175306536014713 0ustar rootroot00000000000000#!/usr/bin/env python import os, sys RESFILE = '../lib/resources.py' os.system("pyrcc4 qbzr.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() qbzr/data/qbzr-pull.svg0000644000000000000000000063510212175306536015373 0ustar rootroot00000000000000 image/svg+xml Remote Desktop Jakub Steiner Tuomas Kuosmanen http://jimmac.musichall.cz vnc remote desktop control qbzr/data/qbzr-push.svg0000644000000000000000000063711312175306536015402 0ustar rootroot00000000000000 image/svg+xml Remote Desktop Jakub Steiner Tuomas Kuosmanen http://jimmac.musichall.cz vnc remote desktop control qbzr/data/qbzr.qrc0000644000000000000000000000346712175306536014412 0ustar rootroot00000000000000 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 qbzr/data/16x16/accessories-text-editor.png0000644000000000000000000000107612175306536020763 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/bookmark.png0000644000000000000000000000115012175306536016010 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/complete.png0000644000000000000000000000103412175306536016014 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/computer.png0000644000000000000000000000067312175306536016052 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/delete.png0000644000000000000000000000125012175306536015446 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/edit-find.png0000644000000000000000000000115112175306536016047 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/file-conflict.png0000644000000000000000000000113212175306536016721 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/file-modified.png0000644000000000000000000000117012175306536016702 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/file-unchanged.png0000644000000000000000000000117512175306536017063 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/file.png0000644000000000000000000000055112175306536015126 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/folder-added.png0000644000000000000000000000132012175306536016514 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/folder-branch.png0000644000000000000000000000123612175306536016716 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/folder-modified.png0000644000000000000000000000132012175306536017233 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/folder-open.png0000644000000000000000000000101312175306536016413 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/folder.png0000644000000000000000000000076212175306536015466 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/format-text-bold.png0000644000000000000000000000130112175306536017371 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/go-down.png0000644000000000000000000000125312175306536015561 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/go-up.png0000644000000000000000000000121412175306536015233 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/process-working.gif0000644000000000000000000000302112175306536017317 0ustar rootroot00000000000000GIF89aݻ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%!;qbzr/data/16x16/unidiff.png0000644000000000000000000000052012175306536015627 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/view-refresh.png0000644000000000000000000000162012175306536016613 0ustar rootroot00000000000000PNG  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`qbzr/data/16x16/whitespace.png0000644000000000000000000000052612175306536016345 0ustar rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8S90 X %@!:{+!i3#QUm/@DcUU DMIUq"ڸ,c${B*˙QG0̌eY. !{03BU!")" y4M(;8碶.5Xk ,ˤ Aěr<`?fzcIENDB`qbzr/data/22x22/bookmark.png0000644000000000000000000000172312175306536016010 0ustar rootroot00000000000000PNG  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`qbzr/data/22x22/delete.png0000644000000000000000000000227312175306536015446 0ustar rootroot00000000000000PNG  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`qbzr/data/22x22/document-properties.png0000644000000000000000000000126012175306536020207 0ustar rootroot00000000000000PNG  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`qbzr/data/22x22/go-next.png0000644000000000000000000000164212175306536015564 0ustar rootroot00000000000000PNG  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`qbzr/data/22x22/go-previous.png0000644000000000000000000000167312175306536016466 0ustar rootroot00000000000000PNG  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`qbzr/data/22x22/internet-news-reader.png0000644000000000000000000000116412175306536020244 0ustar rootroot00000000000000PNG  IHDRĴl;bKGDC pHYs  ~tIME g{>tEXtCommentCreated with The GIMP (c) 2003 Jakub 'jimmac' Steiner'3XIDAT8˵AkAqEJTEPO*6g/{/JI+=P0$8+mqh _ /KZT2nIENDB`qbzr/data/22x22/qbzr-pull.png0000644000000000000000000000312412175306536016130 0ustar rootroot00000000000000PNG  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`qbzr/data/22x22/qbzr-push.png0000644000000000000000000000314312175306536016134 0ustar rootroot00000000000000PNG  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`qbzr/data/22x22/select-all.png0000644000000000000000000000116612175306536016231 0ustar rootroot00000000000000PNG  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`qbzr/data/22x22/shelve.png0000644000000000000000000000217612175306536015474 0ustar rootroot00000000000000PNG  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`qbzr/data/22x22/unidiff.png0000644000000000000000000000067312175306536015632 0ustar rootroot00000000000000PNG  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`qbzr/data/22x22/unselect-all.png0000644000000000000000000000104112175306536016564 0ustar rootroot00000000000000PNG  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`qbzr/data/22x22/unshelve.png0000644000000000000000000000204612175306536016033 0ustar rootroot00000000000000PNG  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`qbzr/data/22x22/view-refresh.png0000644000000000000000000000252412175306536016611 0ustar rootroot00000000000000PNG  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`qbzr/data/22x22/view-split-left-right.png0000644000000000000000000000047412175306536020353 0ustar rootroot00000000000000PNG  IHDRĴl;sRGBbKGD pHYsu85tIME #CIDAT8 @Eb ѷKjmbM(Bwu; S7VX$u@]UUǣǰƘZkn{`/HD(rd+βKuf pN0&Z+人sҊDdyzi6>ųƏb;iRS':RVDIENDB`qbzr/docs/Makefile0000644000000000000000000000041712175306536014374 0ustar rootroot00000000000000.PHONY = html all: html rst2html := python rst2html.py %.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 qbzr/docs/exception_reporting.txt0000644000000000000000000000477312175306536017575 0ustar rootroot00000000000000Exception 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()) qbzr/docs/gettext_usage.txt0000644000000000000000000000605712175306536016353 0ustar rootroot00000000000000Gettext 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_()). qbzr/docs/index.txt0000644000000000000000000000064312175306536014605 0ustar rootroot00000000000000QBzr 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 `_ qbzr/docs/lp-urls-notes.txt0000644000000000000000000000126012175306536016216 0ustar rootroot00000000000000Explanation 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 qbzr/docs/make_release.txt0000644000000000000000000000751712175306536016122 0ustar rootroot00000000000000Short 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 -------------------------------------- ??? qbzr/docs/rst2html.py0000644000000000000000000000115412175306536015064 0ustar rootroot00000000000000# 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) qbzr/docs/slot-signal-mini-tutorial/0000755000000000000000000000000012175306536017761 5ustar rootroot00000000000000qbzr/docs/slot-signal-mini-tutorial/slot-signal-fig1.png0000644000000000000000000004751112175306536023557 0ustar rootroot00000000000000PNG  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`qbzr/docs/slot-signal-mini-tutorial/slot-signal-fig2.png0000644000000000000000000007606012175306536023561 0ustar rootroot00000000000000PNG  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`qbzr/docs/slot-signal-mini-tutorial/slot-signal-fig3.png0000644000000000000000000005216612175306536023563 0ustar rootroot00000000000000PNG  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`qbzr/docs/slot-signal-mini-tutorial/slot-signal-fig4.png0000644000000000000000000005130612175306536023557 0ustar rootroot00000000000000PNG  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`qbzr/docs/slot-signal-mini-tutorial/slot-signal-mini-tutorial.txt0000644000000000000000000000672512175306536025563 0ustar rootroot00000000000000Mini-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. qbzr/extras/__init__.py0000644000000000000000000000247312175306536015427 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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, } qbzr/extras/build_docs.py0000644000000000000000000000577412175306536016006 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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]) qbzr/extras/build_mo.py0000644000000000000000000001043412175306536015456 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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_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 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)) qbzr/extras/build_pot.py0000644000000000000000000001101612175306536015642 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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): f = open(src, 'rU') try: content = f.read() finally: f.close() if dst is None: dst = src f = open(dst, 'wb') try: f.write(content) finally: f.close() 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) 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 if self.english: log.info('Regenerating English PO file...') regenerate_en(prj_name, self.build_dir, self.output, self.spawn) # search and update all po-files if self.no_lang: return for po in glob.glob(os.path.join(self.build_dir,'*.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) qbzr/extras/build_ui.py0000644000000000000000000000513112175306536015456 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 distutils.core import Command from distutils.dep_util import newer from StringIO import StringIO import glob import os import re _translate_re = re.compile(r'QtGui\.QApplication.translate\(.*?, (.*?), None, QtGui\.QApplication\.UnicodeUTF8\)') _import_re = re.compile(r'(from PyQt4 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 PyQt4 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 PyQt4 import QtCore, QtGui", "from PyQt4 import QtCore, QtGui\n" "from bzrlib.plugins.%s.lib.i18n import gettext\n" % prj_name) f = open(pyfile, "wb") f.write(source) f.close() qbzr/extras/check_py24.py0000644000000000000000000000517512175306536015625 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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, 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) qbzr/extras/check_utf8.py0000644000000000000000000000447612175306536015720 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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, 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) qbzr/extras/en_po.py0000644000000000000000000000263412175306536014767 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar commands # Copyright (C) 2010 Alexander Belchenko # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """Regenerate English en.po file from POT file.""" import os def regenerate_en(prj_name, po_dir, pot_file, spawn): if prj_name and prj_name != 'messages': en_po = '%s-en.po' % prj_name else: en_po = 'en.po' en_po_path = os.path.join(po_dir, en_po) spawn(['msginit', '--no-translator', '-l', 'en', '-i', os.path.join(po_dir, pot_file), '-o', en_po_path, ]) # normalize line-endings in en.po file (to LF) f = open(en_po_path, 'rU') s = f.read() f.close() f = open(en_po_path, 'wb') f.write(s) f.close() qbzr/extras/import_po.py0000644000000000000000000000657612175306536015710 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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) fd = open(fn, 'wb') try: fd.write(ft.read()) finally: fd.close() 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.') qbzr/installer/qbzr-setup.iss0000644000000000000000000001210012175306536016625 0ustar rootroot00000000000000; 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=QBzr AppName= QBzr AppVerName= QBzr 0.23.1 OutputBaseFilename=qbzr-setup-0.23.1 SourceDir="..\" OutputDir="." OutputManifestFile=qbzr-setup-iss.log AppPublisher=QBzr 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\QBzr"; Flags: uninsdeletekey Root: HKLM; Subkey: "Software\QBzr"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}" [Code] {Function detects system-wide installation of bzr: either bzr.exe or python-based} function GetBzrPath(): String; var BzrPath: String; PythonVersions: TArrayOfString; Ix: Integer; PythonKey: String; PythonPath: String; BzrlibPath: String; Path: String; begin {Check bzr.exe presence} if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\Bazaar', 'InstallPath', BzrPath) then begin Result := BzrPath; end else begin BzrlibPath := ''; {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 BzrlibPath := Path; break; end; end; end; end; Result := BzrlibPath; end; end; {Function determines best possible PATH to install QBzr. At first it tries to find system-wide installation (either bzr.exe or python-based) then checks BZR_PLUGIN_PATH, if all above fails then it suggests install to %APPDATA%\bazaar\2.0 } function GetDirName(Param: String): String; var Path: String; BzrPath: String; EnvBzrPluginPath: String; Ix: Integer; begin Path := ExpandConstant('{userappdata}\bazaar\2.0\plugins\qbzr'); BzrPath := GetBzrPath(); if BzrPath <> '' then begin Path := AddBackslash(BzrPath) + 'plugins\qbzr'; end else begin EnvBzrPluginPath := GetEnv('BZR_PLUGIN_PATH') Ix := Pos(';', EnvBzrPluginPath) if Ix > 0 then EnvBzrPluginPath := Copy(EnvBzrPluginPath, 1, Ix-1) if EnvBzrPluginPath <> '' then Path := AddBackslash(EnvBzrPluginPath) + 'qbzr'; end; Result := Path; end; qbzr/lib/__init__.py0000644000000000000000000000436112175306536014665 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 # XXX maybe extract this into compatibility.py ? if sys.version_info < (2, 5): def _all_2_4_compat(iterable): for element in iterable: if not element: return False return True def _any_2_4_compat(iterable): for element in iterable: if element: return True return False import __builtin__ __builtin__.all = _all_2_4_compat __builtin__.any = _any_2_4_compat # 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 ) qbzr/lib/add.py0000644000000000000000000001553712175306536013665 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.subprocess import SubProcessDialog from bzrlib.plugins.qbzr.lib.treewidget import ( TreeWidget, SelectAllCheckBox, ) from bzrlib.plugins.qbzr.lib.util import ( ThrobberWidget, runs_in_loading_queue, ) from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget from bzrlib.plugins.qbzr.lib.trace import reports_exception class AddWindow(SubProcessDialog): 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(AddWindow, self).__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 = QtGui.QGroupBox(gettext("Unversioned Files"), self) vbox = QtGui.QVBoxLayout(groupbox) self.filelist = TreeWidget(groupbox) self.filelist.throbber = self.throbber self.filelist.tree_model.is_item_in_select_all = lambda item: ( # Is in select all. - Not versioned, and not Ignored item.change is not None and item.change.is_ignored() is None and not item.change.is_versioned(), # look at children. - Not ignored item.change is not None and item.change.is_ignored() is None or item.change is None ) def filter_context_menu(): items = self.filelist.get_selection_items() selection_len = len(items) single_file = (selection_len == 1 and items[0].item.kind == "file") single_item_in_tree = (selection_len == 1 and (items[0].change is None or items[0].change[6][1] is not None)) self.filelist.action_open_file.setEnabled(True) self.filelist.action_open_file.setVisible(True) self.filelist.action_show_file.setEnabled(single_file) self.filelist.action_show_file.setVisible(True) self.filelist.action_show_annotate.setVisible(False) self.filelist.action_show_log.setVisible(False) self.filelist.action_show_diff.setVisible(False) self.filelist.action_add.setVisible(False) self.filelist.action_revert.setVisible(False) self.filelist.action_merge.setVisible(False) self.filelist.action_resolve.setVisible(False) self.filelist.action_rename.setVisible(True) self.filelist.action_rename.setEnabled(single_item_in_tree) self.filelist.action_remove.setVisible(False) self.filelist.action_mark_move.setVisible(False) self.filelist.filter_context_menu = filter_context_menu vbox.addWidget(self.filelist) selectall_checkbox = SelectAllCheckBox(self.filelist, groupbox) vbox.addWidget(selectall_checkbox) selectall_checkbox.setCheckState(QtCore.Qt.Checked) selectall_checkbox.setEnabled(True) self.show_ignored_checkbox = QtGui.QCheckBox( gettext("Show ignored files"), groupbox) vbox.addWidget(self.show_ignored_checkbox) self.connect(self.show_ignored_checkbox, QtCore.SIGNAL("toggled(bool)"), self.show_ignored) # groupbox gets disabled as we are executing. QtCore.QObject.connect(self, QtCore.SIGNAL("disableUi(bool)"), groupbox, QtCore.SLOT("setDisabled(bool)")) self.splitter = QtGui.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 = QtGui.QVBoxLayout(self) layout.addWidget(self.throbber) layout.addWidget(self.splitter) layout.addWidget(self.buttonbox) 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 = self.filelist.tree_filter_model fmodel.setFilter(fmodel.CHANGED, False) fmodel.setFilter(fmodel.UNCHANGED, False) self.filelist.set_tree(self.tree, changes_mode = True, initial_checked_paths=self.initial_selected_list, change_load_filter=lambda c:not c.is_versioned()) self.throbber.hide() def _get_files_to_add(self): return [ref.path for ref in self.filelist.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.""" fmodel = self.filelist.tree_filter_model fmodel.setFilter(fmodel.IGNORED, state) #self.filelist.update_selectall_state(None, None) def _saveSize(self, config): SubProcessDialog._saveSize(self, config) self._saveSplitterSizes(config, self.splitter) qbzr/lib/annotate.py0000644000000000000000000010233512175306536014737 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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, md5 from itertools import groupby from PyQt4 import QtCore, QtGui from bzrlib.revision import CURRENT_REVISION from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.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 bzrlib.plugins.qbzr.lib.widgets.toolbars import FindToolbar from bzrlib.plugins.qbzr.lib.widgets.texteditaccessory import ( GuideBarPanel, setup_guidebar_for_find ) from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget from bzrlib.plugins.qbzr.lib.trace import reports_exception from bzrlib.plugins.qbzr.lib.logwidget import LogList from bzrlib.plugins.qbzr.lib.lazycachedrevloader import (load_revisions, cached_revisions) from bzrlib.plugins.qbzr.lib.texteditannotate import (AnnotateBarBase, AnnotateEditerFrameBase) from bzrlib.lazy_import import lazy_import lazy_import(globals(), ''' from bzrlib.config import parse_username from bzrlib.workingtree import WorkingTree from bzrlib.revisiontree import RevisionTree from bzrlib.plugins.qbzr.lib.revisionmessagebrowser import LogListRevisionMessageBrowser from bzrlib.plugins.qbzr.lib.encoding_selector import EncodingMenuSelector from bzrlib.plugins.qbzr.lib.widgets.tab_width_selector import TabWidthMenuSelector from bzrlib.plugins.qbzr.lib.syntaxhighlighter import highlight_document from bzrlib.plugins.qbzr.lib.revtreeview import paint_revno, get_text_color from bzrlib.plugins.qbzr.lib import logmodel from bzrlib.plugins.qbzr.lib.loggraphviz import BranchInfo from bzrlib.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) self.connect(edit, QtCore.SIGNAL("cursorPositionChanged()"), 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( QtGui.QStyle.PM_FocusFrameHMargin, None, self) + 1 self.line_number_width = fm.width(unicode(lines)) self.line_number_width += (text_margin * 2) self.revno_width = fm.width(unicode(max_revno)+".8.88") self.max_mainline_digits = len(unicode(max_revno)) self.revno_width += (text_margin * 2) if self.splitter: if 0: self.splitter = QtGui.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 = QtGui.QStyleOptionViewItemV4() option.initFrom(self) option.state = option.state | QtGui.QStyle.State_Selected option.rect = rect.toRect() painter.fillRect(rect, QtGui.QBrush(option.palette.highlight())) style.drawPrimitive(QtGui.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( QtGui.QStyle.PM_FocusFrameHMargin, None, self) + 1 if 0: rect = QtCore.QRect line_number_rect = QtCore.QRect( rect.left() + text_margin, rect.top(), self.line_number_width - (2 * text_margin), rect.height()) painter.drawText(line_number_rect, QtCore.Qt.AlignRight, unicode(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( rect.left() + self.line_number_width + text_margin, rect.top(), self.revno_width - (2 * text_margin), rect.height()) paint_revno(painter, revno_rect, QtCore.QString(self.get_revno(revid)), self.max_mainline_digits) if revid in cached_revisions: rev = cached_revisions[revid] author_rect = QtCore.QRect( rect.left() + self.line_number_width + self.revno_width + text_margin, rect.top(), rect.right() - revno_rect.right() - (2 * text_margin), rect.height()) author = QtCore.QString(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(QtGui.QPlainTextEdit): annotate = None rev_colors = {} 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 QtGui.QPlainTextEdit.paintEvent(self, event) def get_positions(self): """Returns the charator positons for the selection start, selection end, center of the viewport, an the number of lines from the top of the viewport to the center of the viewport.""" old_cursor = self.textCursor() old_center = self.cursorForPosition(QtCore.QPoint(0, self.height() / 2)) lines_to_center = (old_center.block().blockNumber() - self.verticalScrollBar().value()) return (old_cursor.selectionStart(), old_cursor.selectionEnd(), old_center.position()) , lines_to_center def set_positions(self, new_positions, lines_to_center): new_start, new_end, new_center = new_positions if new_center: new_center_cursor = QtGui.QTextCursor(self.document()) new_center_cursor.setPosition(new_center) new_scroll = new_center_cursor.block().blockNumber() - lines_to_center self.verticalScrollBar().setValue(new_scroll) new_selection_cursor = QtGui.QTextCursor(self.document()) new_selection_cursor.movePosition(QtGui.QTextCursor.Right, QtGui.QTextCursor.MoveAnchor, new_start) new_selection_cursor.movePosition(QtGui.QTextCursor.Right, QtGui.QTextCursor.KeepAnchor, new_end - new_start) self.setTextCursor(new_selection_cursor) class AnnotateWindow(QBzrWindow): 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(QtGui.QFrame.NoFrame) self.text_edit.setTextInteractionFlags( QtCore.Qt.TextSelectableByMouse| QtCore.Qt.TextSelectableByKeyboard) self.text_edit.setLineWrapMode(QtGui.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 = QtGui.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.connect(self.text_edit, QtCore.SIGNAL("cursorPositionChanged()"), self.edit_cursorPositionChanged) self.connect(self.annotate_bar, QtCore.SIGNAL("cursorPositionChanged()"), self.edit_cursorPositionChanged) self.connect(self.text_edit, QtCore.SIGNAL("documentChangeFinished()"), 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.connect(self.log_list.selectionModel(), QtCore.SIGNAL("selectionChanged(QItemSelection, QItemSelection)"), self.log_list_selectionChanged) self.message = LogListRevisionMessageBrowser(self.log_list, self) self.encoding_selector = EncodingMenuSelector(self.encoding, gettext("Encoding"), self._on_encoding_changed) hsplitter = QtGui.QSplitter(QtCore.Qt.Horizontal) hsplitter.addWidget(self.log_list) hsplitter.addWidget(self.message) hsplitter.setStretchFactor(0, 2) hsplitter.setStretchFactor(1, 2) splitter = QtGui.QSplitter(QtCore.Qt.Vertical) splitter.addWidget(self.text_edit_frame) splitter.addWidget(hsplitter) splitter.setStretchFactor(0, 5) splitter.setStretchFactor(1, 2) vbox = QtGui.QVBoxLayout(self.centralwidget) #vbox.addWidget(self.toolbar) vbox.addWidget(splitter) self.text_edit.setFocus() self.show_find = QtGui.QAction(get_icon("edit-find"), gettext("Find"), self) self.show_find.setShortcuts(QtGui.QKeySequence.Find) self.show_find.setCheckable(True) self.show_goto_line = QtGui.QAction(get_icon("go-jump"), gettext("Goto Line"), self) self.show_goto_line.setShortcuts((QtCore.Qt.CTRL + QtCore.Qt.Key_L,)) self.show_goto_line.setCheckable(True) show_view_menu = QtGui.QAction(get_icon("document-properties"), gettext("&View Options"), self) view_menu = QtGui.QMenu(gettext('View Options'), self) show_view_menu.setMenu(view_menu) word_wrap = QtGui.QAction(gettext("Word Wrap"), self) word_wrap.setCheckable(True) self.connect(word_wrap, QtCore.SIGNAL("toggled (bool)"), self.word_wrap_toggle) 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(QtGui.QToolButton.InstantPopup) spacer = QtGui.QWidget() spacer.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) toolbar.addWidget(spacer) toolbar.addWidget(self.throbber) self.addToolBarBreak() self.find_toolbar = FindToolbar(self, self.text_edit, self.show_find) self.find_toolbar.hide() self.addToolBar(self.find_toolbar) self.connect(self.show_find, QtCore.SIGNAL("toggled (bool)"), self.show_find_toggle) 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.connect(self.show_goto_line, QtCore.SIGNAL("toggled (bool)"), self.show_goto_line_toggle ) self.__hashes = {} 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): """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 self.branch.lock_read() try: self.set_annotate_title() self.annotate(self.annotate_tree, self.fileId, self.path) finally: self.branch.unlock() 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(fileId): if revid == CURRENT_REVISION: revid = CURRENT_REVISION + annotate_tree.basedir 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.emit(QtCore.SIGNAL("documentChangeFinished()")) 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 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.itervalues(): authors = rev.get_apparent_authors() emails = map(self._maybe_extract_email, authors) author_id = ';'.join(emails) if rev.timestamp is None: days = sys.maxint 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.maxint 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(md5.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: self.branch.lock_read() try: revid = str(self.log_list.currentIndex().data(logmodel.RevIdRole).toString()) 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.branch.unlock() 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: self.branch.lock_read() try: self.annotate(self.annotate_tree, self.fileId, self.path) finally: self.branch.unlock() 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(QtGui.QPlainTextEdit.WidgetWidth) else: self.text_edit.setLineWrapMode(QtGui.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. class IntValidator(QtGui.QValidator): def validate (self, input, pos): if input == '': return (QtGui.QValidator.Intermediate, pos) try: i = int(input) except ValueError: return (QtGui.QValidator.Invalid, pos) if i > 0: return (QtGui.QValidator.Acceptable, pos) else: return (QtGui.QValidator.Invalid, pos) class GotoLineToolbar(QtGui.QToolBar): def __init__(self, anotate_window, show_action): QtGui.QToolBar.__init__(self, gettext("Goto Line"), anotate_window) self.anotate_window = anotate_window if 0: self.anotate_window = AnnotateWindow() self.show_action = show_action self.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) self.setMovable (False) label = QtGui.QLabel(gettext("Goto Line: "), self) self.addWidget(label) self.line_edit = QtGui.QLineEdit(self) self.line_edit.setValidator(IntValidator(self.line_edit)) self.addWidget(self.line_edit) label.setBuddy(self.line_edit) go = self.addAction(get_icon("go-next"), gettext("Go")) spacer = QtGui.QWidget() spacer.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) self.addWidget(spacer) close = QtGui.QAction(self) close.setIcon(self.style().standardIcon( QtGui.QStyle.SP_DialogCloseButton)) self.addAction(close) close.setShortcut((QtCore.Qt.Key_Escape)) close.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) close.setStatusTip(gettext("Close Goto Line")) self.connect(close, QtCore.SIGNAL("triggered(bool)"), self.close_triggered) self.connect(go, QtCore.SIGNAL("triggered(bool)"), self.go_triggered) self.connect(self.line_edit, QtCore.SIGNAL("returnPressed()"), self.go_triggered) def close_triggered(self, state): self.show_action.setChecked(False) def go_triggered(self, state=True): try: line = int(str(self.line_edit.text())) 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 = QtGui.QAction(gettext("&Annotate this revision"), self.context_menu) self.connect(set_rev_action, QtCore.SIGNAL('triggered()'), self.parent_annotate_window.set_annotate_revision) self.context_menu.insertAction( self.context_menu.actions()[0], set_rev_action) self.context_menu.setDefaultAction(set_rev_action) def default_action(self, index=None): self.parent_annotate_window.set_annotate_revision() qbzr/lib/autocomplete.py0000644000000000000000000000675212175306536015635 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 = 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 filter(None, result): 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) qbzr/lib/bind.py0000644000000000000000000001144712175306536014045 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib import errors, osutils from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.subprocess import SubProcessDialog from bzrlib.plugins.qbzr.lib.util import ( url_for_display, ) from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget from bzrlib.plugins.qbzr.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 = QtGui.QGroupBox(gettext("Bind"), self) bind_box = QtGui.QFormLayout(gbBind) bind_box.addRow(gettext("Branch location:"), QtGui.QLabel(url_for_display(branch.base))) self.currbound = branch.get_bound_location() if self.currbound != None: bind_box.addRow(gettext("Currently bound to:"), QtGui.QLabel(url_for_display(self.currbound))) # Build the "Bind to" widgets branch_label = QtGui.QLabel(gettext("Bind to:")) branch_combo = QtGui.QComboBox() branch_combo.setEditable(True) self.branch_combo = branch_combo browse_button = QtGui.QPushButton(gettext("Browse")) QtCore.QObject.connect(browse_button, QtCore.SIGNAL("clicked(bool)"), 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 = QtGui.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 = QtGui.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 = QtGui.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 unicode(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()) qbzr/lib/branch.py0000644000000000000000000001301712175306536014361 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore from bzrlib import osutils from bzrlib.commands import get_cmd_object from bzrlib.plugins.qbzr.lib.subprocess import SubProcessDialog from bzrlib.plugins.qbzr.lib.ui_branch import Ui_BranchForm from bzrlib.plugins.qbzr.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.getcwdu() 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. QtCore.QObject.connect(self.ui.from_location, QtCore.SIGNAL("editTextChanged(const QString&)"), self.from_changed) # Initialise the fields fill_combo_with(self.ui.from_location, u'', 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(unicode(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 unicode(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 = unicode(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) qbzr/lib/browse.py0000644000000000000000000002217612175306536014433 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.util import ( BTN_CLOSE, BTN_REFRESH, StandardButton, QBzrWindow, ThrobberWidget, runs_in_loading_queue, url_for_display, ) from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget from bzrlib.plugins.qbzr.lib.trace import reports_exception from bzrlib.lazy_import import lazy_import lazy_import(globals(), ''' from bzrlib import ( osutils, errors, ) from bzrlib.bzrdir import BzrDir from bzrlib.revisionspec import RevisionSpec from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.treewidget import TreeWidget, TreeFilterMenu from bzrlib.plugins.qbzr.lib.diff import DiffButtons ''') class BrowseWindow(QBzrWindow): def __init__(self, branch=None, location=None, revision=None, 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 = QtGui.QVBoxLayout(self.centralwidget) self.throbber = ThrobberWidget(self) vbox.addWidget(self.throbber) hbox = QtGui.QHBoxLayout() hbox.addWidget(QtGui.QLabel(gettext("Location:"))) self.location_edit = QtGui.QLineEdit() self.location_edit.setReadOnly(True) self.location_edit.setText(self.location) hbox.addWidget(self.location_edit, 7) hbox.addWidget(QtGui.QLabel(gettext("Revision:"))) self.revision_edit = QtGui.QLineEdit() self.connect(self.revision_edit, QtCore.SIGNAL("returnPressed()"), self.reload_tree) hbox.addWidget(self.revision_edit, 1) self.show_button = QtGui.QPushButton(gettext("Show")) self.connect(self.show_button, QtCore.SIGNAL("clicked()"), self.reload_tree) hbox.addWidget(self.show_button, 0) self.filter_menu = TreeFilterMenu(self) self.filter_button = QtGui.QPushButton(gettext("&Filter")) self.filter_button.setMenu(self.filter_menu) hbox.addWidget(self.filter_button, 0) self.connect(self.filter_menu, QtCore.SIGNAL("triggered(int, bool)"), 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, QtGui.QDialogButtonBox.ActionRole) self.connect(self.refresh_button, QtCore.SIGNAL("clicked()"), self.file_tree.refresh) self.diffbuttons = DiffButtons(self.centralwidget) self.connect(self.diffbuttons, QtCore.SIGNAL("triggered(QString)"), self.file_tree.show_differences) hbox = QtGui.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. QBzrWindow.show(self) QtCore.QTimer.singleShot(1, self.load) @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) = BzrDir.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() @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 self.tree.lock_read() try: self.file_tree.set_tree(self.workingtree, self.branch) self.file_tree.restore_state(state) finally: self.tree.unlock() for button in buttons: button.setEnabled(True) else: branch = self.branch branch.lock_read() self.processEvents() for button in buttons: button.setEnabled(False) fmodel = self.file_tree.tree_filter_model fmodel.setFilter(fmodel.UNCHANGED, True) self.filter_menu.set_filters(fmodel.filters) try: 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) finally: branch.unlock() self.revision_edit.setText(text) finally: self.throbber.hide() @ui_current_widget def reload_tree(self): revstr = unicode(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, e: QtGui.QMessageBox.warning(self, gettext("Browse"), str(e), QtGui.QMessageBox.Ok) return self.set_revision(revspec) def filter_triggered(self, filter, checked): self.file_tree.tree_filter_model.setFilter(filter, checked) qbzr/lib/bugs.py0000644000000000000000000001117212175306536014064 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 bzrlib 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 bzrlib/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.iteritems(): 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 = 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 qbzr/lib/cat.py0000644000000000000000000003172412175306536013700 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib import errors, osutils from bzrlib.branch import Branch from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.util import ( BTN_CLOSE, QBzrWindow, ThrobberWidget, file_extension, get_monospace_font, get_set_encoding, get_tab_width_pixels, runs_in_loading_queue, ) from bzrlib.plugins.qbzr.lib.encoding_selector import EncodingSelector from bzrlib.plugins.qbzr.lib.fake_branch import FakeBranch from bzrlib.plugins.qbzr.lib.syntaxhighlighter import highlight_document from bzrlib.plugins.qbzr.lib.texteditannotate import LineNumberEditerFrame from bzrlib.plugins.qbzr.lib.trace import reports_exception from bzrlib.plugins.qbzr.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 = QtGui.QVBoxLayout(self.centralwidget) self.vbox.addWidget(self.throbber) self.vbox.addStretch() hbox = QtGui.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. QBzrWindow.show(self) QtCore.QTimer.singleShot(0, 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())) self.tree.lock_read() try: kind = self.tree.kind(self.file_id) if kind == 'file': text = self.tree.get_file_text(self.file_id) elif kind == 'symlink': text = self.tree.get_symlink_target(self.file_id) else: text = '' finally: self.tree.unlock() 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 '\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 = QtGui.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 = QtGui.QGraphicsPixmapItem(self.pixmap) self.scene = QtGui.QGraphicsScene(self.item.boundingRect()) self.scene.addItem(self.item) return QtGui.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 = QtGui.QVBoxLayout(self.centralwidget) self.vbox.addStretch() hbox = QtGui.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': f = open(self.filename, 'rb') try: text = f.read() finally: f.close() 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. """ file_id = tree.path2id(relpath) kind = tree.kind(file_id) 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 qdir = os.path.join(tempfile.gettempdir(), 'QBzr', 'qcat') if not os.path.isdir(qdir): os.makedirs(qdir) basename = os.path.basename(relpath) fname = os.path.join(qdir, basename) f = open(fname, 'wb') tree.lock_read() try: f.write(tree.get_file_text(file_id)) finally: tree.unlock() f.close() # 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 qbzr/lib/commands.py0000644000000000000000000012152612175306536014732 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 bzrlib import errors from bzrlib.commands import Command from bzrlib.option import Option import bzrlib.builtins from bzrlib.lazy_import import lazy_import lazy_import(globals(), ''' import sys from PyQt4 import QtCore, QtGui from bzrlib import ( builtins, osutils, ui, gpg, ) from bzrlib.branch import Branch from bzrlib.bzrdir import BzrDir from bzrlib.workingtree import WorkingTree from bzrlib.plugins.qbzr.lib import i18n from bzrlib.plugins.qbzr.lib.add import AddWindow from bzrlib.plugins.qbzr.lib.annotate import AnnotateWindow from bzrlib.plugins.qbzr.lib.branch import QBzrBranchWindow from bzrlib.plugins.qbzr.lib.browse import BrowseWindow from bzrlib.plugins.qbzr.lib.cat import ( QBzrCatWindow, QBzrViewWindow, cat_to_native_app, ) from bzrlib.plugins.qbzr.lib.commit import CommitWindow from bzrlib.plugins.qbzr.lib.config import QBzrConfigWindow from bzrlib.plugins.qbzr.lib.diffwindow import DiffWindow from bzrlib.plugins.qbzr.lib.getupdates import UpdateBranchWindow, UpdateCheckoutWindow from bzrlib.plugins.qbzr.lib.help import show_help from bzrlib.plugins.qbzr.lib.log import LogWindow from bzrlib.plugins.qbzr.lib.info import QBzrInfoWindow from bzrlib.plugins.qbzr.lib.init import QBzrInitWindow from bzrlib.plugins.qbzr.lib.main import QBzrMainWindow from bzrlib.plugins.qbzr.lib.verify_signatures import \ QBzrVerifySignaturesWindow from bzrlib.plugins.qbzr.lib.pull import ( QBzrPullWindow, QBzrPushWindow, QBzrMergeWindow, ) from bzrlib.plugins.qbzr.lib.revert import RevertWindow from bzrlib.plugins.qbzr.lib.tag import TagWindow from bzrlib.plugins.qbzr.lib.tree_branch import TreeBranch from bzrlib.plugins.qbzr.lib.uncommit import QBzrUncommitWindow from bzrlib.plugins.qbzr.lib.update import QBzrUpdateWindow from bzrlib.plugins.qbzr.lib.util import ( FilterOptions, is_valid_encoding, open_tree, ) from bzrlib.plugins.qbzr.lib.uifactory import QUIFactory from bzrlib.plugins.qbzr.lib.send import SendWindow from bzrlib.plugins.qbzr.lib.shelvewindow import ShelveWindow from bzrlib.plugins.qbzr.lib.widgets.shelvelist import ShelveListWindow ''') from bzrlib.plugins.qbzr.lib.diff_arg import DiffArgProvider CUR_DIR=u'.' class InvalidEncodingOption(errors.BzrError): _fmt = ('Invalid encoding: %(encoding)s\n' 'Valid 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 = ('QBzr require at least PyQt 4.4 and ' 'Qt 4.4 to run. Please check your install') 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, 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 '_qbzr_run' instead of 'run' (as in bzrlib). 2) The _qbzr_run method should return 0 for successfull exit and 1 if operation was cancelled by user. 3) The _qbzr_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 = QtGui.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 bzrlib.plugins.qbzr.lib.trace import excepthook sys.excepthook = excepthook try: try: ret_code = self._qbzr_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 bzrlib.plugins.qbzr.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 bzrlib'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 # bzrlib to parse and pass a revisionspec object, just pass the string # 'revision' as normal. simple_revision_option = Option("revision", short_name='r', type=unicode, help='See "help revisionspec" for details.') def bzr_option(cmd_name, opt_name): """Helper so we can 'borrow' options from bzr itself without needing to duplicate the help text etc. Pass the builtin bzr command name and an option name. eg: takes_options = [bzr_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 bzrlib.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 = \ BzrDir.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( 'bzr 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_file_ids=[file_id])) if entry.kind != 'file': raise errors.BzrCommandError( 'bzr 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 _qbzr_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 _qbzr_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, bzr_option('revert', 'no-backup')] def _qbzr_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 _qbzr_run(self): from bzrlib.plugins.qbzr.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 _qbzr_run(self, revision=None, location=None): Branch.open_containing(location or u'.') # if there is no branch we want NotBranchError raised if revision is None: win = BrowseWindow(location = location) else: win = BrowseWindow(location = location, revision = revision[0]) win.show() self._application.exec_() class cmd_qcommit(QBzrCommand): """GUI for committing revisions.""" takes_args = ['selected*'] takes_options = [ bzr_option('commit', 'message'), bzr_option('commit', 'local'), bzr_option('commit', 'file'), Option('file-encoding', type=check_encoding, help='Encoding of commit message file content.'), ui_mode_option, ] aliases = ['qci'] def _qbzr_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: f = open(file) try: message = f.read().decode(file_encoding or osutils.get_user_encoding()) finally: f.close() 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"), bzr_option('diff', 'old'), bzr_option('diff', 'new'), ] if 'change' in Option.OPTIONS: takes_options.append('change') aliases = ['qdi'] def get_diff_window_args(self, processEvents, add_cleanup): args = {} try: from bzrlib.diff import get_trees_and_branches_to_diff_locked except ImportError: from bzrlib.diff import get_trees_and_branches_to_diff (args["old_tree"], args["new_tree"], args["old_branch"], args["new_branch"], args["specific_files"], _) = \ get_trees_and_branches_to_diff( self.file_list, self.revision, self.old, self.new) else: (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, add_cleanup) 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 _qbzr_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('bzr 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 _qbzr_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 _qbzr_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 _qbzr_run(self, filename, revision=None, encoding=None, native=None): if revision is not None and len(revision) != 1: raise errors.BzrCommandError("bzr 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, bzr_option('pull', 'directory'), ui_mode_option, ] takes_args = ['location?'] def _qbzr_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, bzr_option('merge', 'directory'), bzr_option('merge', 'force'), bzr_option('merge', 'uncommitted'), 'remember'] takes_args = ['location?'] def _qbzr_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', bzr_option("push", "create-prefix"), bzr_option("push", "use-existing-dir"), bzr_option("push", "directory"), ui_mode_option] takes_args = ['location?'] def _qbzr_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(bzr_option("branch", "bind")) except KeyError: # older version of bzr that doesn't support the option pass takes_args = ['from_location?', 'to_location?'] def _qbzr_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 _qbzr_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 _qbzr_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 _qbzr_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(bzrlib.builtins.cmd_merge, DiffArgProvider): __doc__ = bzrlib.builtins.cmd_merge.__doc__ takes_options = bzrlib.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 bzrlib.builtins.cmd_merge.run(self, *args, **kw) def get_diff_window_args(self, processEvents, add_cleanup): tree_merger = self.merger.make_merger() self.tt = tree_merger.make_preview_transform() result_tree = self.tt.get_preview_tree() 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 bzrlib.plugins.qbzr.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: bzrlib.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 _qbzr_run(self): # Remove svn checkout support try: from bzrlib.plugins.svn.format import SvnWorkingTreeDirFormat except ImportError: pass else: from bzrlib.bzrdir import BzrDirFormat, format_registry BzrDirFormat.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 bzrlib.plugins.qbzr.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 _qbzr_run(self, location=CUR_DIR, ui_mode=False, execute=False): branch, relpath = Branch.open_containing(location) tb = TreeBranch.open_containing(location, ui_mode=ui_mode) if tb is None: return errors.EXIT_ERROR if tb.is_light_co(): window = QBzrUpdateWindow(tb.tree, ui_mode, 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 _qbzr_run(self, location=None, ui_mode=False): from bzrlib.plugins.qbzr.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 _qbzr_run(self, topic): show_help(topic) self._application.exec_() class cmd_qtag(QBzrCommand): """Edit tags.""" takes_args = ['tag_name?'] takes_options = [ ui_mode_option, bzr_option('tag', 'delete'), bzr_option('tag', 'directory'), bzr_option('tag', 'force'), 'revision', ] def _qbzr_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 _qbzr_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 _qbzr_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 _qbzr_run(self): from bzrlib.plugins.qbzr.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 _qbzr_run(self): from bzrlib.plugins.qbzr.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 _qbzr_run(self, directory=None, ui_mode=False, execute=False): tree = open_tree(directory, ui_mode) if tree is None: return self.main_window = QBzrUpdateWindow(tree, ui_mode, 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 _qbzr_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 _qbzr_run(self, location=None, ui_mode=False): from bzrlib.plugins.qbzr.lib.switch import QBzrSwitchWindow branch = Branch.open_containing(CUR_DIR)[0] bzrdir = BzrDir.open_containing(CUR_DIR)[0] self.main_window = QBzrSwitchWindow(branch, bzrdir, 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 _qbzr_run(self, ui_mode=False, execute=False): from bzrlib.plugins.qbzr.lib.unbind import QBzrUnbindDialog branch = Branch.open_containing(CUR_DIR)[0] if branch.get_bound_location() == None: raise errors.BzrCommandError("This branch is not bound.") self.main_window = QBzrUnbindDialog(branch, ui_mode, 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 _qbzr_run(self, dest=None, branch_or_subdir=None, ui_mode=False): from bzrlib.plugins.qbzr.lib.export import QBzrExportDialog if branch_or_subdir == 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 _qbzr_run(self, location=None, ui_mode=False): from bzrlib.plugins.qbzr.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=unicode, ), Option('category', help='Initial category selection.', type=unicode, ), execute_option, ] aliases = ['qcmd'] def _qbzr_run(self, command=None, parameters_list=None, ui_mode=False, directory=None, category=None, execute=False): from bzrlib.plugins.qbzr.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, bzr_option('shelve', 'list'), bzr_option('shelve', '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 _qbzr_run(self, file_list=None, list=False, directory=None, ui_mode=False, complete=False, ignore_whitespace=False, encoding=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) self.main_window.show() self._application.exec_() class cmd_qunshelve(QBzrCommand): """Restore shalved changes.""" takes_options = [ ui_mode_option, bzr_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 _qbzr_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, bzr_option('ignore', 'directory'), ] aliases = [] def _qbzr_run(self, directory=None, ui_mode=False): from bzrlib.plugins.qbzr.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_() qbzr/lib/commit.py0000644000000000000000000010112012175306536014405 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.subprocess import SubProcessDialog from bzrlib.plugins.qbzr.lib.util import ( BTN_REFRESH, file_extension, get_global_config, get_qbzr_config, url_for_display, ThrobberWidget, runs_in_loading_queue, StandardButton, InfoWidget, ) from bzrlib.plugins.qbzr.lib.logwidget import LogList from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget from bzrlib.plugins.qbzr.lib.trace import reports_exception from bzrlib.lazy_import import lazy_import lazy_import(globals(), ''' from bzrlib import errors from bzrlib.plugins.qbzr.lib.spellcheck import SpellCheckHighlighter, SpellChecker from bzrlib.plugins.qbzr.lib.autocomplete import get_wordlist_builder from bzrlib.plugins.qbzr.lib.commit_data import QBzrCommitData from bzrlib.plugins.qbzr.lib.diff import ( DiffButtons, show_diff, InternalWTDiffArgProvider, ) from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib import logmodel from bzrlib.plugins.qbzr.lib.loggraphviz import BranchInfo from bzrlib.plugins.qbzr.lib.treewidget import ( TreeWidget, SelectAllCheckBox, ) from bzrlib.plugins.qbzr.lib.revisionview import RevisionView from bzrlib.plugins.qbzr.lib.update import QBzrUpdateWindow ''') MAX_AUTOCOMPLETE_FILES = 20 class TextEdit(QtGui.QTextEdit): def __init__(self, spell_checker, parent=None, main_window=None): QtGui.QTextEdit.__init__(self, parent) self.completer = None self.spell_checker = spell_checker self.eow = QtCore.QString("~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-=") self.main_window = main_window def inputMethodEvent(self, e): self.completer.popup().hide() QtGui.QTextEdit.inputMethodEvent(self, e) def keyPressEvent(self, e): c = self.completer e_key = e.key() 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.emit(QtCore.SIGNAL("messageEntered()")) return isShortcut = e.modifiers() & QtCore.Qt.ControlModifier and e.key() == QtCore.Qt.Key_E if not isShortcut: QtGui.QTextEdit.keyPressEvent(self, e) ctrlOrShift = e.modifiers() & (QtCore.Qt.ControlModifier | QtCore.Qt.ShiftModifier) if ctrlOrShift and e.text().isEmpty(): return hasModifier = (e.modifiers() != QtCore.Qt.NoModifier) and not ctrlOrShift completionPrefix = self.textUnderCursor() if not isShortcut and (hasModifier or e.text().isEmpty() or completionPrefix.length() < 2 or self.eow.contains(e.text().right(1))): 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 = completion.length() - self.completer.completionPrefix().length() tc.movePosition(QtGui.QTextCursor.Left) tc.movePosition(QtGui.QTextCursor.EndOfWord) tc.insertText(completion.right(extra)) self.setTextCursor(tc) def setCompleter(self, completer): self.completer = completer completer.setWidget(self) completer.setCaseSensitivity(QtCore.Qt.CaseSensitive) self.connect(completer, QtCore.SIGNAL("activated(QString)"), 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 = unicode(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 = QtGui.QAction(suggestion, self) self.connect(action, QtCore.SIGNAL("triggered(bool)"), 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(PendingMergesList, self).__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(PendingMergesList, self).create_context_menu(file_ids) showinfo = QtGui.QAction("Show &information...", self) self.context_menu.insertAction(self.context_menu.actions()[0], showinfo) self.context_menu.setDefaultAction(showinfo) self.connect(showinfo, QtCore.SIGNAL("triggered(bool)"), 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 = str(index.data(logmodel.RevIdRole).toString()) 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) 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(CommitWindow, self).__init__( gettext("Commit"), name = "commit", default_size = (540, 540), ui_mode = ui_mode, dialog = dialog, parent = parent) 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.connect(self.process_widget, QtCore.SIGNAL("failed(QString)"), self.on_failed) self.throbber = ThrobberWidget(self) # commit to branch location branch_groupbox = QtGui.QGroupBox(gettext("Branch"), self) branch_layout = QtGui.QGridLayout(branch_groupbox) self.branch_location = QtGui.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 = QtGui.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(QtGui.QLabel(gettext('Description:')), 2, 0, QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) self.commit_type_description = QtGui.QLabel() self.commit_type_description.setWordWrap(True) branch_layout.addWidget(self.commit_type_description, 2, 1) branch_layout.setColumnStretch(1,10) self.connect(self.local_checkbox, QtCore.SIGNAL("stateChanged(int)"), 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 = QtGui.QHBoxLayout(self.not_uptodate_info) # XXX this is to big. Resize not_uptodate_icon = QtGui.QLabel() not_uptodate_icon.setPixmap(self.style().standardPixmap( QtGui.QStyle.SP_MessageBoxWarning)) not_uptodate_layout.addWidget(not_uptodate_icon) self.not_uptodate_label = QtGui.QLabel('error message goes here') not_uptodate_layout.addWidget(self.not_uptodate_label, 2) update_button = QtGui.QPushButton(gettext('Update')) self.connect(update_button, QtCore.SIGNAL("clicked(bool)"), self.open_update_win) not_uptodate_layout.addWidget(update_button) self.not_uptodate_info.hide() branch_layout.addWidget(self.not_uptodate_info, 3, 0, 1, 2) splitter = QtGui.QSplitter(QtCore.Qt.Vertical, self) message_groupbox = QtGui.QGroupBox(gettext("Message"), splitter) splitter.addWidget(message_groupbox) self.tabWidget = QtGui.QTabWidget() splitter.addWidget(self.tabWidget) splitter.setStretchFactor(0, 1) splitter.setStretchFactor(1, 8) grid = QtGui.QGridLayout(message_groupbox) self.show_nonversioned_checkbox = QtGui.QCheckBox( gettext("Show non-versioned files")) show_nonversioned = get_qbzr_config().get_option_as_bool(self._window_name + "_show_nonversioned") if show_nonversioned: self.show_nonversioned_checkbox.setChecked(QtCore.Qt.Checked) else: self.show_nonversioned_checkbox.setChecked(QtCore.Qt.Unchecked) self.filelist = TreeWidget(self) self.filelist.throbber = self.throbber if show_nonversioned: self.filelist.tree_model.set_select_all_kind('all') else: self.filelist.tree_model.set_select_all_kind('versioned') self.file_words = {} self.connect(self.filelist.tree_model, QtCore.SIGNAL("dataChanged(QModelIndex, QModelIndex)"), self.on_filelist_data_changed) self.selectall_checkbox = SelectAllCheckBox(self.filelist, self) self.selectall_checkbox.setCheckState(QtCore.Qt.Checked) language = get_global_config().get_user_option('spellcheck_language') or 'en' spell_checker = SpellChecker(language) # Equivalent for 'bzr commit --message' self.message = TextEdit(spell_checker, message_groupbox, main_window=self) self.message.setToolTip(gettext("Enter the commit message")) self.connect(self.message, QtCore.SIGNAL("messageEntered()"), self.do_accept) self.completer = QtGui.QCompleter() self.completer_model = QtGui.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 = QtGui.QCheckBox(gettext("&Fixed bugs:")) self.bugsCheckBox.setToolTip(gettext("Set the IDs of bugs fixed by " "this commit")) self.bugs = QtGui.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.connect(self.bugsCheckBox, QtCore.SIGNAL("stateChanged(int)"), self.enableBugs) grid.addWidget(self.bugsCheckBox, 1, 0) grid.addWidget(self.bugs, 1, 1) # Equivalent for 'bzr commit --author' self.authorCheckBox = QtGui.QCheckBox(gettext("&Author:")) self.authorCheckBox.setToolTip(gettext("Set the author of this change," " if it's different from the committer")) self.author = QtGui.QLineEdit() self.author.setToolTip(gettext("Enter the author's name, " "e.g. John Doe <jdoe@example.com>")) self.author.setEnabled(False) self.connect(self.authorCheckBox, QtCore.SIGNAL("stateChanged(int)"), 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 = QtGui.QWidget() self.tabWidget.addTab(files_tab, gettext("Changes")) vbox = QtGui.QVBoxLayout(files_tab) vbox.addWidget(self.filelist) self.connect(self.show_nonversioned_checkbox, QtCore.SIGNAL("toggled(bool)"), 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. QtCore.QObject.connect(self, QtCore.SIGNAL("disableUi(bool)"), self.pending_merges_list, QtCore.SLOT("setDisabled(bool)")) else: self.pending_merges_list = False self.process_panel = self.make_process_panel() self.tabWidget.addTab(self.process_panel, gettext("Status")) splitter.setStretchFactor(0, 3) vbox = QtGui.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.connect(self.diffbuttons, QtCore.SIGNAL("triggered(QString)"), self.show_diff_for_checked) self.refresh_button = StandardButton(BTN_REFRESH) self.connect(self.refresh_button, QtCore.SIGNAL("clicked()"), self.refresh) hbox = QtGui.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 QtCore.QObject.connect(self, QtCore.SIGNAL("disableUi(bool)"), w, QtCore.SLOT("setDisabled(bool)")) 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 unicode(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) def exec_(self): QtCore.QTimer.singleShot(1, 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: self.tree.lock_read() try: 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() self.filelist.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: fmodel = self.filelist.tree_filter_model want_unversioned = self.show_nonversioned_checkbox.isChecked() fmodel.setFilter(fmodel.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.path2id(path): want_unversioned = True break self.filelist.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=lambda c:not c.is_ignored()) else: self.filelist.refresh() self.is_loading = False self.processEvents() self.update_compleater_words() finally: self.tree.unlock() 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.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.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 bzrlib.trace import warning warning("Cannot save commit data because the branch is locked.") return # collect data ci_data = QBzrCommitData(tree=self.tree) message = unicode(self.message.toPlainText()).strip() if message: ci_data['message'] = message bug_str = '' if self.bugsCheckBox.isChecked(): bug_str = unicode(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 bzrlib.trace import warning warning("Cannot wipe commit data because the branch is locked.") return self.ci_data.wipe() def _get_message(self): return unicode(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.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.\n" "Do you want to commit anyway?")): return False return True def do_start(self): args = ["commit"] message = self._get_message() 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 unicode(self.bugs.text()).split(): args.append(("--fixes=%s" % s)) if self.authorCheckBox.isChecked(): args.append(("--author=%s" % unicode(self.author.text()))) if self.is_bound and self.local_checkbox.isChecked(): args.append("--local") dir = self.tree.basedir commands = [] if files_to_add: commands.append((dir, ["add", "--no-recurse"] + files_to_add)) commands.append((dir, 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.want_unversioned: state = self.filelist.get_state() self.filelist.set_tree( self.tree, changes_mode=True, want_unversioned=True, change_load_filter=lambda c:not c.is_ignored()) self.filelist.restore_state(state) if state: self.filelist.tree_model.set_select_all_kind('all') else: self.filelist.tree_model.set_select_all_kind('versioned') fmodel = self.filelist.tree_filter_model fmodel.setFilter(fmodel.UNVERSIONED, state) def _save_or_wipe_commit_data(self): if not self.process_widget.is_running(): if self.process_widget.finished: self.wipe_commit_data() else: self.save_commit_data() def closeEvent(self, event): self._save_or_wipe_commit_data() qbzr_config = get_qbzr_config() qbzr_config.set_option(self._window_name + "_show_nonversioned", self.show_nonversioned_checkbox.isChecked()) qbzr_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.tree_model.checkable: checked = [] # checked versioned unversioned = [] # checked unversioned (supposed to be added) for ref in self.filelist.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.diff_context) else: msg = "No changes selected to " + dialog_action QtGui.QMessageBox.warning(self, "QBzr - " + gettext("Diff"), gettext(msg), QtGui.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.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() QtCore.QObject.connect(update_window, QtCore.SIGNAL("subprocessFinished(bool)"), self.not_uptodate_info, QtCore.SLOT("setHidden(bool)")) qbzr/lib/commit_data.py0000644000000000000000000001762712175306536015420 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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.iteritems(): if v not in (None, ''): d[k] = v return d def __nonzero__(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 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.iteritems(): 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 bzrlib.plugins.qbzr.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 bzrlib.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.iteritems(): 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') 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() br.lock_write() try: # XXX save should wipe if self._data is empty self._set_new_commit_data(self._filtered_data()) # clear old data self._wipe_old_data() finally: br.unlock() 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() br.lock_write() try: self._set_new_commit_data({}) # clear old data self._wipe_old_data() finally: br.unlock() 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 bzrlib 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') 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 qbzr_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('qbzr_commit_message') if old_data: self.set_data(message=old_data) def _wipe_old_data(self): config = self._get_branch_config() if config.get_user_option('qbzr_commit_message'): config.set_user_option('qbzr_commit_message', '') # in similar way to QBzrCommitData it's possible to implement # class for bzr-gtk. qbzr/lib/compatibility.py0000644000000000000000000000173612175306536016002 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 bzrlib.util.configobj import configobj except ImportError: import configobj qbzr/lib/conditional_dataview.py0000644000000000000000000001176212175306536017320 0ustar rootroot00000000000000# 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 PyQt4 import QtGui from PyQt4.QtCore import Qt, QVariant class QBzrConditionalDataView(QtGui.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 """ QtGui.QFrame.__init__(self, parent) # Build the model & view for the data self._type = type columns = listmode_or_headers if type == 'list': self._view = QtGui.QListView() self._view.setResizeMode(QtGui.QListView.Adjust) self._view.setWrapping(True) if listmode_or_headers: self._view.setViewMode(QtGui.QListView.ListMode) else: self._view.setViewMode(QtGui.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 = QtGui.QTreeView() elif type == 'table': self._view = QtGui.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(QtGui.QAbstractItemView.NoEditTriggers) self._view.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) self._view.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self._view.setModel(self._model) # Build the label self._label_text = label_text if label_text: self._label = QtGui.QLabel() self._update_label_text() # Put them together layout = QtGui.QVBoxLayout() if details: splitter = QtGui.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, QVariant(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, QVariant(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) qbzr/lib/config.py0000644000000000000000000011677712175306536014412 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib.config import ( ensure_config_dir_exists, extract_email_address, ) from bzrlib import cmdline, errors, trace from bzrlib.plugins.qbzr.lib import ui_merge_config from bzrlib.plugins.qbzr.lib.i18n import gettext, N_ from bzrlib.plugins.qbzr.lib.spellcheck import SpellChecker from bzrlib.plugins.qbzr.lib.util import ( BTN_OK, BTN_CANCEL, QBzrDialog, extract_name, get_qbzr_config, get_global_config, get_set_tab_width_chars, ) try: from bzrlib 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(QtGui.QItemDelegate): def drawCheck (self, painter, option, rect, state): style = self.parent().style() radioOption = QtGui.QStyleOptionButton() radioOption.rect = option.rect radioOption.state = option.state if state: radioOption.state = radioOption.state | QtGui.QStyle.State_On style.drawControl(QtGui.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 = QtGui.QTabWidget() generalWidget = QtGui.QWidget() generalVBox = QtGui.QVBoxLayout(generalWidget) generalGrid = QtGui.QGridLayout() self.nameEdit = QtGui.QLineEdit() label = QtGui.QLabel(gettext("&Name:")) label.setBuddy(self.nameEdit) generalGrid.addWidget(label, 0, 0) generalGrid.addWidget(self.nameEdit, 0, 1) self.emailEdit = QtGui.QLineEdit() label = QtGui.QLabel(gettext("E-&mail:")) label.setBuddy(self.emailEdit) generalGrid.addWidget(label, 1, 0) generalGrid.addWidget(self.emailEdit, 1, 1) self.editorEdit = QtGui.QLineEdit() btnEditorBrowse = QtGui.QPushButton(gettext('&Browse...')) self.connect(btnEditorBrowse, QtCore.SIGNAL("clicked()"), self.browseEditor) editorHBox = QtGui.QHBoxLayout() editorHBox.addWidget(self.editorEdit) editorHBox.addWidget(btnEditorBrowse) label = QtGui.QLabel(gettext("&Editor:")) label.setBuddy(self.editorEdit) generalGrid.addWidget(label, 2, 0) generalGrid.addLayout(editorHBox, 2, 1) self.emailClientCombo = QtGui.QComboBox() for name, label in _mail_clients: self.emailClientCombo.addItem(gettext(label), QtCore.QVariant(name)) label = QtGui.QLabel(gettext("E-mail &client:")) label.setBuddy(self.emailClientCombo) generalGrid.addWidget(label, 3, 0) generalGrid.addWidget(self.emailClientCombo, 3, 1) self.tabWidthSpinner = QtGui.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 = QtGui.QLabel(gettext("Tab &Width:")) label.setBuddy(self.tabWidthSpinner) generalGrid.addWidget(label, 4, 0) _hb = QtGui.QHBoxLayout() _hb.addWidget(self.tabWidthSpinner) _hb.addStretch(10) generalGrid.addLayout(_hb, 4, 1) generalVBox.addLayout(generalGrid) generalVBox.addStretch() self.aliasesList = QtGui.QTreeWidget() self.aliasesList.setRootIsDecorated(False) self.aliasesList.setHeaderLabels([gettext("Alias"), gettext("Command")]) addAliasButton = QtGui.QPushButton(gettext("Add")) self.connect(addAliasButton, QtCore.SIGNAL("clicked()"), self.addAlias) removeAliasButton = QtGui.QPushButton(gettext("Remove")) self.connect(removeAliasButton, QtCore.SIGNAL("clicked()"), self.removeAlias) aliasesHBox = QtGui.QHBoxLayout() aliasesHBox.addWidget(addAliasButton) aliasesHBox.addWidget(removeAliasButton) aliasesHBox.addStretch() aliasesWidget = QtGui.QWidget() aliasesVBox = QtGui.QVBoxLayout(aliasesWidget) aliasesVBox.addWidget(self.aliasesList) aliasesVBox.addLayout(aliasesHBox) self.bugTrackersList = QtGui.QTreeWidget() self.bugTrackersList.setRootIsDecorated(False) self.bugTrackersList.setHeaderLabels([gettext("Abbreviation"), gettext("URL")]) addBugTrackerButton = QtGui.QPushButton(gettext("Add")) self.connect(addBugTrackerButton, QtCore.SIGNAL("clicked()"), self.addBugTracker) removeBugTrackerButton = QtGui.QPushButton(gettext("Remove")) self.connect(removeBugTrackerButton, QtCore.SIGNAL("clicked()"), self.removeBugTracker) bugTrackersHBox = QtGui.QHBoxLayout() bugTrackersHBox.addWidget(addBugTrackerButton) bugTrackersHBox.addWidget(removeBugTrackerButton) bugTrackersHBox.addStretch() bugTrackersWidget = QtGui.QWidget() bugTrackersVBox = QtGui.QVBoxLayout(bugTrackersWidget) bugTrackersVBox.addWidget(self.bugTrackersList) bugTrackersVBox.addLayout(bugTrackersHBox) diffWidget = QtGui.QWidget() self.diffShowIntergroupColors = QtGui.QCheckBox(gettext("Show inter-group inserts and deletes in green and red"), diffWidget) label = QtGui.QLabel(gettext("External Diff Apps:")) self.extDiffList = QtGui.QTreeWidget(diffWidget) self.extDiffList.setRootIsDecorated(False) self.extDiffList.setHeaderLabels([gettext("Name"), gettext("Command")]) self.extDiffList.setItemDelegateForColumn(0, QRadioCheckItemDelegate(self.extDiffList)) self.connect(self.extDiffList, QtCore.SIGNAL("itemChanged (QTreeWidgetItem *,int)"), self.extDiffListItemChanged) addExtDiffButton = QtGui.QPushButton(gettext("Add"), diffWidget) self.connect(addExtDiffButton, QtCore.SIGNAL("clicked()"), self.addExtDiff) removeExtDiffButton = QtGui.QPushButton(gettext("Remove"), diffWidget) self.connect(removeExtDiffButton, QtCore.SIGNAL("clicked()"), self.removeExtDiff) extDiffButtonsLayout = QtGui.QHBoxLayout() extDiffButtonsLayout.addWidget(addExtDiffButton) extDiffButtonsLayout.addWidget(removeExtDiffButton) extDiffButtonsLayout.addStretch() diffLayout = QtGui.QVBoxLayout(diffWidget) diffLayout.addWidget(self.diffShowIntergroupColors) diffLayout.addWidget(label) diffLayout.addWidget(self.extDiffList) diffLayout.addLayout(extDiffButtonsLayout) if mergetools is not None: mergeWidget = QtGui.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.connect(self.merge_tools_model, QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"), self.merge_tools_data_changed) self.connect(self.merge_ui.tools.selectionModel(), QtCore.SIGNAL("selectionChanged(QItemSelection,QItemSelection)"), self.merge_tools_selectionChanged) self.connect(self.merge_ui.add, QtCore.SIGNAL("clicked()"), self.merge_tools_add_clicked) self.connect(self.merge_ui.remove, QtCore.SIGNAL("clicked()"), self.merge_tools_remove_clicked) self.connect(self.merge_ui.set_default, QtCore.SIGNAL("clicked()"), self.merge_tools_set_default_clicked) else: mergeWidget = QtGui.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 = QtGui.QVBoxLayout(self) vbox.addWidget(self.tabwidget) vbox.addWidget(buttonbox) self.load() def getGuiTabWidget(self): """ Returns the widget for the GUI tab. """ tabwidget = QtGui.QWidget() grid = QtGui.QGridLayout() vbox = QtGui.QVBoxLayout(tabwidget) vbox.addLayout(grid) vbox.addStretch() self.spellcheck_language_combo = QtGui.QComboBox() languages = sorted(SpellChecker.list_languages()) for name in languages: self.spellcheck_language_combo.addItem(gettext(name), QtCore.QVariant(name)) if not languages: self.spellcheck_language_combo.setEnabled(False) label = QtGui.QLabel(gettext("Spell check &language:")) label.setBuddy(self.spellcheck_language_combo) label.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Minimum) grid.addWidget(label, 0, 0) grid.addWidget(self.spellcheck_language_combo, 0, 1) self.branchsourceBasedirEdit = QtGui.QLineEdit() self.branchsourceBasedirEdit.setToolTip(gettext("This directory will be automatically filled in your branch source input field")) btnBranchsourceBasedirBrowse = QtGui.QPushButton(gettext('Browse...')) self.connect(btnBranchsourceBasedirBrowse, QtCore.SIGNAL("clicked()"), self.browseBranchsourceBasedir) branchsourceBasedirHBox = QtGui.QHBoxLayout() branchsourceBasedirHBox.addWidget(self.branchsourceBasedirEdit) branchsourceBasedirHBox.addWidget(btnBranchsourceBasedirBrowse) label = QtGui.QLabel(gettext("Base directory\nfor &branch sources:")) label.setBuddy(self.branchsourceBasedirEdit) grid.addWidget(label, 1, 0) grid.addLayout(branchsourceBasedirHBox, 1, 1) self.checkoutBasedirEdit = QtGui.QLineEdit() self.checkoutBasedirEdit.setToolTip(gettext("This directory will be automatically filled in your checkout destination input field")) btnCheckoutBasedirBrowse = QtGui.QPushButton(gettext('Browse...')) self.connect(btnCheckoutBasedirBrowse, QtCore.SIGNAL("clicked()"), self.browseCheckoutBasedir) checkoutBasedirHBox = QtGui.QHBoxLayout() checkoutBasedirHBox.addWidget(self.checkoutBasedirEdit) checkoutBasedirHBox.addWidget(btnCheckoutBasedirBrowse) label = QtGui.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_qbzr_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, 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( QtCore.QVariant(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( QtCore.QVariant(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 aliases.items(): item = QtGui.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 parser.get('DEFAULT', {}).items(): m = _bug_tracker_re.match(name) if not m: continue abbreviation = m.group(1) item = QtGui.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 = QtGui.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 extDiffs.items(): create_ext_diff_item(name, command) self.extDiffListIgnore = False # Merge if mergetools is not None: user_merge_tools = config.get_merge_tools() 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 == QtGui.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_qbzr_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 = unicode(self.nameEdit.text()).strip() _email = unicode(self.emailEdit.text()).strip() username = u'' if _name: username = _name if _email: username = (username + ' <%s>' % _email).strip() set_or_delete_option(parser, 'email', username) # Editor editor = unicode(self.editorEdit.text()) set_or_delete_option(parser, 'editor', editor) # E-mail client index = self.emailClientCombo.currentIndex() mail_client = unicode(self.emailClientCombo.itemData(index).toString()) 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 = unicode(self.spellcheck_language_combo.itemData(index).toString()) set_or_delete_option(parser, 'spellcheck_language', spellcheck_language) # Branch source basedir branchsource_basedir = unicode(self.branchsourceBasedirEdit.text()) qconfig.set_option('branchsource_basedir', branchsource_basedir) # Checkout basedir checkout_basedir = unicode(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 = unicode(item.text(0)) command = unicode(item.text(1)) if alias and command: parser['ALIASES'][alias] = command # Bug trackers for name, value in 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 = unicode(item.text(0)) url = unicode(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 = unicode(item.text(0)) command = unicode(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.iteritems(): 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 = unicode(self.nameEdit.text()).strip() _email = unicode(self.emailEdit.text()).strip() if (_name, _email) == ('', ''): if QtGui.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 = QtGui.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 = QtGui.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 = QtGui.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, QtGui.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 = QtGui.QFileDialog.getOpenFileName(self, gettext('Select editor executable'), '/') if filename: self.editorEdit.setText(filename) def browseCheckoutBasedir(self): filename = QtGui.QFileDialog.getExistingDirectory(self, gettext('Select base directory for checkouts'), '/') if filename: self.checkoutBasedirEdit.setText(filename) def browseBranchsourceBasedir(self): filename = QtGui.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 bzrlib.config._auto_user_id, but got removed, so # we have a copy. import sys if sys.platform == 'win32': from bzrlib 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" 'bzr 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 "bzr 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 "bzr whoami" to set it.') try: username = w.pw_name.decode(encoding) except UnicodeError: raise errors.BzrCommandError('Unable to determine your name. ' 'Use "bzr 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): 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 = user.keys() + 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.emit(QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"), self.index(old_row, self.COL_NAME), self.index(old_row, self.COL_NAME)) if new_row is not None: self.emit(QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"), 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 QtCore.QVariant(name) elif index.column() == self.COL_COMMANDLINE: return QtCore.QVariant(cmdline) elif role == QtCore.Qt.EditRole: if index.column() == self.COL_NAME: return QtCore.QVariant(name) elif index.column() == self.COL_COMMANDLINE: return QtCore.QVariant(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 = QtGui.QApplication.palette() return palette.alternateBase() return QtCore.QVariant() 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 = unicode(value.toString()) self._order.insert(index.row(), new_name) self._user[new_name] = cmdline if self._default == name: self._default = new_name self.emit(QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"), index, index) self.sort(self.COL_NAME, QtCore.Qt.AscendingOrder) return True elif index.column() == self.COL_COMMANDLINE: self._user[name] = unicode(value.toString()) self.emit(QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"), index, index) return True elif role == QtCore.Qt.CheckStateRole: if index.column() == self.COL_NAME: 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(MergeToolsTableModel, self).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 QtCore.QVariant(gettext("Name")) elif section == self.COL_COMMANDLINE: if role == QtCore.Qt.DisplayRole: return QtCore.QVariant(gettext("Command Line")) return QtCore.QVariant() def sort(self, column, sortOrder): self.emit(QtCore.SIGNAL("layoutAboutToBeChanged()")) 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.emit(QtCore.SIGNAL("layoutChanged()")) qbzr/lib/conflicts.py0000644000000000000000000003174012175306536015113 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib.config import GlobalConfig from bzrlib.conflicts import resolve from bzrlib.workingtree import WorkingTree from bzrlib.plugins.qbzr.lib.i18n import gettext, N_, ngettext from bzrlib.plugins.qbzr.lib.util import ( BTN_CLOSE, BTN_REFRESH, QBzrWindow, get_qbzr_config, StandardButton, ) try: from bzrlib.cmdline import split as cmdline_split except ImportError: from bzrlib.commands import shlex_split_unicode as cmdline_split try: from bzrlib import mergetools except ImportError: mergetools = None class ConflictsWindow(QBzrWindow): 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 = QtGui.QVBoxLayout(self.centralwidget) self.conflicts_list = QtGui.QTreeWidget(self) self.conflicts_list.setRootIsDecorated(False) self.conflicts_list.setUniformRowHeights(True) self.conflicts_list.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) self.conflicts_list.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.conflicts_list.setHeaderLabels([ gettext("File"), gettext("Conflict"), ]) self.connect( self.conflicts_list.selectionModel(), QtCore.SIGNAL("selectionChanged(QItemSelection, QItemSelection)"), self.update_merge_tool_ui) self.connect( self.conflicts_list, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), self.show_context_menu) self.connect( self.conflicts_list, QtCore.SIGNAL("itemDoubleClicked(QTreeWidgetItem *, int)"), 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.setResizeMode(0, QtGui.QHeaderView.Stretch) header.setResizeMode(1, QtGui.QHeaderView.ResizeToContents) vbox.addWidget(self.conflicts_list) hbox = QtGui.QHBoxLayout() self.merge_tools_combo = QtGui.QComboBox(self) self.merge_tools_combo.setEditable(False) self.connect(self.merge_tools_combo, QtCore.SIGNAL("currentIndexChanged(int)"), self.update_merge_tool_ui) self.merge_tool_error = QtGui.QLabel('', self) self.program_launch_button = QtGui.QPushButton(gettext("&Launch..."), self) self.program_launch_button.setEnabled(False) self.connect( self.program_launch_button, QtCore.SIGNAL("clicked()"), self.launch_merge_tool) self.program_label = QtGui.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, QtGui.QDialogButtonBox.ActionRole) self.connect(refresh, QtCore.SIGNAL("clicked()"), self.refresh) autobutton = QtGui.QPushButton(gettext('Auto-resolve'), self.centralwidget) self.connect(autobutton, QtCore.SIGNAL("clicked(bool)"), self.auto_resolve) hbox = QtGui.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 = config.get_merge_tools().keys() # get predefined merge tools defined_tools += 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 = QtGui.QMenu(self.conflicts_list) self.merge_action = QtGui.QAction(gettext("&Merge conflict"), self.context_menu) self.connect(self.merge_action, QtCore.SIGNAL("triggered(bool)"), 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 = QtGui.QTreeWidgetItem() item.setText(0, conflict.path) item.setText(1, gettext(conflict.typestring)) item.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(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, QtCore.QVariant(conflict.typestring)) items.append(item) if len(items) == 0 and self.conflicts_list.topLevelItemCount() > 0: self.emit(QtCore.SIGNAL("allResolved(bool)"), True) self.conflicts_list.clear() self.conflicts_list.addTopLevelItems(items) def auto_resolve(self): while self.wt is None: QtGui.QApplication.processEvents() un_resolved, resolved = self.wt.auto_resolve() if len(un_resolved) > 0: n = len(resolved) QtGui.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: QtGui.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(unicode(self.merge_tools_combo.currentText())) file_id = str(items[0].data(0, QtCore.Qt.UserRole).toString()) if not file_id: # bug https://bugs.launchpad.net/qbzr/+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) self.connect(process, QtCore.SIGNAL("error(QProcess::ProcessError)"), qprocess_error) self.connect(process, QtCore.SIGNAL("finished(int,QProcess::ExitStatus)"), 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 QtGui.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(unicode(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).toString() != "text conflict": enabled = False config = GlobalConfig() tool = unicode(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: QtGui.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") qbzr/lib/decorators.py0000644000000000000000000000710612175306536015273 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 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 bzrlib.trace import mutter a = ','.join(repr(i) for i in args) b = ','.join('%s=%r' % (i,j) for (i,j) in kwargs.iteritems()) if a and b: a = a + ',' + b else: a = a or b func_name = unbound.func_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(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 qbzr/lib/diff.py0000644000000000000000000005610712175306536014043 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib.errors import FileTimestampUnavailable, NoSuchId, ExecutableMissing from bzrlib.plugins.qbzr.lib.diff_arg import * # import DiffArgProvider classes from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.subprocess import SimpleSubProcessDialog from bzrlib.plugins.qbzr.lib.util import ( get_qbzr_config, is_binary_content, ) from bzrlib.lazy_import import lazy_import lazy_import(globals(), ''' import errno import re import time import sys import os import glob from bzrlib.patiencediff import PatienceSequenceMatcher as SequenceMatcher from bzrlib.plugins.qbzr.lib.i18n import gettext, ngettext, N_ from bzrlib import trace, osutils, cmdline from bzrlib.workingtree import WorkingTree from bzrlib.trace import mutter ''') from bzrlib.diff import DiffFromTool, DiffPath subprocess = __import__('subprocess', {}, {}, []) qconfig = get_qbzr_config() default_diff = qconfig.get_option("default_diff") if default_diff is None: default_diff = "" ext_diffs = {gettext("Builtin Diff"):""} for name, command in 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 bzrlib.plugins.qbzr.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 cleanup = [] try: args = arg_provider.get_diff_window_args( QtGui.QApplication.processEvents, cleanup.append ) 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() finally: while cleanup: cleanup.pop()() 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(QtGui.QMenu): def __init__ (self, parent=None, include_builtin=True, set_default=True): QtGui.QMenu.__init__(self, gettext("Show &differences"), parent) for name, command in ext_diffs.items(): if command == "" and include_builtin or not command == "": action = QtGui.QAction(name, self) action.setData(QtCore.QVariant (command)) if command == default_diff and set_default: self.setDefaultAction(action) self.addAction(action) self.connect(self, QtCore.SIGNAL("triggered(QAction *)"), self.triggered) def triggered(self, action): ext_diff = unicode(action.data().toString()) self.emit(QtCore.SIGNAL("triggered(QString)"), QtCore.QString(ext_diff)) class DiffButtons(QtGui.QWidget): def __init__(self, parent = None): QtGui.QWidget.__init__(self, parent) layout = QtGui.QHBoxLayout(self) self.default_button = QtGui.QPushButton(gettext('Diff'), self) layout.addWidget(self.default_button) layout.setSpacing(0) self.connect(self.default_button, QtCore.SIGNAL("clicked()"), self.triggered) if has_ext_diff(): self.menu = ExtDiffMenu(self) self.menu_button = QtGui.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( QtGui.QStyle.PM_MenuButtonIndicator) + self.menu_button.style().pixelMetric( QtGui.QStyle.PM_ButtonMargin) ) self.connect(self.menu, QtCore.SIGNAL("triggered(QString)"), self.triggered) def triggered(self, ext_diff=None): if ext_diff is None: ext_diff = QtCore.QString(default_diff) self.emit(QtCore.SIGNAL("triggered(QString)"), ext_diff) def get_file_lines_from_tree(tree, file_id): try: return tree.get_file_lines(file_id) except AttributeError: return tree.get_file(file_id).readlines() 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): try: cleanup = [] if lock_trees: for t in trees: cleanup.append(t.lock_read().unlock) 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 (file_id, paths, changed_content, versioned, parent, name, kind, executable) in sorted(changes, key=changes_key): # 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, file_id, paths, changed_content, versioned, parent, name, kind, executable, filter = filter) if not di: continue yield di finally: while cleanup: cleanup.pop()() @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(file_id, paths[ix]) except OSError, e: if not renamed or e.errno != errno.ENOENT: raise # If we get ENOENT error then probably we trigger # bug #251532 in bzrlib. 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 for ix, tree in enumerate(self.trees): content = () if self.versioned[ix] and self.kind[ix] == 'file': content = get_file_lines_from_tree(tree, self.file_id) lines.append(content) binary = binary or is_binary_content(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): left, right = lines if ignore_whitespace: re_whitespaces = re.compile("\s+") left = (re_whitespaces.sub(" ", line) for line in left) right = (re_whitespaces.sub(" ", 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, 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(), 'qbzr']) if not os.path.isdir(parent): os.mkdir(parent) self._root = osutils.mkdtemp(prefix='qbzr/bzr-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() 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 self.prefixes.has_key(key): 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 '@' 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, file_id, tree, prefix, relpath, force_temp=False, allow_write=False): 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, file_id, tree, prefix, relpath, force_temp, allow_write) def _prepare_files(self, file_id, old_path, new_path, force_temp=False, allow_write_new=False): old_disk_path = self._write_file(file_id, self.old_tree, self.old_prefix, old_path, force_temp) new_disk_path = self._write_file(file_id, self.new_tree, self.new_prefix, new_path, force_temp, allow_write=allow_write_new) 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, 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(file_id) old_path = self.old_tree.id2path(file_id) old_kind = self.old_tree.kind(file_id) except NoSuchId: return DiffPath.CANNOT_DIFF return DiffFromTool.diff(self, file_id, 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. """ cleanup = [] try: if lock_trees: cleanup.append(self._differ.new_tree.lock_read().unlock) cleanup.append(self._differ.old_tree.lock_read().unlock) for file_id in file_ids: self._differ.diff(file_id) time.sleep(interval * 0.001) finally: while cleanup: cleanup.pop()() 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 cleanup = [] try: # Sometimes, we must lock tree before calling tree.kind() if lock_trees: cleanup.append(new_tree.lock_read().unlock) cleanup.append(old_tree.lock_read().unlock) 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(id) != '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) finally: while cleanup: cleanup.pop()() 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) qbzr/lib/diff_arg.py0000644000000000000000000001523012175306536014664 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 bzrlib.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, add_cleanup): """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(): self.new_tree.lock_read() try: self.specific_files = [self.new_tree.id2path(id) \ for id in self.specific_file_ids] finally: self.new_tree.unlock() def get_diff_window_args(self, processEvents, add_cleanup): 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 bzrlib import urlutils from bzrlib import errors args = [] revspec = self.get_revspec() if revspec: args.append(revspec) from bzrlib.workingtree import WorkingTree 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, add_cleanup): 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 qbzr/lib/diffview.py0000644000000000000000000011426212175306536014733 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtGui, QtCore import re from bzrlib import timestamp from bzrlib.patiencediff import PatienceSequenceMatcher as SequenceMatcher from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.util import ( file_extension, format_timestamp, get_qbzr_config, get_monospace_font, get_tab_width_pixels, ) from bzrlib.trace import mutter from bzrlib.plugins.qbzr.lib.syntaxhighlighter import ( CachedTTypeFormater, split_tokens_at_lines, ) from bzrlib.plugins.qbzr.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_qbzr_config() component_dict = {0:'fill', 1:'bound'} for key in colors.iterkeys(): for comp in [0,1]: color = None try: color = config.get_color(key + '_' + component_dict[comp], 'QDIFF COLORS') except ValueError, msg: #error handling. mutter(str(msg)) if None != color: colors[key][comp] = color #Get a user-defined replacement text background try: new_interline_bg = config.get_color('interline_changes_background', 'QDIFF COLORS') if None != new_interline_bg: interline_changes_background = new_interline_bg except ValueError, msg: mutter(str(msg)) brushes = {} for kind, cols in colors.items(): brushes[kind] = (QtGui.QBrush(cols[0]), QtGui.QBrush(cols[1])) class DiffSourceView(QtGui.QTextBrowser): def __init__(self, parent=None): QtGui.QTextBrowser.__init__(self, parent) self.setLineWrapMode(QtGui.QTextEdit.NoWrap) self.clear() self.scrollbar = None def clear(self): self.changes = [] self.infoBlocks = [] def resizeEvent(self, event): QtGui.QTextBrowser.resizeEvent(self, event) self.emit(QtCore.SIGNAL("resized()")) 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 = 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 -= y 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 QtGui.QTextBrowser.paintEvent(self, event) def wheelEvent(self, event): if event.orientation() == QtCore.Qt.Vertical and self.scrollbar: self.scrollbar.wheelEvent(event) else: QtGui.QTextBrowser.wheelEvent(self, event) class DiffViewHandle(QtGui.QSplitterHandle): def __init__(self, parent=None): QtGui.QSplitterHandle.__init__(self, QtCore.Qt.Horizontal, parent) self.scrollbar = None self.view = parent self.clear() def clear(self): self.changes = [] self.infoBlocks = [] def paintEvent(self, event): painter = QtGui.QPainter(self) painter.setClipRect(event.rect()) frame = QtGui.QApplication.style().pixelMetric(QtGui.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) C = 16 # Curve factor. 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(C, ly, w - C, ry, w, ry) else: line.moveTo(w, ry) line.cubicTo(w - C, ry, C, 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): if event.orientation() == QtCore.Qt.Vertical: self.view.scrollbar.wheelEvent(event) else: QtGui.QSplitterHandle.wheelEvent(self, event) class SidebySideDiffView(QtGui.QFrame): def __init__(self, parent=None): QtGui.QFrame.__init__(self, parent) hbox = QtGui.QHBoxLayout(self) hbox.setMargin(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(QtGui.QScrollBar): def __init__(self, handle, browsers): QtGui.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]): self.connect(scbar, QtCore.SIGNAL("valueChanged(int)"), lambda value, target=i : self.scrolled(target)) self.connect(browsers[0], QtCore.SIGNAL("resized()"), 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, 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, position): """ Scroll to specified position. target: 0 is self, 1 is left browser, 2 is right browser """ basis_y = 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) else: change_idx, offset = position[1:] if change_idx < 0: start = 0 else: start = changes[change_idx][1] scbar.setValue(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(QtGui.QSplitter): """Widget to show differences in side-by-side format.""" def __init__(self, parent=None): QtGui.QSplitter.__init__(self, QtCore.Qt.Horizontal, parent) self.setHandleWidth(30) self.complete = False titleFont = QtGui.QFont(self.font()) titleFont.setPointSize(titleFont.pointSize() * 140 / 100) titleFont.setBold(True) self.monospacedFont = get_monospace_font() metadataFont = QtGui.QFont(self.font()) metadataFont.setPointSize(titleFont.pointSize() * 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) format = QtGui.QTextCharFormat() format.setAnchorNames(["top"]) cursor.insertText("", format) self.scrollbar = SidebySideDiffViewScrollBar(self.handle(1), self.browsers) self.ignoreUpdate = False self.connect(self.browsers[0].horizontalScrollBar(), QtCore.SIGNAL("valueChanged(int)"), self.syncHorizontalSlider1) self.connect(self.browsers[1].horizontalScrollBar(), QtCore.SIGNAL("valueChanged(int)"), 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_qbzr_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: format = self.ttype_formater.format(ttype) modifyFormatForTag(format, "equal") cursor.insertText(value, 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 (format, tag): if tag == "replace": format.setBackground(interline_changes_background) elif tag == "equal": format.setBackground(self.background) elif self.show_intergroup_colors: format.setBackground(brushes[tag][0]) else: 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: format = self.ttype_formater.format(ttype) modifyFormatForTag(format, tag) t = value[0:n] cursor.insertText(t, 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(): format = QtGui.QTextCharFormat() format.setFont(self.monospacedFont) modifyFormatForTag(format, tag) cursors[0].insertText("".join(texts[0][i0:i1]),format) cursors[1].insertText("".join(texts[1][j0:j1]),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), QtCore.QVariant(image)) max_height = max(heights) for i, cursor in enumerate(self.cursors): format = QtGui.QTextBlockFormat() format.setBottomMargin((max_height - heights[i])/2) format.setTopMargin((max_height - heights[i])/2) cursor.insertBlock(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: format = QtGui.QTextBlockFormat() format.setBottomMargin(maxy-cursor.block().layout().position().y()) cursor.setBlockFormat(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(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(QtGui.QTextBrowser): """Widget to show differences in unidiff format.""" def __init__(self, parent=None): QtGui.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) format = QtGui.QTextCharFormat() format.setAnchorNames(["top"]) self.cursor.insertText("", 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): QtGui.QTextBrowser.clear(self) self.reset_guidebar_data() def reset_guidebar_data(self): self.guidebar_data = dict(title=[], delete=[], insert=[], replace=[]) qbzr/lib/diffwindow.py0000644000000000000000000005060512175306536015270 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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. import errno import re import time from PyQt4 import QtCore, QtGui from bzrlib.errors import NoSuchRevision, PathsNotVersionedError from bzrlib.mutabletree import MutableTree from bzrlib.patiencediff import PatienceSequenceMatcher as SequenceMatcher from bzrlib.revisiontree import RevisionTree from bzrlib.transform import _PreviewTree from bzrlib.workingtree import WorkingTree from bzrlib.workingtree_4 import DirStateRevisionTree from bzrlib import trace from bzrlib import cleanup from bzrlib.plugins.qbzr.lib.diffview import ( SidebySideDiffView, SimpleDiffView, ) from bzrlib.plugins.qbzr.lib.diff import ( show_diff, has_ext_diff, ExtDiffMenu, DiffItem, ExtDiffContext, ) from bzrlib.plugins.qbzr.lib.i18n import gettext, ngettext, N_ from bzrlib.plugins.qbzr.lib.util import ( FilterOptions, QBzrWindow, ToolBarThrobberWidget, get_icon, get_set_encoding, get_set_tab_width_chars, get_tab_width_pixels, is_binary_content, run_in_loading_queue, runs_in_loading_queue, show_shortcut_hint, ) from bzrlib.plugins.qbzr.lib.widgets.toolbars import FindToolbar from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget from bzrlib.plugins.qbzr.lib.trace import reports_exception from bzrlib.plugins.qbzr.lib.encoding_selector import EncodingMenuSelector from bzrlib.plugins.qbzr.lib.widgets.tab_width_selector import TabWidthMenuSelector from bzrlib.plugins.qbzr.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 elif isinstance(tree, _PreviewTree): return gettext('Merge Preview') # XXX I don't know what other cases we need to handle return 'Unknown tree' class DiffWindow(QBzrWindow): 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 = QtGui.QStackedWidget(self.centralwidget) self.stack.addWidget(self.diffview) self.stack.addWidget(self.sdiffview) vbox = QtGui.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) 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)) 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(QtGui.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(QtGui.QToolButton.InstantPopup) widget.setShortcut("Alt+V") show_shortcut_hint(widget) spacer = QtGui.QWidget() spacer.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) toolbar.addWidget(spacer) self.throbber = ToolBarThrobberWidget(self) toolbar.addWidget(self.throbber) return toolbar def create_find_action(self): action = QtGui.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 = QtGui.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); self.connect(action, QtCore.SIGNAL("toggled (bool)"), self.click_toggle_view_mode) return action def create_refresh_action(self, allow_refresh=True): action = QtGui.QAction(get_icon("view-refresh"), gettext("&Refresh"), self) action.setShortcut("Ctrl+R") show_shortcut_hint(action) self.connect(action, QtCore.SIGNAL("triggered (bool)"), self.click_refresh) action.setEnabled(allow_refresh) return action def create_ext_diff_action(self): action = QtGui.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) self.connect(ext_diff_menu, QtCore.SIGNAL("triggered(QString)"), self.ext_diff_triggered) return action def create_view_menu(self): show_view_menu = QtGui.QAction(get_icon("document-properties"), gettext("&View Options"), self) view_menu = QtGui.QMenu(gettext('View Options'), self) show_view_menu.setMenu(view_menu) view_complete = QtGui.QAction(gettext("&Complete"), self) view_complete.setCheckable(True) self.connect(view_complete, QtCore.SIGNAL("toggled (bool)"), self.click_complete) view_menu.addAction(view_complete) self.ignore_whitespace_action = self.create_ignore_ws_action() view_menu.addAction(self.ignore_whitespace_action) 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) 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) 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) 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) 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 = QtGui.QAction(gettext("&Ignore whitespace changes"), self) action.setCheckable(True) action.setChecked(self.ignore_whitespace); self.connect_later(action, QtCore.SIGNAL("toggled (bool)"), 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. """ op = cleanup.OperationWithCleanups(self._initial_load) self.throbber.show() op.add_cleanup(self.throbber.hide) op.run() def _initial_load(self, op): args = self.arg_provider.get_diff_window_args(self.processEvents, op.add_cleanup) 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) self.ignore_whitespace_action.setChecked(self.ignore_whitespace) 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 is 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): lines = di.lines 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)) data = [''.join(l) for l 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, e: QtGui.QMessageBox.critical(self, gettext('Diff'), gettext(u'File %s is not versioned.\n' 'Operation aborted.') % e.paths_as_string, gettext('&Close')) self.close() if no_changes: QtGui.QMessageBox.information(self, gettext('Diff'), gettext('No changes found.'), gettext('&OK')) for t in self.views[0].browsers + (self.views[1],): t.emit(QtCore.SIGNAL("documentChangeFinished()")) 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) qbzr/lib/encoding_selector.py0000644000000000000000000001675112175306536016622 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtGui, QtCore from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.util import is_valid_encoding from bzrlib.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): self._data.extend(other) 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 = 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): QtGui.QMessageBox.critical(self, gettext("Wrong encoding"), gettext('Encoding "%s" is invalid or not supported.') % unicode(encoding)) self.setEncoding(self._encoding) def getEncoding(self): return self._encoding def setEncoding(self, encoding): if is_valid_encoding(encoding): self._encoding = encoding self._setEncoding(encoding) def _setEncoding(self, encoding): pass encoding = property(getEncoding, setEncoding) class EncodingSelector(QtGui.QWidget, BaseEncodingSelector): """Widget to control encoding of text.""" def __init__(self, initial_encoding=None, label_text=None, onChanged=None, *args): """Create widget: label + combobox. @param initial_encoding: initially selected encoding (default: utf-8). @param label_text: text for label (default: "Encoding:"). @param onChanged: callback to processing encoding change. @param args: additional arguments to initialize QWidget. """ QtGui.QWidget.__init__(self, *args) self.init_encodings(initial_encoding) self.onChanged = onChanged if onChanged is None: self.onChanged = lambda encoding: None layout = QtGui.QHBoxLayout() if label_text is None: label_text = gettext("Encoding:") self._label = QtGui.QLabel(label_text) layout.addWidget(self._label) self.chooser = QtGui.QComboBox() self.chooser.addItems(self.encodings) self.chooser.setEditable(True) self.chooser.setEditText(QtCore.QString(self.encoding)) self.connect(self.chooser, QtCore.SIGNAL("currentIndexChanged(QString)"), 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) QtGui.QComboBox.focusOutEvent(self.chooser, ev) def _setEncoding(self, encoding): self.chooser.setEditText(QtCore.QString(encoding)) def getLabel(self): return unicode(self._label.text()) def setLabel(self, new_label): self._label.setText(new_label) label = property(getLabel, setLabel) class EncodingMenuSelector(QtGui.QMenu, BaseEncodingSelector): """Menu to control encoding of text.""" def __init__(self, initial_encoding=None, label_text=None, onChanged=None, *args): """Create widget: label + combobox. @param initial_encoding: initially selected encoding (default: utf-8). @param label_text: text for label (default: "Encoding:"). @param onChanged: callback to processing encoding change. @param args: additional arguments to initialize QWidget. """ QtGui.QMenu.__init__(self, *args) self.init_encodings(initial_encoding) self.onChanged = onChanged if onChanged is None: self.onChanged = lambda encoding: None self.setTitle(label_text) self.action_group = QtGui.QActionGroup(self) self.encoding_actions = {} for encoding in self.encodings: action = QtGui.QAction(encoding, self.action_group) action.setCheckable(True) action.setData(QtCore.QVariant(encoding)) self.addAction(action) self.encoding_actions[encoding] = action self._setEncoding(self.encoding) self.connect(self, QtCore.SIGNAL("triggered(QAction *)"), self.triggered) def triggered(self, action): encoding = unicode(action.data().toString()) self._encodingChanged(encoding) def _setEncoding(self, encoding): if encoding in self.encoding_actions: self.encoding_actions[encoding].setChecked(True) def getLabel(self): return unicode(self.title()) def setLabel(self, new_label): self.setTitle(new_label) label = property(getLabel, setLabel) # 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() qbzr/lib/export.py0000644000000000000000000003545012175306536014452 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib import ( bzrdir, errors, export, osutils, ) from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.subprocess import SubProcessDialog from bzrlib.plugins.qbzr.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 = QtGui.QHBoxLayout() branch_info = gettext("Branch: %s") % url_for_display(branch.base) info_label = QtGui.QLabel(branch_info) info_hbox.addWidget(info_label) # Create the export group box gbExportDestination = QtGui.QGroupBox(gettext("Export"), self) vboxExportDestination = QtGui.QVBoxLayout(gbExportDestination) vboxExportDestination.addStrut(0) # Build export as archive section exportarch_radio = QtGui.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 = QtGui.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 = QtGui.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 QtCore.QObject.connect(self, QtCore.SIGNAL("disableUi(bool)"), gbExportDestination, QtCore.SLOT("setDisabled(bool)")) QtCore.QObject.connect(self, QtCore.SIGNAL("disableUi(bool)"), gbExportOptions, QtCore.SLOT("setDisabled(bool)")) # 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. QtCore.QObject.connect(self.format_combo, QtCore.SIGNAL("currentIndexChanged(int)"), self.format_changed) def _build_archive_type_layout(self): format_label = QtGui.QLabel(gettext("Archive type:")) format_combo = QtGui.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 = QtGui.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 = QtGui.QLabel(gettext("Root directory name:")) folder_edit = QtGui.QLineEdit() self.folder_edit = folder_edit folder_hbox = QtGui.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 = QtGui.QLabel(gettext("Location:")) locationfil_edit = QtGui.QLineEdit() self.locationfil_edit = locationfil_edit browsefil_button = QtGui.QPushButton(gettext("Browse")) QtCore.QObject.connect(browsefil_button, QtCore.SIGNAL("clicked(bool)"), self.browsefil_clicked) locationfil_hbox = QtGui.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 = QtGui.QLineEdit() self.locationdir_edit = locationdir_edit browsedir_button = QtGui.QPushButton(gettext("Browse")) QtCore.QObject.connect(browsedir_button, QtCore.SIGNAL("clicked(bool)"), self.browsedir_clicked) locationdir_hbox = QtGui.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 = QtGui.QGridLayout() revisions_label = QtGui.QLabel(gettext("Revision:")) revisions_tip = QtGui.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 = QtGui.QRadioButton("Other") self.revisions_other = revisions_other revisions_edit = QtGui.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 = QtGui.QGridLayout() format_canonical = QtGui.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 = QtGui.QGroupBox(gettext("Options"), self) vbxExportOptions = QtGui.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 = bzrdir.BzrDir.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.iteritems(): for i in v: if path.endswith(i): return k return None def update_root_n_format(self): path = unicode(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 = QtGui.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 = QtGui.QFileDialog.getSaveFileName(self, ("Select save location")) 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 = unicode(self.locationfil_edit.text()) if not location: self.operation_blocked(gettext("Export location is invalid")) return False elif self.exportdir_radio.isChecked(): location = unicode(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 = unicode(self.locationfil_edit.text()) format = self.get_current_format() root = unicode(self.folder_edit.text()) if root: args.append("--root=%s" % root) else: args.append("--root=") else: location = unicode(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 = unicode(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) qbzr/lib/extra/0000755000000000000000000000000012175306536013673 5ustar rootroot00000000000000qbzr/lib/fake_branch.py0000644000000000000000000000225112175306536015345 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 __nonzero__(self): # this method makes FakeBranch boolean False # so we shouldn't check (branch is not None) but (not branch) return False qbzr/lib/getnew.py0000644000000000000000000001527412175306536014424 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.subprocess import SubProcessDialog from bzrlib.plugins.qbzr.lib.ui_new_tree import Ui_NewWorkingTreeForm from bzrlib.plugins.qbzr.lib.util import ( save_pull_location, fill_pull_combo, hookup_directory_picker, DIRECTORYPICKER_SOURCE, DIRECTORYPICKER_TARGET, get_qbzr_config, ) class GetNewWorkingTreeWindow(SubProcessDialog): NAME = "new_tree" def __init__(self, to_location, ui_mode=True, parent=None): config = get_qbzr_config() checkout_basedir = config.get_option("checkout_basedir") branchsource_basedir = config.get_option("branchsource_basedir") if not to_location: to_location = checkout_basedir or u'.' 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.connect(self.ui.from_location, QtCore.SIGNAL("editTextChanged(const QString &)"), self.from_location_changed) self.connect(self.ui.to_location, QtCore.SIGNAL("textChanged(const QString &)"), 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.disconnect(self.ui.from_location, QtCore.SIGNAL("editTextChanged(const QString &)"), self.from_location_changed) self.disconnect(self.ui.to_location, QtCore.SIGNAL("textChanged(const QString &)"), self.to_location_changed) def from_location_changed(self, new_text): new_val = self.to_location tail = re.split("[:$#\\\\/]", unicode(new_text))[-1] try: projectname = re.split("[:$#\\\\/]", unicode(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 unicode(self.ui.from_location.currentText()) def _get_to_location(self): return unicode(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='+unicode(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) qbzr/lib/getupdates.py0000644000000000000000000001373112175306536015274 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.subprocess import SubProcessDialog from bzrlib.plugins.qbzr.lib.ui_update_branch import Ui_UpdateBranchForm from bzrlib.plugins.qbzr.lib.ui_update_checkout import Ui_UpdateCheckoutForm from bzrlib.plugins.qbzr.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 unicode(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, u'', 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(unicode(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 unicode(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) qbzr/lib/help.py0000644000000000000000000001462012175306536014055 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.util import QBzrWindow from bzrlib.help import HelpIndices from bzrlib.errors import 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=QtGui.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 = QtGui.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 QtGui.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 qbzr/lib/html_log.py0000644000000000000000000000544512175306536014737 0ustar rootroot00000000000000# 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 cgi import escape import codecs from cStringIO import StringIO from bzrlib 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() 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) qbzr/lib/i18n.py0000644000000000000000000000626412175306536013711 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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.ugettext(s) def ngettext(s, p, n): return _translation.ungettext(s, p, n) def N_(s): return s def install(): global _translation if not os.environ.get('LANGUAGE'): from bzrlib import config lang = config.GlobalConfig().get_user_option('language') if lang: os.environ['LANGUAGE'] = lang if sys.platform == 'win32': _check_win32_locale() _translation = _gettext.translation('qbzr', localedir=_get_locale_dir(), fallback=True) 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") qbzr/lib/ignore.py0000644000000000000000000002264212175306536014413 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib.globbing import Globster from bzrlib.plugins.qbzr.lib.i18n import gettext, N_, ngettext from bzrlib.plugins.qbzr.lib.subprocess import SubProcessDialog from bzrlib.plugins.qbzr.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 = QtGui.QGroupBox(gettext("Unknown Files"), self) vbox = QtGui.QVBoxLayout(groupbox) self.unknowns_list = QtGui.QTreeWidget(groupbox) self.unknowns_list.setRootIsDecorated(False) self.unknowns_list.setUniformRowHeights(True) self.unknowns_list.setSelectionBehavior(QtGui.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.connect(self.unknowns_list, QtCore.SIGNAL("itemClicked(QTreeWidgetItem*, int)"), self.item_clicked) self.no_action = QtGui.QRadioButton(gettext('No action'), groupbox) self.no_action.setChecked(True) self.connect(self.no_action, QtCore.SIGNAL('clicked(bool)'), self.select_no_action) self.by_extension = QtGui.QRadioButton(gettext('Ignore all files with this extension'), groupbox) self.connect(self.by_extension, QtCore.SIGNAL('clicked(bool)'), self.select_by_extension) hbox = QtGui.QHBoxLayout() hbox.insertSpacing(0, 20) self.case_insensitive = QtGui.QCheckBox(gettext('Case-insensitive pattern'), groupbox) self.connect(self.case_insensitive, QtCore.SIGNAL('clicked(bool)'), self.select_case_insensitive) hbox.addWidget(self.case_insensitive) self.by_basename = QtGui.QRadioButton(gettext('Ignore by basename'), groupbox) self.connect(self.by_basename, QtCore.SIGNAL('clicked(bool)'), self.select_by_basename) self.by_fullname = QtGui.QRadioButton(gettext('Ignore by fullname'), groupbox) self.connect(self.by_fullname, QtCore.SIGNAL('clicked(bool)'), 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 = QtGui.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 = QtGui.QTreeWidgetItem() item.setText(0, i) item.setText(1, file_extension(i)) item.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(i)) item.setData(2, QtCore.Qt.UserRole, QtCore.QVariant(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 unicode(item.data(0, QtCore.Qt.UserRole).toString()) def _action_from_item(self, item): return str(item.data(2, QtCore.Qt.UserRole).toString()) 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.iteritems(): 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, QtCore.QVariant(action)) def _set_pattern_action_for_item(self, item, pattern, action): item.setText(2, pattern) item.setData(2, QtCore.Qt.UserRole, QtCore.QVariant(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.iteritems(): action = self._action_from_item(item) if action != ACTION_NONE: pattern = self._pattern_for_action(filename, action) patterns.add(pattern) return sorted(list(patterns)) qbzr/lib/info.py0000644000000000000000000000465112175306536014063 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 bzrlib import bzrdir, osutils from bzrlib.info import show_bzrdir_info from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.ui_info import Ui_InfoForm from bzrlib.plugins.qbzr.lib.util import ( BTN_CLOSE, QBzrWindow, url_for_display, ) import StringIO 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 = StringIO.StringIO() detailed = StringIO.StringIO() a_bzrdir = bzrdir.BzrDir.open_containing(location)[0] show_bzrdir_info(a_bzrdir, 0, basic) show_bzrdir_info(a_bzrdir, 2, detailed) self.ui.basic_info.setText(basic.getvalue()) self.ui.detailed_info.setText(detailed.getvalue()) basic.close() detailed.close() qbzr/lib/init.py0000644000000000000000000001142612175306536014071 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore import os from bzrlib.commands import get_cmd_object from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.subprocess import SubProcessDialog from bzrlib.plugins.qbzr.lib.ui_init import Ui_InitForm from bzrlib.plugins.qbzr.lib.util import ( hookup_directory_picker, DIRECTORYPICKER_TARGET, ) class QBzrInitWindow(SubProcessDialog): def __init__(self, localdir=u".", 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 unicode(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).toString() 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 = QtCore.QVariant(help or '') combo.addItem(name, user_data) if name == default: default_index = combo.count() - 1 if desc_widget is not None: combo.parentWidget().connect(combo, QtCore.SIGNAL("currentIndexChanged(int)"), index_changed) combo.setCurrentIndex(default_index) qbzr/lib/lazycachedrevloader.py0000644000000000000000000001102212175306536017131 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 from time import clock from PyQt4 import QtCore from bzrlib.transport.local import LocalTransport from bzrlib.repository import Repository from bzrlib.remote import RemoteRepository from bzrlib.plugins.qbzr.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 = clock() 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.bzrdir.transport, LocalTransport) if repo_is_local: batch_size = local_batch_size else: batch_size = remote_batch_size if revids: repo.lock_read() try: if not repo_is_local: update_ui() for offset in range(0, len(revids), batch_size): running_time = clock() - 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 finally: repo.unlock() 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() qbzr/lib/log.py0000644000000000000000000011114712175306536013710 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib.revision import CURRENT_REVISION from bzrlib.plugins.qbzr.lib.util import ( BTN_CLOSE, BTN_REFRESH, QBzrWindow, ThrobberWidget, StandardButton, url_for_display, runs_in_loading_queue, get_set_encoding, ) from bzrlib.plugins.qbzr.lib.trace import reports_exception, SUB_LOAD_METHOD from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget from bzrlib.plugins.qbzr.lib.loggraphviz import GhostRevisionError from bzrlib.lazy_import import lazy_import lazy_import(globals(), ''' import re from bzrlib import errors from bzrlib import osutils from bzrlib.bzrdir import BzrDir from bzrlib.urlutils import determine_relative_path, join, split from bzrlib.plugins.qbzr.lib.logwidget import LogList from bzrlib.plugins.qbzr.lib import logmodel from bzrlib.plugins.qbzr.lib.loggraphviz import BranchInfo from bzrlib.plugins.qbzr.lib.diff import ( has_ext_diff, ExtDiffMenu, DiffButtons, ) from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.revisionmessagebrowser import LogListRevisionMessageBrowser from bzrlib.plugins.qbzr.lib.cat import QBzrCatWindow from bzrlib.plugins.qbzr.lib.annotate import AnnotateWindow ''') PathRole = QtCore.Qt.UserRole + 1 file_idRole = QtCore.Qt.UserRole + 2 AliveRole = QtCore.Qt.UserRole + 3 class Compleater(QtGui.QCompleter): def splitPath (self, path): return QtCore.QStringList([path.split(" ")[-1]]) have_search = None 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 = QtGui.QWidget() logbox = QtGui.QVBoxLayout(logwidget) logbox.setContentsMargins(0, 0, 0, 0) searchbox = QtGui.QHBoxLayout() self.search_label = QtGui.QLabel(gettext("&Search:")) self.search_edit = QtGui.QLineEdit() self.search_label.setBuddy(self.search_edit) self.connect(self.search_edit, QtCore.SIGNAL("textEdited(QString)"), self.set_search_timer) self.search_timer = QtCore.QTimer(self) self.search_timer.setSingleShot(True) self.connect(self.search_timer, QtCore.SIGNAL("timeout()"), self.update_search) searchbox.addWidget(self.search_label) searchbox.addWidget(self.search_edit) self.searchType = QtGui.QComboBox() self.searchType.addItem(gettext("Messages"), QtCore.QVariant(self.FilterMessageRole)) self.searchType.addItem(gettext("Authors"), QtCore.QVariant(self.FilterAuthorRole)) self.searchType.addItem(gettext("Revision IDs"), QtCore.QVariant(self.FilterIdRole)) self.searchType.addItem(gettext("Revision Numbers"), QtCore.QVariant(self.FilterRevnoRole)) self.searchType.addItem(gettext("Tags"), QtCore.QVariant(self.FilterTagRole)) self.searchType.addItem(gettext("Bugs"), QtCore.QVariant(self.FilterBugRole)) searchbox.addWidget(self.searchType) self.connect(self.searchType, QtCore.SIGNAL("currentIndexChanged(int)"), 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.connect(self.log_list.selectionModel(), QtCore.SIGNAL("selectionChanged(QItemSelection, QItemSelection)"), self.file_list_container.revision_selection_changed) hsplitter = QtGui.QSplitter(QtCore.Qt.Horizontal) hsplitter.addWidget(self.message_browser) hsplitter.addWidget(self.file_list_container) hsplitter.setStretchFactor(0, 3) hsplitter.setStretchFactor(1, 1) splitter = QtGui.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, QtGui.QDialogButtonBox.ActionRole) self.connect(self.refresh_button, QtCore.SIGNAL("clicked()"), self.refresh) self.diffbuttons = DiffButtons(self.centralwidget) self.diffbuttons.setEnabled(False) self.connect(self.diffbuttons, QtCore.SIGNAL("triggered(QString)"), self.log_list.show_diff_specified_files_ext) vbox = QtGui.QVBoxLayout(self.centralwidget) vbox.addWidget(splitter) hbox = QtGui.QHBoxLayout() hbox.addWidget(self.diffbuttons) hbox.addWidget(buttonbox) vbox.addLayout(hbox) self.windows = [] # set focus on search edit widget self.log_list.setFocus() @runs_in_loading_queue @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.connect(self.log_list.selectionModel(), QtCore.SIGNAL("selectionChanged(QItemSelection, QItemSelection)"), self.update_selection) self.load_search_indexes(branches) finally: self.refresh_button.setDisabled(False) self.throbber.hide() def get_branches_and_file_ids(self): if self.branch: if self.tree is None: try: self.tree = self.branch.bzrdir.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 = [u'.'] # Branch names that indicated primary branch. # TODO: Make config option. primary_branch_names = ('trunk', 'bzr.dev') for location in locations: tree, br, repo, fp = \ BzrDir.open_containing_tree_branch_or_repository(location) self.processEvents() if br is None: if fp: raise errors.NotBranchError(fp) repo_branches = repo.find_branches(using=True) if not repo_branches: raise errors.NotBranchError(fp) for br in repo_branches: self.processEvents() try: tree = br.bzrdir.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 away 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 bzrlib.plugins.search import errors as search_errors from bzrlib.plugins.search import index as search_index except (ImportError, errors.IncompatibleAPI): 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)"), QtCore.QVariant(self.FilterSearchRole)) self.searchType.setCurrentIndex(0) self.completer = Compleater(self) self.completer_model = QtGui.QStringListModel(self) self.completer.setModel(self.completer_model) self.search_edit.setCompleter(self.completer) self.connect(self.search_edit, QtCore.SIGNAL("textChanged(QString)"), self.update_search_completer) self.suggestion_letters_loaded = {"":QtCore.QStringList()} self.suggestion_last_first_letter = "" self.connect(self.completer, QtCore.SIGNAL("activated(QString)"), 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: dir, name = split(path) dir = elided_text(dir, 10) name = elided_text(name) return join(dir, name) return path if shared_repo_location and shared_repo and not location: # Once we depend on bzrlib 2.2, this can become .user_url branch_rel = determine_relative_path( shared_repo.bzrdir.root_transport.base, branch.bzrdir.root_transport.base) 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. 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()).toInt()[0] search_text = unicode(self.search_edit.text()) if search_text == u"": 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 = unicode(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 = QtCore.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 bzrlib.branch import Branch def title_for_location(location): if isinstance(location, basestring): return url_for_display(location) if isinstance(location, Branch): return url_for_display(location.base) return str(location) return ", ".join(title_for_location(l) for l in locations) class FileListContainer(QtGui.QWidget): def __init__(self, log_list, parent=None): QtGui.QWidget.__init__(self, parent) self.log_list = log_list self.throbber = ThrobberWidget(self) self.throbber.hide() self.file_list = QtGui.QListWidget() self.connect(self.file_list, QtCore.SIGNAL("doubleClicked(QModelIndex)"), self.show_diff_files) self.file_list.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.file_list_context_menu = QtGui.QMenu(self) if has_ext_diff(): diff_menu = ExtDiffMenu(self) self.file_list_context_menu.addMenu(diff_menu) self.connect(diff_menu, QtCore.SIGNAL("triggered(QString)"), 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.connect( self.file_list, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), self.show_file_list_context_menu) vbox = QtGui.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.connect(self.delta_load_timer, QtCore.SIGNAL("timeout()"), 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 gv = self.log_list.log_model.graph_viz gv_is_wtgv = isinstance(gv, 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 = [gv.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/qbzr/+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: repo.lock_read() self.processEvents() try: for revid in repo_revids: if (revid.startswith(CURRENT_REVISION) and gv_is_wtgv): tree = gv.working_trees[revid] else: tree = repo.revision_tree(revid) self.tree_cache[revid] = tree self.processEvents() finally: repo.unlock() 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 if delta: items = [] # each item is 6-tuple: (id, path, is_not_specific_file_id, display, color, is_alive) for path, id, kind in delta.added: items.append((id, path, id not in specific_file_ids, path, "blue", True)) for path, id, kind, text_modified, meta_modified in delta.modified: items.append((id, path, id not in specific_file_ids, path, None, True)) for path, id, kind in delta.removed: items.append((id, path, id not in specific_file_ids, path, "red", False)) for (oldpath, newpath, id, kind, text_modified, meta_modified) in delta.renamed: 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 = QtGui.QListWidgetItem(display, self.file_list) item.setData(PathRole, QtCore.QVariant(path)) item.setData(file_idRole, QtCore.QVariant(id)) item.setData(AliveRole, QtCore.QVariant(is_alive)) if color: item.setTextColor(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.iterkeys() 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(unicode(item.data(PathRole).toString())) ids.append(str(item.data(file_idRole).toString())) alives.append(bool(item.data(AliveRole).toBool())) 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) file_id = file_ids[0] tree.lock_read() try: kind = tree.kind(file_id) if kind == 'file': file_content_bytes = tree.get_file_text(file_id) finally: tree.unlock() if kind != 'file': QtGui.QMessageBox.information(self, gettext("Not a file"), gettext("Operation is supported for a single file only,\n" "not for a %s." % kind)) return filename = QtGui.QFileDialog.getSaveFileName( self, gettext("Save file in this revision as...")) if filename: f = open(unicode(filename), 'wb') try: f.write(file_content_bytes) finally: f.close() @ui_current_widget def revert_file(self): """Reverts the file to what it was at the selected revision.""" res = QtGui.QMessageBox.question(self, gettext("Revert File"), gettext("Are you sure you want to revert this file " "to the state it was at the selected revision?" ),QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) if res == QtGui.QMessageBox.Yes: paths, file_ids = self.get_file_selection_paths_and_ids() (top_revid, old_revid), count = \ self.log_list.get_selection_top_and_parent_revids_and_count() 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) qbzr/lib/loggraphviz.py0000644000000000000000000020204612175306536015462 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 itertools import izip from bzrlib import errors from bzrlib.bzrdir import BzrDir from bzrlib.transport.local import LocalTransport from bzrlib.revision import NULL_REVISION, CURRENT_REVISION from bzrlib.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: bzrdir, relpath = BzrDir.open_containing(u".") repo = bzrdir.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 lock_read_repos(self): # for repo in self.repos.itervalues(): # repo.lock_read() # #def unlock_repos(self): # for repo in self.repos.itervalues(): # 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.iteritems(): 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 not revid 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) 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 = 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 not branch_id in merged_by_branch_merges: merged_by_branch_merges.append(branch_id) if not merged_by_branch_id 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): map = {} for i in xrange(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: map[ancestor_revid] = heads[i][1] return map if len(self.branches) > 1: head_revid_branch_info = sorted( [(revid, branch_info) for revid, (head_info, ur) in self.revid_head_info.iteritems() 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.itervalues(): head_count += len(head_info) if head_count > 1: # Populate unique revisions for heads for revid, (head_info, ur) in self.revid_head_info.iteritems(): 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.iterkeys() \ 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.iteritems(): 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 not branch_id 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 not twisty_branch_id 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: repo.lock_read() try: self.update_ui() for rev in repo.get_revisions(revids): return_revisions[rev.revision_id] = rev finally: repo.unlock() return return_revisions def repo_is_local(repo): return isinstance(repo.bzrdir.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 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:], 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('unicode-escape') def load(self): self.working_trees = {} for bi in self.branches: if not bi.tree is 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.iterkeys(): 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 = 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 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.iterkeys(): 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() tree.lock_read() try: for file_id in self.file_ids: if tree.kind(file_id) in ('directory', 'tree-reference'): self.has_dir = True break if self.has_dir: break finally: tree.unlock() 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 xrange(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): def check_text_keys(text_keys): changed_revs = [] for file_id, revid in repo.texts.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() repo.lock_read() try: 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 izip(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) finally: repo.unlock() 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.iteritems(): 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 """ tree.lock_read() try: # 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 = changes.next() # Exclude root (talk about black magic... --vila 20090629) if change[4] == (None, None): change = changes.next() return True except StopIteration: # No changes return False finally: tree.unlock() 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 for i in xrange(len(graph_viz.revisions))] qbzr/lib/logmodel.py0000644000000000000000000005103612175306536014731 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from time import (strftime, localtime, clock) import re import fnmatch from bzrlib.revision import CURRENT_REVISION, Revision from bzrlib.plugins.qbzr.lib.bugs import get_bug_id from bzrlib.plugins.qbzr.lib import loggraphviz from bzrlib.plugins.qbzr.lib.lazycachedrevloader import (load_revisions, cached_revisions) from bzrlib.plugins.qbzr.lib.revtreeview import RevIdRole as im_RevIdRole from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.util import ( extract_name, get_apparent_author, runs_in_loading_queue, run_in_loading_queue ) RevIdRole = im_RevIdRole GraphDataRole = QtCore.Qt.UserRole + 2 header_labels = (gettext("Rev"), gettext("Message"), gettext("Date"), gettext("Author"), ) (COL_REV, COL_MESSAGE, COL_DATE, COL_AUTHOR, ) = range(len(header_labels)) 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.iteritems(): # 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 clock() - self.last_call_time > self.last_run_time * 10): start_time = clock() self.filter_changed_callback(self.pending_revs, last_call) self.pending_revs = [] self.last_run_time = clock() - start_time self.last_call_time = clock() if last_call: self.last_run_time = 0 self.last_call_time = 0 class LogModel(QtCore.QAbstractTableModel): 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.iteritems(): 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.emit(QtCore.SIGNAL("layoutAboutToBeChanged()")) 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.emit(QtCore.SIGNAL("layoutChanged()")) 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.emit(QtCore.SIGNAL("layoutAboutToBeChanged()")) self.computed = computed self.emit(QtCore.SIGNAL("layoutChanged()")) 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.emit(QtCore.SIGNAL("dataChanged(QModelIndex, QModelIndex)"), clicked_row_index, clicked_row_index) self.graph_viz.update_ui() self.clicked_f_index = None self.state.collapse_expand_rev(c_rev) self.emit(QtCore.SIGNAL("dataChanged(QModelIndex, QModelIndex)"), 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 QtCore.QVariant() def blank(): if role == QtCore.Qt.DisplayRole: return QtCore.QVariant("") return QtCore.QVariant() 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 QtCore.QVariant((c_rev, prev_c_rev, tags, is_clicked)) if (role == QtCore.Qt.DisplayRole and index.column() == COL_REV): return QtCore.QVariant(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 QtCore.QVariant('\n'.join(urls)) if role == RevIdRole: return QtCore.QVariant(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 QtCore.QVariant(strftime("%Y-%m-%d %H:%M", localtime(revision.timestamp))) if role == QtCore.Qt.DisplayRole and index.column() == COL_AUTHOR: return QtCore.QVariant(extract_name(get_apparent_author(revision))) if role == QtCore.Qt.DisplayRole and index.column() == COL_MESSAGE: return QtCore.QVariant(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 QtCore.QVariant(header_labels[section]) return QtCore.QVariant() def on_revisions_loaded(self, revisions, last_call): for revid in revisions.iterkeys(): rev = self.graph_viz.revid_rev[revid] self.emit( QtCore.SIGNAL("dataChanged(QModelIndex, QModelIndex)"), 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, str, field): """Set search string for specified kind of data. @param str: 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.iterkeys()] 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 str is None or str == u"": self.filter_re = None self.index_matched_revids = None self.filter_changed_callback(None, True) else: if self.field == "index": from bzrlib.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: str = str.strip() query = [(query_item,) for query_item in str.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(str), 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(str), 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 qbzr/lib/logwidget.py0000644000000000000000000011252012175306536015110 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.revtreeview import (RevisionTreeView, RevNoItemDelegate, get_text_color) from bzrlib.revision import NULL_REVISION, CURRENT_REVISION from bzrlib.plugins.qbzr.lib.util import ( runs_in_loading_queue, ) from bzrlib.plugins.qbzr.lib.trace import reports_exception, SUB_LOAD_METHOD from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget from bzrlib.lazy_import import lazy_import lazy_import(globals(), ''' from bzrlib.bzrdir import BzrDir from bzrlib.revisionspec import RevisionSpec from bzrlib.plugins.qbzr.lib.tag import TagWindow, CallBackTagWindow from bzrlib.plugins.qbzr.lib import logmodel from bzrlib.plugins.qbzr.lib import diff from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.subprocess import SimpleSubProcessDialog ''') class LogList(RevisionTreeView): """TreeView widget to show log with metadata and graph of revisions.""" 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(QtGui.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.connect(self.log_model, QtCore.SIGNAL("layoutAboutToBeChanged()"), self.lines_updated_remember_selection) self.connect(self.log_model, QtCore.SIGNAL("layoutChanged()"), self.lines_updated_restore_selection) header = self.header() header.setStretchLastSection(False) header.setResizeMode(logmodel.COL_REV, QtGui.QHeaderView.Interactive) header.setResizeMode(logmodel.COL_MESSAGE, QtGui.QHeaderView.Stretch) header.setResizeMode(logmodel.COL_DATE, QtGui.QHeaderView.Interactive) header.setResizeMode(logmodel.COL_AUTHOR, QtGui.QHeaderView.Interactive) fm = self.fontMetrics() col_margin = (self.style().pixelMetric(QtGui.QStyle.PM_FocusFrameHMargin, None, self) + 1) *2 header.resizeSection(logmodel.COL_REV, fm.width("8888.8.888") + col_margin) header.resizeSection(logmodel.COL_DATE, # [bialix 2013/07/11] v I've added a space to sample string below to workaround bug https://bugs.launchpad.net/qbzr/+bug/430502 # v If this is a problem on non-Windows platforms - please let me know and I'll add a platform check 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.connect(self, QtCore.SIGNAL("doubleClicked(QModelIndex)"), self.default_action) self.context_menu = QtGui.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 = QtGui.QMenu(self) self.connect(self, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), 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) self.connect(diff_menu, QtCore.SIGNAL("triggered(QString)"), 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) self.connect(all_diff_menu, QtCore.SIGNAL("triggered(QString)"), 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) self.connect(diff_menu, QtCore.SIGNAL("triggered(QString)"), 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) self.connect(menu, QtCore.SIGNAL("bm_triggered"), 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(QtGui.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: QtGui.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()): QtGui.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: QtGui.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).toString()) 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).toString()) 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 = QtGui.QItemSelection(*indexes) selection_model.select(selection, (QtGui.QItemSelectionModel.SelectCurrent | QtGui.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 = str(index.data(logmodel.RevIdRole).toString()) 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 = str(indexes[0].data(logmodel.RevIdRole).toString()) bot_revid = str(indexes[-1].data(logmodel.RevIdRole).toString()) 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 = str(self.currentIndex().data(logmodel.RevIdRole).toString()) 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: QtCore.QObject.connect(dialog, QtCore.SIGNAL("subprocessFinished(bool)"), refresh_method) dialog.show() self.window().windows.append(dialog) if auto_run: dialog.do_accept() def revert_to_revision(self, selected_branch_info=None): def get_dialog(rev_count, top_revid, old_revid, top_revno_str, old_revno_str, selected_branch_info, single_branch): assert(rev_count==1) if single_branch: desc = (gettext("Revert to revision %s revid:%s.") % (top_revno_str, top_revid)) else: desc = (gettext("Revert %s to revision %s revid:%s.") % (selected_branch_info.label, top_revno_str, top_revid)) args = ["revert", '-r', 'revid:%s' % top_revid] return SimpleSubProcessDialog( gettext("Revert"), desc=desc, args=args, dir=selected_branch_info.tree.basedir, parent=self) self.sub_process_action(selected_branch_info, get_dialog) def update_to_revision(self, selected_branch_info=None): def get_dialog(rev_count, top_revid, old_revid, top_revno_str, old_revno_str, selected_branch_info, single_branch): assert(rev_count==1) if single_branch: desc = (gettext("Update to revision %s revid:%s.") % (top_revno_str, top_revid)) else: desc = (gettext("Update %s to revision %s revid:%s.") % (selected_branch_info.label, top_revno_str, top_revid)) args = ["update", '-r', 'revid:%s' % top_revid] return SimpleSubProcessDialog( gettext("Update"), desc=desc, args=args, dir=selected_branch_info.tree.basedir, parent=self) self.sub_process_action(selected_branch_info, get_dialog, True, self.refresh) # TODO, we should just update the branch tags, rather than a full # refresh. def cherry_pick(self, selected_branch_info=None): def get_dialog(rev_count, top_revid, old_revid, top_revno_str, old_revno_str, selected_branch_info, single_branch): from_branch_info = self.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 bzrlib.plugins.qbzr.lib.browse import BrowseWindow revid = str(self.currentIndex().data(logmodel.RevIdRole).toString()) gv = self.log_model.graph_viz if revid.startswith(CURRENT_REVISION): location = gv.working_trees[revid].abspath(u'') 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(QtGui.QMenu): def __init__ (self, text, parent, graphprovider, require_wt): QtGui.QMenu.__init__(self, text, parent) self.graphprovider = graphprovider for branch in self.graphprovider.branches: action = QtGui.QAction(branch.label, self) action.setData(QtCore.QVariant(branch)) self.addAction(action) if require_wt and branch.tree is None: action.setDisabled(True) self.connect(self, QtCore.SIGNAL("triggered(QAction *)"), self.triggered) def filter_rev_ancestor(self, rev, is_ancestor=True): visible_action_count = 0 for action in self.actions(): branch_info = action.data().toPyObject() 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().toPyObject() self.emit(QtCore.SIGNAL("bm_triggered"), branch_info) class GraphTagsBugsItemDelegate(QtGui.QStyledItemDelegate): _twistyColor = QtCore.Qt.black def paint(self, painter, option, index): data = index.data(logmodel.GraphDataRole) if data.isValid(): draw_graph = True if QtCore.PYQT_VERSION_STR.startswith('4.5.'): # toPyObject is buggy in 4.5 def toPy (x): if isinstance(x, QtCore.QVariant): return x.toPyObject() else: return x c_rev, prev_c_rev, labels, is_clicked = ( toPy(item) for item in data.toPyObject()) labels = [[toPy(x) for x in toPy(label)] for label in toPy(labels)] else: c_rev, prev_c_rev, labels, is_clicked = data.toPyObject() else: draw_graph = False option = QtGui.QStyleOptionViewItemV4(option) self.initStyleOption(option, index) widget = self.parent() style = widget.style() text_margin = style.pixelMetric(QtGui.QStyle.PM_FocusFrameHMargin, None, widget) + 1 painter.save() painter.setClipRect(option.rect) style.drawPrimitive(QtGui.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( (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 not option.text.isEmpty(): 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(): text = self.elidedText(fm, text_rect.width(), QtCore.Qt.ElideRight, text) 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 = QtGui.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 qbzr/lib/main.py0000644000000000000000000005262212175306536014055 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib import ( errors, osutils, ) import bzrlib from bzrlib.plugins import qbzr from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.statuscache import StatusCache from bzrlib.plugins.qbzr.lib.ui_bookmark import Ui_BookmarkDialog from bzrlib.plugins.qbzr.lib.util import ( QBzrWindow, get_qbzr_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(QtGui.QDialog): def __init__(self, title, parent=None): QtGui.QDialog.__init__(self, parent) self.setWindowTitle(title) self.ui = Ui_BookmarkDialog() self.ui.setupUi(self) self.ui.buttonBox.addButton(StandardButton(BTN_OK), QtGui.QDialogButtonBox.AcceptRole) self.ui.buttonBox.addButton(StandardButton(BTN_CANCEL), QtGui.QDialogButtonBox.RejectRole) def setValues(self, name, location): self.ui.name.setText(name) self.ui.location.setText(location) def values(self): return (unicode(self.ui.name.text()), unicode(self.ui.location.text())) class SideBarItem(object): def __init__(self): self.icon = QtCore.QVariant() self.text = QtCore.QVariant() 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.toString()) class DirectoryItem(SideBarItem): def __init__(self, fileInfo, parent, sidebar): self.path = fileInfo.filePath() self.icon = QtCore.QVariant(sidebar.window.icons['folder']) self.text = QtCore.QVariant(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 = QtCore.QVariant(sidebar.window.icons['computer']) self.text = QtCore.QVariant(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 = QtCore.QVariant(sidebar.window.icons['folder']) self.text = QtCore.QVariant(name) self.parent = parent self.children = None def showContextMenu(self, sidebar, pos): self.contextMenu = QtGui.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 = QtCore.QVariant(sidebar.window.icons['bookmark']) self.text = QtCore.QVariant(gettext("Bookmarks")) self.parent = sidebar.root self.children = None self.contextMenu = QtGui.QMenu() self.contextMenu.addAction(sidebar.window.actions['add-bookmark']) def load(self, sidebar): config = get_qbzr_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): 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 QtCore.QVariant() 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.emit(QtCore.SIGNAL("layoutAboutToBeChanged()")) 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.emit(QtCore.SIGNAL("layoutChanged()")) 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 = QtGui.QAction(self.icons['view-refresh'], gettext("&Refresh"), self) action.setShortcut("Ctrl+R") action.setStatusTip(gettext("Refresh the directory tree")) self.connect(action, QtCore.SIGNAL("triggered(bool)"), self.refresh) self.actions['refresh'] = action action = QtGui.QAction(self.icons['image-missing'], gettext("&Commit"), self) action.setStatusTip(gettext("Commit changes into a new revision")) self.connect(action, QtCore.SIGNAL("triggered(bool)"), self.commit) self.actions['commit'] = action action = QtGui.QAction(self.icons['qbzr-push'], gettext("&Push"), self) action.setStatusTip(gettext("Turn this branch into a mirror of another branch")) self.connect(action, QtCore.SIGNAL("triggered(bool)"), self.push) self.actions['push'] = action action = QtGui.QAction(self.icons['qbzr-pull'], gettext("Pu&ll"), self) action.setStatusTip(gettext("Update a mirror of this branch")) self.connect(action, QtCore.SIGNAL("triggered(bool)"), self.pull) self.actions['pull'] = action action = QtGui.QAction(gettext("&Add Bookmark..."), self) self.connect(action, QtCore.SIGNAL("triggered(bool)"), 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 = QtGui.QSplitter(QtCore.Qt.Vertical) self.sideBarView = QtGui.QTreeView() self.sideBarModel = SideBarModel(self) self.sideBarView.setModel(self.sideBarModel) self.sideBarView.setTextElideMode(QtCore.Qt.ElideLeft) self.sideBarView.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.connect(self.sideBarView, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), self.sideBarModel.showContextMenu) self.connect(self.sideBarView.selectionModel(), QtCore.SIGNAL("selectionChanged(QItemSelection, QItemSelection)"), self.updateFileList) header = self.sideBarView.header() header.setResizeMode(QtGui.QHeaderView.ResizeToContents) header.setStretchLastSection(False) header.setVisible(False) self.fileListView = QtGui.QTreeWidget() self.fileListView.setRootIsDecorated(False) self.fileListView.setHeaderLabels([ gettext("Name"), gettext("Size"), gettext("Status"), ]) self.connect(self.fileListView, QtCore.SIGNAL("itemDoubleClicked(QTreeWidgetItem *, int)"), self.onFileActivated) self.hsplitter = QtGui.QSplitter(QtCore.Qt.Horizontal) self.hsplitter.addWidget(self.sideBarView) self.hsplitter.addWidget(self.fileListView) self.console = QtGui.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 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") if value: self.vsplitter.restoreState(value.decode("base64")) value = config.get_option(name + "_hsplitter_state") if value: self.hsplitter.restoreState(value.decode("base64")) value = config.get_option(name + "_file_list_header_state") if value: self.fileListView.header().restoreState(value.decode("base64")) def showHelp(self): open_browser("http://bazaar-vcs.org/QBzr/Documentation") def showAboutDialog(self): tpl = { 'qbzr_version': qbzr.__version__, 'bzrlib_version': bzrlib.__version__, } QtGui.QMessageBox.about(self, gettext("About QBzr"), gettext(u"QBzr \u2014 A graphical user interface for Bazaar
" u"Version %(qbzr_version)s (bzrlib %(bzrlib_version)s)
" u"
" u"Copyright \u00A9 2006-2008 Luk\xe1\u0161 Lalinsk\xfd and others
" u"
" u'http://bazaar-vcs.org/QBzr') % tpl) def loadIcons(self): icons = [ ('view-refresh', ('16x16', '22x22'), None), ('bookmark', ('16x16',), None), ('computer', ('16x16',), None), ('qbzr-pull', ('22x22',), None), ('qbzr-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 bzrlib.workingtree import WorkingTree from bzrlib.plugins.qbzr.lib.commit import CommitWindow tree = WorkingTree.open_containing(self.currentDirectory)[0] self.window = CommitWindow(tree, [], parent=self) self.window.show() def push(self): from bzrlib.workingtree import WorkingTree from bzrlib.plugins.qbzr.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 bzrlib.workingtree import WorkingTree from bzrlib.plugins.qbzr.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 bzrlib.plugins.qbzr.lib.config import QBzrConfigWindow window = QBzrConfigWindow(self) window.exec_() def addBookmark(self): dialog = BookmarkDialog(gettext("Add Bookmark"), self) if dialog.exec_() == QtGui.QDialog.Accepted: name, location = dialog.values() config = get_qbzr_config() config.add_bookmark(name, location) config.save() self.sideBarModel.refresh(self.sideBarModel.bookmarksItem) def editBookmark(self, pos): config = get_qbzr_config() bookmarks = list(config.getBookmarks()) dialog = BookmarkDialog(gettext("Edit Bookmark"), self) dialog.setValues(*bookmarks[pos]) if dialog.exec_() == QtGui.QDialog.Accepted: bookmarks[pos] = dialog.values() config.set_bookmarks(bookmarks) config.save() self.sideBarModel.refresh(self.sideBarModel.bookmarksItem) def removeBookmark(self, pos): res = QtGui.QMessageBox.question(self, gettext("Remove Bookmark"), gettext("Do you really want to remove the selected bookmark?"), QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) if res == QtGui.QMessageBox.Yes: config = get_qbzr_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 = map(self.sideBarModel.itemFromIndex, self.sideBarView.selectedIndexes()) if not items: return item = items[0] if not isinstance(item, DirectoryItem): return self.setDirectory(unicode(item.path)) def onFileActivated(self, item, column): path = item.data(0, QtCore.Qt.UserRole).toString() if path: # directory self.setDirectory(unicode(path)) else: # file basename = unicode(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("QBzr - %s" % path) QtGui.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor)) try: pathParts = osutils.splitpath(path) self.fileListView.invisibleRootItem().takeChildren() item = QtGui.QTreeWidgetItem(self.fileListView) item.setText(0, '..') item.setIcon(0, self.icons['folder']) item.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(os.path.dirname(path))) fileInfoList = QtCore.QDir(path).entryInfoList( QtCore.QDir.AllEntries | QtCore.QDir.NoDotAndDotDot, QtCore.QDir.DirsFirst) for fileInfo in fileInfoList: item = QtGui.QTreeWidgetItem(self.fileListView) item.setText(0, fileInfo.fileName()) if fileInfo.isDir(): status = self.cache.getDirectoryStatus(pathParts, unicode(fileInfo.fileName())) if status == 'non-versioned': icon = 'folder' else: icon = 'folder-' + status item.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(fileInfo.filePath())) item.setIcon(0, self.icons[icon]) else: status = self.cache.getFileStatus(pathParts, unicode(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: QtGui.QApplication.restoreOverrideCursor() qbzr/lib/plugins.py0000644000000000000000000000722612175306536014612 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtGui from bzrlib import ( _format_version_tuple, osutils, plugin as mod_plugin, ) from bzrlib.plugins.qbzr.lib.conditional_dataview import ( QBzrConditionalDataView, ) from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.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 = QtGui.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 = QtGui.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 qbzr/lib/pull.py0000644000000000000000000003056212175306536014104 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib import ( errors, osutils, urlutils, ) from bzrlib.commands import get_cmd_object from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.subprocess import SubProcessDialog from bzrlib.plugins.qbzr.lib.ui_pull import Ui_PullForm from bzrlib.plugins.qbzr.lib.ui_push import Ui_PushForm from bzrlib.plugins.qbzr.lib.ui_merge import Ui_MergeForm from bzrlib.plugins.qbzr.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 = unicode(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 bzrlib.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 bzrlib.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 bzrlib.plugins.qbzr.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 = unicode(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 bzrlib/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 'bzr 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.getcwdu(): 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 = unicode(self.ui.revision.text()).strip() if rev: args.extend(['--revision', rev]) location = unicode(self.ui.location.currentText()) self.process_widget.do_start(None, 'merge', location, *args) save_pull_location(None, location) qbzr/lib/resources.py0000644000000000000000000051124312175306536015142 0ustar rootroot00000000000000# -*- 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 PyQt4 import QtCore qt_resource_data = "\ \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 = "\ \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 = "\ \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() qbzr/lib/revert.py0000644000000000000000000003067712175306536014446 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib import errors from bzrlib.plugins.qbzr.lib.diff import ( DiffButtons, show_diff, InternalWTDiffArgProvider, ) from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.subprocess import SubProcessDialog from bzrlib.plugins.qbzr.lib.treewidget import ( TreeWidget, SelectAllCheckBox, ) from bzrlib.plugins.qbzr.lib.util import ( ThrobberWidget, runs_in_loading_queue, ) from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget from bzrlib.plugins.qbzr.lib.trace import reports_exception from bzrlib.plugins.qbzr.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 = QtGui.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 = QtGui.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 = QtGui.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 = QtGui.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 = QtGui.QVBoxLayout(self.merges_groupbox) merges_box.addWidget(self.pending_merges) self.connect(self.selectall_checkbox, QtCore.SIGNAL("stateChanged(int)"), self.selectall_state_changed) self.connect(self.merges_groupbox, QtCore.SIGNAL("clicked(bool)"), self.merges_clicked) self.connect(self.file_groupbox, QtCore.SIGNAL("clicked(bool)"), self.file_groupbox_clicked) self.connect(self.filelist.tree_model, QtCore.SIGNAL("dataChanged(QModelIndex, QModelIndex)"), self.filelist_data_changed) # groupbox gets disabled as we are executing. QtCore.QObject.connect(self, QtCore.SIGNAL("disableUi(bool)"), self.file_groupbox, QtCore.SLOT("setDisabled(bool)")) self.splitter = QtGui.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 = QtGui.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.connect(self.diffbuttons, QtCore.SIGNAL("triggered(QString)"), self.show_diff_for_checked) hbox = QtGui.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 QtGui.QMessageBox.warning(self, "QBzr - " + gettext("Diff"), gettext(msg), QtGui.QMessageBox.Ok) qbzr/lib/revisionmessagebrowser.py0000644000000000000000000003553212175306536017741 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib.revision import CURRENT_REVISION from bzrlib import ( errors, lazy_regex, log, gpg, ) from bzrlib.plugins.qbzr.lib.i18n import gettext, ngettext from bzrlib.plugins.qbzr.lib.lazycachedrevloader import (load_revisions, cached_revisions) from bzrlib.plugins.qbzr.lib.util import ( runs_in_loading_queue, format_timestamp, get_message, get_summary, open_browser, ) from bzrlib import foreign from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget from bzrlib.plugins.qbzr.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 class RevisionMessageBrowser(QtGui.QTextBrowser): """Widget to display revision metadata and messages.""" def __init__(self, parent=None): super(RevisionMessageBrowser, self).__init__(parent) 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 xrange(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), QtCore.QVariant(image)) self.images.append(image) self.props_back_color_str = ("#%02X%02X%02X" % self.palette().background().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))) parents = self.get_parents(revid) children = self.get_children(revid) def short_text(summary, length): if len(summary) > length: return summary[:length-1] + u"\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, htmlencode(summary), color, revno, htmlencode((short_text(summary, 60))))) else: revs.append( '%s%srevid: %s' % (revid, 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 = log.format_signature_validity(revid, cached_revisions[revid].repository) props.append((gettext("Signature:"), signature_result_text)) except KeyError: #can't get Repository object for uncached revisions 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), QtCore.QVariant(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 = 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 ":" 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 = 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.connect(self.log_list.selectionModel(), QtCore.SIGNAL("selectionChanged(QItemSelection, QItemSelection)"), self.update_selection) self.connect(self, QtCore.SIGNAL("anchorClicked(QUrl)"), 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 = [str(index.data(logmodel.RevIdRole).toString()) 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 = unicode(url.scheme()) if scheme == 'qlog-revid': revision_id = unicode(url.path()) 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) qbzr/lib/revisionview.py0000644000000000000000000000551612175306536015662 0ustar rootroot00000000000000# QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.diffwindow import DiffWindow from bzrlib.plugins.qbzr.lib.diff_arg import InternalDiffArgProvider from bzrlib.plugins.qbzr.lib.revisionmessagebrowser import RevisionMessageBrowser from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.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 = QtGui.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)qbzr/lib/revtreeview.py0000644000000000000000000002422312175306536015474 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib import MS_WINDOWS from bzrlib.lazy_import import lazy_import lazy_import(globals(), ''' from bzrlib.plugins.qbzr.lib.util import run_in_loading_queue from bzrlib.plugins.qbzr.lib.lazycachedrevloader import load_revisions from bzrlib.plugins.qbzr.lib.diff import ExtDiffContext from bzrlib.transport.local import LocalTransport ''') RevIdRole = QtCore.Qt.UserRole + 1 class RevisionTreeView(QtGui.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): QtGui.QTreeView.__init__(self, parent) self.connect(self.verticalScrollBar(), QtCore.SIGNAL("valueChanged (int)"), self.scroll_changed) self.connect(self, QtCore.SIGNAL("collapsed (QModelIndex)"), self.collapsed_expanded) self.connect(self, QtCore.SIGNAL("expanded (QModelIndex)"), 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): QtGui.QTreeView.setModel(self, model) if isinstance(model, QtGui.QAbstractProxyModel): # Connecting the below signal has funny results when we connect to # to a ProxyModel, so connect to the source model. model = model.sourceModel() model.connect(model, QtCore.SIGNAL("dataChanged(QModelIndex, QModelIndex)"), self.data_changed) model.connect(model, QtCore.SIGNAL("layoutChanged()"), 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() QtGui.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 not revid.isNull(): revid = str(revid.toByteArray()) 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.bzrdir.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(0.5) 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 bzrlib.plugins.qbzr.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 & QtGui.QStyle.State_Enabled: if option.state & QtGui.QStyle.State_Active: cg = QtGui.QPalette.Active else: cg = QtGui.QPalette.Inactive else: cg = QtGui.QPalette.Disabled if option.state & QtGui.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/qbzr/+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(QtGui.QStyledItemDelegate): def __init__ (self, max_mainline_digits=4, parent=None): QtGui.QItemDelegate.__init__(self, parent) self.max_mainline_digits = max_mainline_digits def paint(self, painter, option, index): option = QtGui.QStyleOptionViewItemV4(option) self.initStyleOption(option, index) widget = self.parent() style = widget.style() painter.save() painter.setClipRect(option.rect) style.drawPrimitive(QtGui.QStyle.PE_PanelItemViewItem, option, painter, widget) text_margin = style.pixelMetric(QtGui.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 not option.text.isEmpty(): 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.indexOf(".") 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) qbzr/lib/run.py0000644000000000000000000003020212175306536013723 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib import osutils from bzrlib.plugins.qbzr.lib import MS_WINDOWS from bzrlib.plugins.qbzr.lib.help import get_help_topic_as_html from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.subprocess import SubProcessDialog from bzrlib.plugins.qbzr.lib.ui_run import Ui_RunDialog from bzrlib.plugins.qbzr.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() categories = sorted(self.all_cmds.keys()) 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 QtCore.QObject.connect(self.ui.hidden_checkbox, QtCore.SIGNAL("stateChanged(int)"), self.set_show_hidden) QtCore.QObject.connect(self.ui.cmd_combobox, QtCore.SIGNAL("currentIndexChanged(const QString&)"), self.set_cmd_help) QtCore.QObject.connect(self.ui.cmd_combobox, QtCore.SIGNAL("editTextChanged(const QString&)"), self.set_cmd_help) QtCore.QObject.connect(self.ui.cat_combobox, QtCore.SIGNAL("currentIndexChanged(const QString&)"), self.set_category) hookup_directory_picker(self, self.ui.browse_button, self.ui.wd_edit, gettext("Select working directory")) QtCore.QObject.connect(self.ui.directory_button, QtCore.SIGNAL("clicked()"), self.insert_directory) QtCore.QObject.connect(self.ui.filenames_button, QtCore.SIGNAL("clicked()"), 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 = QtGui.QPushButton(gettext('&Edit')) QtCore.QObject.connect(self.editButton, QtCore.SIGNAL("clicked()"), self.enable_command_edit) # cause edit button to be shown if command fails QtCore.QObject.connect(self, QtCore.SIGNAL("subprocessFailed(bool)"), self.editButton, QtCore.SLOT("setHidden(bool)")) # add edit button to dialog buttons self.buttonbox.addButton(self.editButton, QtGui.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. QtCore.QObject.connect(self, QtCore.SIGNAL("subprocessFinished(bool)"), self.cancelButton, QtCore.SLOT("setHidden(bool)")) # 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) QtCore.QObject.disconnect(self, QtCore.SIGNAL("subprocessFailed(bool)"), self.editButton, QtCore.SLOT("setHidden(bool)")) self.ui.run_container.show() self.ui.help_browser.show() self.okButton.setShown(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 bzrlib 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.iteritems(): # 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() 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 = unicode(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 = unicode(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 unicode(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 = unicode(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) self.ui.help_browser.setHtml(html_utf8.decode('utf-8')) 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 = unicode(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 = QtGui.QFileDialog.getExistingDirectory(self, gettext("Select path to insert"), cwd) if path: self.ui.opt_arg_edit.insert( self._prepare_filepath(unicode(path))+" ") def insert_filenames(self): """Select one or more existing files and insert them to command line.""" cwd = self._get_cwd("") filenames = QtGui.QFileDialog.getOpenFileNames(self, gettext("Select files to insert"), cwd) for i in filenames: self.ui.opt_arg_edit.insert( self._prepare_filepath(unicode(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 = unicode(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) qbzr/lib/send.py0000644000000000000000000002550212175306536014057 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib import errors from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.subprocess import SubProcessDialog from bzrlib.plugins.qbzr.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 = QtGui.QGroupBox(gettext("Merge Directive Options"), self) vboxMergeDirective = QtGui.QVBoxLayout(gbMergeDirective) vboxMergeDirective.addStrut(0) submit_hbox = QtGui.QHBoxLayout() submit_branch_label = QtGui.QLabel(gettext("Submit Branch:")) submit_branch_combo = QtGui.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 = QtGui.QPushButton(gettext("Browse")) QtCore.QObject.connect(browse_submit_button, QtCore.SIGNAL("clicked(bool)"), 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 = QtGui.QHBoxLayout() public_branch_label = QtGui.QLabel(gettext("Public Branch:")) public_branch_combo = QtGui.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 = QtGui.QPushButton(gettext("Browse")) QtCore.QObject.connect(browse_public_button, QtCore.SIGNAL("clicked(bool)"), 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 = QtGui.QCheckBox(gettext("Remember these locations as defaults")) self.remember_check = remember_check vboxMergeDirective.addWidget(remember_check) bundle_check = QtGui.QCheckBox(gettext("Include a bundle in the merge directive")) bundle_check.setChecked(True) self.bundle_check = bundle_check vboxMergeDirective.addWidget(bundle_check) patch_check = QtGui.QCheckBox(gettext("Include a preview patch in the merge directive")) patch_check.setChecked(True) self.patch_check = patch_check vboxMergeDirective.addWidget(patch_check) gbAction = QtGui.QGroupBox(gettext("Action"), self) vboxAction = QtGui.QVBoxLayout(gbAction) submit_email_radio = QtGui.QRadioButton("Send e-mail") submit_email_radio.toggle() self.submit_email_radio = submit_email_radio vboxAction.addWidget(submit_email_radio) mailto_hbox = QtGui.QHBoxLayout() mailto_label = QtGui.QLabel(gettext("Address:")) mailto_edit = QtGui.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 = QtGui.QHBoxLayout() message_label = QtGui.QLabel(gettext("Message:")) message_edit = QtGui.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 = QtGui.QRadioButton("Save to file") self.save_file_radio = save_file_radio vboxAction.addWidget(save_file_radio) savefile_hbox = QtGui.QHBoxLayout() savefile_label = QtGui.QLabel(gettext("Filename:")) savefile_edit = QtGui.QLineEdit() self.savefile_edit = savefile_edit # to allow access from callback function savefile_button = QtGui.QPushButton(gettext("Browse")) QtCore.QObject.connect(savefile_button, QtCore.SIGNAL("clicked(bool)"), 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 = QtGui.QHBoxLayout() revisions_label = QtGui.QLabel(gettext("Revisions:")) revisions_edit = QtGui.QLineEdit() self.revisions_edit = revisions_edit revisions_hbox.addWidget(revisions_label) revisions_hbox.addWidget(revisions_edit) vboxAction.addLayout(revisions_hbox) layout = QtGui.QVBoxLayout(self) self.splitter = QtGui.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 = QtGui.QFileDialog.getSaveFileName(self, ("Select save location")); if fileName != '': self.savefile_edit.setText(fileName) def browse_submit_clicked(self): fileName = QtGui.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 = QtGui.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 = unicode(self.savefile_edit.text()) if not location: self.savefile_edit.setFocus() self.operation_blocked(gettext("Filename not entered.")) return False submit_branch = unicode(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 = unicode(self.submit_branch_combo.currentText()) public_branch = unicode(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 = unicode(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 unicode(self.message_edit.text()): args.append("--message=%s" % unicode(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) qbzr/lib/shelvewindow.py0000644000000000000000000001221712175306536015643 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 sys, time from PyQt4 import QtCore, QtGui from PyQt4.QtGui import QKeySequence from bzrlib.revision import CURRENT_REVISION from bzrlib.errors import ( NoSuchRevision, NoSuchRevisionInTree, PathsNotVersionedError) from bzrlib.plugins.qbzr.lib.i18n import gettext, N_ from bzrlib.plugins.qbzr.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 bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget from bzrlib.plugins.qbzr.lib.trace import reports_exception from bzrlib.plugins.qbzr.lib.logwidget import LogList from bzrlib.lazy_import import lazy_import lazy_import(globals(), ''' from bzrlib import transform from bzrlib.workingtree import WorkingTree from bzrlib.revisiontree import RevisionTree from bzrlib.plugins.qbzr.lib.encoding_selector import EncodingMenuSelector from bzrlib.plugins.qbzr.lib.widgets.shelve import ShelveWidget from bzrlib.plugins.qbzr.lib.widgets.shelvelist import ShelveListWidget from bzrlib.plugins.qbzr.lib.widgets.splitters import Splitters from bzrlib.patiencediff import PatienceSequenceMatcher as SequenceMatcher from bzrlib.shelf import Unshelver from bzrlib.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): QBzrWindow.__init__(self, [gettext("Shelve Manager")], parent, ui_mode=ui_mode) self.restoreSize("shelve", (780, 680)) vbox = QtGui.QVBoxLayout(self.centralwidget) vbox.setMargin(2) self.throbber = ToolBarThrobberWidget(self) vbox.addWidget(self.throbber) self.tab = QtGui.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) 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.connect(self.tab, QtCore.SIGNAL("currentChanged(int)"), self.current_tab_changed) self.connect(shelve_view, QtCore.SIGNAL("shelfCreated(int)"), self.shelf_created) self.connect(shelvelist_view, QtCore.SIGNAL("unshelved(int, QString*)"), 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) qbzr/lib/spellcheck.py0000644000000000000000000000364312175306536015245 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 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(unicode(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 bzrlib.plugins.qbzr.lib.spellcheck_enchant import EnchantSpellChecker as SpellChecker except ImportError: SpellChecker = DummySpellChecker qbzr/lib/spellcheck_enchant.py0000644000000000000000000000416412175306536016744 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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('(\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())) qbzr/lib/statuscache.py0000644000000000000000000001272712175306536015442 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 bzrlib import ( errors, osutils, workingtree, ) from PyQt4 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.connect(self.fileSystemWatcher, QtCore.SIGNAL("directoryChanged(QString)"), self.invalidateDirectory) self.autoRefreshPath = None self.autoRefreshTimer = QtCore.QTimer(self) self.autoRefreshTimer.setSingleShot(True) self.connect(self.autoRefreshTimer, QtCore.SIGNAL("timeout()"), 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) wt, relpath = workingtree.WorkingTree.open_containing(p) except errors.BzrError: self.fileSystemWatcher.addPath(p) return self._cacheStatus(path, 'non-versioned') self.fileSystemWatcher.addPath(wt.basedir) bt = wt.basis_tree() root = self._cacheStatus(osutils.splitpath(wt.basedir), 'branch') delta = wt.changes_from(bt, want_unchanged=True, want_unversioned=True) for entry in delta.added: self._cacheStatus(osutils.splitpath(entry[0]), 'added', root=root) for entry in delta.removed: # FIXME self._cacheStatus(osutils.splitpath(entry[0]), 'modified', root=root) # self._cacheStatus(osutils.splitpath(entry[0]), 'removed', root=root) for entry in delta.modified: self._cacheStatus(osutils.splitpath(entry[0]), 'modified', root=root) for entry in delta.unchanged: self._cacheStatus(osutils.splitpath(entry[0]), 'unchanged', root=root) for entry in delta.unversioned: self._cacheStatus(osutils.splitpath(entry[0]), '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: parentEntry = self._getCacheEntry(path) except KeyError: parentEntry = None if parentEntry is None or parentEntry.status == 'unknown': parentEntry = self._cacheDirectoryStatus(path) try: entry = parentEntry.children[name] except KeyError: if parentEntry.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 = unicode(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) qbzr/lib/subprocess.py0000644000000000000000000013104212175306536015313 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 from PyQt4 import QtCore, QtGui from contextlib import contextmanager from bzrlib.plugins.qbzr.lib import MS_WINDOWS from bzrlib.plugins.qbzr.lib.i18n import gettext, N_ from bzrlib.plugins.qbzr.lib.util import ( BTN_CANCEL, BTN_CLOSE, BTN_OK, QBzrDialog, QBzrWindow, StandardButton, ensure_unicode, InfoWidget, ) from bzrlib.ui.text import TextProgressView, TextUIFactory from bzrlib.plugins.qbzr.lib.trace import ( report_exception, SUB_LOAD_METHOD) from bzrlib.lazy_import import lazy_import lazy_import(globals(), ''' import codecs import re import shlex import signal import tempfile import thread from bzrlib import ( bencode, commands, errors, osutils, ui, ) from bzrlib.bzrdir import BzrDir from bzrlib.plugins.qbzr.lib.commit import CommitWindow from bzrlib.plugins.qbzr.lib.revert import RevertWindow from bzrlib.plugins.qbzr.lib.shelvewindow import ShelveWindow from bzrlib.plugins.qbzr.lib.conflicts import ConflictsWindow ''') # Subprocess service messages markers SUB_PROGRESS = "qbzr:PROGRESS:" SUB_GETPASS = "qbzr:GETPASS:" SUB_GETUSER = "qbzr:GETUSER:" SUB_GETBOOL = "qbzr:GETBOOL:" SUB_CHOOSE = "qbzr:CHOOSE:" SUB_ERROR = "qbzr:ERROR:" SUB_NOTIFY = "qbzr:NOTIFY:" NOTIFY_CONFLICT = "conflict:" class WarningInfoWidget(InfoWidget): def __init__(self, parent): InfoWidget.__init__(self, parent) layout = QtGui.QVBoxLayout(self) label_layout = QtGui.QHBoxLayout() icon = QtGui.QLabel() icon.setPixmap(self.style().standardPixmap( QtGui.QStyle.SP_MessageBoxWarning)) label_layout.addWidget(icon) self.label = QtGui.QLabel() label_layout.addWidget(self.label, 2) layout.addLayout(label_layout) self.button_layout = QtGui.QHBoxLayout() self.button_layout.addStretch(1) layout.addLayout(self.button_layout) self.buttons = [] def add_button(self, text, on_click): button = QtGui.QPushButton(gettext(text)) self.connect(button, QtCore.SIGNAL("clicked(bool)"), 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: self.disconnect(button, QtCore.SIGNAL("clicked(bool)"), 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(object): 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.connect(self.process_widget, QtCore.SIGNAL("finished()"), self.on_finished) self.connect(self.process_widget, QtCore.SIGNAL("failed(QString)"), self.on_failed) self.connect(self.process_widget, QtCore.SIGNAL("error()"), self.on_error) self.connect(self.process_widget, QtCore.SIGNAL("conflicted(QString)"), 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. QtCore.QObject.connect(self, QtCore.SIGNAL("subprocessStarted(bool)"), self.okButton, QtCore.SLOT("setDisabled(bool)")) # ok button gets hidden when we finish. QtCore.QObject.connect(self, QtCore.SIGNAL("subprocessFinished(bool)"), self.okButton, QtCore.SLOT("setHidden(bool)")) # close button gets shown when we finish. QtCore.QObject.connect(self, QtCore.SIGNAL("subprocessFinished(bool)"), self.closeButton, QtCore.SLOT("setShown(bool)")) # cancel button gets disabled when finished. QtCore.QObject.connect(self, QtCore.SIGNAL("subprocessFinished(bool)"), self.cancelButton, QtCore.SLOT("setDisabled(bool)")) # ok button gets enabled when we fail. QtCore.QObject.connect(self, QtCore.SIGNAL("subprocessFailed(bool)"), self.okButton, QtCore.SLOT("setDisabled(bool)")) # Change the ok button to 'retry' if we fail. QtCore.QObject.connect(self, QtCore.SIGNAL("subprocessFailed(bool)"), lambda failed: self.okButton.setText( gettext('&Retry'))) self.buttonbox = QtGui.QDialogButtonBox(self) self.buttonbox.addButton(self.okButton, QtGui.QDialogButtonBox.AcceptRole) self.buttonbox.addButton(self.closeButton, QtGui.QDialogButtonBox.AcceptRole) self.buttonbox.addButton(self.cancelButton, QtGui.QDialogButtonBox.RejectRole) self.connect(self.buttonbox, QtCore.SIGNAL("accepted()"), self.do_accept) self.connect(self.buttonbox, QtCore.SIGNAL("rejected()"), self.do_reject) self.closeButton.setHidden(True) # but 'close' starts as hidden. self.infowidget = WarningInfoWidget(self) self.infowidget.hide() QtCore.QObject.connect(self, QtCore.SIGNAL("subprocessStarted(bool)"), self.infowidget, QtCore.SLOT("setHidden(bool)")) if immediate: self.do_accept() def make_default_status_box(self): panel = QtGui.QWidget() vbox = QtGui.QVBoxLayout(panel) vbox.setContentsMargins(0, 0, 0, 0) vbox.addWidget(self.infowidget) status_group_box = QtGui.QGroupBox(gettext("Status")) status_layout = QtGui.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 = QtGui.QWidget() vbox = QtGui.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.finished: self.close() else: try: if not self.validate(): return except: report_exception(type=SUB_LOAD_METHOD, window=self.window()) return self.emit(QtCore.SIGNAL("subprocessStarted(bool)"), True) self.emit(QtCore.SIGNAL("disableUi(bool)"), 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(QtGui.QDialog.Accepted) self.emit(QtCore.SIGNAL("subprocessFinished(bool)"), True) self.emit(QtCore.SIGNAL("disableUi(bool)"), 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 = unicode(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.emit(QtCore.SIGNAL("subprocessFailed(bool)"), False) self.emit(QtCore.SIGNAL("disableUi(bool)"), False) if error=='UncommittedChanges': self.action_url = self.process_widget.error_data['display_url'] self.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.emit(QtCore.SIGNAL("subprocessError(bool)"), 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 tree, branch = BzrDir.open_tree_or_branch(self.action_url) commit_window = CommitWindow(tree, None, parent=self) self.windows.append(commit_window) commit_window.show() def open_revert_win(self, b): # XXX refactor so that the tree can be opened by the window tree, branch = BzrDir.open_tree_or_branch(self.action_url) revert_window = RevertWindow(tree, None, parent=self) self.windows.append(revert_window) revert_window.show() def open_shelve_win(self, b): shelve_window = ShelveWindow(directory=self.action_url, parent=self) self.windows.append(shelve_window) shelve_window.show() def open_conflicts_win(self, b): window = ConflictsWindow(self.action_url, parent=self) self.windows.append(window) window.show() QtCore.QObject.connect(window, QtCore.SIGNAL("allResolved(bool)"), self.infowidget, QtCore.SLOT("setHidden(bool)")) 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 = QtGui.QVBoxLayout(self) groupbox = QtGui.QGroupBox(gettext('Description')) v = QtGui.QVBoxLayout(groupbox) label = QtGui.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: QtCore.QObject.connect(self, QtCore.SIGNAL("subprocessFailed(bool)"), self, QtCore.SLOT("setHidden(bool)")) QtCore.QObject.connect(self, QtCore.SIGNAL("subprocessError(bool)"), self, QtCore.SLOT("setHidden(bool)")) self.do_start() class SubProcessWidget(QtGui.QWidget): def __init__(self, ui_mode, parent=None, hide_progress=False): QtGui.QGroupBox.__init__(self, parent) self.ui_mode = ui_mode layout = QtGui.QVBoxLayout(self) message_layout = QtGui.QHBoxLayout() self.progressMessage = QtGui.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 = QtGui.QLabel(self) message_layout.addWidget(self.transportActivity) layout.addLayout(message_layout) self.progressBar = QtGui.QProgressBar(self) self.progressBar.setMaximum(1000000) layout.addWidget(self.progressBar) self.console = QtGui.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.connect(self.process, QtCore.SIGNAL("readyReadStandardOutput()"), self.readStdout) self.connect(self.process, QtCore.SIGNAL("readyReadStandardError()"), self.readStderr) self.connect(self.process, QtCore.SIGNAL("error(QProcess::ProcessError)"), self.reportProcessError) self.connect(self.process, QtCore.SIGNAL("finished(int, QProcess::ExitStatus)"), self.onFinished) self.defaultWorkingDir = self.process.workingDirectory () self.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.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). """ QtGui.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() dir, args = self.commands.pop(0) # Log the command we about to execute def format_args_for_log(args): r = ['bzr'] for a in args: a = unicode(a).translate({ ord(u'\n'): u'\\n', ord(u'\r'): u'\\r', ord(u'\t'): u'\\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) args = bencode_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/qbzr/+bug/396165 # on Linux I believe command-line is in utf-8, # so we need to have some extra space # when converting unicode -> utf8 if (len(args) > 10000 # XXX make the threshold configurable in qbzr.conf? or re.search(r"(?:" r"\n|\r" # workaround for bug #517420 r"|\\\\" # workaround for bug #528944 r")", args) is not None or self.force_passing_args_via_file # workaround for bug #936587 ): # save the args to the file fname = self._create_args_file(args) args = "@" + fname.replace('\\', '/') if dir is None: dir = self.defaultWorkingDir self.error_class = '' self.error_data = {} self.process.setWorkingDirectory(dir) if getattr(sys, "frozen", None) is not None: bzr_exe = sys.executable if os.path.basename(bzr_exe) != "bzr.exe": # Was run from bzrw.exe or tbzrcommand. bzr_exe = os.path.join(os.path.dirname(sys.executable), "bzr.exe") if not os.path.isfile(bzr_exe): self.reportProcessError( None, gettext('Could not locate "bzr.exe".')) self.process.start( bzr_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) if os.path.basename(script) != "bzr": import bzrlib # are we running directly from a bzr directory? script = os.path.join(bzrlib.__path__[0], "..", "bzr") if not os.path.isfile(script): # maybe from an installed bzr? script = os.path.join(sys.prefix, "scripts", "bzr") if not os.path.isfile(script): self.reportProcessError( None, gettext('Could not locate "bzr" script.')) self.process.start( sys.executable, [script, 'qsubprocess', '--bencode', args]) def _setup_stdout_stderr(self): if self.stdout is None: writer = codecs.getwriter(osutils.get_terminal_encoding()) self.stdout = writer(sys.stdout, errors='replace') self.stderr = writer(sys.stderr, 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): # ensure we read from subprocess plain string data = str(self.process.readAllStandardOutput()) # we need unicode for all strings except bencoded streams for line in data.splitlines(): if line.startswith(SUB_PROGRESS): try: progress, transport_activity, task_info = bencode.bdecode( line[len(SUB_PROGRESS):]) messages = [b.decode("utf-8") for b in task_info] except ValueError, 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.decode(self.encoding), "error", self.stderr) else: self.setProgress(progress, messages, transport_activity) elif line.startswith(SUB_GETPASS): prompt = bdecode_prompt(line[len(SUB_GETPASS):]) passwd, ok = QtGui.QInputDialog.getText(self, gettext("Enter Password"), prompt, QtGui.QLineEdit.Password) data = unicode(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 = bdecode_prompt(line[len(SUB_GETUSER):]) passwd, ok = QtGui.QInputDialog.getText(self, gettext("Enter Username"), prompt) data = unicode(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 = bdecode_prompt(line[len(SUB_GETBOOL):]) button = QtGui.QMessageBox.question( self, "Bazaar", prompt, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) data = (button == QtGui.QMessageBox.Yes) self.process.write(SUB_GETBOOL + bencode.bencode(data) + "\n") elif line.startswith(SUB_CHOOSE): msg, choices, default = bdecode_choose_args(line[len(SUB_CHOOSE):]) mbox = QtGui.QMessageBox(parent=self) mbox.setText(msg) mbox.setIcon(QtGui.QMessageBox.Question) choices = choices.split('\n') index = 0 for c in choices: button = mbox.addButton(c, QtGui.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 = bdecode_exception_instance( line[len(SUB_ERROR):]) elif line.startswith(SUB_NOTIFY): msg = line[len(SUB_NOTIFY):] if msg.startswith(NOTIFY_CONFLICT): self.conflicted = True self.conflict_tree_path = bdecode_prompt(msg[len(NOTIFY_CONFLICT):]) else: line = line.decode(self.encoding, 'replace') self.logMessageEx(line, 'plain', self.stdout) def readStderr(self): data = str(self.process.readAllStandardError()).decode(self.encoding, 'replace') if data: self.emit(QtCore.SIGNAL("error()")) for line in data.splitlines(): error = line.startswith("bzr: 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': format = self.errorFormat elif kind == 'cmdline': format = self.cmdlineFormat else: format = self.messageFormat self.console.setCurrentCharFormat(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 bzr.") else: message = gettext("Error while running bzr. (error code: %d)" % error) self.logMessage(message, True) self.emit(QtCore.SIGNAL("failed(QString)"), self.error_class) def onFinished(self, exitCode, exitStatus): self._delete_args_file() if self.aborting: self.aborting = False self.setProgress(1000000, [gettext("Aborted!")]) self.emit(QtCore.SIGNAL("failed(QString)"), 'Aborted') elif exitCode < 3: if self.commands and not self.aborting: self._start_next() else: self.finished = True self.setProgress(1000000, [gettext("Finished!")]) if self.conflicted: self.emit(QtCore.SIGNAL("conflicted(QString)"), self.conflict_tree_path) self.emit(QtCore.SIGNAL("finished()")) else: self.setProgress(1000000, [gettext("Failed!")]) self.emit(QtCore.SIGNAL("failed(QString)"), self.error_class) def _create_args_file(self, text): """@param text: text to write into temp file, it should be unicode string """ if self._args_file: self._delete_args_file() qdir = os.path.join(tempfile.gettempdir(), 'QBzr', 'qsubprocess') if not os.path.isdir(qdir): os.makedirs(qdir) fd, fname = tempfile.mkstemp(dir=qdir) f = os.fdopen(fd, "wb") try: f.write(text.encode('utf8')) finally: f.close() # it closes fd as well 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 becuse showing the # transport activity before a progress update would cause artifactes 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 self._term_file.write( SUB_PROGRESS + bencode.bencode((progress, trans, task_info)) + '\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 < 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 + bencode_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 recive a answer from the main process.") def _choose_from_main(self, msg, choices, default): name = SUB_CHOOSE self.stdout.write(name + bencode_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 recive 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 bzrlib.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. NOTE: if cmd starts with @ sign then it used as name of the file where actual command line string is saved (utf-8 encoded). """ 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 cmd.startswith('@'): fname = cmd[1:] f = open(fname, 'rb') try: cmd_utf8 = f.read() finally: f.close() else: cmd_utf8 = cmd.encode('utf8') if not bencoded: argv = [unicode(p, 'utf-8') for p in shlex.split(cmd_utf8)] else: argv = [unicode(p, 'utf-8') for p in bencode.bdecode(cmd_utf8)] try: def on_conflicted(wtpath): print "%s%s%s" % (SUB_NOTIFY, NOTIFY_CONFLICT, bencode_prompt(wtpath)) with watch_conflicts(on_conflicted): return commands.run_bzr(argv) except (KeyboardInterrupt, SystemExit): raise except Exception, e: print "%s%s" % (SUB_ERROR, bencode_exception_instance(e)) raise def sigabrt_handler(signum, frame): raise KeyboardInterrupt() if MS_WINDOWS: import ctypes if getattr(sys, "frozen", None): # this is needed for custom bzr.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 'qbzr-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() def bencode_unicode(args): """Bencode list of unicode strings as list of utf-8 strings and converting resulting string to unicode. """ args_utf8 = bencode.bencode([unicode(a).encode('utf-8') for a in args]) return unicode(args_utf8, 'utf-8') def bencode_prompt(arg): return bencode.bencode(arg.encode('unicode-escape')) def bdecode_prompt(s): return bencode.bdecode(s).decode('unicode-escape') def bencode_choose_args(msg, choices, default): if default is None: default = -1 return bencode.bencode([ msg.encode('unicode-escape'), choices.encode('unicode-escape'), default ]) def bdecode_choose_args(s): msg, choices, default = bencode.bdecode(s) msg = msg.decode('unicode-escape') choices = choices.decode('unicode-escape') return msg, choices, default def bencode_exception_instance(e): """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. """ # GZ 2011-04-15: Could use bzrlib.trace._qualified_exception_name in 2.4 ename = e.__class__.__name__ d = {} # For now be conservative and only serialise attributes that will get used keys = [] if isinstance(e, errors.UncommittedChanges): 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: val = getattr(e, key) if not isinstance(val, unicode): if not isinstance(val, str): val = repr(val) val = val.decode("ascii", "replace") except (KeyboardInterrupt, SystemExit): raise except: val = "[QBzr could not serialize this attribute]" d[key] = val.encode("unicode-escape") return bencode.bencode((ename, d)) def bdecode_exception_instance(s): """Deserialise information about an exception instance with bdecode""" ename, d = bencode.bdecode(s) for k in d: d[k] = d[k].decode("unicode-escape") return ename, d # GZ 2011-04-15: Remove or deprecate these functions if they remain unused? def encode_unicode_escape(obj): if isinstance(obj, dict): result = {} for k,v in obj.iteritems(): result[k] = v.encode('unicode-escape') return result else: raise TypeError('encode_unicode_escape: unsupported type: %r' % type(obj)) def decode_unicode_escape(obj): if isinstance(obj, dict): result = {} for k,v in obj.iteritems(): result[k] = v.decode('unicode-escape') return result else: raise TypeError('decode_unicode_escape: unsupported type: %r' % type(obj)) qbzr/lib/switch.py0000644000000000000000000001431612175306536014430 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib import errors, osutils from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.subprocess import SubProcessDialog from bzrlib.plugins.qbzr.lib.util import ( url_for_display, QBzrDialog, runs_in_loading_queue, ThrobberWidget ) from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget from bzrlib.plugins.qbzr.lib.trace import ( reports_exception, SUB_LOAD_METHOD) class QBzrSwitchWindow(SubProcessDialog): def __init__(self, branch, bzrdir, 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 = QtGui.QGroupBox(gettext("Switch checkout"), self) switch_box = QtGui.QFormLayout(gbSwitch) branchbase = None boundloc = branch.get_bound_location() if boundloc is not None: label = gettext("Heavyweight checkout:") branchbase = branch.base else: if bzrdir.root_transport.base != branch.bzrdir.root_transport.base: label = gettext("Lightweight checkout:") boundloc = branch.bzrdir.root_transport.base branchbase = bzrdir.root_transport.base else: raise errors.BzrError("This branch is not checkout.") switch_box.addRow(label, QtGui.QLabel(url_for_display(branchbase))) switch_box.addRow(gettext("Checkout of branch:"), QtGui.QLabel(url_for_display(boundloc))) self.boundloc = url_for_display(boundloc) throb_hbox = QtGui.QHBoxLayout() self.throbber = ThrobberWidget(self) throb_hbox.addWidget(self.throbber) self.throbber.hide() switch_box.addRow(throb_hbox) switch_hbox = QtGui.QHBoxLayout() branch_label = QtGui.QLabel(gettext("Switch to branch:")) branch_combo = QtGui.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 = QtGui.QPushButton(gettext("Browse")) QtCore.QObject.connect(browse_button, QtCore.SIGNAL("clicked(bool)"), 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 = QtGui.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 = QtGui.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.bzrdir.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.getcwdu() fileName = QtGui.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 = unicode(self.branch_combo.currentText()) if not location: self.operation_blocked(gettext("Branch location not specified.")) return False return True def do_start(self): location = unicode(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) qbzr/lib/syntaxhighlighter.py0000644000000000000000000001540012175306536016667 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui _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 = unicode(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 = QtGui.QApplication(sys.argv) python = QtGui.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 currentLineqbzr/lib/sysinfo.py0000644000000000000000000000450712175306536014622 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.sysinfo_data import get_sys_info from bzrlib.plugins.qbzr.lib.ui_sysinfo import Ui_MainWindow from bzrlib.plugins.qbzr.lib.util import ( BTN_CLOSE, QBzrWindow, ) 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", "?")) bzrlib_path = props.get("bzr-lib-path") try: bzrlib_head = bzrlib_path[0] except IndexError: bzrlib_head = "" self.ui.bzr_lib_path.setText(bzrlib_head) # Bazaar Configuration section self.ui.bzr_config_dir.setText(props.get("bzr-config-dir", "?")) self.ui.bzr_log_file.setText(props.get("bzr-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", "?")) qbzr/lib/sysinfo_data.py0000644000000000000000000000715412175306536015614 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 bzrlib from bzrlib import bzrdir, config, errors, osutils, trace 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 bzrlib 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 = {} # Bazaar installation result["bzr-version"] = bzrlib.__version__ result["bzr-lib-path"] = bzrlib.__path__ # is bzrlib 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 if not isinstance(config_dir, unicode): config_dir = config_dir.decode(osutils.get_user_encoding()) result["bzr-config-dir"] = config_dir result["bzr-log-file"] = trace._bzr_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"] = bzrlib._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 = bzrdir.BzrDir.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 qbzr/lib/tag.py0000644000000000000000000002057712175306536013710 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib.branch import Branch from bzrlib import ( errors, ) from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.subprocess import SubProcessDialog from bzrlib.plugins.qbzr.lib.ui_tag import Ui_TagForm from bzrlib.plugins.qbzr.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 QtCore.QObject.connect(self.ui.cb_action, QtCore.SIGNAL("currentIndexChanged(int)"), self.on_action_changed) QtCore.QObject.connect(self.ui.cb_tag, QtCore.SIGNAL("currentIndexChanged(int)"), self.on_tag_changed) QtCore.QObject.connect(self.ui.cb_tag.lineEdit(), QtCore.SIGNAL("editingFinished()"), self.on_tag_changed) QtCore.QObject.connect(self.ui.branch_browse, QtCore.SIGNAL("clicked()"), self.on_browse) QtCore.QObject.connect(self.ui.branch_location, QtCore.SIGNAL("editingFinished()"), 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(QtCore.QStringList(sorted(self.tags.keys(), key=unicode.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 = unicode(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 = unicode(self.ui.cb_tag.lineEdit().text()) has_tag = tag in self.tags rev = unicode(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(unicode(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 = QtGui.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 = unicode(location) try: branch = Branch.open_containing(location)[0] except errors.NotBranchError: QtGui.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() qbzr/lib/tests/0000755000000000000000000000000012175306536013712 5ustar rootroot00000000000000qbzr/lib/texteditannotate.py0000644000000000000000000001126312175306536016511 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui class AnnotateBarBase(QtGui.QWidget): def __init__(self, edit, parent): QtGui.QWidget.__init__(self, parent) self.edit = edit self.connect(self.edit, QtCore.SIGNAL("updateRequest(const QRect&,int)"), 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().background()) # 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() QtGui.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.emit(QtCore.SIGNAL("cursorPositionChanged()")) 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.connect(self.edit, QtCore.SIGNAL("blockCountChanged(int)"), self.adjustWidth) def adjustWidth(self, count): width = self.fontMetrics().width(unicode(count)) text_margin = self.style().pixelMetric( QtGui.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( QtGui.QStyle.PM_FocusFrameHMargin, None, self) + 1 painter.drawText(rect.adjusted(text_margin, 0, -text_margin, 0), QtCore.Qt.AlignRight, unicode(line_number)) class AnnotateEditerFrameBase(QtGui.QFrame): def __init__(self, parent = None): QtGui.QFrame.__init__(self,parent) self.setFrameStyle(QtGui.QFrame.StyledPanel | QtGui.QFrame.Sunken) self.hbox = QtGui.QHBoxLayout(self) self.hbox.setSpacing(0) self.hbox.setMargin(0) class LineNumberEditerFrame(AnnotateEditerFrameBase): def __init__(self, parent= None): super(LineNumberEditerFrame, self).__init__(parent) self.edit = QtGui.QPlainTextEdit(self) self.edit.setFrameStyle(QtGui.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() qbzr/lib/trace.py0000644000000000000000000003600412175306536014223 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 cStringIO import StringIO import traceback from PyQt4 import QtCore, QtGui import bzrlib from bzrlib import ( errors, osutils, plugin, ) from bzrlib.trace import ( mutter, note, print_exception as _bzrlib_print_exception, report_exception as _bzrlib_report_exception, ) from bzrlib.plugins.qbzr.lib.i18n import gettext import bzrlib.plugins.qbzr.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/qbzr/+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 = QtGui.QMessageBox(parent=window) msgbox.setIcon(QtGui.QMessageBox.Warning) msgbox.setText(gettext("Could not acquire lock. Please retry later.")) if type == MAIN_LOAD_METHOD: msgbox.addButton(QtGui.QMessageBox.Close) else: msgbox.addButton(QtGui.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 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 = _bzrlib_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 bzrlib.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 bzrlib.trace.report_bug # but we seperate the message, and the trace back, # and addes a hyper link to the filebug page. traceback_file = StringIO() _bzrlib_print_exception(exc_info, traceback_file) traceback_file.write('\n') traceback_file.write('bzr %s on python %s (%s)\n' % \ (bzrlib.__version__, bzrlib._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) 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() == QtGui.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(QtGui.QDialog): """A dialogue box for displaying and optionally reporting crashes in bzr/qbzr/bzr explorer.""" def __init__(self, title, message_internal, trace_back, exc_info, type=MAIN_LOAD_METHOD, parent=None): QtGui.QDialog.__init__ (self, parent) self.buttonbox = QtGui.QDialogButtonBox() if parent: win_title = None if hasattr(parent, 'title'): if isinstance(parent.title, basestring): 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(QtGui.QDialogButtonBox.Close) button.setText(close_label) elif type == SUB_LOAD_METHOD: button = self.buttonbox.addButton(QtGui.QDialogButtonBox.Ok) button.setText(gettext("Close Error Dialog")) elif type == ITEM_OR_EVENT_METHOD: button = self.buttonbox.addButton(QtGui.QDialogButtonBox.Close) button.setText(close_label) button = self.buttonbox.addButton(QtGui.QDialogButtonBox.Ignore) button.setText(gettext("Ignore Error")) def report_bug(): from bzrlib import crash #Using private method because bzrlib.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, 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"), QtGui.QDialogButtonBox.ActionRole) report_bug_button.connect(report_bug_button, QtCore.SIGNAL("clicked()"), 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 = QtGui.QLabel(message) label.setWordWrap(True) label.setAlignment(QtCore.Qt.AlignVCenter|QtCore.Qt.AlignLeft) self.connect(label, QtCore.SIGNAL("linkActivated(QString)"), self.link_clicked) icon_label = QtGui.QLabel() icon_label.setPixmap(self.style().standardPixmap( QtGui.QStyle.SP_MessageBoxCritical)) self.show_trace_back_button = QtGui.QPushButton(gettext("Show Error Details >>>")) self.connect(self.show_trace_back_button, QtCore.SIGNAL("clicked()"), self.show_trace_back) self.trace_back_label = QtGui.QTextEdit() self.trace_back_label.setPlainText (trace_back) self.trace_back_label.setReadOnly(True) self.trace_back_label.hide() self.connect(self.buttonbox, QtCore.SIGNAL("clicked (QAbstractButton *)"), self.clicked) vbox = QtGui.QVBoxLayout() hbox = QtGui.QHBoxLayout() hbox.addWidget(icon_label) hbox.addWidget(label, 10) vbox.addLayout(hbox) hbox = QtGui.QHBoxLayout() hbox.addWidget(self.show_trace_back_button) hbox.addStretch() vbox.addLayout(hbox) vbox.addWidget(self.trace_back_label) hbox = QtGui.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 bzrlib.plugins.qbzr.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], QtGui.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) qbzr/lib/tree_branch.py0000644000000000000000000001124612175306536015402 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtGui from bzrlib import ( bzrdir, errors, osutils, urlutils, ) from bzrlib.plugins.qbzr.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=QtGui.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 ) = bzrdir.BzrDir.open_containing_tree_or_branch(location) if require_tree and tree is None: raise errors.NoWorkingTree(location) except (errors.NotBranchError, errors.NoWorkingTree), 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=QtGui.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_light_co(self): """Return True if location is lightweight checkout.""" if (self.tree and self.tree.bzrdir.root_transport.base != self.branch.bzrdir.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_light_co(): 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 qbzr/lib/treewidget.py0000644000000000000000000025026712175306536015301 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.revtreeview import ( RevisionTreeView, RevNoItemDelegate, ) from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget from bzrlib.lazy_import import lazy_import from bzrlib.plugins.qbzr.lib.lazycachedrevloader import cached_revisions from bzrlib.plugins.qbzr.lib.trace import report_exception, SUB_LOAD_METHOD lazy_import(globals(), ''' import posixpath # to use '/' path sep in path.join(). from time import (strftime, localtime) from bzrlib import errors from bzrlib.workingtree import WorkingTree from bzrlib.revisiontree import RevisionTree from bzrlib.osutils import file_kind, minimum_path_selection from bzrlib.conflicts import TextConflict, resolve from bzrlib.plugins.qbzr.lib.cat import QBzrCatWindow, QBzrViewWindow, cat_to_native_app from bzrlib.plugins.qbzr.lib.annotate import AnnotateWindow from bzrlib.plugins.qbzr.lib.log import LogWindow from bzrlib.plugins.qbzr.lib.util import ( get_set_encoding, get_summary, get_apparent_author_name, ) from bzrlib.plugins.qbzr.lib.subprocess import SimpleSubProcessDialog from bzrlib.plugins.qbzr.lib.diff import ( show_diff, has_ext_diff, ExtDiffMenu, InternalWTDiffArgProvider, ) ''') def dict_set_add(dict, key, value): if key in dict: dict[key].add(value) else: dict[key] = set((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 expaned, 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 lp = len(parent_paths) for i, dir_path in enumerate(parent_paths): depth = lp - 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 it's decendents""" paths_deep_first = sorted(all_paths_expanded.itervalues(), key=lambda x: -x[1]) def set_dir_as_container(path): decendents = all_paths_expanded[path][2] container_dirs[path] = decendents dir_path = path while dir_path: dir_path, name = os.path.split(dir_path) ans_decendents = all_paths_expanded[dir_path][2] old_len = len(ans_decendents) ans_decendents.difference_update(decendents) if len(ans_decendents) < old_len: ans_decendents.add(path) # directories included in the original paths container. for path, depth, decendents in paths_deep_first: if len(decendents)>0 and (path in paths): set_dir_as_container(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_ansestor_with_others = False dir_path = path while dir_path: dir_path, name = os.path.split(dir_path) if len_decendents" % (self.__class__.__name__, self.name, self.kind) revision = property(lambda self:None) class ModelItemData(object): __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 ChangeDesc(tuple): """Helper class that "knows" about internals of iter_changes' changed entry description tuple, and provides additional helper methods. iter_changes return tuple with info about changed entry: [0]: file_id -> ascii string [1]: paths -> 2-tuple (old, new) fullpaths unicode/None [2]: changed_content -> bool [3]: versioned -> 2-tuple (bool, bool) [4]: parent -> 2-tuple [5]: name -> 2-tuple (old_name, new_name) utf-8?/None [6]: kind -> 2-tuple (string/None, string/None) [7]: executable -> 2-tuple (bool/None, bool/None) --optional-- [8]: ignore_pattern -> If the file name matches ignore pattern then this value holds corresponding pattern, otherwise None. NOTE: None value used for non-existing entry in corresponding tree, e.g. for added/deleted/ignored/unversioned """ # XXX We should may be try get this into bzrlib. # XXX We should use this in qdiff. def fileid(desc): return desc[0] def path(desc): """Return a suitable entry for a 'specific_files' param to bzr functions.""" oldpath, newpath = desc[1] return newpath or oldpath def oldpath(desc): """Return oldpath for renames.""" return desc[1][0] def kind(desc): oldkind, newkind = desc[6] return newkind or oldkind def is_versioned(desc): return desc[3] != (False, False) def is_modified(desc): return (desc[3] != (False, False) and desc[2]) def is_renamed(desc): return (desc[3] == (True, True) and (desc[4][0], desc[5][0]) != (desc[4][1], desc[5][1])) def is_tree_root(desc): """Check if entry actually tree root.""" if desc[3] != (False, False) and desc[4] == (None, None): # TREE_ROOT has no parents (desc[4]). # But because we could want to see unversioned files # we need to check for versioned flag (desc[3]) return True return False def is_missing(desc): """Check if file was present in previous revision but now it's gone (i.e. deleted manually, without invoking `bzr remove` command) """ return (desc[3] == (True, True) and desc[6][1] is None) def is_on_disk(desc): """Is the file or folder actualy on the disk""" return desc[6][1] is not None def is_misadded(desc): """Check if file was added to the working tree but then gone (i.e. deleted manually, without invoking `bzr remove` command) """ return (desc[3] == (False, True) and desc[6][1] is None) def is_ignored(desc): """Returns ignore pattern if file is ignored; None if none pattern match; False is there is pattern but file actually versioned. """ if len(desc) > 8: # ignored is when file match ignore pattern and not versioned return desc[8] and desc[3] == (False, False) else: return None def status(desc): if len(desc) == 8: (file_id, (path_in_source, path_in_target), changed_content, versioned, parent, name, kind, executable) = desc is_ignored = None elif len(desc) == 9: (file_id, (path_in_source, path_in_target), changed_content, versioned, parent, name, kind, executable, is_ignored) = desc else: raise RuntimeError, "Unkown number of items to unpack." if versioned == (False, False): if is_ignored: return gettext("ignored") else: return gettext("non-versioned") elif versioned == (False, True): if kind[1] is None: return gettext("added, missing") else: return gettext("added") elif versioned == (True, False): return gettext("removed") elif kind[0] is not None and kind[1] is None: return gettext("missing") else: # versioned = True, True - so either renamed or modified # or properties changed (x-bit). mod_strs = [] if parent[0] != parent[1]: mod_strs.append(gettext("moved")) if name[0] != name[1]: mod_strs.append(gettext("renamed")) if changed_content: mod_strs.append(gettext("modified")) if executable[0] != executable[1]: mod_strs.append(gettext("x-bit")) return ", ".join(mod_strs) class TreeModel(QtCore.QAbstractItemModel): HEADER_LABELS = [gettext("File Name"), gettext("Date"), gettext("Rev"), gettext("Message"), gettext("Author"), gettext("Status")] NAME, DATE, REVNO, MESSAGE, AUTHOR, STATUS = range(len(HEADER_LABELS)) def __init__(self, parent=None): # XXX parent object: instance of what class it supposed to be? QtCore.QAbstractTableModel.__init__(self, parent) 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 QModelIndex and the latter does not have style() style = parent.style() self.file_icon = style.standardIcon(QtGui.QStyle.SP_FileIcon) self.dir_icon = style.standardIcon(QtGui.QStyle.SP_DirIcon) self.symlink_icon = style.standardIcon(QtGui.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 = QtGui.QFileIconProvider() self.parent_view = parent self._index_cache = {} self.set_select_all_kind() def set_tree(self, tree, branch=None, changes_mode=False, want_unversioned=True, initial_checked_paths=None, change_load_filter=None, load_dirs=None): self.tree = tree self.branch = branch self.revno_map = None self.changes_mode = changes_mode self.change_load_filter = change_load_filter self.emit(QtCore.SIGNAL("layoutAboutToBeChanged()")) 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): tree.lock_read() try: root_id = self.tree.get_root_id() basis_tree = self.tree.basis_tree() basis_tree.lock_read() try: for change in self.tree.iter_changes(basis_tree, want_unversioned=want_unversioned): change = ChangeDesc(change) path = change.path() fileid = change.fileid() if fileid == root_id: continue is_ignored = self.tree.is_ignored(path) change = ChangeDesc(change+(is_ignored,)) if (self.change_load_filter is not None and not self.change_load_filter(change)): continue item = InternalItem("", change.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 errors.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(fileid) 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 def get_name(dir_fileid, dir_path, path, change): 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.fileid()) 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 if changes_mode: self.unver_by_parent = group_large_dirs( frozenset(self.inventory_data_by_path.iterkeys())) # Add items for directories added for path in self.unver_by_parent.iterkeys(): 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.iteritems(): dir_fileid = self.tree.path2id(dir_path) for path in decendents: item_data = self.inventory_data_by_path[path] item_data.item.name = get_name( dir_fileid, dir_path, path, item_data.change) else: # record the unversioned items for item_data in self.inventory_data_by_path.itervalues() : 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.itervalues(): dir_path, name = os.path.split(item_data.path) dir_fileid = self.tree.path2id(dir_path) item_data.item.name = get_name( dir_fileid, dir_path, item_data.path, item_data.change) finally: basis_tree.unlock() self.process_tree(self.working_tree_get_children, initial_checked_paths, load_dirs) finally: tree.unlock() else: self.process_tree(self.revision_tree_get_children, initial_checked_paths, load_dirs) self.emit(QtCore.SIGNAL("layoutChanged()")) def revision_tree_get_children(self, item_data): for child_id in self.tree.iter_children(item_data.item.file_id): child = self._get_entry(self.tree, child_id) path = self.tree.id2path(child_id) yield ModelItemData(path, item=child) def working_tree_get_children(self, item_data): item = item_data.item 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) 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) for child_id in self.tree.iter_children(item.file_id): if child_id in self.inventory_data_by_id: child_item_data = self.inventory_data_by_id[child_id] else: path = self.tree.id2path(child_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_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] _many_loaddirs_started = False _many_loaddirs_should_start = False def start_maybe_many_loaddirs(self): self._many_loaddirs_should_start = True def end_maybe_many_loaddirs(self): self._many_loaddirs_should_start = False if self._many_loaddirs_started: self._many_loaddirs_started = False self.tree.unlock() def load_dir(self, dir_id): if dir_id>=len(self.inventory_data): return 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 try: dir_item.children_ids = [] children = sorted(self.get_children(dir_item), 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): for _, entry in tree.iter_entries_by_dir([file_id]): return entry raise errors.NoSuchId(tree, file_id) def process_tree(self, get_children, initial_checked_paths, load_dirs): self.get_children = get_children root_item = ModelItemData( '', item=self._get_entry(self.tree, self.tree.get_root_id())) 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: self.setData(self._index_from_id(root_id,self.NAME), QtCore.QVariant(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.emit(QtCore.SIGNAL("dataChanged(QModelIndex, QModelIndex)"), index,index) def columnCount(self, parent): return len(self.HEADER_LABELS) def rowCount(self, parent): #if 0: parent = QtCore.QModelIndex() 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 setData(self, index, value, role): if index.column() == self.NAME and role == QtCore.Qt.CheckStateRole: def set_checked(item_data, checked, emit=True): old_checked = item_data.checked item_data.checked = checked return not old_checked == checked value = value.toInt()[0] if index.internalId() >= len(self.inventory_data): return False item_data = self.inventory_data[index.internalId()] first_index = self._index_from_id(item_data.id, self.NAME) set_checked(item_data, value) # this is an array so that it is a poormans nonlocal # http://www.python.org/dev/peps/pep-3104/ last_item_data = [None] # Recursively set all children to checked. def set_child_checked_recurse(item_data): if (item_data.children_ids is None and 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) last_item_data[0] = child if lookat_children: has_children_changed = set_child_checked_recurse(child) else: has_children_changed = False if (change or has_children_changed): have_changed_item = True set_checked(child, value, False) return have_changed_item self.start_maybe_many_loaddirs() try: set_child_checked_recurse(item_data) finally: self.end_maybe_many_loaddirs() if last_item_data[0]: last_index = self._index_from_id(last_item_data[0].id, self.NAME) else: last_index = first_index self.emit(QtCore.SIGNAL("dataChanged(QModelIndex, QModelIndex)"), first_index,last_index) # Walk up the tree, and update every dir parent_data = item_data 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 set_checked(parent_data, checked): index = self._index_from_id(parent_data.id, self.NAME) self.emit(QtCore.SIGNAL("dataChanged(QModelIndex, QModelIndex)"), index,index) return True if index.column() == self.NAME and role == QtCore.Qt.EditRole: if not isinstance(self.tree, WorkingTree): return False # Rename value = unicode(value.toString()) 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, errors.NoSuchFile): pass return True return False REVID = QtCore.Qt.UserRole + 1 FILEID = QtCore.Qt.UserRole + 2 PATH = QtCore.Qt.UserRole + 3 def data(self, index, role): if not index.isValid(): return QtCore.QVariant() if role >= QtCore.Qt.FontRole and role <= QtCore.Qt.TextColorRole: return QtCore.QVariant() item_data = self.inventory_data[index.internalId()] item = item_data.item if role == self.FILEID: return QtCore.QVariant(QtCore.QByteArray(item.file_id)) column = index.column() if column == self.NAME: if role == QtCore.Qt.DisplayRole: return QtCore.QVariant(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 QtCore.QVariant(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 = QtCore.QVariant(self.missing_icon) elif isinstance(self.tree, WorkingTree): abspath = self.tree.abspath(item_data.path) info = QtCore.QFileInfo(abspath) item_data.icon = \ QtCore.QVariant(self.icon_provider.icon(info)) else: if item.kind == "file": item_data.icon = QtCore.QVariant(self.file_icon) if item.kind == "directory": item_data.icon = QtCore.QVariant(self.dir_icon) if item.kind == "symlink": item_data.icon = QtCore.QVariant(self.symlink_icon) if item_data.icon is None: item_data.icon = QtCore.QVariant() return item_data.icon if role == QtCore.Qt.CheckStateRole: if not self.checkable: return QtCore.QVariant() else: return QtCore.QVariant(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 QtCore.QVariant(", ".join(status)) revid = item_data.item.revision if role == self.REVID: if revid is None: return QtCore.QVariant() else: return QtCore.QVariant(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 QtCore.QVariant( ".".join(["%d" % (revno) for revno in revno_sequence])) else: return QtCore.QVariant("") if role == QtCore.Qt.DisplayRole: if revid in cached_revisions: rev = cached_revisions[revid] if column == self.AUTHOR: return QtCore.QVariant(get_apparent_author_name(rev)) if column == self.MESSAGE: return QtCore.QVariant(get_summary(rev)) if column == self.DATE: return QtCore.QVariant(strftime("%Y-%m-%d %H:%M", localtime(rev.timestamp))) if role == self.PATH: return QtCore.QVariant(item_data.path) if role == QtCore.Qt.DisplayRole: return QtCore.QVariant("") return QtCore.QVariant() 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 id = index.internalId() if 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 QtCore.QVariant(self.HEADER_LABELS[section]) return QtCore.QVariant() 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.emit(QtCore.SIGNAL("dataChanged(QModelIndex, QModelIndex)"), self.createIndex (item_data.row, self.DATE, item_data.id), self.createIndex (item_data.row, self.AUTHOR, item_data.id)) def get_repo(self): return self.branch.repository def item2ref(self, 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 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 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 dict or dict[key].id is None: # Try loading the parents for parent_key in iter_parents(): if parent_key in dict: self.load_dir(dict[parent_key].id) if key not in dict: raise errors.NoSuchFile(ref.path) return self._index_from_id(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, errors.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 i0 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): self.tree.lock_read() try: abspath = self.tree.abspath(item.path) finally: self.tree.unlock() 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 = str(index.data(self.tree_model.FILEID).toByteArray()) path = unicode(index.data(self.tree_model.PATH).toString()) if isinstance(file_id, unicode): 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 = QtGui.QMessageBox.question(self, gettext("Revert"), gettext("Do you really want to revert the selected file(s)?"), QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) if res == QtGui.QMessageBox.Yes: try: self.tree.lock_write() try: self.tree.revert(paths, self.tree.basis_tree()) finally: self.tree.unlock() 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,) # 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: res = QtGui.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?"), QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) if res == QtGui.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(QtGui.QCheckBox): def __init__(self, tree_widget, parent=None): QtGui.QCheckBox.__init__(self, gettext("Select / deselect all"), parent) self.tree_widget = tree_widget #self.setTristate(True) self.connect(tree_widget.tree_model, QtCore.SIGNAL("dataChanged(QModelIndex, QModelIndex)"), self.on_data_changed) self.connect(self, QtCore.SIGNAL("clicked(bool)"), 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.toInt()[0])) def clicked(self, state): model = self.tree_widget.tree_model root_index = model._index_from_id(0, model.NAME) if state: state = QtCore.QVariant(QtCore.Qt.Checked) else: state = QtCore.QVariant(QtCore.Qt.Unchecked) model.setData(root_index, QtCore.QVariant(state), QtCore.Qt.CheckStateRole) qbzr/lib/ui_bookmark.py0000644000000000000000000000433512175306536015431 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/bookmark.ui' # # Created: Thu Sep 18 20:58:12 2008 # by: PyQt4 UI code generator 4.4.2 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext class Ui_BookmarkDialog(object): def setupUi(self, BookmarkDialog): BookmarkDialog.setObjectName("BookmarkDialog") BookmarkDialog.resize(354, 90) self.vboxlayout = QtGui.QVBoxLayout(BookmarkDialog) self.vboxlayout.setObjectName("vboxlayout") self.gridlayout = QtGui.QGridLayout() self.gridlayout.setObjectName("gridlayout") self.label = QtGui.QLabel(BookmarkDialog) self.label.setObjectName("label") self.gridlayout.addWidget(self.label, 0, 0, 1, 1) self.name = QtGui.QLineEdit(BookmarkDialog) self.name.setObjectName("name") self.gridlayout.addWidget(self.name, 0, 1, 1, 1) self.label_2 = QtGui.QLabel(BookmarkDialog) self.label_2.setObjectName("label_2") self.gridlayout.addWidget(self.label_2, 1, 0, 1, 1) self.location = QtGui.QLineEdit(BookmarkDialog) self.location.setObjectName("location") self.gridlayout.addWidget(self.location, 1, 1, 1, 1) self.vboxlayout.addLayout(self.gridlayout) spacerItem = QtGui.QSpacerItem(336, 16, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem) self.buttonBox = QtGui.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) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), BookmarkDialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), BookmarkDialog.reject) QtCore.QMetaObject.connectSlotsByName(BookmarkDialog) def retranslateUi(self, BookmarkDialog): self.label.setText(gettext("&Name:")) self.label_2.setText(gettext("&Location:")) qbzr/lib/ui_branch.py0000644000000000000000000001316312175306536015060 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/branch.ui' # # Created: Wed Mar 23 17:07:09 2011 # by: PyQt4 UI code generator 4.8.2 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_BranchForm(object): def setupUi(self, BranchForm): BranchForm.setObjectName(_fromUtf8("BranchForm")) BranchForm.resize(349, 245) self.verticalLayout = QtGui.QVBoxLayout(BranchForm) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.groupBox = QtGui.QGroupBox(BranchForm) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.formLayout = QtGui.QFormLayout(self.groupBox) self.formLayout.setFieldGrowthPolicy(QtGui.QFormLayout.AllNonFixedFieldsGrow) self.formLayout.setObjectName(_fromUtf8("formLayout")) self.from_label = QtGui.QLabel(self.groupBox) self.from_label.setObjectName(_fromUtf8("from_label")) self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.from_label) self.horizontalLayout_2 = QtGui.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.from_location = QtGui.QComboBox(self.groupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.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(QtGui.QComboBox.AdjustToContentsOnFirstShow) self.from_location.setObjectName(_fromUtf8("from_location")) self.horizontalLayout_2.addWidget(self.from_location) self.from_picker = QtGui.QPushButton(self.groupBox) self.from_picker.setObjectName(_fromUtf8("from_picker")) self.horizontalLayout_2.addWidget(self.from_picker) self.horizontalLayout_2.setStretch(0, 1) self.formLayout.setLayout(0, QtGui.QFormLayout.FieldRole, self.horizontalLayout_2) self.to_label = QtGui.QLabel(self.groupBox) self.to_label.setObjectName(_fromUtf8("to_label")) self.formLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.to_label) self.horizontalLayout_3 = QtGui.QHBoxLayout() self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) self.to_location = QtGui.QComboBox(self.groupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.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(QtGui.QComboBox.AdjustToContentsOnFirstShow) self.to_location.setObjectName(_fromUtf8("to_location")) self.horizontalLayout_3.addWidget(self.to_location) self.to_picker = QtGui.QPushButton(self.groupBox) self.to_picker.setObjectName(_fromUtf8("to_picker")) self.horizontalLayout_3.addWidget(self.to_picker) self.horizontalLayout_3.setStretch(0, 1) self.formLayout.setLayout(1, QtGui.QFormLayout.FieldRole, self.horizontalLayout_3) self.verticalLayout.addWidget(self.groupBox) self.groupBox_2 = QtGui.QGroupBox(BranchForm) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) self.verticalLayout_2 = QtGui.QVBoxLayout(self.groupBox_2) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.bind = QtGui.QCheckBox(self.groupBox_2) self.bind.setObjectName(_fromUtf8("bind")) self.verticalLayout_2.addWidget(self.bind) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.revision_label = QtGui.QLabel(self.groupBox_2) self.revision_label.setObjectName(_fromUtf8("revision_label")) self.horizontalLayout.addWidget(self.revision_label) self.revision = QtGui.QLineEdit(self.groupBox_2) self.revision.setObjectName(_fromUtf8("revision")) self.horizontalLayout.addWidget(self.revision) spacerItem = QtGui.QSpacerItem(78, 37, QtGui.QSizePolicy.Expanding, QtGui.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) QtCore.QObject.connect(BranchForm, QtCore.SIGNAL(_fromUtf8("disableUi(bool)")), self.groupBox.setDisabled) QtCore.QMetaObject.connectSlotsByName(BranchForm) def retranslateUi(self, BranchForm): BranchForm.setWindowTitle(gettext("Branch")) self.groupBox.setTitle(gettext("Locations")) self.from_label.setText(gettext("&From:")) self.from_picker.setText(gettext("Browse...")) self.to_label.setText(gettext("&To:")) self.to_picker.setText(gettext("Browse...")) self.groupBox_2.setTitle(gettext("Options")) self.bind.setText(gettext("Bind new branch to parent location")) self.revision_label.setText(gettext("&Revision:")) qbzr/lib/ui_info.py0000644000000000000000000001127512175306536014560 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/info.ui' # # Created: Wed May 11 11:25:59 2011 # by: PyQt4 UI code generator 4.8.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_InfoForm(object): def setupUi(self, InfoForm): InfoForm.setObjectName(_fromUtf8("InfoForm")) InfoForm.resize(579, 266) self.verticalLayout = QtGui.QVBoxLayout(InfoForm) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.label_2 = QtGui.QLabel(InfoForm) self.label_2.setObjectName(_fromUtf8("label_2")) self.horizontalLayout.addWidget(self.label_2) self.local_location = QtGui.QLabel(InfoForm) self.local_location.setWordWrap(False) self.local_location.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByKeyboard|QtCore.Qt.TextSelectableByMouse) self.local_location.setObjectName(_fromUtf8("local_location")) self.horizontalLayout.addWidget(self.local_location) spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.verticalLayout.addLayout(self.horizontalLayout) self.tabWidget = QtGui.QTabWidget(InfoForm) self.tabWidget.setObjectName(_fromUtf8("tabWidget")) self.tab_basic = QtGui.QWidget() self.tab_basic.setObjectName(_fromUtf8("tab_basic")) self.verticalLayout_5 = QtGui.QVBoxLayout(self.tab_basic) self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5")) self.frame = QtGui.QFrame(self.tab_basic) self.frame.setFrameShape(QtGui.QFrame.NoFrame) self.frame.setFrameShadow(QtGui.QFrame.Plain) self.frame.setLineWidth(1) self.frame.setObjectName(_fromUtf8("frame")) self.verticalLayout_3 = QtGui.QVBoxLayout(self.frame) self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) self.basic_info = QtGui.QLabel(self.frame) self.basic_info.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.basic_info.setObjectName(_fromUtf8("basic_info")) self.verticalLayout_3.addWidget(self.basic_info) self.verticalLayout_5.addWidget(self.frame) self.tabWidget.addTab(self.tab_basic, _fromUtf8("")) self.tab_detailed = QtGui.QWidget() self.tab_detailed.setObjectName(_fromUtf8("tab_detailed")) self.verticalLayout_6 = QtGui.QVBoxLayout(self.tab_detailed) self.verticalLayout_6.setObjectName(_fromUtf8("verticalLayout_6")) self.scrollArea = QtGui.QScrollArea(self.tab_detailed) self.scrollArea.setFrameShape(QtGui.QFrame.NoFrame) self.scrollArea.setFrameShadow(QtGui.QFrame.Plain) self.scrollArea.setLineWidth(1) self.scrollArea.setWidgetResizable(True) self.scrollArea.setObjectName(_fromUtf8("scrollArea")) self.scrollAreaWidgetContents = QtGui.QWidget(self.scrollArea) self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 539, 179)) self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents")) self.verticalLayout_2 = QtGui.QVBoxLayout(self.scrollAreaWidgetContents) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.detailed_info = QtGui.QLabel(self.scrollAreaWidgetContents) self.detailed_info.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.detailed_info.setObjectName(_fromUtf8("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, _fromUtf8("")) self.verticalLayout.addWidget(self.tabWidget) self.retranslateUi(InfoForm) self.tabWidget.setCurrentIndex(1) QtCore.QMetaObject.connectSlotsByName(InfoForm) def retranslateUi(self, InfoForm): self.label_2.setText(gettext("Location:")) self.local_location.setText(gettext("...")) self.basic_info.setText(gettext("Info")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_basic), gettext("&Basic")) self.detailed_info.setText(gettext("Info")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_detailed), gettext("&Detailed")) qbzr/lib/ui_init.py0000644000000000000000000002152712175306536014571 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/init.ui' # # Created: Thu Jul 30 12:22:19 2009 # by: PyQt4 UI code generator 4.4.3 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext class Ui_InitForm(object): def setupUi(self, InitForm): InitForm.setObjectName("InitForm") InitForm.resize(417, 351) self.verticalLayout = QtGui.QVBoxLayout(InitForm) self.verticalLayout.setMargin(9) self.verticalLayout.setObjectName("verticalLayout") self.groupBox_3 = QtGui.QGroupBox(InitForm) self.groupBox_3.setObjectName("groupBox_3") self.horizontalLayout = QtGui.QHBoxLayout(self.groupBox_3) self.horizontalLayout.setObjectName("horizontalLayout") self.location = QtGui.QLineEdit(self.groupBox_3) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.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 = QtGui.QPushButton(self.groupBox_3) self.location_picker.setObjectName("location_picker") self.horizontalLayout.addWidget(self.location_picker) self.verticalLayout.addWidget(self.groupBox_3) self.groupBox = QtGui.QGroupBox(InitForm) self.groupBox.setObjectName("groupBox") self.verticalLayout_3 = QtGui.QVBoxLayout(self.groupBox) self.verticalLayout_3.setObjectName("verticalLayout_3") self.but_init = QtGui.QRadioButton(self.groupBox) self.but_init.setChecked(True) self.but_init.setObjectName("but_init") self.verticalLayout_3.addWidget(self.but_init) self.horizontalLayout_3 = QtGui.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") spacerItem = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem) self.but_append_only = QtGui.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 = QtGui.QRadioButton(self.groupBox) self.radioButton_2.setObjectName("radioButton_2") self.verticalLayout_3.addWidget(self.radioButton_2) self.horizontalLayout_4 = QtGui.QHBoxLayout() self.horizontalLayout_4.setObjectName("horizontalLayout_4") spacerItem1 = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) self.horizontalLayout_4.addItem(spacerItem1) self.but_no_trees = QtGui.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 = QtGui.QLabel(self.groupBox) self.link_help.setObjectName("link_help") self.verticalLayout_3.addWidget(self.link_help) self.horizontalLayout_2 = QtGui.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.label = QtGui.QLabel(self.groupBox) self.label.setObjectName("label") self.horizontalLayout_2.addWidget(self.label) self.combo_format = QtGui.QComboBox(self.groupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.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 = QtGui.QScrollArea(self.groupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.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 = QtGui.QWidget(self.scrollArea) self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 377, 60)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.verticalLayout_2 = QtGui.QVBoxLayout(self.scrollAreaWidgetContents) self.verticalLayout_2.setMargin(4) self.verticalLayout_2.setObjectName("verticalLayout_2") self.format_desc = QtGui.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 = QtGui.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) QtCore.QObject.connect(self.link_help, QtCore.SIGNAL("linkActivated(QString)"), InitForm.linkActivated) QtCore.QObject.connect(self.link_help_formats, QtCore.SIGNAL("linkActivated(QString)"), InitForm.linkActivated) QtCore.QObject.connect(InitForm, QtCore.SIGNAL("disableUi(bool)"), self.groupBox_3.setDisabled) QtCore.QObject.connect(InitForm, QtCore.SIGNAL("disableUi(bool)"), self.groupBox.setDisabled) QtCore.QObject.connect(self.but_init, QtCore.SIGNAL("toggled(bool)"), self.but_append_only.setEnabled) QtCore.QObject.connect(self.radioButton_2, QtCore.SIGNAL("toggled(bool)"), self.but_no_trees.setEnabled) QtCore.QMetaObject.connectSlotsByName(InitForm) def retranslateUi(self, InitForm): InitForm.setWindowTitle(gettext("Initialize")) self.groupBox_3.setTitle(gettext("Local Directory")) self.location_picker.setText(gettext("Browse...")) self.groupBox.setTitle(gettext("Repository")) self.but_init.setText(gettext("Create a new standalone tree")) self.but_append_only.setText(gettext("Ensure all revisions are appended to the log")) self.radioButton_2.setText(gettext("Create a new shared repository")) self.but_no_trees.setText(gettext("Skip the creation of working trees in this repository")) self.link_help.setText(QtGui.QApplication.translate("InitForm", "\n" "\n" "

Tell me more about standalone trees, repositories and branches.

", None, QtGui.QApplication.UnicodeUTF8)) self.label.setText(gettext("Repository Format:")) self.format_desc.setText(gettext("Description of format")) self.link_help_formats.setText(QtGui.QApplication.translate("InitForm", "\n" "\n" "

More information about repository formats.

", None, QtGui.QApplication.UnicodeUTF8)) qbzr/lib/ui_merge.py0000644000000000000000000000643712175306536014730 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/merge.ui' # # Created: Tue Aug 18 15:10:52 2009 # by: PyQt4 UI code generator 4.4.4 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext class Ui_MergeForm(object): def setupUi(self, MergeForm): MergeForm.setObjectName("MergeForm") MergeForm.resize(448, 248) self.verticalLayout = QtGui.QVBoxLayout(MergeForm) self.verticalLayout.setMargin(9) self.verticalLayout.setObjectName("verticalLayout") self.groupBox = QtGui.QGroupBox(MergeForm) self.groupBox.setObjectName("groupBox") self.gridLayout = QtGui.QGridLayout(self.groupBox) self.gridLayout.setObjectName("gridLayout") self.label_4 = QtGui.QLabel(self.groupBox) self.label_4.setObjectName("label_4") self.gridLayout.addWidget(self.label_4, 0, 0, 1, 1) self.location = QtGui.QComboBox(self.groupBox) self.location.setEditable(True) self.location.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToMinimumContentsLength) self.location.setObjectName("location") self.gridLayout.addWidget(self.location, 0, 1, 1, 2) self.location_picker = QtGui.QPushButton(self.groupBox) self.location_picker.setObjectName("location_picker") self.gridLayout.addWidget(self.location_picker, 0, 3, 1, 1) self.label_3 = QtGui.QLabel(self.groupBox) self.label_3.setObjectName("label_3") self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) self.revision = QtGui.QLineEdit(self.groupBox) self.revision.setObjectName("revision") self.gridLayout.addWidget(self.revision, 1, 1, 1, 1) spacerItem = QtGui.QSpacerItem(107, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem, 1, 2, 1, 2) self.remember = QtGui.QCheckBox(self.groupBox) self.remember.setObjectName("remember") self.gridLayout.addWidget(self.remember, 2, 0, 1, 4) self.force = QtGui.QCheckBox(self.groupBox) self.force.setObjectName("force") self.gridLayout.addWidget(self.force, 3, 0, 1, 4) self.uncommitted = QtGui.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) QtCore.QObject.connect(MergeForm, QtCore.SIGNAL("disableUi(bool)"), self.groupBox.setDisabled) QtCore.QMetaObject.connectSlotsByName(MergeForm) def retranslateUi(self, MergeForm): MergeForm.setWindowTitle(gettext("Merge")) self.groupBox.setTitle(gettext("Options")) self.label_4.setText(gettext("&Location:")) self.location_picker.setText(gettext("Browse...")) self.label_3.setText(gettext("&Revision:")) self.remember.setText(gettext("Remember this location as a default")) self.force.setText(gettext("Merge even if the working tree has uncommitted changes")) self.uncommitted.setText(gettext("Merge uncommitted changes instead of committed ones")) qbzr/lib/ui_merge_config.py0000644000000000000000000000567612175306536016261 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/merge_config.ui' # # Created: Tue Dec 07 00:17:33 2010 # by: PyQt4 UI code generator 4.7.2 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext class Ui_MergeConfig(object): def setupUi(self, MergeConfig): MergeConfig.setObjectName("MergeConfig") MergeConfig.resize(544, 330) self.verticalLayout = QtGui.QVBoxLayout(MergeConfig) self.verticalLayout.setObjectName("verticalLayout") self.groupBox = QtGui.QGroupBox(MergeConfig) self.groupBox.setObjectName("groupBox") self.verticalLayout_2 = QtGui.QVBoxLayout(self.groupBox) self.verticalLayout_2.setObjectName("verticalLayout_2") self.tools = QtGui.QTableView(self.groupBox) self.tools.setSelectionBehavior(QtGui.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 = QtGui.QWidget(self.groupBox) self.widget.setObjectName("widget") self.horizontalLayout = QtGui.QHBoxLayout(self.widget) self.horizontalLayout.setObjectName("horizontalLayout") spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.add = QtGui.QPushButton(self.widget) self.add.setObjectName("add") self.horizontalLayout.addWidget(self.add) self.remove = QtGui.QPushButton(self.widget) self.remove.setObjectName("remove") self.horizontalLayout.addWidget(self.remove) self.set_default = QtGui.QPushButton(self.widget) self.set_default.setObjectName("set_default") self.horizontalLayout.addWidget(self.set_default) spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.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): MergeConfig.setWindowTitle(gettext("Form")) self.groupBox.setTitle(gettext("External Merge Tools")) self.add.setText(gettext("Add")) self.remove.setText(gettext("Remove")) self.set_default.setToolTip(gettext("Sets the selected merge tool as the default to use in qconflicts.")) self.set_default.setText(gettext("Set Default")) qbzr/lib/ui_new_tree.py0000644000000000000000000002737012175306536015440 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/new_tree.ui' # # Created: Thu Aug 13 20:49:03 2009 # by: PyQt4 UI code generator 4.4.3 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext class Ui_NewWorkingTreeForm(object): def setupUi(self, NewWorkingTreeForm): NewWorkingTreeForm.setObjectName("NewWorkingTreeForm") NewWorkingTreeForm.resize(479, 385) self.verticalLayout = QtGui.QVBoxLayout(NewWorkingTreeForm) self.verticalLayout.setMargin(9) self.verticalLayout.setObjectName("verticalLayout") self.groupBox = QtGui.QGroupBox(NewWorkingTreeForm) self.groupBox.setObjectName("groupBox") self.gridLayout = QtGui.QGridLayout(self.groupBox) self.gridLayout.setObjectName("gridLayout") self.label_4 = QtGui.QLabel(self.groupBox) self.label_4.setObjectName("label_4") self.gridLayout.addWidget(self.label_4, 0, 0, 1, 2) self.from_location = QtGui.QComboBox(self.groupBox) self.from_location.setEditable(True) self.from_location.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToMinimumContentsLength) self.from_location.setObjectName("from_location") self.gridLayout.addWidget(self.from_location, 1, 0, 1, 1) self.from_picker = QtGui.QPushButton(self.groupBox) self.from_picker.setObjectName("from_picker") self.gridLayout.addWidget(self.from_picker, 1, 1, 1, 1) self.label = QtGui.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 = QtGui.QLineEdit(self.groupBox) self.to_location.setObjectName("to_location") self.gridLayout.addWidget(self.to_location, 3, 0, 1, 1) self.to_picker = QtGui.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 = QtGui.QGroupBox(NewWorkingTreeForm) self.groupBox_3.setObjectName("groupBox_3") self.gridLayout_2 = QtGui.QGridLayout(self.groupBox_3) self.gridLayout_2.setObjectName("gridLayout_2") self.but_checkout = QtGui.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 = QtGui.QSpacerItem(18, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) self.gridLayout_2.addItem(spacerItem, 1, 0, 1, 1) self.but_lightweight = QtGui.QCheckBox(self.groupBox_3) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.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 = QtGui.QRadioButton(self.groupBox_3) self.but_branch.setObjectName("but_branch") self.gridLayout_2.addWidget(self.but_branch, 2, 0, 1, 2) spacerItem1 = QtGui.QSpacerItem(18, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) self.gridLayout_2.addItem(spacerItem1, 3, 0, 1, 1) self.but_stacked = QtGui.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 = QtGui.QLabel(self.groupBox_3) font = QtGui.QFont() font.setUnderline(True) self.link_help.setFont(font) self.link_help.setCursor(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 = QtGui.QGroupBox(NewWorkingTreeForm) self.groupBox_2.setObjectName("groupBox_2") self.gridLayout_3 = QtGui.QGridLayout(self.groupBox_2) self.gridLayout_3.setObjectName("gridLayout_3") self.but_rev_tip = QtGui.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 = QtGui.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 = QtGui.QLineEdit(self.groupBox_2) self.revision.setEnabled(False) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.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 = QtGui.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 = QtGui.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) QtCore.QObject.connect(self.link_help, QtCore.SIGNAL("linkActivated(QString)"), NewWorkingTreeForm.linkActivated) QtCore.QObject.connect(self.link_help_revisions, QtCore.SIGNAL("linkActivated(QString)"), NewWorkingTreeForm.linkActivated) QtCore.QObject.connect(self.but_checkout, QtCore.SIGNAL("toggled(bool)"), self.but_lightweight.setEnabled) QtCore.QObject.connect(self.but_branch, QtCore.SIGNAL("toggled(bool)"), self.but_stacked.setEnabled) QtCore.QObject.connect(self.but_rev_specific, QtCore.SIGNAL("toggled(bool)"), self.revision.setEnabled) QtCore.QObject.connect(NewWorkingTreeForm, QtCore.SIGNAL("disableUi(bool)"), self.groupBox.setDisabled) QtCore.QObject.connect(NewWorkingTreeForm, QtCore.SIGNAL("disableUi(bool)"), self.groupBox_3.setDisabled) QtCore.QObject.connect(NewWorkingTreeForm, QtCore.SIGNAL("disableUi(bool)"), self.groupBox_2.setDisabled) QtCore.QMetaObject.connectSlotsByName(NewWorkingTreeForm) def retranslateUi(self, NewWorkingTreeForm): NewWorkingTreeForm.setWindowTitle(gettext("Create a new Bazaar Working Tree")) self.groupBox.setTitle(gettext("Branch")) self.label_4.setText(gettext("Branch source (enter a URL or select a local directory with an existing branch)")) self.from_picker.setText(gettext("Browse...")) self.label.setText(gettext("Local directory where the working tree will be created")) self.to_picker.setText(gettext("Browse...")) self.groupBox_3.setTitle(gettext("Working Tree Options")) self.but_checkout.setText(gettext("Create a checkout")) self.but_lightweight.setToolTip(QtGui.QApplication.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" "

", None, QtGui.QApplication.UnicodeUTF8)) self.but_lightweight.setText(gettext("Light-weight checkout")) self.but_branch.setText(gettext("Make a local copy of the branch")) self.but_stacked.setToolTip(QtGui.QApplication.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

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

Tell me more about checkouts and branches

", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox_2.setTitle(gettext("Revision")) self.but_rev_tip.setText(gettext("Most recent (tip) revision")) self.but_rev_specific.setText(gettext("Revision:")) self.but_show_log.setText(gettext("Show Log...")) self.link_help_revisions.setText(QtGui.QApplication.translate("NewWorkingTreeForm", "\n" "\n" "

About revision identifiers

", None, QtGui.QApplication.UnicodeUTF8)) qbzr/lib/ui_pull.py0000644000000000000000000000605412175306536014600 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/pull.ui' # # Created: Mon Oct 05 19:41:19 2009 # by: PyQt4 UI code generator 4.4.3 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext class Ui_PullForm(object): def setupUi(self, PullForm): PullForm.setObjectName("PullForm") PullForm.resize(404, 194) self.verticalLayout = QtGui.QVBoxLayout(PullForm) self.verticalLayout.setMargin(9) self.verticalLayout.setObjectName("verticalLayout") self.groupBox = QtGui.QGroupBox(PullForm) self.groupBox.setObjectName("groupBox") self.gridLayout = QtGui.QGridLayout(self.groupBox) self.gridLayout.setObjectName("gridLayout") self.label_2 = QtGui.QLabel(self.groupBox) self.label_2.setObjectName("label_2") self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) self.location = QtGui.QComboBox(self.groupBox) self.location.setEditable(True) self.location.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToMinimumContentsLength) self.location.setObjectName("location") self.gridLayout.addWidget(self.location, 0, 1, 1, 2) self.location_picker = QtGui.QPushButton(self.groupBox) self.location_picker.setObjectName("location_picker") self.gridLayout.addWidget(self.location_picker, 0, 3, 1, 1) self.label_3 = QtGui.QLabel(self.groupBox) self.label_3.setObjectName("label_3") self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) self.revision = QtGui.QLineEdit(self.groupBox) self.revision.setObjectName("revision") self.gridLayout.addWidget(self.revision, 1, 1, 1, 1) spacerItem = QtGui.QSpacerItem(211, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem, 1, 2, 1, 2) self.remember = QtGui.QCheckBox(self.groupBox) self.remember.setChecked(False) self.remember.setObjectName("remember") self.gridLayout.addWidget(self.remember, 2, 0, 1, 4) self.overwrite = QtGui.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) QtCore.QObject.connect(PullForm, QtCore.SIGNAL("disableUi(bool)"), self.groupBox.setDisabled) QtCore.QMetaObject.connectSlotsByName(PullForm) def retranslateUi(self, PullForm): PullForm.setWindowTitle(gettext("Pull")) self.groupBox.setTitle(gettext("Options")) self.label_2.setText(gettext("&Location:")) self.location_picker.setText(gettext("Browse...")) self.label_3.setText(gettext("&Revision:")) self.remember.setText(gettext("Remember this location as a default")) self.overwrite.setText(gettext("Overwrite differences between branches")) qbzr/lib/ui_push.py0000644000000000000000000000651212175306536014602 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/push.ui' # # Created: Mon Oct 05 19:41:19 2009 # by: PyQt4 UI code generator 4.4.3 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext class Ui_PushForm(object): def setupUi(self, PushForm): PushForm.setObjectName("PushForm") PushForm.resize(349, 175) self.verticalLayout = QtGui.QVBoxLayout(PushForm) self.verticalLayout.setMargin(9) self.verticalLayout.setObjectName("verticalLayout") self.groupBox = QtGui.QGroupBox(PushForm) self.groupBox.setObjectName("groupBox") self.gridLayout = QtGui.QGridLayout(self.groupBox) self.gridLayout.setObjectName("gridLayout") self.label_2 = QtGui.QLabel(self.groupBox) self.label_2.setObjectName("label_2") self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) self.location = QtGui.QComboBox(self.groupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.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(QtGui.QComboBox.AdjustToMinimumContentsLength) self.location.setObjectName("location") self.gridLayout.addWidget(self.location, 0, 1, 1, 1) self.location_picker = QtGui.QPushButton(self.groupBox) self.location_picker.setObjectName("location_picker") self.gridLayout.addWidget(self.location_picker, 0, 2, 1, 1) self.remember = QtGui.QCheckBox(self.groupBox) self.remember.setChecked(False) self.remember.setObjectName("remember") self.gridLayout.addWidget(self.remember, 1, 0, 1, 3) self.overwrite = QtGui.QCheckBox(self.groupBox) self.overwrite.setObjectName("overwrite") self.gridLayout.addWidget(self.overwrite, 2, 0, 1, 3) self.use_existing_dir = QtGui.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 = QtGui.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) QtCore.QObject.connect(PushForm, QtCore.SIGNAL("disableUi(bool)"), self.groupBox.setDisabled) QtCore.QMetaObject.connectSlotsByName(PushForm) def retranslateUi(self, PushForm): PushForm.setWindowTitle(gettext("Push")) self.groupBox.setTitle(gettext("Options")) self.label_2.setText(gettext("&Location:")) self.location_picker.setText(gettext("Browse...")) self.remember.setText(gettext("Remember this location as a default")) self.overwrite.setText(gettext("Overwrite differences between branches")) self.use_existing_dir.setText(gettext("Use existing directory")) self.create_prefix.setText(gettext("Create the path up to the branch if it does not exist")) qbzr/lib/ui_run.py0000644000000000000000000001431212175306536014424 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/run.ui' # # Created: Fri Jan 22 18:18:46 2010 # by: PyQt4 UI code generator 4.6.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext class Ui_RunDialog(object): def setupUi(self, RunDialog): RunDialog.setObjectName("RunDialog") RunDialog.resize(473, 367) self.main_v_layout = QtGui.QVBoxLayout(RunDialog) self.main_v_layout.setObjectName("main_v_layout") self.splitter = QtGui.QSplitter(RunDialog) self.splitter.setOrientation(QtCore.Qt.Vertical) self.splitter.setOpaqueResize(False) self.splitter.setChildrenCollapsible(False) self.splitter.setObjectName("splitter") self.run_container = QtGui.QGroupBox(self.splitter) self.run_container.setObjectName("run_container") self.run_container_layout = QtGui.QVBoxLayout(self.run_container) self.run_container_layout.setMargin(0) self.run_container_layout.setObjectName("run_container_layout") self.wd_layout = QtGui.QHBoxLayout() self.wd_layout.setObjectName("wd_layout") self.wd_label = QtGui.QLabel(self.run_container) self.wd_label.setObjectName("wd_label") self.wd_layout.addWidget(self.wd_label) self.wd_edit = QtGui.QLineEdit(self.run_container) self.wd_edit.setObjectName("wd_edit") self.wd_layout.addWidget(self.wd_edit) self.browse_button = QtGui.QPushButton(self.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 = QtGui.QGridLayout() self.cmd_layout.setObjectName("cmd_layout") self.cat_label = QtGui.QLabel(self.run_container) self.cat_label.setObjectName("cat_label") self.cmd_layout.addWidget(self.cat_label, 0, 0, 1, 1) self.cat_combobox = QtGui.QComboBox(self.run_container) self.cat_combobox.setMinimumSize(QtCore.QSize(170, 0)) self.cat_combobox.setObjectName("cat_combobox") self.cmd_layout.addWidget(self.cat_combobox, 0, 1, 1, 1) self.cmd_label = QtGui.QLabel(self.run_container) self.cmd_label.setObjectName("cmd_label") self.cmd_layout.addWidget(self.cmd_label, 1, 0, 1, 1) self.cmd_combobox = QtGui.QComboBox(self.run_container) self.cmd_combobox.setMinimumSize(QtCore.QSize(170, 0)) self.cmd_combobox.setEditable(True) self.cmd_combobox.setObjectName("cmd_combobox") self.cmd_layout.addWidget(self.cmd_combobox, 1, 1, 1, 1) self.hidden_checkbox = QtGui.QCheckBox(self.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 = QtGui.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 = QtGui.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 = QtGui.QHBoxLayout() self.opt_arg_btn_layout.setObjectName("opt_arg_btn_layout") self.directory_button = QtGui.QPushButton(self.run_container) self.directory_button.setObjectName("directory_button") self.opt_arg_btn_layout.addWidget(self.directory_button) self.filenames_button = QtGui.QPushButton(self.run_container) self.filenames_button.setObjectName("filenames_button") self.opt_arg_btn_layout.addWidget(self.filenames_button) spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.opt_arg_btn_layout.addItem(spacerItem) self.run_container_layout.addLayout(self.opt_arg_btn_layout) self.help_browser = QtGui.QTextBrowser(self.run_container) self.help_browser.setObjectName("help_browser") self.run_container_layout.addWidget(self.help_browser) self.subprocess_container = QtGui.QWidget(self.splitter) self.subprocess_container.setObjectName("subprocess_container") self.subprocess_container_layout = QtGui.QVBoxLayout(self.subprocess_container) self.subprocess_container_layout.setMargin(0) self.subprocess_container_layout.setObjectName("subprocess_container_layout") self.main_v_layout.addWidget(self.splitter) self.wd_label.setBuddy(self.wd_edit) self.cat_label.setBuddy(self.cmd_combobox) self.cmd_label.setBuddy(self.cmd_combobox) self.opt_arg_label.setBuddy(self.opt_arg_edit) self.retranslateUi(RunDialog) QtCore.QObject.connect(RunDialog, QtCore.SIGNAL("disableUi(bool)"), self.run_container.setDisabled) QtCore.QMetaObject.connectSlotsByName(RunDialog) RunDialog.setTabOrder(self.wd_edit, self.browse_button) RunDialog.setTabOrder(self.browse_button, self.hidden_checkbox) 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): RunDialog.setWindowTitle(gettext("Run bzr command")) self.run_container.setTitle(gettext("Options")) self.wd_label.setText(gettext("&Working directory:")) self.browse_button.setText(gettext("&Browse...")) self.cat_label.setText(gettext("C&ategory:")) self.cmd_label.setText(gettext("&Command:")) self.hidden_checkbox.setText(gettext("&Show hidden commands")) self.opt_arg_label.setText(gettext("&Options and arguments for command:")) self.directory_button.setText(gettext("Insert &directory...")) self.filenames_button.setText(gettext("Insert &filenames...")) qbzr/lib/ui_sysinfo.py0000644000000000000000000001313312175306536015312 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/sysinfo.ui' # # Created: Sat Jun 13 23:57:47 2009 # by: PyQt4 UI code generator 4.3.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(QtCore.QSize(QtCore.QRect(0,0,387,254).size()).expandedTo(MainWindow.minimumSizeHint())) self.centralwidget = QtGui.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.vboxlayout = QtGui.QVBoxLayout(self.centralwidget) self.vboxlayout.setObjectName("vboxlayout") self.bazaar_library = QtGui.QGroupBox(self.centralwidget) self.bazaar_library.setFlat(False) self.bazaar_library.setObjectName("bazaar_library") self.gridlayout = QtGui.QGridLayout(self.bazaar_library) self.gridlayout.setObjectName("gridlayout") self.label = QtGui.QLabel(self.bazaar_library) self.label.setObjectName("label") self.gridlayout.addWidget(self.label,0,0,1,1) self.bzr_version = QtGui.QLabel(self.bazaar_library) self.bzr_version.setObjectName("bzr_version") self.gridlayout.addWidget(self.bzr_version,0,1,1,1) self.label_3 = QtGui.QLabel(self.bazaar_library) self.label_3.setObjectName("label_3") self.gridlayout.addWidget(self.label_3,1,0,1,1) self.bzr_lib_path = QtGui.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 = QtGui.QGroupBox(self.centralwidget) self.bazaar_configuration.setObjectName("bazaar_configuration") self.gridlayout1 = QtGui.QGridLayout(self.bazaar_configuration) self.gridlayout1.setObjectName("gridlayout1") self.label_2 = QtGui.QLabel(self.bazaar_configuration) self.label_2.setObjectName("label_2") self.gridlayout1.addWidget(self.label_2,0,0,1,1) self.bzr_config_dir = QtGui.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 = QtGui.QLabel(self.bazaar_configuration) self.label_4.setObjectName("label_4") self.gridlayout1.addWidget(self.label_4,1,0,1,1) self.bzr_log_file = QtGui.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 = QtGui.QGroupBox(self.centralwidget) self.python_interpreter.setMinimumSize(QtCore.QSize(0,0)) self.python_interpreter.setObjectName("python_interpreter") self.gridlayout2 = QtGui.QGridLayout(self.python_interpreter) self.gridlayout2.setObjectName("gridlayout2") self.label_5 = QtGui.QLabel(self.python_interpreter) self.label_5.setObjectName("label_5") self.gridlayout2.addWidget(self.label_5,0,0,1,1) self.python_version = QtGui.QLabel(self.python_interpreter) self.python_version.setObjectName("python_version") self.gridlayout2.addWidget(self.python_version,0,1,1,1) self.label_9 = QtGui.QLabel(self.python_interpreter) self.label_9.setObjectName("label_9") self.gridlayout2.addWidget(self.label_9,1,0,1,1) self.python_file = QtGui.QLabel(self.python_interpreter) self.python_file.setObjectName("python_file") self.gridlayout2.addWidget(self.python_file,1,1,1,1) self.label_7 = QtGui.QLabel(self.python_interpreter) self.label_7.setObjectName("label_7") self.gridlayout2.addWidget(self.label_7,2,0,1,1) self.python_lib_dir = QtGui.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): MainWindow.setWindowTitle(gettext("System Information")) self.bazaar_library.setTitle(gettext("Bazaar Library")) self.label.setText(gettext("Version:")) self.bzr_version.setText(gettext("(bzr-version)")) self.label_3.setText(gettext("Path:")) self.bzr_lib_path.setText(gettext("(bzr-lib-path)")) self.bazaar_configuration.setTitle(gettext("Bazaar Configuration")) self.label_2.setText(gettext("Settings:")) self.bzr_config_dir.setText(gettext("(bzr-config-dir)")) self.label_4.setText(gettext("Log File:")) self.bzr_log_file.setText(gettext("(bzr-log-file)")) self.python_interpreter.setTitle(gettext("Python Interpreter")) self.label_5.setText(gettext("Version:")) self.python_version.setText(gettext("(python-version)")) self.label_9.setText(gettext("Path:")) self.python_file.setText(gettext("(python-file)")) self.label_7.setText(gettext("Library:")) self.python_lib_dir.setText(gettext("(python-lib-dir)")) qbzr/lib/ui_tag.py0000644000000000000000000001166512175306536014403 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/tag.ui' # # Created: Thu Jul 30 12:12:07 2009 # by: PyQt4 UI code generator 4.4.3 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.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 = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.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 = QtGui.QVBoxLayout(TagForm) self.vboxlayout.setObjectName("vboxlayout") self.branch_group = QtGui.QGroupBox(TagForm) self.branch_group.setObjectName("branch_group") self.gridlayout = QtGui.QGridLayout(self.branch_group) self.gridlayout.setObjectName("gridlayout") self.branch_location = QtGui.QLineEdit(self.branch_group) self.branch_location.setObjectName("branch_location") self.gridlayout.addWidget(self.branch_location, 0, 0, 1, 2) spacerItem = QtGui.QSpacerItem(261, 25, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gridlayout.addItem(spacerItem, 1, 0, 1, 1) self.branch_browse = QtGui.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 = QtGui.QGroupBox(TagForm) self.tag_group.setMinimumSize(QtCore.QSize(0, 0)) self.tag_group.setObjectName("tag_group") self.gridlayout1 = QtGui.QGridLayout(self.tag_group) self.gridlayout1.setObjectName("gridlayout1") self.label_action = QtGui.QLabel(self.tag_group) self.label_action.setObjectName("label_action") self.gridlayout1.addWidget(self.label_action, 0, 0, 1, 1) self.cb_action = QtGui.QComboBox(self.tag_group) self.cb_action.setObjectName("cb_action") self.cb_action.addItem(QtCore.QString()) self.cb_action.addItem(QtCore.QString()) self.cb_action.addItem(QtCore.QString()) self.gridlayout1.addWidget(self.cb_action, 0, 1, 1, 1) self.label_tag_name = QtGui.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 = QtGui.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 = QtGui.QLabel(self.tag_group) self.label_revision.setObjectName("label_revision") self.gridlayout1.addWidget(self.label_revision, 2, 0, 1, 1) self.rev_edit = QtGui.QLineEdit(self.tag_group) self.rev_edit.setObjectName("rev_edit") self.gridlayout1.addWidget(self.rev_edit, 2, 1, 1, 1) self.pick_rev = QtGui.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) QtCore.QObject.connect(TagForm, QtCore.SIGNAL("disableUi(bool)"), self.tag_group.setDisabled) QtCore.QObject.connect(TagForm, QtCore.SIGNAL("disableUi(bool)"), 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): TagForm.setWindowTitle(gettext("Edit tag")) self.branch_group.setTitle(gettext("Branch")) self.branch_browse.setText(gettext("&Browse...")) self.tag_group.setTitle(gettext("Tag")) self.label_action.setText(gettext("&Action:")) self.cb_action.setItemText(0, gettext("Create new tag")) self.cb_action.setItemText(1, gettext("Move existing tag")) self.cb_action.setItemText(2, gettext("Delete existing tag")) self.label_tag_name.setText(gettext("&Tag name:")) self.label_revision.setText(gettext("&Revision:")) self.pick_rev.setText(gettext("&Select...")) qbzr/lib/ui_update_branch.py0000644000000000000000000001216012175306536016416 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/update_branch.ui' # # Created: Thu Jul 30 12:22:19 2009 # by: PyQt4 UI code generator 4.4.3 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext class Ui_UpdateBranchForm(object): def setupUi(self, UpdateBranchForm): UpdateBranchForm.setObjectName("UpdateBranchForm") UpdateBranchForm.resize(407, 198) self.verticalLayout_3 = QtGui.QVBoxLayout(UpdateBranchForm) self.verticalLayout_3.setMargin(9) self.verticalLayout_3.setObjectName("verticalLayout_3") self.label = QtGui.QLabel(UpdateBranchForm) self.label.setScaledContents(False) self.label.setWordWrap(False) self.label.setObjectName("label") self.verticalLayout_3.addWidget(self.label) self.groupBox = QtGui.QGroupBox(UpdateBranchForm) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(1) sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth()) self.groupBox.setSizePolicy(sizePolicy) self.groupBox.setObjectName("groupBox") self.gridLayout = QtGui.QGridLayout(self.groupBox) self.gridLayout.setObjectName("gridLayout") self.location_picker = QtGui.QPushButton(self.groupBox) self.location_picker.setObjectName("location_picker") self.gridLayout.addWidget(self.location_picker, 1, 2, 1, 1) self.but_pull = QtGui.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 = QtGui.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 = QtGui.QCheckBox(self.groupBox) self.but_pull_overwrite.setObjectName("but_pull_overwrite") self.gridLayout.addWidget(self.but_pull_overwrite, 3, 1, 1, 2) spacerItem = QtGui.QSpacerItem(17, 18, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem, 3, 0, 1, 1) self.location = QtGui.QComboBox(self.groupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.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(QtGui.QComboBox.AdjustToMinimumContentsLength) self.location.setObjectName("location") self.location.addItem(QtCore.QString()) self.gridLayout.addWidget(self.location, 1, 1, 1, 1) spacerItem1 = QtGui.QSpacerItem(18, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem1, 1, 0, 1, 1) spacerItem2 = QtGui.QSpacerItem(18, 17, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem2, 2, 0, 1, 1) self.but_update = QtGui.QRadioButton(self.groupBox) self.but_update.setObjectName("but_update") self.gridLayout.addWidget(self.but_update, 4, 0, 1, 3) self.verticalLayout_3.addWidget(self.groupBox) self.retranslateUi(UpdateBranchForm) QtCore.QObject.connect(self.but_pull, QtCore.SIGNAL("toggled(bool)"), self.but_pull_remember.setEnabled) QtCore.QObject.connect(self.but_pull, QtCore.SIGNAL("toggled(bool)"), self.but_pull_overwrite.setEnabled) QtCore.QObject.connect(self.but_pull, QtCore.SIGNAL("toggled(bool)"), self.location.setEnabled) QtCore.QObject.connect(self.but_pull, QtCore.SIGNAL("toggled(bool)"), self.location_picker.setEnabled) QtCore.QObject.connect(UpdateBranchForm, QtCore.SIGNAL("disableUi(bool)"), self.label.setDisabled) QtCore.QObject.connect(UpdateBranchForm, QtCore.SIGNAL("disableUi(bool)"), self.groupBox.setDisabled) QtCore.QMetaObject.connectSlotsByName(UpdateBranchForm) def retranslateUi(self, UpdateBranchForm): UpdateBranchForm.setWindowTitle(gettext("Update Branch")) self.label.setText(gettext("This directory is a branch. Please select what you would like to update")) self.groupBox.setTitle(gettext("Update source")) self.location_picker.setText(gettext("Browse...")) self.but_pull.setText(gettext("Pull most recent changes from:")) self.but_pull_remember.setText(gettext("Remember this as the new parent branch")) self.but_pull_overwrite.setText(gettext("Overwrite differences between branches")) self.location.setItemText(0, gettext("")) self.but_update.setText(gettext("Update working tree to the latest changes in the branch")) qbzr/lib/ui_update_checkout.py0000644000000000000000000001045212175306536016770 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/update_checkout.ui' # # Created: Thu Jul 30 12:22:19 2009 # by: PyQt4 UI code generator 4.4.3 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext class Ui_UpdateCheckoutForm(object): def setupUi(self, UpdateCheckoutForm): UpdateCheckoutForm.setObjectName("UpdateCheckoutForm") UpdateCheckoutForm.resize(317, 170) self.verticalLayout = QtGui.QVBoxLayout(UpdateCheckoutForm) self.verticalLayout.setMargin(9) self.verticalLayout.setObjectName("verticalLayout") self.label = QtGui.QLabel(UpdateCheckoutForm) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.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 = QtGui.QGroupBox(UpdateCheckoutForm) self.groupBox.setObjectName("groupBox") self.gridLayout = QtGui.QGridLayout(self.groupBox) self.gridLayout.setObjectName("gridLayout") self.but_update = QtGui.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 = QtGui.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 = QtGui.QSpacerItem(18, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem, 2, 0, 1, 1) self.location = QtGui.QComboBox(self.groupBox) self.location.setEnabled(False) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.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(QtGui.QComboBox.AdjustToMinimumContentsLength) self.location.setObjectName("location") self.gridLayout.addWidget(self.location, 2, 1, 1, 1) self.location_picker = QtGui.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 = QtGui.QSpacerItem(18, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem1, 3, 0, 1, 1) self.but_pull_overwrite = QtGui.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) QtCore.QObject.connect(self.but_pull, QtCore.SIGNAL("toggled(bool)"), self.location.setEnabled) QtCore.QObject.connect(self.but_pull, QtCore.SIGNAL("toggled(bool)"), self.location_picker.setEnabled) QtCore.QObject.connect(self.but_pull, QtCore.SIGNAL("toggled(bool)"), self.but_pull_overwrite.setEnabled) QtCore.QObject.connect(UpdateCheckoutForm, QtCore.SIGNAL("disableUi(bool)"), self.groupBox.setDisabled) QtCore.QMetaObject.connectSlotsByName(UpdateCheckoutForm) def retranslateUi(self, UpdateCheckoutForm): UpdateCheckoutForm.setWindowTitle(gettext("Update Checkout")) self.label.setText(gettext("This directory is a checkout of: %s")) self.groupBox.setTitle(gettext("Update source")) self.but_update.setText(gettext("Update the working tree from the bound branch")) self.but_pull.setText(gettext("Pull a different branch")) self.location_picker.setText(gettext("Browse...")) self.but_pull_overwrite.setText(gettext("Overwrite differences between branches")) qbzr/lib/ui_verify_signatures.py0000644000000000000000000000203412175306536017366 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui/verify-signatures.ui' # # Created: Fri Jun 24 11:51:55 2011 # by: PyQt4 UI code generator 4.8.3 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_VerifyForm(object): def setupUi(self, VerifyForm): VerifyForm.setObjectName(_fromUtf8("VerifyForm")) VerifyForm.resize(560, 230) self.verticalLayout = QtGui.QVBoxLayout(VerifyForm) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.treeWidget = QtGui.QTreeWidget(VerifyForm) self.treeWidget.setObjectName(_fromUtf8("treeWidget")) self.treeWidget.headerItem().setText(0, _fromUtf8("1")) self.verticalLayout.addWidget(self.treeWidget) self.retranslateUi(VerifyForm) QtCore.QMetaObject.connectSlotsByName(VerifyForm) def retranslateUi(self, VerifyForm): pass qbzr/lib/uifactory.py0000755000000000000000000001213512175306536015134 0ustar rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui import time from bzrlib import ui from bzrlib.plugins.qbzr.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 = QtGui.QInputDialog.getText(self.current_widget(), gettext("Enter Password"), (prompt % kwargs), QtGui.QLineEdit.Password) if ok: return str(password) else: raise KeyboardInterrupt() def get_username(self, prompt='', **kwargs): username, ok = QtGui.QInputDialog.getText(self.current_widget(), gettext("Enter Username"), (prompt % kwargs)) if ok: return str(username) else: raise KeyboardInterrupt() def get_boolean(self, prompt): button = QtGui.QMessageBox.question( self.current_widget(), "Bazaar", prompt, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) return button == QtGui.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 = QtGui.QApplication([]) ui_factory = QUIFactory() print ui_factory.get_username("Enter password 123") #print ui_factory.get_boolean("Question?") qbzr/lib/unbind.py0000644000000000000000000000472212175306536014406 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.subprocess import SubProcessDialog from bzrlib.plugins.qbzr.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 = QtGui.QGroupBox(gettext("Unbind"), self) bind_box = QtGui.QFormLayout(gbBind) info_label = QtGui.QLabel(url_for_display(branch.base)) bind_box.addRow(gettext("Branch:"), info_label) self.currbound = branch.get_bound_location() if self.currbound != None: curr_label = QtGui.QLabel(url_for_display(self.currbound)) bind_box.addRow(gettext("Bound to:"), curr_label) layout = QtGui.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') qbzr/lib/uncommit.py0000644000000000000000000001332012175306536014754 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib import bzrdir, errors, log from bzrlib.revisionspec import RevisionSpec from bzrlib.plugins.qbzr.lib.html_log import log_as_html from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.subprocess import SubProcessDialog from bzrlib.plugins.qbzr.lib.trace import ( reports_exception, SUB_LOAD_METHOD, ) from bzrlib.plugins.qbzr.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 = bzrdir.BzrDir.open_tree_or_branch(location) # Display the branch branch_label = QtGui.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 = QtGui.QGroupBox(gettext("Move tip to"), self) self.last_radio = QtGui.QRadioButton( gettext("Parent of current tip revision")) self.last_radio.setChecked(QtCore.Qt.Checked) self.other_radio = QtGui.QRadioButton(gettext("Other revision:")) self.other_revision = QtGui.QLineEdit() other = QtGui.QHBoxLayout() other.addWidget(self.other_radio) other.addWidget(self.other_revision) vbox = QtGui.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 QtCore.QObject.connect(self.other_revision, QtCore.SIGNAL("textChanged(QString)"), self.do_other_revision_changed) # groupbox gets disabled as we are executing. QtCore.QObject.connect(self, QtCore.SIGNAL("subprocessStarted(bool)"), groupbox, QtCore.SLOT("setDisabled(bool)")) # Put the form together layout = QtGui.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 = unicode(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) qbzr/lib/update.py0000644000000000000000000000303712175306536014407 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.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, ) qbzr/lib/util.py0000644000000000000000000011511112175306536014077 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib.revision import Revision from bzrlib.config import ( GlobalConfig, config_dir, ensure_config_dir_exists, config_filename, ) from bzrlib import lazy_regex from bzrlib.plugins.qbzr.lib import MS_WINDOWS from bzrlib.plugins.qbzr.lib.i18n import gettext, N_ # pyflakes says this is not needed, but it is. import bzrlib.plugins.qbzr.lib.resources from bzrlib import errors from bzrlib.lazy_import import lazy_import lazy_import(globals(), ''' from bzrlib import ( osutils, urlutils, ui, ) from bzrlib.plugins.qbzr.lib import trace from bzrlib.workingtree import WorkingTree from bzrlib.transport import get_transport from bzrlib.lockdir import LockDir from bzrlib.plugins.qbzr.lib.compatibility import configobj ''') # standard buttons with translatable labels BTN_OK, BTN_CANCEL, BTN_CLOSE, BTN_HELP, BTN_REFRESH = range(5) class StandardButton(QtGui.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(QtGui.QStyle, iconname): icon = QtGui.QApplication.style().standardIcon( getattr(QtGui.QStyle, iconname)) new_args = [icon, label] new_args.extend(args) QtGui.QPushButton.__init__(self, *new_args) def config_filename(): return osutils.pathjoin(config_dir(), 'qbzr.conf') class Config(object): def __init__(self, filename): self._filename = filename self._configobj = None dir = osutils.dirname(osutils.safe_unicode(filename)) transport = get_transport(dir) 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,unicode)): # [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 bzrlib.config to read option as boolean # until we will switch to use bzrlib.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): 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.getBookmarks()) bookmarks.append((name, location)) self.setBookmarks(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 None == section: name_str = '[DEFAULT]:' + name else: name_str = "[" + section + "]:" + name color_format_err_msg = lambda given:\ "Illegal color format for " + name_str +\ ". Given '"+ given + "' expected ', , '." color_range_err_msg = lambda given:\ "Color components for " + name_str +\ " should be in the range 0..255 only. Given: "+ given +"." val = self.get_option(name, section) if None == val: return None if list != type(val): raise ValueError(color_format_err_msg(val)) if 3 != len(val) or not \ reduce(lambda x,y: x and y.isdigit(), val, True): raise ValueError(color_format_err_msg(", ".join(val))) #Being here guarantees that color_value is a list #of three elements that represent numbers. color_components = map(int, val) if not reduce(lambda x,y: x and y < 256, color_components, True): raise ValueError( color_range_err_msg(", ".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 _qbzr_config = None def get_qbzr_config(): global _qbzr_config if (_qbzr_config is None or not _qbzr_config._filename == config_filename()): _qbzr_config = QBzrConfig() return _qbzr_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, basestring): 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, BTN_HELP @return: QtGui.QDialogButtonBox with attached buttons and signals """ ROLES = { BTN_OK: (QtGui.QDialogButtonBox.AcceptRole, "accepted()", "do_accept"), BTN_CANCEL: (QtGui.QDialogButtonBox.RejectRole, "rejected()", "do_reject"), BTN_CLOSE: (QtGui.QDialogButtonBox.RejectRole, "rejected()", "do_close"), # XXX support for HelpRole } buttonbox = QtGui.QDialogButtonBox(self) for i in buttons: btn = StandardButton(i) role, signal_name, method_name = ROLES[i] buttonbox.addButton(btn, role) self.connect(buttonbox, QtCore.SIGNAL(signal_name), getattr(self, method_name)) 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_qbzr_config() self._saveSize(config) config.save() def restoreSize(self, name, defaultSize): self._window_name = name config = get_qbzr_config() size = config.get_option(name + "_window_size") if size: size = size.split("x") if len(size) == 2: try: size = 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_qbzr_config() sizes = config.get_option(name + "_splitter_sizes") n = len(self.splitter.sizes()) if sizes: sizes = 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 = unicode(target).split(":", 1) if scheme != "bzrtopic": raise RuntimeError, "unknown scheme" from bzrlib.plugins.qbzr.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 qbzr behavior. """ self.show_warning(message) def show_error(self, message): QtGui.QMessageBox.critical(self, gettext("Error"), message) def show_warning(self, message): QtGui.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 = QtGui.QMessageBox.question if type == 'warning': klass = QtGui.QMessageBox.warning button = klass(self, gettext("Confirm"), message, QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No) if button == QtGui.QMessageBox.Yes: return True else: return False class QBzrWindow(QtGui.QMainWindow, _QBzrWindowBase): def __init__(self, title=None, parent=None, centralwidget=None, ui_mode=True): QtGui.QMainWindow.__init__(self, parent) self.ui_mode = ui_mode self.set_title_and_icon(title) if centralwidget is None: centralwidget = QtGui.QWidget(self) self.centralwidget = centralwidget self.setCentralWidget(self.centralwidget) self.windows = [] self.closing = False def show(self): QtGui.QMainWindow.show(self) self.raise_() # Make sure it displays in the foreground class QBzrDialog(QtGui.QDialog, _QBzrWindowBase): def __init__(self, title=None, parent=None, ui_mode=True): self.ui_mode = ui_mode QtGui.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/qbzr/+bug/421039 self.setWindowFlags(QtCore.Qt.Window) def do_accept(self): self.accept() def do_reject(self): self.reject() def reject(self): self.saveSize() QtGui.QDialog.reject(self) def show(self): QtGui.QMainWindow.show(self) self.raise_() # Make sure it displays in the foreground throber_movie = None class ThrobberWidget(QtGui.QWidget): """A widget that indicates activity.""" def __init__(self, parent, timeout=500): QtGui.QWidget.__init__(self, parent) global throber_movie if not throber_movie: throber_movie = QtGui.QMovie(":/16x16/process-working.gif") throber_movie.start() self.spinner = QtGui.QLabel("", self) self.spinner.setMovie(throber_movie) self.message = QtGui.QLabel(gettext("Loading..."), self) #self.progress = QtGui.QProgressBar(self) #self.progress.setTextVisible (False) #self.progress.hide() #self.progress.setMaximum(sys.maxint) self.transport = QtGui.QLabel("", self) for widget in (self.spinner, self.message, #self.progress, self.transport): widget.hide() self.widgets = [] self.set_layout() self.num_show = 0 def set_layout(self): layout = QtGui.QHBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.spinner) #layout.addWidget(self.progress) layout.addWidget(self.message, 1) layout.addWidget(self.transport) self.widgets.append(self.spinner) #self.widgets.append(self.progress) self.widgets.append(self.message) self.widgets.append(self.transport) def hide(self): #if self.is_shown: #QtGui.QApplication.restoreOverrideCursor() self.num_show -= 1 if self.num_show <= 0: self.num_show = 0 QtGui.QWidget.hide(self) for widget in self.widgets: widget.hide() def show(self): #QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) # and show ourselves. self.num_show += 1 QtGui.QWidget.show(self) for widget in self.widgets: widget.show() class ToolBarThrobberWidget(ThrobberWidget): """A widget that indicates activity. Smaller than ThrobberWidget, designed for use on a toolbar.""" def set_layout(self): layout = QtGui.QHBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.transport) layout.addWidget(self.spinner) #layout.addWidget(self.progress) #layout.addWidget(self.message, 1) self.widgets.append(self.spinner) #self.widgets.append(self.progress) #self.widgets.append(self.message) self.widgets.append(self.transport) # Helpers for directory pickers. # 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 dir = unicode(getter()) if not os.path.isdir(dir): dir = "" dir = QtGui.QFileDialog.getExistingDirectory(dlg, caption, dir) if dir: setter(dir) dialog.connect(chooser, QtCore.SIGNAL("clicked()"), 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)) return unicode(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 bzrlib.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 __nonzero__(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 = u'' 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 and shortcut.toString(): toolTip = action.toolTip() action.setToolTip("%s (%s)" % (toolTip, shortcut.toString())) def iter_saved_pull_locations(): """ Iterate the 'pull' locations we have previously saved for the user. """ config = get_qbzr_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_qbzr_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 bzrlib.urlutils.unescape_for_display """ if not url: return url return urlutils.unescape_for_display(url, 'utf-8') def is_binary_content(lines): """Check list of lines for binary content (i.e. presence of 0x00 byte there). @return: True if 0x00 byte found. """ for s in lines: if '\x00' in s: 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)] 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)') def ensure_unicode(s, encoding='ascii'): """Convert s to unicode if s is plain string. Using encoding for unicode decode. In the case when s is not string, return it without any changes. """ if isinstance(s, str): return s.decode(encoding) return s def open_tree(directory, ui_mode=False, _critical_dialog=QtGui.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 = u'.' 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 urlparse 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'): n = len(parts) if n >= 2: part1 = parts[1] if n in (2,3) and part1 not in DISTROS: # scheme://host/+branch/project-name # scheme://host/+branch/project-name/series-name return part1 elif n 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 def _shlex_split_unicode_linux(unicode_string): """Split unicode string to list of unicode arguments.""" return [unicode(p,'utf8') for p in shlex.split(unicode_string.encode('utf-8'))] 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('\\', '\\\\').encode('utf-8') return [unicode(p,'utf8') 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(QtGui.QFrame): def __init__(self, parent=None): QtGui.QFrame.__init__(self, parent) self.setFrameShape(QtGui.QFrame.StyledPanel) self.setAutoFillBackground(True) self.setBackgroundRole(QtGui.QPalette.ToolTipBase) self.setForegroundRole(QtGui.QPalette.ToolTipText) # 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 = QtGui.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 qbzr/lib/verify_signatures.py0000644000000000000000000001553212175306536016700 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 bzrlib import bzrdir, osutils from bzrlib.info import show_bzrdir_info from bzrlib.plugins.qbzr.lib.i18n import gettext from bzrlib.plugins.qbzr.lib.ui_verify_signatures import Ui_VerifyForm from bzrlib.plugins.qbzr.lib.util import ( BTN_CLOSE, QBzrWindow, QBzrDialog, url_for_display, ThrobberWidget, ) from bzrlib import ( bzrdir as _mod_bzrdir, errors, gpg, revision as _mod_revision, ) from PyQt4.QtCore import * from PyQt4.QtGui import * from StringIO 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() bzrdir = _mod_bzrdir.BzrDir.open_containing(self.location)[0] branch = bzrdir.open_branch() repo = branch.repository branch_config = branch.get_config() 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_strategy.do_verifications(revisions, repo, QApplication.processEvents) if all_verifiable: message = QTreeWidgetItem( [gettext( "All commits signed with verifiable keys")] ) self.ui.treeWidget.addTopLevelItem(message) for verbose_message in gpg_strategy.verbose_valid_message(result): QTreeWidgetItem(message, [verbose_message]) else: valid_commit_message = QTreeWidgetItem( [gpg_strategy.valid_commits_message(count)] ) self.ui.treeWidget.addTopLevelItem(valid_commit_message) for verbose_message in gpg_strategy.verbose_valid_message(result): QTreeWidgetItem(valid_commit_message, [verbose_message]) expired_key_message = QTreeWidgetItem( [gpg_strategy.expired_commit_message(count)] ) self.ui.treeWidget.addTopLevelItem(expired_key_message) for verbose_message in \ gpg_strategy.verbose_expired_key_message(result, repo): QTreeWidgetItem(expired_key_message, [verbose_message]) unknown_key_message = QTreeWidgetItem( [gpg_strategy.unknown_key_message(count)] ) self.ui.treeWidget.addTopLevelItem(unknown_key_message) for verbose_message in gpg_strategy.verbose_missing_key_message( result): QTreeWidgetItem(unknown_key_message, [verbose_message]) commit_not_valid_message = QTreeWidgetItem( [gpg_strategy.commit_not_valid_message(count)] ) self.ui.treeWidget.addTopLevelItem(commit_not_valid_message) for verbose_message in gpg_strategy.verbose_not_valid_message( result, repo): QTreeWidgetItem(commit_not_valid_message, [verbose_message]) commit_not_signed_message = QTreeWidgetItem( [gpg_strategy.commit_not_signed_message(count)] ) self.ui.treeWidget.addTopLevelItem(commit_not_signed_message) for verbose_message in gpg_strategy.verbose_not_signed_message( result, repo): QTreeWidgetItem(commit_not_signed_message, [verbose_message]) self.throbber.hide() qbzr/lib/widgets/0000755000000000000000000000000012175306536014216 5ustar rootroot00000000000000qbzr/lib/win32util.py0000644000000000000000000000356712175306536014775 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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, 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 qbzr/lib/extra/__init__.py0000644000000000000000000000000012175306536015772 0ustar rootroot00000000000000qbzr/lib/extra/bugurl.py0000644000000000000000000000447312175306536015555 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 bzrlib import commands, errors, trace, bugtracker from bzrlib.config import GlobalConfig from bzrlib.branch import Branch from bzrlib.option import Option from bzrlib.plugins.qbzr.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 qbzr.lib.util here because that module # has dependency on PyQt4 (see bug #327487) from bzrlib.plugins.qbzr.lib.util import open_browser, url_for_display try: branch = Branch.open_containing(u'.')[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) qbzr/lib/extra/isignored.py0000644000000000000000000000273312175306536016235 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 bzrlib 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.path2id(relpath): if not trace.is_quiet(): print >>self.outf, 'ignored' return 1 else: if not trace.is_quiet(): print >>self.outf, 'not ignored' return 0 qbzr/lib/extra/isversioned.py0000644000000000000000000000270612175306536016604 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 bzrlib 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.path2id(relpath): if not trace.is_quiet(): print >>self.outf, 'versioned' return 1 else: if not trace.is_quiet(): print >>self.outf, 'not versioned' return 0 qbzr/lib/tests/Makefile0000644000000000000000000000003612175306536015351 0ustar rootroot00000000000000test: $(MAKE) -C ../../ test qbzr/lib/tests/__init__.py0000644000000000000000000000601012175306536016020 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 os import sys from bzrlib import ( tests, trace, ) try: from PyQt4 import QtGui, QtTest except ImportError: pass def load_tests(basic_tests, module, loader): 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', '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, e: if str(e).endswith('PyQt4'): trace.note('QBzr: skip module %s ' 'because PyQt4 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 = QtGui.QApplication(sys.argv) def excepthook_tests(eclass, evalue, tb): def _reraise_on_cleanup(): raise eclass, evalue, 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(): return if timeout < erapsed: self.fail(timeout_msg or 'Timeout!') QtTest.QTest.qWait(200) erapsed += 200 qbzr/lib/tests/compatibility.py0000644000000000000000000000175412175306536017144 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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. try: # bzr 2.5 from bzrlib.tests.feature import UnicodeFilenameFeature except ImportError: # backward compatibility with bzr 2.4 from bzrlib.tests import UnicodeFilenameFeature qbzr/lib/tests/mock.py0000644000000000000000000000351312175306536015217 0ustar rootroot00000000000000# -*- 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 bzrlib.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.assertEquals(0, mf.count) self.assertEquals([], mf.args) # 1st call mf(None, 1, 'foo') self.assertEquals(1, mf.count) self.assertEquals([((None, 1, 'foo'), {})], mf.args) # 2nd call mf('bar', baz='spam') self.assertEquals(2, mf.count) self.assertEquals([ ((None, 1, 'foo'), {}), (('bar',), {'baz': 'spam'}), ], mf.args) qbzr/lib/tests/modeltest.py0000644000000000000000000005047712175306536016301 0ustar rootroot00000000000000############################################################################# ## ## 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. ## ############################################################################# import sip from PyQt4 import QtCore, QtGui 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 self.model = sip.cast(_model, QtCore.QAbstractItemModel) self.insert = [] self.remove = [] self.fetchingMore = False assert(self.model) self.connect( self.model, QtCore.SIGNAL("columnsAboutToBeInserted(const QModelIndex&, int, int)"), self.runAllTests) self.connect( self.model, QtCore.SIGNAL("columnsAboutToBeRemoved(const QModelIndex&, int, int)"), self.runAllTests) self.connect( self.model, QtCore.SIGNAL("columnsBeInserted(const QModelIndex&, int, int)"), self.runAllTests) self.connect( self.model, QtCore.SIGNAL("columnsRemoved(const QModelIndex&, int, int)"), self.runAllTests) self.connect( self.model, QtCore.SIGNAL("dataChanged(const QModelIndex&, const QModelIndex&)"), self.runAllTests) self.connect( self.model, QtCore.SIGNAL("headerDataChanged(Qt::Orientation, int, int)"), self.runAllTests) self.connect( self.model, QtCore.SIGNAL("layoutAboutToBeChanged()"), self.runAllTests) self.connect( self.model, QtCore.SIGNAL("layoutChanged()"), self.runAllTests) self.connect( self.model, QtCore.SIGNAL("modelReset()"), self.runAllTests) self.connect( self.model, QtCore.SIGNAL("rowsAboutToBeInserted(const QModelIndex&, int, int)"), self.runAllTests) self.connect( self.model, QtCore.SIGNAL("rowsAboutToBeRemoved(const QModelIndex&, int, int)"), self.runAllTests) self.connect( self.model, QtCore.SIGNAL("rowsBeInserted(const QModelIndex&, int, int)"), self.runAllTests) self.connect( self.model, QtCore.SIGNAL("rowsRemoved(const QModelIndex&, int, int)"), self.runAllTests) # Special checks for inserting/removing self.connect( self.model, QtCore.SIGNAL("rowsAboutToBeInserted(const QModelIndex&, int, int)"), self.rowsAboutToBeInserted) self.connect( self.model, QtCore.SIGNAL("rowsAboutToBeRemoved(const QModelIndex&, int, int)"), self.rowsAboutToBeRemoved) self.connect( self.model, QtCore.SIGNAL("rowsBeInserted(const QModelIndex&, int, int)"), self.rowsInserted) self.connect( self.model, QtCore.SIGNAL("rowsRemoved(const QModelIndex&, int, int)"), 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) assert(self.model.data(QtCore.QModelIndex(), QtCore.Qt.DisplayRole) == QtCore.QVariant()) 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()) cache = QtCore.QVariant() self.model.match(QtCore.QModelIndex(), -1, cache) self.model.mimeTypes() assert(self.model.parent(QtCore.QModelIndex()) == QtCore.QModelIndex()) assert(self.model.rowCount(QtCore.QModelIndex()) >= 0) variant = QtCore.QVariant() self.model.setData(QtCore.QModelIndex(), variant, -1) self.model.setHeaderData(-1, QtCore.Qt.Horizontal, QtCore.QVariant()) self.model.setHeaderData(0, QtCore.Qt.Horizontal, QtCore.QVariant()) self.model.setHeaderData(999999, QtCore.Qt.Horizontal, QtCore.QVariant()) 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) == 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) == 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()) 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()).isValid()) # shouldn't be able to set data on an invalid index assert( self.model.setData( QtCore.QModelIndex(), QtCore.QVariant("foo"), QtCore.Qt.DisplayRole) == False) # General Purpose roles that should return a QString variant = self.model.data(self.model.index(0,0,QtCore.QModelIndex()), QtCore.Qt.ToolTipRole) if variant.isValid(): assert( variant.canConvert( QtCore.QVariant.String ) ) variant = self.model.data(self.model.index(0,0,QtCore.QModelIndex()), QtCore.Qt.StatusTipRole) if variant.isValid(): assert( variant.canConvert( QtCore.QVariant.String ) ) variant = self.model.data(self.model.index(0,0,QtCore.QModelIndex()), QtCore.Qt.WhatsThisRole) if variant.isValid(): 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.isValid(): 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.isValid(): 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.isValid(): alignment = variant.toInt()[0] 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.isValid(): assert( variant.canConvert( QtCore.QVariant.Color ) ) variant = self.model.data(self.model.index(0,0,QtCore.QModelIndex()), QtCore.Qt.TextColorRole) if variant.isValid(): 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.isValid(): state = variant.toInt()[0] 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 qbzr 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 ) #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) qbzr/lib/tests/test_annotate.py0000644000000000000000000000542212175306536017137 0ustar rootroot00000000000000# -*- 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 bzrlib.tests import TestCase, TestCaseWithTransport from PyQt4 import QtCore, QtGui from bzrlib import conflicts from bzrlib.plugins.qbzr.lib import tests as qtests from bzrlib.plugins.qbzr.lib.annotate import AnnotateWindow class TestAnnotate(qtests.QTestCase): # Copied from bzrlib/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', 'first\n')]) tree1.add(['a'], ['a-id']) tree1.commit('a', rev_id='rev-1', committer="joe@foo.com", timestamp=1166046000.00, timezone=0) tree2 = tree1.bzrdir.sprout('tree2').open_workingtree() self.build_tree_contents([('tree1/a', 'first\nsecond\n')]) tree1.commit('b', rev_id='rev-2', committer='joe@foo.com', timestamp=1166046001.00, timezone=0) self.build_tree_contents([('tree2/a', 'first\nthird\n')]) tree2.commit('c', rev_id='rev-1_1_1', committer="barry@foo.com", timestamp=1166046002.00, timezone=0) num_conflicts = tree1.merge_from_branch(tree2.branch) self.assertEqual(1, num_conflicts) self.build_tree_contents([('tree1/a', 'first\nsecond\nthird\n')]) tree1.set_conflicts(conflicts.ConflictList()) tree1.commit('merge 2', rev_id='rev-3', committer='sal@foo.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', 'a-id') self.addCleanup(win.close) win.show() QtCore.QCoreApplication.processEvents() qbzr/lib/tests/test_autocomplete.py0000644000000000000000000000664412175306536020036 0ustar rootroot00000000000000# -*- 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 bzrlib.tests import TestCase from StringIO import StringIO from bzrlib.plugins.qbzr.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) qbzr/lib/tests/test_bugs.py0000644000000000000000000001642712175306536016275 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 bzrlib import config from bzrlib.tests import TestCase, TestCaseWithTransport from bzrlib.plugins.qbzr.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.assertEquals('261234', get_bug_id('https://launchpad.net/bugs/261234')) def test_trac(self): self.assertEquals('3852', get_bug_id('http://bugs.musicbrainz.org/ticket/3852')) def test_bugzilla(self): self.assertEquals('169104', get_bug_id('http://bugs.kde.org/show_bug.cgi?id=169104')) def test_redmine(self): self.assertEquals('1832', get_bug_id('http://www.redmine.org/issues/show/1832')) self.assertEquals('6', get_bug_id('https://rm.ftrahan.com/issues/6')) def test_fogbugz(self): self.assertEquals('1234', get_bug_id('http://test.fogbugz.com/default.asp?1234')) def test_roundup(self): self.assertEquals('5243', get_bug_id('http://bugs.python.org/issue5243')) def test_mantis(self): self.assertEquals('7721', get_bug_id('http://www.mantisbt.org/bugs/view.php?id=7721')) self.assertEquals('123', get_bug_id('http://localhost/view.php?id=123')) def test_fusionforge(self): self.assertEquals('292', get_bug_id('https://fusionforge.org/tracker/index.php?func=detail&aid=292')) def test_flyspray(self): self.assertEquals('1234', get_bug_id('https://flyspray.example.com/index.php?do=details&task_id=1234')) self.assertEquals('1234', get_bug_id('https://bugs.flyspray.org/task/1234')) def test_jira(self): self.assertEquals('AB-1234', get_bug_id('http://jiraserver/browse/AB-1234')) self.assertEquals('A_B-1234', get_bug_id('http://jiraserver/browse/A_B-1234')) self.assertEquals('AB_1-1234', get_bug_id('http://jiraserver/browse/AB_1-1234')) self.assertEquals('AB_1A-1234', get_bug_id('http://jiraserver/browse/AB_1A-1234')) self.assertEquals(None, get_bug_id('http://jiraserver/browse/1A-1234')) self.assertEquals(None, get_bug_id('http://jiraserver/browse/_1A-1234')) self.assertEquals(None, get_bug_id('http://jiraserver/browse/A-1234A')) self.assertEquals(None, get_bug_id('http://jiraserver/browse/a-1')) self.assertEquals(None, get_bug_id('http://jiraserver/browse/a')) self.assertEquals(None, get_bug_id('http://jiraserver/browse/A')) self.assertEquals(None, get_bug_id('http://jiraserver/browse/A-')) self.assertEquals(None, get_bug_id('http://jiraserver/browse/A_1')) self.assertEquals('A-1', get_bug_id('http://jiraserver/browse/A-1')) self.assertEquals('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.assertEquals({'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.assertEquals({ '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.assertEquals({ '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)) qbzr/lib/tests/test_cat.py0000644000000000000000000000310012175306536016064 0ustar rootroot00000000000000# -*- 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 bzrlib.tests import TestCase, TestCaseWithTransport from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib import tests as qtests from bzrlib.plugins.qbzr.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', '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")) QtCore.QCoreApplication.processEvents() qbzr/lib/tests/test_commit.py0000644000000000000000000000257612175306536016625 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2010 Alexander Belchenko # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from bzrlib.tests import TestCase, TestCaseWithTransport from PyQt4 import QtCore from bzrlib.plugins.qbzr.lib import tests as qtests from bzrlib.plugins.qbzr.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() QtCore.QCoreApplication.processEvents() qbzr/lib/tests/test_commit_data.py0000644000000000000000000002113312175306536017604 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 bzrlib.tests import TestCase, TestCaseWithTransport from bzrlib.plugins.qbzr.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([], 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'], 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'], 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': '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()) 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': '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_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. qbzr_commit_message) gracefully wt = self.make_branch_and_tree('.') cfg = wt.branch.get_config() cfg.set_user_option('qbzr_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('qbzr_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('qbzr_commit_message', 'spam') d = QBzrCommitData(tree=wt) d.wipe() # check branch.conf cfg = wt.branch.get_config() self.assertEqual('', cfg.get_user_option('qbzr_commit_message')) self.assertEqual({}, cfg.get_user_option('commit_data')) qbzr/lib/tests/test_decorator.py0000644000000000000000000001024212175306536017304 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.decorators import lazy_call from bzrlib.tests import TestCase, TestCaseWithTransport from bzrlib.plugins.qbzr.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 xrange(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) qbzr/lib/tests/test_diffview.py0000644000000000000000000000522112175306536017126 0ustar rootroot00000000000000# -*- 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 bzrlib.tests import TestCase from bzrlib.plugins.qbzr.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.assertEquals('foo', cursor1.text) self.assertEquals('foo', cursor2.text) def test_whole_line_changed(self): cursor1 = FakeCursor() cursor2 = FakeCursor() insert_intraline_changes(cursor1, cursor2, 'foo', 'bar', 'n', 'ins', 'del') self.assertEquals('foo', cursor1.text) self.assertEquals('bar', cursor2.text) def test_delete_char(self): cursor1 = FakeCursor() cursor2 = FakeCursor() insert_intraline_changes(cursor1, cursor2, 'foo', 'fo', 'n', 'ins', 'del') self.assertEquals('foo', cursor1.text) self.assertEquals('fo', cursor2.text) def test_insert_char(self): cursor1 = FakeCursor() cursor2 = FakeCursor() insert_intraline_changes(cursor1, cursor2, 'fo', 'foo', 'n', 'ins', 'del') self.assertEquals('fo', cursor1.text) self.assertEquals('foo', cursor2.text) def test_replace_2_chars(self): cursor1 = FakeCursor() cursor2 = FakeCursor() insert_intraline_changes(cursor1, cursor2, 'foobar', 'foObAr', 'n', 'ins', 'del') self.assertEquals('foobar', cursor1.text) self.assertEquals('foObAr', cursor2.text) qbzr/lib/tests/test_extdiff.py0000644000000000000000000002531412175306536016761 0ustar rootroot00000000000000if __name__=='__main__': import bzrlib bzrlib.initialize() import bzrlib.plugin bzrlib.plugin.set_plugins_path() bzrlib.plugin.load_plugins() import os, tempfile from bzrlib.plugins.qbzr.lib.tests import QTestCase from bzrlib.plugins.qbzr.lib.tests.mock import MockFunction from bzrlib.plugins.qbzr.lib import diff from bzrlib.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', "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', "content")]) self.tree.add(["a"]) self.tree.commit(message='1') self.build_tree_contents([('tree/a', "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', "a")]) self.tree.add(['a']) self.tree.commit(message='1') self.build_tree_contents([('tree/a', "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', "a"), ('tree/dir1/b', "b"), ('tree/dir1/c', "c"), ('tree/dir1/d', "d"), ('tree/dir2/e', "e"), ('tree/dir2/f', "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', "A"), ('tree/dir1/b', "B"), ('tree/dir1/c', "C"), ('tree/dir2/e', "E"), ]) self.ctx.setup("diff.exe", self.tree.basis_tree(), self.tree) def assertPopen(self, paths, old_contents): self.assertEqual(self.popen_mock.count, len(paths)) for args, path, old_content in zip(self.popen_mock.args, paths, old_contents): 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', "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() qbzr/lib/tests/test_extra_isignored.py0000644000000000000000000000274612175306536020522 0ustar rootroot00000000000000# -*- 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 bzrlib.tests import TestCaseWithTransport, KnownFailure 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.assertEquals('ignored\n', out) out, err = self.run_bzr('is-ignored a', retcode=0) self.assertEquals('not ignored\n', out) out, err = self.run_bzr('is-ignored -q b', retcode=1) self.assertEquals('', out) out, err = self.run_bzr('is-ignored -q a', retcode=0) self.assertEquals('', out) qbzr/lib/tests/test_extra_isversioned.py0000644000000000000000000000275512175306536021071 0ustar rootroot00000000000000# -*- 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 bzrlib.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.assertEquals('versioned\n', out) out, err = self.run_bzr('is-versioned b', retcode=0) self.assertEquals('not versioned\n', out) out, err = self.run_bzr('is-versioned -q a', retcode=1) self.assertEquals('', out) out, err = self.run_bzr('is-versioned -q b', retcode=0) self.assertEquals('', out) qbzr/lib/tests/test_guidebar.py0000644000000000000000000002412412175306536017110 0ustar rootroot00000000000000if __name__=='__main__': import bzrlib bzrlib.initialize() try: from bzrlib.commands import _register_builtin_commands _register_builtin_commands() except ImportError: pass import bzrlib.plugin bzrlib.plugin.set_plugins_path() bzrlib.plugin.load_plugins() from bzrlib.plugins.qbzr.lib.tests import QTestCase from PyQt4 import QtCore from PyQt4.QtTest import QTest from bzrlib.plugins.qbzr.lib.diffwindow import DiffWindow from bzrlib.plugins.qbzr.lib.shelvewindow import ShelveWindow from bzrlib.plugins.qbzr.lib.annotate import AnnotateWindow class WtDiffArgProvider(object): def __init__(self, tree): self.tree = tree def get_diff_window_args(self, processEvents, add_cleanup): return dict( old_tree=self.tree.basis_tree(), new_tree=self.tree, old_branch=self.tree.branch, new_branch=self.tree.branch ) 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") 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") 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], ) 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, 500) self.assertEqual(bar.entries['title'].data, [(0, 2)]) # Replace/Delete/Insert for tag, expected in DIFF_BY_TAGS.iteritems(): 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, 500) self.assertEqual(bar.entries['title'].data, [(0, 2)]) # Replace/Delete/Insert for tag, expected in DIFF_BY_TAGS.iteritems(): 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, 500) # 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(), 500) 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(), 500) 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(), 500) 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, 500) 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, 500) 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, 500) def test_find(self): self.waitUntil(lambda:self.main_widget.loaded, 500) 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, 500) 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, 500) 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.qWait(50) self.waitUntil(lambda:self.win.throbber.isVisible() == False, 500) 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() qbzr/lib/tests/test_i18n.py0000644000000000000000000000264012175306536016104 0ustar rootroot00000000000000# -*- 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 bzrlib.tests import TestCase from bzrlib.plugins.qbzr.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 self.assertEquals('file', i18n.gettext('file')) def test_ngettext(self): self.assertEquals('singular', i18n.ngettext('singular', 'plural', 1)) self.assertEquals('plural', i18n.ngettext('singular', 'plural', 2)) self.assertEquals('plural', i18n.ngettext('singular', 'plural', 0)) qbzr/lib/tests/test_log.py0000644000000000000000000002166612175306536016117 0ustar rootroot00000000000000# -*- 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 bzrlib.tests import TestCase, TestCaseWithTransport from bzrlib import errors from bzrlib.transport import memory from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib import tests as qtests from bzrlib.plugins.qbzr.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=u'\u013d\xf3r\xe9m \xcdp\u0161\xfam ' u'') 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', 'file1-id') tree.add('dir', 'dir-id') tree.add('file3', '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.bzrdir.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_bzrdir(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(['file1-id', '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.bzrdir.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 alot 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)) qbzr/lib/tests/test_loggraphviz.py0000644000000000000000000013536112175306536017670 0ustar rootroot00000000000000# -*- 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. from bzrlib.tests import TestCase, TestCaseWithTransport from StringIO import StringIO from bzrlib.plugins.qbzr.lib import loggraphviz from bzrlib.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() builder.build_snapshot('rev-a', None, [ ('add', ('', 'TREE_ROOT', 'directory', '')),]) builder.build_snapshot('rev-old', ['rev-a'], []) builder.build_snapshot('rev-new', ['rev-a'], []) builder.build_snapshot('rev-trunk', ['rev-a'], []) builder.finish_series() trunk = builder.get_branch() #trunk.set_last_revision('rev-trunk') old = trunk.bzrdir.sprout('../old', revision_id='rev-old').open_branch() new = trunk.bzrdir.sprout('../new', revision_id='rev-new').open_branch() return trunk, old, new def test_branch_tips_date_sorted(self): 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( [('rev-new', 2, None, [(2, 2, 0, True)]) , # ○ # │ ('rev-old', 1, None, [(1, 1, 0, True), (2, 2, 0, True)]), # ○ │ # │ │ ('rev-trunk', 0, None, [(0, 0, 0, True), (1, 0, 0, True), # ○ │ │ (2, 0, 0, True)]), # ├─╯─╯ ('rev-a', 0, None, []) ],# ○ computed) def test_branch_tips_date_sorted_with_working_tree_provider(self): trunk, old, new = self.make_banches_for_tips_date_sorted() trunk_tree = trunk.bzrdir.create_workingtree() old_tree = old.bzrdir.open_workingtree() new_tree = new.bzrdir.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)]), # ○ # │ ('rev-new', 2, None, [(2, 2, 0, True)]), # ○ # │ (gv.tree_revid(old_tree), 1, None, [(1, 1, 2, True), # ○ │ (2, 2, 0, True)]), # │ │ ('rev-old', 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)]), # │ │ │ ('rev-trunk', 0, None, [(0, 0, 0, True), (1, 0, 0, True), # ○ │ │ (2, 0, 0, True)]), # ├─╯─╯ ('rev-a', 0, None, [])], # ○ computed) def make_tree_with_pending_merge(self, path): builder = self.make_branch_builder('branch') builder.start_series() builder.build_snapshot('rev-a', None, [ ('add', ('', 'TREE_ROOT', 'directory', '')),]) builder.build_snapshot('rev-b', ['rev-a'], []) builder.finish_series() branch = builder.get_branch() branch.set_last_revision_info(1, 'rev-a') # go back to rev-a tree = branch.bzrdir.create_workingtree() tree.merge_from_branch(branch, to_revision='rev-b') return tree def make_tree_not_up_to_date(self, path): builder = self.make_branch_builder('branch') builder.start_series() builder.build_snapshot('rev-a', None, [ ('add', ('', 'TREE_ROOT', 'directory', '')),]) builder.build_snapshot('rev-b', ['rev-a'], []) builder.finish_series() branch = builder.get_branch() tree = branch.bzrdir.create_workingtree() tree.update(revision='rev-a') return tree def test_pending_merge(self): tree = 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 = 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): tree = 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) self.assertComputed( [(u'current:%s' % tree.basedir, 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 = 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( [(u'current:%s' % tree.basedir, 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 lable 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() builder.build_snapshot('rev-a', None, [ ('add', ('', 'TREE_ROOT', 'directory', '')),]) builder.build_snapshot('rev-b', ['rev-a'], []) builder.build_snapshot('rev-c', ['rev-a'], []) builder.finish_series() branch = builder.get_branch() tree = branch.bzrdir.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')]))) 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 = 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') tree.commit('a', rev_id='rev-a') tree.add_parent_tree_id('rev-b') tree.commit('c', rev_id='rev-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)]), # ⊖ # ├─╮ ('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('rev-a', allow_leftmost_as_ghost=True) tree.commit('b', rev_id='rev-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)]), # ○ # │ ('rev-a', 0, None, []) ],# ○ computed) def test_get_revid_branch_info(self): builder = self.make_branch_builder('trunk') builder.start_series() builder.build_snapshot('rev-a', None, [ ('add', ('', 'TREE_ROOT', 'directory', '')),]) builder.build_snapshot('rev-branch', ['rev-a'], []) builder.build_snapshot('rev-trunk', ['rev-a'], []) builder.finish_series() # ○ branch # │ # ○ │ trunk # ├─╯ # ○ rev-a trunk = builder.get_branch() #trunk.set_last_revision('rev-trunk') branch = trunk.bzrdir.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') tree.commit('a', rev_id='rev-a') tree.add_parent_tree_id('rev-b') tree.commit('c', rev_id='rev-c') # rev-b is a ghost. We think he is there, but he dose 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, '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, 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: u'○', True: u'⊖', False: u'⊕'} ver_char = {True: u'│', False: u'┆'} hor_char = {True: {u' ': u'─', u'│': u'┼', u'┆': u'┼'}, False: {u' ': u'┄', u'│': u'┼', u'┆': u'┼'}} tl_char = {u' ': u'╭', u'│': u'├', u'┆': u'├', u'─': u'┬', u'┄': u'┬', u'┴': u'┼', u'┤': u'┼',} tr_char = {u' ': u'╮', u'│': u'┤', u'┆': u'┤', u'─': u'┬', u'┄': u'┬', u'┴': u'┼', u'├': u'┼',} bl_char = {u' ': u'╰', u'│': u'├', u'┆': u'├', u'─': u'┴', u'┄': u'┴', u'┬': u'┼', u'┤': u'┼',} br_char = {u' ': u'╯', u'│': u'┤', u'┆': u'┤', u'─': u'┴', u'┄': u'┴', u'┬': u'┼', u'├': u'┼',} 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) qbzr/lib/tests/test_logmodel.py0000644000000000000000000000554412175306536017135 0ustar rootroot00000000000000# -*- 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 bzrlib.tests import TestCase, TestCaseWithTransport from PyQt4 import QtCore from bzrlib.plugins.qbzr.lib import tests as qtests from bzrlib.plugins.qbzr.lib.logmodel import (LogModel, GraphVizLoader) from bzrlib.plugins.qbzr.lib.loggraphviz import BranchInfo from bzrlib.plugins.qbzr.lib.util import ThrobberWidget from bzrlib.plugins.qbzr.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 bzrlib/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='rev-1', timestamp=1132586655, timezone=36000, committer='Joe Foo ') wt.commit('rev-merged', rev_id='rev-2a', timestamp=1132586700, timezone=36000, committer='Joe Foo ') wt.set_parent_ids(['rev-1', 'rev-2a']) wt.branch.set_last_revision_info(1, 'rev-1') wt.commit('rev-2', rev_id='rev-2b', timestamp=1132586800, timezone=36000, committer='Joe Foo ') if with_tags: branch = wt.branch branch.tags.set_tag('v0.2', 'rev-2b') wt.commit('rev-3', rev_id='rev-3', timestamp=1132586900, timezone=36000, committer='Jane Foo ') branch.tags.set_tag('v1.0rc1', 'rev-3') branch.tags.set_tag('v1.0', 'rev-3') return wt def test_merges(self): wt = self._prepare_tree_with_merges() self._test(wt) qbzr/lib/tests/test_revisionmessagebrowser.py0000644000000000000000000000271212175306536022134 0ustar rootroot00000000000000# -*- 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 bzrlib import ( tests, ) from bzrlib.plugins.qbzr.lib.revisionmessagebrowser import ( htmlencode, htmlize, ) class TestHtmlUtils(tests.TestCase): def test_htmlencode(self): self.assertEquals('"&<>', htmlencode('"&<>')) self.assertEquals('\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')) qbzr/lib/tests/test_spellcheck.py0000644000000000000000000000500012175306536017433 0ustar rootroot00000000000000# -*- 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 bzrlib.tests import TestCase try: from bzrlib.tests.features import Feature except ImportError: # bzr < 2.5 from bzrlib.tests import Feature from bzrlib.plugins.qbzr.lib.spellcheck import SpellChecker class _PyEnchantFeature(Feature): def _probe(self): try: from bzrlib.plugins.qbzr.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.assertEquals([], result) def test_incorrect(self): result = list(self.checker.check("yess")) self.assertEquals([(0, 4)], result) def test_camel_case(self): result = list(self.checker.check("YesNo")) self.assertEquals([], result) def test_camel_case_2(self): result = list(self.checker.check("yesNo")) self.assertEquals([], result) def test_underscores(self): result = list(self.checker.check("Yes_No")) self.assertEquals([], result) def test_email(self): result = list(self.checker.check("yes name@example.com no")) self.assertEquals([], result) def test_url(self): result = list(self.checker.check("yes http://example.com/foo/bar no")) self.assertEquals([], result) qbzr/lib/tests/test_subprocess.py0000644000000000000000000001615512175306536017523 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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. from cStringIO import StringIO from bzrlib import ( bencode, errors, progress, urlutils, ) from bzrlib.tests import ( TestCase, features, ) from bzrlib.plugins.qbzr.lib.subprocess import ( bdecode_prompt, bencode_prompt, bencode_unicode, bencode_exception_instance, bdecode_exception_instance, encode_unicode_escape, decode_unicode_escape, SubprocessProgressView, SUB_PROGRESS, ) from bzrlib.plugins.qbzr.lib.tests import compatibility class TestBencode(TestCase): def test_bencode_unicode(self): self.assertEqual(u"l7:versione", bencode_unicode(["version"])) self.assertEqual(u"l3:add3:\u1234e", bencode_unicode([u"add", u"\u1234"])) def test_bencode_prompt(self): self.assertEqual("4:spam", bencode_prompt('spam')) self.assertEqual("10:spam\\neggs", bencode_prompt('spam'+'\n'+'eggs')) self.assertEqual("14:\\u0420\\n\\u0421", bencode_prompt(u'\u0420\n\u0421')) def test_bdecode_prompt(self): self.assertEqual('spam', bdecode_prompt("4:spam")) self.assertEqual('spam'+'\n'+'eggs', bdecode_prompt("10:spam\\neggs")) self.assertEqual(u'\u0420\n\u0421', bdecode_prompt("14:\\u0420\\n\\u0421")) def test_encode_unicode_escape_dict(self): self.assertEqual({'key': 'foo\\nbar', 'ukey': u'\\u1234'}, encode_unicode_escape({'key': 'foo\nbar', 'ukey': u'\u1234'})) def test_decode_unicode_escape_dict(self): self.assertEqual({'key': 'foo\nbar', 'ukey': u'\u1234'}, decode_unicode_escape({'key': 'foo\\nbar', 'ukey': u'\\u1234'})) class TestExceptionInstanceSerialisation(TestCase): """Check exceptions can serialised safely with needed details preserved""" def check_exception_instance(self, e): encoded = bencode_exception_instance(e) name, attr_dict = bdecode_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(compatibility.UnicodeFilenameFeature) path = u"\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): """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. """ updates = [] for line in bencoded_data.split("\n"): if line.startswith(SUB_PROGRESS): n, transport_activity, task_info = bencode.bdecode( line[len(SUB_PROGRESS):]) if n == 1000000 and not task_info: task_message = u"Finished!" else: task_message = " / ".join(task_info).decode("utf-8") updates.append((n, transport_activity, task_message)) 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(u"Finding revisions", 0, 2) self.assertEqual([(0, "", u"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(u"Finding revisions", 0, 2) self.refresh(task) task.update(u"Finding revisions", 1, 2) self.refresh(task) task.update(u"Finding revisions", 2, 2) self.assertEqual([ (0, "", u"Finding revisions / 0/2"), (500000, "", u"Finding revisions / 1/2"), (1000000, "", u"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(u"Finding revisions", 0, 2) self.refresh(task) try: task.finished() except AttributeError, e: self.knownFailure("No ui_factory so calls missing task_finished") self.assertEqual([(0, "", u"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(u"\u1234", 0, 2) self.assertEqual([(0, "", u"\u1234 / 0/2")], self.decode_progress(sio.getvalue())) qbzr/lib/tests/test_tree_branch.py0000644000000000000000000001327712175306536017611 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 bzrlib import ( errors, osutils, tests, ) from bzrlib.transport import memory from bzrlib.plugins.qbzr.lib import tree_branch from bzrlib.plugins.qbzr.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()) qbzr/lib/tests/test_treewidget.py0000644000000000000000000005210712175306536017473 0ustar rootroot00000000000000# -*- 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 bzrlib.tests import TestCase, TestCaseWithTransport from bzrlib import tests from bzrlib.workingtree import WorkingTree from bzrlib.branch import Branch from bzrlib.bzrdir import BzrDir from bzrlib.conflicts import TextConflict, ConflictList from bzrlib import ignores from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib import tests as qtests from bzrlib.plugins.qbzr.lib.treewidget import ( TreeWidget, TreeModel, TreeFilterProxyModel, ModelItemData, InternalItem, PersistantItemReference, group_large_dirs, ) from bzrlib.plugins.qbzr.lib.tests.modeltest import ModelTest def load_tests(standard_tests, module, loader): result = loader.suiteClass() tree_tests, remaining_tests = tests.split_suite_by_condition( standard_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', 'base'),]) tree.add(['textconflict'], ['textconflict-id']) tree.commit('a', rev_id='rev-a', committer="joe@foo.com", timestamp=1166046000.00, timezone=0) branch_tree = tree.bzrdir.sprout('branch').open_workingtree() self.build_tree_contents([('branch/textconflict', 'other'),]) branch_tree.commit('b', rev_id='rev-b', committer="joe@foo.com", timestamp=1166046000.00, timezone=0) self.branch_tree = branch_tree self.build_tree(['trunk/dir/']) self.build_tree_contents([('trunk/dir/dirchild', ''), ('trunk/unmodified', ''), ('trunk/renamed', ''), ('trunk/moved', ''), ('trunk/movedandrenamed', ''), ('trunk/removed', ''), ('trunk/missing', ''), ('trunk/modified', 'old'), ('trunk/textconflict', 'this'), ]) tree.add(['dir'], ['dir-id']) tree.add(['dir/dirchild'], ['dirchild-id']) tree.add(['unmodified'], ['unmodified-id']) tree.add(['renamed'], ['renamed-id']) tree.add(['moved'], ['moved-id']) tree.add(['movedandrenamed'], ['movedandrenamed-id']) tree.add(['removed'], ['removed-id']) tree.add(['missing'], ['missing-id']) tree.add(['modified'], ['modified-id']) tree.commit('c', rev_id='rev-c', committer="joe@foo.com", timestamp=1166046000.00, timezone=0) return tree, tree.branch def modify_working_tree(self, tree): if 0: tree = WorkingTree() tree.merge_from_branch(self.branch_tree.branch, 'rev-b') self.build_tree_contents([('trunk/added', ''), ('trunk/addedmissing', ''), ('trunk/modified', 'new'), ('trunk/unversioned', ''), ]) tree.add(['added'], ['added-id']) tree.add(['addedmissing'], ['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/qbzr/+bug/538753 # must sort before trunk/dir self.build_tree(['trunk/a-newdir/']) self.build_tree_contents([('trunk/a-newdir/newdirchild', '')]) tree.add(['a-newdir'], ['a-newdir-id']) tree.add(['a-newdir/newdirchild'], ['newdirchild-id']) # manuly add conflicts for files that don't exist # See https://bugs.launchpad.net/qbzr/+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', ''), ('tree/b/c', ''), ]) tree.add(['a'], ['a-id']) tree.add(['b'], ['b-id']) tree.add(['b/c'], ['c-id']) tree.commit('a', rev_id='rev-1', committer="joe@foo.com", timestamp=1166046000.00, timezone=0) revtree = tree.branch.repository.revision_tree('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 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,500,500) widget.show() QtCore.QCoreApplication.processEvents() widget.set_tree(self.tree, self.branch, changes_mode=self.changes_mode) self.run_model_tests() widget.update() QtCore.QCoreApplication.processEvents() widget.expandAll () self.run_model_tests() widget.update() QtCore.QCoreApplication.processEvents() self.modify_tree(self, self.tree) widget.refresh() self.run_model_tests() widget.update() QtCore.QCoreApplication.processEvents() widget.expandAll () self.run_model_tests() widget.update() QtCore.QCoreApplication.processEvents() tree_scenarios = ( ('Working-Tree', {'make_tree': TestTreeWidget.make_working_tree, 'modify_tree': TestTreeWidget.modify_working_tree,}), ('Working-Tree-Changes-Mode', {'make_tree': TestTreeWidget.make_working_tree, 'modify_tree': TestTreeWidget.modify_working_tree, 'changes_mode': True}), ('Revision-Tree', {'make_tree': TestTreeWidget.make_rev_tree, 'modify_tree': lambda self, tree: None,}), ) class TestTreeFilterProxyModel(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', ''), ('tree/ignored-dir-with-child/child', ''), ('tree/unchanged', ''), ('tree/changed', 'old'), ('tree/unversioned', ''), ('tree/ignored', ''), ]) tree.add(['dir-with-unversioned'], ['dir-with-unversioned-id']) tree.add(['unchanged'], ['unchanged-id']) tree.add(['changed'], ['changed-id']) ignores.tree_ignores_add_patterns(tree, ['ignored-dir-with-child', 'ignored']) tree.commit('a', rev_id='rev-a', committer="joe@foo.com", timestamp=1166046000.00, timezone=0) self.build_tree_contents([('tree/changed', 'new')]) self.model = TreeModel() load_dirs=[PersistantItemReference(None, 'dir-with-unversioned'), PersistantItemReference(None, 'ignored-dir-with-child')] self.model.set_tree(tree, branch=tree.branch, load_dirs=load_dirs) self.filter_model = TreeFilterProxyModel() self.filter_model.setSourceModel(self.model) self.filter_model.setFilters(self.filter) self.expected_visible.sort() self.assertEqual(self.getVisiblePaths(), self.expected_visible) def getVisiblePaths(self): visible_paths = [] parent_indexes_to_visit = [QtCore.QModelIndex()] while parent_indexes_to_visit: parent_index = parent_indexes_to_visit.pop() for row in range(self.filter_model.rowCount(parent_index)): index = self.filter_model.index(row, 0, parent_index) visible_paths.append( str(self.filter_model.data(index, self.model.PATH).toString())) if self.filter_model.hasChildren(index): parent_indexes_to_visit.append(index) 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.bzrdir.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', ''), ('tree/ignored-dir-with-child/child', ''), ('tree/unversioned-with-ignored/ignored-dir-with-child/child', ''), ('tree/unchanged', ''), ('tree/changed', 'old'), ('tree/unversioned', ''), ('tree/ignored', ''), ]) tree.add(['dir-with-unversioned'], ['dir-with-unversioned-id']) tree.add(['unchanged'], ['unchanged-id']) tree.add(['changed'], ['changed-id']) ignores.tree_ignores_add_patterns(tree, ['ignored-dir-with-child', 'ignored']) tree.commit('a', rev_id='rev-a', committer="joe@foo.com", timestamp=1166046000.00, timezone=0) self.build_tree_contents([('tree/changed', 'new')]) self.tree = tree def assertSelectedPaths(self, treewidget, paths): if 0: treewidget = TreeWidget() selected = [item.path for item in treewidget.tree_model.iter_checked()] # we do not care for the order in this test. self.assertEqual(set(selected), set(paths)) def test_add_selectall(self): import bzrlib.plugins.qbzr.lib.add self.win = bzrlib.plugins.qbzr.lib.add.AddWindow(self.tree, None) self.addCleanup(self.cleanup_win) self.win.initial_load() self.assertSelectedPaths(self.win.filelist, ['dir-with-unversioned/child', 'unversioned', 'unversioned-with-ignored']) def test_commit_selectall(self): import bzrlib.plugins.qbzr.lib.commit self.win = bzrlib.plugins.qbzr.lib.commit.CommitWindow(self.tree, None) self.addCleanup(self.cleanup_win) self.win.load() self.assertSelectedPaths(self.win.filelist, ['changed']) #self.win.show_nonversioned_checkbox.setCheckState(QtCore.Qt.Checked) self.win.show_nonversioned_checkbox.click() #self.win.selectall_checkbox.setCheckState(QtCore.Qt.Unchecked) self.win.selectall_checkbox.click() #import pdb; pdb.set_trace() self.assertSelectedPaths(self.win.filelist, ['changed', 'dir-with-unversioned/child', 'unversioned', 'unversioned-with-ignored']) def test_revert_selectall(self): import bzrlib.plugins.qbzr.lib.revert self.win = bzrlib.plugins.qbzr.lib.revert.RevertWindow(self.tree, None) self.addCleanup(self.cleanup_win) self.win.initial_load() self.win.selectall_checkbox.click() self.assertSelectedPaths(self.win.filelist, ['changed']) def cleanup_win(self): # Sometimes the model was getting deleted before the widget, and the # widget was trying to query the model. So we delete everything here. self.win.deleteLater() self.win.filelist.deleteLater() self.win.filelist.tree_model.deleteLater() QtCore.QCoreApplication.processEvents() class TestModelItemData(TestCase): 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)) # UNCHANGED, CHANGED, UNVERSIONED, IGNORED filter_scenarios = ( ('All', {'filter': (True, True, True, True), 'expected_visible': ['dir-with-unversioned', 'dir-with-unversioned/child', 'ignored-dir-with-child', 'ignored-dir-with-child/child', 'unchanged', 'changed', 'unversioned', 'ignored', '.bzrignore', ],}), ('Unchanged', {'filter': (True, False, False, False) , 'expected_visible': ['dir-with-unversioned', 'unchanged', '.bzrignore', ],}), ('Changed', {'filter': (False, True, False, False), 'expected_visible': ['changed', ],}), ('Unversioned', {'filter': (False, False, True, False), 'expected_visible': ['dir-with-unversioned', 'dir-with-unversioned/child', 'unversioned', ],}), ('Ignored', {'filter': (False, False, False, True), 'expected_visible': ['ignored-dir-with-child', 'ignored', ],}), ('Ignored+Unversioned', {'filter': (False, False, True, True), 'expected_visible': ['ignored-dir-with-child/child', 'ignored-dir-with-child', 'ignored', 'dir-with-unversioned', 'dir-with-unversioned/child', 'unversioned', ],}), ) class TestGroupLargeDirs(TestCase): def test_no_group_small(self): 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([ u'b', u'b/1', u'b/2', u'b/3', u'b/4', u'b/c', u'b/c/1', u'b/c/2', u'b/c/3', u'b/c/4', ]) self.assertEqual(group_large_dirs(paths), {'': set([u'b']), u'b': set([u'b/1', u'b/2', u'b/3', u'b/4', u'b/c']), u'b/c': set([u'b/c/1', u'b/c/2', u'b/c/3', u'b/c/4'])}) def test_bug_580798(self): # Test for Bug #580798 paths = frozenset(('a', 'a/b1/c1', 'a/b2/d1', 'a/b2/d2', 'a/b2/d3', 'a/b2/d4', )) self.assertEqual(group_large_dirs(paths), {'': set(['a']), 'a': set(['a/b1/c1', 'a/b2']), 'a/b2': set(['a/b2/d1', 'a/b2/d2', 'a/b2/d3', 'a/b2/d4']), }) qbzr/lib/tests/test_util.py0000644000000000000000000002554012175306536016306 0ustar rootroot00000000000000# -*- 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 bzrlib import ( config, errors, tests, ) from bzrlib.transport import memory from bzrlib.plugins.qbzr.lib import ( tests as qbzr_tests, util, ) from bzrlib.plugins.qbzr.lib.fake_branch import FakeBranch from bzrlib.plugins.qbzr.lib.tests import mock class TestUtil(qbzr_tests.QTestCase): def test_file_extension(self): self.assertEquals('', util.file_extension('')) self.assertEquals('', util.file_extension('/foo/bar.x/')) self.assertEquals('', util.file_extension('C:/foo/bar.x/')) self.assertEquals('', util.file_extension('.bzrignore')) self.assertEquals('', util.file_extension('/foo/bar.x/.bzrignore')) self.assertEquals('.txt', util.file_extension('foo.txt')) self.assertEquals('.txt', util.file_extension('/foo/bar.x/foo.txt')) def test_filter_options(self): fo = util.FilterOptions() self.assertEquals(False, bool(fo)) self.assertEquals(False, fo.is_all_enable()) self.assertEquals('', fo.to_str()) self.assertEquals(False, fo.check('added')) self.assertEquals(False, fo.check('removed')) self.assertEquals(False, fo.check('deleted')) self.assertEquals(False, fo.check('renamed')) self.assertEquals(False, fo.check('modified')) self.assertEquals(False, fo.check('renamed and modified')) self.assertRaises(ValueError, fo.check, 'spam') fo = util.FilterOptions(deleted=True) self.assertEquals(True, bool(fo)) self.assertEquals(False, fo.is_all_enable()) self.assertEquals('deleted files', fo.to_str()) self.assertEquals(False, fo.check('added')) self.assertEquals(True, fo.check('removed')) self.assertEquals(True, fo.check('deleted')) self.assertEquals(False, fo.check('renamed')) self.assertEquals(False, fo.check('modified')) self.assertEquals(False, fo.check('renamed and modified')) fo = util.FilterOptions(added=True) self.assertEquals(True, bool(fo)) self.assertEquals(False, fo.is_all_enable()) self.assertEquals('added files', fo.to_str()) self.assertEquals(True, fo.check('added')) self.assertEquals(False, fo.check('removed')) self.assertEquals(False, fo.check('deleted')) self.assertEquals(False, fo.check('renamed')) self.assertEquals(False, fo.check('modified')) self.assertEquals(False, fo.check('renamed and modified')) fo = util.FilterOptions(renamed=True) self.assertEquals(True, bool(fo)) self.assertEquals(False, fo.is_all_enable()) self.assertEquals('renamed files', fo.to_str()) self.assertEquals(False, fo.check('added')) self.assertEquals(False, fo.check('removed')) self.assertEquals(False, fo.check('deleted')) self.assertEquals(True, fo.check('renamed')) self.assertEquals(False, fo.check('modified')) self.assertEquals(True, fo.check('renamed and modified')) fo = util.FilterOptions(modified=True) self.assertEquals(True, bool(fo)) self.assertEquals(False, fo.is_all_enable()) self.assertEquals('modified files', fo.to_str()) self.assertEquals(False, fo.check('added')) self.assertEquals(False, fo.check('removed')) self.assertEquals(False, fo.check('deleted')) self.assertEquals(False, fo.check('renamed')) self.assertEquals(True, fo.check('modified')) self.assertEquals(True, fo.check('renamed and modified')) fo = util.FilterOptions(added=True, deleted=True, modified=True, renamed=True) self.assertEquals(True, bool(fo)) self.assertEquals(True, fo.is_all_enable()) self.assertEquals('deleted files, added files, ' 'renamed files, modified files', fo.to_str()) self.assertEquals(True, fo.check('added')) self.assertEquals(True, fo.check('removed')) self.assertEquals(True, fo.check('deleted')) self.assertEquals(True, fo.check('renamed')) self.assertEquals(True, fo.check('modified')) self.assertEquals(True, fo.check('renamed and modified')) fo = util.FilterOptions(all_enable=True) self.assertEquals(True, bool(fo)) self.assertEquals(True, fo.is_all_enable()) fo = util.FilterOptions() fo.all_enable() self.assertEquals(True, bool(fo)) self.assertEquals(True, fo.is_all_enable()) def test_url_for_display(self): self.assertEquals(None, util.url_for_display(None)) self.assertEquals('', util.url_for_display('')) self.assertEquals('http://bazaar.launchpad.net/~qbzr-dev/qbzr/trunk', util.url_for_display('http://bazaar.launchpad.net/%7Eqbzr-dev/qbzr/trunk')) if sys.platform == 'win32': self.assertEquals('C:/work/qbzr/', util.url_for_display('file:///C:/work/qbzr/')) else: self.assertEquals('/home/work/qbzr/', util.url_for_display('file:///home/work/qbzr/')) def test_is_binary_content(self): self.assertEquals(False, util.is_binary_content([])) self.assertEquals(False, util.is_binary_content(['foo\n', 'bar\r\n', 'spam\r'])) self.assertEquals(True, util.is_binary_content(['\x00'])) self.assertEquals(True, util.is_binary_content(['a'*2048 + '\x00'])) def test_get_summary(self): import bzrlib.revision r = bzrlib.revision.Revision('1') r.message = None self.assertEquals('(no message)', util.get_summary(r)) r.message = '' self.assertEquals('(no message)', util.get_summary(r)) r.message = 'message' self.assertEquals('message', util.get_summary(r)) def test_get_message(self): import bzrlib.revision r = bzrlib.revision.Revision('1') r.message = None self.assertEquals('(no message)', util.get_message(r)) r.message = 'message' self.assertEquals('message', util.get_message(r)) def test_ensure_unicode(self): self.assertEqual(u'foo', util.ensure_unicode('foo')) self.assertEqual(u'foo', util.ensure_unicode(u'foo')) self.assertEqual(u'\u1234', util.ensure_unicode(u'\u1234')) self.assertEqual(1, util.ensure_unicode(1)) def test__shlex_split_unicode_linux(self): self.assertEquals([u'foo/bar', u'\u1234'], util._shlex_split_unicode_linux(u"foo/bar \u1234")) def test__shlex_split_unicode_windows(self): self.assertEquals([u'C:\\foo\\bar', u'\u1234'], util._shlex_split_unicode_windows(u"C:\\foo\\bar \u1234")) def test_launchpad_project_from_url(self): fut = util.launchpad_project_from_url # fut = function under test # classic self.assertEquals('qbzr', fut('bzr+ssh://bazaar.launchpad.net/~qbzr-dev/qbzr/trunk')) # lp:qbzr self.assertEquals('qbzr', fut('bzr+ssh://bazaar.launchpad.net/+branch/qbzr')) self.assertEquals('qbzr', fut('bzr+ssh://bazaar.launchpad.net/%2Bbranch/qbzr')) # lp:qbzr/0.20 self.assertEquals('qbzr', fut('bzr+ssh://bazaar.launchpad.net/%2Bbranch/qbzr/0.20')) # lp:ubuntu/qbzr self.assertEquals('qbzr', fut('bzr+ssh://bazaar.launchpad.net/%2Bbranch/ubuntu/qbzr')) # lp:ubuntu/natty/qbzr self.assertEquals('qbzr', fut('bzr+ssh://bazaar.launchpad.net/%2Bbranch/ubuntu/natty/qbzr')) # lp:ubuntu/natty-proposed/qbzr self.assertEquals('qbzr', fut('bzr+ssh://bazaar.launchpad.net/%2Bbranch/ubuntu/natty-proposed/qbzr')) # lp:~someone/ubuntu/maverick/qbzr/sru self.assertEquals('qbzr', fut('bzr+ssh://bazaar.launchpad.net/~someone/ubuntu/maverick/qbzr/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.assertEquals('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.assertEquals('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.assertEquals(8, w) qbzr/lib/widgets/__init__.py0000644000000000000000000000142612175306536016332 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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. qbzr/lib/widgets/shelve.py0000644000000000000000000012451012175306536016061 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 sys, time from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext, ngettext, N_ from bzrlib.plugins.qbzr.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_qbzr_config, file_extension, ) from bzrlib.plugins.qbzr.lib.widgets.toolbars import ( FindToolbar, ToolbarPanel, LayoutSelector ) from bzrlib.plugins.qbzr.lib.widgets.tab_width_selector import TabWidthMenuSelector from bzrlib.plugins.qbzr.lib.widgets.texteditaccessory import ( GuideBar, setup_guidebar_for_find ) from bzrlib.plugins.qbzr.lib.decorators import lazy_call from bzrlib import errors from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget from bzrlib.plugins.qbzr.lib.trace import reports_exception from bzrlib.patches import HunkLine, ContextLine, InsertLine, RemoveLine from bzrlib.lazy_import import lazy_import lazy_import(globals(), ''' from bzrlib import transform, textfile, patches from bzrlib.workingtree import WorkingTree from bzrlib.plugins.qbzr.lib.encoding_selector import EncodingMenuSelector from bzrlib.plugins.qbzr.lib.commit import TextEdit from bzrlib.plugins.qbzr.lib.spellcheck import SpellCheckHighlighter, SpellChecker from bzrlib.plugins.qbzr.lib.autocomplete import get_wordlist_builder from bzrlib.shelf import ShelfCreator from bzrlib.shelf_ui import Shelver from bzrlib.osutils import split_lines from cStringIO import StringIO import os ''') """ 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, id): try: return tree.kind(id) except errors.NoSuchFile: return 'file' if status == 'delete file': self.path = trees[0].id2path(file_id) self.kind = get_kind(trees[0], file_id) self.disp_text = self.path elif status == 'rename': self.path = [tree.id2path(file_id) for tree in trees] self.disp_text = u'%s => %s' % (self.path[0], self.path[1]) self.kind = get_kind(trees[1], file_id) else: self.path = trees[1].id2path(file_id) self.disp_text = self.path self.kind = get_kind(trees[1], file_id) if status == 'modify text': try: self.sha1 = trees[1].get_file_sha1(file_id) target_lines = trees[0].get_file_lines(file_id) textfile.check_text_lines(target_lines) work_lines = trees[1].get_file_lines(file_id) 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: I does not use __cmp__ because this method does not compare entire 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 = [[str(l).decode(encoding) for l in hunk.lines] for hunk in patch.hunks] except UnicodeError: if self.hunk_texts[1] is None: texts = [[str(l) for l 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 = [l.decode(encoding) for l 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): def __init__(self, file_list=None, directory=None, complete=False, encoding=None, splitters=None, parent=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.current_layout = -1 self.load_settings() self.splitter = QtGui.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 = QtGui.QSplitter(QtCore.Qt.Horizontal, self) self.splitter2 = QtGui.QSplitter(QtCore.Qt.Horizontal, self) self.splitter.addWidget(self.splitter1) self.splitter.addWidget(self.splitter2) message_groupbox = QtGui.QGroupBox(gettext("Message"), self) message_layout = QtGui.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.connect(self.message, QtCore.SIGNAL("messageEntered()"), self.do_shelve) self.completer = QtGui.QCompleter() self.completer_model = QtGui.QStringListModel(self.completer) self.completer.setModel(self.completer_model) self.message.setCompleter(self.completer) self.message.setAcceptRichText(False) SpellCheckHighlighter(self.message.document(), spell_checker) message_layout.addWidget(self.message) self.file_view = QtGui.QTreeWidget(self) self.file_view.setHeaderLabels( [gettext("File Name"), gettext("Status"), gettext("Hunks")]) header = self.file_view.header() header.setStretchLastSection(False) header.setResizeMode(0, QtGui.QHeaderView.Stretch) header.setResizeMode(1, QtGui.QHeaderView.ResizeToContents) header.setResizeMode(2, QtGui.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 = QtGui.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 = QtGui.QVBoxLayout() layout.setMargin(10) layout.addWidget(self.splitter) self.add_layout(layout) shelve_menu = QtGui.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.connect(self.file_view, QtCore.SIGNAL("itemSelectionChanged()"), self.selected_file_changed) self.connect(self.file_view, QtCore.SIGNAL("itemChanged(QTreeWidgetItem *, int)"), self.file_checked) self.connect(self.hunk_view, QtCore.SIGNAL("selectionChanged()"), 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): cleanup = [] try: old_rev = self.revision old_changes = self._get_change_dictionary() self.clear(clear_message = False) shelver, creator = self._create_shelver_and_creator() cleanup.append(shelver.finalize) cleanup.append(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) finally: for func in cleanup: func() 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 = QtGui.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, u'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, u'%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): cleanup = [] items = self.file_view.selectedItems() if len(items) != 1 or items[0].change.status != 'modify text': return else: change = items[0].change try: target_tree, work_tree = self.trees cleanup.append(work_tree.lock_read().unlock) cleanup.append(target_tree.lock_read().unlock) config = work_tree.branch.get_config() change_editor = config.get_change_editor(target_tree, work_tree) if change_editor is None: QtGui.QMessageBox.information(self, gettext('Shelve'), gettext('Change editor is not defined.'), gettext('&OK')) self.editor_available = False self.editor_button.setEnabled(False) return cleanup.append(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() finally: while cleanup: cleanup.pop()() 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 = QtGui.QMessageBox.warning else: prompt = ngettext('Shelve changes of %d file', 'Shelve changes of %d files', nfiles) % nfiles func = QtGui.QMessageBox.question ret = func(self, gettext('Shelve'), prompt, QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel) if ret != QtGui.QMessageBox.Ok: return else: QtGui.QMessageBox.information(self, gettext('Shelve'), gettext('No changes selected.'), gettext('&OK')) return cleanup = [] try: shelver, creator = self._create_shelver_and_creator(destroy=destroy) cleanup.append(shelver.finalize) cleanup.append(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 = unicode(self.message.toPlainText()).strip() or gettext(u'') if destroy: creator.transform() shelf_id = -1 else: shelf_id = manager.shelve_changes(creator, message) except WorkingTreeHasPendingMarge: QtGui.QMessageBox.warning(self, gettext('Shelve'), gettext('Operation aborted because working tree has pending merges.'), gettext('&OK')) return except WorkingTreeHasChanged: QtGui.QMessageBox.warning(self, gettext('Shelve'), gettext('Operation aborted because target files has been changed.'), gettext('&OK')) return finally: while cleanup: cleanup.pop()() self.emit(QtCore.SIGNAL("shelfCreated(int)"), 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_qbzr_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_qbzr_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(QtGui.QWidget): def __init__(self, complete=False, parent=None): QtGui.QWidget.__init__(self, parent) layout = QtGui.QHBoxLayout(self) layout.setSpacing(0) layout.setMargin(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.connect(self.browser, QtCore.SIGNAL("focusedHunkChanged()"), self.update) def selected_hunk_changed(): self.update() self.emit(QtCore.SIGNAL("selectionChanged()")) self.connect(self.browser, QtCore.SIGNAL("selectedHunkChanged()"), 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(QtGui.QFrame): def __init__(self, browser, parent): QtGui.QFrame.__init__(self, parent) self.browser = browser self.setFixedWidth(25) self.setStyleSheet("border:1px solid lightgray;") self.connect(browser.verticalScrollBar(), QtCore.SIGNAL("valueChanged(int)"), self.scrolled) self.frame_width = QtGui.QApplication.style().pixelMetric(QtGui.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): QtGui.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, y1, 13, 13, QtCore.Qt.white) painter.drawRect(6, y1, 13, 13) if hunk.selected: painter.drawLine(9, y1 + 7, 12, y1 + 10) painter.drawLine(16, y1 + 3, 12, 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) QtGui.QFrame.mousePressEvent(self, event) class HunkTextBrowser(QtGui.QTextBrowser): def __init__(self, complete=False, parent=None): # XXX: This code should be merged with QSimpleDiffView QtGui.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 bzrlib.plugins.qbzr.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([' ' + l for l 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(str(hunk.get_header()), 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([' ' + l for l in work_lines[start:]]) if lines: cursor.insertText(lines, self.monospacedInactiveFormat) if self.hunk_list: self._set_focused_hunk(0) self.emit(QtCore.SIGNAL("documentChangeFinished()")) self.update() def update(self): QtGui.QTextBrowser.update(self) self.viewport().update() def clear(self): QtGui.QTextBrowser.clear(self) del(self.hunk_list[:]) self._set_focused_hunk(-1) self.guidebar_deta = [] self.emit(QtCore.SIGNAL("documentChangeFinished()")) def paintEvent(self, event): if not self.hunk_list: QtGui.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 QtGui.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, 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, y1, width, y2 - y1, color) # Draw border. painter.drawLine(left, y1, right, y1) painter.drawLine(left, y2, right, 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.emit(QtCore.SIGNAL("selectedHunkChanged()")) 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.emit(QtCore.SIGNAL("focusedHunkChanged()")) 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 = self.hunk_list[index][1] - MARGIN min_pos = 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()) QtGui.QTextBrowser.mousePressEvent(self, event) def focusInEvent(self, event): self.parent().update() QtGui.QTextBrowser.focusInEvent(self, event) def focusOutEvent(self, event): self.parent().update() QtGui.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 QtGui.QTextBrowser.keyPressEvent(self, event) qbzr/lib/widgets/shelvelist.py0000644000000000000000000005257512175306536016770 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 sys, time from PyQt4 import QtCore, QtGui from PyQt4.QtGui import QKeySequence from bzrlib.revision import CURRENT_REVISION from bzrlib.errors import ( NoSuchRevision, NoSuchRevisionInTree, PathsNotVersionedError) from bzrlib.plugins.qbzr.lib.i18n import gettext, N_ from bzrlib.plugins.qbzr.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_qbzr_config, ) from bzrlib.plugins.qbzr.lib.widgets.toolbars import ( FindToolbar, ToolbarPanel, LayoutSelector ) from bzrlib.plugins.qbzr.lib.widgets.tab_width_selector import TabWidthMenuSelector from bzrlib.plugins.qbzr.lib.diffview import ( SidebySideDiffView, SimpleDiffView, ) from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget from bzrlib.plugins.qbzr.lib.trace import reports_exception from bzrlib.plugins.qbzr.lib.logwidget import LogList from bzrlib.plugins.qbzr.lib.decorators import lazy_call from bzrlib.plugins.qbzr.lib.widgets.texteditaccessory import setup_guidebar_for_find from bzrlib.lazy_import import lazy_import lazy_import(globals(), ''' from bzrlib import transform from bzrlib.workingtree import WorkingTree from bzrlib.plugins.qbzr.lib.encoding_selector import EncodingMenuSelector from bzrlib.plugins.qbzr.lib.diff import DiffItem from bzrlib.shelf import Unshelver from bzrlib.shelf_ui import Unshelver as Unshelver_ui from bzrlib.plugins.qbzr.lib.subprocess import SimpleSubProcessDialog import sip ''') class ShelveListWidget(ToolbarPanel): 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 = QtGui.QTreeWidget(self) self.shelve_view.setHeaderLabels([gettext("Id"), gettext("Message")]) header = self.shelve_view.header() header.setResizeMode(0, QtGui.QHeaderView.ResizeToContents) self.file_view = QtGui.QTreeWidget(self) self.file_view.setHeaderLabels([gettext("File Name"), gettext("Status")]) self.file_view.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) header = self.file_view.header() header.setStretchLastSection(False) header.setResizeMode(0, QtGui.QHeaderView.Stretch) header.setResizeMode(1, QtGui.QHeaderView.ResizeToContents) self.stack = QtGui.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 = QtGui.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 = QtGui.QSplitter(QtCore.Qt.Horizontal) self.splitter1.addWidget(self.shelve_view) self.splitter2 = QtGui.QSplitter(QtCore.Qt.Horizontal) self.splitter2.addWidget(self.file_view) self.splitter2.addWidget(diff_panel) self.splitter = QtGui.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 = QtGui.QVBoxLayout() layout.setMargin(10) layout.addWidget(self.splitter) self.add_layout(layout) # build main toolbar unshelve_menu = QtGui.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.connect(self.shelve_view, QtCore.SIGNAL("itemSelectionChanged()"), self.selected_shelve_changed) self.connect(self.file_view, QtCore.SIGNAL("itemSelectionChanged()"), 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] tree.lock_read() try: manager = tree.get_shelf_manager() shelves = manager.active_shelves() for shelf_id in reversed(shelves): message = manager.get_metadata(shelf_id).get('message') item = QtGui.QTreeWidgetItem() item.setText(0, unicode(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) finally: tree.unlock() 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): cleanup = [] shelf_file = self.manager.read_shelf(shelf_id) cleanup.append(shelf_file.close) try: records = Unshelver.iter_records(shelf_file) revid = Unshelver.parse_metadata(records)['revision_id'] try: base_tree = self.tree.revision_tree(revid) except NoSuchRevisionInTree: base_tree = self.tree.branch.repository.revision_tree(revid) preview = transform.TransformPreview(base_tree) cleanup.append(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) finally: for func in cleanup: func() 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 = u'%s => %s' % (old_path, new_path) else: text = old_path item = QtGui.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.emit(QtCore.SIGNAL("documentChangeFinished()")) 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 = QtGui.QMessageBox.warning else: func = QtGui.QMessageBox.question ret = func(self, gettext('Shelve'), gettext(prompt), QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel) return (ret == QtGui.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.emit(QtCore.SIGNAL("unshelved(int, QString*)"), self.shelf_id, action) self.connect(window, QtCore.SIGNAL("subprocessFinished(bool)"), 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_qbzr_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_qbzr_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() qbzr/lib/widgets/splitters.py0000644000000000000000000000331212175306536016620 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtGui, QtCore from bzrlib.plugins.qbzr.lib.util import ( get_qbzr_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_qbzr_config() for name, splitter in self.splitters: data = config.get_option('%s_%s' % (self.prefix, name)) if data: splitter.restoreState(QtCore.QByteArray.fromBase64(data)) def save_state(self): config = get_qbzr_config() for name, splitter in self.splitters: value = splitter.saveState().toBase64().data() config.set_option('%s_%s' % (self.prefix, name), value) config.save() qbzr/lib/widgets/tab_width_selector.py0000644000000000000000000000641112175306536020437 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtGui, QtCore # 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(QtGui.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. """ QtGui.QMenu.__init__(self, *args) self.onChanged = onChanged if onChanged is None: self.onChanged = lambda settabwidth: None self.setTitle(label_text) self.action_group = QtGui.QActionGroup(self) self.tabwidth_actions = {} for tabwidth in range(MIN_TAB_WIDTH, MAX_TAB_WIDTH+1): action = QtGui.QAction(str(tabwidth), self.action_group) action.setCheckable(True) action.setData(QtCore.QVariant(tabwidth)) self.addAction(action) self.tabwidth_actions[tabwidth] = action self._tabwidth = None self._has_separator = False self.connect(self, QtCore.SIGNAL("triggered(QAction *)"), 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, success = action.data().toInt() if success and tw != self._tabwidth: self._tabwidth = tw self.onChanged(tw) def setTabWidth(self, width): if width not in self.tabwidth_actions: action = QtGui.QAction(str(width), self.action_group) action.setCheckable(True) action.setData(QtCore.QVariant(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) qbzr/lib/widgets/texteditaccessory.py0000644000000000000000000002443212175306536020343 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 PyQt4 import QtCore, QtGui 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 """ def __init__(self, edit): QtCore.QObject.__init__(self) if not isinstance(edit, QtGui.QPlainTextEdit): raise ValueError('edit must be QPlainTextEdit') self.edit = edit self.connect(edit, QtCore.SIGNAL("updateRequest(const QRect&, int)"), self.onUpdateRequest) def onUpdateRequest(self, rect, dy): self.emit(QtCore.SIGNAL("updateRequest()")) 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 """ def __init__(self, edit): QtCore.QObject.__init__(self) if not isinstance(edit, QtGui.QTextEdit): raise ValueError('edit must be QTextEdit') self.edit = edit self.connect(edit.verticalScrollBar(), QtCore.SIGNAL("valueChanged(int)"), self.onVerticalScroll) def onVerticalScroll(self, value): self.emit(QtCore.SIGNAL("updateRequest()")) def center_block(self, block): """ scroll textarea as specified block locates to center """ y = block.layout().position().y() vscroll = self.edit.verticalScrollBar() vscroll.setValue(y - vscroll.pageStep() / 2) def get_edit_helper(edit): if isinstance(edit, QtGui.QPlainTextEdit): return PlainTextEditHelper(edit) if isinstance(edit, QtGui.QTextEdit): return TextEditHelper(edit) raise ValueError("edit is unsupported type.") class GuideBar(QtGui.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. """ QtGui.QWidget.__init__(self, parent) self.base_width = base_width self.edit = edit self._helper = get_edit_helper(edit) self.block_count = 0 self.connect(edit, QtCore.SIGNAL("documentChangeFinished()"), self.reset_gui) self.connect(edit.verticalScrollBar(), QtCore.SIGNAL("rangeChanged(int, int)"), self.vscroll_rangeChanged) self.connect(self._helper, QtCore.SIGNAL("updateRequest()"), 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, max): vscroll_visible = (min < max) 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.itervalues() 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.iteritems(): 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): QtGui.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(self.entries.itervalues(), 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): QtGui.QWidget.mousePressEvent(self, event) if event.button() == QtCore.Qt.LeftButton: self.scroll_to_pos(event.y()) def mouseMoveEvent(self, event): QtGui.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(QtGui.QWidget): """ Composite widget of TextEdit and GuideBar """ def __init__(self, edit, base_width=10, align=GBAR_RIGHT, parent=None): QtGui.QWidget.__init__(self, parent) hbox = QtGui.QHBoxLayout(self) hbox.setSpacing(0) hbox.setMargin(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 guidebar.connect(find_toolbar, QtCore.SIGNAL("highlightChanged()"), on_highlight_changed) qbzr/lib/widgets/toolbars.py0000644000000000000000000003034512175306536016422 0ustar rootroot00000000000000# -*- coding: utf-8 -*- # # QBzr - Qt frontend to Bazaar 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 bzrlib.plugins.qbzr.lib.util import ( get_icon, show_shortcut_hint ) from PyQt4 import QtCore, QtGui from bzrlib.plugins.qbzr.lib.i18n import gettext, N_ from bzrlib.plugins.qbzr.lib.decorators import lazy_call 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 = QtGui.QAction(get_icon(icon_name, size=icon_size), gettext(text), parent) else: button = QtGui.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: parent.connect(button, QtCore.SIGNAL(signal), 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(QtGui.QToolBar): def __init__(self, window, text_edit, show_action): QtGui.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 = QtGui.QLabel(gettext("Find: "), self) self.addWidget(find_label) self.find_text = QtGui.QLineEdit(self) self.addWidget(self.find_text) find_label.setBuddy(self.find_text) 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 = QtGui.QCheckBox(gettext("Case sensitive"), self) self.addWidget(self.case_sensitive) self.whole_words = QtGui.QCheckBox(gettext("Whole words"), self) self.addWidget(self.whole_words) close_find = QtGui.QAction(self) close_find.setIcon(self.style().standardIcon( QtGui.QStyle.SP_DialogCloseButton)) self.addAction(close_find) close_find.setShortcut((QtCore.Qt.Key_Escape)) close_find.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) close_find.setStatusTip(gettext("Close find")) self.connect(self.show_action, QtCore.SIGNAL("toggled (bool)"), self.show_action_toggle) self.connect(close_find, QtCore.SIGNAL("triggered(bool)"), self.close_triggered) self.connect(self.find_text, QtCore.SIGNAL("textChanged(QString)"), self.find_text_changed) self.connect(next, QtCore.SIGNAL("triggered(bool)"), self.find_next) self.connect(prev, QtCore.SIGNAL("triggered(bool)"), self.find_prev) self.connect(self.case_sensitive, QtCore.SIGNAL("stateChanged(int)"), self.find_text_changed) self.connect(self.whole_words, QtCore.SIGNAL("stateChanged(int)"), self.find_text_changed) self.connect(self.find_text, QtCore.SIGNAL("returnPressed()"), self.find_next) def show_action_toggle(self, state): self.setVisible(state) if state: self.find_text.setFocus() else: self.find_text.setText('') def close_triggered(self, state): self.show_action.setChecked(False) def find_text_changed(self, text): self.find_avoid_moving() 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: self.disconnect(t, QtCore.SIGNAL("documentChangeFinished()"), self.highlight) t.setExtraSelections([]) for t in text_edits: t.highlight_lines = [] self.connect(t, QtCore.SIGNAL("documentChangeFinished()"), 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 = QtGui.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.emit(QtCore.SIGNAL("highlightChanged()")) class ToolbarPanel(QtGui.QWidget): def __init__(self, slender=True, icon_size=16, parent=None): QtGui.QWidget.__init__(self, parent) vbox = QtGui.QVBoxLayout(self) vbox.setSpacing(0) vbox.setMargin(0) toolbar = QtGui.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(QtGui.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(QtGui.QMenu): """Menu to select layout.""" def __init__(self, num, onchanged, parent=None, initial_no=1): QtGui.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 = QtGui.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) qbzr/po/qbzr-ar.po0000644000000000000000000012136512175306536014346 0ustar rootroot00000000000000# 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 "" qbzr/po/qbzr-cs.po0000644000000000000000000012155212175306536014347 0ustar rootroot00000000000000# 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 "" qbzr/po/qbzr-da.po0000644000000000000000000012703412175306536014327 0ustar rootroot00000000000000# 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" qbzr/po/qbzr-de.po0000644000000000000000000015577612175306536014351 0ustar rootroot00000000000000# 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?" qbzr/po/qbzr-en.po0000644000000000000000000015002312175306536014337 0ustar rootroot00000000000000msgid "" 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" qbzr/po/qbzr-en_GB.po0000644000000000000000000015016112175306536014712 0ustar rootroot00000000000000# 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:" qbzr/po/qbzr-es.po0000644000000000000000000015274612175306536014362 0ustar rootroot00000000000000# 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." qbzr/po/qbzr-et.po0000644000000000000000000014542612175306536014360 0ustar rootroot00000000000000# 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:" qbzr/po/qbzr-fr.po0000644000000000000000000013352112175306536014350 0ustar rootroot00000000000000# 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" qbzr/po/qbzr-gl.po0000644000000000000000000012446512175306536014352 0ustar rootroot00000000000000# 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" qbzr/po/qbzr-he.po0000644000000000000000000012542412175306536014340 0ustar rootroot00000000000000# 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 "&צור" qbzr/po/qbzr-hu.po0000644000000000000000000012700312175306536014353 0ustar rootroot00000000000000# 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" qbzr/po/qbzr-it.po0000644000000000000000000014653512175306536014366 0ustar rootroot00000000000000# 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." qbzr/po/qbzr-ja.po0000644000000000000000000016624412175306536014343 0ustar rootroot00000000000000# 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 "削除すると元に戻せなくなるファイルがあります。本当にこれらのファイルを削除してもよろしいですか?" qbzr/po/qbzr-nl.po0000644000000000000000000014071212175306536014352 0ustar rootroot00000000000000# 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" qbzr/po/qbzr-pl.po0000644000000000000000000014370512175306536014361 0ustar rootroot00000000000000# 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" qbzr/po/qbzr-pt_BR.po0000644000000000000000000014436312175306536014755 0ustar rootroot00000000000000# 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" qbzr/po/qbzr-ru.po0000644000000000000000000016550412175306536014375 0ustar rootroot00000000000000# 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 "Используя" qbzr/po/qbzr-sk.po0000644000000000000000000012303012175306536014350 0ustar rootroot00000000000000# 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" qbzr/po/qbzr-sl.po0000644000000000000000000012117612175306536014362 0ustar rootroot00000000000000# 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 "" qbzr/po/qbzr-sr.po0000644000000000000000000012124012175306536014360 0ustar rootroot00000000000000# 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 "" qbzr/po/qbzr-sv.po0000644000000000000000000012254712175306536014377 0ustar rootroot00000000000000# 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" qbzr/po/qbzr-th.po0000644000000000000000000012126712175306536014360 0ustar rootroot00000000000000# 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 "" qbzr/po/qbzr-tr.po0000644000000000000000000012744112175306536014372 0ustar rootroot00000000000000# 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:" qbzr/po/qbzr-uk.po0000644000000000000000000013055712175306536014366 0ustar rootroot00000000000000# 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 "Ви повинні вказати локацію" qbzr/po/qbzr.pot0000644000000000000000000012057012175306536014127 0ustar rootroot00000000000000#, 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 "" qbzr/ui/bookmark.ui0000644000000000000000000000433412175306536014567 0ustar rootroot00000000000000 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 qbzr/ui/branch.ui0000644000000000000000000001136412175306536014220 0ustar rootroot00000000000000 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) qbzr/ui/info.ui0000644000000000000000000000760512175306536013721 0ustar rootroot00000000000000 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 qbzr/ui/init.ui0000644000000000000000000002276412175306536013734 0ustar rootroot00000000000000 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) qbzr/ui/merge.ui0000644000000000000000000000661712175306536014067 0ustar rootroot00000000000000 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) qbzr/ui/merge_config.ui0000644000000000000000000000742512175306536015412 0ustar rootroot00000000000000 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 qbzr/ui/new_tree.ui0000644000000000000000000003237312175306536014576 0ustar rootroot00000000000000 NewWorkingTreeForm 0 0 479 385 Create a new Bazaar 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) qbzr/ui/pull.ui0000644000000000000000000000632012175306536013733 0ustar rootroot00000000000000 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) qbzr/ui/push.ui0000644000000000000000000000623612175306536013744 0ustar rootroot00000000000000 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) qbzr/ui/run.ui0000644000000000000000000001342612175306536013570 0ustar rootroot00000000000000 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) qbzr/ui/sysinfo.ui0000644000000000000000000001132512175306536014452 0ustar rootroot00000000000000 MainWindow 0 0 387 254 System Information Bazaar Library false Version: (bzr-version) Path: 300 0 (bzr-lib-path) Bazaar 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) qbzr/ui/tag.ui0000644000000000000000000001173012175306536013533 0ustar rootroot00000000000000 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) qbzr/ui/update_branch.ui0000644000000000000000000001570612175306536015566 0ustar rootroot00000000000000 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) qbzr/ui/update_checkout.ui0000644000000000000000000001211512175306536016125 0ustar rootroot00000000000000 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) qbzr/ui/verify-signatures.ui0000644000000000000000000000110312175306536016437 0ustar rootroot00000000000000 VerifyForm 0 0 560 230 1